Merged PadSimple with nJoy

(Linux build could be broken, X360Pad support could be broken)

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4924 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
ayuanx 2010-01-22 23:19:16 +00:00
parent c09ec17bb2
commit 68a4eacb62
38 changed files with 3302 additions and 9319 deletions

View File

@ -27,10 +27,6 @@
// http://code.google.com/p/dolphin-emu/
//
// Include
// -------------------
#if defined HAVE_WX && HAVE_WX
@ -45,12 +41,9 @@
#include "SDL.h" // Local
namespace InputCommon
{
// Degree to radian and back
// -------------
float Deg2Rad(float Deg)
@ -83,9 +76,6 @@ bool IsDeadZone(float DeadZone, int x, int y)
return false;
}
// Scale down stick values from 0x8000 to 0x80
/* ----------------
The value returned by SDL_JoystickGetAxis is a signed integer s16
@ -112,33 +102,19 @@ int Pad_Convert(int _val)
return _val;
}
// Adjust the radius
// ----------------
void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius)
void RadiusAdjustment(s8 &_x, s8 &_y, int _Radius)
{
// Get the radius setting
int Tmp = atoi (SRadius.substr(0, SRadius.length() - 1).c_str());
float RadiusSetting = Tmp / 100.0f;
// Get current angle
float Deg = Rad2Deg(atan2((float)_y, (float)_x));
// Get the current radius
float Radius = sqrt((float)(_x*_x + _y*_y));
// Adjust radius
Radius = Radius * RadiusSetting;
// Produce new coordinates
float x = Radius * cos(Deg2Rad(Deg));
float y = Radius * sin(Deg2Rad(Deg));
float RadiusSetting = (float)_Radius / 100.0f;
float x = (float)_x * RadiusSetting;
float y = (float)_y * RadiusSetting;
// Update values
_x = (int)x, _y = (int)y;
_x = (s8)x;
_y = (s8)y;
}
/* Convert the stick raidus from a square or rounded box to a circular radius. I don't know what
input values the actual GC controller produce for the GC, it may be a square, a circle or
something in between. But one thing that is certain is that PC pads differ in their output
@ -173,8 +149,9 @@ float Square2CircleDistance(float deg)
return Distance;
}
// Produce a perfect circle from an original square or rounded box
void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square)
void Square2Circle(int &_x, int &_y, int _Diagonal, bool Circle2Square)
{
// Do we need to do this check?
if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit
@ -184,8 +161,7 @@ void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circl
// Convert to circle
// -----------
// Get the manually configured diagonal distance
int Tmp = atoi (SDiagonal.substr(0, SDiagonal.length() - 1).c_str());
float Diagonal = Tmp / 100.0f;
float Diagonal = (float)_Diagonal / 100.0f;
// First make a perfect square in case we don't have one already
float OrigDist = sqrt( pow((float)_y, 2) + pow((float)_x, 2) ); // Get current distance
@ -226,9 +202,6 @@ void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circl
//Console::Print("%f %f %i", corner_circle_dist, Diagonal, Tmp));
}
// Windows Virtual Key Codes Names
// ---------------------
#ifdef _WIN32

View File

@ -28,34 +28,14 @@
//
// Include
// -------------------
#define _SDL_MAIN_ // Avoid certain declarations in SDL.h
#include "SDL.h" // Local
#include "XInput.h"
// Definitions
// -------------------
int g_LastPad = 0;
namespace InputCommon
{
// Definitions
// -------------------
// Search attached devices. Populate joyinfo for all attached physical devices.
// -----------------------
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
@ -112,140 +92,6 @@ bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_
}
// Supporting functions
// ----------------
// Read current joystick status
/* ----------------
The value PadMapping[].buttons[] is the number of the assigned joypad button,
PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */
// Read buttons status. Called from GetJoyState().
// ----------------------
void ReadButton(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int button, int NumButtons)
{
int ctl_button = _PadMapping.buttons[button];
if (ctl_button < NumButtons)
{
_PadState.buttons[button] = SDL_JoystickGetButton(_PadState.joy, ctl_button);
}
}
// Request joystick state.
// ----------------------
/* Called from: PAD_GetStatus()
Input: The virtual device 0, 1, 2 or 3
Function: Updates the PadState struct with the current pad status. The input value "controller" is
for a virtual controller 0 to 3. */
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Controller, int NumButtons)
{
// Update the gamepad status
SDL_JoystickUpdate();
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
_PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]);
_PadState.axis[CTL_MAIN_Y] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_Y]);
_PadState.axis[CTL_SUB_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_SUB_X]);
_PadState.axis[CTL_SUB_Y] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_SUB_Y]);
// Update the analog trigger axis values
#ifdef _WIN32
if (_PadMapping.triggertype == CTL_TRIGGER_SDL)
{
#endif
// If we are using SDL analog triggers the buttons have to be mapped as 1000 or up, otherwise they are not used
if(_PadMapping.buttons[CTL_L_SHOULDER] >= 1000) _PadState.axis[CTL_L_SHOULDER] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.buttons[CTL_L_SHOULDER] - 1000); else _PadState.axis[CTL_L_SHOULDER] = 0;
if(_PadMapping.buttons[CTL_R_SHOULDER] >= 1000) _PadState.axis[CTL_R_SHOULDER] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.buttons[CTL_R_SHOULDER] - 1000); else _PadState.axis[CTL_R_SHOULDER] = 0;
#ifdef _WIN32
}
else
{
// XInput triggers for Xbox360 pads
_PadState.axis[CTL_L_SHOULDER] = XInput::GetXI(Controller, _PadMapping.buttons[CTL_L_SHOULDER] - 1000);
_PadState.axis[CTL_R_SHOULDER] = XInput::GetXI(Controller, _PadMapping.buttons[CTL_R_SHOULDER] - 1000);
}
#endif
// Update button states to on or off
ReadButton(_PadState, _PadMapping, CTL_L_SHOULDER, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_R_SHOULDER, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_A_BUTTON, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_B_BUTTON, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_X_BUTTON, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_Y_BUTTON, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_Z_TRIGGER, NumButtons);
ReadButton(_PadState, _PadMapping, CTL_START, NumButtons);
// Update Halfpress state, this one is not in the standard _PadState.buttons array
if (_PadMapping.halfpress < NumButtons && _PadMapping.halfpress >= 0)
_PadState.halfpress = SDL_JoystickGetButton(_PadState.joy, _PadMapping.halfpress);
else
_PadState.halfpress = 0;
// Check if we have an analog or digital joypad
if (_PadMapping.controllertype == CTL_DPAD_HAT)
{
_PadState.dpad = SDL_JoystickGetHat(_PadState.joy, _PadMapping.dpad);
}
else
{
// Only do this if the assigned button is in range (to allow for the current way of saving keyboard
// keys in the same array)
if(_PadMapping.dpad2[CTL_D_PAD_UP] <= NumButtons)
_PadState.dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_UP]);
if(_PadMapping.dpad2[CTL_D_PAD_DOWN] <= NumButtons)
_PadState.dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_DOWN]);
if(_PadMapping.dpad2[CTL_D_PAD_LEFT] <= NumButtons)
_PadState.dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_LEFT]);
if(_PadMapping.dpad2[CTL_D_PAD_RIGHT] <= NumButtons)
_PadState.dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_RIGHT]);
}
#ifdef SHOW_PAD_STATUS
// Show the status of all connected pads
//ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
//if ((g_LastPad == 0 && Controller == 0) || Controller < g_LastPad) Console->ClearScreen();
g_LastPad = Controller;
NOTICE_LOG(CONSOLE,
"Pad | Number:%i Enabled:%i Handle:%i\n"
"Main Stick | X:%03i Y:%03i\n"
"C Stick | X:%03i Y:%03i\n"
"Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n"
"Buttons | A:%i X:%i\n"
"D-Pad | Type:%s Hat:%i U:%i D:%i\n"
"======================================================\n",
Controller, _PadMapping.enabled, _PadState.joy,
_PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y],
_PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y],
(_PadMapping.triggertype ? "CTL_TRIGGER_XINPUT" : "CTL_TRIGGER_SDL"),
_PadState.buttons[InputCommon::CTL_L_SHOULDER], _PadState.buttons[InputCommon::CTL_R_SHOULDER],
_PadState.axis[InputCommon::CTL_L_SHOULDER], _PadState.axis[InputCommon::CTL_R_SHOULDER],
_PadState.halfpress,
_PadState.buttons[InputCommon::CTL_A_BUTTON], _PadState.buttons[InputCommon::CTL_X_BUTTON],
(_PadMapping.controllertype ? "CTL_DPAD_CUSTOM" : "CTL_DPAD_HAT"),
_PadState.dpad,
_PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN]
);
#endif
}
// Configure button mapping
// ----------
// Avoid extreme axis values
// ---------------------
/* Function: We have to avoid very big values to becuse some triggers are -0x8000 in the
@ -367,8 +213,6 @@ void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int h
}
}
}
/////////////////////////////////////////////////////////// Configure button mapping
} // InputCommon

View File

@ -1,39 +1,24 @@
// Project description
// -------------------
// Name: SDL Input
// Description: Common SDL Input Functions
//
// Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
#ifndef _SDL_h
#define _SDL_h
// Include
// -------------------
#include <iostream> // System
#include <vector>
#include <cmath>
@ -55,52 +40,27 @@
#include "Common.h" // Common
namespace InputCommon
{
// Settings
// ----------
// Show a status window with the detected axes, buttons and so on
//#define SHOW_PAD_STATUS
// Structures
/* -------------------
CONTROLLER_STATE buttons (PadState) = 0 or 1
CONTROLLER_MAPPING buttons (joystick) = 0 or 1, 2, 3, 4, a certain joypad button
Please remember: The axis limit is hardcoded here, if you allow more axises (for
example for analog A and B buttons) you must first incrase the size of the axis array
size here
*/
struct CONTROLLER_STATE // GC PAD INFO/STATE
enum EButtonType
{
int buttons[8]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons
int dpad; // Automatic SDL D-Pad (8 directions + neutral)
int dpad2[4]; // D-pad using buttons
int axis[6]; // 2 x 2 Axes (Main & Sub)
int halfpress; // Halfpress... you know, like not fully pressed ;)...
SDL_Joystick *joy; // SDL joystick device
CTL_AXIS = 0,
CTL_HAT,
CTL_BUTTON,
CTL_KEY,
};
struct CONTROLLER_MAPPING // GC PAD MAPPING
enum ETriggerType
{
bool enable;
int buttons[8]; // (See above)
int dpad; // (See above)
int dpad2[4]; // (See above)
int axis[6]; // (See above)
int halfpress; // (See above)
int deadzone; // Deadzone... what else?
int ID; // SDL joystick device ID
int controllertype; // Hat: Hat or custom buttons
int triggertype; // Triggers range
std::string SRadius, SDiagonal, SRadiusC, SDiagonalC;
bool bRadiusOnOff, bSquareToCircle, bRadiusOnOffC, bSquareToCircleC;
bool rumble;
int eventnum; // Linux Event Number, Can't be found dynamically yet
CTL_TRIGGER_SDL = 0,
CTL_TRIGGER_XINPUT,
};
enum EXInputTrigger
{
XI_TRIGGER_L = 0,
XI_TRIGGER_R,
};
struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO
@ -114,66 +74,10 @@ struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO
bool Good; // Pad is good (it has at least one button or axis)
SDL_Joystick *joy; // SDL joystick device
};
enum
{
// CTL_L_SHOULDER and CTL_R_SHOULDER = 0 and 1
CTL_MAIN_X = 2,
CTL_MAIN_Y,
CTL_SUB_X,
CTL_SUB_Y
};
enum
{
CTL_L_SHOULDER = 0,
CTL_R_SHOULDER,
CTL_A_BUTTON,
CTL_B_BUTTON,
CTL_X_BUTTON,
CTL_Y_BUTTON,
CTL_Z_TRIGGER,
CTL_START
};
// DPad Type
enum
{
CTL_DPAD_HAT = 0, // Automatically use the first hat that SDL finds
CTL_DPAD_CUSTOM // Custom directional pad settings
};
// Trigger Type
enum
{
CTL_TRIGGER_SDL = 0, //
CTL_TRIGGER_XINPUT // The XBox 360 pad
};
enum
{
CTL_D_PAD_UP = 0,
CTL_D_PAD_DOWN,
CTL_D_PAD_LEFT,
CTL_D_PAD_RIGHT
};
// Button type for the configuration
enum
{
CTL_AXIS = 0,
CTL_HAT,
CTL_BUTTON,
CTL_KEY
};
// XInput buttons
enum
{
XI_TRIGGER_L = 0,
XI_TRIGGER_R
};
// Declarations
// ---------
// General functions
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads, int &NumGoodPads);
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int controller, int NumButtons);
void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool);
// Value conversion
@ -182,17 +86,11 @@ float Rad2Deg(float Rad);
int Pad_Convert(int _val);
float SquareDistance(float deg);
bool IsDeadZone(float DeadZone, int x, int y);
void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square = false);
void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius);
void Square2Circle(int &_x, int &_y, int _Diagonal, bool Circle2Square = false);
void RadiusAdjustment(s8 &_x, s8 &_y, int _Radius);
// Input configuration
std::string VKToString(int keycode);
#ifndef _SDL_MAIN_
extern int g_LastPad;
#endif
} // InputCommon

View File

@ -1,5 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcproj", "{F0B874CB-4476-4199-9315-8343D05AE684}"
ProjectSection(ProjectDependencies) = postProject
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
@ -69,12 +69,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dolphin", "Core\DolphinWX\D
{823DDC98-42D5-4A38-88CF-9DC06C788AE4} = {823DDC98-42D5-4A38-88CF-9DC06C788AE4}
{3D8156A9-64D1-4C8E-ADBE-1B319030E4A4} = {3D8156A9-64D1-4C8E-ADBE-1B319030E4A4}
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
{521498BE-6089-4780-8223-E67C22F4E068} = {521498BE-6089-4780-8223-E67C22F4E068}
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} = {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}
{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}
{F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
{9FF603F8-B3BB-4144-9688-B2B802FA0F16} = {9FF603F8-B3BB-4144-9688-B2B802FA0F16}
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}
EndProjectSection
EndProject
@ -92,13 +92,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoCommon", "Core\VideoCo
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_nJoy_SDL", "Plugins\Plugin_nJoy_SDL\Plugin_nJoy_SDL.vcproj", "{521498BE-6089-4780-8223-E67C22F4E068}"
ProjectSection(ProjectDependencies) = postProject
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_HLE", "Plugins\Plugin_DSP_HLE\Plugin_DSP_HLE.vcproj", "{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}"
ProjectSection(ProjectDependencies) = postProject
{05C75041-D67D-4903-A362-8395A7B35C75} = {05C75041-D67D-4903-A362-8395A7B35C75}
@ -200,6 +193,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoSoftware", "Plu
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_GCPad", "Plugins\Plugin_GCpad\Plugin_GCpad.vcproj", "{9FF603F8-B3BB-4144-9688-B2B802FA0F16}"
ProjectSection(ProjectDependencies) = postProject
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
{05C75041-D67D-4903-A362-8395A7B35C75} = {05C75041-D67D-4903-A362-8395A7B35C75}
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@ -236,16 +239,13 @@ Global
{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.Build.0 = Release|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.Debug|Win32.ActiveCfg = Debug|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Debug|Win32.Build.0 = Debug|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.ActiveCfg = Debug|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.Build.0 = Debug|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.ActiveCfg = Debug|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.Build.0 = DebugFast|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.Build.0 = DebugFast|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.ActiveCfg = Release|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.Build.0 = Release|x64
{9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.ActiveCfg = Debug|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.Build.0 = Debug|Win32
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|x64.ActiveCfg = Debug|x64
@ -342,18 +342,6 @@ Global
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.Build.0 = Release|Win32
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.ActiveCfg = Release|x64
{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.Build.0 = Release|x64
{521498BE-6089-4780-8223-E67C22F4E068}.Debug|Win32.ActiveCfg = Debug|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Debug|Win32.Build.0 = Debug|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Debug|x64.ActiveCfg = Debug|x64
{521498BE-6089-4780-8223-E67C22F4E068}.Debug|x64.Build.0 = Debug|x64
{521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|Win32.Build.0 = DebugFast|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.ActiveCfg = DebugFast|x64
{521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.Build.0 = DebugFast|x64
{521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.ActiveCfg = Release|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64
{521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.Build.0 = Release|x64
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|Win32.ActiveCfg = Debug|Win32
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|Win32.Build.0 = Debug|Win32
{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|x64.ActiveCfg = Debug|x64
@ -486,7 +474,6 @@ Global
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.ActiveCfg = Release|x64
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.Build.0 = Release|x64
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.ActiveCfg = Release|Win32
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.Build.0 = Release|Win32
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.ActiveCfg = Release|x64
{40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.Build.0 = Release|x64
{F81AE75C-3D17-4D8C-A201-82FA5351C123}.Debug|Win32.ActiveCfg = Debug|Win32
@ -573,6 +560,15 @@ Global
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Debug|Win32.ActiveCfg = Debug|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Debug|Win32.Build.0 = Debug|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Debug|x64.ActiveCfg = Debug|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.DebugFast|Win32.Build.0 = DebugFast|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.DebugFast|x64.ActiveCfg = DebugFast|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Release|Win32.ActiveCfg = Release|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Release|Win32.Build.0 = Release|Win32
{9FF603F8-B3BB-4144-9688-B2B802FA0F16}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -0,0 +1,233 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include <iostream>
#include "Common.h"
#include "IniFile.h"
#include "Config.h"
#include "GCpad.h"
static const char* gcControlNames[] =
{
"Button_A",
"Button_B",
"Button_X",
"Button_Y",
"Button_Z",
"Button_Start",
"DPad_Up",
"DPad_Down",
"DPad_Left",
"DPad_Right",
"Stick_Up",
"Stick_Down",
"Stick_Left",
"Stick_Right",
"CStick_Up",
"CStick_Down",
"CStick_Left",
"CStick_Right",
"Shoulder_L",
"Shoulder_R",
"Shoulder_Semi_L",
"Shoulder_Semi_R",
};
static const int gcDefaultControls[] =
#ifdef _WIN32
{
'X',
'Z',
'C',
'S',
'D',
VK_RETURN,
'T',
'G',
'F',
'H',
VK_UP,
VK_DOWN,
VK_LEFT,
VK_RIGHT,
'I',
'K',
'J',
'L',
'Q',
'W',
0x00,
0x00,
};
#elif defined(HAVE_X11) && HAVE_X11
{
XK_x, // A
XK_z, // B
XK_c, // X
XK_s, // Y
XK_d, // Z
XK_Return, // Start
XK_t, // D-pad up
XK_g, // D-pad down
XK_f, // D-pad left
XK_h, // D-pad right
XK_Up, // Main stick up
XK_Down, // Main stick down
XK_Left, // Main stick left
XK_Right, // Main stick right
XK_i, // C-stick up
XK_k, // C-stick down
XK_j, // C-stick left
XK_l, // C-stick right
XK_q, // L
XK_w, // R
0x00, // L semi-press
0x00, // R semi-press
};
#elif defined(HAVE_COCOA) && HAVE_COCOA
// Reference for Cocoa key codes:
// http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes
{
7, // A (x)
6, // B (z)
8, // X (c)
1, // Y (s)
2, // Z (d)
36, // Start (return)
17, // D-pad up (t)
5, // D-pad down (g)
3, // D-pad left (f)
4, // D-pad right (h)
126, // Main stick up (up)
125, // Main stick down (down)
123, // Main stick left (left)
124, // Main stick right (right)
34, // C-stick up (i)
40, // C-stick down (k)
38, // C-stick left (j)
37, // C-stick right (l)
12, // L (q)
13, // R (w)
-1, // L semi-press (none)
-1, // R semi-press (none)
};
#endif
Config g_Config;
// Run when created
// -----------------
Config::Config()
{
}
// Save settings to file
// ---------------------
void Config::Save()
{
// Load ini file
IniFile file;
file.Load(FULL_CONFIG_DIR "GCPad.ini");
// ==================================================================
// Global settings
file.Set("General", "NoTriggerFilter", g_Config.bNoTriggerFilter);
#ifdef RERECORDING
file.Set("General", "Recording", g_Config.bRecording);
file.Set("General", "Playback", g_Config.bPlayback);
#endif
for (int i = 0; i < 4; i++)
{
// ==================================================================
// Slot specific settings only
std::string SectionName = StringFromFormat("GCPad%i", i+1);
file.Set(SectionName.c_str(), "DeviceID", GCMapping[i].ID);
file.Set(SectionName.c_str(), "Axis_Lx", GCMapping[i].AxisMapping.Lx);
file.Set(SectionName.c_str(), "Axis_Ly", GCMapping[i].AxisMapping.Ly);
file.Set(SectionName.c_str(), "Axis_Rx", GCMapping[i].AxisMapping.Rx);
file.Set(SectionName.c_str(), "Axis_Ry", GCMapping[i].AxisMapping.Ry);
file.Set(SectionName.c_str(), "Trigger_L", GCMapping[i].AxisMapping.Tl);
file.Set(SectionName.c_str(), "Trigger_R", GCMapping[i].AxisMapping.Tr);
file.Set(SectionName.c_str(), "DeadZoneL", GCMapping[i].DeadZoneL);
file.Set(SectionName.c_str(), "DeadZoneR", GCMapping[i].DeadZoneR);
file.Set(SectionName.c_str(), "Diagonal", GCMapping[i].Diagonal);
file.Set(SectionName.c_str(), "Square2Circle", GCMapping[i].bSquare2Circle);
file.Set(SectionName.c_str(), "Rumble", GCMapping[i].Rumble);
file.Set(SectionName.c_str(), "RumbleStrength", GCMapping[i].RumbleStrength);
file.Set(SectionName.c_str(), "TriggerType", GCMapping[i].TriggerType);
file.Set(SectionName.c_str(), "Source_Stick", GCMapping[i].Stick.Main);
file.Set(SectionName.c_str(), "Source_CStick", GCMapping[i].Stick.Sub);
file.Set(SectionName.c_str(), "Source_Shoulder", GCMapping[i].Stick.Shoulder);
// ButtonMapping
for (int x = 0; x < LAST_CONSTANT; x++)
file.Set(SectionName.c_str(), gcControlNames[x], GCMapping[i].Button[x]);
}
file.Save(FULL_CONFIG_DIR "GCPad.ini");
}
// Load settings from file
// -----------------------
void Config::Load()
{
// Load file
IniFile file;
file.Load(FULL_CONFIG_DIR "GCPad.ini");
// ==================================================================
// Global settings
file.Get("General", "NoTriggerFilter", &g_Config.bNoTriggerFilter, false);
for (int i = 0; i < 4; i++)
{
std::string SectionName = StringFromFormat("GCPad%i", i+1);
file.Get(SectionName.c_str(), "DeviceID", &GCMapping[i].ID, 0);
file.Get(SectionName.c_str(), "Axis_Lx", &GCMapping[i].AxisMapping.Lx, 0);
file.Get(SectionName.c_str(), "Axis_Ly", &GCMapping[i].AxisMapping.Ly, 1);
file.Get(SectionName.c_str(), "Axis_Rx", &GCMapping[i].AxisMapping.Rx, 2);
file.Get(SectionName.c_str(), "Axis_Ry", &GCMapping[i].AxisMapping.Ry, 3);
file.Get(SectionName.c_str(), "Trigger_L", &GCMapping[i].AxisMapping.Tl, 1004);
file.Get(SectionName.c_str(), "Trigger_R", &GCMapping[i].AxisMapping.Tr, 1005);
file.Get(SectionName.c_str(), "DeadZoneL", &GCMapping[i].DeadZoneL, 0);
file.Get(SectionName.c_str(), "DeadZoneR", &GCMapping[i].DeadZoneR, 0);
file.Get(SectionName.c_str(), "Diagonal", &GCMapping[i].Diagonal, 100);
file.Get(SectionName.c_str(), "Square2Circle", &GCMapping[i].bSquare2Circle, false);
file.Get(SectionName.c_str(), "Rumble", &GCMapping[i].Rumble, false);
file.Get(SectionName.c_str(), "RumbleStrength", &GCMapping[i].RumbleStrength, 8); // x10
file.Get(SectionName.c_str(), "TriggerType", &GCMapping[i].TriggerType, 0);
file.Get(SectionName.c_str(), "Source_Stick", &GCMapping[i].Stick.Main, 0);
file.Get(SectionName.c_str(), "Source_CStick", &GCMapping[i].Stick.Sub, 0);
file.Get(SectionName.c_str(), "Source_Shoulder", &GCMapping[i].Stick.Shoulder, 0);
// ButtonMapping
for (int x = 0; x < LAST_CONSTANT; x++)
file.Get(SectionName.c_str(), gcControlNames[x], &GCMapping[i].Button[x], gcDefaultControls[x]);
}
}

View File

@ -1,42 +1,38 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _PLUGIN_NJOY_SDL_CONFIG_H
#define _PLUGIN_NJOY_SDL_CONFIG_H
struct Config
{
Config();
void Load(bool ChangePad = false, bool ChangeSaveByID = false);
void Save(int Slot = -1);
int CheckForDuplicateJoypads(bool OK);
// General
bool bShowAdvanced; // Only allow one of these
bool bSaveByID;
bool bCheckFocus;
bool bNoTriggerFilter;
int RumbleStrength;
#ifdef RERECORDING
bool bRecording;
bool bPlayback;
#endif
};
extern Config g_Config;
#endif // _PLUGIN_NJOY_SDL_CONFIG_H
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _PLUGIN_GCPAD_CONFIG_H
#define _PLUGIN_GCPAD_CONFIG_H
struct Config
{
Config();
void Load();
void Save();
// General
bool bNoTriggerFilter;
#ifdef RERECORDING
bool bRecording;
bool bPlayback;
#endif
};
extern Config g_Config;
#endif // _PLUGIN_GCPAD_CONFIG_H

View File

@ -0,0 +1,789 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "math.h" // System
#include "ConfigBox.h"
#include "Config.h"
#include "GCpad.h"
#if defined(HAVE_X11) && HAVE_X11
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/XKBlib.h>
#include "X11InputBase.h"
#endif
// The wxWidgets class
BEGIN_EVENT_TABLE(GCPadConfigDialog,wxDialog)
EVT_CLOSE(GCPadConfigDialog::OnClose)
EVT_BUTTON(ID_OK, GCPadConfigDialog::OnCloseClick)
EVT_BUTTON(ID_CANCEL, GCPadConfigDialog::OnCloseClick)
EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, GCPadConfigDialog::NotebookPageChanged)
EVT_COMBOBOX(IDC_JOYNAME, GCPadConfigDialog::ChangeSettings)
EVT_CHECKBOX(IDC_RUMBLE, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_RUMBLE_STRENGTH, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_DEAD_ZONE_LEFT, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_DEAD_ZONE_RIGHT, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_STICK_DIAGONAL, GCPadConfigDialog::ChangeSettings)
EVT_CHECKBOX(IDC_STICK_S2C, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_TRIGGER_TYPE, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_STICK_SOURCE, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_CSTICK_SOURCE, GCPadConfigDialog::ChangeSettings)
EVT_COMBOBOX(IDC_TRIGGER_SOURCE, GCPadConfigDialog::ChangeSettings)
EVT_BUTTON(IDB_ANALOG_LEFT_X, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_ANALOG_LEFT_Y, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_ANALOG_RIGHT_X, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_ANALOG_RIGHT_Y, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_TRIGGER_L, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_TRIGGER_R, GCPadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_BTN_A, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_BTN_B, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_BTN_X, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_BTN_Y, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_BTN_Z, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_BTN_START, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_DPAD_UP, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_DPAD_DOWN, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_DPAD_LEFT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_DPAD_RIGHT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_MAIN_UP, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_MAIN_DOWN, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_MAIN_LEFT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_MAIN_RIGHT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SUB_UP, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SUB_DOWN, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SUB_LEFT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SUB_RIGHT, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SHDR_L, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SHDR_R, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SHDR_SEMI_L, GCPadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_SHDR_SEMI_R, GCPadConfigDialog::OnButtonClick)
#if wxUSE_TIMER
EVT_TIMER(IDTM_UPDATE_PAD, GCPadConfigDialog::UpdatePadInfo)
EVT_TIMER(IDTM_BUTTON, GCPadConfigDialog::OnButtonTimer)
#endif
END_EVENT_TABLE()
GCPadConfigDialog::GCPadConfigDialog(wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style)
{
// Define values
m_ControlsCreated = false;
m_Page = 0;
// Create controls
CreateGUIControls();
#if wxUSE_TIMER
m_UpdatePadTimer = new wxTimer(this, IDTM_UPDATE_PAD);
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
// Reset values
g_Pressed = 0;
GetButtonWaitingID = 0;
GetButtonWaitingTimer = 0;
if (NumGoodPads)
{
// Start the constant timer
int TimesPerSecond = 10;
m_UpdatePadTimer->Start(1000 / TimesPerSecond);
}
#endif
UpdateGUI();
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard
wxKeyEventHandler(GCPadConfigDialog::OnKeyDown),
(wxObject*)0, this);
}
GCPadConfigDialog::~GCPadConfigDialog()
{
if (m_ButtonMappingTimer)
{
delete m_ButtonMappingTimer;
m_ButtonMappingTimer = NULL;
}
if (m_UpdatePadTimer)
{
delete m_UpdatePadTimer;
m_UpdatePadTimer = NULL;
}
}
// Notebook page changed
void GCPadConfigDialog::NotebookPageChanged(wxNotebookEvent& event)
{
// Update the global variable
m_Page = event.GetSelection();
// Update GUI
UpdateGUI();
}
// Close window
void GCPadConfigDialog::OnClose(wxCloseEvent& event)
{
// Allow wxWidgets to close the window
//event.Skip();
// Stop the timer
if (m_UpdatePadTimer)
m_UpdatePadTimer->Stop();
if (m_ButtonMappingTimer)
m_ButtonMappingTimer->Stop();
EndModal(wxID_CLOSE);
}
// Button Click
void GCPadConfigDialog::OnCloseClick(wxCommandEvent& event)
{
switch (event.GetId())
{
case ID_OK:
g_Config.Save();
Close(); // Call OnClose()
break;
case ID_CANCEL:
g_Config.Load();
Close(); // Call OnClose()
break;
}
}
void GCPadConfigDialog::SaveButtonMapping(int Id, int Key)
{
if (IDB_ANALOG_LEFT_X <= Id && Id <= IDB_TRIGGER_R)
{
GCMapping[m_Page].AxisMapping.Code[Id - IDB_ANALOG_LEFT_X] = Key;
}
else if (IDB_BTN_A <= Id && Id <= IDB_SHDR_SEMI_R)
{
GCMapping[m_Page].Button[Id - IDB_BTN_A] = Key;
}
}
void GCPadConfigDialog::OnKeyDown(wxKeyEvent& event)
{
event.Skip();
if(ClickedButton != NULL)
{
// Save the key
g_Pressed = event.GetKeyCode();
// Handle the keyboard key mapping
char keyStr[128] = {0};
// Allow the escape key to set a blank key
if (g_Pressed == WXK_ESCAPE)
{
SaveButtonMapping(ClickedButton->GetId(), -1);
SetButtonText(ClickedButton->GetId(), wxString());
}
else
{
#ifdef _WIN32
BYTE keyState[256];
GetKeyboardState(keyState);
for (int i = 1; i < 256; ++i)
{
if ((keyState[i] & 0x80) != 0)
{
// Use the left and right specific keys instead of the common ones
if (i == VK_SHIFT || i == VK_CONTROL || i == VK_MENU) continue;
// Update the button label
SetButtonText(ClickedButton->GetId(),
wxString::FromAscii(InputCommon::VKToString(i).c_str()));
// Save the setting
SaveButtonMapping(ClickedButton->GetId(), i);
break;
}
}
#elif defined(HAVE_X11) && HAVE_X11
int XKey = InputCommon::wxCharCodeWXToX(g_Pressed);
InputCommon::XKeyToString(XKey, keyStr);
SetButtonText(ClickedButton->GetId(),
wxString::FromAscii(keyStr));
SaveButtonMapping(ClickedButton->GetId(), XKey);
#endif
}
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
GetButtonWaitingID = 0;
ClickedButton = NULL;
}
}
// Configure button mapping
void GCPadConfigDialog::OnButtonClick(wxCommandEvent& event)
{
event.Skip();
// Don't allow space to start a new Press Key option, that will interfer with setting a key to space
if (g_Pressed == WXK_SPACE) { g_Pressed = 0; return; }
if (m_ButtonMappingTimer->IsRunning()) return;
// Create the button object
ClickedButton = (wxButton *)event.GetEventObject();
// Save old label so we can revert back
OldLabel = ClickedButton->GetLabel();
ClickedButton->SetWindowStyle(wxWANTS_CHARS);
ClickedButton->SetLabel(wxT("<Press Key>"));
DoGetButtons(ClickedButton->GetId());
}
// Configure axis mapping
void GCPadConfigDialog::OnAxisClick(wxCommandEvent& event)
{
event.Skip();
if (m_ButtonMappingTimer->IsRunning()) return;
ClickedButton = NULL;
wxButton* pButton = (wxButton *)event.GetEventObject();
OldLabel = pButton->GetLabel();
pButton->SetWindowStyle(wxWANTS_CHARS);
pButton->SetLabel(wxT("<Move Axis>"));
DoGetButtons(pButton->GetId());
}
void GCPadConfigDialog::ChangeSettings(wxCommandEvent& event)
{
int id = event.GetId();
switch (id)
{
case IDC_JOYNAME:
GCMapping[m_Page].ID = m_Joyname[m_Page]->GetSelection();
GCMapping[m_Page].joy = joyinfo.at(GCMapping[m_Page].ID).joy;
break;
case IDC_DEAD_ZONE_LEFT:
GCMapping[m_Page].DeadZoneL = m_ComboDeadZoneLeft[m_Page]->GetSelection();
break;
case IDC_DEAD_ZONE_RIGHT:
GCMapping[m_Page].DeadZoneR = m_ComboDeadZoneRight[m_Page]->GetSelection();
break;
case IDC_STICK_DIAGONAL:
GCMapping[m_Page].Diagonal = 100 - m_ComboDiagonal[m_Page]->GetSelection() * 5;
break;
case IDC_STICK_S2C:
GCMapping[m_Page].bSquare2Circle = m_CheckS2C[m_Page]->IsChecked();
break;
case IDC_RUMBLE:
GCMapping[m_Page].Rumble = m_CheckRumble[m_Page]->IsChecked();
break;
case IDC_RUMBLE_STRENGTH:
GCMapping[m_Page].RumbleStrength = m_RumbleStrength[m_Page]->GetSelection();
break;
case IDC_TRIGGER_TYPE:
GCMapping[m_Page].TriggerType = m_TriggerType[m_Page]->GetSelection();
break;
case IDC_STICK_SOURCE:
GCMapping[m_Page].Stick.Main = m_Combo_StickSrc[m_Page]->GetSelection();
break;
case IDC_CSTICK_SOURCE:
GCMapping[m_Page].Stick.Sub = m_Combo_CStickSrc[m_Page]->GetSelection();
break;
case IDC_TRIGGER_SOURCE:
GCMapping[m_Page].Stick.Shoulder = m_Combo_TriggerSrc[m_Page]->GetSelection();
break;
}
UpdateGUI();
}
void GCPadConfigDialog::UpdateGUI()
{
if(!m_ControlsCreated)
return;
// Disable all pad items if no pads are detected
bool PadEnabled = NumGoodPads != 0;
m_Joyname[m_Page]->Enable(PadEnabled);
m_ComboDeadZoneLeft[m_Page]->Enable(PadEnabled);
m_ComboDeadZoneRight[m_Page]->Enable(PadEnabled);
m_CheckS2C[m_Page]->Enable(PadEnabled);
m_ComboDiagonal[m_Page]->Enable(PadEnabled);
m_CheckRumble[m_Page]->Enable(PadEnabled);
m_RumbleStrength[m_Page]->Enable(PadEnabled);
m_TriggerType[m_Page]->Enable(PadEnabled);
for(int i = 0; i <= IDB_TRIGGER_R - IDB_ANALOG_LEFT_X; i++)
m_Button_Analog[i][m_Page]->Enable(PadEnabled);
wxString tmp;
m_Joyname[m_Page]->SetSelection(GCMapping[m_Page].ID);
m_ComboDeadZoneLeft[m_Page]->SetSelection(GCMapping[m_Page].DeadZoneL);
m_ComboDeadZoneRight[m_Page]->SetSelection(GCMapping[m_Page].DeadZoneR);
m_ComboDiagonal[m_Page]->SetSelection((100 - GCMapping[m_Page].Diagonal) / 5);
m_CheckS2C[m_Page]->SetValue(GCMapping[m_Page].bSquare2Circle);
m_CheckRumble[m_Page]->SetValue(GCMapping[m_Page].Rumble);
m_RumbleStrength[m_Page]->SetSelection(GCMapping[m_Page].RumbleStrength);
m_TriggerType[m_Page]->SetSelection(GCMapping[m_Page].TriggerType);
m_Combo_StickSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Main);
m_Combo_CStickSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Sub);
m_Combo_TriggerSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Shoulder);
for (int i = 0; i <= IDB_TRIGGER_R - IDB_ANALOG_LEFT_X; i++)
{
tmp << GCMapping[m_Page].AxisMapping.Code[i];
m_Button_Analog[i][m_Page]->SetLabel(tmp);
tmp.clear();
}
#ifdef _WIN32
for (int x = 0; x <= IDB_SHDR_SEMI_R - IDB_BTN_A; x++)
{
m_Button_GC[x][m_Page]->SetLabel(wxString::FromAscii(
InputCommon::VKToString(GCMapping[m_Page].Button[x + EGC_A]).c_str()));
}
#elif defined(HAVE_X11) && HAVE_X11
char keyStr[10] = {0};
for (int x = 0; x <= IDB_TGR_SEMI_R - IDB_BTN_A; x++)
{
InputCommon::XKeyToString(GCMapping[m_Page].Button[x + EGC_A], keyStr);
m_Button_GC[x][m_Page]->SetLabel(wxString::FromAscii(keyStr));
}
#endif
DoChangeDeadZone();
}
void GCPadConfigDialog::CreateGUIControls()
{
// Search for devices and add them to the device list
wxArrayString StrJoyname; // The string array
if (NumGoodPads > 0)
{
for (int i = 0; i < NumPads; i++)
StrJoyname.Add(wxString::FromAscii(joyinfo[i].Name.c_str()));
}
else
{
StrJoyname.Add(wxT("<No Gamepad Detected>"));
}
wxArrayString TextDeadZone;
for (int i = 0; i <= 50; i++)
TextDeadZone.Add(wxString::Format(wxT("%i%%"), i));
wxArrayString StrDiagonal;
for (int i = 0; i <= 10; i++)
StrDiagonal.Add(wxString::Format(wxT("%i%%"), 100 - i * 5));
wxArrayString StrRumble;
for (int i = 0; i <= 10; i++)
StrRumble.Add(wxString::Format(wxT("%i%%"), i * 10));
wxArrayString StrSource;
StrSource.Add(wxT("Keyboard"));
StrSource.Add(wxT("Analog 1"));
StrSource.Add(wxT("Analog 2"));
StrSource.Add(wxT("Triggers"));
// The Trigger type list
wxArrayString StrTriggerType;
StrTriggerType.Add(wxT("SDL")); // -0x8000 to 0x7fff
StrTriggerType.Add(wxT("XInput")); // 0x00 to 0xff
static const wxChar* anText[] =
{
wxT("Left X-Axis"),
wxT("Left Y-Axis"),
wxT("Right X-Axis"),
wxT("Right Y-Axis"),
wxT("Left Trigger"),
wxT("Right Trigger"),
};
static const wxChar* padText[] =
{
wxT("A"),
wxT("B"),
wxT("X"),
wxT("Y"),
wxT("Z"),
wxT("Start"),
wxT("Up"), // D-Pad
wxT("Down"),
wxT("Left"),
wxT("Right"),
wxT("Up"), // Main Stick
wxT("Down"),
wxT("Left"),
wxT("Right"),
wxT("Up"), // C-Stick
wxT("Down"),
wxT("Left"),
wxT("Right"),
wxT("L"), // Triggers
wxT("R"),
wxT("Semi-L"),
wxT("Semi-R"),
};
// Configuration controls sizes
static const int TxtW = 50, TxtH = 20, BtW = 70, BtH = 20;
// A small type font
wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
for (int i = 0; i < 4; i++)
{
m_Controller[i] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1 + i, wxDefaultPosition, wxDefaultSize);
m_Notebook->AddPage(m_Controller[i], wxString::Format(wxT("Gamecube Pad %d"), i+1));
// Controller
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, StrJoyname[0], wxDefaultPosition, wxSize(400, -1), StrJoyname, wxCB_READONLY);
// Dead zone
m_ComboDeadZoneLabel[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Dead Zone"));
m_ComboDeadZoneLeft[i] = new wxComboBox(m_Controller[i], IDC_DEAD_ZONE_LEFT, TextDeadZone[0], wxDefaultPosition, wxSize(50, -1), TextDeadZone, wxCB_READONLY);
m_ComboDeadZoneRight[i] = new wxComboBox(m_Controller[i], IDC_DEAD_ZONE_RIGHT, TextDeadZone[0], wxDefaultPosition, wxSize(50, -1), TextDeadZone, wxCB_READONLY);
// Circle to square
m_CheckS2C[i] = new wxCheckBox(m_Controller[i], IDC_STICK_S2C, wxT("Square To Circle"));
m_CheckS2C[i]->SetToolTip(wxT("This will convert a square stick radius to a circle stick radius, which is\n")
wxT("similar to the octagonal area that the original GameCube pad produces."));
// The drop down menu for the circle to square adjustment
m_DiagonalLabel[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Diagonal"));
m_DiagonalLabel[i]->SetToolTip(wxT("To produce a perfect circle in the 'Out' window you have to manually set\n")
wxT("your diagonal values here from what is shown in the 'In' window."));
m_ComboDiagonal[i] = new wxComboBox(m_Controller[i], IDC_STICK_DIAGONAL, StrDiagonal[0], wxDefaultPosition, wxSize(50, -1), StrDiagonal, wxCB_READONLY);
// Rumble
m_CheckRumble[i] = new wxCheckBox(m_Controller[i], IDC_RUMBLE, wxT("Rumble"));
m_RumbleStrengthLabel[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Strength"));
m_RumbleStrength[i] = new wxComboBox(m_Controller[i], IDC_RUMBLE_STRENGTH, StrRumble[0], wxDefaultPosition, wxSize(50, -1), StrRumble, wxCB_READONLY);
// Sizers
m_sDeadZoneHoriz[i] = new wxBoxSizer(wxHORIZONTAL);
m_sDeadZoneHoriz[i]->Add(m_ComboDeadZoneLeft[i], 0, (wxUP), 0);
m_sDeadZoneHoriz[i]->Add(m_ComboDeadZoneRight[i], 0, (wxUP), 0);
m_sDeadZone[i] = new wxBoxSizer(wxVERTICAL);
m_sDeadZone[i]->Add(m_ComboDeadZoneLabel[i], 0, wxALIGN_CENTER | (wxUP), 0);
m_sDeadZone[i]->Add(m_sDeadZoneHoriz[i], 0, wxALIGN_CENTER | (wxUP), 2);
m_sDiagonal[i] = new wxBoxSizer(wxHORIZONTAL);
m_sDiagonal[i]->Add(m_DiagonalLabel[i], 0, (wxUP), 4);
m_sDiagonal[i]->Add(m_ComboDiagonal[i], 0, (wxLEFT), 2);
m_sSquare2Circle[i] = new wxBoxSizer(wxVERTICAL);
m_sSquare2Circle[i]->Add(m_CheckS2C[i], 0, wxALIGN_CENTER | (wxUP), 0);
m_sSquare2Circle[i]->Add(m_sDiagonal[i], 0, wxALIGN_CENTER | (wxUP), 2);
m_sRumbleStrength[i] = new wxBoxSizer(wxHORIZONTAL);
m_sRumbleStrength[i]->Add(m_RumbleStrengthLabel[i], 0, (wxUP), 4);
m_sRumbleStrength[i]->Add(m_RumbleStrength[i], 0, (wxLEFT), 2);
m_sRumble[i] = new wxBoxSizer(wxVERTICAL);
m_sRumble[i]->Add(m_CheckRumble[i], 0, wxALIGN_CENTER | (wxUP), 0);
m_sRumble[i]->Add(m_sRumbleStrength[i], 0, wxALIGN_CENTER | (wxUP), 2);
m_sS2CDeadZone[i] = new wxBoxSizer(wxHORIZONTAL);
m_sS2CDeadZone[i]->Add(m_sDeadZone[i], 0, (wxUP), 0);
m_sS2CDeadZone[i]->Add(m_sSquare2Circle[i], 0, (wxLEFT), 40);
m_sS2CDeadZone[i]->Add(m_sRumble[i], 0, (wxLEFT), 40);
m_gJoyPad[i] = new wxStaticBoxSizer (wxVERTICAL, m_Controller[i], wxT("Gamepad"));
m_gJoyPad[i]->AddStretchSpacer();
m_gJoyPad[i]->Add(m_Joyname[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
m_gJoyPad[i]->Add(m_sS2CDeadZone[i], 0, wxALIGN_CENTER | (wxUP | wxDOWN), 4);
m_gJoyPad[i]->AddStretchSpacer();
// Row 1 Sizers: Connected pads, tilt
m_sHorizJoypad[i] = new wxBoxSizer(wxHORIZONTAL);
m_sHorizJoypad[i]->Add(m_gJoyPad[i], 0, wxEXPAND | (wxLEFT), 5);
// Stick Status Panels
m_tStatusLeftIn[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Not connected"));
m_tStatusLeftOut[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Not connected"));
m_tStatusRightIn[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Not connected"));
m_tStatusRightOut[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Not connected"));
m_pLeftInStatus[i] = new wxPanel(m_Controller[i], wxID_ANY, wxDefaultPosition, wxDefaultSize);
m_bmpSquareLeftIn[i] = new wxStaticBitmap(m_pLeftInStatus[i], wxID_ANY, CreateBitmap(), wxDefaultPosition, wxDefaultSize);
m_bmpDeadZoneLeftIn[i] = new wxStaticBitmap(m_pLeftInStatus[i], wxID_ANY, CreateBitmapDeadZone(0), wxDefaultPosition, wxDefaultSize);
m_bmpDotLeftIn[i] = new wxStaticBitmap(m_pLeftInStatus[i], wxID_ANY, CreateBitmapDot(), wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
m_pLeftOutStatus[i] = new wxPanel(m_Controller[i], wxID_ANY, wxDefaultPosition, wxDefaultSize);
m_bmpSquareLeftOut[i] = new wxStaticBitmap(m_pLeftOutStatus[i], wxID_ANY, CreateBitmap(), wxDefaultPosition, wxDefaultSize);
m_bmpDotLeftOut[i] = new wxStaticBitmap(m_pLeftOutStatus[i], wxID_ANY, CreateBitmapDot(), wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
m_pRightInStatus[i] = new wxPanel(m_Controller[i], wxID_ANY, wxDefaultPosition, wxDefaultSize);
m_bmpSquareRightIn[i] = new wxStaticBitmap(m_pRightInStatus[i], wxID_ANY, CreateBitmap(), wxDefaultPosition, wxDefaultSize);
m_bmpDeadZoneRightIn[i] = new wxStaticBitmap(m_pRightInStatus[i], wxID_ANY, CreateBitmapDeadZone(0), wxDefaultPosition, wxDefaultSize);
m_bmpDotRightIn[i] = new wxStaticBitmap(m_pRightInStatus[i], wxID_ANY, CreateBitmapDot(), wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
m_pRightOutStatus[i] = new wxPanel(m_Controller[i], wxID_ANY, wxDefaultPosition, wxDefaultSize);
m_bmpSquareRightOut[i] = new wxStaticBitmap(m_pRightOutStatus[i], wxID_ANY, CreateBitmap(), wxDefaultPosition, wxDefaultSize);
m_bmpDotRightOut[i] = new wxStaticBitmap(m_pRightOutStatus[i], wxID_ANY, CreateBitmapDot(), wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
// Sizers
m_sGridStickLeft[i] = new wxGridBagSizer(0, 0);
m_sGridStickLeft[i]->Add(m_pLeftInStatus[i], wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 0);
m_sGridStickLeft[i]->Add(m_pLeftOutStatus[i], wxGBPosition(0, 1), wxGBSpan(1, 1), wxLEFT, 10);
m_sGridStickLeft[i]->Add(m_tStatusLeftIn[i], wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 0);
m_sGridStickLeft[i]->Add(m_tStatusLeftOut[i], wxGBPosition(1, 1), wxGBSpan(1, 1), wxLEFT, 10);
m_sGridStickRight[i] = new wxGridBagSizer(0, 0);
m_sGridStickRight[i]->Add(m_pRightInStatus[i], wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 0);
m_sGridStickRight[i]->Add(m_pRightOutStatus[i], wxGBPosition(0, 1), wxGBSpan(1, 1), wxLEFT, 10);
m_sGridStickRight[i]->Add(m_tStatusRightIn[i], wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 0);
m_sGridStickRight[i]->Add(m_tStatusRightOut[i], wxGBPosition(1, 1), wxGBSpan(1, 1), wxLEFT, 10);
m_gStickLeft[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Analog 1 Status (In) (Out)"));
m_gStickLeft[i]->Add(m_sGridStickLeft[i], 0, (wxLEFT | wxRIGHT), 5);
m_gStickRight[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Analog 2 Status (In) (Out)"));
m_gStickRight[i]->Add(m_sGridStickRight[i], 0, (wxLEFT | wxRIGHT), 5);
// Trigger Status Panels
m_TriggerL[i]= new wxStaticText(m_Controller[i], wxID_ANY, wxT("Left: "));
m_TriggerR[i]= new wxStaticText(m_Controller[i], wxID_ANY, wxT("Right: "));
m_TriggerStatusL[i]= new wxStaticText(m_Controller[i], wxID_ANY, wxT("000"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
m_TriggerStatusR[i]= new wxStaticText(m_Controller[i], wxID_ANY, wxT("000"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
m_tTriggerSource[i]= new wxStaticText(m_Controller[i], wxID_ANY, wxT("Trigger Source"));
m_TriggerType[i] = new wxComboBox(m_Controller[i], IDC_TRIGGER_TYPE, StrTriggerType[0], wxDefaultPosition, wxSize(70, -1), StrTriggerType, wxCB_READONLY);
// Sizers
m_sGridTrigger[i] = new wxGridBagSizer(0, 0);
m_sGridTrigger[i]->Add(m_TriggerL[i], wxGBPosition(0, 0), wxGBSpan(1, 1), (wxTOP), 4);
m_sGridTrigger[i]->Add(m_TriggerStatusL[i], wxGBPosition(0, 1), wxGBSpan(1, 1), (wxLEFT | wxTOP), 4);
m_sGridTrigger[i]->Add(m_TriggerR[i], wxGBPosition(1, 0), wxGBSpan(1, 1), (wxTOP), 4);
m_sGridTrigger[i]->Add(m_TriggerStatusR[i], wxGBPosition(1, 1), wxGBSpan(1, 1), (wxLEFT | wxTOP), 4);
m_gTriggers[i] = new wxStaticBoxSizer (wxVERTICAL, m_Controller[i], wxT("Triggers Status"));
m_gTriggers[i]->AddStretchSpacer();
m_gTriggers[i]->Add(m_sGridTrigger[i], 0, wxEXPAND | (wxLEFT | wxRIGHT), 5);
m_gTriggers[i]->Add(m_tTriggerSource[i], 0, wxEXPAND | (wxUP | wxLEFT | wxRIGHT), 5);
m_gTriggers[i]->Add(m_TriggerType[i], 0, wxEXPAND | (wxUP | wxLEFT | wxRIGHT), 5);
m_gTriggers[i]->AddStretchSpacer();
// Row 2 Sizers: Analog status
m_sHorizStatus[i] = new wxBoxSizer(wxHORIZONTAL);
m_sHorizStatus[i]->Add(m_gStickLeft[i], 0, wxEXPAND | (wxLEFT), 5);
m_sHorizStatus[i]->Add(m_gStickRight[i], 0, wxEXPAND | (wxLEFT), 5);
m_sHorizStatus[i]->Add(m_gTriggers[i], 0, wxEXPAND | (wxLEFT), 5);
// Analog Axes and Triggers Mapping
m_sAnalogLeft[i] = new wxBoxSizer(wxVERTICAL);
m_sAnalogMiddle[i] = new wxBoxSizer(wxVERTICAL);
m_sAnalogRight[i] = new wxBoxSizer(wxVERTICAL);
for (int x = 0; x < 6; x++)
{
m_Text_Analog[x][i] = new wxStaticText(m_Controller[i], wxID_ANY, anText[x]);
m_Button_Analog[x][i] = new wxButton(m_Controller[i], x + IDB_ANALOG_LEFT_X, wxEmptyString, wxDefaultPosition, wxSize(BtW, BtH));
m_Button_Analog[x][i]->SetFont(m_SmallFont);
m_Sizer_Analog[x][i] = new wxBoxSizer(wxHORIZONTAL);
m_Sizer_Analog[x][i]->Add(m_Text_Analog[x][i], 0, (wxUP), 4);
m_Sizer_Analog[x][i]->Add(m_Button_Analog[x][i], 0, (wxLEFT), 2);
if (x < 2) // Make some balance
m_sAnalogLeft[i]->Add(m_Sizer_Analog[x][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else if (x < 4)
m_sAnalogMiddle[i]->Add(m_Sizer_Analog[x][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else
m_sAnalogRight[i]->Add(m_Sizer_Analog[x][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
}
m_gAnalog[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Analog Axes and Triggers"));
m_gAnalog[i]->Add(m_sAnalogLeft[i], 0, wxALIGN_RIGHT | (wxALL), 0);
m_gAnalog[i]->Add(m_sAnalogMiddle[i], 0, wxALIGN_RIGHT | (wxLEFT), 5);
m_gAnalog[i]->Add(m_sAnalogRight[i], 0, wxALIGN_RIGHT | (wxLEFT), 5);
// Row 3 Sizes: Analog Mapping
m_sHorizAnalog[i] = new wxBoxSizer(wxHORIZONTAL);
m_sHorizAnalog[i]->Add(m_gAnalog[i], 0, (wxLEFT), 5);
// Pad Mapping
m_gButton[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Buttons"));
m_gDPad[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("D-Pad"));
m_gStick[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Main Stick"));
m_Text_StickSrc[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Source"));
m_Combo_StickSrc[i] = new wxComboBox(m_Controller[i], IDC_STICK_SOURCE, StrSource[0], wxDefaultPosition, wxSize(70, -1), StrSource, wxCB_READONLY);
m_sStickSrc[i] = new wxBoxSizer(wxHORIZONTAL);
m_sStickSrc[i]->Add(m_Text_StickSrc[i], 0, (wxUP), 4);
m_sStickSrc[i]->Add(m_Combo_StickSrc[i], 0, (wxLEFT), 2);
m_gStick[i]->Add(m_sStickSrc[i], 0, wxALIGN_RIGHT | (wxALL), 2);
m_gStick[i]->AddSpacer(2);
m_gCStick[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("C-Stick"));
m_Text_CStickSrc[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Source"));
m_Combo_CStickSrc[i] = new wxComboBox(m_Controller[i], IDC_CSTICK_SOURCE, StrSource[0], wxDefaultPosition, wxSize(70, -1), StrSource, wxCB_READONLY);
m_sCStickSrc[i] = new wxBoxSizer(wxHORIZONTAL);
m_sCStickSrc[i]->Add(m_Text_CStickSrc[i], 0, (wxUP), 4);
m_sCStickSrc[i]->Add(m_Combo_CStickSrc[i], 0, (wxLEFT), 2);
m_gCStick[i]->Add(m_sCStickSrc[i], 0, wxALIGN_RIGHT | (wxALL), 2);
m_gCStick[i]->AddSpacer(2);
m_gTrigger[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Triggers"));
m_Text_TriggerSrc[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Source"));
m_Combo_TriggerSrc[i] = new wxComboBox(m_Controller[i], IDC_TRIGGER_SOURCE, StrSource[0], wxDefaultPosition, wxSize(70, -1), StrSource, wxCB_READONLY);
m_sTriggerSrc[i] = new wxBoxSizer(wxHORIZONTAL);
m_sTriggerSrc[i]->Add(m_Text_TriggerSrc[i], 0, (wxUP), 4);
m_sTriggerSrc[i]->Add(m_Combo_TriggerSrc[i], 0, (wxLEFT), 2);
m_gTrigger[i]->Add(m_sTriggerSrc[i], 0, wxALIGN_RIGHT | (wxALL), 2);
m_gTrigger[i]->AddSpacer(2);
for (int x = 0; x <= IDB_SHDR_SEMI_R - IDB_BTN_A; x++)
{
m_Text_Pad[x][i] = new wxStaticText(m_Controller[i], wxID_ANY, padText[x]);
m_Button_GC[x][i] = new wxButton(m_Controller[i], x + IDB_BTN_A, wxEmptyString, wxDefaultPosition, wxSize(BtW, BtH));
m_Button_GC[x][i]->SetFont(m_SmallFont);
m_Sizer_Pad[x][i] = new wxBoxSizer(wxHORIZONTAL);
m_Sizer_Pad[x][i]->Add(m_Text_Pad[x][i], 0, (wxUP), 4);
m_Sizer_Pad[x][i]->Add(m_Button_GC[x][i], 0, (wxLEFT), 2);
if (x <= IDB_BTN_START)
m_gButton[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else if (x <= IDB_DPAD_RIGHT)
m_gDPad[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else if (x <= IDB_MAIN_RIGHT)
m_gStick[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else if (x <= IDB_SUB_RIGHT)
m_gCStick[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else
m_gTrigger[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
}
// Row 4 Sizers: Button Mapping
m_sHorizMapping[i] = new wxBoxSizer(wxHORIZONTAL);
m_sHorizMapping[i]->Add(m_gButton[i], 0, (wxLEFT), 5);
m_sHorizMapping[i]->Add(m_gDPad[i], 0, (wxLEFT), 5);
m_sHorizMapping[i]->Add(m_gStick[i], 0, (wxLEFT), 5);
m_sHorizMapping[i]->Add(m_gCStick[i], 0, (wxLEFT), 5);
m_sHorizMapping[i]->Add(m_gTrigger[i], 0, (wxLEFT), 5);
// Set up sizers and layout
// The sizer m_sMain will be expanded inside m_Controller
m_sMain[i] = new wxBoxSizer(wxVERTICAL);
m_sMain[i]->Add(m_sHorizJoypad[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
m_sMain[i]->Add(m_sHorizStatus[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
m_sMain[i]->Add(m_sHorizAnalog[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
m_sMain[i]->Add(m_sHorizMapping[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
// Set the main sizer
m_Controller[i]->SetSizer(m_sMain[i]);
}
m_OK = new wxButton(this, ID_OK, wxT("OK"));
m_OK->SetToolTip(wxT("Save changes and close"));
m_Cancel = new wxButton(this, ID_CANCEL, wxT("Cancel"));
m_Cancel->SetToolTip(wxT("Discard changes and close"));
wxBoxSizer* m_DlgButton = new wxBoxSizer(wxHORIZONTAL);
m_DlgButton->AddStretchSpacer();
m_DlgButton->Add(m_OK, 0, (wxLEFT), 5);
m_DlgButton->Add(m_Cancel, 0, (wxLEFT), 5);
m_MainSizer = new wxBoxSizer(wxVERTICAL);
m_MainSizer->Add(m_Notebook, 1, wxEXPAND | wxALL, 5);
m_MainSizer->Add(m_DlgButton, 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5);
SetSizer(m_MainSizer);
Layout();
Fit();
// Center the window if there is room for it
#ifdef _WIN32
if (GetSystemMetrics(SM_CYFULLSCREEN) > 600)
Center();
#endif
m_ControlsCreated = true;
}
// Bitmap box and dot
wxBitmap GCPadConfigDialog::CreateBitmap()
{
BoxW = 70, BoxH = 70;
wxBitmap bitmap(BoxW, BoxH);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
wxPen LightBluePen(_T("#7f9db9")); // Windows XP color
dc.SetPen(LightBluePen);
dc.SetBrush(*wxWHITE_BRUSH);
dc.Clear();
dc.DrawRectangle(0, 0, BoxW, BoxH);
dc.SelectObject(wxNullBitmap);
return bitmap;
}
wxBitmap GCPadConfigDialog::CreateBitmapDot()
{
int w = 2, h = 2;
wxBitmap bitmap(w, h);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
dc.SetPen(*wxRED_PEN);
dc.SetBrush(*wxRED_BRUSH);
dc.Clear();
dc.DrawRectangle(0, 0, w, h);
dc.SelectObject(wxNullBitmap);
return bitmap;
}
wxBitmap GCPadConfigDialog::CreateBitmapDeadZone(int Radius)
{
wxBitmap bitmap(Radius*2, Radius*2);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
dc.SetPen(*wxLIGHT_GREY_PEN);
dc.SetBrush(*wxLIGHT_GREY_BRUSH);
//dc.SetBackground(*wxGREEN_BRUSH);
dc.Clear();
dc.DrawCircle(Radius, Radius, Radius);
dc.SelectObject(wxNullBitmap);
return bitmap;
}
wxBitmap GCPadConfigDialog::CreateBitmapClear()
{
wxBitmap bitmap(BoxW, BoxH);
wxMemoryDC dc;
dc.SelectObject(bitmap);
dc.Clear();
dc.SelectObject(wxNullBitmap);
return bitmap;
}

View File

@ -0,0 +1,226 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef __GCPAD_CONFIGBOX_h__
#define __GCPAD_CONFIGBOX_h__
#include <wx/wx.h>
#include <wx/textctrl.h>
#include <wx/button.h>
#include <wx/stattext.h>
#include <wx/combobox.h>
#include <wx/checkbox.h>
#include <wx/notebook.h>
#include <wx/panel.h>
#include <wx/gbsizer.h>
#include "GCpad.h"
class GCPadConfigDialog : public wxDialog
{
public:
GCPadConfigDialog(wxWindow *parent, wxWindowID id = 1,
const wxString &title = wxT("Gamecube Pad Plugin Configuration"),
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE);
virtual ~GCPadConfigDialog();
private:
DECLARE_EVENT_TABLE();
enum
{
// it's important that they are kept in this order
IDB_BTN_A = 0,
IDB_BTN_B,
IDB_BTN_X,
IDB_BTN_Y,
IDB_BTN_Z,
IDB_BTN_START,
IDB_DPAD_UP,
IDB_DPAD_DOWN,
IDB_DPAD_LEFT,
IDB_DPAD_RIGHT,
IDB_MAIN_UP,
IDB_MAIN_DOWN,
IDB_MAIN_LEFT,
IDB_MAIN_RIGHT,
IDB_SUB_UP,
IDB_SUB_DOWN,
IDB_SUB_LEFT,
IDB_SUB_RIGHT,
IDB_SHDR_L,
IDB_SHDR_R,
IDB_SHDR_SEMI_L,
IDB_SHDR_SEMI_R,
// Joypad
IDB_ANALOG_LEFT_X, IDB_ANALOG_LEFT_Y,
IDB_ANALOG_RIGHT_X, IDB_ANALOG_RIGHT_Y,
IDB_TRIGGER_L, IDB_TRIGGER_R,
// Dialog controls
ID_OK = 1000,
ID_CANCEL,
ID_NOTEBOOK,
ID_CONTROLLERPAGE1,
ID_CONTROLLERPAGE2,
ID_CONTROLLERPAGE3,
ID_CONTROLLERPAGE4,
// Timers
IDTM_BUTTON, IDTM_UPDATE_PAD,
// Gamepad settings
IDC_JOYNAME,
IDC_DEAD_ZONE_LEFT, IDC_DEAD_ZONE_RIGHT,
IDC_STICK_DIAGONAL, IDC_STICK_S2C,
IDC_RUMBLE, IDC_RUMBLE_STRENGTH,
IDC_TRIGGER_TYPE,
IDC_STICK_SOURCE, IDC_CSTICK_SOURCE, IDC_TRIGGER_SOURCE,
};
wxNotebook *m_Notebook;
wxPanel *m_Controller[4],
*m_pLeftInStatus[4],
*m_pLeftOutStatus[4],
*m_pRightInStatus[4],
*m_pRightOutStatus[4];
wxStaticBitmap *m_bmpSquareLeftIn[4],
*m_bmpSquareLeftOut[4],
*m_bmpSquareRightIn[4],
*m_bmpSquareRightOut[4];
wxCheckBox *m_CheckS2C[4],
*m_CheckRumble[4];
wxButton *m_OK, *m_Cancel, *ClickedButton,
*m_Button_Analog[IDB_TRIGGER_R - IDB_ANALOG_LEFT_X + 1][4],
*m_Button_GC[IDB_SHDR_SEMI_R - IDB_BTN_A + 1][4];
wxComboBox *m_Joyname[4],
*m_ComboDeadZoneLeft[4],
*m_ComboDeadZoneRight[4],
*m_ComboDiagonal[4],
*m_RumbleStrength[4],
*m_TriggerType[4],
*m_Combo_StickSrc[4],
*m_Combo_CStickSrc[4],
*m_Combo_TriggerSrc[4];
wxGridBagSizer *m_sGridStickLeft[4],
*m_sGridStickRight[4],
*m_sGridTrigger[4];
wxBoxSizer *m_MainSizer,
*m_sMain[4],
*m_sDeadZoneHoriz[4],
*m_sDeadZone[4],
*m_sDiagonal[4],
*m_sSquare2Circle[4],
*m_sS2CDeadZone[4],
*m_sRumbleStrength[4],
*m_sRumble[4],
*m_sHorizJoypad[4],
*m_sHorizStatus[4],
*m_Sizer_Analog[IDB_TRIGGER_R - IDB_ANALOG_LEFT_X + 1][4],
*m_sAnalogLeft[4],
*m_sAnalogMiddle[4],
*m_sAnalogRight[4],
*m_sHorizAnalog[4],
*m_sStickSrc[4],
*m_sCStickSrc[4],
*m_sTriggerSrc[4],
*m_Sizer_Pad[IDB_SHDR_SEMI_R - IDB_BTN_A + 1][4],
*m_sHorizMapping[4];
wxStaticBoxSizer *m_gJoyPad[4],
*m_gStickLeft[4],
*m_gStickRight[4],
*m_gTriggers[4],
*m_gAnalog[4],
*m_gButton[4],
*m_gDPad[4],
*m_gStick[4],
*m_gCStick[4],
*m_gTrigger[4];
wxStaticText *m_ComboDeadZoneLabel[4],
*m_DiagonalLabel[4],
*m_RumbleStrengthLabel[4],
*m_tStatusLeftIn[4], *m_tStatusLeftOut[4],
*m_tStatusRightIn[4], *m_tStatusRightOut[4],
*m_TriggerL[4], *m_TriggerR[4],
*m_TriggerStatusL[4], *m_TriggerStatusR[4],
*m_tTriggerSource[4],
*m_Text_Analog[IDB_TRIGGER_R - IDB_ANALOG_LEFT_X + 1][4],
*m_Text_Pad[IDB_SHDR_SEMI_R - IDB_BTN_A + 1][4],
*m_Text_StickSrc[5],
*m_Text_CStickSrc[5],
*m_Text_TriggerSrc[5];
wxStaticBitmap *m_bmpDotLeftIn[4],
*m_bmpDotLeftOut[4],
*m_bmpDotRightIn[4],
*m_bmpDotRightOut[4],
*m_bmpDeadZoneLeftIn[4],
*m_bmpDeadZoneRightIn[4];
bool m_ControlsCreated;
int m_Page, BoxW, BoxH;
int GetButtonWaitingID, GetButtonWaitingTimer, g_Pressed;
wxString OldLabel;
#if wxUSE_TIMER
wxTimer *m_UpdatePadTimer, *m_ButtonMappingTimer;
void UpdatePadInfo(wxTimerEvent& WXUNUSED(event));
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
#endif
wxBitmap CreateBitmap();
wxBitmap CreateBitmapDot();
wxBitmap CreateBitmapDeadZone(int Radius);
wxBitmap CreateBitmapClear();
void NotebookPageChanged(wxNotebookEvent& event);
void OnClose(wxCloseEvent& event);
void OnCloseClick(wxCommandEvent& event);
void OnKeyDown(wxKeyEvent& event);
void OnButtonClick(wxCommandEvent& event);
void OnAxisClick(wxCommandEvent& event);
void ChangeSettings(wxCommandEvent& event);
void SaveButtonMapping(int Id, int Key);
void UpdateGUI();
void CreateGUIControls();
void Convert2Box(int &x);
void DoChangeDeadZone();
void ToBlank(bool ToBlank, int Id);
void DoGetButtons(int _GetId);
void SetButtonText(int id, const wxString &str);
wxString GetButtonText(int id);
};
#endif // __GCPAD_CONFIGBOX_h__

View File

@ -0,0 +1,310 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "Config.h"
#include "ConfigBox.h"
#include "GCpad.h"
// Replace the harder to understand -1 with "" for the sake of user friendliness
void GCPadConfigDialog::ToBlank(bool ToBlank, int Id)
{
if (!m_ControlsCreated)
return;
if(ToBlank)
{
if (GetButtonText(Id) == wxString(wxT("-1")))
SetButtonText(Id, wxString());
}
else
{
if (GetButtonText(Id).IsEmpty())
SetButtonText(Id, wxString(wxT("-1")));
}
}
void GCPadConfigDialog::DoChangeDeadZone()
{
float Rad;
Rad = (float)GCMapping[m_Page].DeadZoneL * ((float)BoxW / 100.0) * 0.5;
m_bmpDeadZoneLeftIn[m_Page]->SetBitmap(CreateBitmapClear());
m_bmpDeadZoneLeftIn[m_Page]->SetSize(0, 0);
m_bmpDeadZoneLeftIn[m_Page]->SetBitmap(CreateBitmapDeadZone((int)Rad));
m_bmpDeadZoneLeftIn[m_Page]->SetPosition(wxPoint(BoxW / 2 - (int)Rad, BoxH / 2 - (int)Rad));
m_bmpDeadZoneLeftIn[m_Page]->Refresh();
Rad = (float)GCMapping[m_Page].DeadZoneR * ((float)BoxW / 100.0) * 0.5;
m_bmpDeadZoneRightIn[m_Page]->SetBitmap(CreateBitmapClear());
m_bmpDeadZoneRightIn[m_Page]->SetSize(0, 0);
m_bmpDeadZoneRightIn[m_Page]->SetBitmap(CreateBitmapDeadZone((int)Rad));
m_bmpDeadZoneRightIn[m_Page]->SetPosition(wxPoint(BoxW / 2 - (int)Rad, BoxH / 2 - (int)Rad));
m_bmpDeadZoneRightIn[m_Page]->Refresh();
}
// Update the textbox for the buttons
void GCPadConfigDialog::SetButtonText(int id, const wxString &str)
{
if (IDB_ANALOG_LEFT_X <= id && id <= IDB_TRIGGER_R)
m_Button_Analog[id - IDB_ANALOG_LEFT_X][m_Page]->SetLabel(str);
else if (IDB_BTN_A <= id && id <= IDB_SHDR_SEMI_R)
m_Button_GC[id - IDB_BTN_A][m_Page]->SetLabel(str);
}
// Get the text in the textbox for the buttons
wxString GCPadConfigDialog::GetButtonText(int id)
{
if (IDB_ANALOG_LEFT_X <= id && id <= IDB_TRIGGER_R)
return m_Button_Analog[id - IDB_ANALOG_LEFT_X][m_Page]->GetLabel();
else if (IDB_BTN_A <= id && id <= IDB_SHDR_SEMI_R)
return m_Button_GC[id - IDB_BTN_A][m_Page]->GetLabel();
return wxString();
}
void GCPadConfigDialog::DoGetButtons(int _GetId)
{
// Collect the starting values
// Get the current controller
int PadID = GCMapping[m_Page].ID;
// Get the controller and trigger type
int TriggerType = GCMapping[m_Page].TriggerType;
// Collect the accepted buttons for this slot
bool LeftRight = (_GetId == IDB_TRIGGER_L || _GetId == IDB_TRIGGER_R);
bool Axis = (_GetId >= IDB_ANALOG_LEFT_X && _GetId <= IDB_TRIGGER_R)
// Don't allow SDL axis input for the shoulder buttons if XInput is selected
&& !(TriggerType == InputCommon::CTL_TRIGGER_XINPUT && (_GetId == IDB_TRIGGER_L || _GetId == IDB_TRIGGER_R) );
bool XInput = (TriggerType == InputCommon::CTL_TRIGGER_XINPUT);
bool Button = (_GetId >= IDB_BTN_A && _GetId <= IDB_SHDR_SEMI_R);
bool Hat = (_GetId >= IDB_BTN_A && _GetId <= IDB_SHDR_SEMI_R);
bool NoTriggerFilter = g_Config.bNoTriggerFilter;
// Values used in this function
int Seconds = 4; // Seconds to wait for
int TimesPerSecond = 40; // How often to run the check
// Values returned from InputCommon::GetButton()
int value; // Axis value or Hat value
int type; // Button type
int KeyPressed = 0;
int pressed = 0;
bool Succeed = false;
bool Stop = false; // Stop the timer
// If the Id has changed or the timer is not running we should start one
if( GetButtonWaitingID != _GetId || !m_ButtonMappingTimer->IsRunning() )
{
if(m_ButtonMappingTimer->IsRunning())
m_ButtonMappingTimer->Stop();
// Save the button Id
GetButtonWaitingID = _GetId;
GetButtonWaitingTimer = 0;
// Start the timer
#if wxUSE_TIMER
m_ButtonMappingTimer->Start(1000 / TimesPerSecond);
#endif
DEBUG_LOG(PAD, "Timer Started: Pad:%i _GetId:%i "
"Allowed input is Axis:%i LeftRight:%i XInput:%i Button:%i Hat:%i",
GCMapping[m_Page].ID, _GetId,
Axis, LeftRight, XInput, Button, Hat);
}
// Check for buttons
// If there is a timer we should not create a new one
else if (NumGoodPads > 0)
{
InputCommon::GetButton(
GCMapping[m_Page].joy, PadID, joyinfo[PadID].NumButtons, joyinfo[PadID].NumAxes, joyinfo[PadID].NumHats,
KeyPressed, value, type, pressed, Succeed, Stop,
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
}
// Process results
// Count each time
GetButtonWaitingTimer++;
// This is run every second
if (GetButtonWaitingTimer % TimesPerSecond == 0)
{
// Current time
int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond);
// Update text
SetButtonText(_GetId, wxString::Format(wxT("[ %d ]"), TmpTime));
}
// Time's up
if (GetButtonWaitingTimer / TimesPerSecond >= Seconds)
{
Stop = true;
// Revert back to old label
SetButtonText(_GetId, OldLabel);
}
// If we got a button
if(Succeed)
{
Stop = true;
// We need to assign hat special code
if (type == InputCommon::CTL_HAT)
{
// Index of pressed starts from 0
if (value & SDL_HAT_UP) pressed = 0x0100 + 0x0010 * pressed + SDL_HAT_UP;
else if (value & SDL_HAT_DOWN) pressed = 0x0100 + 0x0010 * pressed + SDL_HAT_DOWN;
else if (value & SDL_HAT_LEFT) pressed = 0x0100 + 0x0010 * pressed + SDL_HAT_LEFT;
else if (value & SDL_HAT_RIGHT) pressed = 0x0100 + 0x0010 * pressed + SDL_HAT_RIGHT;
else pressed = -1;
}
if (IDB_BTN_A <= _GetId && _GetId <= IDB_SHDR_SEMI_R)
{
// Better make the pad button code far from virtual key code
SaveButtonMapping(_GetId, 0x1000 + pressed);
SetButtonText(_GetId, wxString::Format(wxT("PAD: %d"), pressed));
}
else if (IDB_ANALOG_LEFT_X <= _GetId && _GetId <= IDB_TRIGGER_R)
{
SaveButtonMapping(_GetId, pressed);
SetButtonText(_GetId, wxString::Format(wxT("%d"), pressed));
}
}
// Stop the timer
if(Stop)
{
DEBUG_LOG(PAD, "Timer Stopped for Pad:%i _GetId:%i", GCMapping[m_Page].ID, _GetId);
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
GetButtonWaitingID = 0;
ClickedButton = NULL;
}
// If we got a bad button
if(KeyPressed == -1)
{
// Update text
SetButtonText(_GetId, wxString(wxT("PAD: -1")));
// Notify the user
wxMessageBox(wxString::Format(
wxT("You selected a key with a to low key code (%i), please")
wxT(" select another key with a higher key code."), pressed)
, wxT("Notice"), wxICON_INFORMATION);
}
}
// Convert the 0x8000 range values to BoxW and BoxH for the plot
void GCPadConfigDialog::Convert2Box(int &x)
{
// Border adjustment
int BoxW_ = BoxW - 2; int BoxH_ = BoxH - 2;
// Convert values
x = (BoxW_ / 2) + (x * BoxW_ / (32767 * 2));
}
// Update the input status boxes
void GCPadConfigDialog::UpdatePadInfo(wxTimerEvent& WXUNUSED(event))
{
if (GCMapping[m_Page].ID < 0 || GCMapping[m_Page].ID >= NumPads)
{
m_tStatusLeftIn[m_Page]->SetLabel(wxT("Not connected"));
m_tStatusLeftOut[m_Page]->SetLabel(wxT("Not connected"));
m_tStatusRightIn[m_Page]->SetLabel(wxT("Not connected"));
m_tStatusRightOut[m_Page]->SetLabel(wxT("Not connected"));
m_TriggerStatusL[m_Page]->SetLabel(wxT("000"));
m_TriggerStatusR[m_Page]->SetLabel(wxT("000"));
return;
}
// Check that Dolphin is in focus, otherwise don't update the pad status
//if (IsFocus())
GetAxisState(GCMapping[m_Page]);
// Analog stick
// Get original values
int main_x = GCMapping[m_Page].AxisState.Lx;
int main_y = GCMapping[m_Page].AxisState.Ly;
int right_x = GCMapping[m_Page].AxisState.Rx;
int right_y = GCMapping[m_Page].AxisState.Ry;
// Get adjusted values
int main_x_after = main_x, main_y_after = main_y;
int right_x_after = right_x, right_y_after = right_y;
// Produce square
if(GCMapping[m_Page].bSquare2Circle)
InputCommon::Square2Circle(main_x_after, main_y_after, GCMapping[m_Page].Diagonal, false);
// Check dead zone
float DeadZoneLeft = (float)GCMapping[m_Page].DeadZoneL / 100.0;
float DeadZoneRight = (float)GCMapping[m_Page].DeadZoneR / 100.0;
if (InputCommon::IsDeadZone(DeadZoneLeft, main_x_after, main_y_after))
{
main_x_after = 0;
main_y_after = 0;
}
if (InputCommon::IsDeadZone(DeadZoneRight, right_x_after, right_y_after))
{
right_x_after = 0;
right_y_after = 0;
}
int Lx = InputCommon::Pad_Convert(main_x); int Ly = InputCommon::Pad_Convert(main_y);
int Rx = InputCommon::Pad_Convert(right_x); int Ry = InputCommon::Pad_Convert(right_y);
int Lx_after = InputCommon::Pad_Convert(main_x_after); int Ly_after = InputCommon::Pad_Convert(main_y_after);
int Rx_after = InputCommon::Pad_Convert(right_x_after); int Ry_after = InputCommon::Pad_Convert(right_y_after);
m_tStatusLeftIn[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Lx, Ly));
m_tStatusLeftOut[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Lx_after, Ly_after));
m_tStatusRightIn[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Rx, Ry));
m_tStatusRightOut[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Rx_after, Ry_after));
// Adjust the values for the plot
Convert2Box(main_x); Convert2Box(main_y);
Convert2Box(right_x); Convert2Box(right_y);
Convert2Box(main_x_after); Convert2Box(main_y_after);
Convert2Box(right_x_after); Convert2Box(right_y_after);
// Adjust the dot
m_bmpDotLeftIn[m_Page]->SetPosition(wxPoint(main_x, main_y));
m_bmpDotLeftOut[m_Page]->SetPosition(wxPoint(main_x_after, main_y_after));
m_bmpDotRightIn[m_Page]->SetPosition(wxPoint(right_x, right_y));
m_bmpDotRightOut[m_Page]->SetPosition(wxPoint(right_x_after, right_y_after));
// Get the trigger values
int TriggerLeft = GCMapping[m_Page].AxisState.Tl;
int TriggerRight = GCMapping[m_Page].AxisState.Tr;
// Convert the triggers values
if (GCMapping[m_Page].TriggerType == InputCommon::CTL_TRIGGER_SDL)
{
TriggerLeft = InputCommon::Pad_Convert(TriggerLeft);
TriggerRight = InputCommon::Pad_Convert(TriggerRight);
}
m_TriggerStatusL[m_Page]->SetLabel(wxString::Format(wxT("%03i"), TriggerLeft));
m_TriggerStatusR[m_Page]->SetLabel(wxString::Format(wxT("%03i"), TriggerRight));
}

View File

@ -0,0 +1,651 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "GCpad.h"
#include "Config.h"
#include "LogManager.h"
#if defined(HAVE_WX) && HAVE_WX
#include "ConfigBox.h"
#endif
// Declare config window so that we can write debugging info to it from functions in this file
#if defined(HAVE_WX) && HAVE_WX
GCPadConfigDialog* m_ConfigFrame = NULL;
#endif
// Variables
// ---------
bool KeyStatus[LAST_CONSTANT];
bool g_SearchDeviceDone = false;
CONTROLLER_MAPPING_GC GCMapping[4];
std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
int NumPads = 0, NumGoodPads = 0, g_ID = 0;
#ifdef _WIN32
HWND m_hWnd = NULL; // Handle to window
#endif
SPADInitialize *g_PADInitialize = NULL;
PLUGIN_GLOBALS* globals = NULL;
// Standard crap to make wxWidgets happy
#ifdef _WIN32
HINSTANCE g_hInstance;
#if defined(HAVE_WX) && HAVE_WX
class wxDLLApp : public wxApp
{
bool OnInit()
{
return true;
}
};
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);
#endif
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
DWORD dwReason, // reason called
LPVOID lpvReserved) // reserved
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
#if defined(HAVE_WX) && HAVE_WX
wxSetInstance((HINSTANCE)hinstDLL);
int argc = 0;
char **argv = NULL;
wxEntryStart(argc, argv);
if (!wxTheApp || !wxTheApp->CallOnInit())
return FALSE;
#endif
}
break;
case DLL_PROCESS_DETACH:
#if defined(HAVE_WX) && HAVE_WX
wxEntryCleanup();
#endif
break;
default:
break;
}
g_hInstance = hinstDLL;
return TRUE;
}
#endif
#if defined(HAVE_WX) && HAVE_WX
wxWindow* GetParentedWxWindow(HWND Parent)
{
#ifdef _WIN32
wxSetInstance((HINSTANCE)g_hInstance);
#endif
wxWindow *win = new wxWindow();
#ifdef _WIN32
win->SetHWND((WXHWND)Parent);
win->AdoptAttributesFromHWND();
#endif
return win;
}
#endif
// Input Plugin Functions (from spec's)
// ------------------------------------
// Get properties of plugin
// ------------------------
void GetDllInfo(PLUGIN_INFO* _PluginInfo)
{
_PluginInfo->Version = 0x0100;
_PluginInfo->Type = PLUGIN_TYPE_PAD;
#ifdef DEBUGFAST
sprintf(_PluginInfo->Name, "Dolphin GCPad Plugin (DebugFast)");
#else
#ifdef _DEBUG
sprintf(_PluginInfo->Name, "Dolphin GCPad Plugin (Debug)");
#else
sprintf(_PluginInfo->Name, "Dolphin GCPad Plugin");
#endif
#endif
}
void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
{
globals = _pPluginGlobals;
LogManager::SetInstance((LogManager *)globals->logManager);
}
// Call config dialog
// ------------------
void DllConfig(HWND _hParent)
{
if (!g_SearchDeviceDone)
{
g_Config.Load(); // load settings
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
// Populate joyinfo for all attached devices
Search_Devices(joyinfo, NumPads, NumGoodPads);
g_SearchDeviceDone = true;
}
#if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame)
{
m_ConfigFrame = new GCPadConfigDialog(GetParentedWxWindow(_hParent));
m_ConfigFrame->ShowModal();
delete m_ConfigFrame;
m_ConfigFrame = 0;
}
#endif
}
void DllDebugger(HWND _hParent, bool Show)
{
}
// Init PAD (start emulation)
// --------------------------
void Initialize(void *init)
{
INFO_LOG(PAD, "Initialize: %i", SDL_WasInit(0));
g_PADInitialize = (SPADInitialize*)init;
#ifdef _WIN32
m_hWnd = (HWND)g_PADInitialize->hWnd;
#endif
if (!g_SearchDeviceDone)
{
g_Config.Load(); // load settings
// Populate joyinfo for all attached devices
Search_Devices(joyinfo, NumPads, NumGoodPads);
g_SearchDeviceDone = true;
}
}
// Shutdown PAD (stop emulation)
// -----------------------------
void Shutdown()
{
INFO_LOG(PAD, "Shutdown: %i", SDL_WasInit(0));
Close_Devices();
// Finally close SDL
if (SDL_WasInit(0))
SDL_Quit();
// Remove the pointer to the initialize data
g_PADInitialize = NULL;
g_SearchDeviceDone = false;
}
// Save state
// --------------
void DoState(unsigned char **ptr, int mode)
{
#ifdef RERECORDING
Recording::DoState(ptr, mode);
#endif
}
void EmuStateChange(PLUGIN_EMUSTATE newState)
{
}
// Set buttons status from keyboard input. Currently this is done from wxWidgets in the main application.
// --------------
void PAD_Input(u16 _Key, u8 _UpDown)
{
}
// Set PAD status
// --------------
// Called from: SI_DeviceGCController.cpp
// Function: Gives the current pad status to the Core
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
{
// Check if all is okay
if (_pPADStatus == NULL) return;
// Clear pad
memset(_pPADStatus, 0, sizeof(SPADStatus));
const int base = 0x80;
_pPADStatus->stickX = base;
_pPADStatus->stickY = base;
_pPADStatus->substickX = base;
_pPADStatus->substickY = base;
_pPADStatus->button |= PAD_USE_ORIGIN;
_pPADStatus->err = PAD_ERR_NONE;
// Check that Dolphin is in focus, otherwise don't update the pad status
if (!IsFocus()) return;
g_ID = _numPAD;
if (NumGoodPads && NumPads > GCMapping[_numPAD].ID)
UpdatePadState(GCMapping[_numPAD]);
if (IsKey(EGC_A))
{
_pPADStatus->button |= PAD_BUTTON_A;
_pPADStatus->analogA = DEF_BUTTON_FULL;
}
if (IsKey(EGC_B))
{
_pPADStatus->button |= PAD_BUTTON_B;
_pPADStatus->analogB = DEF_BUTTON_FULL;
}
if (IsKey(EGC_X)) _pPADStatus->button |= PAD_BUTTON_X;
if (IsKey(EGC_Y)) _pPADStatus->button |= PAD_BUTTON_Y;
if (IsKey(EGC_Z)) _pPADStatus->button |= PAD_TRIGGER_Z;
if (IsKey(EGC_START)) _pPADStatus->button |= PAD_BUTTON_START;
if (IsKey(EGC_DPAD_UP)) _pPADStatus->button |= PAD_BUTTON_UP;
if (IsKey(EGC_DPAD_DOWN)) _pPADStatus->button |= PAD_BUTTON_DOWN;
if (IsKey(EGC_DPAD_LEFT)) _pPADStatus->button |= PAD_BUTTON_LEFT;
if (IsKey(EGC_DPAD_RIGHT)) _pPADStatus->button |= PAD_BUTTON_RIGHT;
if (GCMapping[_numPAD].Stick.Main == FROM_KEYBOARD)
{
bool bUp = false;
bool bDown = false;
bool bLeft = false;
bool bRight = false;
if (IsKey(EGC_STICK_UP)) bUp = true;
else if (IsKey(EGC_STICK_DOWN)) bDown = true;
if (IsKey(EGC_STICK_LEFT)) bLeft = true;
else if (IsKey(EGC_STICK_RIGHT)) bRight = true;
EmulateAnalogStick(_pPADStatus->stickX, _pPADStatus->stickY, bUp, bDown, bLeft, bRight, DEF_STICK_FULL);
}
else if (GCMapping[_numPAD].Stick.Main == FROM_ANALOG1)
{
_pPADStatus->stickX = GCMapping[_numPAD].AxisState.Lx;
// Y-axis is inverted
_pPADStatus->stickY = 0xFF - (u8)GCMapping[_numPAD].AxisState.Ly;
}
else if (GCMapping[_numPAD].Stick.Main == FROM_ANALOG2)
{
_pPADStatus->stickX = GCMapping[_numPAD].AxisState.Rx;
// Y-axis is inverted
_pPADStatus->stickY = 0xFF - (u8)GCMapping[_numPAD].AxisState.Ry;
}
else
{
_pPADStatus->stickX = GCMapping[_numPAD].AxisState.Tl;
_pPADStatus->stickY = GCMapping[_numPAD].AxisState.Tr;
}
if (GCMapping[_numPAD].Stick.Sub == FROM_KEYBOARD)
{
bool bUp = false;
bool bDown = false;
bool bLeft = false;
bool bRight = false;
if (IsKey(EGC_CSTICK_UP)) bUp = true;
else if (IsKey(EGC_CSTICK_DOWN)) bDown = true;
if (IsKey(EGC_CSTICK_LEFT)) bLeft = true;
else if (IsKey(EGC_CSTICK_RIGHT)) bRight = true;
EmulateAnalogStick(_pPADStatus->substickX, _pPADStatus->substickY, bUp, bDown, bLeft, bRight, DEF_STICK_FULL);
}
else if (GCMapping[_numPAD].Stick.Sub == FROM_ANALOG1)
{
_pPADStatus->substickX = GCMapping[_numPAD].AxisState.Lx;
// Y-axis is inverted
_pPADStatus->substickY = 0xFF - (u8)GCMapping[_numPAD].AxisState.Ly;
}
else if (GCMapping[_numPAD].Stick.Sub == FROM_ANALOG2)
{
_pPADStatus->substickX = GCMapping[_numPAD].AxisState.Rx;
// Y-axis is inverted
_pPADStatus->substickY = 0xFF - (u8)GCMapping[_numPAD].AxisState.Ry;
}
else
{
_pPADStatus->substickX = GCMapping[_numPAD].AxisState.Tl;
_pPADStatus->substickY = GCMapping[_numPAD].AxisState.Tr;
}
if (GCMapping[_numPAD].Stick.Shoulder == FROM_KEYBOARD)
{
if (IsKey(EGC_TGR_L))
{
_pPADStatus->button |= PAD_TRIGGER_L;
_pPADStatus->triggerLeft = DEF_TRIGGER_FULL;
}
else if (IsKey(EGC_TGR_SEMI_L))
{
_pPADStatus->triggerLeft = DEF_TRIGGER_FULL / 2;
}
if (IsKey(EGC_TGR_R))
{
_pPADStatus->button |= PAD_TRIGGER_R;
_pPADStatus->triggerRight = DEF_TRIGGER_FULL;
}
else if (IsKey(EGC_TGR_SEMI_R))
{
_pPADStatus->triggerRight = DEF_TRIGGER_FULL / 2;
}
}
else if (GCMapping[_numPAD].Stick.Shoulder == FROM_ANALOG1)
{
_pPADStatus->triggerLeft = GCMapping[_numPAD].AxisState.Lx;
_pPADStatus->triggerRight = GCMapping[_numPAD].AxisState.Ly;
if (_pPADStatus->triggerLeft > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_L;
if (_pPADStatus->triggerRight > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_R;
}
else if (GCMapping[_numPAD].Stick.Shoulder == FROM_ANALOG2)
{
_pPADStatus->triggerLeft = GCMapping[_numPAD].AxisState.Rx;
_pPADStatus->triggerRight = GCMapping[_numPAD].AxisState.Ry;
if (_pPADStatus->triggerLeft > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_L;
if (_pPADStatus->triggerRight > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_R;
}
else
{
_pPADStatus->triggerLeft = GCMapping[_numPAD].AxisState.Tl;
_pPADStatus->triggerRight = GCMapping[_numPAD].AxisState.Tr;
if (_pPADStatus->triggerLeft > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_L;
if (_pPADStatus->triggerRight > DEF_TRIGGER_THRESHOLD)
_pPADStatus->button |= PAD_TRIGGER_R;
}
}
//******************************************************************************
// Supporting functions
//******************************************************************************
// for same displacement should be sqrt(2)/2 (in theory)
// 3/4 = 0.75 is a little faster than sqrt(2)/2 = 0.7071...
// In SMS, 17/20 = 0.85 is perfect; in WW, 7/10 = 0.70 is closer.
#define DIAGONAL_SCALE 0.70710678
void EmulateAnalogStick(unsigned char &stickX, unsigned char &stickY, bool buttonUp, bool buttonDown, bool buttonLeft, bool buttonRight, int magnitude)
{
int mainX = 0;
int mainY = 0;
if (buttonUp)
mainY = magnitude;
else if (buttonDown)
mainY = -magnitude;
if (buttonLeft)
mainX = -magnitude;
else if (buttonRight)
mainX = magnitude;
if ((mainX == 0) || (mainY == 0))
{
stickX = mainX;
stickY = mainY;
}
else
{
stickX = mainX * DIAGONAL_SCALE;
stickY = mainY * DIAGONAL_SCALE;
}
}
void Close_Devices()
{
PAD_RumbleClose();
if (SDL_WasInit(0))
{
for (int i = 0; i < NumPads; i++)
{
if (joyinfo.at(i).joy)
{
if(SDL_JoystickOpened(i))
{
INFO_LOG(WIIMOTE, "Shut down Joypad: %i", i);
SDL_JoystickClose(joyinfo.at(i).joy);
}
}
}
}
for (int i = 0; i < 4; i++)
GCMapping[i].joy = NULL;
// Clear the physical device info
joyinfo.clear();
NumPads = 0;
NumGoodPads = 0;
}
// Search for SDL devices
// ----------------
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
{
// Close opened devices first
Close_Devices();
bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
if (_NumGoodPads == 0)
return false;
for (int i = 0; i < 4; i++)
{
if (_NumPads > GCMapping[i].ID)
if(joyinfo.at(GCMapping[i].ID).Good)
GCMapping[i].joy = joyinfo.at(GCMapping[i].ID).joy;
}
return Success;
}
void GetAxisState(CONTROLLER_MAPPING_GC &_GCMapping)
{
// Update the gamepad status
SDL_JoystickUpdate();
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
_GCMapping.AxisState.Lx = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Lx);
_GCMapping.AxisState.Ly = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Ly);
_GCMapping.AxisState.Rx = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Rx);
_GCMapping.AxisState.Ry = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Ry);
// Update the analog trigger axis values
#ifdef _WIN32
if (_GCMapping.TriggerType == InputCommon::CTL_TRIGGER_SDL)
{
#endif
// If we are using SDL analog triggers the buttons have to be mapped as 1000 or up, otherwise they are not used
// We must also check that we are not asking for a negative axis number because SDL_JoystickGetAxis() has
// no good way of handling that
if ((_GCMapping.AxisMapping.Tl - 1000) >= 0)
_GCMapping.AxisState.Tl = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Tl - 1000);
if ((_GCMapping.AxisMapping.Tr - 1000) >= 0)
_GCMapping.AxisState.Tr = SDL_JoystickGetAxis(_GCMapping.joy, _GCMapping.AxisMapping.Tr - 1000);
#ifdef _WIN32
}
else
{
_GCMapping.AxisState.Tl = XInput::GetXI(_GCMapping.ID, _GCMapping.AxisMapping.Tl - 1000);
_GCMapping.AxisState.Tr = XInput::GetXI(_GCMapping.ID, _GCMapping.AxisMapping.Tr - 1000);
}
#endif
}
void UpdatePadState(CONTROLLER_MAPPING_GC &_GCiMapping)
{
// Return if we have no pads
if (NumGoodPads == 0) return;
GetAxisState(_GCiMapping);
int &Lx = _GCiMapping.AxisState.Lx;
int &Ly = _GCiMapping.AxisState.Ly;
int &Rx = _GCiMapping.AxisState.Rx;
int &Ry = _GCiMapping.AxisState.Ry;
int &Tl = _GCiMapping.AxisState.Tl;
int &Tr = _GCiMapping.AxisState.Tr;
// Check the circle to square option
if(_GCiMapping.bSquare2Circle)
{
InputCommon::Square2Circle(Lx, Ly, _GCiMapping.Diagonal, false);
InputCommon::Square2Circle(Rx, Ry, _GCiMapping.Diagonal, false);
}
// Dead zone adjustment
float DeadZoneLeft = (float)_GCiMapping.DeadZoneL / 100.0f;
float DeadZoneRight = (float)_GCiMapping.DeadZoneR / 100.0f;
if (InputCommon::IsDeadZone(DeadZoneLeft, Lx, Ly))
{
Lx = 0;
Ly = 0;
}
if (InputCommon::IsDeadZone(DeadZoneRight, Rx, Ry))
{
Rx = 0;
Ry = 0;
}
// Downsize the values from 0x8000 to 0x80
Lx = InputCommon::Pad_Convert(Lx);
Ly = InputCommon::Pad_Convert(Ly);
Rx = InputCommon::Pad_Convert(Rx);
Ry = InputCommon::Pad_Convert(Ry);
// The XInput range is already 0 to 0x80
if (_GCiMapping.TriggerType == InputCommon::CTL_TRIGGER_SDL)
{
Tl = InputCommon::Pad_Convert(Tl);
Tr = InputCommon::Pad_Convert(Tr);
}
}
// Multi System Input Status Check
bool IsKey(int Key)
{
int Ret = NULL;
int MapKey = GCMapping[g_ID].Button[Key];
if (MapKey < 256)
{
#ifdef _WIN32
Ret = GetAsyncKeyState(MapKey); // Keyboard (Windows)
#else
Ret = KeyStatus[MapKey]; // Keyboard (Linux)
#endif
}
else if (MapKey < 0x1100)
{
Ret = SDL_JoystickGetButton(GCMapping[g_ID].joy, MapKey - 0x1000); // Pad button
}
else // Pad hat
{
u8 HatCode, HatKey;
HatCode = SDL_JoystickGetHat(GCMapping[g_ID].joy, (MapKey - 0x1100) / 0x0010);
HatKey = (MapKey - 0x1100) % 0x0010;
if (HatCode & HatKey)
Ret = HatKey;
}
return (Ret) ? true : false;
}
void ReadLinuxKeyboard()
{
#if defined(HAVE_X11) && HAVE_X11
XEvent E;
KeySym key;
// keyboard input
int num_events;
for (num_events = XPending(WMdisplay); num_events > 0; num_events--)
{
XNextEvent(WMdisplay, &E);
switch (E.type)
{
case KeyPress:
{
key = XLookupKeysym((XKeyEvent*)&E, 0);
if ((key >= XK_F1 && key <= XK_F9) ||
key == XK_Shift_L || key == XK_Shift_R ||
key == XK_Control_L || key == XK_Control_R)
{
XPutBackEvent(WMdisplay, &E);
break;
}
for (int i = 0; i < LAST_CONSTANT; i++)
{
if (key == GCMapping[g_ID].Button[i])
KeyStatus[i] = true;
}
break;
}
case KeyRelease:
{
key = XLookupKeysym((XKeyEvent*)&E, 0);
if ((key >= XK_F1 && key <= XK_F9) ||
key == XK_Shift_L || key == XK_Shift_R ||
key == XK_Control_L || key == XK_Control_R) {
XPutBackEvent(WMdisplay, &E);
break;
}
for (int i = 0; i < LAST_CONSTANT; i++)
{
if (key == GCMapping[g_ID].Button[i])
KeyStatus[i] = false;
}
break;
}
default:
break;
}
}
#endif
}
// Check if Dolphin is in focus
// ----------------
bool IsFocus()
{
#ifdef _WIN32
HWND RenderingWindow = (g_PADInitialize) ? g_PADInitialize->hWnd : NULL;
HWND Parent = GetParent(RenderingWindow);
HWND TopLevel = GetParent(Parent);
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow)
return true;
else
return false;
#else
return true;
#endif
}

View File

@ -0,0 +1,155 @@
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _PLUGIN_GCPAD_H
#define _PLUGIN_GCPAD_H
#include <vector> // System
#include <cstdio>
#include "../../Core/InputCommon/Src/SDL.h" // Core
#include "../../Core/InputCommon/Src/XInput.h"
#include "pluginspecs_pad.h"
// SDL Haptic fails on windows, it just doesn't work (even the sample doesn't work)
// So until i can make it work, this is all disabled >:(
#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32)
#define SDL_RUMBLE
#else
#ifdef _WIN32
#define RUMBLE_HACK
#define DIRECTINPUT_VERSION 0x0800
#define WIN32_LEAN_AND_MEAN
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "winmm.lib")
#include <dinput.h>
#endif
#endif
#define DEF_BUTTON_FULL 255
#define DEF_STICK_FULL 100
#define DEF_TRIGGER_FULL 255
#define DEF_TRIGGER_THRESHOLD 230
// GC Pad Buttons
enum EGCPad
{
EGC_A = 0,
EGC_B,
EGC_X,
EGC_Y,
EGC_Z,
EGC_START,
EGC_DPAD_UP,
EGC_DPAD_DOWN,
EGC_DPAD_LEFT,
EGC_DPAD_RIGHT,
EGC_STICK_UP,
EGC_STICK_DOWN,
EGC_STICK_LEFT,
EGC_STICK_RIGHT,
EGC_CSTICK_UP,
EGC_CSTICK_DOWN,
EGC_CSTICK_LEFT,
EGC_CSTICK_RIGHT,
EGC_TGR_L,
EGC_TGR_R,
EGC_TGR_SEMI_L,
EGC_TGR_SEMI_R,
LAST_CONSTANT,
};
enum EInputType
{
FROM_KEYBOARD,
FROM_ANALOG1,
FROM_ANALOG2,
FROM_TRIGGER,
};
union UAxis
{
int Code[6];
struct
{
int Lx;
int Ly;
int Rx;
int Ry;
int Tl; // Trigger
int Tr; // Trigger
};
};
struct SStickMapping
{
int Main;
int Sub;
int Shoulder; //Trigger
};
struct CONTROLLER_MAPPING_GC // PAD MAPPING GC
{
int ID; // SDL joystick device ID
SDL_Joystick *joy; // SDL joystick device
UAxis AxisState;
UAxis AxisMapping; // 6 Axes (Main, Sub, Triggers)
int TriggerType; // SDL or XInput trigger
bool Rumble;
int RumbleStrength;
int DeadZoneL; // Analog 1 Deadzone
int DeadZoneR; // Analog 2 Deadzone
bool bSquare2Circle;
int Diagonal;
SStickMapping Stick;
int Button[LAST_CONSTANT];
};
extern CONTROLLER_MAPPING_GC GCMapping[4];
extern int NumPads, NumGoodPads, g_ID;
extern SPADInitialize *g_PADInitialize;
extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
#ifdef _WIN32
extern HWND m_hWnd; // Handle to window
#endif
// Custom Functions
// ----------------
void EmulateAnalogStick(unsigned char &stickX, unsigned char &stickY, bool buttonUp, bool buttonDown, bool buttonLeft, bool buttonRight, int magnitude);
void Close_Devices();
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
void GetAxisState(CONTROLLER_MAPPING_GC &_GCMapping);
void UpdatePadState(CONTROLLER_MAPPING_GC &_GCMapping);
bool IsKey(int Key);
void ReadLinuxKeyboard();
bool IsFocus();
bool ReloadDLL();
void PAD_RumbleClose();
#endif // _PLUGIN_GCPAD_H

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="Plugin_nJoy_SDL"
ProjectGUID="{521498BE-6089-4780-8223-E67C22F4E068}"
Version="9.00"
Name="Plugin_GCPad"
ProjectGUID="{9FF603F8-B3BB-4144-9688-B2B802FA0F16}"
RootNamespace="Plugin_nJoy_SDL"
Keyword="Win32Proj"
TargetFrameworkVersion="131072"
@ -100,6 +100,168 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\PluginSpecs;..\..\..\Externals\SDL\include;..\..\Core\Common\Src;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PLUGIN_NJOY_SDL_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
WarnAsError="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(PlatformName)\$(ConfigurationName)\$(TargetName).lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="DebugFast|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\PluginSpecs;..\..\..\Externals\SDL\include;..\..\Core\Common\Src;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;DEBUGFAST;_WINDOWS;_USRDLL;PLUGIN_NJOY_SDL_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
WarnAsError="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(PlatformName)\$(ConfigurationName)\$(TargetName).lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -181,87 +343,6 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\PluginSpecs;..\..\..\Externals\SDL\include;..\..\Core\Common\Src;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PLUGIN_NJOY_SDL_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
WarnAsError="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(PlatformName)\$(ConfigurationName)\$(TargetName).lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -343,87 +424,6 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="DebugFast|Win32"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\PluginSpecs;..\..\..\Externals\SDL\include;..\..\Core\Common\Src;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;DEBUGFAST;_WINDOWS;_USRDLL;PLUGIN_NJOY_SDL_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
WarnAsError="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(PlatformName)\$(ConfigurationName)\$(TargetName).lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="DebugFast|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -510,69 +510,47 @@
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
Name="Config"
>
<File
RelativePath=".\Src\Config.cpp"
RelativePath=".\Config.cpp"
>
</File>
<File
RelativePath=".\Src\Config.h"
RelativePath=".\Config.h"
>
</File>
<File
RelativePath=".\Src\nJoy.cpp"
RelativePath=".\ConfigBox.cpp"
>
</File>
<File
RelativePath=".\Src\nJoy.h"
RelativePath=".\ConfigBox.h"
>
</File>
<File
RelativePath=".\Src\ReRecording.cpp"
>
</File>
<File
RelativePath=".\Src\Rumble.cpp"
>
</File>
</Filter>
<Filter
Name="GUI"
>
<File
RelativePath=".\Src\GUI\AboutBox.cpp"
>
</File>
<File
RelativePath=".\Src\GUI\AboutBox.h"
>
</File>
<File
RelativePath=".\Src\GUI\ConfigAdvanced.cpp"
>
</File>
<File
RelativePath=".\Src\GUI\ConfigBox.cpp"
>
</File>
<File
RelativePath=".\Src\GUI\ConfigBox.h"
>
</File>
<File
RelativePath=".\Src\GUI\ConfigJoypad.cpp"
RelativePath=".\ConfigJoypad.cpp"
>
</File>
</Filter>
<File
RelativePath=".\readme.txt"
RelativePath=".\GCPad.cpp"
>
</File>
<File
RelativePath=".\Src\SConscript"
RelativePath=".\GCPad.h"
>
</File>
<File
RelativePath="..\..\PluginSpecs\pluginspecs_pad.h"
>
</File>
<File
RelativePath=".\ReRecording.cpp"
>
</File>
<File
RelativePath=".\Rumble.cpp"
>
</File>
</Files>

View File

@ -1,196 +1,170 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// File description
/* ---------
Rerecording options
////////////////////////*/
// Include
// ---------
#include "nJoy.h"
#include "FileUtil.h"
#include "ChunkFile.h"
// TODO :
// This is pretty much useless now with the TAS features right ?
#ifdef RERECORDING
namespace Recording
{
// Definitions
// -------------
// Pre defined maxium storage limit
#define RECORD_SIZE (1024 * 128)
SPADStatus RecordBuffer[RECORD_SIZE];
int count = 0;
// Recording functions
// -------------
void RecordInput(const SPADStatus& _rPADStatus)
{
if (count >= RECORD_SIZE) return;
RecordBuffer[count++] = _rPADStatus;
// Logging
//u8 TmpData[sizeof(SPADStatus)];
//memcpy(TmpData, &RecordBuffer[count - 1], sizeof(SPADStatus));
//Console::Print("RecordInput(%i): %s\n", count, ArrayToString(TmpData, sizeof(SPADStatus), 0, 30).c_str());
// Auto save every ten seconds
if (count % (60 * 10) == 0) Save();
}
const SPADStatus& Play()
{
// Logging
//Console::Print("PlayRecord(%i)\n", count);
if (count >= RECORD_SIZE)
{
// Todo: Make the recording size unlimited?
//PanicAlert("The recording reached its end");
return(RecordBuffer[0]);
}
return(RecordBuffer[count++]);
}
void Load()
{
FILE* pStream = fopen("pad-record.bin", "rb");
if (pStream != NULL)
{
fread(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
fclose(pStream);
}
else
{
PanicAlert("SimplePad: Could not open pad-record.bin");
}
//Console::Print("LoadRecord()");
}
void Save()
{
// Open the file in a way that clears all old data
FILE* pStream = fopen("pad-record.bin", "wb");
if (pStream != NULL)
{
fwrite(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
fclose(pStream);
}
else
{
PanicAlert("NJoy: Could not save pad-record.bin");
}
//PanicAlert("SaveRecord()");
//Console::Print("SaveRecord()");
}
void Initialize()
{
// -------------------------------------------
// Rerecording
// ----------------------
#ifdef RERECORDING
/* Check if we are starting the pad to record the input, and an old file exists. In that case ask
if we really want to start the recording and eventually overwrite the file */
if (g_Config.bRecording && File::Exists("pad-record.bin"))
{
if (!AskYesNo("An old version of '%s' aleady exists in your Dolphin directory. You can"
" now make a copy of it before you start a new recording and overwrite the file."
" Select Yes to continue and overwrite the file. Select No to turn off the input"
" recording and continue without recording anything.",
"pad-record.bin"))
{
// Turn off recording and continue
g_Config.bRecording = false;
}
}
// Load recorded input if we are to play it back, otherwise begin with a blank recording
if (g_Config.bPlayback) Recording::Load();
#endif
// ----------------------
}
void ShutDown()
{
// Save recording
if (g_Config.bRecording) Recording::Save();
// Reset the counter
count = 0;
}
void DoState(unsigned char **ptr, int mode)
{
// Load or save the counter
PointerWrap p(ptr, mode);
p.Do(count);
//Console::Print("count: %i\n", count);
// Update the frame counter for the sake of the status bar
if (mode == PointerWrap::MODE_READ)
{
#ifdef _WIN32
// This only works when rendering to the main window, I think
PostMessage(GetParent(g_PADInitialize->hWnd), WM_USER, INPUT_FRAME_COUNTER, count);
#endif
}
}
} // Recording
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "GCpad.h"
#include "FileUtil.h"
#include "ChunkFile.h"
// TODO :
// This is pretty much useless now with the TAS features right ?
#ifdef RERECORDING
namespace Recording
{
// Definitions
// -------------
// Pre defined maxium storage limit
#define RECORD_SIZE (1024 * 128)
SPADStatus RecordBuffer[RECORD_SIZE];
int count = 0;
// Recording functions
// -------------
void RecordInput(const SPADStatus& _rPADStatus)
{
if (count >= RECORD_SIZE) return;
RecordBuffer[count++] = _rPADStatus;
// Logging
//u8 TmpData[sizeof(SPADStatus)];
//memcpy(TmpData, &RecordBuffer[count - 1], sizeof(SPADStatus));
//Console::Print("RecordInput(%i): %s\n", count, ArrayToString(TmpData, sizeof(SPADStatus), 0, 30).c_str());
// Auto save every ten seconds
if (count % (60 * 10) == 0) Save();
}
const SPADStatus& Play()
{
// Logging
//Console::Print("PlayRecord(%i)\n", count);
if (count >= RECORD_SIZE)
{
// Todo: Make the recording size unlimited?
//PanicAlert("The recording reached its end");
return(RecordBuffer[0]);
}
return(RecordBuffer[count++]);
}
void Load()
{
FILE* pStream = fopen("pad-record.bin", "rb");
if (pStream != NULL)
{
fread(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
fclose(pStream);
}
else
{
PanicAlert("SimplePad: Could not open pad-record.bin");
}
//Console::Print("LoadRecord()");
}
void Save()
{
// Open the file in a way that clears all old data
FILE* pStream = fopen("pad-record.bin", "wb");
if (pStream != NULL)
{
fwrite(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
fclose(pStream);
}
else
{
PanicAlert("NJoy: Could not save pad-record.bin");
}
//PanicAlert("SaveRecord()");
//Console::Print("SaveRecord()");
}
void Initialize()
{
// -------------------------------------------
// Rerecording
// ----------------------
#ifdef RERECORDING
/* Check if we are starting the pad to record the input, and an old file exists. In that case ask
if we really want to start the recording and eventually overwrite the file */
if (g_Config.bRecording && File::Exists("pad-record.bin"))
{
if (!AskYesNo("An old version of '%s' aleady exists in your Dolphin directory. You can"
" now make a copy of it before you start a new recording and overwrite the file."
" Select Yes to continue and overwrite the file. Select No to turn off the input"
" recording and continue without recording anything.",
"pad-record.bin"))
{
// Turn off recording and continue
g_Config.bRecording = false;
}
}
// Load recorded input if we are to play it back, otherwise begin with a blank recording
if (g_Config.bPlayback) Recording::Load();
#endif
// ----------------------
}
void ShutDown()
{
// Save recording
if (g_Config.bRecording) Recording::Save();
// Reset the counter
count = 0;
}
void DoState(unsigned char **ptr, int mode)
{
// Load or save the counter
PointerWrap p(ptr, mode);
p.Do(count);
//Console::Print("count: %i\n", count);
// Update the frame counter for the sake of the status bar
if (mode == PointerWrap::MODE_READ)
{
#ifdef _WIN32
// This only works when rendering to the main window, I think
PostMessage(GetParent(g_PADInitialize->hWnd), WM_USER, INPUT_FRAME_COUNTER, count);
#endif
}
}
} // Recording
#endif // RERECORDING

View File

@ -1,380 +1,360 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "nJoy.h"
#ifdef RUMBLE_HACK
struct RUMBLE // GC Pad rumble DIDevice
{
LPDIRECTINPUTDEVICE8 g_pDevice; // 4 pads objects
LPDIRECTINPUTEFFECT g_pEffect;
DWORD g_dwNumForceFeedbackAxis;
DIEFFECT eff;
};
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext);
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext);
void SetDeviceForcesXY(int pad, int nXYForce);
HRESULT InitRumble(HWND hWnd);
LPDIRECTINPUT8 g_Rumble; // DInput Rumble object
RUMBLE pRumble[4]; // 4 GC Rumble Pads
//////////////////////
// Use PAD rumble
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void Pad_Use_Rumble(u8 _numPAD)
{
if (PadMapping[_numPAD].rumble)
{
if (!g_Rumble)
{
// GetForegroundWindow() always sends the good HWND
if (FAILED(InitRumble(GetForegroundWindow())))
PanicAlert("Could not initialize Rumble!");
} else
{
// Acquire gamepad
if (pRumble[_numPAD].g_pDevice != NULL)
pRumble[_numPAD].g_pDevice->Acquire();
}
}
}
////////////////////////////////////////////////////
// Set PAD rumble. Explanation: Stop = 0, Rumble = 1
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
{
if (!PadMapping[_numPAD].enable)
return;
Pad_Use_Rumble(_numPAD);
int Strenght = 0;
if (PadMapping[_numPAD].rumble) // rumble activated
{
if (_uType == 1 && _uStrength > 2)
{
// it looks like _uStrength is equal to 3 everytime anyway...
Strenght = 1000 * (g_Config.RumbleStrength + 1);
Strenght = Strenght > 10000 ? 10000 : Strenght;
}
else
Strenght = 0;
SetDeviceForcesXY(_numPAD, Strenght);
}
}
// Rumble stuff :D!
// ----------------
//
HRESULT InitRumble(HWND hWnd)
{
DIPROPDWORD dipdw;
HRESULT hr;
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_Rumble, NULL)))
return hr;
// Look for a device we can use
if (FAILED(hr = g_Rumble->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumFFDevicesCallback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK)))
return hr;
for (int i=0; i<4; i++)
{
if (NULL == pRumble[i].g_pDevice)
PadMapping[i].rumble = false; // Disable Rumble for this pad only.
else
{
pRumble[i].g_pDevice->SetDataFormat(&c_dfDIJoystick);
pRumble[i].g_pDevice->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_BACKGROUND);
// Request exclusive acces for both background and foreground.
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = FALSE;
// if Force Feedback doesn't seem to work...
if (FAILED(pRumble[i].g_pDevice->EnumObjects(EnumAxesCallback,
(void*)&pRumble[i].g_dwNumForceFeedbackAxis, DIDFT_AXIS))
|| FAILED(pRumble[i].g_pDevice->SetProperty(DIPROP_AUTOCENTER, &dipdw.diph)))
{
PanicAlert("Device %d doesn't seem to work ! \nRumble for device %d is now Disabled !", i+1);
PadMapping[i].rumble = false; // Disable Rumble for this pad
continue; // Next pad
}
if (pRumble[i].g_dwNumForceFeedbackAxis > 2)
pRumble[i].g_dwNumForceFeedbackAxis = 2;
DWORD _rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
long rglDirection[2] = {0, 0};
DICONSTANTFORCE cf = {0};
ZeroMemory(&pRumble[i].eff, sizeof(pRumble[i].eff));
pRumble[i].eff.dwSize = sizeof(DIEFFECT);
pRumble[i].eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
pRumble[i].eff.dwDuration = INFINITE; // fixed time may be safer (X * DI_SECONDS)
pRumble[i].eff.dwSamplePeriod = 0;
pRumble[i].eff.dwGain = DI_FFNOMINALMAX;
pRumble[i].eff.dwTriggerButton = DIEB_NOTRIGGER;
pRumble[i].eff.dwTriggerRepeatInterval = 0;
pRumble[i].eff.cAxes = pRumble[i].g_dwNumForceFeedbackAxis;
pRumble[i].eff.rgdwAxes = _rgdwAxes;
pRumble[i].eff.rglDirection = rglDirection;
pRumble[i].eff.lpEnvelope = 0;
pRumble[i].eff.cbTypeSpecificParams = sizeof( DICONSTANTFORCE );
pRumble[i].eff.lpvTypeSpecificParams = &cf;
pRumble[i].eff.dwStartDelay = 0;
// Create the prepared effect
if (FAILED(hr = pRumble[i].g_pDevice->CreateEffect(GUID_ConstantForce, &pRumble[i].eff, &pRumble[i].g_pEffect, NULL)))
continue;
if (pRumble[i].g_pEffect == NULL)
continue;
}
}
return S_OK;
}
void SetDeviceForcesXY(int npad, int nXYForce)
{
// Security check
if (pRumble[npad].g_pDevice == NULL)
return;
// If nXYForce is null, there's no point to create the effect
// Just stop the force feedback
if (nXYForce == 0) {
pRumble[npad].g_pEffect->Stop();
return;
}
long rglDirection[2] = {0};
DICONSTANTFORCE cf;
// If only one force feedback axis, then apply only one direction and keep the direction at zero
if (pRumble[npad].g_dwNumForceFeedbackAxis == 1)
{
rglDirection[0] = 0;
cf.lMagnitude = nXYForce; // max should be 10000
}
// If two force feedback axis, then apply magnitude from both directions
else
{
rglDirection[0] = nXYForce;
rglDirection[1] = nXYForce;
cf.lMagnitude = 1.4142f*nXYForce;
}
ZeroMemory(&pRumble[npad].eff, sizeof(pRumble[npad].eff));
pRumble[npad].eff.dwSize = sizeof(DIEFFECT);
pRumble[npad].eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
pRumble[npad].eff.cAxes = pRumble[npad].g_dwNumForceFeedbackAxis;
pRumble[npad].eff.rglDirection = rglDirection;
pRumble[npad].eff.lpEnvelope = 0;
pRumble[npad].eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
pRumble[npad].eff.lpvTypeSpecificParams = &cf;
pRumble[npad].eff.dwStartDelay = 0;
// Now set the new parameters..
pRumble[npad].g_pEffect->SetParameters(&pRumble[npad].eff, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START);
// ..And start the effect immediately.
if (pRumble[npad].g_pEffect != NULL)
pRumble[npad].g_pEffect->Start(1, 0);
}
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext)
{
LPDIRECTINPUTDEVICE8 pDevice;
DIPROPDWORD dipdw;
HRESULT hr;
int JoystickID;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
g_Rumble->CreateDevice(pInst->guidInstance, &pDevice, NULL); // Create a DInput pad device
if (SUCCEEDED(hr = pDevice->GetProperty(DIPROP_JOYSTICKID, &dipdw.diph))) // Get DInput Device ID
JoystickID = dipdw.dwData;
else
return DIENUM_CONTINUE;
//PanicAlert("DInput ID : %d \nSDL ID (1-4) : %d / %d / %d / %d\n", JoystickID, PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID);
for (int i=0; i<4; i++)
{
if (PadMapping[i].ID == JoystickID) // if SDL ID = DInput ID -> we're dealing with the same device
{
// a DInput device is created even if rumble is disabled on startup
// this way, you can toggle the rumble setting while in game
//if (PadMapping[i].enabled) // && PadMapping[i].rumble
pRumble[i].g_pDevice = pDevice; // everything looks good, save the DInput device
}
}
return DIENUM_CONTINUE;
}
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext)
{
DWORD* pdwNumForceFeedbackAxis = (DWORD*)pContext; // Enum Rumble Axis
if ((pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0)
(*pdwNumForceFeedbackAxis)++;
return DIENUM_CONTINUE;
}
void PAD_RumbleClose()
{
// It may look weird, but we don't free anything here, it was the cause of crashes
// on stop, and the DLL isn't unloaded anyway, so the pointers stay
// We just stop the rumble in case it's still playing an effect.
for (int i=0; i<4; i++)
{
if (pRumble[i].g_pDevice && pRumble[i].g_pEffect)
pRumble[i].g_pEffect->Stop();
}
}
#else // Multiplatform SDL Rumble code
#ifdef SDL_RUMBLE
struct RUMBLE // GC Pad rumble DIDevice
{
SDL_Haptic* g_pDevice;
SDL_HapticEffect g_pEffect;
int effect_id;
};
RUMBLE pRumble[4] = {0}; // 4 GC Rumble Pads
#endif
// Use PAD rumble
// --------------
bool PAD_Init_Rumble(u8 _numPAD, SDL_Joystick *SDL_Device)
{
#ifdef SDL_RUMBLE
if (SDL_Device == NULL)
return false;
pRumble[_numPAD].g_pDevice = SDL_HapticOpenFromJoystick(SDL_Device);
if (pRumble[_numPAD].g_pDevice == NULL)
return false; // Most likely joystick isn't haptic
if (!(SDL_HapticQuery(pRumble[_numPAD].g_pDevice) & SDL_HAPTIC_CONSTANT))
{
SDL_HapticClose(pRumble[_numPAD].g_pDevice); // No effect
pRumble[_numPAD].g_pDevice = 0;
PadMapping[_numPAD].rumble = false;
return false;
}
// Set the strength of the rumble effect
int Strenght = 3276 * (g_Config.RumbleStrength + 1);
Strenght = Strenght > 32767 ? 32767 : Strenght;
// Create the effect
memset(&pRumble[_numPAD].g_pEffect, 0, sizeof(SDL_HapticEffect)); // 0 is safe default
pRumble[_numPAD].g_pEffect.type = SDL_HAPTIC_CONSTANT;
pRumble[_numPAD].g_pEffect.constant.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates
pRumble[_numPAD].g_pEffect.constant.direction.dir[0] = 18000; // Force comes from south
pRumble[_numPAD].g_pEffect.constant.level = Strenght;
pRumble[_numPAD].g_pEffect.constant.length = 10000; // 10s long (should be INFINITE, but 10s is safer)
pRumble[_numPAD].g_pEffect.constant.attack_length = 0; // disable Fade in...
pRumble[_numPAD].g_pEffect.constant.fade_length = 0; // ...and out
// Upload the effect
pRumble[_numPAD].effect_id = SDL_HapticNewEffect( pRumble[_numPAD].g_pDevice, &pRumble[_numPAD].g_pEffect );
#endif
return true;
}
// Set PAD rumble. Explanation: Stop = 0, Rumble = 1
// --------------
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
{
int Strenght = 0;
#ifdef SDL_RUMBLE
if (PadMapping[_numPAD].rumble) // rumble activated
{
if (!pRumble[_numPAD].g_pDevice)
return;
if (_uType == 1 && _uStrength > 2)
SDL_HapticRunEffect( pRumble[_numPAD].g_pDevice, pRumble[_numPAD].effect_id, 1 );
else
SDL_HapticStopAll(pRumble[_numPAD].g_pDevice);
}
#endif
}
void PAD_RumbleClose()
{
#ifdef SDL_RUMBLE
for (int i=0; i<4; i++) // Free all pads
{
if (pRumble[i].g_pDevice) {
SDL_HapticClose( pRumble[i].g_pDevice );
pRumble[i].g_pDevice = NULL;
}
}
#endif
}
#endif // RUMBLE_HACK
// Copyright (C) 2003 Dolphin Project.
// 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, version 2.0.
// 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "GCpad.h"
#ifdef RUMBLE_HACK
struct RUMBLE // GC Pad rumble DIDevice
{
LPDIRECTINPUTDEVICE8 g_pDevice; // 4 pads objects
LPDIRECTINPUTEFFECT g_pEffect;
DWORD g_dwNumForceFeedbackAxis;
DIEFFECT eff;
};
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext);
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext);
void SetDeviceForcesXY(int pad, int nXYForce);
HRESULT InitRumble(HWND hWnd);
LPDIRECTINPUT8 g_Rumble; // DInput Rumble object
RUMBLE pRumble[4]; // 4 GC Rumble Pads
//////////////////////
// Use PAD rumble
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void Pad_Use_Rumble(u8 _numPAD)
{
if (!g_Rumble)
{
// GetForegroundWindow() always sends the good HWND
if (FAILED(InitRumble(GetForegroundWindow())))
PanicAlert("Could not initialize Rumble!");
} else
{
// Acquire gamepad
if (pRumble[_numPAD].g_pDevice != NULL)
pRumble[_numPAD].g_pDevice->Acquire();
}
}
////////////////////////////////////////////////////
// Set PAD rumble. Explanation: Stop = 0, Rumble = 1
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
{
if (GCMapping[_numPAD].ID >= NumPads || !GCMapping[_numPAD].Rumble)
return;
Pad_Use_Rumble(_numPAD);
int Strenght = 0;
if (_uType == 1 && _uStrength > 2)
{
// it looks like _uStrength is equal to 3 everytime anyway...
Strenght = 1000 * GCMapping[_numPAD].RumbleStrength;
Strenght = Strenght > 10000 ? 10000 : Strenght;
}
else
Strenght = 0;
SetDeviceForcesXY(_numPAD, Strenght);
}
// Rumble stuff :D!
// ----------------
//
HRESULT InitRumble(HWND hWnd)
{
DIPROPDWORD dipdw;
HRESULT hr;
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_Rumble, NULL)))
return hr;
// Look for a device we can use
if (FAILED(hr = g_Rumble->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumFFDevicesCallback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK)))
return hr;
for (int i=0; i<4; i++)
{
if (NULL == pRumble[i].g_pDevice)
GCMapping[i].Rumble = false; // Disable Rumble for this pad only.
else
{
pRumble[i].g_pDevice->SetDataFormat(&c_dfDIJoystick);
pRumble[i].g_pDevice->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_BACKGROUND);
// Request exclusive acces for both background and foreground.
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = FALSE;
// if Force Feedback doesn't seem to work...
if (FAILED(pRumble[i].g_pDevice->EnumObjects(EnumAxesCallback,
(void*)&pRumble[i].g_dwNumForceFeedbackAxis, DIDFT_AXIS))
|| FAILED(pRumble[i].g_pDevice->SetProperty(DIPROP_AUTOCENTER, &dipdw.diph)))
{
PanicAlert("Device %d doesn't seem to work ! \nRumble for device %d is now Disabled !", i+1);
GCMapping[i].Rumble = false; // Disable Rumble for this pad
continue; // Next pad
}
if (pRumble[i].g_dwNumForceFeedbackAxis > 2)
pRumble[i].g_dwNumForceFeedbackAxis = 2;
DWORD _rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
long rglDirection[2] = {0, 0};
DICONSTANTFORCE cf = {0};
ZeroMemory(&pRumble[i].eff, sizeof(pRumble[i].eff));
pRumble[i].eff.dwSize = sizeof(DIEFFECT);
pRumble[i].eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
pRumble[i].eff.dwDuration = INFINITE; // fixed time may be safer (X * DI_SECONDS)
pRumble[i].eff.dwSamplePeriod = 0;
pRumble[i].eff.dwGain = DI_FFNOMINALMAX;
pRumble[i].eff.dwTriggerButton = DIEB_NOTRIGGER;
pRumble[i].eff.dwTriggerRepeatInterval = 0;
pRumble[i].eff.cAxes = pRumble[i].g_dwNumForceFeedbackAxis;
pRumble[i].eff.rgdwAxes = _rgdwAxes;
pRumble[i].eff.rglDirection = rglDirection;
pRumble[i].eff.lpEnvelope = 0;
pRumble[i].eff.cbTypeSpecificParams = sizeof( DICONSTANTFORCE );
pRumble[i].eff.lpvTypeSpecificParams = &cf;
pRumble[i].eff.dwStartDelay = 0;
// Create the prepared effect
if (FAILED(hr = pRumble[i].g_pDevice->CreateEffect(GUID_ConstantForce, &pRumble[i].eff, &pRumble[i].g_pEffect, NULL)))
continue;
if (pRumble[i].g_pEffect == NULL)
continue;
}
}
return S_OK;
}
void SetDeviceForcesXY(int npad, int nXYForce)
{
// Security check
if (pRumble[npad].g_pDevice == NULL)
return;
// If nXYForce is null, there's no point to create the effect
// Just stop the force feedback
if (nXYForce == 0) {
pRumble[npad].g_pEffect->Stop();
return;
}
long rglDirection[2] = {0};
DICONSTANTFORCE cf;
// If only one force feedback axis, then apply only one direction and keep the direction at zero
if (pRumble[npad].g_dwNumForceFeedbackAxis == 1)
{
rglDirection[0] = 0;
cf.lMagnitude = nXYForce; // max should be 10000
}
// If two force feedback axis, then apply magnitude from both directions
else
{
rglDirection[0] = nXYForce;
rglDirection[1] = nXYForce;
cf.lMagnitude = (long)(1.4142f*nXYForce);
}
ZeroMemory(&pRumble[npad].eff, sizeof(pRumble[npad].eff));
pRumble[npad].eff.dwSize = sizeof(DIEFFECT);
pRumble[npad].eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
pRumble[npad].eff.cAxes = pRumble[npad].g_dwNumForceFeedbackAxis;
pRumble[npad].eff.rglDirection = rglDirection;
pRumble[npad].eff.lpEnvelope = 0;
pRumble[npad].eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
pRumble[npad].eff.lpvTypeSpecificParams = &cf;
pRumble[npad].eff.dwStartDelay = 0;
// Now set the new parameters..
pRumble[npad].g_pEffect->SetParameters(&pRumble[npad].eff, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START);
// ..And start the effect immediately.
if (pRumble[npad].g_pEffect != NULL)
pRumble[npad].g_pEffect->Start(1, 0);
}
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext)
{
LPDIRECTINPUTDEVICE8 pDevice;
DIPROPDWORD dipdw;
HRESULT hr;
int JoystickID;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
g_Rumble->CreateDevice(pInst->guidInstance, &pDevice, NULL); // Create a DInput pad device
if (SUCCEEDED(hr = pDevice->GetProperty(DIPROP_JOYSTICKID, &dipdw.diph))) // Get DInput Device ID
JoystickID = dipdw.dwData;
else
return DIENUM_CONTINUE;
//PanicAlert("DInput ID : %d \nSDL ID (1-4) : %d / %d / %d / %d\n", JoystickID, GCMapping[0].ID, GCMapping[1].ID, GCMapping[2].ID, GCMapping[3].ID);
for (int i=0; i<4; i++)
{
if (GCMapping[i].ID == JoystickID) // if SDL ID = DInput ID -> we're dealing with the same device
{
// a DInput device is created even if rumble is disabled on startup
// this way, you can toggle the rumble setting while in game
//if (GCMapping[i].enabled) // && GCMapping[i].rumble
pRumble[i].g_pDevice = pDevice; // everything looks good, save the DInput device
}
}
return DIENUM_CONTINUE;
}
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext)
{
DWORD* pdwNumForceFeedbackAxis = (DWORD*)pContext; // Enum Rumble Axis
if ((pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0)
(*pdwNumForceFeedbackAxis)++;
return DIENUM_CONTINUE;
}
void PAD_RumbleClose()
{
// It may look weird, but we don't free anything here, it was the cause of crashes
// on stop, and the DLL isn't unloaded anyway, so the pointers stay
// We just stop the rumble in case it's still playing an effect.
for (int i=0; i<4; i++)
{
if (pRumble[i].g_pDevice && pRumble[i].g_pEffect)
pRumble[i].g_pEffect->Stop();
}
}
#else // Multiplatform SDL Rumble code
#ifdef SDL_RUMBLE
struct RUMBLE // GC Pad rumble DIDevice
{
SDL_Haptic* g_pDevice;
SDL_HapticEffect g_pEffect;
int effect_id;
};
RUMBLE pRumble[4] = {0}; // 4 GC Rumble Pads
#endif
// Use PAD rumble
// --------------
bool PAD_Init_Rumble(u8 _numPAD, SDL_Joystick *SDL_Device)
{
#ifdef SDL_RUMBLE
if (SDL_Device == NULL)
return false;
pRumble[_numPAD].g_pDevice = SDL_HapticOpenFromJoystick(SDL_Device);
if (pRumble[_numPAD].g_pDevice == NULL)
return false; // Most likely joystick isn't haptic
if (!(SDL_HapticQuery(pRumble[_numPAD].g_pDevice) & SDL_HAPTIC_CONSTANT))
{
SDL_HapticClose(pRumble[_numPAD].g_pDevice); // No effect
pRumble[_numPAD].g_pDevice = 0;
GCMapping[_numPAD].rumble = false;
return false;
}
// Set the strength of the rumble effect
int Strenght = 3276 * (g_Config.RumbleStrength + 1);
Strenght = Strenght > 32767 ? 32767 : Strenght;
// Create the effect
memset(&pRumble[_numPAD].g_pEffect, 0, sizeof(SDL_HapticEffect)); // 0 is safe default
pRumble[_numPAD].g_pEffect.type = SDL_HAPTIC_CONSTANT;
pRumble[_numPAD].g_pEffect.constant.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates
pRumble[_numPAD].g_pEffect.constant.direction.dir[0] = 18000; // Force comes from south
pRumble[_numPAD].g_pEffect.constant.level = Strenght;
pRumble[_numPAD].g_pEffect.constant.length = 10000; // 10s long (should be INFINITE, but 10s is safer)
pRumble[_numPAD].g_pEffect.constant.attack_length = 0; // disable Fade in...
pRumble[_numPAD].g_pEffect.constant.fade_length = 0; // ...and out
// Upload the effect
pRumble[_numPAD].effect_id = SDL_HapticNewEffect( pRumble[_numPAD].g_pDevice, &pRumble[_numPAD].g_pEffect );
#endif
return true;
}
// Set PAD rumble. Explanation: Stop = 0, Rumble = 1
// --------------
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
{
int Strenght = 0;
#ifdef SDL_RUMBLE
if (GCMapping[_numPAD].rumble) // rumble activated
{
if (!pRumble[_numPAD].g_pDevice)
return;
if (_uType == 1 && _uStrength > 2)
SDL_HapticRunEffect( pRumble[_numPAD].g_pDevice, pRumble[_numPAD].effect_id, 1 );
else
SDL_HapticStopAll(pRumble[_numPAD].g_pDevice);
}
#endif
}
void PAD_RumbleClose()
{
#ifdef SDL_RUMBLE
for (int i=0; i<4; i++) // Free all pads
{
if (pRumble[i].g_pDevice) {
SDL_HapticClose( pRumble[i].g_pDevice );
pRumble[i].g_pDevice = NULL;
}
}
#endif
}
#endif // RUMBLE_HACK

View File

@ -1,31 +1,29 @@
# -*- python -*-
Import('env')
import sys
name = "Plugin_nJoy_SDL"
padenv = env.Clone()
if not env['HAVE_SDL']:
print name + " must have SDL to be build"
Return()
files = [
'Config.cpp',
'nJoy.cpp',
'Rumble.cpp',
]
if padenv['HAVE_WX']:
files += [
'GUI/AboutBox.cpp',
'GUI/ConfigAdvanced.cpp',
'GUI/ConfigJoypad.cpp',
'GUI/ConfigBox.cpp',
]
padenv.Append(
CXXFLAGS = [ '-fPIC' ],
LIBS = [ 'common', 'inputcommon' ],
)
padenv.SharedLibrary(env['plugin_dir']+name, files)
# -*- python -*-
Import('env')
import sys
name = "Plugin_GCPad"
padenv = env.Clone()
if not env['HAVE_SDL']:
print name + " must have SDL to be build"
Return()
files = [
'Config.cpp',
'GCPad.cpp',
'Rumble.cpp',
]
if padenv['HAVE_WX']:
files += [
'ConfigJoypad.cpp',
'ConfigBox.cpp',
]
padenv.Append(
CXXFLAGS = [ '-fPIC' ],
LIBS = [ 'common', 'inputcommon' ],
)
padenv.SharedLibrary(env['plugin_dir']+name, files)

View File

@ -318,7 +318,7 @@ void Config::Load()
iniFile.Get(SectionName, "Trigger_R", &WiiMoteEmu::WiiMapping[i].AxisMapping.Tr, 1005);
iniFile.Get(SectionName, "DeadZoneL", &WiiMoteEmu::WiiMapping[i].DeadZoneL, 0);
iniFile.Get(SectionName, "DeadZoneR", &WiiMoteEmu::WiiMapping[i].DeadZoneR, 0);
iniFile.Get(SectionName, "Diagonal", &WiiMoteEmu::WiiMapping[i].Diagonal, "100%");
iniFile.Get(SectionName, "Diagonal", &WiiMoteEmu::WiiMapping[i].Diagonal, 100);
iniFile.Get(SectionName, "Circle2Square", &WiiMoteEmu::WiiMapping[i].bCircle2Square, false);
iniFile.Get(SectionName, "Rumble", &WiiMoteEmu::WiiMapping[i].Rumble, false);
iniFile.Get(SectionName, "RumbleStrength", &WiiMoteEmu::WiiMapping[i].RumbleStrength, 8); // x10

View File

@ -29,7 +29,7 @@
// Replace the harder to understand -1 with "" for the sake of user friendliness
void WiimotePadConfigDialog::ToBlank(bool ToBlank, int Id)
{
if (!ControlsCreated)
if (!m_ControlsCreated)
return;
if(ToBlank)
@ -98,30 +98,6 @@ wxString WiimotePadConfigDialog::GetButtonText(int id)
return wxString();
}
// Configure button mapping
// Wait for button press
/* Loop or timer: There are basically two ways to do this. With a while() or
for() loop, or with a timer. The downside with the while() or for() loop is
that there is no way to stop it if the user should select to configure
another button while we are still in an old loop. What will happen then is
that we start another parallel loop (at least in Windows) that blocks the
old loop. And our only option to wait for the old loop to finish is with a
new loop, and that will block the old loop for as long as it's going
on. Therefore a timer is easier to control. */
void WiimotePadConfigDialog::GetButtons(wxCommandEvent& event)
{
if (event.GetEventType() != wxEVT_COMMAND_BUTTON_CLICKED)
return;
if (m_ButtonMappingTimer->IsRunning())
return;
wxButton* pButton = (wxButton *)event.GetEventObject();
OldLabel = pButton->GetLabel();
pButton->SetLabel(wxT("<Move Axis>"));
DoGetButtons(pButton->GetId());
}
void WiimotePadConfigDialog::DoGetButtons(int _GetId)
{
// Collect the starting values
@ -309,7 +285,7 @@ void WiimotePadConfigDialog::UpdatePadInfo(wxTimerEvent& WXUNUSED(event))
// Produce square
if(WiiMoteEmu::WiiMapping[m_Page].bCircle2Square)
InputCommon::Square2Circle(main_x_after, main_y_after, 0, WiiMoteEmu::WiiMapping[m_Page].Diagonal, true);
InputCommon::Square2Circle(main_x_after, main_y_after, WiiMoteEmu::WiiMapping[m_Page].Diagonal, true);
// Check dead zone
float DeadZoneLeft = (float)WiiMoteEmu::WiiMapping[m_Page].DeadZoneL / 100.0;
@ -325,38 +301,15 @@ void WiimotePadConfigDialog::UpdatePadInfo(wxTimerEvent& WXUNUSED(event))
right_y_after = 0;
}
// Show the adjusted angles in the status box
// Change 0x8000 to 180
/*
float x8000 = 0x8000;
main_x_after = main_x_after * (180 / x8000);
main_y_after = main_y_after * (180 / x8000);
float f_main_x_after = (float)main_x_after;
float f_main_y_after = (float)main_y_after;
WiiMoteEmu::AdjustAngles(f_main_x_after, f_main_y_after);
//WiiMoteEmu::AdjustAngles(f_main_x_after, f_main_y_after, true);
main_x_after = (int)f_main_x_after;
main_y_after = (int)f_main_y_after;
// Change back 180 to 0x8000
main_x_after = main_x_after * (x8000 / 180);
main_y_after = main_y_after * (x8000 / 180);
*/
int Lx = InputCommon::Pad_Convert(main_x); int Ly = InputCommon::Pad_Convert(main_y);
int Rx = InputCommon::Pad_Convert(right_x); int Ry = InputCommon::Pad_Convert(right_y);
int Lx_after = InputCommon::Pad_Convert(main_x_after); int Ly_after = InputCommon::Pad_Convert(main_y_after);
int Rx_after = InputCommon::Pad_Convert(right_x_after); int Ry_after = InputCommon::Pad_Convert(right_y_after);
// Convert the values to fractions
float f_x = main_x / 32767.0;
float f_y = main_y / 32767.0;
float f_x_aft = main_x_after / 32767.0;
float f_y_aft = main_y_after / 32767.0;
float f_Rx = right_x / 32767.0;
float f_Ry = right_y / 32767.0;
float f_Rx_aft = right_x_after / 32767.0;
float f_Ry_aft = right_y_after / 32767.0;
m_tStatusLeftIn[m_Page]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x, f_y ));
m_tStatusLeftOut[m_Page]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x_aft, f_y_aft));
m_tStatusRightIn[m_Page]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_Rx, f_Ry));
m_tStatusRightOut[m_Page]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_Rx_aft, f_Ry_aft));
m_tStatusLeftIn[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Lx, Ly));
m_tStatusLeftOut[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Lx_after, Ly_after));
m_tStatusRightIn[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Rx, Ry));
m_tStatusRightOut[m_Page]->SetLabel(wxString::Format(wxT("X:%03i Y:%03i"), Rx_after, Ry_after));
// Adjust the values for the plot
Convert2Box(main_x); Convert2Box(main_y);

View File

@ -62,9 +62,9 @@ BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog)
EVT_COMBOBOX(IDC_GH3_ANALOG, WiimotePadConfigDialog::GeneralSettingsChanged)
// Analog
EVT_BUTTON(IDB_ANALOG_LEFT_X, WiimotePadConfigDialog::GetButtons) EVT_BUTTON(IDB_ANALOG_LEFT_Y, WiimotePadConfigDialog::GetButtons)
EVT_BUTTON(IDB_ANALOG_RIGHT_X, WiimotePadConfigDialog::GetButtons) EVT_BUTTON(IDB_ANALOG_RIGHT_Y, WiimotePadConfigDialog::GetButtons)
EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::GetButtons) EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::GetButtons)
EVT_BUTTON(IDB_ANALOG_LEFT_X, WiimotePadConfigDialog::OnAxisClick) EVT_BUTTON(IDB_ANALOG_LEFT_Y, WiimotePadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_ANALOG_RIGHT_X, WiimotePadConfigDialog::OnAxisClick) EVT_BUTTON(IDB_ANALOG_RIGHT_Y, WiimotePadConfigDialog::OnAxisClick)
EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::OnAxisClick) EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::OnAxisClick)
// Wiimote
EVT_BUTTON(IDB_WM_A, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_WM_B, WiimotePadConfigDialog::OnButtonClick)
@ -116,6 +116,11 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style)
{
m_ControlsCreated = false;;
m_Page = g_Config.CurrentPage;
CreatePadGUIControls();
m_Notebook->ChangeSelection(m_Page);
#if wxUSE_TIMER
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
m_UpdatePadTimer = new wxTimer(this, IDTM_UPDATE_PAD);
@ -134,14 +139,6 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
}
#endif
ControlsCreated = false;
//g_Config.Load();
CreatePadGUIControls();
m_Page = g_Config.CurrentPage;
m_Notebook->ChangeSelection(m_Page);
// Set control values
UpdateGUI();
@ -164,6 +161,41 @@ WiimotePadConfigDialog::~WiimotePadConfigDialog()
}
}
// Notebook page changed
void WiimotePadConfigDialog::NotebookPageChanged(wxNotebookEvent& event)
{
// Update the global variable
m_Page = event.GetSelection();
// Update GUI
if (m_ControlsCreated)
UpdateGUI();
}
void WiimotePadConfigDialog::OnClose(wxCloseEvent& event)
{
if (m_UpdatePadTimer)
m_UpdatePadTimer->Stop();
if (m_ButtonMappingTimer)
m_ButtonMappingTimer->Stop();
g_Config.CurrentPage = m_Page;
EndModal(wxID_CLOSE);
}
void WiimotePadConfigDialog::CloseClick(wxCommandEvent& event)
{
switch(event.GetId())
{
case ID_CLOSE:
Close();
break;
case ID_APPLY:
break;
}
}
// Save keyboard key mapping
void WiimotePadConfigDialog::SaveButtonMapping(int Id, int Key)
{
@ -247,28 +279,18 @@ void WiimotePadConfigDialog::OnButtonClick(wxCommandEvent& event)
DoGetButtons(ClickedButton->GetId());
}
void WiimotePadConfigDialog::OnClose(wxCloseEvent& event)
void WiimotePadConfigDialog::OnAxisClick(wxCommandEvent& event)
{
if (m_UpdatePadTimer)
m_UpdatePadTimer->Stop();
if (m_ButtonMappingTimer)
m_ButtonMappingTimer->Stop();
event.Skip();
g_Config.CurrentPage = m_Page;
if (m_ButtonMappingTimer->IsRunning()) return;
EndModal(wxID_CLOSE);
}
void WiimotePadConfigDialog::CloseClick(wxCommandEvent& event)
{
switch(event.GetId())
{
case ID_CLOSE:
Close();
break;
case ID_APPLY:
break;
}
ClickedButton = NULL;
wxButton* pButton = (wxButton *)event.GetEventObject();
OldLabel = pButton->GetLabel();
pButton->SetWindowStyle(wxWANTS_CHARS);
pButton->SetLabel(wxT("<Move Axis>"));
DoGetButtons(pButton->GetId());
}
// Bitmap box and dot
@ -354,11 +376,8 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
TextDeadZone.Add(wxString::Format(wxT("%i%%"), i));
wxArrayString StrDiagonal;
StrDiagonal.Add(wxT("100%"));
StrDiagonal.Add(wxT("95%"));
StrDiagonal.Add(wxT("90%"));
StrDiagonal.Add(wxT("85%"));
StrDiagonal.Add(wxT("80%"));
for (int i = 0; i <= 10; i++)
StrDiagonal.Add(wxString::Format(wxT("%i%%"), 100 - i * 5));
wxArrayString StrRumble;
for (int i = 0; i <= 10; i++)
@ -929,18 +948,7 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
Center();
#endif
ControlsCreated = true;
}
// Notebook page changed
void WiimotePadConfigDialog::NotebookPageChanged(wxNotebookEvent& event)
{
// Update the global variable
m_Page = event.GetSelection();
// Update GUI
if (ControlsCreated)
UpdateGUI();
m_ControlsCreated = true;
}
void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
@ -961,7 +969,7 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
WiiMoteEmu::WiiMapping[m_Page].DeadZoneR = m_ComboDeadZoneRight[m_Page]->GetSelection();
break;
case IDC_STICK_DIAGONAL:
WiiMoteEmu::WiiMapping[m_Page].Diagonal = m_ComboDiagonal[m_Page]->GetLabel().mb_str();
WiiMoteEmu::WiiMapping[m_Page].Diagonal = 100 - m_ComboDiagonal[m_Page]->GetSelection() * 5;
break;
case IDC_STICK_C2S:
WiiMoteEmu::WiiMapping[m_Page].bCircle2Square = m_CheckC2S[m_Page]->IsChecked();
@ -1022,7 +1030,7 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
void WiimotePadConfigDialog::UpdateGUI()
{
if(!ControlsCreated)
if(!m_ControlsCreated)
return;
// Disable all pad items if no pads are detected
@ -1044,7 +1052,7 @@ void WiimotePadConfigDialog::UpdateGUI()
m_Joyname[m_Page]->SetSelection(WiiMoteEmu::WiiMapping[m_Page].ID);
m_ComboDeadZoneLeft[m_Page]->SetSelection(WiiMoteEmu::WiiMapping[m_Page].DeadZoneL);
m_ComboDeadZoneRight[m_Page]->SetSelection(WiiMoteEmu::WiiMapping[m_Page].DeadZoneR);
m_ComboDiagonal[m_Page]->SetValue(wxString::FromAscii(WiiMoteEmu::WiiMapping[m_Page].Diagonal.c_str()));
m_ComboDiagonal[m_Page]->SetSelection((100 - WiiMoteEmu::WiiMapping[m_Page].Diagonal) / 5);
m_CheckC2S[m_Page]->SetValue(WiiMoteEmu::WiiMapping[m_Page].bCircle2Square);
m_CheckRumble[m_Page]->SetValue(WiiMoteEmu::WiiMapping[m_Page].Rumble);
m_RumbleStrength[m_Page]->SetSelection(WiiMoteEmu::WiiMapping[m_Page].RumbleStrength);

View File

@ -146,7 +146,7 @@ class WiimotePadConfigDialog : public wxDialog
IDC_GH3_ANALOG,
};
bool ControlsCreated;
bool m_ControlsCreated;
int m_Page, BoxW, BoxH;
wxString OldLabel;
@ -281,13 +281,14 @@ class WiimotePadConfigDialog : public wxDialog
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
void OnKeyDown(wxKeyEvent& event);
void OnButtonClick(wxCommandEvent& event);
void OnAxisClick(wxCommandEvent& event);
void GeneralSettingsChanged(wxCommandEvent& event);
void SaveButtonMapping(int Id, int Key);
// Gamepad configuration
void SetButtonText(int id,const wxString &str);
wxString GetButtonText(int id);
void GetButtons(wxCommandEvent& btn_event);
void DoGetButtons(int id);
void UpdatePadInfo(wxTimerEvent& WXUNUSED(event));
void ToBlank(bool ToBlank, int Id);

View File

@ -282,7 +282,7 @@ struct CONTROLLER_MAPPING_WII // WII PAD MAPPING
int DeadZoneL; // Analog 1 Deadzone
int DeadZoneR; // Analog 2 Deadzone
bool bCircle2Square;
std::string Diagonal;
int Diagonal;
int Source; // 0: inactive, 1: emu, 2: real
bool bSideways;

View File

@ -665,7 +665,8 @@ void ReadLinuxKeyboard()
if ((key >= XK_F1 && key <= XK_F9) ||
key == XK_Shift_L || key == XK_Shift_R ||
key == XK_Control_L || key == XK_Control_R) {
key == XK_Control_L || key == XK_Control_R)
{
XPutBackEvent(WMdisplay, &E);
break;
}

View File

@ -80,14 +80,12 @@ bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_N
bool WasGotten = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
// Warn the user if no gamepads are detected
if (_NumGoodPads == 0)
return false;
// Update the PadState[].joy handle
for (int i = 0; i < MAX_WIIMOTES; i++)
{
if (_NumPads > (u32)WiiMapping[i].ID)
if (_NumPads > WiiMapping[i].ID)
if(_joyinfo.at(WiiMapping[i].ID).Good)
WiiMapping[i].joy = _joyinfo.at(WiiMapping[i].ID).joy;
}
@ -127,8 +125,8 @@ void GetAxisState(CONTROLLER_MAPPING_WII &_WiiMapping)
}
else
{
_WiiMapping.AxisState.Tl = XInput::GetXI(0, _WiiMapping.AxisMapping.Tl - 1000);
_WiiMapping.AxisState.Tr = XInput::GetXI(0, _WiiMapping.AxisMapping.Tr - 1000);
_WiiMapping.AxisState.Tl = XInput::GetXI(_WiiMapping.ID, _WiiMapping.AxisMapping.Tl - 1000);
_WiiMapping.AxisState.Tr = XInput::GetXI(_WiiMapping.ID, _WiiMapping.AxisMapping.Tr - 1000);
}
#endif
@ -168,8 +166,8 @@ void UpdatePadState(CONTROLLER_MAPPING_WII &_WiiMapping)
// Check the circle to square option
if(_WiiMapping.bCircle2Square)
{
InputCommon::Square2Circle(Lx, Ly, 0, _WiiMapping.Diagonal, true);
InputCommon::Square2Circle(Rx, Ry, 0, _WiiMapping.Diagonal, true);
InputCommon::Square2Circle(Lx, Ly, _WiiMapping.Diagonal, true);
InputCommon::Square2Circle(Rx, Ry, _WiiMapping.Diagonal, true);
}
// Dead zone adjustment

View File

@ -68,8 +68,7 @@ void HidOutputReport(u16 _channelID, wm_report* sr)
switch(sr->wm)
{
case WM_RUMBLE: // 0x10
if (WiiMapping[g_ID].Rumble && WiiMapping[g_ID].ID < NumGoodPads)
PAD_Rumble(g_ID, sr->data[0]);
PAD_Rumble(g_ID, sr->data[0]);
break;
case WM_LEDS: // 0x11

View File

@ -1,35 +1,22 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "../../../Core/InputCommon/Src/SDL.h" // Core
#include "EmuDefinitions.h"
@ -80,19 +67,16 @@ RUMBLE pRumble[MAX_WIIMOTES];
void Pad_Use_Rumble(u8 _numPAD)
{
if (WiiMapping[_numPAD].Rumble)
if (!g_Rumble)
{
if (!g_Rumble)
{
// GetForegroundWindow() always sends the good HWND
if (FAILED(InitRumble(GetForegroundWindow())))
PanicAlert("Could not initialize Rumble!");
} else
{
// Acquire gamepad
if (pRumble[_numPAD].g_pDevice != NULL)
pRumble[_numPAD].g_pDevice->Acquire();
}
// GetForegroundWindow() always sends the good HWND
if (FAILED(InitRumble(GetForegroundWindow())))
PanicAlert("Could not initialize Rumble!");
} else
{
// Acquire gamepad
if (pRumble[_numPAD].g_pDevice != NULL)
pRumble[_numPAD].g_pDevice->Acquire();
}
}
@ -102,23 +86,23 @@ void Pad_Use_Rumble(u8 _numPAD)
void PAD_Rumble(u8 _numPAD, unsigned int _uType)
{
if (WiiMapping[_numPAD].ID >= NumPads || !WiiMapping[_numPAD].Rumble)
return;
Pad_Use_Rumble(_numPAD);
int Strenght = 0;
if (WiiMapping[_numPAD].Rumble) // rumble activated
if (_uType == 1)
{
if (_uType == 1)
{
// it looks like _uStrength is equal to 3 everytime anyway...
Strenght = 1000 * (WiiMapping[_numPAD].RumbleStrength);
Strenght = Strenght > 10000 ? 10000 : Strenght;
}
else
Strenght = 0;
SetDeviceForcesXY(_numPAD, Strenght);
// it looks like _uStrength is equal to 3 everytime anyway...
Strenght = 1000 * (WiiMapping[_numPAD].RumbleStrength);
Strenght = Strenght > 10000 ? 10000 : Strenght;
}
else
Strenght = 0;
SetDeviceForcesXY(_numPAD, Strenght);
}
// Rumble stuff :D!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,275 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "nJoy.h"
#include "Common.h"
Config g_Config;
#if defined(HAVE_WX) && HAVE_WX
extern PADConfigDialognJoy* m_ConfigFrame;
#endif
// Run when created
// -----------------
Config::Config()
{
// Clear the memory
//memset(this, 0, sizeof(Config));
}
// Enable output log
// -----------------
void DEBUG_INIT()
{
if (pFile)
return;
#ifdef _WIN32
char dateStr [9];
_strdate( dateStr);
char timeStr [9];
_strtime( timeStr );
#endif
pFile = fopen ("nJoy-debug.txt","wt");
fprintf(pFile, "nJoy Debug\n");
#ifdef _WIN32
fprintf(pFile, "Date: %s\nTime: %s\n", dateStr, timeStr);
#endif
fprintf(pFile, "---------------\n");
}
// Disable output log
// ------------------
void DEBUG_QUIT()
{
if (!pFile)
return;
#ifdef _WIN32
char timeStr [9];
_strtime(timeStr);
fprintf(pFile, "_______________\n");
fprintf(pFile, "Time: %s", timeStr);
#endif
fclose(pFile);
}
// Save settings to file
// ---------------------
void Config::Save(int Slot)
{
// If there are no good pads don't save
if (NumGoodPads == 0) return;
// Load ini file
IniFile file;
file.Load(FULL_CONFIG_DIR "nJoy.ini");
// ==================================================================
// Global settings
// -----------------
file.Set("General", "ShowAdvanced", g_Config.bShowAdvanced);
file.Set("General", "SaveByID", g_Config.bSaveByID);
file.Set("General", "CheckForFocus", g_Config.bCheckFocus);
file.Set("General", "NoTriggerFilter", g_Config.bNoTriggerFilter);
file.Set("General", "RumbleStrength", g_Config.RumbleStrength);
#ifdef RERECORDING
file.Set("General", "Recording", g_Config.bRecording);
file.Set("General", "Playback", g_Config.bPlayback);
#endif
// ========================
for (int i = 0; i < 4; i++)
{
// Should we save this slot?
if (Slot != -1 && Slot != i) continue;
// ==================================================================
// Slot specific settings only
// -----------------
std::string SectionName = StringFromFormat("PAD%i", i+1);
// Save the physical device ID
file.Set(SectionName.c_str(), "joy_id", PadMapping[i].ID);
file.Set(SectionName.c_str(), "enable", PadMapping[i].enable);
// ===================
// ==================================================================
// Joypad or slot specific settings
// -----------------
// Current joypad device ID: PadMapping[i].ID
// Current joypad name: joyinfo[PadMapping[i].ID].Name
if(g_Config.bSaveByID)
{
/* Save joypad specific settings. Check for "PadMapping[i].ID < SDL_NumJoysticks()" to
avoid reading a joyinfo that does't exist */
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
// Create a new section name after the joypad name
SectionName = joyinfo[PadMapping[i].ID].Name;
}
file.Set(SectionName.c_str(), "l_shoulder", PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER]);
file.Set(SectionName.c_str(), "r_shoulder", PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER]);
file.Set(SectionName.c_str(), "a_button", PadMapping[i].buttons[InputCommon::CTL_A_BUTTON]);
file.Set(SectionName.c_str(), "b_button", PadMapping[i].buttons[InputCommon::CTL_B_BUTTON]);
file.Set(SectionName.c_str(), "x_button", PadMapping[i].buttons[InputCommon::CTL_X_BUTTON]);
file.Set(SectionName.c_str(), "y_button", PadMapping[i].buttons[InputCommon::CTL_Y_BUTTON]);
file.Set(SectionName.c_str(), "z_trigger", PadMapping[i].buttons[InputCommon::CTL_Z_TRIGGER]);
file.Set(SectionName.c_str(), "start_button", PadMapping[i].buttons[InputCommon::CTL_START]);
file.Set(SectionName.c_str(), "dpad", PadMapping[i].dpad);
file.Set(SectionName.c_str(), "dpad_up", PadMapping[i].dpad2[InputCommon::CTL_D_PAD_UP]);
file.Set(SectionName.c_str(), "dpad_down", PadMapping[i].dpad2[InputCommon::CTL_D_PAD_DOWN]);
file.Set(SectionName.c_str(), "dpad_left", PadMapping[i].dpad2[InputCommon::CTL_D_PAD_LEFT]);
file.Set(SectionName.c_str(), "dpad_right", PadMapping[i].dpad2[InputCommon::CTL_D_PAD_RIGHT]);
file.Set(SectionName.c_str(), "main_x", PadMapping[i].axis[InputCommon::CTL_MAIN_X]);
file.Set(SectionName.c_str(), "main_y", PadMapping[i].axis[InputCommon::CTL_MAIN_Y]);
file.Set(SectionName.c_str(), "sub_x", PadMapping[i].axis[InputCommon::CTL_SUB_X]);
file.Set(SectionName.c_str(), "sub_y", PadMapping[i].axis[InputCommon::CTL_SUB_Y]);
file.Set(SectionName.c_str(), "deadzone", PadMapping[i].deadzone);
file.Set(SectionName.c_str(), "halfpress", PadMapping[i].halfpress);
file.Set(SectionName.c_str(), "controllertype", PadMapping[i].controllertype);
file.Set(SectionName.c_str(), "TriggerType", PadMapping[i].triggertype);
file.Set(SectionName.c_str(), "eventnum", PadMapping[i].eventnum);
file.Set(SectionName.c_str(), "use_rumble", PadMapping[i].rumble);
file.Set(SectionName.c_str(), "Radius", PadMapping[i].SRadius);
file.Set(SectionName.c_str(), "RadiusOnOff", PadMapping[i].bRadiusOnOff);
file.Set(SectionName.c_str(), "Diagonal", PadMapping[i].SDiagonal);
file.Set(SectionName.c_str(), "SquareToCircle", PadMapping[i].bSquareToCircle);
file.Set(SectionName.c_str(), "RadiusC", PadMapping[i].SRadiusC);
file.Set(SectionName.c_str(), "RadiusOnOffC", PadMapping[i].bRadiusOnOffC);
file.Set(SectionName.c_str(), "DiagonalC", PadMapping[i].SDiagonalC);
file.Set(SectionName.c_str(), "SquareToCircleC", PadMapping[i].bSquareToCircleC);
}
INFO_LOG(CONSOLE, "%i: Save: %i\n", 0, PadMapping[0].halfpress);
file.Save(FULL_CONFIG_DIR "nJoy.ini");
}
// Load settings from file
// -----------------------
void Config::Load(bool ChangePad, bool ChangeSaveByID)
{
// Load file
IniFile file;
file.Load(FULL_CONFIG_DIR "nJoy.ini");
bool Tmp;
// ==================================================================
// Global settings
// -----------------
file.Get("General", "ShowAdvanced", &g_Config.bShowAdvanced, false);
file.Get("General", "CheckForFocus", &g_Config.bCheckFocus, false);
file.Get("General", "NoTriggerFilter", &g_Config.bNoTriggerFilter, false);
file.Get("General", "RumbleStrength", &g_Config.RumbleStrength, 8);
if(!ChangeSaveByID)
{
file.Get("General", "SaveByID", &Tmp, false); g_Config.bSaveByID = Tmp;
}
// =============
for (int i = 0; i < 4; i++)
{
std::string SectionName = StringFromFormat("PAD%i", i+1);
// Don't update this when we are loading settings from the PADConfigDialognJoy
if (!ChangePad)
{
file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0);
file.Get(SectionName.c_str(), "enable", &PadMapping[i].enable, false);
}
// ==================================================================
// Joypad or slot specific settings
// -----------------
// Current joypad device ID: PadMapping[i].ID
// Current joypad name: joyinfo[PadMapping[i].ID].Name
if(g_Config.bSaveByID)
{
// Prevent a crash from illegal access to joyinfo that will only have values for
// the current amount of connected pads
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
// Create a section name
SectionName = joyinfo[PadMapping[i].ID].Name;
}
file.Get(SectionName.c_str(), "l_shoulder", &PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER], 4);
file.Get(SectionName.c_str(), "r_shoulder", &PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER], 5);
file.Get(SectionName.c_str(), "a_button", &PadMapping[i].buttons[InputCommon::CTL_A_BUTTON], 0);
file.Get(SectionName.c_str(), "b_button", &PadMapping[i].buttons[InputCommon::CTL_B_BUTTON], 1);
file.Get(SectionName.c_str(), "x_button", &PadMapping[i].buttons[InputCommon::CTL_X_BUTTON], 3);
file.Get(SectionName.c_str(), "y_button", &PadMapping[i].buttons[InputCommon::CTL_Y_BUTTON], 2);
file.Get(SectionName.c_str(), "z_trigger", &PadMapping[i].buttons[InputCommon::CTL_Z_TRIGGER], 7);
file.Get(SectionName.c_str(), "start_button", &PadMapping[i].buttons[InputCommon::CTL_START], 9);
file.Get(SectionName.c_str(), "dpad", &PadMapping[i].dpad, 0);
file.Get(SectionName.c_str(), "dpad_up", &PadMapping[i].dpad2[InputCommon::CTL_D_PAD_UP], 0);
file.Get(SectionName.c_str(), "dpad_down", &PadMapping[i].dpad2[InputCommon::CTL_D_PAD_DOWN], 0);
file.Get(SectionName.c_str(), "dpad_left", &PadMapping[i].dpad2[InputCommon::CTL_D_PAD_LEFT], 0);
file.Get(SectionName.c_str(), "dpad_right", &PadMapping[i].dpad2[InputCommon::CTL_D_PAD_RIGHT], 0);
file.Get(SectionName.c_str(), "main_x", &PadMapping[i].axis[InputCommon::CTL_MAIN_X], 0);
file.Get(SectionName.c_str(), "main_y", &PadMapping[i].axis[InputCommon::CTL_MAIN_Y], 1);
file.Get(SectionName.c_str(), "sub_x", &PadMapping[i].axis[InputCommon::CTL_SUB_X], 2);
file.Get(SectionName.c_str(), "sub_y", &PadMapping[i].axis[InputCommon::CTL_SUB_Y], 3);
file.Get(SectionName.c_str(), "deadzone", &PadMapping[i].deadzone, 9);
file.Get(SectionName.c_str(), "halfpress", &PadMapping[i].halfpress, -1);
file.Get(SectionName.c_str(), "controllertype", &PadMapping[i].controllertype, 0);
file.Get(SectionName.c_str(), "TriggerType", &PadMapping[i].triggertype, 0);
file.Get(SectionName.c_str(), "eventnum", &PadMapping[i].eventnum, 0);
file.Get(SectionName.c_str(), "use_rumble", &PadMapping[i].rumble, false);
file.Get(SectionName.c_str(), "Radius", &PadMapping[i].SRadius, "100%");
file.Get(SectionName.c_str(), "RadiusOnOff", &Tmp, false); PadMapping[i].bRadiusOnOff = Tmp;
file.Get(SectionName.c_str(), "Diagonal", &PadMapping[i].SDiagonal, "100%");
file.Get(SectionName.c_str(), "SquareToCircle", &Tmp, false); PadMapping[i].bSquareToCircle = Tmp;
file.Get(SectionName.c_str(), "RadiusC", &PadMapping[i].SRadiusC, "100%");
file.Get(SectionName.c_str(), "RadiusOnOffC", &Tmp, false); PadMapping[i].bRadiusOnOffC = Tmp;
file.Get(SectionName.c_str(), "DiagonalC", &PadMapping[i].SDiagonalC, "100%");
file.Get(SectionName.c_str(), "SquareToCircleC", &Tmp, false); PadMapping[i].bSquareToCircleC = Tmp;
}
INFO_LOG(CONSOLE, "%i: Load: %i\n", 0, PadMapping[0].halfpress);
}

View File

@ -1,91 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
#include "AboutBox.h"
#include "../nJoy.h"
#include "Images/njoy.xpm"
BEGIN_EVENT_TABLE(AboutBox,wxDialog)
EVT_CLOSE(AboutBox::OnClose)
EVT_BUTTON(ID_OK, AboutBox::OKClick)
END_EVENT_TABLE()
AboutBox::AboutBox(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style)
{
CreateGUIControls();
}
AboutBox::~AboutBox()
{
// empty
}
void AboutBox::CreateGUIControls()
{
SetTitle(wxT("About: nJoy Input Plugin"));
SetIcon(wxNullIcon);
//SetSize(8,8,200,399);
SetClientSize(200,376);
Center();
#ifndef _WIN32
// Force a 8pt font so that it looks more or less "correct" regardless of the default font setting
wxFont f(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_NORMAL);
SetFont(f);
#endif
m_thankyoutext = new wxStaticText(this, ID_THANKYOU, THANKYOU, wxPoint(18,196), wxDefaultSize, 0, wxEmptyString);
m_thankyoutext->Wrap(167);
m_specialthanks = new wxStaticText(this, ID_SPECIALTHANKS, wxT("F|RES and ector."), wxPoint(18,153), wxDefaultSize, 0, wxEmptyString);
m_pluginversion = new wxStaticText(this, ID_PLUGINVERSION, PLUGIN_VER_STR, wxPoint(18,80), wxDefaultSize, 0, wxEmptyString);
m_OK = new wxButton(this, ID_OK, wxT("OK"), wxPoint(116,343), wxSize(75,25), 0, wxDefaultValidator, wxEmptyString);
m_version = new wxStaticText(this, ID_STATUSV, wxT("PUBLIC RELEASE"), wxPoint(14,349), wxDefaultSize, 0, wxEmptyString);
m_thankyougroup = new wxStaticBox(this, IDG_THANKYOU, wxT("Greetings to:"), wxPoint(10,180), wxSize(180,160));
m_specialthanksgroup = new wxStaticBox(this, IDG_SPECIALTHANKS, wxT("Special thanks to:"), wxPoint(10,135), wxSize(180,39));
m_pluginversiongroup = new wxStaticBox(this, IDG_PLUGINVERSION, wxT("Plugin info:"), wxPoint(10,61), wxSize(180,68));
wxBitmap WxStaticBitmap1_BITMAP(AboutBox_WxStaticBitmap1_XPM);
m_njoylogo = new wxStaticBitmap(this, ID_AWESOMEPICTURE, WxStaticBitmap1_BITMAP, wxPoint(-1,-2), wxSize(200,60));
}
void AboutBox::OnClose(wxCloseEvent& /*event*/)
{
EndModal(0);
}
void AboutBox::OKClick(wxCommandEvent& event)
{
if (event.GetId() == ID_OK)
{
Close();
}
}

View File

@ -1,91 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
#ifndef __ABOUTBOX_h__
#define __ABOUTBOX_h__
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dialog.h>
#else
#include <wx/wxprec.h>
#endif
#include <wx/button.h>
#include <wx/stattext.h>
#include <wx/statbox.h>
#include <wx/statbmp.h>
class AboutBox : public wxDialog
{
private:
DECLARE_EVENT_TABLE();
public:
AboutBox(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("About: nJoy Input Plugin"),
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE);
virtual ~AboutBox();
void OKClick(wxCommandEvent& event);
private:
wxStaticText *m_thankyoutext;
wxStaticText *m_specialthanks;
wxStaticText *m_pluginversion;
wxButton *m_OK;
wxStaticText *m_version;
wxStaticBox *m_thankyougroup;
wxStaticBox *m_specialthanksgroup;
wxStaticBox *m_pluginversiongroup;
wxStaticBitmap *m_njoylogo;
private:
enum
{
ID_THANKYOU = 1009,
ID_SPECIALTHANKS = 1008,
ID_PLUGINVERSION = 1007,
ID_OK = 1006,
ID_STATUSV = 1005,
IDG_THANKYOU = 1004,
IDG_SPECIALTHANKS = 1003,
IDG_PLUGINVERSION = 1002,
ID_AWESOMEPICTURE = 1001,
ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
};
private:
void OnClose(wxCloseEvent& event);
void CreateGUIControls();
};
#endif

View File

@ -1,373 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "ConfigBox.h"
#include "../nJoy.h"
#include "Images/controller.xpm"
extern bool g_EmulatorRunning;
// Set PAD status
// --------------
void PADConfigDialognJoy::PadGetStatus()
{
// Return if it's not detected. The ID should never be less than zero here, it can only be that
// because of a manual ini file change, but we make that check anway.
if(PadMapping[notebookpage].ID < 0 || PadMapping[notebookpage].ID >= SDL_NumJoysticks())
{
m_TStatusIn[notebookpage]->SetLabel(wxT("Not connected")); m_TStatusOut[notebookpage]->SetLabel(wxT("Not connected"));
m_TStatusInC[notebookpage]->SetLabel(wxT("Not connected")); m_TStatusOutC[notebookpage]->SetLabel(wxT("Not connected"));
m_TStatusTriggers[notebookpage]->SetLabel(wxT("Not connected"));
return;
}
// Get physical device status
int PhysicalDevice = PadMapping[notebookpage].ID;
int TriggerType = PadMapping[notebookpage].triggertype;
// Get original values
int main_x = PadState[notebookpage].axis[InputCommon::CTL_MAIN_X];
int main_y = PadState[notebookpage].axis[InputCommon::CTL_MAIN_Y];
int sub_x = PadState[notebookpage].axis[InputCommon::CTL_SUB_X];
int sub_y = PadState[notebookpage].axis[InputCommon::CTL_SUB_Y];
// Get adjusted values
int main_x_after = main_x, main_y_after = main_y;
if(PadMapping[notebookpage].bSquareToCircle) InputCommon::Square2Circle(main_x_after, main_y_after, notebookpage, PadMapping[notebookpage].SDiagonal);
// Adjust radius
if(PadMapping[notebookpage].bRadiusOnOff) InputCommon::RadiusAdjustment(main_x_after, main_y_after, notebookpage, PadMapping[notebookpage].SRadius);
// C-stick
int sub_x_after = sub_x, sub_y_after = sub_y;
if(PadMapping[notebookpage].bSquareToCircleC) InputCommon::Square2Circle(sub_x_after, sub_y_after, notebookpage, PadMapping[notebookpage].SDiagonalC);
if(PadMapping[notebookpage].bRadiusOnOffC) InputCommon::RadiusAdjustment(sub_x_after, sub_y_after, notebookpage, PadMapping[notebookpage].SRadiusC);
// Convert values
float f_x = main_x / 32767.0;
float f_y = main_y / 32767.0;
float f_x_aft = main_x_after / 32767.0;
float f_y_aft = main_y_after / 32767.0;
// C-stick
float f_x_c = sub_x / 32767.0;
float f_y_c = sub_y / 32767.0;
float f_x_aft_c = sub_x_after / 32767.0;
float f_y_aft_c = sub_y_after / 32767.0;
// Print values
m_TStatusIn[notebookpage]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x, f_y));
m_TStatusOut[notebookpage]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x_aft, f_y_aft));
m_TStatusInC[notebookpage]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x_c, f_y_c));
m_TStatusOutC[notebookpage]->SetLabel(wxString::Format(wxT("x:%1.2f y:%1.2f"), f_x_aft_c, f_y_aft_c));
// Adjust the values for the plot
// Border adjustment
int BoxW_ = BoxW - 2; int BoxH_ = BoxH - 2;
main_x = (BoxW_ / 2) + (main_x * BoxW_ / (32767 * 2));
main_y = (BoxH_ / 2) + (main_y * BoxH_ / (32767 * 2));
int main_x_out = (BoxW_ / 2) + (main_x_after * BoxW_ / (32767 * 2));
int main_y_out = (BoxH_ / 2) + (main_y_after * BoxH_ / (32767 * 2));
// Adjust the dot
m_bmpDot[notebookpage]->SetPosition(wxPoint(main_x, main_y));
m_bmpDotOut[notebookpage]->SetPosition(wxPoint(main_x_out, main_y_out));
// C-stick
sub_x = (BoxW_ / 2) + (sub_x * BoxW_ / (32767 * 2));
sub_y = (BoxH_ / 2) + (sub_y * BoxH_ / (32767 * 2));
int sub_x_out = (BoxW_ / 2) + (sub_x_after * BoxW_ / (32767 * 2));
int sub_y_out = (BoxH_ / 2) + (sub_y_after * BoxH_ / (32767 * 2));
m_bmpDotC[notebookpage]->SetPosition(wxPoint(sub_x, sub_y));
m_bmpDotOutC[notebookpage]->SetPosition(wxPoint(sub_x_out, sub_y_out));
///////////////////// Analog stick
// Triggers
// -----------------
int TriggerValue = 255;
if (PadState[notebookpage].halfpress) TriggerValue = 100;
// Get the selected keys
long Left, Right;
m_JoyShoulderL[notebookpage]->GetValue().ToLong(&Left);
m_JoyShoulderR[notebookpage]->GetValue().ToLong(&Right);
// Get the trigger values
int TriggerLeft = PadState[notebookpage].axis[InputCommon::CTL_L_SHOULDER];
int TriggerRight = PadState[notebookpage].axis[InputCommon::CTL_R_SHOULDER];
// Convert the triggers values
if (PadMapping[notebookpage].triggertype == InputCommon::CTL_TRIGGER_SDL)
{
TriggerLeft = InputCommon::Pad_Convert(TriggerLeft);
TriggerRight = InputCommon::Pad_Convert(TriggerRight);
}
// If we don't have any axis selected for the shoulder buttons
if(Left < 1000) TriggerLeft = 0;
if(Right < 1000) TriggerRight = 0;
// Get the digital values
if(Left < 1000 && PadState[notebookpage].buttons[InputCommon::CTL_L_SHOULDER]) TriggerLeft = TriggerValue;
if(Right < 1000 && PadState[notebookpage].buttons[InputCommon::CTL_R_SHOULDER]) TriggerRight = TriggerValue;
m_TStatusTriggers[notebookpage]->SetLabel(wxString::Format(
wxT("Left:%03i Right:%03i"),
TriggerLeft, TriggerRight
));
///////////////////// Triggers
}
// Show the current pad status
// -----------------
std::string ShowStatus(int VirtualController)
{
// Save the physical device
int PhysicalDevice = PadMapping[VirtualController].ID;
// Make local shortcut
SDL_Joystick *joy = PadState[VirtualController].joy;
// Make shortcuts for all pads
SDL_Joystick *joy0 = PadState[0].joy;
SDL_Joystick *joy1 = PadState[1].joy;
SDL_Joystick *joy2 = PadState[2].joy;
SDL_Joystick *joy3 = PadState[3].joy;
// Temporary storage
std::string StrAxes, StrHats, StrBut;
int value;
// Get status
int Axes = joyinfo[PhysicalDevice].NumAxes;
int Balls = joyinfo[PhysicalDevice].NumBalls;
int Hats = joyinfo[PhysicalDevice].NumHats;
int Buttons = joyinfo[PhysicalDevice].NumButtons;
// Update the internal values
SDL_JoystickUpdate();
// Go through all axes and read out their values
for(int i = 0; i < Axes; i++)
{
value = SDL_JoystickGetAxis(joy, i);
StrAxes += StringFromFormat(" %i:%06i", i, value);
}
for(int i = 0;i < Hats; i++)
{
value = SDL_JoystickGetHat(joy, i);
StrHats += StringFromFormat(" %i:%i", i, value);
}
for(int i = 0;i < Buttons; i++)
{
value = SDL_JoystickGetButton(joy, i);
StrBut += StringFromFormat(" %i:%i", i+1, value);
}
return StringFromFormat(
"All pads:\n"
"ID: %i %i %i %i\n"
"Controllertype: %i %i %i %i\n"
"SquareToCircle: %i %i %i %i\n\n"
#ifdef _WIN32
"Handles: %i %i %i %i\n"
"XInput: %i %i %i\n"
#endif
"This pad:\n"
"Axes: %s\n"
"Hats: %s\n"
"But: %s\n"
"Device: Ax: %i Balls:%i Hats:%i But:%i",
PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID,
PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype,
PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle,
#ifdef _WIN32
joy0, joy1, joy2, joy3,
//PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy,
XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R),
#endif
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
Axes, Balls, Hats, Buttons
);
}
// Populate the advanced tab
// -----------------
void PADConfigDialognJoy::Update()
{
// Check that Dolphin is in focus, otherwise don't update the pad status
/* If the emulator is running and unpaused GetJoyState() is run a little more often than needed,
but I allow that since it can confuse the user if the input status in the configuration window
is not update when the emulator is paused. */
if (g_Config.bCheckFocus || IsFocus()) // && !g_EmulatorRunning)
{
for (int i = 0; (u32)i < joyinfo.size(); i++)
InputCommon::GetJoyState(PadState[i], PadMapping[i], i, joyinfo[PadMapping[i].ID].NumButtons);
}
// Show the current status in a window in the wxPanel
#ifdef SHOW_PAD_STATUS
m_pStatusBar->SetLabel(wxString::Format(
"%s", ShowStatus(notebookpage).c_str()
));
#endif
}
// Populate the advanced tab
// -----------------
void PADConfigDialognJoy::CreateAdvancedControls(int i)
{
// Main-stick
m_TStatusIn[i] = new wxStaticText(m_Controller[i], IDT_STATUS_IN, wxT("In"));
m_TStatusOut[i] = new wxStaticText(m_Controller[i], IDT_STATUS_OUT, wxT("Out"));
m_gStatusIn[i] = new wxStaticBoxSizer( wxHORIZONTAL, m_Controller[i], wxT("Main-stick (In) (Out)"));
// C-stick
m_TStatusInC[i] = new wxStaticText(m_Controller[i], IDT_STATUS_IN, wxT("In"));
m_TStatusOutC[i] = new wxStaticText(m_Controller[i], IDT_STATUS_OUT, wxT("Out"));
m_gStatusInC[i] = new wxStaticBoxSizer( wxHORIZONTAL, m_Controller[i], wxT("C-stick (In) (Out)"));
// Main-stick In-Out
m_pInStatus[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize);
m_bmpSquare[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSBMP1 + i, CreateBitmap(),
//wxPoint(4, 15), wxSize(70,70));
//wxPoint(4, 20), wxDefaultSize);
wxDefaultPosition, wxDefaultSize);
m_bmpDot[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(),
wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
m_pOutStatus[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize);
m_bmpSquareOut[i] = new wxStaticBitmap(m_pOutStatus[i], ID_STATUSBMP1 + i, CreateBitmap(),
//wxPoint(4, 15), wxSize(70,70));
//wxPoint(4, 20), wxDefaultSize);
wxDefaultPosition, wxDefaultSize);
// Yes the diagonals for the original GC controller are this narrow (i.e. around 80% of the full radius),
// it's not a perfect octagon. Some third party GC controllers has a diagonal at 90% however,
// i.e. at around 63,63 rather than 55,55.
m_bmpAreaOut[i] = new wxStaticBitmap(m_pOutStatus[i], wxID_ANY, CreateBitmapArea(100,55),
wxPoint(1, 1), wxDefaultSize);
m_bmpDotOut[i] = new wxStaticBitmap(m_pOutStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(),
wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
// C-stick In-Out
m_pInStatusC[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize);
m_bmpSquareC[i] = new wxStaticBitmap(m_pInStatusC[i], wxID_ANY, CreateBitmap(),
//wxPoint(4, 15), wxSize(70,70));
//wxPoint(4, 20), wxDefaultSize);
wxDefaultPosition, wxDefaultSize);
m_bmpDotC[i] = new wxStaticBitmap(m_pInStatusC[i], wxID_ANY, CreateBitmapDot(),
wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
m_pOutStatusC[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize);
m_bmpSquareOutC[i] = new wxStaticBitmap(m_pOutStatusC[i], wxID_ANY, CreateBitmap(),
//wxPoint(4, 15), wxSize(70,70));
//wxPoint(4, 20), wxDefaultSize);
wxDefaultPosition, wxDefaultSize);
m_bmpAreaOutC[i] = new wxStaticBitmap(m_pOutStatusC[i], wxID_ANY, CreateBitmapArea(85,46),
wxPoint(1, 1), wxDefaultSize);
m_bmpDotOutC[i] = new wxStaticBitmap(m_pOutStatusC[i], wxID_ANY, CreateBitmapDot(),
wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
}
wxBitmap PADConfigDialognJoy::CreateBitmap() // Create box
{
BoxW = 70, BoxH = 70;
wxBitmap bitmap(BoxW, BoxH);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
//wxBrush LightBlueBrush(_T("#0383f0"));
//wxPen LightBluePen(_T("#80c5fd"));
//wxPen LightGrayPen(_T("#909090"));
wxPen LightBluePen(_T("#7f9db9")); // Windows XP color
dc.SetPen(LightBluePen);
dc.SetBrush(*wxWHITE_BRUSH);
dc.Clear();
dc.DrawRectangle(0, 0, BoxW, BoxH);
dc.SelectObject(wxNullBitmap);
return bitmap;
}
// Create dot
wxBitmap PADConfigDialognJoy::CreateBitmapDot()
{
int w = 2, h = 2;
wxBitmap bitmap(w, h);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
//wxBrush RedBrush(_T("#0383f0"));
//wxPen RedPen(_T("#80c5fd"));
//wxPen LightGrayPen(_T("#909090"));
dc.SetPen(*wxRED_PEN);
dc.SetBrush(*wxRED_BRUSH);
dc.Clear();
dc.DrawRectangle(0, 0, w, h);
dc.SelectObject(wxNullBitmap);
return bitmap;
}
wxBitmap PADConfigDialognJoy::CreateBitmapArea(int Max, int Diagonal)
{
wxBitmap bitmap(BoxW - 2, BoxH - 2);
wxMemoryDC dc;
dc.SelectObject(bitmap);
// Set outline and fill colors
// wxMEDIUM_GREY_PEN, wxLIGHT_GREY_BRUSH
wxBrush LightGrayBrush(_T("#dddddd"));
wxPen LightGrayPen(_T("#bfbfbf"));
dc.SetBrush(LightGrayBrush);
dc.SetPen(LightGrayPen);
// Clear bitmap
dc.Clear();
// Create offset for polygon
float Adj = (float)(BoxW-2) / 256.0;
float iAdj = 127.0 * Adj;
// The polygon corners
wxPoint Points[8];
Points[0].x = (int)(0.0 * Adj + iAdj); Points[0].y = (int)(Max * Adj + iAdj);
Points[1].x = (int)(Diagonal * Adj + iAdj); Points[1].y = (int)(Diagonal * Adj + iAdj);
Points[2].x = (int)(Max * Adj + iAdj); Points[2].y = (int)(0.0 * Adj + iAdj);
Points[3].x = (int)(Diagonal * Adj + iAdj); Points[3].y = (int)(-Diagonal * Adj + iAdj);
Points[4].x = (int)(0.0 * Adj + iAdj); Points[4].y = (int)(-Max * Adj + iAdj);
Points[5].x = (int)(-Diagonal * Adj + iAdj); Points[5].y = (int)(-Diagonal * Adj + iAdj);
Points[6].x = (int)(-Max * Adj + iAdj); Points[6].y = (int)(0.0 * Adj + iAdj);
Points[7].x = (int)(-Diagonal * Adj + iAdj); Points[7].y = (int)(Diagonal * Adj + iAdj);
// Draw polygon
dc.DrawPolygon(8, Points);
return bitmap;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,358 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
#ifndef __CONFIGBOX_h__
#define __CONFIGBOX_h__
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dialog.h>
#else
#include <wx/wxprec.h>
#endif
#include <wx/button.h>
#include <wx/stattext.h>
#include <wx/statbox.h>
#include <wx/notebook.h>
#include <wx/panel.h>
#include <wx/statbmp.h>
#include <wx/gbsizer.h>
#include "../nJoy.h"
class PADConfigDialognJoy : public wxDialog
{
private:
DECLARE_EVENT_TABLE();
public:
PADConfigDialognJoy(wxWindow *parent, wxWindowID id = 1,
const wxString &title = wxT("Configure: nJoy Input Plugin"),
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE);
virtual ~PADConfigDialognJoy();
#if wxUSE_TIMER
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
wxTimer *m_ConstantTimer, *m_ButtonMappingTimer;
#endif
// Debugging
wxStaticText* m_pStatusBar, * m_pStatusBar2;
wxTextCtrl* m_TCDebugging;
bool Debugging;
void LogMsg(const char* format, ...);
// Status window
int BoxW, BoxH;
// Configure buttons
int GetButtonWaitingID, GetButtonWaitingTimer;
private:
wxButton *m_About;
wxButton *m_OK;
wxButton *m_Cancel;
wxPanel *m_Controller[4]; // Main containers
wxNotebook *m_Notebook;
wxBoxSizer * m_MainSizer;
wxPanel *m_pKeys[4], *m_pInStatus[4], *m_pOutStatus[4], *m_pInStatusC[4], *m_pOutStatusC[4];
wxBitmap WxStaticBitmap1_BITMAP;
wxStaticBoxSizer * m_sKeys[4];
wxBoxSizer *m_sMain[4], *m_sMainLeft[4], *m_sMainRight[4];
// Settings
// ---------
wxComboBox *m_Joyname[4];
wxCheckBox *m_Enable[4];
wxComboBox *m_ControlType[4], *m_TriggerType[4];
wxComboBox *m_Deadzone[4];
wxStaticBoxSizer *m_gJoyname[4];
wxStaticBoxSizer *m_gExtrasettings[4]; // Extra settings
wxGridBagSizer * m_gGBExtrasettings[4];
wxBoxSizer* m_sSettings[4]; // General settings 2
wxStaticBoxSizer *m_gGenSettings[4];
wxStaticBoxSizer *m_gGenSettingsID[4];
wxGridBagSizer *m_gGBGenSettings[4];
wxCheckBox *m_CBSaveByID[4], *m_CBShowAdvanced[4];
wxStaticText *m_TSControltype[4], *m_TSTriggerType[4];
wxStaticBoxSizer *m_gStatusIn[4], *m_gStatusInSettings[4], *m_gStatusInC[4], *m_gStatusInSettingsC[4], *m_gStatusAdvancedSettings[4]; // Advanced settings
wxBoxSizer *m_gStatusInSettingsH[4], *m_gStatusInSettingsRadiusH[4], *m_gStatusInSettingsHC[4], *m_gStatusInSettingsRadiusHC[4];
wxGridBagSizer *m_GBAdvancedMainStick[4], *m_GBAdvancedCStick[4];
wxStaticText *m_TStatusIn[4], *m_TStatusOut[4], *m_TStatusInC[4], *m_TStatusOutC[4];
wxComboBox *m_CoBRadius[4], *m_CoBRadiusC[4]; wxCheckBox *m_CBRadius[4], *m_CBRadiusC[4];
wxComboBox *m_CoBDiagonal[4], *m_CoBDiagonalC[4]; wxCheckBox *m_CBS_to_C[4], *m_CBS_to_CC[4];
wxCheckBox *m_CBCheckFocus[4], *m_AdvancedMapFilter[4];
wxCheckBox *m_Rumble[4]; // Rumble settings
wxComboBox *m_RStrength[4];
wxStaticBoxSizer *m_gRumble[4];
wxGridBagSizer *m_gGBRumble[4];
wxStaticBoxSizer *m_gStatusTriggers[4]; // Triggers
wxStaticText *m_TStatusTriggers[4];
// Keys
// ---------
int g_Pressed; // Keyboard input
wxTextCtrl *m_JoyShoulderL[4];
wxTextCtrl *m_JoyShoulderR[4];
wxButton *m_bJoyShoulderL[4];
wxButton *m_bJoyShoulderR[4];
wxTextCtrl *m_JoyButtonA[4];
wxTextCtrl *m_JoyButtonB[4];
wxTextCtrl *m_JoyButtonX[4];
wxTextCtrl *m_JoyButtonY[4];
wxTextCtrl *m_JoyButtonZ[4];
wxTextCtrl *m_JoyButtonStart[4];
wxTextCtrl *m_JoyButtonHalfpress[4];
wxButton *m_bJoyButtonA[4];
wxButton *m_bJoyButtonB[4];
wxButton *m_bJoyButtonX[4];
wxButton *m_bJoyButtonY[4];
wxButton *m_bJoyButtonZ[4];
wxButton *m_bJoyButtonStart[4];
wxButton *m_bJoyButtonHalfpress[4];
wxTextCtrl *m_JoyAnalogMainX[4];
wxTextCtrl *m_JoyAnalogMainY[4];
wxTextCtrl *m_JoyAnalogSubX[4];
wxTextCtrl *m_JoyAnalogSubY[4];
wxButton *m_bJoyAnalogMainX[4];
wxButton *m_bJoyAnalogMainY[4];
wxButton *m_bJoyAnalogSubX[4];
wxButton *m_bJoyAnalogSubY[4];
wxTextCtrl *m_JoyDpadUp[4];
wxTextCtrl *m_JoyDpadDown[4];
wxTextCtrl *m_JoyDpadLeft[4];
wxTextCtrl *m_JoyDpadRight[4];
wxButton *m_bJoyDpadUp[4];
wxButton *m_bJoyDpadDown[4];
wxButton *m_bJoyDpadLeft[4];
wxButton *m_bJoyDpadRight[4];
wxStaticText *m_textMainX[4];
wxStaticText *m_textMainY[4];
wxStaticText *m_textDpadUp[4];
wxStaticText *m_textDpadDown[4];
wxStaticText *m_textDpadLeft[4];
wxStaticText *m_textDpadRight[4];
wxStaticText *m_textDeadzone[4];
wxStaticText *m_textHalfpress[4];
wxStaticText *m_textSubX[4];
wxStaticText *m_textSubY[4];
wxStaticText *m_textWebsite[4];
wxTextCtrl *m_PlaceholderBMP[4];
wxStaticBitmap *m_controllerimage[4],
*m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4], *m_bmpAreaOut[4],
*m_bmpSquareC[4], *m_bmpDotC[4], *m_bmpSquareOutC[4], *m_bmpDotOutC[4], *m_bmpAreaOutC[4];
int notebookpage; bool ControlsCreated;
private:
enum
{
ID_ABOUT = 1000,
ID_OK,
ID_CANCEL,
ID_NOTEBOOK,
ID_CONTROLLERPAGE1,
ID_CONTROLLERPAGE2,
ID_CONTROLLERPAGE3,
ID_CONTROLLERPAGE4,
ID_CONTROLLERPICTURE, // Background picture
ID_KEYSPANEL1, ID_KEYSPANEL2, ID_KEYSPANEL3, ID_KEYSPANEL4,
IDG_JOYSTICK, IDC_JOYNAME, IDC_ENABLE,
IDG_EXTRASETTINGS, IDC_DEADZONE, // Extra settings
IDG_CONTROLLERTYPE, IDC_CONTROLTYPE, IDC_TRIGGERTYPE, // Controller type
IDC_SAVEBYID, IDC_SHOWADVANCED, // Settings
IDC_ENABLERUMBLE, IDC_RUMBLESTRENGTH, IDT_RUMBLESTRENGTH, // Rumble
ID_INSTATUS1, ID_INSTATUS2, ID_INSTATUS3, ID_INSTATUS4, // Advanced status
ID_STATUSBMP1, ID_STATUSBMP2, ID_STATUSBMP3, ID_STATUSBMP4,
ID_STATUSDOTBMP1, ID_STATUSDOTBMP2, ID_STATUSDOTBMP3, ID_STATUSDOTBMP4,
IDT_STATUS_IN, IDT_STATUS_OUT,
// Advaced settings
IDCB_MAINSTICK_RADIUS, IDCB_MAINSTICK_CB_RADIUS, IDCB_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_S_TO_C, IDT_MAINSTICK_DIAGONAL,
IDCB_CSTICK_RADIUS, IDCB_CSTICK_CB_RADIUS, IDCB_CSTICK_DIAGONAL, IDCB_CSTICK_S_TO_C, IDT_CSTICK_DIAGONAL,
IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS,
// Timers
IDTM_CONSTANT, IDTM_BUTTON,
// ==============================================
// Keys objects
// -----------------------------
// -------------------------------------
// Text controls that hold the mapped key value
// ----------
ID_ANALOG_MAIN_X = 2000,
ID_ANALOG_MAIN_Y,
ID_ANALOG_SUB_X,
ID_ANALOG_SUB_Y,
ID_SHOULDER_L,
ID_SHOULDER_R,
ID_DPAD_UP,
ID_DPAD_DOWN,
ID_DPAD_LEFT,
ID_DPAD_RIGHT,
ID_BUTTON_A,
ID_BUTTON_B,
ID_BUTTON_X,
ID_BUTTON_Y,
ID_BUTTON_Z,
ID_BUTTONSTART,
ID_BUTTONHALFPRESS,
// ------------------ Keep this order
// -------------------------------------
// Buttons controls (it's important that they are kept in this order)
// --------
IDB_ANALOG_MAIN_X = 3000,
IDB_ANALOG_MAIN_Y,
IDB_ANALOG_SUB_X,
IDB_ANALOG_SUB_Y,
IDB_SHOULDER_L,
IDB_SHOULDER_R,
IDB_DPAD_UP,
IDB_DPAD_DOWN,
IDB_DPAD_LEFT,
IDB_DPAD_RIGHT,
IDB_BUTTON_A,
IDB_BUTTON_B,
IDB_BUTTON_X,
IDB_BUTTON_Y,
IDB_BUTTON_Z,
IDB_BUTTONSTART,
IDB_BUTTONHALFPRESS,
// ------------------ Keep this order
// Statis text controls that hold the button label
IDT_ANALOG_MAIN_X = 4000,
IDT_ANALOG_MAIN_Y,
IDT_ANALOG_SUB_X,
IDT_ANALOG_SUB_Y,
IDT_DPAD_UP,
IDT_DPAD_DOWN,
IDT_DPAD_LEFT,
IDT_DPAD_RIGHT,
IDT_DEADZONE,
IDT_BUTTONHALFPRESS,
IDT_DPADTYPE, IDT_TRIGGERTYPE,
IDT_WEBSITE,
IDT_DEBUGGING, IDT_DEBUGGING2, IDT_DEBUGGING3,
// ============
ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
};
private:
void OnClose(wxCloseEvent& event);
void AboutClick(wxCommandEvent& event);
void OKClick(wxCommandEvent& event);
void CancelClick(wxCommandEvent& event);
void DoSave(bool ChangePad = false, int Slot = -1);
void DoChangeJoystick();
void UpdateGUI(int _notebookpage);
void ChangeSettings(wxCommandEvent& event);
void ComboChange(wxCommandEvent& event);
void CreateGUIControls();
void CreateAdvancedControls(int i);
wxBitmap CreateBitmap();
wxBitmap CreateBitmapDot();
wxBitmap CreateBitmapArea(int,int);
void PadGetStatus();
void Update();
void UpdateGUIButtonMapping(int controller);
void SaveButtonMapping(int controller, bool DontChangeId = false, int FromSlot = -1);
void SaveButtonMappingAll(int Slot);
void UpdateGUIAll(int Slot);
void ToBlank(bool ToBlank = true);
void OnSaveById();
void NotebookPageChanged(wxNotebookEvent& event);
void GetButtons(wxCommandEvent& event); void DoGetButtons(int);
void GetHats(int ID);
void GetAxis(wxCommandEvent& event);
void OnPaint(wxPaintEvent &event);
void SetButtonText(int id, const char *text, int Page = -1);
void SetButtonTextAll(int id, const char *text);
wxString GetButtonText(int id, int Page = -1);
void OnKeyDown(wxKeyEvent& event);
};
#endif

View File

@ -1,425 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "math.h" // System
#include "ConfigBox.h" // Local
#include "../nJoy.h"
#include "Images/controller.xpm"
extern bool g_EmulatorRunning;
// Set dialog items from saved values
// ----------------
void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
{
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
wxString tmp;
// Update selected gamepad
m_Joyname[controller]->SetSelection(PadMapping[controller].ID);
m_Enable[controller]->SetValue(PadMapping[controller].enable);
tmp << PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_A_BUTTON]; m_JoyButtonA[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_B_BUTTON]; m_JoyButtonB[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_X_BUTTON]; m_JoyButtonX[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_Y_BUTTON]; m_JoyButtonY[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_Z_TRIGGER]; m_JoyButtonZ[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_START]; m_JoyButtonStart[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].halfpress; m_JoyButtonHalfpress[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].axis[InputCommon::CTL_MAIN_X]; m_JoyAnalogMainX[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].axis[InputCommon::CTL_MAIN_Y]; m_JoyAnalogMainY[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].axis[InputCommon::CTL_SUB_X]; m_JoyAnalogSubX[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].axis[InputCommon::CTL_SUB_Y]; m_JoyAnalogSubY[controller]->SetValue(tmp); tmp.clear();
// Update the deadzone and controller type controls
m_ControlType[controller]->SetSelection(PadMapping[controller].controllertype);
m_TriggerType[controller]->SetSelection(PadMapping[controller].triggertype);
m_Deadzone[controller]->SetSelection(PadMapping[controller].deadzone);
m_CoBRadius[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SRadius.c_str()));
m_CBRadius[controller]->SetValue(PadMapping[controller].bRadiusOnOff);
m_CoBDiagonal[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SDiagonal.c_str()));
m_CBS_to_C[controller]->SetValue(PadMapping[controller].bSquareToCircle);
// C-stick
m_CoBRadiusC[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SRadiusC.c_str()));
m_CBRadiusC[controller]->SetValue(PadMapping[controller].bRadiusOnOffC);
m_CoBDiagonalC[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SDiagonalC.c_str()));
m_CBS_to_CC[controller]->SetValue(PadMapping[controller].bSquareToCircleC);
m_AdvancedMapFilter[controller]->SetValue(g_Config.bNoTriggerFilter);
// Update Rumble checkbox
m_Rumble[controller]->SetValue(PadMapping[controller].rumble);
// Update D-Pad
if(PadMapping[controller].controllertype == InputCommon::CTL_DPAD_HAT)
{
tmp << PadMapping[controller].dpad; m_JoyDpadDown[controller]->SetValue(tmp); tmp.clear();
}
else
{
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_UP]; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_DOWN]; m_JoyDpadDown[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_LEFT]; m_JoyDpadLeft[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear();
}
}
/* Populate the PadMapping array with the dialog items settings (for example
selected joystick and so on) */
void PADConfigDialognJoy::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot)
{
// Temporary storage
wxString tmp;
long value;
// Save from or to the same or different slots
if (FromSlot == -1) FromSlot = controller;
// Replace "" with "-1" in the GUI controls
ToBlank(false);
// Set other settings
if(!DontChangeId) PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection();
PadMapping[controller].enable = m_Enable[FromSlot]->IsChecked();
PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection();
PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection();
PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection();
PadMapping[controller].SRadius = m_CoBRadius[FromSlot]->GetLabel().mb_str();
PadMapping[controller].bRadiusOnOff = m_CBRadius[FromSlot]->IsChecked();
PadMapping[controller].SDiagonal = m_CoBDiagonal[FromSlot]->GetLabel().mb_str();
PadMapping[controller].bSquareToCircle = m_CBS_to_C[FromSlot]->IsChecked();
// C-stick
PadMapping[controller].SRadiusC = m_CoBRadiusC[FromSlot]->GetLabel().mb_str();
PadMapping[controller].bRadiusOnOffC = m_CBRadiusC[FromSlot]->IsChecked();
PadMapping[controller].SDiagonalC = m_CoBDiagonalC[FromSlot]->GetLabel().mb_str();
PadMapping[controller].bSquareToCircleC = m_CBS_to_CC[FromSlot]->IsChecked();
// The analog buttons
m_JoyAnalogMainX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[InputCommon::CTL_MAIN_X] = value; tmp.clear();
m_JoyAnalogMainY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[InputCommon::CTL_MAIN_Y] = value; tmp.clear();
m_JoyAnalogSubX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[InputCommon::CTL_SUB_X] = value; tmp.clear();
m_JoyAnalogSubY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[InputCommon::CTL_SUB_Y] = value; tmp.clear();
// The shoulder buttons
m_JoyShoulderL[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER] = value;
m_JoyShoulderR[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER] = value;
// The digital buttons
m_JoyButtonA[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_A_BUTTON] = value; tmp.clear();
m_JoyButtonB[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_B_BUTTON] = value; tmp.clear();
m_JoyButtonX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_X_BUTTON] = value; tmp.clear();
m_JoyButtonY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_Y_BUTTON] = value; tmp.clear();
m_JoyButtonZ[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_Z_TRIGGER] = value; tmp.clear();
m_JoyButtonStart[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[InputCommon::CTL_START] = value; tmp.clear();
// The halfpress button
m_JoyButtonHalfpress[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].halfpress = value; tmp.clear();
// The digital pad
if(PadMapping[controller].controllertype == InputCommon::CTL_DPAD_HAT)
{
m_JoyDpadDown[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad = value; tmp.clear();
}
else
{
m_JoyDpadUp[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_UP] = value; tmp.clear();
m_JoyDpadDown[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_DOWN] = value; tmp.clear();
m_JoyDpadLeft[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_LEFT] = value; tmp.clear();
m_JoyDpadRight[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT] = value; tmp.clear();
}
// Replace "-1" with ""
ToBlank();
}
// Update the textbox for the buttons
// ----------------
void PADConfigDialognJoy::SetButtonText(int id, const char *text, int Page)
{
// Set controller value
int controller;
if (Page == -1) controller = notebookpage; else controller = Page;
switch(id)
{
case IDB_DPAD_RIGHT: m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_UP: m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_DOWN: m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_LEFT: m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_X: m_JoyAnalogMainX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_Y: m_JoyAnalogMainY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_X: m_JoyAnalogSubX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_Y: m_JoyAnalogSubY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_SHOULDER_L: m_JoyShoulderL[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_SHOULDER_R: m_JoyShoulderR[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_A: m_JoyButtonA[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_B: m_JoyButtonB[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_X: m_JoyButtonX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_Y: m_JoyButtonY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_Z: m_JoyButtonZ[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTONSTART: m_JoyButtonStart[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTONHALFPRESS: m_JoyButtonHalfpress[controller]->SetValue(wxString::FromAscii(text)); break;
default: break;
}
}
// Get the text in the textbox for the buttons
// ----------------
wxString PADConfigDialognJoy::GetButtonText(int id, int Page)
{
// Set controller value
int controller;
if (Page == -1) controller = notebookpage; else controller = Page;
switch(id)
{
// D-Pad
case IDB_DPAD_RIGHT: return m_JoyDpadRight[controller]->GetValue();
case IDB_DPAD_UP: return m_JoyDpadUp[controller]->GetValue();
case IDB_DPAD_DOWN: return m_JoyDpadDown[controller]->GetValue();
case IDB_DPAD_LEFT: return m_JoyDpadLeft[controller]->GetValue();
// Analog Stick
case IDB_ANALOG_MAIN_X: return m_JoyAnalogMainX[controller]->GetValue();
case IDB_ANALOG_MAIN_Y: return m_JoyAnalogMainY[controller]->GetValue();
case IDB_ANALOG_SUB_X: return m_JoyAnalogSubX[controller]->GetValue();
case IDB_ANALOG_SUB_Y: return m_JoyAnalogSubY[controller]->GetValue();
// Shoulder Buttons
case IDB_SHOULDER_L: return m_JoyShoulderL[controller]->GetValue();
case IDB_SHOULDER_R: return m_JoyShoulderR[controller]->GetValue();
// Buttons
case IDB_BUTTON_A: return m_JoyButtonA[controller]->GetValue();
case IDB_BUTTON_B: return m_JoyButtonB[controller]->GetValue();
case IDB_BUTTON_X: return m_JoyButtonX[controller]->GetValue();
case IDB_BUTTON_Y: return m_JoyButtonY[controller]->GetValue();
case IDB_BUTTON_Z: return m_JoyButtonZ[controller]->GetValue();
case IDB_BUTTONSTART: return m_JoyButtonStart[controller]->GetValue();
case IDB_BUTTONHALFPRESS: return m_JoyButtonHalfpress[controller]->GetValue();
default: return wxString();
}
}
// Configure button mapping
// ----------
// Wait for button press
// ---------------------
/* Loop or timer: There are basically two ways to do this. With a while() or for() loop, or with a
timer. The downside with the while() or for() loop is that there is no way to stop it if the user
should select to configure another button while we are still in an old loop. What will happen then
is that we start another parallel loop (at least in Windows) that blocks the old loop. And our only
option to wait for the old loop to finish is with a new loop, and that will block the old loop for as
long as it's going on. Therefore a timer is easier to control. */
void PADConfigDialognJoy::GetButtons(wxCommandEvent& event)
{
DoGetButtons(event.GetId());
}
void PADConfigDialognJoy::DoGetButtons(int GetId)
{
// =============================================
// Collect the starting values
// ----------------
// Get the current controller
int Controller = notebookpage;
int PadID = PadMapping[Controller].ID;
// Create a shortcut for the pad handle
SDL_Joystick *joy = PadState[Controller].joy;
// Get the number of axes, hats and buttons
int Buttons = SDL_JoystickNumButtons(joy);
int Axes = SDL_JoystickNumAxes(joy);
int Hats = SDL_JoystickNumHats(joy);
INFO_LOG(CONSOLE, "PadID: %i Axes: %i\n", PadID, joyinfo[PadID].NumAxes, joyinfo[PadID].joy);
// Get the controller and trigger type
int ControllerType = PadMapping[Controller].controllertype;
int TriggerType = PadMapping[Controller].triggertype;
// Collect the accepted buttons for this slot
bool LeftRight = (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R);
bool Axis = (GetId >= IDB_ANALOG_MAIN_X && GetId <= IDB_SHOULDER_R)
// Don't allow SDL input for the triggers when XInput is selected
&& !(TriggerType == InputCommon::CTL_TRIGGER_XINPUT && (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R) );
bool XInput = (TriggerType == InputCommon::CTL_TRIGGER_XINPUT);
bool Button = (GetId >= IDB_BUTTON_A && GetId <= IDB_BUTTONHALFPRESS) // All digital buttons
|| (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R) // both shoulder buttons
|| (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT && ControllerType == InputCommon::CTL_DPAD_CUSTOM); // Or the custom hat mode
bool Hat = (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT) // All DPads
&& (PadMapping[Controller].controllertype == InputCommon::CTL_DPAD_HAT); // Not with the hat option defined
bool NoTriggerFilter = g_Config.bNoTriggerFilter;
// Values used in this function
char format[128];
int Seconds = 4; // Seconds to wait for
int TimesPerSecond = 40; // How often to run the check
// Values returned from InputCommon::GetButton()
int value; // Axis value
int type; // Button type
int pressed = 0;
bool Succeed = false;
bool Stop = false; // Stop the timer
// =======================
// If the Id has changed or the timer is not running we should start one
if( GetButtonWaitingID != GetId || !m_ButtonMappingTimer->IsRunning() )
{
if(m_ButtonMappingTimer->IsRunning())
{
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
// Update the old textbox
SetButtonText(GetButtonWaitingID, "");
}
// Save the button Id
GetButtonWaitingID = GetId;
// Reset the key in case we happen to have an old one
g_Pressed = 0;
// Update the text box
sprintf(format, "[ %d ]", Seconds);
SetButtonText(GetId, format);
// Start the timer
#if wxUSE_TIMER
m_ButtonMappingTimer->Start(1000 / TimesPerSecond);
#endif
}
// ===============================================
// Check for buttons
// ----------------
// If there is a timer but we should not create a new one
else
{
InputCommon::GetButton(
joy, PadID, Buttons, Axes, Hats,
g_Pressed, value, type, pressed, Succeed, Stop,
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
}
// ========================= Check for keys
// ===============================================
// Process results
// ----------------
// Count each time
GetButtonWaitingTimer++;
// This is run every second
if(GetButtonWaitingTimer % TimesPerSecond == 0)
{
// Current time
int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond);
// Update text
sprintf(format, "[ %d ]", TmpTime);
SetButtonText(GetId, format);
}
// Time's up
if( (GetButtonWaitingTimer / TimesPerSecond) >= Seconds )
{
Stop = true;
// Leave a blank mapping
if(g_Config.bSaveByID) SetButtonTextAll(GetId, "-1"); else SetButtonText(GetId, "-1");
}
// If we got a button
if(Succeed)
{
Stop = true;
// Write the number of the pressed button to the text box
sprintf(format, "%d", pressed);
if(g_Config.bSaveByID) SetButtonTextAll(GetId, format); else SetButtonText(GetId, format);
}
// Stop the timer
if(Stop)
{
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
/* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots
controlled by the same device, but several DirectInput instances of different but identical devices may possible
have the same id, I don't know. So we have to do this. The user may also have selected the same device for
several disabled slots. */
if(g_Config.bSaveByID) SaveButtonMappingAll(Controller); else SaveButtonMapping(Controller);
}
// If we got a bad button
if(g_Pressed == -1)
{
// Update text
if(g_Config.bSaveByID) SetButtonTextAll(GetId, "-1"); else SetButtonText(GetId, "-1");
// Notify the user
wxMessageBox(wxString::Format(
wxT("You selected a key with a to low key code (%i), please")
wxT(" select another key with a higher key code."), pressed)
, wxT("Notice"), wxICON_INFORMATION);
}
}

View File

@ -1,566 +0,0 @@
/* XPM */
static const char *ConfigBox_WxStaticBitmap1_XPM[]={
/* ConfigBox_WxStaticBitmap1 */
"421 304 256 2",
" c black",
". c #04040B",
"X c #090916",
"o c #141217",
"O c #181828",
"+ c #15152D",
"@ c #271B2F",
"# c #162730",
"$ c #272738",
"% c #312B33",
"& c #251A19",
"* c #50312F",
"= c #6D3734",
"- c #531A34",
"; c #744736",
": c #2A2846",
"> c #383847",
", c #38355A",
"< c #312E51",
"1 c #3B3565",
"2 c #3C366A",
"3 c #3C396C",
"4 c #383866",
"5 c #3D3B73",
"6 c #3D3D7B",
"7 c #393773",
"8 c #333165",
"9 c #1B2543",
"0 c #4A354F",
"q c #423A69",
"w c #413D74",
"e c #423E7B",
"r c #4A3D79",
"t c #54386A",
"y c #6D2A49",
"u c #3E427B",
"i c #3D4376",
"p c #36486C",
"a c #01786A",
"s c #097773",
"d c #1C5956",
"f c #484858",
"g c #4D4C56",
"h c #474669",
"j c #565768",
"k c #434275",
"l c #43437D",
"z c #45497D",
"x c #4A4C7D",
"c c #494678",
"v c #585977",
"b c #4E5175",
"n c #576771",
"m c #666779",
"M c #6C6D77",
"N c #6A535C",
"B c #0E463B",
"V c #94273C",
"C c #8D5237",
"Z c #996738",
"A c #A56B37",
"S c #A97439",
"D c #B67937",
"F c #B0722C",
"G c #A25D30",
"H c #B22C4B",
"J c #912C4B",
"K c #C6264B",
"L c #C93859",
"P c #CD2D54",
"I c #CF315A",
"U c #AC7743",
"Y c #925845",
"T c #CF4760",
"R c #C36636",
"E c #018B7B",
"W c #028577",
"Q c #01927D",
"! c #088272",
"~ c #34857B",
"^ c #04A17D",
"/ c #42857D",
"( c #B98336",
") c #CE9130",
"_ c #DBA62E",
"` c #E9B22D",
"' c #E1A227",
"] c #F6CA34",
"[ c #FCE43E",
"{ c #CC9447",
"} c #EDB74B",
"| c #DBA84F",
" . c #F7C749",
".. c #FCD64A",
"X. c #F9CA55",
"o. c #FDD955",
"O. c #ECC44C",
"+. c #FDE358",
"@. c #FDE14A",
"#. c #FDE96E",
"$. c #F8D569",
"%. c #BD874A",
"&. c #3D3D84",
"*. c #3D3892",
"=. c #433E84",
"-. c #483D99",
";. c #3E4383",
":. c #3D478A",
">. c #3E4993",
",. c #3C548E",
"<. c #2F7F81",
"1. c #454585",
"2. c #494484",
"3. c #454985",
"4. c #494C84",
"5. c #454689",
"6. c #49468A",
"7. c #464B8A",
"8. c #494C8C",
"9. c #4C5284",
"0. c #47518C",
"q. c #4A538D",
"w. c #4D598D",
"e. c #485586",
"r. c #52548C",
"t. c #535B8C",
"y. c #565987",
"u. c #444B92",
"i. c #4B4E92",
"p. c #454794",
"a. c #4C5394",
"s. c #4D5A94",
"d. c #4E5599",
"f. c #4E5A99",
"g. c #455495",
"h. c #515594",
"j. c #525C94",
"k. c #51559A",
"l. c #525C9B",
"z. c #5A5D97",
"x. c #524B8D",
"c. c #58628C",
"v. c #4E6298",
"b. c #536295",
"n. c #54639B",
"m. c #5B649C",
"M. c #5B6A9D",
"N. c #586797",
"B. c #586F9A",
"V. c #686987",
"C. c #75768A",
"Z. c #64699A",
"A. c #69739B",
"S. c #787997",
"D. c #706F88",
"F. c #545CA2",
"G. c #4C58A3",
"H. c #5364A1",
"J. c #5C65A2",
"K. c #5C6BA3",
"L. c #576AA6",
"P. c #5C72A8",
"I. c #536AA8",
"U. c #636CA3",
"Y. c #656BA7",
"T. c #6B74AB",
"R. c #6774A7",
"E. c #737BAC",
"W. c #767AA6",
"Q. c #6A79B2",
"!. c #747CB3",
"~. c #6E6FAE",
"^. c #615E8D",
"/. c #827D95",
"(. c #E07A84",
"). c #019482",
"_. c #039986",
"`. c #0C8F87",
"'. c #398A84",
"]. c #30928B",
"[. c #03A593",
"{. c #0BABA7",
"}. c #458988",
"|. c #7E8197",
" X c #7983AA",
".X c #7B84B4",
"XX c #7986B7",
"oX c #6D85AE",
"OX c #55B0B5",
"+X c #7D88C1",
"@X c #85859A",
"#X c #8D9098",
"$X c #8C8DAB",
"%X c #8688A7",
"&X c #8C91AC",
"*X c #9595AB",
"=X c #838CBB",
"-X c #868BB5",
";X c #8B93BC",
":X c #8992B7",
">X c #9394B3",
",X c #959ABB",
"<X c #9B9DBB",
"1X c #9799B7",
"2X c #918DAD",
"3X c #9DA1BD",
"4X c #9AA2B8",
"5X c #9FA2AB",
"6X c #A2A3BC",
"7X c #A6A8BB",
"8X c #ADAFB8",
"9X c #A19EBA",
"0X c #FCE98B",
"qX c #F4DBA4",
"wX c #8A96C3",
"eX c #969BC5",
"rX c #8A91C7",
"tX c #9DA8CF",
"yX c #9AA3C6",
"uX c #9BA8D2",
"iX c #A3A5C3",
"pX c #A5AAC4",
"aX c #ABACC5",
"sX c #ABADCA",
"dX c #A4A8CA",
"fX c #ADB1CB",
"gX c #ACB2C6",
"hX c #B3B4CB",
"jX c #B7B8CA",
"kX c #A5ACD3",
"lX c #AAB4D6",
"zX c #BABCD3",
"xX c #B5B9D6",
"cX c #B1AEC8",
"vX c #B2BAE2",
"bX c #A1A0C6",
"nX c #C1BED0",
"mX c #BDC2D7",
"MX c #BCC2CB",
"NX c #BCC5E6",
"BX c #C6C8D9",
"VX c #D4D5DC",
"CX c #CACDD6",
"ZX c #C7CAE4",
"AX c #CCD2E5",
"SX c #D7D9E7",
"DX c #D4D8F2",
"FX c #DCE1EA",
"GX c #DCE3F6",
"HX c #E4E6EC",
"JX c #E6E9F4",
"KX c gray100",
"LX c #F4F7FA",
"PX c #EFF4F5",
"IX c #EEE7DC",
"UX c #DBA596",
/* pixels */
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX8X5X&X|.C.D.V.m m n m D.C.#X5X8XFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXCX7X#XC.n j j j g g f f f > f f f f g g M |.7XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXMX#XC.m j f f g h f f f f f f f > > > > > > > > f j |.MXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXMX|.n j j g f f f g j f g f f f > > > % > $ $ $ $ $ $ % > g M 8XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXPXjX#Xm j j j g h g h g j g f f > > % > $ $ # # # @ # O O # $ $ $ > f M 8XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX5XM j j j g g j g g g g f > > > $ $ # O O O O O O o + + O X O O O # : > j #XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBX|.M j j g j j j j g f > > $ % $ $ # @ # O # O O # # O o X + X o + X + # $ > > M 8XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX*XD.j j j j j j j j f > > % % $ $ $ : : > % > > > : $ : $ $ # O O + X X o X O # % f g 5XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX#XM m j j j j j j g > > > $ % % f f j m M C.|.@XM M M M j g f % $ $ # + O + X o + O $ > f #XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX@Xm j m n j j j g f > % $ $ > j C.5XCXVXHXKXKXKXKXJXJXHXFXCX8X*XC.j > > $ # + o X O o O $ > g #XFXKXKXKXKXKXKXKXKXKXKXKXKXKXyXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMX|.n m m j n n j j g > % @ % j #XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXCX5XM g % % # o O X o O + > g #XHXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX@Xm n m v j n j j f > % % j 5XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX5XM f % $ # O O X + $ % j 5XKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX@Xm m M j m m j g f $ % g *XFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX*Xj > > # O O X O # % n 8XKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFX|.m M M m m m v h f > > n MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjXM f > # + O o O % > M CXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX#Xm n D.M m V.n j f $ > @XCXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#Xj > $ + O O O % g S.VXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*XM m D.D.m V.V.v f $ f #XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#Xg > # O O O $ > j *XHXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXn m m D.C.D.m j g > > #XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*Xj > $ # o O $ > m 8XKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXM n M M m C.D.n f % > #XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX5Xg > $ O o O % g C.BXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@Xj M C.C.D.D.j g > % #XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#Xg > $ o o $ % g 5XKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8Xj j M D.C.C.m j > % C.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@Xf % @ o O % f M VXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXM j M M C.D.D.j g $ j VXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXm > $ O o O > g #XKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#Xj n D.C.S.C.m j > g BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8Xj > O O O % g M CXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMXm j M D.S.S.V.j f > 5XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX|.f # O O $ > g *XKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@Xj m M C.|.S.n > $ M KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXj % $ O O > f M VXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8Xm j M D.C.|.D.j > f CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#Xf $ O O % f j 5XKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXM j n M C.S.C.n f % 5XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXj > $ O % > g C.VXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXeXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8Xj j n D.|.|.m j % g HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@X% # O @ % g n CXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXIXC.j n M D.C.C.n f % *XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXf % O O $ > j 5XKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXj j m D.D.C.M j > g CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXM % O O # % g M VXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*Xj n M C.C.C.n f $ #XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*X> $ O O % g M MXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXJXKXKXKXKXKXKXKXJXCXC.j m D.C.C.M j > > CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXf % O O % f j 5XKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXFXHXHXHXFXFXFXJXJXFXKXKXKXCXCXBXjXgXaX7XeX>X$XS.j n M C.C.C.M j > f #X8X8XjXjXmXBXAXAXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXm % $ O % f g #XKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXAXZXBXmXhXgXpXdXtX<X:X-XA.A.V.V.y.y.y.9.2.2.c h j j m M S.|.C.M g : f h c b y.v y.c.V.D.S.%X1XyXgXpX7XgXgXjXmXmXBXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#X> $ # $ > g Y FXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXeXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXBXmXzXfXpXiX4X3XyX,X<X,X4X,X,XwX XZ.j.z.m.m.j.h.8.x.6.2.1.e c v j n m C.|.S.M j f < , k 1.3.4.e.h.z.M.N.N.c.Z.W.;X;X;X;X,X,X,X,X,X,X,X3XpXfXxXmXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8Xf $ # # % f D.CXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXtXtXtXeXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXeXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXZXZXzXzXlXpX<X>X,XeX>X;X;X,X;XeXwX,X;XeXeX,X;X-X XE.E.W.U.z.i.5.6 6 u l i 5 1 h j j m C.S.S.M g % < p i i 5 i u 3.w.Z.R.E. X-X=X;X=X=X=XrX;X:X-X-X;X;XwXwXeXeXeX>XeXiXlXmXAXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMXj % # O % f j 8XKXyXdXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXAXhXaXiX<X,XeXwXeX,XwXwX,X,XwXwX;X,XeXeXeXrXrXwXwXwXwXyX;X;X;X=X.XE.m.z.w.9.4.x x 9.b v n n V.S.S.|.V.j > , h z x 9.c.N.Z.T.oX X.X:X;X;X:X;XrXrXwXrXwXwX=X=X;X;X=X;X;X;XrXwXwXeXeXyXyXgXMXCXFXHXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXn > $ O % > j 5XKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXFXCXxXgXyXyX:X,XeXeXeXwX,X;X;X;X;X,X,XwXeX,X,X;X;X;XeX,X,X;X:X:X:X;XwXwXwXrXwX;X;X;X-X.X.X.X.X X X XW.A.A.A.A.A.M.c.N.N.Z.A. XXXXX.X;X;X:X:X:X:X:X:X;X;X;X;XrXwX;XwXwX;X:X=X-X:X;X-X-X.X-X.X.X-X-X:X,X4X4X3XsXmXAXAXSXSXSXKXKXKXKXKXKXKXKXHX|.> $ O # > j #XKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXBXBXaX3X3X3XyX:X:X,X,X;X:X;X,XeX,XeX,XeXeX;X;X;X;X;X-X-X-X;X-X;X:X:X:X-X-X:X:X,X,X;X,XeXeXrXwXwXrXeXrXwX;X=XE.U.Z.M.Z.Z.M.Z.Z.A.oXXX;X=X:X=X=XwX=X;XwXwX;XwXwX;X;X:X:X:X;X;X;X;X:X=X-X.X-X-X-X=X-X-X:X=XXXXX=XXX=X=XwX>X<XiXsXlXmXAXVXCXSXKXKXKXKX*Xf % $ % 0 g @XFXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXmXzXsXyX<XeX,X,X;X;XwX:X:X;X;X:X;XwX;X;X;X;X:X:X-X-X=X-X-X=X;X=X;X;XwX;XwX;X;X=X=X.X.X X X X X!.E.T.T.T.T.T.R.Y.Y.U.K.m.n.m.K.L.U.U.m.J.N.Z.T.T.E.E.!.!.!.!..XXXoXXXXX:X-XXX-X=X=X:X=X-X=X=X=X=X=X!..X-X.X=X.X-XrX=XXX.X.X.XXX.X X.XXXXX:X;XdXdXsXlXhXzXAX&Xh < $ $ > j M VXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXCXjXjXpXiXyX,X;X-X-X-XrX;XwXwX:X-X-X=X=X=X=X-X-X:X:X:X:X-X;XrX=X=X=X=X.X!.Q.T.T.R.Y.K.K.m.n.n.h.f.j.s.s.w.w.t.j.n.n.n.n.l.n.n.K.U.K.K.K.K.K.K.U.N.B.Z.U.M.M.M.M.K.K.K.Z.M.U.Z.U.Z.U.R.T.T.E.W.E..X.X.X-X-X-X=X-X=X=X.X=X!..X.X.X X X XXX.X.XoX!.E.oX X X-X:X-X.X XA.y.h , : > g M CXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXAXBXzXsXpXdXyX,X;X:X=X=XrX=X=X-X=X=X=X;XXX.X=XrXrXXX=X=XXX.XE.E.T.U.M.m.N.j.t.w.w.a.s.g.s.a.f.f.n.n.H.K.K.Y.Q.T.T.E.E..XXXXX+XXX=X=X+X+X=XrXwX+X=X+X=X=XXXXXXXXX.X X.X.XoX XE.R.T.R.R.R.T.R.Y.Y.U.U.N.Z.Z.Z.Z.Z.A.T.Y.T.W.!.!..XE. X.X-X.X X XXXXXXXXXoXQ.T.E.T.T.R.T.T.R.A.Z.A.V.c.v v D.jXdXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXSXzXxXfXdXbXwX-X=X-X=X=X.X.X=X-X-X-X-X:XXX:XXXXX.X.XoXT.T.U.n.n.j.r.q.e.q.e.s.j.n.m.M.U.R.T.E..XXXXX=XwXwXeXyXyXuXuXuXuXuXuXlXkXkXlXuXlXlXlXlXkXlXlXlXlXvXvXlXNXvXvXvXNXxXvXlXlXlXkXtXkXdXyXyXyXeXwX:X-X=X.X!.E.T.R.A.Z.U.U.U.U.Z.U.U.U.R.R.T.E.E.E. X XE.E.E.E.E.!.T.T.T.T.U.P.U.B.R.R.R.W. X%XcXdXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXIXVXVXCXCXBXBXBXCXCXVXSXHXHXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXzXaXiXdX>X-X-X-XrXrXrX-X=X-X.X=X;X=X-XXX.X XW.A.Z.M.b.t.w.q.q.q.w.s.b.m.U.R.T.!.XXXX+XrXrXwXwXwXyXyXyXeXeXwXeXeX;XwX;XwX=XwX=XXXXXXX=XXXXX-X-XXX=X.X=X=X=X:X:X;X;XwXwXeXyXtXtXkXlXlXlXkXkXlXlXlXxXxXvXNXxXlXlXvXvXkXtXyXyXeXrX=XXX.XE.T.T.U.P.M.M.K.K.K.Z.R.R.E.E.E.T.E.T.E.T.U.K.K.R.M.P.M.M.R.T.E.-XtXtXBXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXFXSXVXVXSXVXVXVXVXSXFXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXBXnXnXnXnXjXcXcXjXnXjXjXnXnXnXBXBXVXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXFXZXxXyXyX,X;X-X=X=X=X=X-X-X=X.X=X=X!.!.!.E.T.U.Z.n.j.w.q.w.w.j.l.J.Y.T.E.oXoXXXXXwXwXrX;X=X=XXX.X.XXX!.Q.T.R.U.K.J.n.H.l.l.f.a.a.s.a.s.a.s.a.s.q.a.q.q.q.0.8.8.q.q.a.s.a.a.s.j.j.k.k.k.z.m.m.n.n.m.J.Y.R.E.E..XXXrXwXwXyXyXkXlXlXlXxXvXvXlXlXkXyXeX:X:X.X X!.T.U.K.Z.Z.m.M.M.Z.M.A.U.R.U.U.U.U.Y.U.T.T.R.T.T.E.tXtX,X,XpXmXCXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXVXBXBXBXBXnXBXnXBXBXnXBXVXCXVXSXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXCXnXjXcXcXcX9X9X9X9X7X9XiX7X7X8X8XcXcXcXjXBXVXSXHXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXAXzXgX6X,X>X-X-X-X=X.X=X=X=X.X.X!.E.E.T.R.Z.j.w.e.w.w.q.s.b.U.Y.Q.!.!.XX+X+XXXXXoX!.E.T.R.P.M.N.z.j.r.w.q.q.7.7.7.3.3.3.;.3.;.;.;.;.;.3.3.;.;.;.;.;.;.3.;.1.;.;.1.;.;.;.1.;.;.3.3.3.;.3.;.;.u u ;.l u u ;.;.;.;.u u :.3.4.w.s.h.j.m.U.Q.!.!.wXwXeXuXlXvXvXvXvXxXlXkXyX,XwX=X.XE.oXE.A.Z.M.M.M.J.J.J.J.Y.Y.R.R.T.E.E.!.tXtXoXE. X.X2X9XhXBXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXVXBXnXjXnXjXjXjXcXcXaXcXcXhXcXhXzXzXnXBXSXHXHXJXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXCXnXcXcX8X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7X7X7X8XjXjXBXSXFXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXAXmXfXiX<X:X-X-X.X-X.XXX=XXX.X.XE.T.U.m.z.e.e.q.e.t.j.b.K.U.T.Q.oXXX!.!.!.!.~.Y.U.m.l.k.a.s.a.7.0.3.3.3.7.7.1.3.3.;.1.;.:.;.5.5.5.1.7.3.3.3.5.3.3.3.3.;.;.3.5.3.3.5.3.1.1.1.1.1.3.1.1.1.1.1.3.1.1.1.1.1.7.5.;.5.1.1.:.1.:.;.;.;.;.;.;.;.&.:.:.u.7.3.w.t.m.U.T.!.=XwXyXkXlXxXNXNXNXvXlXlXtXyXwX;XXXE.R.Z.Z.U.U.U.U.Z.U.T.E.!.tXtXoXE.E.!. X X-X;XbXxXZXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXSXBXnXzXhXcXcXaXiXbXbXiXiXiX6XiXbXiXsXaXaXcXcXcXnXSXHXHXJXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXVXjX8XbX9X9X9X9X>X1X9X1X1X9X1X9X9X9X9X1X9X9XbX9X6X6X6X7XcXjXBXVXFXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXBXsXeX>X-X-X=X-X.X=X=X=XXX!.Q.T.M.m.h.w.e.w.h.j.n.m.Y.T.Q.!.T.T.T.R.K.n.n.j.h.q.7.7.7.8.7.5.5.5.:.:.5.5.5.5.5.5.5.5.5.:.:.5.5.5.5.5.1.1.1.1.3.1.1.1.1.1.3.;.1.1.3.2.7.1.1.1.1.1.5.1.1.1.1.1.1.1.1.1.5.5.6.6.5.5.5.5.5.5.5.5.5.;.5.5.5.5.5.3.5.1.1.1.1.;.1.1.;.;.;.1.u.i.h.z.Y.E.!.wXeXkXlXvXNXNXNXNXNXNXlXyX:X XA.A.B.M.Z.U.K.U.tXtXQ.!.!.XX!..X.X X X.X-XbXhXAXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXCXjXgXcXgXpXdXdXbXiX9XbX9XeXbXeXbXbXbXdXdXbXbXdXsXsXcXjXBXSXDXHXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXnX8X7X9X9X9X>X>X1X1X1X1X1X>X1X1X>X1X9X9X<X<X<X<XeXbX9X6XiX7XaX7XzXnXCXSXHXKXKXKXKXKXKXKXKXKXKXJXAXjXaX<X,X-X-X=X=X=X+XXXXXXX!.T.Y.m.j.w.w.a.h.j.m.K.U.Y.T.Y.Y.U.m.n.n.j.f.w.q.0.0.7.7.7.7.3.1.7.5.5.5.1.5.1.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.1.1.1.1.7.5.5.5.5.7.6.7.7.7.5.7.7.2.6.7.7.7.2.7.7.3.1.1.5.1.1.5.5.5.5.5.5.6.5.5.5.5.5.5.7.5.5.3.3.1.1.1.1.3.3.5.7.1.1.1.1.p.5.p.5.&.&.5.3.r.c.A.R.-XwXyXkXxXNXZXZXAXAXmXlXyXwX.XE.R.Z.tXtXU.Y.T.T.!.!.!..X!.!.!.W.%X-X<XhXZXHXKXKXKXKXKXKXKXKXKXJXCXBXfXgXpXiXyXyXbXeXeXyXbXbXeXiXyXeXiXdXbXbXeXdXdXbXbXkXiXcXcXjXnXVXVXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXCXjX7X9X9X9X>X>X2X%X2X*X9X>X>X1XeX>X>X>X9XeXeX9XeXbXbXeXeXiXiXiX6X6XpXcXjXnXVXFXKXKXKXKXKXKXJXSXmXsXyX,X:X=X-X-X.XXXXXXX!.T.Y.m.j.r.q.q.t.b.J.K.U.Y.U.K.J.J.n.k.a.s.a.a.8.7.7.3.3.1.;.1.3.7.7.5.3.1.1.1.5.6.5.7.5.5.1.1.1.5.7.7.7.1.1.1.1.1.1.1.1.1.5.1.1.5.1.1.1.1.1.1.1.1.2.1.1.1.1.2.1.1.1.1.1.1.1.1.7.5.5.6.6.6.2.1.1.5.5.5.1.1.5.7.5.7.3.3.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.5.5.5.=.5.&.;.1.;.1.4.e.h.m.T. XrXtXvXNXAXDXGXDXAXNXfX:XtXtXR.A.U.Y.K.U.T.E.E.E.E.XX.XXXE.W.-XeXfXZXJXKXKXKXGXNXvXlXlXxXxXxXxXmXkXuXeXeXeXeX,XeXyXyXeXtXbXeXbXeXeXdXbX<XeXbX9XbXiXcXcXnXBXVXSXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXnX7X9X9X9X>X>X1X9X%XS.S.$X>X>X>X1X>XeX>X,X,X,X,X,X,X<X<XyXeX<XeX9XiXiXiXiXcXhXzXBXSXKXKXKXFXBXcX6X;X=X-X-X=X=XXX.X.XE.R.N.f.s.w.h.j.b.m.M.M.K.J.n.n.l.s.f.f.q.a.q.7.7.3.3.2.7.1.1.1.3.7.7.1.1.5.1.5.5.1.1.1.1.1.1.1.1.7.1.1.1.1.1.1.1.1.1.1.1.1.1.5.6.5.5.5.6.6.1.1.1.1.3.1.1.7.6.6.1.6.2.2.1.1.1.1.1.2.1.1.1.5.1.5.5.=.6.7.2.2.2.2.2.1.1.1.1.3.7.1.5.p.7.6.p.5.5.5.1.1.1.1.7.5.1.z l l 1.1.5.5.5.5.5.5.7.7.1.1.5.7.5.1.h.m.E..XwXkXmXNXFXJXJXtXtXxXeX-X XR.M.N.N.Z.U.T.Q.!.!.!.!.!..X!./.1XaXDXZXZ.7.f.H.K.R.Q.XXXXXX=XwXXXXXQ.E..X=X=XwXeXuXeXeXdXbXyXdX,X2X/././.2X9XaXcXcXzXnXBXCXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXgX7X9X*X>X>X>X>X1XiX>X%XS.$X>X2X>X>XeX1X1X1X,X,X,X,X<X,X,XeXeXyXeXyX3X3X3X6XiXsXfXxXvXBXxXsX,X;X:X-XXXXX=X-X.XE.E.R.m.h.w.a.j.j.l.m.m.M.n.n.n.j.k.j.f.q.q.7.7.5.1.1.1.5.1.1.5.5.1.5.5.1.5.1.5.1.7.1.5.1.7.5.3.7.1.5.5.1.1.5.5.1.5.1.1.5.1.5.1.5.1.5.5.3.5.1.1.5.1.5.1.5.1.5.1.1.5.1.7.1.5.1.1.7.1.5.1.5.1.5.5.1.5.3.5.1.5.1.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.5.1.5.1.5.5.5.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.7.1.1.;.:.a.k.U.!.rXkXxXuXtXJXJXSXCXfXeX-X!.~.Y.Y.J.Y.Y.T.!.!.E.!.!.W.W.E.J.>.P.Q.G.>.*.>.>.>.>.>.>.>.>.>.,.,.,.G.G.P.oX+XXXrXeXeXkXbX%X2X;X>X/.-XbXdXsXsXhXnXBXCXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX7X6X<X*X*X>X>X>X>X1XyX>XW.S.$X>X>X>X>X>XeX>X>X,X,X,X,X,X,X,X3X<X<X<X3X<X3XyXyXbXbXeX>X>XyX,X-X-X-X.X.X=X.XE.U.m.j.s.j.j.a.j.l.z.m.n.n.n.n.s.s.s.q.8.8.7.5.1.1.3.1.7.5.5.1.1.1.5.3.5.1.3.5.1.5.1.5.1.5.1.5.5.5.5.5.1.6.7.1.5.1.1.5.1.5.5.1.5.1.7.1.5.1.1.5.1.5.5.3.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.7.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.1.5.1.5.5.1.1.5.5.1.7.1.5.1.5.1.1.5.1.5.1.5.1.1.5.1.;.;.1.u u 4.r.Z.tXtXuXNXDXJXPXJXGXNXsX,X.XQ.Y.J.Z.Z.Z.R.T.E.E.!.T.f.:.g.f.>.>.>.G.>.g.,.g.g.G.g.g.G.G.g.,.>.>.>.>.G.I.Q.XXwXeX,XeXdXiX$X%X>XiXbXdXsXcXcXnXVXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX7X*X>X*X*X2X*X>X>X>X>XyX>X%XS.-X1X>XeX>X>XeXeX1X,X,X,X,X,X,X,X3X<X1X,X,X<X<X<X>X-X-X%XW.W.-X-X-X=XXXE.E.U.m.b.a.w.a.a.j.j.j.l.m.m.l.k.a.g.0.0.5.7.;.1.1.1.1.1.1.1.5.5.1.1.5.1.5.1.5.1.5.5.1.5.3.5.1.5.1.5.1.1.5.5.5.7.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.3.5.1.5.3.5.1.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.7.1.5.5.1.5.1.5.1.7.1.1.5.1.5.1.5.1.5.5.1.7.1.5.1.1.5.1.5.7.3.1.1.;.u u &.tXtXa.m.~.=XkXAXGXPXJXJXFXNXyX:XoXR.Z.U.Z.Z.T.!.Q.n.g.5.&.&.>.>.>.>.>.>.>.>.>.>.g.G.g.G.G.I.I.I.G.,.:.:.>.G.P.Q..XeXtX;X-X>X7XiXbXsXsXcXhXmXBXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX7X*X1X>X*X>X2X>X>X>X>X>XyX>X%XS.-XeX>X>XeXeX1X1XeX,X,X,X,X,X,XeX1X,X3XyX,X:X-X-X XW.W.E.-X=X=X.X!.T.U.m.h.s.w.a.a.f.k.F.J.l.k.j.h.a.q.8.q.7.5.;.;.;.1.1.1.1.1.1.1.1.5.7.1.5.5.1.1.5.1.5.3.1.5.1.5.1.5.1.5.1.1.7.5.7.2.7.5.7.5.1.5.1.5.1.5.7.1.5.1.7.1.5.1.1.5.3.5.5.1.5.3.5.1.5.1.1.5.1.5.1.7.1.5.5.1.5.1.5.1.7.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.1.7.1.5.1.5.1.5.5.1.5.1.5.1.7.1.1.5.1.5.1.5.5.1.5.1.1.1.1.7.7.8.1.1.tXtX&.u 1.3.q.U..XyXxXDXPXPXPXGXAXlX;XW.A.N.m.K.P.P.K.F.i.p.>.*.>.>.>.>.>.:.>.>.>.>.>.>.G.G.I.Q.oXXXoXT.f.*.-.G.F.I.Q.!.;XuXdXiXbXbXdXsXxXhXjXBXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX5X*X>X>X2X>X>X>X>X>X>X>X1XbXeX/.W.2X>X>X>X>X>XeX>XeX,X,XeX,XeXeX,X4X,X,X;X-X!.W.T.E.E..XXX.X!.~.Y.z.w.0.0.0.f.k.k.l.l.k.k.k.k.a.q.7.7.1.3.7.1.1.1.1.7.7.7.2.7.1.1.1.1.5.7.1.5.1.1.1.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.5.1.6.7.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.3.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.1.5.1.7.5.1.5.1.5.1.5.3.5.1.5.1.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.7.7.1.5.1.7.1.5.1.1.5.1.5.1.6.4.1.1.1.5.5.7.1.tXtX1.1.l ;.5.&.;.3.t.W.-XkXNXGXJXPXPXFXmXyX XA.B.K.M.U.Y.J.G.p.5.:.&.:.p.u.>.>.>.>.>.>.>.>.g.G.G.L.!.rXuXeX!.Y.>.:.g.Y.+XrXrXdXdXdXdXdXsXlXjXnXZXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX7X2X1X>X>X>X>X>X>X-X2X;X>X>X6XeX/.W.2X>X>XeXeXeX>XeX>X,X,XeX,X,X,X,X;X:X.XE.E.E.E.T.T.!.Q.R.J.k.h.8.8.0.w.w.s.j.j.j.f.h.a.0.q.7.7.7.1.1.1.5.5.1.1.5.1.5.5.1.1.1.1.1.1.1.1.5.1.1.5.5.1.5.3.5.1.5.3.1.5.1.7.1.1.1.5.5.5.5.3.5.1.7.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.5.1.5.1.5.1.5.1.7.1.5.3.1.5.1.5.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.7.5.1.7.1.5.1.5.1.1.5.1.5.1.5.1.7.5.1.5.1.1.5.1.5.1.5.1.5.7.1.5.1.5.1.1.1.1.1.5.5.1.3.tXtX1.7.1.1.5.5.5.5.&.1.5.k.Y.!.wXhXSXJXLXJXFXmX3X&XA.U.M.U.L.H.F.a.p.>.*.&.>.>.=.>.>.>.>.>.>.>.>.>.G.p.f.U.=XeXkXrXY.u.g.L.!.rXrXtXdXdXpXsXcXcXnXBXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX8X*X1X2X%X2X&X&X&X>X&X:X-X>X>XyXeX/./.2XrX>X>XrX>XeXeX>X;X,XeXeX;X:X-X XE.E.E.T.Q.!.T.U.J.l.f.q.0.h.a.a.j.j.j.j.w.w.w.0.0.7.3.5.5.5.;.5.5.5.5.5.5.5.5.5.5.5.1.1.2.1.6.2.2.5.7.5.5.1.1.1.1.5.1.5.1.5.1.1.5.1.1.1.5.5.5.5.5.5.5.1.6.1.1.1.5.5.1.1.5.5.1.5.1.5.1.1.1.3.5.3.1.1.3.5.1.5.1.1.1.5.1.1.1.1.5.1.5.5.5.1.5.1.5.1.5.1.5.1.5.1.1.1.1.5.1.1.5.1.1.5.1.1.1.5.1.5.1.1.1.1.1.1.5.5.5.1.5.1.5.1.1.1.5.1.1.1.1.5.5.1.5.1.5.1.5.1.1.5.1.5.5.1.2.5.5.5.=.=.5.5.tXtX5.5.5.5.l 3.1.1.5.p.&.l e 1.7.h.Y.rXgXBXJXPXJXGXAXuXoXT.R.U.R.K.Y.F.i.5.:.*.5.*.*.:.>.:.>.>.>.>.>.>.>.>.>.f.V.2XkXeXQ.f.a.h.U.=XeXkXsXpXcXcXzXnXCXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8X*X*X*X2X>X>X:X&X:X:X>X>X;X>X>X6XeX/./.-X/./.1X,X2X1XeX;X;X,X;X:X XE.E.T.E.Q.!.T.Y.K.f.a.s.q.q.s.a.k.j.j.j.h.h.a.8.7.7.5.3.5.1.1.1.5.5.1.1.1.5.1.5.5.1.5.1.1.5.1.5.1.1.5.7.1.1.1.1.5.5.1.5.1.5.3.5.1.5.7.1.1.3.7.1.5.5.5.4.2.4.1.6.8.5.5.8.7.5.5.7.1.5.1.5.1.5.7.5.1.;.;.7.1.5.5.1.1.7.1.8.3.1.1.1.3.3.l l 1.6.5.p.5.5.8.1.5.7.7.7.7.5.3.;.1.1.1.7.7.6.7.1.1.1.1.3.1.1.l 1.3.1.1.1.5.5.7.3.1.5.5.l 4.1.1.1.4.z 1.1.5.1.5.1.7.1.5.5.1.5.1.1.1.5.5.5.5.5.5.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.a.K.rXlXAXGXLXPXFXmX3X.XY.~.Z.Z.M.m.g.u.>.>.>.*.>.>.>.>.>.g.>.>.>.>.u.u.>.g.g.~.uXeXE.h.i.i.~.rXuXkXcXaXcXzXnXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX1X*X2X2X2X2X&X>X-X>X:X>X>X>X>X,XyX<X%XS.A.S.%X>X>X,X,X,X:X,X=X XoXE.E.E.E.T.R.J.l.j.a.q.s.a.f.j.j.f.a.h.a.a.q.7.7.7.7.7.5.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.2.7.5.5.i.5.1.l e 1.5.5.5.5.1.5.5.;.1.7.1.5.5.1.5.1.5.1.2.1.7.1.1.5.7.1.8.7.1.1.p.6.6.5.6.p.=.6.=.&.6.5.1.1.1.1.1.=.1.5.p.5.1.1.7.1.6.5.1.1.1.1.7.2.1.1.5.5.=.=.5.p.5.5.5.5.1.5.7.5.5.6.6.p.p.5.6.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.&.=.3.Z.-XsXZXGXJXLXGXxX,XoXY.K.U.Y.J.j.u.p.>.-.>.>.>.>.*.*.>.>.p.>.p.g.p.>.:.:.J.+XrX!.F.:.w.E.wXdXlXxXfXjXBXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX5X$X2X2X$X2X&X&X-X&X:X>X:X:X:X;X>XyX<X-X%XW.S.W.:X,X:X:X:X.X XoXE.E.E.E.E.R.Z.j.w.q.7.8.a.a.h.k.k.h.a.q.q.8.8.3.3.3.5.7.5.1.5.1.;.5.5.1.5.3.5.1.5.1.5.1.5.1.1.5.1.7.1.7.1.5.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.3.1.1.1.7.1.l =.8.7.1.1.p.*.=.5.5.1.5.1.1.3.1.5.1.1.5.1.1.6 e 8.7.;.&.i.1.7.;.6.1.l l =.&.5.&.=.p.p.6.5.6.6.1.2.=.6 1.7.5.1.1.5.5.7.1.2.2.6.1.1.1.1.1.7.2.1.1.6 5.p.=.=.p.&.5.5.&.1.1.1.1.&.&.=.5.6.p.p.6.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.p.5.:.&.&.1.h.Z.=XkXAXJXLXPXDXvXwXE.U.U.U.Y.F.l.u.:.*.:.>.>.>.>.>.>.>.>.>.:.u.p.>.>.g.f.!.+XQ.f.w.b.rXkXlXkXhXnXCXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8X$X2X2X2X2X$X:X2X-X:X2X:X>X-X>X>X,X<XiX<X<X,X;X-X,X;X.X XoXE.R.E.oXE.T.U.m.w.w.q.q.s.f.j.k.z.j.h.a.q.7.3.7.7.3.1.1.;.5.1.1.5.5.1.1.1.1.5.1.5.1.7.1.5.1.5.1.7.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.1.1.u l b 1.2.2.8.1.5.-.7.5.1.1.1.4.r.u 5.3.5.5.1.1.2.r.4.5 l h.5.1.1.3.1.1.l 8.x.x x r.r.2.5.5.5.8.6.5 k 4.x.h.6.l 1.8.5.5.6.7.x z 2.1.4.9.1.1.6.2.7.1.4.x r.8.r.c e 6.1.1.5.i.1.7 4.r.r.4.5 2.8.p.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.1.&.&.&.&.1.q.Z.-XxXDXPXLXPXAXdX-XT.Z.J.J.U.F.>.>.:.>.>.>.>.p.>.>.:.u.>.>.>.>.-.>.:.q.Y.!.K.g.8.!.rXE.eXzXZXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVX#X2X2X2X2X2X>X>X-X&X:X:X>X-X>X:X>X:X,XeXeXdXdXeX;X-X.XW.T.E.E.E.E.T.m.h.q.0.0.w.a.a.k.j.a.h.h.q.7.7.3.3.1.1.1.1.1.5.3.5.1.1.1.1.1.1.1.5.1.5.1.5.1.7.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.3.5.1.5.3.5.1.5.3.5.1.1.1.1.5.5.1.A.lX Xl y.eXz.=.5.5.1.1.1.3..X-Xl 5.5.1.1.5.1.r.eXeX9.3 rX!.l 5.1.3.l r.rXuX3XpXeXeXY.l e 5.5.w 9.-XeXuXkX!.7.l 1.1.1.=.r.eXeXh.5 -X-X=.1.1.1.1.1.Z.4XeXeXeXS.c 1.1.1.&.5.6 N.>XdXtX;XV.q z 6.5.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.7.1.5.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l l z l l 1.1.5.:.&.;.1.a.R.:XjXDXLXLXJXBX<X XZ.z.Z.K.H.d.5.u.:.:.>.>.p.u.:.*.>.>.>.>.>.>.>.>.g.G.I.d.d.a.k.z.W.xXZXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX6X@X2X2X$X$X-X2X>X:X2X:X2X:X:X&X:X:X:X,XeX;X,X;X-X XE.T.R.E.E.E.Y.K.j.0.4.0.s.a.j.j.a.a.a.7.8.7.7.5.1.5.7.1.1.1.1.1.1.7.1.1.5.5.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.7.1.5.1.3.5.1.5.1.5.1.5.3.5.1.5.5.1.5.1.5.p.5.6 -XAXdXy.y.vXz.w 6.5.1.1.l z eXtXu 1.1.5.5.1.1.z.zXZXW.1 bXrXl 1.1.4.l z U.U.,XlXS.Z.y.l 8.p.5.l XsX!.Z.Y.z.4.3.4.1.8.=.t.zXxX!.l 6X<X&.1.1.1.5.1.W.mXA.z.W.hXR.=.l 7.5.5.2.eXiXz.W.,X,Xx l 5.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l 1.1.1.1.1.1.;.1.5.5.&.&.&.5.h.~.,XBXJXPXLXSXfX%XA.Z.U.J.m.h.7.:.:.>.p.p.>.p.p.>.>.>.>.>.>.:.:.>.G.f.f.G.G.u.:.J.dXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX#X$X2X2X$X$X$X-X-X:X-X:X2X:X>X:X>X:X:X:X;X:X%X|.A.R.R.E.E.E.M.b.w.0.4.8.s.k.l.j.j.a.a.7.7.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.1.1.5.1.1.5.7.5.5.1.5.5.5.1.5.1.5.1.5.1.1.7.1.5.1.5.1.5.5.1.5.1.5.3.5.1.5.1.5.1.1.5.1.;.7.&.5.l $X4XiXW.y.xXV.l 7.6.6.1.1.k rXyXz 1.5.1.1.5.1.z.7X6X>Xv bX-Xc 1.8.4.1.l 4.3 W.dXb 5 1.6.p.p.=.k >XeXq 6 l 1.1.1.1.1.7.=.^.7X*XkX9.*X1X&.1.1.1.1.1.T.7Xr.7 k sX!.=.z 1.5.&.6.lXS.7 5 !.kX4.&.p.6.1.1.5.5.5.1.7.1.5.1.5.1.5.1.5.5.5.1.5.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.5.5.5.5.&.&.1.1.l u 1.1.l =.=.=.6.z./.kXAXJXLXJXvX=XW.U.U.U.m.l.a.>.:.*.-.p.>.:.:.>.>.>.>.:.>.>.G.,.>.,.G.G.g.G./.zXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*X2X2X$X%X%X%X$X2X2X-X-X&X&X2X-X-X:X,X:X-X.XE.T.T.E.!.E.T.M.j.q.3.0.g.s.a.h.j.a.q.8.7.5.1.5.:.5.5.5.5.5.5.5.1.7.2.7.1.7.1.3.5.1.1.1.1.1.5.3.1.1.3.1.5.1.1.1.7.3.1.1.3.5.1.5.1.5.1.1.5.3.5.1.5.1.5.1.5.3.5.5.1.5.3.1.1.&.k -X<XZ.yXS.iXZ.6 7.1.8.1.l k ;XbXc 1.5.2.7.5.1.z.8XA.eX%X*X$X2.7.7.1.5.3.1.l @XdXx =.5.1.l 5.5.z $XxXbXbXkX-X2.e 1.1.5.6 y.hXV.>X%X*X1X1.1.1.1.1.1.W.pXh.=.x dXS.u 1.5.7.2.l kXS.-.=.W.kX4.1.5.1.1.1.1.1.1.1.5.5.1.5.1.7.1.1.1.1.1.5.1.1.1.1.tXtX1.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.3.1.1.;.=.=.1.&.1.2.i.z.-XxXJXLXJXBX5XW.Z.A.U.m.l.a.u.:.:.:.u.>.:.>.>.>.u.7.u.u.g.>.>.g.G.g.G.K.eXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX$X%X$X2X:X&X-X$X-X:X-X&X&X-X-X&X-X:X-X X XA.R.T.Q.!.U.m.h.0.3.e.0.f.s.j.a.a.a.8.7.7.7.3.1.7.7.1.1.1.1.1.1.5.5.1.1.1.1.5.1.1.1.1.1.7.1.1.3.1.1.1.5.3.1.1.3.1.1.5.1.5.1.1.5.1.5.1.5.5.1.5.1.5.1.5.3.5.1.5.1.1.5.1.1.1.1.1.u ;XbXx ;X3XaXy.2.5.5.5.1.2.k ,XeXc 1.5.7.6.6.1.t.6Xz.Y.<XhX/.2.8.6.1.5.6.1.1.@XsX4.1.6.1.z 5.=.k :XdXV.^.Z.V.4.2.5.5.8.e ^.kXv Z.iX7X:X&.1.1.2.2.=.T.7Xr.&.c dXW.1.7.1.1.7 y.lXA.=.5 /.lXr.&.7.1.1.5.5.3.1.1.5.1.5.1.5.1.5.1.5.1.1.1.1.1.1.1.tXtX1.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.5.1.2.=.e e 2.=.=.z.E.iXBXJXPXDXsX%XZ.Y.U.U.F.G.i.>.>.>.g.>.>.>.:.>.u.u.>.>.>.g.p.g.g.,.f..XmXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*X@X%X$X$X$X$X$X-X$X-X2X:X-X$X-X;X-X XA.Z.R.E.E.T.U.l.q.0.7.0.a.l.l.q.a.8.8.3.1.1.1.2.2.=.1.2.1.1.1.1.1.1.1.1.1.1.1.1.6.1.1.1.1.1.1.1.1.1.1.1.1.5.1.1.5.5.1.1.1.1.1.5.1.5.1.7.1.7.1.3.5.1.5.3.5.1.5.5.1.5.1.5.1.5.1.5.1.1.5 ;XbXe z.hXmXy.1.=.5.5.5.1.k eXbXe 5.5.6.7.6.1.z.sXZ.5 >XZX-Xl 5.5.1.5.1.1.&.%XkX2.2.1.1.3.p.5.l -XdXc 7 3 k l 1.5.5.5.7 z.xX^.w eXZX$X=.1.2.1.1.2.W.gXx 8 y.kXW.&.5.1.6.1.r.kX/.=.q %XdX2.=.6.5.1.1.1.1.1.1.1.5.1.5.1.5.5.1.1.5.5.1.1.1.5.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.&.l 1.1.2.2.2.2.2.2.2.2.2.2.2.=.=.r 5.=.6 e 2.h.~.dXSXPXJXNXeXW.Z.Y.J.J.F.d.>.>.>.>.p.p.>.>.*.>.>.>.5.u.p.p.g.,.>.K.yXDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBX#X$X2X$X%X%X%X-X-X-X$X-X-X-X;X-XW.W.A.T.E..XE.K.s.3.7.7.a.k.l.k.f.a.4.3.1.1.e e e 2.2.=.e e =.e 1.1.1.1.1.1.&.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.3.1.1.1.1.3.5.1.7.3.1.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.7.1.5.1.5.1.7.7.1.1.1.rXdXx.6 &XzXZ.=.p.u.5.8.1.l eXdXx.1.1.5.2.7.1.z.xXZ.3 Z.xX;X1.1.5.1.5.1.1.1.-XdXx.1.1.1.3.5.5.l W.lXeX/.;XW.4.=.5.1.i.6 z.vXZ.5 Z.vX;X=.1.7.1.6.1.T.jX:X-X;XkXZ.&.7.&.5.1.l =XkX!.-XdX-X6.5.1.1.1.1.5.1.1.3.5.1.5.3.5.1.1.1.1.1.2.=.5.=.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.&.6 l &.1.1.1.=.=.2.=.2.=.=.e e l l e 5 e e 1.1.1.6 7 =.4.^.2XzXDXDXBX<XW.Z.Z.Y.J.G.u.>.>.>.>.>.>.>.>.u.>.>.>.>.>.>.g.>.>.H.rXNXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX5X%X$X2X2X%X-X-X-X$X-X$X-X-X-X.XR.Z.A.E..XT.U.s.3.3.7.s.a.h.k.j.a.7.5.3.3.1.1.2.2.2.1.=.e =.6 6 6 2.1.e =.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.3.1.1.1.1.1.1.5.5.1.5.1.1.5.3.5.1.5.3.5.5.1.5.1.7.1.5.1.1.5.=.&.Y.W.i.=.y.W.z.=.5.5.5.1.1.2.Y.~.l 5.1.5.5.7.5.h.E.z.w k E.Y.1.1.1.5.1.1.1.1.Z.E.l 2.1.5.1.7.8.6 e Y.-XrXrX~.7.6.6.5.2.=.x.E.y.2.1.E.A.&.1.1.1.1.1.h.%X-XrXE.Z.e 5.1.5.5.8.e r.W.;X;XW.9.&.5.6.1.5.1.7.1.3.5.1.5.1.5.1.5.5.1.1.5.1.5.1.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.6 1.e e e w 6 e e l 4.4.8.r.r.z.c.c.j.z.m.Y.Y.Y.~.>XmXGXPXLXGXfX%XA.Z.Z.R.l.a.7.:.:.>.p.u.p.u.:.>.u.>.>.>.>.G.>.g.Q.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX$X%X$X-X-X2X-X%X%X%X-X-X-X XR.Z.U.!.E.R.m.d.8.5.7.s.s.s.f.s.s.h.l.m.M.Z.J.J.Z.U.U.U.J.U.m.z.z.h.r.1.1.u 6 6 6 u 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.7.1.5.1.5.1.1.1.7.1.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.3.1.5.5.&.2.l &.6.5 5 2.6.=.1.5.;.7.4.2.l =.6.1.5.1.5.7.1.l 1.1.6 2.6 1.1.5.7.5.5.1.5.e 2.5 2.1.5.;.&.1.8.1.7 6 5 5 e =.5.5.6.2.1.5.4 k 2.5.5 l 1.1.1.1.1.1.1.5 7 w w u =.5.3.5.=.5.6.7 w e c w e p.5.4.1.1.1.1.1.1.1.5.3.5.1.5.3.5.5.=.1.1.5.=.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.;.1.1.&.l 1.1.1.1.1.6 &.6 6 6 u 2.8.h.z.Z.U.U.U.U.R.E.T.T.T.T.T.!.W.!.rXrX=XeXbXlXZXAXDXZXlX=XT.U.T.Y.l.u.:.>.>.>.>.>.>.:.>.>.>.>.>.>.g.g.>.K.kXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBX/.%X$X-X%X-X-X%X%X-X-X XA.Z.U.E.E.R.j.4.;.5.u.a.a.j.k.l.m.m.m.M.M.U.U.R.R.U.U.Y.R.Y.R.R.R.T.R.R.R.Y.~.Y.Z.h.2.l l =.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.1.1.7.1.1.1.3.5.5.1.5.1.5.1.5.1.5.3.5.1.5.7.1.5.1.5.1.1.7.;.6.p.5.=.e =.=.e &.*.=.1.6 p.i.5.8.=.=.1.=.5.1.1.6.1.&.6 1.3.5.5.5.5.5.1.=.1.5.=.&.=.6 &.1.=.&.&.:.1.7.5.=.1.=.e 1.=.=.=.&.l 5.&.u 6 p.5.1.l 1.=.&.1.1.1.&.*.;.e 6 &.5.=.&.1.5.&.5.=.=.=.&.e =.=.=.2.1.1.3.1.1.1.3.5.1.1.5.1.5.1.1.1.1.5.1.=.6.=.2.tXtX1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.1.1.1.=.6 6 6 6 1.1.w.j.M.R.E.T.Y.R.R.U.K.M.M.M.m.m.m.m.m.m.m.z.c.c.z.z.z.^.Y.Y.W.-X=X=XE.Z.M.U.R.U.l.i.:.*.>.*.:.*.u.u.*.p.>.:.>.>.>.d.z.eXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX7X@X@X%X-X%X%X%X-X=X-XA.Z.Z.!.!.Y.z.3.1.1.7.e.h.z.n.m.U.Z.M.Z.M.M.M.M.m.J.K.K.K.U.J.U.U.Y.K.J.Y.Y.Y.Y.R.R.Y.T.~.R.m.t.4.6 6 2.1.5.1.2.1.1.1.=.5.1.5.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.1.1.5.1.5.1.1.5.z p.=.4.S.$X>X>X>X$X>X;X;X<X%X4.&.p.e b XiXW.1.&.p.5.W.3X X4.&.5.1.1.;.&.Z.<X%X6.!.>X>X;X,X&X&X>X:X>Xt.&.x. X&X&X2X1X:X>X1X%Xr.2. X6XA.5.5.7.;.&.A.1X%X4.-X>X>X1X>X2X-X>X2XW.2.h.;X*X2X,X>X2X$X>X,XW.e 1.5.1.5.5.5.5.1.5.5.3.5.1.5.1.1.1.1.1.1.1.1.5.tXtX1.1.1.1.1.1.1.1.1.1.6 =.e 1.l =.6 1.u 6 u 4.j.J.T.Q.T.R.U.M.Z.Z.M.M.M.M.U.U.Y.R.T.T.T.~.~.Y.Y.R.U.Z.U.U.Z.m.F.z.n.m.n.m.Z.H.K.K.K.Y.U.z.u.:.:.>.p.p.p.-.*.p.u.>.>.>.f.G.f.yXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX$X%X$X%X X%X-X;X XZ.Z.U.T.!.Y.z.r.7.8.h.z.m.M.M.M.Z.J.Z.M.U.Z.R.T.T.T.T.E.oX!.E.E.E.T.T.E.T.T.Y.U.U.Z.M.Z.U.R.R.U.U.T.E.Z.z.1.7 6 l =.1.=.5.=.1.1.1.=.=.1.1.1.1.1.1.5.1.3.1.1.5.1.5.1.5.1.5.1.5.1.5.3.5.5.1.5.1.5.1.1.l 6.=.A.jXMXvXzXBXzXBXBXzXZX<Xz 5.=.2.V.lXmXhXz.6.5.2.:XBXjXZ.&.;.7.7.5.r.4XCXiXr.eXBXxXhXzXmXmXhXmXzXZ.5.=XzXjXmXmXZXZXjXMXMX-Xx.3XCX%X;.5.1.1.&.%XMX3X8.eXMXjXjXzXxXzXzXzXxXW.z.fXBXjXvXvXzXzXmXZX-Xq.;.5.1.5.3.5.1.5.1.1.5.1.5.5.1.1.1.1.1.1.1.1.1.tXtX1.=.1.1.1.1.1.1.1.l 1.=.2.1.;.6 ;.u ;.0.m.T.T.Y.Z.J.K.U.R.T.T.R.E.E.E.E.E. X.X X-X-X-X2X;X;X;X;X:X:X-X-XW.W.W.T.~.Y.U.U.Z.K.J.K.J.m.Z.U.K.n.7.:.&.>.p.-.p.p.>.>.>.g.g.,.>.T.tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX@X@X%X%X$X%XW.A.Z.A.T.E.Y.z.r.r.h.z.J.U.Y.U.U.Y.U.U.Y.Y.T.!.oXXXXX+XwXrXyXyXyXyXyXyXtX,XwX,X;X:X%X XE.~.R.U.U.U.U.R.U.M.R.T.Y.m.8.2.l 6 6 &.1.1.1.1.1.1.1.1.1.1.6.5.4.1.1.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.1.5.1.5.1.7.1.4.5.=..XBX7XW.A.W.V.A.A.A.A.Z.6.p.=.y.<XmXfXBX>X8.1.l >XjXMX,Xr.6 1.5.&.W.gXzX<Xx.,XzXyXV.V.V.V.Z.Z.V.l 5.-XBX6XS.Y.W.A.C.*XAXiXy.<XCX%X5.5.7.5.=.%XjX3Xr.eXBX<Xc.^.Z.z.Z.,XBX%Xy.sXBX/.Y.Y.U.Z.Z.Y.h.1.1.1.5.1.5.1.5.3.5.5.1.5.3.1.1.1.1.1.1.1.1.1.1.tXtX1.1.1.=.1.1.6 1.1.1.1.=.=.6 1.1.8.a.K.J.m.n.m.Z.M.U.U.R.E.E.oX X X X:X,XyXtXtXsXlXxXxXvXNXZXZXDXZXAXDXZXZXZXzXjXpX1X;XE.Y.R.Z.m.U.J.H.H.j.K.K.a.7.5.;.:.*.>.>.>.>.>.:.>.p.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX X%X%X%X-XW.V.Z.R.W.U.n.j.z.j.l.m.U.Y.J.m.m.m.J.K.R.T.T.T.T.T.T.E.E.Q.E. X.X.XXX;XwXwXyXtXtXkXlXNXvXkXuXuXwX.XE.A.R.P.B.U.Y.Y.R.Y.Z.j.q.1.;.6 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.3.5.p.W.BX6X9.6 =.=.=.e 2.l l 2.5.l A.BXiXS.hXmXA.l x >XzXjXzXE.l 1.;.h.aXMX8X6Xy.>XjX,Xx c x.6.6.=.e =.1.%XCX5Xu 7 &.7 k XNXeXr.*XBX-X=.5.1.=.=./.jX<X9.<XmXeXc c 8.e x eXBXW.z.fXzXD.z 4.r.x 7 1.1.5.6.1.1.5.1.5.1.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.1.tXtX1.1.1.=.1.&.1.&.1.1.&.6 1.5.8.h.z.J.l.z.n.Z.Y.T.E.E..X.XXXwXeXuXuXtXdXtXyXeXeX:X-X-X-X-X-X%X-X$X&X,XiXkXxXZXSXSXJXJXJXDXZXcX4X%XR.Z.m.M.K.J.J.F.z.z.8.:.:.=.>.5.>.p.:.p.a.;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8X X-X%XS.Z.A.T.!.E.R.N.j.l.z.j.j.j.l.l.m.J.K.K.K.Y.U.U.K.U.U.K.K.J.m.J.H.n.n.n.n.J.K.K.U.U.T.oXXXrXwXlXlXNXNXmXlXdXwXXXoXZ.N.N.U.U.U.R.U.m.w.;.u 6 6 &.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.1.5.5.l 5.p.W.CXaXh.e h.rXeX,X>X1X-X7.6 9.lXmXS.k &XBXpXx l -XzXcXzXsXy.5 1.rXmXjXMXdX9.>XBXxX<XsXxXuXz.&.6.5.1.&XCX*X7.5.5.p.=.r.z.p.i.4XBX X&.5.1.=.&.W.jX<X9.eXjXaXpXiXiXiXaXhXaX^.r.sXMXgXkXaXsXW.l e p.p.5.1.5.1.5.1.5.1.5.5.3.5.1.1.1.1.1.1.1.1.1.1.1.tXtX1.1.u 1.1.1.1.6 6 1.1.3.q.h.k.j.k.k.n.m.U.T.!.XX=XwXwXeXuXeXrXrX!.~.Y.m.z.h.h.r.4.8.9.4.9.4.e.:.e.7.q.e.j.b.Z.A./.eXfXAXJXLXLXJXBXsX:XW.U.U.U.Y.J.m.J.a.i.5.:.&.*.=.>.:.m.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX5X%XS.Z.Z.W.!.!.E.R.m.b.f.a.7.0.s.j.l.n.J.J.K.K.K.J.H.n.j.l.l.f.k.f.s.a.f.G.F.G.F.F.F.F.H.F.l.F.H.I.L.U.T.oX;XtXlXNXNXNXlXtX:XW.Z.Z.Z.Z.R.T.U.m.a.1.1.6 1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.W.CXiXh.5 V.xXZXzXzXCXsXr.5 -XZXiXr.6 Z.fXzX%X3 2XzXeX1XZX%X3 y.xXfX@XjXdXr.1XjXjXjXxXxXdXy.k 5.5.2.&XCX*X7.=.5.5.5.h.9.7.r.6XCX%X=.5.7.=.&.%XjX<Xr.eXMX8X8XgXgXgX8XjXiX^.z.sXjXgXlXfXsX-X1.5.5.5.5.5.1.5.1.5.1.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.1.tXtX1.1.u 1.1.1.6 e 2.1.1.a.a.q.q.s.n.J.R.T.!.XXwXwXeXeXrXXXT.m.h.q.7.5.5.5.5.1.5.1.1.1.1.1.5.1.1.;.;.5.5.;.;.:.-.p.-.5.5.t.A.%XiXAXPXKXJXAXdX-XZ.z.m.J.K.K.F.a.5.=.&.-.-.5.wXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#XA.A.W..X-X.XE.U.z.e.7.7.0.k.l.n.m.J.n.l.l.n.f.s.s.s.s.s.s.a.a.f.f.f.f.f.a.f.f.f.f.f.s.l.n.f.l.l.H.v.F.L.l.n.K.R.oX,XfXNXDXDXNXsX=XE.M.N.M.R.R.~.Y.x.1.&.;.1.1.1.1.1.1.1.1.1.1.1.5.3.5.1.5.1.5.5.7.1.5.1.7.1.5.1.1.5.1.4.5.5.W.CXdXp.7 2.z.^.^.%XmX3Xx y.xXjXZ.6 *.5.%XmXkXt.-XzX/.V.nXxXA.:XmX:Xm zXuXh.<X8X,Xx 4.4.x.e &.6 p.6.&XmX1X5.&.&.&.6 %XhX*Xy.>XCX X&.&.l =.7 W.MX4Xy.eXMXeXx 9.r.4.4.>XBX-X^.sXmXD.8.9.4.5.&.=.&.1.5.1.5.1.5.1.5.1.7.5.1.5.5.1.1.1.1.1.1.1.1.1.1.tXtX1.=.1.1.1.6 1.1.7.8.8.3.5.7.a.l.R.Q.XX+XwXrX=XE.U.z.h.q.5.;.1.:.1.1.1.1.1.1.l 1.7.1.1.1.1.1.1.2.3.4.1.1.1.1.;.7.7.5.;.;.u ;.1.r.Z.<XBXPXKXJXzX$XA.Z.M.M.J.m.l.k.p.=.-.Q.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXS.A. X-X;X=XT.m.w.0.3.0.a.l.J.H.n.n.l.f.a.a.s.s.q.0.g.g.q.s.s.a.a.a.f.a.f.s.s.f.s.s.f.s.f.f.l.l.l.l.l.F.F.F.F.F.F.H.m.Z. X=XlXNXDXDXmXyXE.m.J.K.Y.U.R.J.i.6 e 2.2.2.=.1.1.1.1.7.1.1.1.1.5.1.1.1.1.4.1.6.3.1.5.1.5.1.5.5.1.5.l /.ZXiXV.r.r.4.c x %XZXeXy.-XxX4Xy.t.x.&.^.sXxX$X$XBX%Xq >XmX7XzXhXh.v mXdX4.1XMXeXx.c 4.4.r.x.y.e 1.;XCX5Xy.9.y.x.y.-XZX3Xy.eXzX-Xy.9.x.r.y.@XMXiXy.<XzXrX2.c 2.l 4.-XCX1Xy.jXjXD.4.8.4.4.x.z.k.p.6.5.1.5.1.5.1.1.5.1.1.5.1.1.1.5.1.1.1.1.1.1.2.tXtX1.1.1.=.6 1.8.a.7.7.q.;.7.s.K.Q.+X+XXX!.Y.n.w.3.u ;.3.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.3.3.7.2.4.2.1.1.2.4.3.3.3.1.3.4.7.u.5.1.6 l t.~.dXDXKXPXmX&XA.M.J.J.Y.U.k.4.u ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX4X%X=X;X=X XU.j.3.3.7.s.f.n.l.l.l.k.f.a.s.q.q.a.i.a.a.a.s.a.a.a.a.a.a.a.a.a.d.a.d.f.f.d.f.d.d.f.f.k.f.f.l.f.l.l.l.H.l.H.l.H.n.K.oXwXhXAXGXDXlX-XZ.J.P.R.R.U.z.5.7 5 1.2.&.1.1.5.1.1.1.3.1.1.1.1.7.2.5.1.1.1.5.1.5.1.5.1.1.6.2.l W.vXxX6X7X7XaXsXiXhXZX,XS.jXMXjX7XhX/.=.e E.NXxX8XnX$X2 z.sXBXzX-X&.V.mXdX4.;XMXjXaX7XaXaX7XaXhX^.e :XBX8XdXsXgXaXaXfXZX1Xb ,XZXgX7X7XsXkXsXgXBX;Xy.<XzXzX7XaXaXaXiXhXBX-Xt.hXMXgXlXsXdXgX7XfX-X2.1.1.5.1.5.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.=.=.tXtX1.1.6 1.7.7.8.7.;.;.:.w.m.!.+XrX!.T.z.q.3.;.;.;.;.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.2.5.1.5.1.5.5.7.5.5.5.1.7.6.6.6.7.5.7.7.7.5.:.5.z.:XBXLXJXNX=XY.U.Y.U.n.Z.Z.W.sXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHX*X-X-XrXXXE.n.0.3.7.0.f.l.l.n.f.a.s.s.g.a.g.q.u.q.7.q.a.a.0.a.q.q.a.a.s.s.a.a.d.d.a.f.f.d.d.f.f.k.d.l.f.l.l.H.n.F.l.H.l.F.F.l.n.n.n.L.U. XuXAXGXFXjX-XT.A.A.A.R.Y.h.6 5 u 1.1.1.1.1.1.1.1.1.3.1.6.2.1.1.1.2.5.1.5.1.7.1.5.1.5.5.1.Z.eXlXvXmXjXjXmXjXhX7X%X1XzX8XgXhXzX=X=.6 t.bXvXlXxX-X5 =.-XjX<Xr.5.Z.xXeXm.;XxXgXjXzXmXzXhXzXlX~.&.A.3XhXvXfXjXhXjXgX7XS.h S.7XgXjXjXxXlXvXxXsXW.2.eXzXgXjXzXjXzXjXgX>Xc.z.dXgXhXvXzXjXjXjXmX>Xc 1.5.5.5.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.e tXtX6 6 ;.1.x.8.7.1.:.a.J.!.XX+X!.K.a.;.;.;.u ;.3.5.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.2.7.1.1.1.5.1.1.2.5.7.1.7.5.7.7.7.7.5.7.7.7.7.7.6.1.l y..XxXGXGXmX%XZ.Z.Y.Y.!..X/.sXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX$X-X;X;XXXU.a.0.7.q.k.l.l.k.f.a.a.a.7.7.q.7.u.q.7.q.u.q.7.a.0.a.7.a.q.q.a.a.q.a.a.a.d.a.d.s.d.d.d.f.d.f.l.f.l.l.l.f.f.l.l.H.F.F.F.F.H.H.H.H.M.R.yXmXGXJXmX XZ.L.Z.A.E.Z.1.5 1.4.1.&.1.1.1.1.1.5.1.1.7.1.1.6.3.1.5.1.5.1.5.1.7.6.6.5.1.4.z.y.Z.t.y.t.y.y.9.z z.^.y.y.y.z.8.=.l l r.z.r.^.y.=.&.x y.y.e *.z y.t.e r.^.t.y.z.t.t.y.y.t.k.5.e v c.t.4.y.y.t.z.r.1.7 1.t.V.y.y.z.h.r.y.b 2.6 z.y.t.r.y.t.y.y.y.c 6 8.z.v y.r.y.c.y.b c.h.;.1.5.1.1.5.1.7.1.1.1.1.;.1.1.1.1.1.1.e 1.1.1.=.tXtX1.1.8.8.1.3.3.q.l.R.!.!.T.m.7.;.;.3.1.1.1.3.7.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.5.1.5.1.1.7.7.5.1.1.6.7.2.7.6.7.7.7.7.7.7.7.8.i.i.5.;.w.!.mXGXDXdXW.U.F.J.!.=X%X9XFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX%XwXrXrX!.n.q.:.a.j.l.l.k.j.a.0.7.7.7.0.q.u.7.q.q.0.7.q.7.q.q.u.a.q.a.q.q.a.q.a.a.a.f.d.d.a.f.f.d.d.f.f.f.k.k.l.l.f.F.l.f.f.F.F.F.F.F.F.F.G.I.L.J.J.!.eXZXJXDXuXT.M.M.U.T.T.w.5 e 1.l 1.1.1.1.1.1.5.1.1.1.1.1.6.1.5.1.5.1.5.1.5.5.5.6.5.1.3.l 5.p.5.p.5.p.5.5.p.=.5.7.&.p.5.2.1.1.1.5.1.6 6 8.p.1.w l 6.p.1.l 2.1.1.l 5.5.&.5.p.p.5.2.5.p.5.i k 1.5.5.=.5.5.*.p.p.p.=.5.&.&.5.5.1.i k 7.5.8.l p.5.p.p.&.5.p.1.5.5.6 5 l 1.&.1.1.&.1.=.p.5.5.5.5.1.5.5.1.1.1.1.;.1.;.1.1.1.1.1.&.1.1.e tXtX1.7.8.7.;.3.s.Y.~.~.U.z.x.3.1.1.1.1.1.1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.5.5.1.7.6.1.1.5.1.5.7.5.1.1.7.7.6.7.6.7.5.7.7.7.7.8.7.5.p.G.i.7.3.t..XNXGXNX:XA.K.J.T.-X-X1XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgX%X,XrXrXR.w.7.7.s.k.l.h.a.i.a.8.a.8.7.7.7.a.8.a.u.i.a.i.u.0.q.u.q.7.u.u.q.a.7.a.q.a.a.g.a.f.f.a.a.f.d.f.d.f.f.f.l.k.f.l.f.f.f.f.F.F.F.F.F.F.f.G.F.L.L.L.Y.~.yXGXLXAXeX~.J.M.T.!.Z.3.6 2.1.1.1.1.1.1.2.1.7.2.2.7.1.1.1.7.1.5.1.5.1.1.=.1.1.=.5.5.1.1.1.1.1.1.1.1.1.5.3.1.5.7.5.6.1.5.1.5.7.5.1.1.1.8.5.1.5.p.8.4.1.2.5.6.1.5.3.3.1.1.1.6.5.6.7.1.1.7.1.1.5.8.7.1.5.8.5.5.7.5.5.7.1.1.3.7.5.=.8.5.1.1.1.&.1.7.1.5.5.5.6.7.5.7.8.1.1.1.7.1.1.5.1.5.1.5.1.5.;.1.1.1.1.1.1.1.1.1.&.1.l 1.1.6 tXtX7.5.1.;.0.M.T.Y.Z.h.8.8.5.1.7.7.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.6.2.1.2.1.6.6.5.1.1.1.5.1.6.1.1.5.1.5.1.1.6.7.6.7.6.6.7.7.5.7.7.5.5.8.7.q.7.5.u.p.i.q.7.5.j.wXZXDXlX-XU.z.Z..X-XwXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX8X$XyXwX.Xm.e.3.s.k.j.a.w.q.0.7.8.8.8.8.7.7.7.7.7.8.8.a.a.0.7.0.q.q.u.0.a.a.g.a.a.a.a.a.d.a.a.f.d.f.d.a.f.d.d.f.f.f.a.d.f.f.f.F.F.f.l.l.f.f.F.d.F.l.f.l.f.g.f.I.P.XXMXPXLXxX!.K.M.T.!.T.x.e =.1.1.1.1.1.1.1.1.1.1.2.7.1.5.1.5.1.5.1.5.7.1.5.6.1.1.6.7.3.1.1.1.1.1.1.1.7.;.1.4.1.3.5.7.5.1.1.1.3.1.7.7.5.5.=.p.5.8.6.3.1.5.5.5.1.4.7.3.1.1.1.1.1.7.5.8.5.u 1.1.1.7.5.5.1.1.1.5.1.3.z l 7.5.3.7.7.5.5.;.3.1.3.1.7.1.5.5.5.5.5.5.7.3.1.1.1.5.3.3.1.5.1.5.1.5.1.1.1.1.;.1.1.1.1.;.1.=.1.1.&.1.1.tXtX1.1.7.s.M.R.K.j.8.4.l 1.1.1.2.2.1.6.2.5.5.5.1.1.1.1.1.1.1.1.5.6.8.p.6.5.5.5.*.5.8.8.5.5.7.6.5.1.1.5.1.1.5.5.2.5.6.7.6.6.7.5.5.7.7.7.7.8.3.4.7.7.u.a.u.7.7.u.i.U.uXDXAX4XT.Z.J.!.-X,XZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX%XeX;X.Xh.3.w.a.j.j.a.8.q.q.q.8.8.8.8.8.i.8.i.7.a.8.8.7.8.u.q.a.u.a.a.a.q.q.q.q.q.a.a.a.g.a.a.a.a.a.a.f.a.f.d.f.k.f.f.f.f.l.l.l.l.n.H.H.l.l.H.H.F.l.l.l.n.n.n.H.I.H.R.yXFXLXSX;XA.n.T.!.W.y.u 6 6 1.=.1.1.1.1.1.5.1.1.1.1.1.5.1.1.1.1.1.1.5.7.5.=.5.1.1.5.1.7.5.1.1.1.5.;.5.5.;.7.5.u.5.5.5.;.1.5.1.1.5.5.5.5.6.1.1.1.7.5.5.5.1.;.5.5.1.1.5.1.1.3.;.;.1.1.5.5.5.:.5.5.:.5.5.5.;.7.3.1.1.5.1.3.5.5.5.5.1.1.1.;.5.5.5.5.7.1.5.5.;.;.5.7.5.5.5.5.5.1.5.1.5.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.l 2.7.tXtX;.5.n.Y.U.j.q.3.4.1.e 1.6.2.1.1.1.6.1.2.l l 1.5.p.5.5.5.6.4.k 3 8 , < < < < < < < < , 2 k c 4.6.p.5.5.7.1.4.7.1.2.7.7.7.6.7.7.6.7.7.8.7.3.0.a.7.7.q.q.7.7.g.u.1.a.oXNXAXlXW.N.z.~.=XeXZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgX&XeXwXE.w.;.q.d.k.a.a.8.8.7.7.a.8.8.i.8.8.8.8.i.7.7.u.8.q.8.a.7.8.8.a.q.8.u.u.g.g.g.i.a.g.g.a.a.g.a.a.a.f.a.f.f.a.d.f.l.l.l.l.l.k.l.l.f.l.l.F.l.F.l.F.l.F.F.l.F.l.F.F.L.J.XXmXPXJXdXE.K.U.E.!.z.6 7 1.1.=.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.3.5.1.5.1.5.3.5.1.1.5.1.5.1.5.5.5.3.1.5.5.1.5.5.5.1.5.1.5.5.5.1.1.5.5.1.5.1.1.5.1.5.3.5.1.1.5.3.5.3.7.1.5.1.5.1.5.1.1.1.5.1.5.1.1.5.5.1.1.5.3.5.1.5.1.5.1.5.1.5.5.1.1.5.5.1.5.1.5.5.1.1.1.5.1.1.6.1.7.2.1.7.1.1.1.1.1.u 1.=.2.1.1.1.1.1.7.3.tXtX0.l.L.K.h.x.5.1.1.1.1.1.1.1.1.1.1.1.1.1.4.l u 5.p.i.7.l 8 : : < > 0 j j v m m j j g 0 > : : < 5 6.i.5.=.2.4.5.7.7.7.7.5.6.7.6.7.6.7.8.8.7.7.8.7.8.8.8.7.8.a.q.7.u.u.Z.eXZXNX-XN.z.T.XXeXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX&XeXrXM.q.3.s.k.a.a.a.8.8.7.7.i.i.7.8.8.8.8.8.a.7.8.7.7.8.7.7.a.a.7.8.8.i.a.a.q.u.a.g.q.g.a.a.a.a.a.a.a.a.f.d.f.d.f.d.d.d.d.f.f.d.l.l.F.F.f.l.l.l.l.l.l.l.l.l.l.l.k.F.F.F.H.n.A.4XFXLXmX.XT.~.Q./.Z.3.u 2.2.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.5.3.3.5.1.5.1.5.1.1.1.5.5.1.1.7.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.3.1.5.1.5.1.1.1.5.5.1.5.1.5.1.5.3.1.1.5.1.1.5.5.1.1.7.1.5.1.1.1.5.7.1.5.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.6 6 1.7.7.1.tXtXJ.J.l.g.7.5.1.1.1.1.1.1.1.1.1.1.1.1.c 1.5.5.5.z c : : < , b Z./.>X,XeXdXdXdXdXaXaX6X,X$XS.Z.b : $ < x 6.5.8.7.6.6.2.6.7.7.6.6.7.7.7.8.6.7.7.8.8.7.8.a.7.8.a.a.8.u.a.q.r.-XvXZXeXA.z.T.-X,XAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMX>XyXrXm.e.3.w.l.f.q.u.i.7.7.7.7.7.q.8.7.8.8.8.7.8.7.7.u.7.7.i.8.7.7.a.8.q.a.8.i.u.a.a.a.a.a.a.a.a.d.a.a.s.d.a.a.f.a.f.d.f.f.l.f.f.l.d.l.f.f.l.l.l.F.l.l.l.l.l.l.k.l.l.l.F.F.F.l.J.B.oXAXLXAXeXT.Y.E.-XU.1.6 =.e 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.3.5.1.5.1.5.1.5.3.5.1.5.5.1.5.3.5.1.1.5.1.5.1.5.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.5.3.5.1.5.1.5.1.5.1.5.1.1.5.1.5.5.1.7.1.5.1.5.1.1.5.1.5.3.5.1.5.1.5.1.5.7.1.5.1.5.1.5.1.5.1.5.1.1.5.5.3.1.3.1.5.7.1.1.1.1.1.1.1.1.e =.=.1.7.7.3.1.7.tXtXJ.l.7.;.1.1.1.1.1.1.;.1.1.1.1.1.1.1.=.5.p.6.l , $ > j C.2X1X<XeXdXdXdXdXsXlXxXhXfXfXlXxXfXdX3X#Xn $ : 5 6.6.5.7.7.5.7.6.7.1.6.7.7.6.8.8.7.7.7.8.8.8.8.7.8.a.a.a.i.u.d.i.i.U.yXZXfX Xz.Z.-XdXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBX4XeXrXk.;.q.f.k.a.7.u.q.7.7.7.7.7.u.7.8.7.8.8.8.8.7.8.7.7.7.7.7.7.i.7.7.7.i.7.8.a.q.u.q.u.g.q.g.a.a.a.a.a.g.a.d.a.a.d.a.f.d.d.d.d.d.f.d.f.l.f.f.F.f.l.l.l.k.l.l.l.l.l.l.l.l.F.F.F.F.H.v.R.xXJXDXyXR.Z.T..XE.4.5 1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.5.1.5.1.5.3.5.1.5.1.5.1.1.5.1.5.1.5.5.1.5.1.5.1.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.1.7.1.5.1.5.1.5.5.3.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.7.1.5.5.1.5.1.5.2.1.1.1.1.1.1.=.1.1.1.1.;.6 1.7.8.1.1.q.l.tXtXa.3.;.1.1.1.1.1.1.;.&.1.1.1.1.1.1.1.p.=.l q : : v W.%X>X<X<XiXsXhXmXmXZXAXAXDXSXVXAXCXCXBXjXjXsXcX$X, < l 6.7.2.7.6.2.7.6.6.6.7.6.6.8.8.8.7.7.8.7.8.8.a.8.8.8.8.i.7.p.d.d.a.N.:XNXlXE.k.Y.!.eXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAX4XeXrXl.7.d.a.f.a.7.7.0.7.7.7.5.7.:.7.7.7.8.8.8.p.8.8.7.7.7.7.u.7.8.i.8.7.i.q.8.i.8.a.i.q.i.a.a.8.a.g.a.a.a.a.a.a.a.d.d.a.d.a.f.f.f.d.k.f.f.l.l.f.l.l.l.H.l.f.k.l.l.k.l.f.f.k.l.l.G.G.F.G.l.Z.yXGXGXdXE.M.T..XY.4.7 2.=.2.1.1.1.1.1.1.1.1.1.1.1.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.1.5.1.1.1.1.1.5.2.1.1.1.1.1.e 1.;.e 1.3.8.1.;.q.m.J.uXtX5.1.1.1.;.1.1.1.1.1.5.1.1.1.1.1.1.1.6.r < 9 h W.2X;XrXeXdXzXBXCXAXVXVXVXSXSXSXSXHXFXHXHXHXVXFXDXnXzX2X0 9 x.6.2.5.7.6.7.5.6.7.7.6.7.7.6.8.8.8.8.8.8.8.8.8.8.8.q.q.q.d.i.i.d.a.j..XlXvX=Xz.Y./.sXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXgXdX;Xk.7.a.f.a.u.u.0.0.:.:.5.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.8.7.7.7.i.7.i.a.7.8.a.i.i.u.i.i.a.q.q.g.a.a.a.a.a.d.a.a.f.a.d.d.a.f.a.a.f.f.k.f.l.f.l.l.f.F.l.l.l.F.l.l.d.d.l.l.j.l.l.l.F.I.g.n.eXDXJXlXoXZ.U.E.Y.l e 6 1.1.2.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.1.5.1.7.1.5.1.5.1.7.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.7.1.3.1.1.2.3.5.1.1.1.1.1.=.&.1.3.q.7.3.q.l.m.k.tXtX1.1.1.1.;.1.1.1.1.1.1.1.1.1.1.1.1.6.1 : 8 ^./././.2X9XzXAXAXVXCXCXCXBXCXCXBXCXBXCXCXVXSXHXJXPXJXJXAXZX2X: < i.6.6.7.7.6.6.7.6.6.7.6.6.6.6.8.8.8.8.8.8.7.8.i.i.i.a.a.q.q.a.a.i.i.l.E.kXkX!.U.Y.!.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXdX-Xz.3.a.a.s.a.7.7.7.:.;.7.7.7.7.7.7.7.7.7.7.8.7.7.7.7.7.7.7.7.7.7.8.7.7.7.u.7.7.u.u.i.i.i.8.i.i.i.q.a.i.i.a.a.a.a.a.a.a.a.d.k.a.d.a.a.f.f.f.l.f.f.k.f.f.f.f.l.l.l.l.F.l.l.l.l.j.s.f.l.j.h.d.L.H.n.=XAXGXkXW.A.T.E.U.l 6 6 1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.5.7.1.1.5.1.5.1.7.1.5.1.7.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.7.1.5.1.5.5.5.1.5.5.1.1.5.2.1.7.1.1.1.1.1.1.1.1.1.2.8.5.1.a.J.J.a.7.tXtX1.1.1.1.1.1.1.1.=.1.=.5.2.2.1.6.4.4 $ f Z././.-XbXzXBXCXAXCXCXMXnXnXjXzXjXnXnXnXnXnXnXnXBXBXCXVXHXHXDXBXM O 2.6.5.5.7.5.7.6.7.7.7.6.8.6.8.8.8.8.8.8.8.p.i.a.a.8.8.i.4.9.a.i.G.d.a.r.S.eXuX!.j.U.-XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXeXuXz.3.q.r.q.8.7.7.7.7.7.7.7.7.7.5.7.7.7.7.7.7.7.u.7.7.7.i.a.8.8.8.8.8.u.u.u.u.u.7.u.7.8.i.i.i.8.8.a.u.i.i.a.a.a.a.a.a.d.a.a.a.a.a.a.a.a.h.k.k.k.d.d.f.k.k.d.d.f.f.f.l.l.k.l.l.k.f.f.k.l.l.f.d.H.l.d.L.XXAXJXsX XA.R.!.Z.l 5 2.1.=.2.1.1.=.1.1.1.1.1.2.3.1.1.1.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.7.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.3.1.1.3.1.5.7.1.1.1.1.1.1.2.=.1.6 6 1.q.5.;.a.n.l.s.7.1.tXtX1.1.1.1.1.1.1.1.1.1.5.=.1.l 8.1.1 # c Z.~./.>XhXBXAXCXBXnXzXhXhXzXcXgXjXhXhXcXhXhXjXhXjXjXjXzXBXBXSXSXHXjX$ , 4.p.5.3.1.8.6.6.7.6.7.8.8.8.6.8.8.8.8.8.8.8.q.8.8.8.8.a.i.a.a.a.a.a.k.k.T.eXeXW.j.T.bXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXyX:XN.e.q.t.a.0.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.8.7.7.8.7.8.8.8.8.8.8.8.8.i.i.7.5.7.7.7.7.u.7.:.5.u.7.u.7.7.u.q.a.a.a.a.g.l.d.d.a.d.d.a.a.a.a.f.l.l.l.l.l.f.f.d.d.d.k.k.l.f.l.l.k.l.F.l.l.l.d.F.l.W.ZXGXdXW.T.Y.!.z.l e e 6 6.1.1.;.1.1.1.1.1.3.2.5.6.4.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.7.1.5.1.5.1.5.1.1.5.1.7.1.5.1.1.5.1.1.1.1.1.1.1.1.1.1.2.1.6 ;.7.8.;.3.a.k.l.a.0.1.1.tXtX1.1.=.1.1.1.1.1.1.1.1.5.1.1.4.< 9 b Z.S./.bXZXAXBXnXjXjXhXhXjXjXjXjXcXjXjXjXgXhXcXhXhXhXzXhXzXjXzXBXCXSXSXC.: 2.p.5.3.1.6.6.7.6.6.6.8.8.6.8.8.8.8.8.8.8.8.8.8.8.a.8.a.a.a.r.a.a.a.k.a.h.W.eXeXT.z.A.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXeXZ.3.q.r.a.q.0.7.7.7.5.5.3.5.7.5.5.7.5.7.7.5.7.7.7.7.7.7.7.5.5.p.7.7.8.8.8.6.6.8.7.8.8.7.5.7.a.a.a.d.l.H.J.J.K.Y.K.J.l.f.a.q.q.a.u.u.u.g.d.d.a.a.a.a.f.f.f.d.d.d.d.f.f.d.d.d.f.f.l.l.l.l.k.f.a.d.d.l.l.f.d.G..XNXJXpXU.~.W.W.y.6 e =.1.l =.1.1.1.1.1.1.1.1.1.3.5.1.1.5.1.5.1.7.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.5.1.5.1.3.1.5.3.1.1.1.7.1.1.1.1.1.1.&.2.1.7 1.8.7.;.7.l.l.a.7.3.;.1.tXtXu 1.1.1.1.1.1.1.1.1.1.1.=.2.< : h A.A.%XkXZXBXzXjXgXhXcXhXhX7X9X6XhXzX7X1X9XaXhXcXhXjXhXhXhXjXzXzXjXBXCXHX8X, e p.5.7.5.6.4.6.7.8.7.8.6.8.8.8.8.8.8.8.8.8.8.8.a.8.a.8.i.8.a.a.h.a.j.j.q.t.E.rXrXR.z.W.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXdXE.0.w.r.w.8.7.7.5.5.7.1.5.7.7.5.7.7.5.7.5.5.7.7.7.7.7.7.7.7.7.8.8.7.7.7.5.6.6.8.8.8.8.8.a.f.H.J.J.Y.T.T.T.T.Q.Q.Q.!.!.XXXX!.Q.Q.K.m.f.d.q.u.0.a.f.a.d.f.f.a.a.f.d.d.d.f.d.d.d.f.f.k.l.l.f.f.d.d.f.f.d.d.f.d.G.b.oXAXGXwXY.R.!.~.q.5 l 1.1.;.1.1.1.1.1.1.1.6.2.1.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.5.1.7.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.=.1.1.7.3.7.k.m.j.7.3.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.1.3.p + , D.Z.%XsXBXCXjXcXcXcXcXcXjXjX*X@X@XaXjX*X@X$XaXhXhXhXhXhXhXhXhXjXjXzXmXBXSXBXv e p.5.1.1.6.6.7.7.7.7.8.6.8.6.8.8.8.x.i.p.8.a.8.8.8.a.q.a.a.a.a.a.h.a.h.k.a.k.~.=X=Xz.z.eXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXdX=Xw.7.h.q.8.7.7.3.;.5.5.7.7.5.7.7.5.3.7.5.5.5.5.7.7.7.7.7.7.7.7.7.7.7.7.5.7.7.7.8.h.k.z.z.J.K.K.K.K.K.P.R.R.R.R.T.Q.Q.Q.Q.Q.XX+X+XXXXX!.Q.K.v.s.g.g.a.a.a.a.f.f.k.d.a.a.d.f.f.k.f.f.k.f.k.k.f.d.l.l.l.d.a.f.f.G.n.e. XNXDX-XT.A.!.Y.4.l 1.=.1.1.1.1.1.1.1.1.1.7.1.1.6.1.7.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.7.1.7.1.5.1.5.1.5.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.7.5.1.5.5.1.1.7.1.1.1.1.1.1.1.1.1.1.2.=.6 ;.3.7.;.3.f.H.j.7.1.1.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.6.p + < v Z.W.lXZXjXcXcXhXcXaXaXcXzXnXzX*X@X<XaX1X2X9XcXxXhXfXhXhXhXhXhXgXjXjXjXBXBXSXdXtXtXtXuXtXtXtXtXtXtXtXtXdXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXwXb.a.k.q.8.7.7.5.5.:.5.5.5.7.1.5.5.5.5.5.5.5.5.1.7.5.7.7.5.5.7.7.7.5.5.7.7.8.a.f.j.k.l.n.m.n.n.M.K.L.P.P.R.R.R.T.Q.oXoXoXXX!.XXQ.!.oXXXXXXX+XXXQ.L.w.f.f.f.a.f.f.f.f.d.f.f.f.f.f.f.d.f.f.f.f.f.k.f.d.f.k.k.l.f.g.f.f.a.=XDXNX.XZ.R.!.Z.1.e u 1.l 1.1.1.1.1.1.1.6.1.4.5.5.1.5.1.7.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.7.1.5.1.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.7.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.5.1.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.=.1.8.7.7.s.n.l.0.1.1.1.1.1.1.tXtX1.1.1.1.1.1.1.1.1.1.1.=.: o b U.W.aXmXhXaXfXcXiXcXcXaXcXcXjXmXaX%X2X9X*X*XaXcXaXhXhXhXhXhXhXhXhXjXzXjXjXBXAXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXtXtXtXtXtXdXdXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXsXZ.7.d.l.q.7.7.7.1.7.7.5.3.5.7.7.5.3.5.3.5.1.5.1.7.7.5.7.5.5.7.7.5.5.3.5.7.8.a.j.v.n.n.n.n.n.n.n.n.K.K.K.P.R.R.R.oXoXXXXXoXXXXXXXoXoXoXXXoXoXoXoXXXXXXXR.H.f.s.g.a.f.f.f.d.f.d.d.d.d.l.f.d.d.f.k.l.f.a.d.l.l.f.f.v.f.G.F.k.,XGXlX XZ.T.E.h.6 6 =.1.1.1.1.;.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.7.1.5.1.5.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.7.1.1.5.1.1.5.1.1.1.1.1.1.1.1.1.1.1.6 1.7.8.7.q.l.l.0.5.;.1.=.2.2.1.tXtX1.1.1.1.1.1.1.1.1.1.5.&.# % v U.eXMXaXsXkXsXsXiXcXaXsXfXaXcXBXjX9X1X<X1X<XhXhXhXsXsXsXsXfXfXfXhXjXjXgXjXBXZX%X6 u.5.3.7.5.5.6.7.7.7.6.7.8.6.8.8.8.8.8.8.8.q.8.a.8.8.8.a.q.h.i.h.h.a.a.d.F.d.a.j.B.E.E.Y.y.1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX-Xz.a.f.q.7.7.7.1.1.6.3.5.3.5.5.1.5.1.5.7.7.7.7.7.5.6.3.7.5.5.3.5.5.5.5.7.a.f.f.f.f.k.l.l.f.n.J.J.J.K.K.K.R.R.R.Q.oXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXwXXXT.v.g.g.v.f.a.a.d.a.F.f.d.d.d.f.d.d.F.l.f.d.G.G.d.f.d.f.f.s.f.a.R.uXGXyXT.K.T.~.x 5 2.1.l u 1.;.1.1.1.1.1.1.1.1.1.1.1.6.1.1.7.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.1.1.1.1.7.1.1.1.1.1.1.;.5.;.;.1.=.r 6 7.r.;.7.n.n.i.8.7.1.1.1.1.1.1.tXtX1.1.1.1.1.1.1.1.1.=.2., + 4.y.2XlXfXsXsXcXsXaXsXaXaXaXaXgXgXcXBXaX6X*X*XaXsXaXfXhXhXfXhXcXfXfXxXhXgXjXjXBXvX~.5.8.7.i.7.7.6.6.6.6.6.2.2.8.8.6.6.8.8.8.8.8.8.8.x.8.i.8.h.i.8.i.h.i.h.h.k.f.k.f.f.f.K.Q.!.t.V.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX$XZ.h.a.w.q.7.7.1.1.3.7.5.3.5.3.1.5.1.5.7.7.7.1.1.7.7.6.7.1.5.3.3.:.7.7.7.a.s.a.a.a.h.j.n.l.n.H.H.J.K.K.K.U.R.T.T.oXXXXXXXXX+XXX+XrXwX+XXX+XXXXX+XXXXXXX+XXX+XrX+XQ.n.,.a.k.l.d.a.f.F.d.f.d.G.d.f.d.l.d.f.f.f.d.d.f.d.d.a.f.s.s.T.lXDX-XZ.U.~.Y.l e 1.1.1.1.1.1.1.1.1.1.1.6.1.6.7.2.1.1.1.1.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.1.7.1.5.1.7.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.5.;.1.1.1.1.1.1.1.1.1.1.1.1.;.3.1.1.=.e 1.8.7.3.a.l.a.7.7.1.1.1.1.1.1.1.tXtX1.1.l 1.2.1.=.2.=.1.l < @ y.W.<XlXsXsXsXcXsXsXaXsXsXpXaXcXgXgXmXcX<X*X>XaXfXsXhXsXhXfXhXfXfXcXcXhXjXjXjXzXlXl.8.a.8.i.7.i.8.6.5.1.6.8.8.8.8.6.7.7.8.x.8.8.8.i.8.8.x.8.h.q.h.8.a.i.h.k.k.f.d.d.l.f.n.Y.Y.U.y.$XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXeXZ.h.k.h.3.3.7.3.1.7.1.7.7.1.1.5.5.1.7.1.6.7.7.5.7.7.6.6.5.5.5.5.5.7.0.a.a.a.q.q.q.s.f.j.f.l.n.n.H.J.K.K.P.U.T.T.oXXXXXXXOX,X,XwXwXwXwX+XwX+X+X+XwXOX+X+XwXwXXXXXwXwX+XQ.f.7.s.l.f.a.d.d.f.d.f.f.d.f.f.d.G.l.d.f.d.d.d.d.d.l.l.a.k.W.DXvX XA.T.!.r.l l 1.6 1.1.1.1.1.1.1.1.1.1.1.1.6.1.1.1.5.5.1.5.1.7.1.5.1.5.1.5.1.5.1.7.1.5.1.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.1.5.1.1.1.1.;.1.1.5.1.1.1.1.1.1.;.1.1.1.6 =.8.7.1.a.l.k.7.3.1.1.1.;.1.1.1.1.tXtX1.1.1.1.2.1.1.1.1.1.e : $ ^.$XbXkXiXaXcXsXsXaXsXaXsXaXaXgXaXgXjXgX4X$X1XaXaXfXhXaXaXhXaXfXfXcXfXhXgXgXmXzX-X7.8.a.a.a.q.h.a.8.7.5.7.7.8.7.6.7.7.6.8.8.8.x.i.8.x.i.8.a.8.x.a.i.h.h.h.k.a.a.k.f.f.s.j.K.Y.!.k.z.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX~.z.h.h.q.3.3.1.1.5.1.5.7.7.1.5.1.1.5.1.5.5.1.5.7.1.5.1.1.1.1.1.5.7.q.0.a.a.s.q.u.q.s.a.l.l.n.n.H.J.J.K.U.U.R.R.E.oX.XXX=X+X+XwXwXwXwXwXwXwXwX4XwXwXwX4X+XwXwXwXwXXXXXwXwXXXK.w.s.l.d.g.d.d.d.d.f.d.G.d.F.d.d.f.d.d.d.d.f.d.f.k.f.j.k.rXDXyXW.M.~.U.3.6 1.1.2.=.1.1.1.1.1.1.7.2.1.1.1.2.3.2.1.1.5.1.7.1.5.1.5.1.7.1.7.1.5.1.5.1.7.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.1.1.5.1.1.1.1.1.1.1.1.l 1.1.1.1.6 &.6.8.3.7.l.m.h.3.1.1.1.1.1.e 1.1.1.tXtX1.1.=.1.1.1.=.6 e 1.6 $ < ^.2X1XdXiXaXdXaXsXiXaXpXsXaXpXaXaXgXjXhX<X#X1XfXaXaXhXaXfXaXfXcXcXfXhXhXhXsXNXkXz.5.a.a.q.a.a.a.a.a.a.8.7.7.7.6.7.6.6.8.8.8.x.8.8.8.8.8.x.8.h.8.a.8.h.h.i.a.h.a.a.a.d.s.w.l.K.~.J.k.W.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX,XY.h.h.8.8.7.7.1.1.3.5.3.1.1.5.1.5.5.1.5.1.1.7.5.5.7.5.7.1.1.1.7.u.u.q.q.q.s.s.s.g.g.a.f.j.l.l.v.H.H.K.K.P.R.T.T.oXXXXX=X;X+X4XwXwXwXwXwXwXwXwXwXwXyXyXyXwXwXwXwXwXwXwXwXXXwXrXT.s.q.g.d.d.f.d.d.d.d.d.f.d.d.d.d.f.d.d.d.G.d.d.f.d.f.a.J.lXZX;XZ.Y.E.h.l 6 2.2.=.1.1.1.1.1.1.1.1.6.1.1.5.1.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.1.5.5.1.5.1.1.1.7.1.1.1.1.1.1.2.=.6 6 1.1.a.7.7.a.m.l.7.1.1.1.1.1.1.1.;.1.1.tXtX=.;.1.1.1.=.=.=.=.=.6 $ < S.2X1XdX7XaXaXaXdXaXaXaXaXiXiXaX7XgXjXgX1X#X1XhXfXaXfXfXsXgXaXsXsXaXhXhXhXNXlXR.3.7.q.0.q.f.a.a.a.f.a.a.q.7.7.8.8.6.6.6.8.8.8.8.8.8.i.8.i.8.8.h.a.8.a.r.a.a.a.f.d.a.d.f.k.f.m.J.J.F.q.zXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXW.k.h.r.q.8.1.5.7.1.7.1.1.1.1.1.5.1.1.5.1.5.1.1.1.5.1.1.1.1.5.7.u.q.a.u.g.q.0.0.g.g.g.s.f.f.l.l.n.n.H.K.Y.P.R.R.oXoXXXXXXXwX+XwXwXwXyXeXyXyXyXyXuXyXyXuXuXuXuXwXwXyXyXyXwX;XXXwXrX!.J.a.d.f.g.d.d.d.f.d.d.f.f.d.d.d.f.g.d.G.f.f.l.l.f.g.s.E.vXvX XM.R.U.8.e e =.=.=.1.1.1.1.1.1.1.5.4.1.6.3.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.1.5.1.7.1.7.1.5.1.5.1.7.1.5.1.5.1.5.3.5.5.1.5.1.5.;.1.1.1.1.1.1.1.1.1.2.=.=.;.1.7.q.;.0.l.l.8.1.1.1.1.1.1.1.1.1.1.1.tXtX1.1.e ;.1.l 1.=.=.=.e : $ W.2X9XdX7XcXdXaXaXiXaXaXaXiXaX7XaXaXjXaX*X$X1XaXaXaXfXhXaXhXsXcXfXaXhXhXhXfXE.4.7.g.q.0.w.a.f.s.a.s.f.f.f.a.g.x.8.8.8.6.6.6.6.8.8.8.8.8.8.x.a.8.h.h.h.a.x.a.h.a.f.f.f.k.F.l.l.K.M.M.a.E.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1XV.0.t.9.4.7.=.p.1.2.5.5.1.1.;.1.5.3.5.1.5.3.5.5.1.5.1.1.5.5.7.7.a.q.q.7.q.g.u.q.g.g.0.g.f.j.l.l.n.n.H.K.K.R.R.T.Q.oXXXXXwXwXeXeXuXuXyXyXyXuXuXyXyXyXyXyXuXyXyXuXyXOXgXyXyXyXOX;X;XuXwXI.s.g.f.f.d.d.d.d.d.d.d.d.d.d.d.d.G.d.G.d.d.d.a.H.s.r.;XNXwXR.K.T.h.e 2.=.2.2.;.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.1.;.1.5.3.1.1.1.1.1.=.=.=.1.1.7.5.:.s.n.a.1.1.1.6 1.1.1.1.1.1.1.1.tXtX1.1.&.1.=.1.1.=.=.=.l < O V.2X*XbX7XaXaXaXaXaXaXaXsXiXiXaXaXaXjXpX>X$X*XaXaXaXsXfXsXhXhXhXfXhXhXfXiXA.z 3.i.0.q.a.g.g.a.s.a.s.f.f.f.f.f.q.i.7.7.7.7.7.8.7.8.8.8.8.8.i.8.8.a.a.a.h.h.a.h.f.a.f.a.d.d.f.j.b.K.n.s.l.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXT.j.h.r.7.4.7.6.2.1.1.5.3.3.1.3.1.5.1.3.1.5.1.1.1.7.1.1.;.;.0.0.0.0.0.7.g.7.q.q.g.s.s.s.f.f.j.s.s.l.J.J.K.R.T.T.T.T.!.XX;XwXwXwXyXwXyXuXyXyXuXyXuXuXuX4XtXuXtXtXuXuXuXuXtXtXOXyXwXXXXXuXwXB.e.a.s.a.d.i.g.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.a.J.uXvX XZ.Y.R.6.6 =.2.2.1.1.1.1.1.1.1.1.1.1.1.1.2.5.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.7.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.;.1.;.1.1.1.5.3.1.1.1.1.e e 2.e 2.x.8.1.0.f.j.7.1.1.1.1.1.1.1.1.1.1.1.1.tXtXl 2.l 2.=.e e l e e w 1 + f *X*X9XaXaXpXaXsXiXiXsXdXiXdXaXiXcXjXjXgX4X6XpXfXpXsXxXfXsXsXsXsXfXeXW.y.1.5.i.p.7.u.q.g.s.s.g.s.a.a.f.f.f.f.f.f.g.5.7.a.6.5.i.i.8.8.x.x.i.i.r.h.p.i.k.k.8.q.w.q.a.a.d.f.k.n.l.J.K.J.a.=XKXKXPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX7XN.s.h.q.7.4.6.1.5.7.1.1.1.1.5.1.1.3.1.1.1.3.1.1.6.3.1.1.1.7.0.q.7.q.0.0.0.q.g.0.a.s.s.a.a.j.n.n.n.n.H.J.H.K.U.T.T.!.!.XX;X;XwXwXyXyXwXuXuXyXyX4XtXuXyXtXtXtXtXtXuXuXuXuXuXyXyXyXyXuX+XwXwX;XR.q.q.d.q.G.G.g.d.d.d.d.d.d.d.d.G.d.d.d.d.f.d.a.f.a.E.lXyXR.U.R.z.=.=.=.2.1.1.1.1.1.2.1.=.5.=.1.5.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.1.1.5.5.5.1.5.3.3.1.1.1.=.2.=.=.=.2.8.3.3.q.a.s.7.1.1.1.1.1.1.1.1.1.l l =.tXtX1.=.1.e 2.e e l e w w w : < S.*X1XiXbX9XiXsXaXpXsXsXsXaXaXgXhXcXzXzXhXcXpX6X6X1X2X%XS.S.A.Z.V.q.z l 1.5.i.u.i.q.q.a.g.a.g.a.s.s.f.s.f.f.H.H.f.7.8.a.7.8.8.8.8.6.6.4.1.1.4.4.r.k.i.p.k.k.j.q.s.f.f.s.k.s.f.m.Y.J.a.m.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXS.w.s.e.8.4.2.2.2.1.1.1.5.1.3.1.5.1.5.1.5.1.5.1.1.5.1.1.5.7.8.0.q.g.g.7.q.g.q.q.q.0.a.a.s.s.s.f.l.n.J.J.K.P.K.U.R.T.!.oXXXXXXXXXwXyXuXuXuXyXyXuXyXtXtXtXtXtXlXtXgXuXlXuXlXuXuXtXuXuXuXyX+XXXuXuXQ.0.s.f.i.i.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.a.d.f.u.l.rXlXXXM.Y.Z.6.e =.1.=.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.7.1.5.1.5.1.5.1.7.1.7.1.5.1.5.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.5.5.1.;.1.1.1.;.:.5.1.1.2.2.=.e r =.8.8.3.8.a.a.7.1.1.1.1.1.1.1.1.1.1.1.1.l tXtX1.l 1.2.=.=.e l e w 2 e e < ^.>X*X9XaXiXpXpXsXaXcXaXiXaXaXaXcXcXcXsX6X2XS.V.v b q q 4 3 3 w 6 e l 1.8.8.7.7.7.u.0.s.s.s.s.a.s.s.f.f.k.j.H.v.f.f.a.8.7.8.8.4.4.4.4.y.Z.V.9.h 3 z r.k.k.d.d.a.a.w.f.f.j.f.a.l.J.K.l.u eXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXy.j.j.e.4.3.1.1.1.1.1.1.1.1.1.1.1.5.1.5.5.1.1.7.1.1.1.3.5.0.a.0.q.q.u.g.q.q.q.g.q.a.s.a.a.s.s.f.l.l.n.n.n.K.K.R.R.T.R.T.L.H.a.e.s.R.XXwXtXtXtXtXtXgXuXuXtXtXgXtXtXlXlXtXlXtXtXuXuXuXuXyXwXwX+XuXuXR.e.q.d.i.a.a.d.d.d.d.d.a.d.d.d.d.d.d.d.a.l.d.d.a.U.uXwXT.U.R.h.2.e 1.;.1.1.1.1.1.1.1.5.=.1.1.6.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.1.1.5.5.;.1.3.1.1.l =.=.=.e 1.q.7.1.q.h.q.3.1.1.1.1.1.1.1.1.1.1.=.1.l tXtXe 1.=.e 2.e l e e w 7 =.x.3 c S.1X7X6XiXiXaXsXsXaXgXgXaXhXhXgXiX2XC.v q q q 0 q h 3 k l 2.5.5.=.6.6.7.4.4.q.u.0.s.s.g.s.s.f.f.f.f.k.l.l.f.f.f.n.l.a.7.e.z z r.A./.;XeX9X1X@Xv p 4 e.k.k.i.d.a.a.a.a.j.f.a.f.l.K.U.3.m.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX%Xe.z.q.3.3.1.3.2.5.1.1.5.5.3.5.3.1.3.1.1.1.1.1.1.1.1.1.7.7.a.s.0.g.q.q.q.g.g.q.q.g.s.a.s.f.j.l.j.l.n.n.m.K.K.K.K.m.b.w.w.5.;.l i i 1.8.N.oX;XuXkXuXuXtXtXtXlXuXlXlXtXgXtXgXlXlXlXuXuXtXuXuXyX;XXXeXeXM.,.a.F.d.d.d.d.d.d.a.a.d.d.d.d.d.d.d.d.d.k.F.a.z.XXuX.XZ.Y.Z.4.6 1.1.=.l 1.1.1.=.1.5.1.5.1.1.5.1.5.1.5.1.5.1.7.1.5.1.5.1.5.1.5.1.5.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.1.5.1.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.5.1.5.1.1.1.1.1.;.1.1.1.1.1.e 1.1.7.8.5.;.s.a.7.1.1.1.1.=.1.1.1.1.e ;.1.l =.tXtX1.1.l 1.2.r e e w e e =.2.2.w y.$X6XiXiXiXaXsXsXfXgXaXfXhXaX%X^.h q 0 q q q h k k c l 1.5.5.5.p.6.7.6.7.4.7.7.u.q.a.a.a.g.a.s.a.j.f.f.l.n.f.f.n.H.n.n.4.x Z.%X<XsXfXhXjXjXjX8X@Xh , 3.z.k.i.d.j.w.a.k.f.j.f.k.J.M.m.1.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXZ.h.h.3.3.3.3.1.4.6.2.1.1.1.1.1.5.1.5.3.1.1.3.1.1.;.3.5.0.a.s.a.g.q.g.q.q.q.q.q.g.q.w.s.s.s.f.f.f.l.n.n.J.m.l.r.4.4.l l z k , : $ : , k 3.e.c.R.wXuXNXgXuXgXuXtXtXlXtXtXlXlXlXlXlXlXlXlXgXuXuXyXwX;XeXwXB.:.i.d.i.d.d.d.d.d.a.d.d.d.d.d.d.d.l.u.G.G.d.k.m.wXXXU.Z.Z.q.l =.1.1.;.1.1.1.1.=.1.=.5.=.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.3.5.5.1.5.3.5.1.5.3.5.1.5.3.5.1.5.1.5.1.5.3.1.1.1.1.;.5.1.5.;.1.1.1.1.=.=.=.1.8.7.3.q.a.8.7.;.1.1.1.=.1.1.1.;.1.;.1.1.1.tXtX1.e l =.2.l e e e e l 1.6 1.=.l ^.%X9XaXaXaXaXhXhXfXxXsX$Xv 3 1 q q h c w w w c l l l 3.1.5.5.=.1.5.5.7.7.7.8.q.q.a.a.a.s.s.s.f.f.l.s.f.H.F.f.f.H.H.n.b V.%X1X6XjXBXSXSXSXSXVXmX<Xj , 4.k.i.d.h.q.f.f.f.l.f.a.n.b.Y.7. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xw.l.i.4.3.3.1.3.7.6.5.1.5.5.1.3.1.1.3.1.1.1.5.7.3.;.;.5.0.a.a.q.q.q.a.q.q.g.a.q.q.q.a.a.a.f.j.s.l.f.l.f.0.7.1.1.2.z l 6 8 + X X + 8 u 3.,.e.B.OXuXgXtXlXtXtXlXlXlXlXMXlXlXlXmXmXlXlXlXuXuXuXwXwXuXwXl.u.G.d.i.d.d.g.d.a.d.a.d.i.d.d.d.a.d.G.d.F.a.j.oXwXT.Z.U.r.1.1.6 1.1.e 1.;.1.1.1.1.1.5.2.5.1.5.1.7.1.5.1.5.1.5.1.5.1.7.1.5.1.5.5.1.5.1.5.1.5.1.5.1.5.3.5.1.5.1.5.1.5.3.5.1.1.1.5.1.5.1.5.1.5.1.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.1.5.5.1.;.5.1.1.1.1.1.1.1.;.e 1.2.e 6.8.;.3.f.s.7.1.1.1.1.=.=.2.u 1.1.=.1.1.e e tXtXe 1.e 1.=.=.e e 5 e c l 2.&.5.=.w x C.$XiXsXhXxXhXdX$Xc.k q q w w h k w k w c c 1.1.l 1.1.1.1.1.2.7.p.i.i.u.q.7.q.g.g.a.g.s.a.s.f.f.s.f.f.l.n.f.H.v.,.y.S.>XsXBXSXSXSXHXJXJXJXHXAX7Xj , r.F.i.k.a.j.s.a.l.a.a.l.N.J.F.4.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXE.q.e.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.1.1.1.7.1.1.;.7.a.h.a.a.h.s.w.a.s.q.a.s.s.a.s.s.0.w.g.s.v.s.0.3.3.1.l c c h , $ O . . . . X + , i 3.7.i.U..XeXlXlXlXgXlXlXlXlXlXMXmXxXxXlXxXlXsXdXyXuXXX+XuXXX8.8.d.i.G.d.a.a.a.a.a.d.d.d.d.k.a.f.k.a.f.a.d.M.rXXXZ.U.J.7.;.1.1.&.6 1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.7.7.1.7.1.7.4.2.1.7.1.2.4.2.1.4.2.4.8.3.1.1.1.l 1.3.1.4.1.3.1.1.1.1.8.6 1.6.7.1.7.1.8.3.1.4.1.4.4.7.5.1.1.1.1.;.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.5.1.&.=.1.6 &.7.7.1.8.a.8.1.1.1.1.1.1.2.1.1.=.=.e 1.=.1.e tXtXl =.1.e 2.e 6 e 1.1.2.1.1.1.1.1.6 l e x ^.W.W.S.D.x.c q q w k w k c i u u ;.;.1.1.2.l l u i 3.x.1.7.7.7.8.h.d.i.7.s.a.g.g.q.g.s.s.s.s.f.s.l.F.l.c.z i Z.%XsXAXVXVXCXBXCXVXVXSXHXJXSXcXt , 9.e.j.f.a.j.d.f.d.f.k.n.K.n.3.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXNXz.h.e.4.1.1.1.1.1.1.;.1.1.1.1.1.1.1.1.1.1.3.1.1.;.1.3.q.f.f.w.a.h.s.s.s.s.s.a.a.s.a.a.a.g.g.g.0.0.:.3.z x l k , : @ o O @ % % > > % % O o o . + < 3 l &.5.k..XyXkXlXlXmXmXMXmXNXmXxXmXzXNXxXlXlXtXyXwX;XwXeXY.1.d.d.p.i.G.a.a.a.a.d.d.d.i.f.a.a.a.a.f.k.d.l.XX=XY.Z.K.a.1.6 1.1.l 1.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.7.1.2.1.7.2.1.1.1.1.e 7 1.1.4.l 4.1.e l u 1.7.l u 3.1.3.3.1.3.1.l 1.l 8.1.1.2.1.e 2.6 1.l 5 1.l l l 6.1.1.1.5.1.1.1.5.5.1.5.1.5.1.1.1.1.1.1.1.1.1.1.6 e =.e 1.7.7.3.a.a.7.1.1.1.1.1.1.1.1.2.1.1.1.1.e =.l tXtX=.l =.l l e e e 1.1.1.1.1.1.1.1.1.1.1.e w w w w q w w w c w c k r =.=.2.1.l l 1.p.p.6.6.7.5.4.8.4.;.5.7.7.:.p.a.a.q.a.s.d.q.g.s.f.f.s.a.h.l.G.k.v p p Z.<XBXCXBXmXmXnXnXnXnXBXCXVXHXSXcXp 4 t.l.d.a.k.a.a.j.k.k.G.K.K.7.W.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<Xr.h.w.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.a.f.f.a.a.j.a.a.s.s.f.f.a.q.a.l.l.d.q.u.7.u z z k , < : & @ % 0 g m M C.C.C.C.m j g % % o . . O $ e l 1.1.s.!.uXlXlXmXMXMXNXNXBXBXzXZXNXxXxXlXtXyX;XXXuXrXk.i.d.p.g.F.i.a.d.d.a.d.d.d.d.a.a.f.k.f.d.j.j.T.XXE.M.U.l.1.l 1.1.&.1.1.1.1.1.1.1.1.1.3.7.1.5.1.7.1.1.7.7.1.6.1.4.2.1.r.r.1.1.8.8.l e l 4.6 l u 6 4.6 u 8.1.4.1.1.7.3.u u 6 4.1.6 7.2.5 8.l l 1.l 1.8.2.l 7.7.1.1.1.1.1.5.1.1.5.1.5.1.1.1.1.1.1.1.1.1.2.1.=.=.1.2.8.7.3.7.h.q.7.1.1.1.1.1.1.1.1.1.e =.1.1.=.1.e tXtXl 1.e l e e e l 1.1.1.1.1.1.1.1.1.1.2.=.e e w w w e l e l l l l 1.5.1.=.2.x.2.2.p.=.5.5.:.7.,.,.,.5.p.k.k.p.a.8.e.e.q.q.s.a.a.a.d.s.f.f.j.d.k.h.i < i S.lXZXzXjXhXhXjXjXjXjXnXnXnXVXHXHX*X< l h.d.d.f.f.a.f.k.f.f.l.Q.f.4.DXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW.h.r.4.l 7.1.1.1.1.;.1.1.1.1.1.1.1.1.1.1.1.;.;.;.1.1.a.a.j.f.s.f.j.f.f.s.f.f.f.s.f.f.a.7.:.;.1.c h p , $ $ $ % g j M /.@X*X9X6X6X7X6X*X*X@XM j f % # o + $ 4 z 1.8.l..XwXxXNXMXNXNXBXZXZXZXmXxXxXlXlXtX;X;XrXrXXX7.p.d.G.k.i.d.g.g.d.g.d.d.d.a.a.f.k.a.f.d.a.l..XXXZ.Y.m.7.1.&.l 1.&.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.1.1.5.7.1.6 1.6.4.e 4.4.1.6 l 8.6 1.l l 3.l u 3.3.3.1.3.4.1.u u 1.2.2.6 4.4.5 8.l l 4.1.l 4.1.7 1.1.1.1.7.7.3.1.5.5.1.5.1.5.1.1.1.1.1.1.1.1.1.1.=.6 1.2.x.7.1.a.h.8.1.1.1.1.1.1.1.1.1.1.=.1.l 1.=.=.l tXtX1.6 =.e e e e 1.1.1.7.1.1.1.1.1.1.1.=.1.5.1.1.1.2.=.2.2.=.2.1.1.;.;.u =.4.x.6.r t q 8 , < < , 8 w r 2.x.i.i.p.7.a.a.7.a.a.a.s.s.a.f.a.s.j.d.i.a., : v :XxXzXcXjXjXcXjXjXjXjXjXnXnXnXSXSXFXD.< i.F.a.d.k.k.f.f.l.f.a.L.Y.4.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXZ.z.8.4.1.2.1.1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.7.8.j.k.j.s.f.j.l.s.f.s.f.j.f.s.k.a.3.1.l k 5 < @ O & % % N M |.%X2X<XiXsXkXfXxXhXxXxXhXaXiX*X@XM j f % . . X $ 4 l 1.1.h.E.yXMXmXCXCXAXBXAXZXmXmXxXkXyXwXwXXXwXrXU.5.d.d.g.a.a.a.d.a.d.a.d.d.a.d.f.f.a.k.j.d.d.Q.XXR.U.m.h.1.6 1.1.1.1.5.1.1.1.1.1.1.1.5.1.1.5.1.5.5.3.1.1.1.1.7.6.1.6 1.2.6 1.3.l l l 4.5 2.e 4.1.1.1.1.3.1.1.3.4.1.l 1.8.3.l 5 1.4.5 2.6 1.r.4.l 2.1.l 3.1.1.1.1.1.1.1.5.1.5.1.5.5.1.1.1.1.1.1.1.=.1.1.e =.1.1.8.3.3.a.h.8.1.1.1.1.1.1.1.1.1.1.=.e 1.=.l 1.e tXtXe 1.1.e e e 2.2.1.1.1.1.1.4.1.1.1.1.=.=.1.1.=.1.1.=.1.=.2.=.1.2.:.;.7.c 4 < $ # O O # # # + + + + # + 9 , b l.d.i.i.d.d.i.s.a.a.s.s.a.a.a.i.i.h.< : V.aXhXcXsXzXcXjXjXjXcXjXjXjXnXnXnXVXHXVXh 8 z.d.k.k.k.f.f.k.j.v.F.~.h.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX7Xy.k.q.z 2.=.1.1.3.;.1.1.1.1.1.1.1.1.1.1.;.1.1.1.1.8.h.f.j.f.s.j.j.n.s.l.l.f.f.s.s.7.7.z k , $ o X o @ > j M |.%X,X<XyXiXdXsXlXhXxXxXxXzXmXmXzXzXhX4X&XC.n g % o . X @ , z z 1.s.oXyXZXAXAXCXZXZXmXxXxXkXyXyXwXwXXXwXrXa.7.a.u.i.p.d.i.i.a.d.a.d.a.a.a.k.a.k.f.G.d.Y.!.T.U.m.z.1.1.1.1.6 1.1.1.1.1.1.1.1.1.1.5.5.1.7.1.1.5.1.1.1.7.7.8.x.l 1.4.6 1.7.e l 6 2.6 r.1.4.4.1.u 1.3.1.3.3.3.1.1.4.8.l l i k 4.5 l l 1.4.l 6 1.1.6 1.1.1.5.3.5.3.5.3.5.1.5.1.1.1.1.1.1.1.1.1.l =.1.1.e 1.7.7.1.8.a.q.8.1.1.1.1.1.1.1.1.1.1.1.1.=.1.=.=.l tXtX=.l =.l e 2.l 2.1.1.5.1.5.1.1.1.1.1.1.1.1.1.1.1.&.1.1.=.1.1.1.1.6.l 2 : # # # B d a ! ! s s ! a a d # + o O 8 x h.a.p.i.i.a.a.h.a.a.a.q.i.i.p.h.: : D.aXcXsXfXfXcXjXjXcXjXjXcXnXjXnXjXnXVXPX<X$ x d.k.k.j.f.k.a.j.j.G.P.J.y.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X9.a.8.l 2.2.1.1.1.1.1.;.1.1.1.1.1.1.1.1.;.1.1.1.1.8.h.f.s.s.f.f.f.f.s.j.f.s.f.s.f.;.1.k : X . % f j M |.&X,X,XiXiXiXiXaXgXhXhXzXzXzXzXBXBXNXZXBXBXmX8X*X/.m f % o . O , ;.>.>.f.XXAXSXAXAXAXZXzXlXlXyXeX;X=XXXXXwXK.u.d.i.d.g.i.g.d.g.a.a.d.a.f.d.a.f.k.k.G.k.m.!.!.U.K.z.6.6 1.1.&.l 1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.1.1.1.1.2.6.7.l u 4.6.2.6.4.2.x.l 4.e h.2.1.4.6 u 8.1.1.3.3.3.1.l 2.4.2.4.4.l r.l k 4.4.2.1.l 8.4.6 1.1.1.1.1.1.5.1.5.1.5.1.5.1.1.1.1.1.1.1.1.1.1.=.1.=.1.8.1.1.q.a.8.7.;.;.1.1.1.1.1.1.1.=.l 1.=.1.e e =.tXtXl =.e e e l 2.2.1.1.1.7.6.1.1.1.1.1.1.l l 1.1.1.1.;.1.1.2.2.;.u.> # o # B a W _.[.[.[.[.{.{.{.{.{.[.`.<.a B o O , h.a.8.a.8.a.h.k.a.a.7.7.u.p.w.9 9 V.*XiXfXsXkXjX8XcXcX8XcXjXjXjXjXjXnXBXFXFXM < F.k.k.a.j.k.k.a.w.f.I.Y.e.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX X9.4.4.l 2.2.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.;.3.a.j.j.f.s.l.l.n.n.f.v.f.n.n.a.7.5.4.> X X O % j m C.%X*X,X<XyX3XiXiXpXsXsXhXlXxXxXxXzXmXNXZXAXAXFXSXSXCXnX5X/.j > O X X + < p ;.a.,XDXFXVXZXZXBXxXlXdXeXwXwXXXXXXX+Xd.7.i.k.i.d.i.d.d.a.d.d.d.d.d.d.d.a.a.k.a.f.U.!.U.Z.m.7.1.e ;.1.2.1.1.1.1.1.1.1.1.7.1.5.1.5.1.5.7.5.1.1.2.7.7.8.7.8.8.8.h.8.8.h.8.q.8.h.8.8.8.7.3.3.1.1.1.1.1.3.1.4.7.8.8.r.8.r.8.8.8.8.x.x.6.8.r.7.1.7.1.5.1.5.7.5.1.5.3.5.1.1.1.1.1.1.1.1.1.e 2.=.6 e 5.7.1.3.a.a.3.3.1.1.1.1.1.1.1.e 1.1.1.1.1.1.1.1.1.tXtXu 1.=.1.e 1.1.1.1.1.1.1.5.1.5.1.5.1.1.3.1.;.l 1.1.2.5.:.:.6.q % # # d a E _.{.[.[.[.[.[.[.{.[.{.{.OXOXOX`._.a # X O p h.i.i.h.h.x.i.i.u.5.u.i.7.< : M 1XsXsXcXcXcXcXcXcXjXcX8XcXjXjXjXjXBXBXJXjX> 9.k.d.G.f.s.z.a.j.l.H.Y.a.eXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXR.9.4.z l l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.8.j.j.j.j.j.l.j.n.l.l.v.l.n.l.a.5.1.c @ @ 0 j D./.@X2X>X1XeXeX<XiXdXsXsXhXfXlXxXxXmXxXBXZXBXCXAXAXSXSXFXSXAXjX*XC.g % & . . X + 3 p.Z.xXDXSXSXZXmXxXlXtXyXwXwX+X+XXX+XI.u.a.d.i.d.i.d.d.g.d.d.i.G.d.d.d.a.a.s.g.a.K.T.U.M.M.r.1.l 1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.1.5.1.7.1.1.1.1.1.7.8.1.1.1.1.5.1.1.5.7.7.7.7.7.7.7.7.7.2.6.7.1.1.1.1.5.1.1.1.5.5.7.6.6.7.5.1.7.5.1.1.5.5.5.5.1.1.7.6.7.1.5.1.7.1.5.1.1.1.1.1.1.1.1.=.1.1.6 ;.3.7.3.7.a.a.1.1.1.1.1.1.1.1.1.l 1.1.;.1.=.1.1.1.1.yXtX1.;.e 1.;.1.1.1.1.1.1.1.5.1.5.1.5.1.5.7.1.1.1.3.3.3.1.6.2.8 9 $ B a ! ^ [.[.[.[.[.[.[._.[.[.[.[.Q ].OXOXOXOX{._.a # X < v.,.q.d.u.u.i.u.7.i.7.7.8 + m 6XiXaXsXaXgXcXgXgXcXhXhXhXhXjXzXjXnXnXVXVXm 0 h.k.F.s.w.k.l.l.k.n.U.f..XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXt.9.4.l 1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l l ;.3.a.j.j.l.n.l.j.l.l.n.n.f.l.z.h.7.;.1.8 X & 0 v D./.@X@X2X>X>X1X<XiXiXiXaXaXfXhXhXhXzXjXzXnXBXBXBXAXFXFXFXSXFXFXFXBX8X|.n > # o . . < 6.8.,XZXDXAXZXmXxXlXuXyXwXwX+X+XXX+XoXa.u.d.a.i.d.g.d.d.d.i.G.i.d.d.d.d.a.a.f.a.n.T.R.U.U.r.1.l 6 1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.1.5.7.1.5.1.1.1.1.1.1.1.1.;.;.;.;.7.5.7.1.1.1.1.1.3.5.7.1.1.1.1.1.1.1.1.1.1.1.6.1.1.1.1.1.1.1.1.1.5.1.6.7.5.1.1.5.1.5.1.5.1.5.1.4.1.1.1.1.1.=.2.e 1.;.3.7.3.7.a.q.1.1.1.1.1.;.1.=.1.1.1.1.1.1.1.1.l ;.1.tXtX1.1.1.;.1.1.1.1.7.1.1.5.5.7.2.7.7.1.5.1.1.1.7.3.3.;.2.c 0 # B d E Q _.[.[._._._._._._._._._.)._._.[._.].].OXOX{.{.).# + $ w.0.g.f.,.7.8.8.p.7.6.c + g 1XiXpXsXaXgXgXcXcXaXcXcXcXhXhXhXcXjXnXCXHX5X< h.F.f.s.a.h.l.k.f.n.U.k.m.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXe.r.z l 4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l l 1.q.h.l.j.n.l.l.n.n.n.n.n.v.n.n.q.1.1.x : O > j V././.%X$X2X*X<X1X1X9X6XaXhXjXzXBXBXCXAXCXCXCXCXCXCXAXAXFXFXFXFXFXFXSXVXjX*XM g # o + e 5.T.vXAXBXmXNXlXtXyXeX;X+XXXXXoXXX+Xl.a.g.i.g.i.i.d.d.i.p.G.d.d.a.d.d.d.d.f.a.f.Y.R.U.Z.z.3.u e =.2.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.1.5.7.5.5.1.1.1.7.7.7.1.7.7.7.5.7.7.7.7.7.7.7.6.1.1.1.1.1.1.1.1.1.1.6.7.7.7.7.7.7.7.7.6.1.5.7.7.5.5.5.5.7.7.6.1.5.1.5.1.5.1.5.5.1.1.1.1.1.1.1.e 2.1.6 1.3.5.:.8.a.8.1.1.1.1.1.1.1.=.1.;.1.=.l =.1.1.1.1.1.tXtX=.1.1.1.1.1.1.5.1.1.1.5.5.6.1.1.5.5.8.1.1.1.1.1.1.1.c < # # a )._.[._._.^ Q ^ Q )._._._.).).Q Q _._._._.[.[.{.[.{.{.`.B X < e.s.,.,.:.z 7.5.5.5.x : $ %XaXiXsXsXaXaXaXgXgXzXjXcXhXhXzXjXjXnXnXSXCXv 4.k.f.a.j.k.d.d.a.l.J.K.j.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xe.r.l 1.7.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.3.w.j.j.j.n.n.l.n.n.n.n.n.l.l.j.8.3.3.3 # $ f m D.C./.%X2X2X*X1X4X6X7XhXBXAXSXSXSXFXJXJXJXHXHXHXSXSXVXVXAXSXFXFXFXFXSXSXAXMX7X|.g % . . 1 7.h.eXAXmXmXmXlXfXyXyXwXwXXXXXoXQ.+XJ.g.p.i.d.d.d.i.g.d.d.G.i.d.a.d.d.d.d.d.a.s.J.T.U.U.z.8.6 =.1.=.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.1.5.5.7.1.1.1.1.6.1.1.1.1.5.5.3.5.3.5.;.7.7.7.7.1.7.5.1.1.1.7.7.7.7.6.5.5.1.1.5.1.2.5.1.1.5.5.1.1.1.2.7.6.7.5.1.5.1.7.1.5.1.1.7.1.1.1.1.1.1.=.1.1.&.1.7.3.3.q.q.7.1.1.1.1.1.l 1.1.1.1.1.1.1.1.1.1.;.1.1.tXtXl 1.1.1.1.1.3.5.7.1.7.1.7.1.7.5.7.5.5.5.1.1.l 1.4.c < # B a W )._._._.Q Q Q ^ Q ).).).)._.)._.[._._._._._.^ ^ [.{.{.{.`.B + 4 r.u.:.0.2.7.5.u.6.2.q + m 7XiXiXsXaXaXcXcXaXcXhXhXhXjXcXcXjXjXnXCXHX2Xr k.f.s.k.d.f.l.f.l.J.Y.h.jXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%Xh.9.l 1.5.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l ;.4.h.l.s.n.n.l.n.l.n.n.z.n.b.n.h.3.3.1.: + > j m D./././.2X$X2X1XaXmXAXSXFXHXJXJXJXJXJXPXPXLXLXLXLXPXJXFXFXVXVXFXFXSXAXSXAXmXmXgX|.j & . $ 3.7.E.xXzXxXxXlXkXtXeX;X+X+X+XQ.Q.!.Q.f.u.a.a.i.i.d.d.i.i.G.g.d.d.d.d.a.d.d.d.a.H.T.Y.U.m.6.2.e 1.=.1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.1.1.5.5.1.5.1.1.4.7.1.1.1.7.5.5.3.5.5.5.7.1.1.1.1.7.7.4.1.1.1.1.5.1.5.6.7.5.7.5.5.5.7.5.1.1.5.7.5.1.5.5.5.5.7.1.6.1.5.1.5.5.1.5.1.1.1.1.1.1.1.=.1.1.6 1.7.1.5.a.q.;.1.1.;.1.1.1.1.;.1.1.1.1.1.1.1.1.;.1.1.tXtX1.1.1.1.1.1.5.7.7.3.1.7.7.7.7.5.6.7.1.7.7.1.7.7.4.> $ B a W Q Q _.Q Q Q Q Q Q )._.).).)._.Q Q _._._._.Q Q ^ ^ _.[.[.[.[.[.B + 8 z.7.7.8.7.:.u.5.1.b $ > #XiXiXsXiXaXcXcX*X2X*X8XzX9X2X9XcXjXnXnXSX8Xb h.l.a.k.k.F.l.k.k.l.Y.j.9XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXS.r.3.3.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.0.j.l.s.v.n.n.m.n.n.m.n.m.j.z.9.u 1.6 9 > g N V.D.C././.2X2X6XjXCXSXSXSXFXHXSXSXFXHXHXHXHXHXLXLXLXLXKXLXPXHXSXVXVXFXSXAXAXAXCXmXkX|.g O O &.u.r.eXvXlXlXkXtXyX;XXX+X+XXXoXQ.Q.+XH.u.g.i.g.i.g.i.g.p.d.d.d.d.i.d.a.d.g.d.d.l.Y.R.Y.Z.q.1.2.=.6 1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.7.1.1.1.1.5.5.5.5.1.1.1.1.3.7.5.7.7.5.3.1.7.1.1.5.1.1.;.6 &.;.1.5.7.6.6.7.7.7.7.6.1.7.7.1.6.7.5.7.7.6.7.1.1.1.7.7.5.1.5.1.1.5.5.3.1.1.1.1.1.1.2.e 1.&.2.7.1.5.a.q.;.3.1.1.1.1.1.;.1.1.;.1.l =.l 1.1.1.1.1.tXtX1.1.1.1.1.1.3.3.3.1.1.7.6.2.6.7.7.6.1.6.1.;.7.5.7 # B d `.)._.Q Q Q Q Q ).Q _._.)._.)._._._._._._._._._._._._._._.[.[.[.{.Q # + c q.;.p.0.5.u.5.2.c , X C.<XbXdXaX7X7XzXcX2X%X9XcX1X*X5XjXnXjXjXCXCXA.x.k.h.i.F.f.a.f.n.l.K.h.%XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXR.q.z 3.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l 3.w.j.v.j.n.n.n.m.m.m.n.m.n.m.h.5.1.z < @ > j j V.D.S././.1XhXBXDXDXAXAXAXAXAXZXZXCXAXSXSXSXSXHXJXPXLXKXKXLXLXLXFXVXVXAXAXAXAXNXAXNX4XM > O 4 7.u.!.lXfXdXtXuXwXwXwX+XXX!.+XQ.Q.!.P.g.i.i.i.d.g.d.d.i.d.d.d.d.d.d.i.d.d.d.d.l.Y.R.K.Z.h.1.l 1.=.1.1.1.1.1.1.2.1.1.5.1.5.1.7.7.1.5.1.5.1.7.1.1.1.1.1.1.1.1.5.3.3.;.7.5.5.2.4.l 5 3 c c c b k 3 w 2.2.8.5.5.5.2.7.6.5.5.2.7.1.1.5.1.7.7.2.7.1.7.6.7.1.1.5.1.1.1.1.1.1.1.1.1.e e 1.=.1.7.1.1.7.a.7.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.=.;.1.tXtX1.1.3.7.5.3.5.5.7.5.7.5.7.1.5.6.5.6.2.;.7.=.8.p # # d ! E Q Q E E Q Q Q ).).).).Q ).).).Q Q Q _.Q _.Q ).Q _._._.^ ^ [.[.[.{.<.+ @ 9.p.6.7.5.5.5.7.1.z O > *XiXdXsX7XaXzXnXcX*X*X9X9X9XcXjXjXjXnXCXVX2X9.k.a.h.k.a.a.f.l.l.J.n.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXA.9.z l 1.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.;.2.e 4.w.n.s.b.m.m.m.n.n.n.n.m.J.m.q.1.6.k @ $ g j m V.D.C./.1XmXAXBXBXCXBXzXjXhXhXhXzXzXjXzXBXmXnXBXVXVXHXLXKXKXLXLXPXHXSXAXBXZXAXZXCXBXhX#Xn % $ k p.L.eXgXtXuXyXwXwXwX+XXXoX+XQ.Q.Q.Q.a.i.i.p.d.i.i.i.d.d.i.d.d.d.d.d.a.f.d.d.f.K.K.U.m.r.1.6 1.=.l 1.1.1.1.1.1.5.1.5.5.1.1.5.5.5.1.5.1.5.1.5.5.5.1.7.5.5.5.;.:.3.3.7.=.5.2.l q c V.S.%X*X*X%XD.b q q 1.p.5.5.5.5.6.5.5.7.6.1.7.6.1.5.5.5.1.6.5.1.5.5.5.1.5.1.1.1.1.1.1.;.1.1.=.1.6 1.3.1.1.8.q.8.1.1.1.1.1.1.1.=.1.l =.1.1.;.1.l 1.1.1.1.tXuX1.1.1.7.5.5.7.5.7.5.7.5.7.5.5.6.1.2.4.;.>.6.2.: o d s ! E E Q E W Q W Q E Q Q Q ).Q Q )._.Q Q _.Q _._._._._._._._._._.[.[.[.{.B . 3 x.2.3.5.3.3.1.1.1.< O |.7XiXiX7XaXhXzXcX9X5X7X9X7XcXjXnXnXnXnXVX7Xr.d.f.d.k.h.d.j.j.l.J.m.T.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXm.e.l l 1.3.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.e 4.h.b.s.j.m.K.K.m.n.n.n.m.J.a.3.l 2., O > g v m m D./.<XxXZXBXzXgX8X6X6X7XhXzXBXSXDXFXDXFXDXFXSXVXBXAXSXJXLXKXKXKXKXJXSXBXZXZXBXNXBXmX7XC.f @ p 5.i..XdXtXyXwXwXwXXXXXoXXXoXQ.Q.I.Q.G.p.G.i.d.i.d.d.i.d.d.g.d.a.d.a.a.f.d.G.f.K.K.Y.Z.h.2.6 1.1.=.1.1.1.1.1.1.5.1.1.1.5.1.7.5.1.5.1.5.1.5.1.1.5.5.1.5.5.7.1.1.7.8.2.1.1.c k v %XiXfXBXBXBXZXmXbXA.t 5 1.7.7.1.1.7.7.5.5.5.5.5.1.7.7.5.7.2.5.1.7.1.2.1.5.1.1.1.1.1.1.1.1.&.l e 1.6 1.1.1.1.7.8.7.;.1.1.1.1.1.1.1.1.l 1.1.1.1.1.;.1.=.1.;.tXtX1.5.3.5.7.5.7.;.5.7.3.7.7.1.5.6.1.5.2.7.&.x.q + # a ! E ! ^ Q ! ! Q W Q E Q Q Q Q Q Q Q Q Q _.).)._.).)._.Q _._._._._._._.[.{.`.# # ;.5.5.5.3.3.;.3.3.p + j <XbXiX7X7XaXhXzX7X9X9X9X8XjXjXnXjXnXnXVXcX^.a.f.j.G.h.j.f.f.l.J.n.R.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXb.e.z l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.l 1.6 1.e 4.j.b.n.b.n.m.m.K.M.M.m.b.n.q.u x k : $ f j m v m /.<XxXzXxXhXaX<X1X7XBXZXAXAXBXBXzXzXzXnXZXSXSXSXFXSXSXVXSXJXLXKXKXLXJXSXBXCXZXBXBXBXhX*Xm % > 5.=.K.wX4X;XwXXXwX=XXXoXXXoXQ.Q.P.Q.I.p.d.i.i.g.i.d.d.d.i.d.i.d.d.d.j.a.d.f.d.J.U.Y.U.h.2.1.1.=.1.1.1.1.1.1.1.1.1.5.7.1.1.6.7.1.1.5.1.5.1.5.6.7.7.6.7.5.7.1.1.1.5.l k l q y.$XsXzXhXzXjXzXBXAXDXNX/.k 5 2.7.1.7.5.3.5.4.7.2.7.1.5.1.1.5.7.5.6.5.5.7.5.1.5.1.1.1.1.1.=.1.1.1.=.2.6 1.7.1.1.0.7.5.1.1.1.1.l 1.1.1.1.1.1.l 1.;.1.1.1.1.;.l tXtX1.1.1.5.5.7.7.7.7.5.7.:.7.5.3.6.1.2.l 7.1.x : + d ! W E ! ! ! Q Q W Q Q Q Q Q Q Q Q Q Q _.Q Q Q ).).)._.Q _._._._.Q _._._._.{.{.d X 4 g.7.3.7.3.5.;.3.x + % *XiXiX7X7XiXcXzXcX9X9X9XcXjXjXjXcXnXnXCXnXZ.g.f.a.k.h.k.j.a.l.J.n.Z.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXlXt.e.l l l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.1.1.l 8.h.v.s.n.n.m.n.m.K.K.n.n.f.q.l c < + > g v j v C.1XfXxXsXsX9X2X1XhXZXBXzX7X*X@XS.S.S.S.S./.$X9X8XBXFXPXJXFXHXHXPXLXKXKXJXVXBXmXmXmXzXxX<X/.g > l 5.a.XX;X=XwX;XXXXX+XXXoXQ.Q.Q.P.Q.Y.p.i.i.i.d.i.i.i.g.i.d.d.d.d.d.j.d.d.d.a.J.R.U.U.z.7.l 1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.6.1.1.5.5.1.5.1.7.6.6.7.6.7.7.1.5.5.1.2.k , b XpXsXaX7X7X8XcXcXhXBXSXmXA.q e 6.5.5.3.7.5.5.5.5.5.5.1.7.2.7.1.6.5.5.3.6.1.5.1.1.1.1.1.;.1.u 1.l =.1.=.1.7.1.1.0.7.5.3.1.1.=.1.&.6 1.1.1.1.l 1.1.1.l 1.1.1.=.tXtX1.1.1.1.7.7.5.7.7.3.5.7.7.5.5.5.1.5.3.;.6.q o B d W W E ! ! ! Q ! Q Q W E Q E Q Q Q Q Q Q ).).).Q ).).)._._._._.Q _.Q _._.^ [.{.`.O # u.7.7.5.3.3.5.;.z : O @XiXeX7X7X7XcXhXaX9X5X5X8XjXcXjXcXjXnXCXZX~.i.f.a.k.j.k.a.f.l.H.l.Z.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXsXj.e.i u 1.1.1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.e l 8.h.b.n.n.n.M.m.m.n.n.m.m.q.8.1.3 # @ f g j v V.2XpXpXiXiX>X%X<XzXBXhX<X%XC.C.S.@X@X%X%X/.C.D.V.V./.*XBXFXPXHXSXHXPXLXKXLXHXCXMXmXmXZXxXiX$Xm > q 2.5.T.+XXXXXXXXXXXQ.oXQ.Q.Q.Q.P.Q.Y.i.p.d.d.i.d.d.i.d.d.g.i.d.a.i.h.a.d.d.g.H.R.U.U.z.7.1.&.1.=.1.1.1.1.1.1.1.1.1.5.1.1.7.7.1.5.1.1.5.1.7.7.2.5.1.2.1.5.1.6.p.6.4., < V.,XsX6XiXiX7XiX7XaXcXcXnXSX6Xv q 1.5.8.;.3.2.5.4.5.1.7.5.7.5.5.5.3.4.5.5.5.5.1.1.1.;.1.1.1.1.1.&.1.e 1.6 1.5.1.1.q.7.5.1.1.l 1.1.1.1.1.&.1.1.1.1.=.1.=.1.1.1.1.tXtX1.1.1.7.7.;.7.5.7.5.7.5.5.1.1.5.5.5.3.&.x.: o B a W W ! ! ! Q ! Q ! W Q E E E E Q Q Q Q ).Q Q ).).).).)._.Q Q _._._._.).Q _.[.[.{.B + u 7.7.7.7.5.;.7.3.4 + m 6XbX6XaXpXcXcX7X6X9X*X9XjXjXnXjXcXjXnXAX!.a.s.a.k.h.h.j.f.k.F.l.Z.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXh.4.u l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.1.2.8.j.j.b.m.n.K.M.m.n.n.n.b.4.;.7.< o % 0 h j m S.>XiX,X<X2X%X1XzXzX<X/.W./.$X>XbXkXsXsXsXsXsX9X2X@XD.m D.5XVXHXJXVXIXPXLXKXLXVXBXzXmXNXxXcX1X/.g 0 c ;.l.XXXXXXXXXXXXoXQ.Q.Q.P.P.Q.L.Y.d.i.a.a.i.i.d.d.p.d.i.d.d.i.d.d.a.a.d.g.J.T.U.U.z.8.l &.1.1.1.1.1.1.1.1.5.1.5.1.5.5.7.6.1.1.7.5.1.5.1.7.5.5.7.7.5.7.2.5.-.=.l < > %XiXbX<XiX9X9XbXbXiXiXgXcXBXCXD.q r 5.5.;.1.7.5.2.5.5.7.5.3.5.7.5.5.3.5.1.5.1.5.1.1.1.1.1.1.1.1.;.1.=.2.6 1.1.1.1.a.3.;.1.1.1.e 1.1.6 1.1.1.1.;.=.1.1.l 1.1.1.u tXtX1.1.3.7.7.7.5.7.7.5.7.7.5.5.5.5.1.6.3.:.x @ o d ! ! ! ! ! ! ! ! W E E W E E E Q Q Q Q Q ).Q Q Q Q Q ).).Q )._._._._._._.Q _.^ [.{.! X 4 7.7.7.7.5.1.1.1.h O j 1X3XiX7X7XaX6X5X7XaX2X*XjXjXcXjXjXjXnXCX/.a.q.k.k.h.j.a.f.l.n.H.Z.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXeXh.4.u l l 1.=.1.KXKX1.1.1.1.1.1.=.l 1.l 6 l 1.r.j.j.n.n.n.n.m.m.M.K.n.0.5.=.c # o 0 f j j D.@X>X1X>X%XS.,XfXsX$XS./.>XeXdXsXdXsXsXsXfXhXhXzXhXcX6X2XD.m /.nXHXHXSXVXPXLXLXPXSXnXzXmXzXhX4X@Xm 0 h l 7.Q.oX!.XXQ.Q.oXQ.Q.Q.Q.P.P.P.K.G.i.a.i.d.i.d.i.d.i.d.i.a.d.d.a.i.d.G.a.n.T.U.U.z.8.2.1.&.1.1.1.1.1.1.1.1.1.5.5.1.1.1.7.1.5.1.1.5.1.5.5.1.1.1.1.1.5.1.=.=.=.q @ j >XeX9X<XbX<X9XeXbXbX6X7XaXgXSX2Xq r 1.1.3.1.6.5.7.5.5.1.5.5.5.1.5.7.1.6.7.5.5.1.5.1.1.1.1.1.=.1.1.l 1.1.6 1.1.1.1.q.3.;.1.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.tXtX1.1.3.5.7.5.;.7.7.5.5.3.5.5.1.5.1.2.1.5.q o # a ! ! ! ! ! ^ ! ! W E E E E E Q W E Q E W E E Q Q Q Q Q ).).).).).)._.)._._._.Q Q [.[.# > 7.7.7.5.5.5.3.7.k + f *X3X3X6XaX8X9X1X8XcX*X*X7XnXcXjXjXjXnXZXW.d.s.j.k.k.f.a.f.k.n.H.Z.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXwXt.x u u 1.1.1.;.KXKX1.1.1.1.1.1.=.1.1.l l 5 z a.j.l.n.n.b.m.m.n.J.K.f.7.-.2.> X @ f h j j S.2X*X$XS.S.-XsXsX$XW.%X,XeXbX9X6XaXzXzXBXAXAXBXBXMXnXhXcXbX/.^./.8XHXHXVXHXPXLXLXHXCXzXzXzXlXyX$XC.f , k ;.K.Q.Q.Q.Q.Q.Q.Q.Q.Q.P.Y.P.P.K.l.i.i.d.d.i.d.d.d.i.a.h.d.a.k.k.d.d.g.d.H.R.R.U.m.8.l e =.1.1.1.1.1.1.1.5.1.5.1.5.1.5.5.5.1.5.5.1.5.1.7.7.2.7.1.7.5.1.5.5.2.1 + D.1X9XiX6X<X<X<X9X<X<X7XiX7XcXCX7X, w 2.1.1.1.6.6.3.1.7.1.5.3.7.5.5.2.6.6.3.1.1.1.1.;.1.1.1.1.1.1.1.1.e =.e 1.1.1.3.a.7.1.1.&.6 1.1.1.1.1.1.1.1.=.1.1.=.1.=.e =.1.yXtX1.1.5.7.7.5.7.7.5.7.5.7.3.3.1.1.1.1.=.7.% o B a ! ! ! ! ! ! ! ! E W W W E E Q E Q Q W ! a a ! Q Q Q Q Q Q ).Q Q _.Q _.)._.`.^ _.[.{.B @ 7.7.7.7.5.;.;.u.z @ > &X6X3XpXaX9X1X*XhXnX7X%X*XjXhXcXjXjXnXZXW.s.d.a.j.k.f.k.f.k.n.H.J.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKX;Xz.4.i u 1.1.&.1.KXKX1.=.1.1.1.1.l l 2.1.l u i w.j.l.n.b.n.n.n.m.n.n.f.7.p.e O X % f g j m @X2X2X/.Z.S.<XfX1XS.%X>X1X1X<XiXhXmXZXZXBXZXAXFXJXHXHXCXjXnXhX/.m /.8XHXJXSXHXLXLXPXFXBXxXxXhXiX*XS.j 0 i ;.s.P.T.Q.Q.T.Q.Q.Q.P.Y.P.L.Y.L.F.i.a.i.i.d.i.i.i.a.d.a.a.h.a.h.a.d.d.a.f.Y.R.U.m.8.2.=.=.1.1.1.1.1.1.1.1.1.1.5.1.5.7.1.1.5.1.1.7.1.5.1.5.5.5.5.5.1.1.1.1.2.8 @ C.1X<X9XeX<X9X<X<X<X9X6X6X7XcXnXjX, 2 2.1.l 1.6.1.5.7.1.7.5.5.3.5.3.6.2.6.1.7.5.1.5.1.;.1.1.1.1.l 1.1.=.1.&.1.1.1.5.q.5.1.;.1.1.1.=.1.1.1.l &.=.1.l 1.1.1.1.1.=.1.tXtX7.3.5.7.7.7.5.7.7.5.5.1.7.1.1.1.1.1.1.1.% o B ! ! ! ! ! ! ! ! ! W W W W W E E E E Q W ! a a ! E Q Q Q Q ).).).).).).Q )._._.Q Q [.{.d O 7.7.7.7.7.7.1.u.z # : #X6XyXpXaX6X1X1XhXBX7X*X*X9XcXjXjXjXnXBXA.0.d.f.a.h.f.d.f.k.F.H.m.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKX KX KXKXKX KXKX-Xh.KXKXKXKX1.;.1.KXKX1.1.1.KXKXKXKXe l l e KXKXKXKXKXl.n.n.n.n.n.m.l.a.;.6., X o > f f j D.%X/./.D.Z.>XsX<X%X%X>X2X2X>XsXxXxXaX9X$X2X/.2X9XjXBXSXJXFXBXzXhX2XV./.jXJXFXSXPXLXLXJXBXhXxXxXsX<X@Xm 0 1 i 0.K.R.Q.Q.Y.Q.P.Y.P.P.K.K.K.L.f.g.i.i.i.d.i.i.i.d.d.a.h.k.a.i.a.i.i.d.k.Y.Y.U.z.8.2.=.=.1.1.1.1.1.1.1.5.1.5.5.1.1.7.5.1.5.1.1.5.1.5.1.7.2.7.7.1.3.1.1.5.2.8 @ C.<X<X<X<X9XeX<X1X1X9X9X9XiXsXjXcX, q =.=.1.6.5.5.3.7.3.5.;.7.3.5.5.6.5.2.2.5.1.5.1.1.1.1.1.1.1.1.1.1.e =.6 1.1.;.1.q.7.1.1.1.1.1.1.1.1.l 1.1.1.=.2.=.1.1.1.=.1.1.tXtX1.1.3.7.;.7.:.7.3.5.7.3.1.1.1.3.1.1.1.1.@ o d a ! ! ! ! ! ! ! ! ! W W W W W W ! ! Q ! ! ! a ! Q ).E E ).E ).).).).).).).).`.).Q [.[.a O 1.7.7.7.5.5.5.u.z $ $ @XiXyXfXjXcXhXaXhXnXmXzXjXcXjXjXjXhXBXzXZ.0.f.d.a.h.f.d.f.f.H.H.z.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKX KX KXKXKX KXKX HX Xh.x l l KXKX1.1.KXKXl &.KXKX1.1.KXKX1.1.KXKXu w.KXKXn.j.b.b.n.m.n.j.8.;.e $ . O > f f j S./.S.S.V.S.sXiX%X%X-X%X%X>XsXkXbX/.S.S.S.D.D.D.D.D./.9XCXJXJXBXnXfX%XM @XBXJXSXHXPXPXPXSXxXxXlXaX1X%XV.0 , h 3.l.P.T.P.P.P.Q.Y.P.K.K.H.J.H.f.i.i.i.i.g.d.a.d.i.a.k.i.a.k.h.i.d.d.g.G.K.Y.U.m.8.2.2.=.1.1.1.1.1.1.1.1.1.5.1.5.1.5.7.7.1.5.5.1.5.1.6.5.5.5.5.5.1.7.1.1.2.q + M <X<X<X1X<X<X1X1X1X1X9XbX7XaXnX5X, r =.1.1.6.5.1.7.5.5.7.7.5.7.7.1.5.6.6.7.1.1.3.1.1.1.1.1.;.1.1.1.6 =.=.e 1.1.1.3.8.7.;.1.1.;.1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.=.1.tXtX7.1.7.7.7.7.7.5.5.7.5.3.7.1.1.5.1.1.3.l + o d a ! ! a a a ! ! ! ! W W W W Q W Q Q Q ! ! ! a a W Q ).E E E E ).E W ).).).).`.).Q [.[.s O 1.8.q.7.5.7.5.u.z $ $ S.iXpXpXgXcXhXaXaXhXgXjXjXhXgXcXjXjXCXfXZ.0.f.d.d.d.f.d.a.k.l.F.z.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKX KX KXKXKX KXKX HXE.z.KXKXKXKXKX;.1.KXKXl 1.KXKX1.=.KXKX1.e KXKXi q.KXKXl.s.b.b.b.n.m.h.7.1.1 X . # > 0 g m /.S.C.V.V.%XdX>XW.%X%XS.%XdXsX1X%X/.$X2X>X1X9X*X2X/.D.m /.cXJXJXBXxXaX/.V.9XFXHXSXHXPXLXSXzXhXfXpX1X%XD.f % , 3.j.L.Y.Q.Y.P.Y.Y.P.L.J.n.H.H.f.i.i.i.d.i.a.i.a.a.d.a.h.k.a.h.i.k.d.a.l.K.Y.U.z.4.1.=.=.1.1.1.1.1.1.1.5.;.1.5.1.1.5.5.1.5.1.1.5.1.5.3.5.3.5.2.5.5.1.1.1.2.k + j >X<X<X1X<X1X1X1X1X<X6X6XiXaXBX/., e =.6.1.1.2.5.5.3.:.3.;.7.5.1.7.2.5.2.4.5.1.1.1.1.1.1.1.1.;.1.;.1.e 1.&.1.1.1.3.q.1.;.1.1.=.1.1.1.1.&.1.1.1.1.1.1.=.2.1.1.2.1.tXtX1.5.5.7.5.7.7.7.5.7.5.3.5.3.1.5.1.1.;.l + o d ! a a ! a ! ! ! ! ! W W W W W W Q Q Q ! ! ! a a ! Q E E E ).E E E ).).).).).).E Q _.[.! # 1.8.a.7.7.7.7.u.x : $ S.iX3XpXaXaXcXcX8XhXgXgXjXhXhXcXjXjXBXiXh.g.f.d.d.h.d.f.a.k.F.H.m.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKX KXKX KXKX FXR.KXKXi l KXKX1.;.KXKX1.1.KXKX1.=.KXKXe l KXKXi q.KXKXl.s.b.b.v.n.z.r.1.1., . # > f g D./.D.D.m V.bXdX%X/.%XC.A.,XsX,X$X>XbXdXbXdXaXiXaXcXcX1X/.V.D.7XHXHXBXxX9XD.C.nXHXSXHXJXLXJXBXhXhXaX4X2XC.g $ , 2.a.H.L.P.K.Y.P.Y.K.L.H.n.n.H.d.i.i.p.g.a.i.i.a.i.a.a.a.h.d.h.d.k.d.a.l.K.R.U.m.7.2.e 2.1.1.1.1.1.1.1.1.5.5.1.5.1.7.5.1.1.5.7.1.1.1.7.5.6.1.7.5.1.1.1.2.2.k < % 2X1X<X1X1X9X1X9X1X9X9X6XiXhXcXj , e 6.6.1.5.6.6.5.5.3.7.7.5.5.5.1.6.5.6.5.1.5.3.5.1.1.1.1.1.1.1.1.1.=.1.l 1.1.1.7.8.3.1.1.1.1.1.1.1.1.1.l 1.1.=.=.2.2.2.=.1.=.1.tXtX7.3.7.7.7.5.3.5.7.5.7.5.5.1.1.3.1.1.;.u + o d ! a a a ! a ! ! ! ! ! W ! W W W W Q ! ! ! ! ! a ! E W W E E E ).E W ).W ).).<.s )._.[.E # 1.q.a.7.7.q.7.p.z $ $ /.iX3XpXaXiXiXaX8XhXcX8XcXjX8XcXhXjXCX>Xq.g.d.g.d.a.f.a.d.f.n.n.m.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKX KXKXKX KXKX KXKX FXE.KXKXi l KXKX1.1.KXKX1.u KXKX1.1.KXKX2.l KXKXl q.KXKXf.s.v.s.l.n.l.a.1.1.4 . & > 0 j C.C.D.m v S.fX<XS.%XS.V.%XpXbX$XeXiX9X1X1XsXxXzXnXxXxXcX6X%Xm M cXJXFXBXjX$XV.*XJXSXVXHXPXJXAXjXhXsX6X>XS.g @ $ l 7.n.K.K.K.L.Y.L.L.H.H.l.n.n.f.i.i.a.i.a.i.i.d.a.d.d.i.d.d.d.d.d.d.a.l.K.Y.U.m.7.=.l =.1.1.1.1.1.1.1.1.1.5.5.1.5.7.5.1.5.1.1.1.1.5.5.7.2.7.5.5.1.=.1.=.2.k q @ D.1X9X1X<X9XeX<X<X9XiX6XpXjX%X, h c 8.5.;.7.1.5.5.7.5.3.5.3.7.1.5.5.6.2.3.7.3.1.3.1.1.1.1.1.1.1.&.1.e 2.e 1.1.1.1.7.1.1.1.1.1.1.1.1.1.=.1.1.1.1.1.1.6.6.1.5.=.c tXtX1.2.2.5.,.7.5.5.7.7.7.5.5.3.1.1.1.1.3.5 & & d a a a a ! a ! ! W a W W W W W W Q Q W ! ! Q ! a ! E E W E E W ).).W ).).W E `.W E _.[.W # 1.q.a.8.8.8.8.i.k : $ |.4XpXpXaXaXaXaXgXaXjXgXcXhXhXhXhXjXnX/.4.d.d.a.h.k.a.a.f.f.l.F.Z.zXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKX KXKXKX KXKX KXKX HX XN.KXKXKXKXKX3.u KXLX1.1.1.KXKXKXKXl l l e KXKXKXKXKXf.s.j.l.n.f.v.a.;.1.c X & $ , j /.D.V.m v 1XfX%XW.%XV.V.7XpX2X<XbX1X>X9XaXBXZXAXSXHXSXnXcXcX2XV.S.ZXJXVXnX9XD.S.ZXJXSXHXJXHXVXhXhXsXiX>XS.g $ O i 1.j.J.J.K.L.L.J.L.J.z.l.k.k.k.u.i.u.i.i.a.i.i.i.i.i.i.i.i.d.d.d.a.a.l.K.Y.Z.z.4.1.l e =.1.1.1.1.1.1.1.1.1.1.5.1.6.3.6.7.1.6.7.5.5.1.7.5.5.1.5.1.6.=.1.z z w 8 $ @X7X>X<X<XeX<X<X9X<XiXfX4Xx 5 l z 5.7.7.5.7.1.5.1.5.5.5.5.1.7.1.7.5.5.5.1.5.1.5.;.1.1.1.;.1.1.l 1.e l e 2.1.1.1.7.1.1.1.1.=.e 2.l 1.1.1.2.l ;.;.1.2.2.=.=.=.r tXtX1.2.2.2.,.:.7.5.:.:.:.1.1.1.5.1.1.1.7.i # o d a a a a a a W a a a W a W W W ! Q Q a a ! Q ! a a E ).E E E W s ).s ).).s ).`.E W _.[.W $ q.q.8.a.i.i.8.i.4.: # |.4XdXpXaXaXcXaXhXaXgXcXhXhXxXhXjXBXlXY.p.k.d.q.w.d.a.d.f.d.l.F.m.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXPX;XK.e.5 l e 2.1.;.2.2.1.1.1.1.=.1.1.2.l l w 5 k q.KXKXs.s.j.f.l.f.v.f.;.;.z $ . o $ > j /.V.m v m <XiX/.W.S.m @XaX<X,XbX>X%X9XxXfXaX*X/.9XcXGXJXZXhXhX$X^.*XHXSXnXcX/.D.gXHXSXFXHXJXVXgXsXsXiX>XC.g O O 4 ;.a.J.J.J.J.L.J.F.H.l.j.f.j.h.i.i.i.i.i.a.i.i.d.i.d.i.i.d.i.d.d.a.a.l.K.U.U.z.3.l l =.=.;.1.&.1.l 1.1.1.1.1.5.1.7.7.1.7.5.6.1.7.2.6.1.5.7.6.7.5.6.1.1.2.x e w < 0 /.iX9X7X<X1X9X7XcXxX<X^.w k l 2.5.5.5.5.5.3.5.3.7.1.3.7.7.1.5.7.2.7.1.7.1.5.1.1.1.1.1.1.1.1.1.1.e 2.l =.1.1.3.7.1.;.1.1.1.1.1.1.=.e 2.=.1.l i l r =.=.=.6.=.tXtX:.5.=.-.2.x 2.2.4.3.;.3.5.3.5.3.1.1.:.l # o d a a a a a W a a W W ! W W ! ! ! E E ! a a W ! a a s W W s W E ).).).).<.).E ).`.E _.[.a $ q.a.a.a.i.8.8.p.j.: # |.8XtXgXaXaXhXhXhXhXcXcXhXhXzXhXjXBXeXt.i.d.i.a.a.f.a.f.k.k.l.H.n.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXXXK.q.6 l l 1.1.;.1.1.1.1.1.1.1.;.6 e l l w KXKXKXKXa.s.s.s.f.l.v.v.f.3.1.l , X . $ > v /.m v j D.sX<XW.W.V.v 1XhX1X,X>XS./.pXsX2XS.D.m m /.1XBXGXnXnXcXD.C.BXJXBXnX>XV.*XSXVXSXHXHXSXcXaXsXiX2XD.g O O i u a.J.n.H.H.H.H.F.n.l.a.a.a.a.u.i.a.i.u.i.d.i.d.i.d.d.d.d.k.i.a.a.a.l.Y.U.m.z.4.l u 1.1.1.1.1.1.1.1.1.1.1.5.1.1.5.5.5.2.5.3.7.5.5.1.7.5.2.5.1.5.5.5.2.2.c l 2.t < 0 V.@X7X8X8XaXiX9X/.v q c l 2.1.7.5.5.:.5.5.5.5.1.7.5.1.6.5.5.1.5.5.7.2.3.1.1.1.1.1.1.1.1.1.1.2.e e e l 1.1.5.3.1.1.1.1.=.2.=.1.1.1.1.1.1.l e e 2.2.=.=.=.=.tXtX=.=.5.=.=.=.2.4.8.7.4.3.1.1.1.1.1.5.7.1.$ o B a a a a a a a a a a a a W ! ! ! E ! a a a a a a a s W W ).`.s W W s ).W ).s ).).)._.[.d < a.h.a.h.i.8.8.d.8.h o m 4XkXdXaXaXaXaXsXhXgX8XcXjXcXcXnXzX!.8.h.d.d.a.a.d.d.d.f.l.F.F.l.zXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXm C.v v j C.lX,XS.S.v m iXfX>X,X%XV.%XsX1X$X%X2X/.C.v m *XDXSXzXzX2Xm 9XJXAXzX6XD.@XAXSXVXSXHXSXjXaXsXiX$XM % + : k ;.a.J.J.J.H.H.n.l.l.k.f.a.h.h.i.i.i.i.a.a.i.i.i.d.i.d.i.d.k.i.d.a.a.l.K.Y.m.z.4.l 1.1.1.l 1.;.1.1.1.1.1.5.1.5.5.7.2.5.6.3.6.1.7.7.2.5.5.5.5.5.5.1.1.1.1.l 1.l c q , , q h D.dXtX^.c q q r z 2.2.7.7.3.:.5.7.;.5.7.3.:.3.5.7.1.5.7.5.1.1.5.1.1.1.;.1.1.1.&.&.1.1.1.e e e l 1.1.1.7.1.;.1.1.l =.2.1.2.2.=.1.2.=.=.=.&.:.;.;.=.=.eXuX-.=.=.=.x.6.7.5.5.p.6.1.1.1.1.1.3.5.3.5.> o B a a a a a a a a a a W s W ! W W W W a a s s W a a a s ).s <.s W ).s ).s ).).W s ).).`.d 4 s.f.f.a.q.8.a.G.a.b + < 6XsXiXaXaXfXfXhXhXgX8XgXjXcXjXnXbXz.8.h.d.d.a.f.f.a.f.f.l.F.l.h.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXdXtXtXtXtXtXm C.m j h S.xX:XS.V.j D.gXsX,X;XD.V.1XcX2X>XiXiXpXiX/.v D.jXJXnXzXiXD.2XSXSXzX7XS.@XBXSXVXSXHXSXhX7XaXyX%Xn % + 1 l 1.s.m.l.l.H.n.n.l.l.f.s.s.a.a.u.i.i.a.u.i.d.i.d.i.k.i.d.d.d.i.d.i.i.f.K.J.Z.z.4.l e l 1.1.1.1.1.1.1.1.1.1.5.1.1.5.7.5.5.5.5.1.1.5.7.5.1.7.4.5.5.3.3.1.;.;.1.1.6 c x 3 , q , dXtX1 3 l =.=.2.6.1.7.3.7.5.3.7.7.5.3.5.5.3.7.5.3.5.1.5.7.5.4.1.1.1.1.1.1.1.1.l 1.l &.e e e e 1.1.1.3.1.1.1.1.1.2.=.1.1.2.2.1.2.=.-.5.1.;.k w t 0 eXbX0 q q 8 r l 7.:.:.p.-.1.1.1.3.1.1.1.3.7., & B a a a a a a a a a s a a W ! ! W E W a a `.`.).s a s s W s s ).s s ).s ).W s ).<.)._.W d u f.f.f.s.s.a.a.a.a.9.4 X D.cXaXpXaXaXsXhXsXhXgXhXcXhXnXzX-Xp.h.k.d.a.a.d.a.f.a.k.l.l.l.j.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXR.P.h.l e l 6 u 1.1.1.1.1.1.1.1.;.=.1.l e 6 7 3 4.8.g.a.w.s.f.f.s.f.f.h.7.=.l 3 O . & v C.j j h |.xX&XS.V.h S.xXiX;X%Xm D.cXsX$X>XeX<XsXcX1XS.v >XSXBXhXaXS.@XSXSXjXaX/.S.BXSXVXSXHXSXgX9XbX,XS.g @ : w l 3.f.l.l.n.H.n.l.f.f.a.a.q.a.a.u.i.i.i.i.a.i.i.i.d.i.i.i.d.d.i.d.d.a.k.K.U.m.z.3.1.1.1.1.&.1.1.1.1.1.5.1.7.1.5.1.1.7.1.4.5.5.7.5.5.1.5.7.6.1.5.7.3.3.;.1.1.1.5.7.6 4.2.5 w c tXtX=.6.1.&.1.5.5.5.5.:.7.:.5.3.3.5.:.5.3.5.7.5.7.5.5.1.1.1.5.1.1.1.1.1.1.1.1.1.1.6 1.e e e 1.1.1.1.7.1.;.1.1.=.2.1.=.=.1.1.=.1.6.6.4.k q 0 y V V bXbXV y y - 0 0 h z 4.5.5.5.1.5.5.1.3.1.u u.c % # a a d a a a a a a a W ! a ! ! ! W W a a E ).).s a s s ).).).).s ).s ).W ).).).<.<._.a 8 7.f.f.f.a.a.a.j.a.s.a.z.: : #XaXpXaXaXgXfXhXhXcXhXhXzXxX,Xz.i.k.a.s.a.f.d.a.f.a.f.F.J.l.l.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1XT.R.j.l 6 l l ;.1.1.1.;.1.1.1.1.1.l e l e w 7 3 1.q.q.g.s.s.j.a.s.s.f.k.8.1.e c + & j C.n j h @XxX>XC.V.h S.BXiX-X/.v C.cXbX2X>X,X<XbX9XiX2Xv /.CXAXhXaXC./.VXSXnXcX@XC.BXSXVXFXHXSX7X1X<X>XD.f O < c l 8.l.J.l.n.H.l.f.f.s.a.q.7.a.a.i.i.u.a.a.i.d.i.i.i.i.d.d.i.d.i.d.i.a.k.J.U.m.j.3.u e 1.1.1.1.1.1.1.1.1.1.1.7.1.5.7.1.6.5.5.5.3.5.1.7.2.5.1.7.5.5.3.;.1.1.7.5.5.;.5.1.1.7.6.=.tXtX5.;.5.8.5.5.5.5.5.3.7.3.7.:.5.7.3.5.5.5.3.5.3.5.3.7.5.7.1.1.1.1.1.1.1.1.1.1.1.1.1.e e e e l 1.1.3.1.;.1.2.e 1.2.1.=.1.1.1.=.1.k 1 0 - y V K K K P K K K H V - 0 0 h l 1.7.1.1.3.2.7.5.u 7.4.% # d a a a a a a a a s s a a ! ! ! E `.! ! W E ).`.<.E E ).W ).<.).W s <.W s s ).s ).Q d 1 k.f.f.f.d.a.a.k.w.n.u.k.4.: g *XaXaXaXaXgXcXgXcXcXzXxXbXA.2.k.i.h.a.q.G.a.d.f.a.a.H.z.l.J.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXP.P.b.4.i i l 1.1.l e u 1.=.6 1.l l e e w w q 2 l q.7.g.a.g.h.a.a.a.f.s.s.z 7 2.< X o 0 C.m j h S.zX>XD.m h C.BXsX%XS.j D.zXpX%X>X>X1XbX1X9X2Xm @XBXZXxXcXS.@XAXSXzXhX%XC.BXVXCXFXFXSX9X>X1X@Xm % $ e &.1.h.m.l.l.n.l.k.j.h.a.a.7.a.d.i.i.u.i.i.i.i.i.d.i.d.i.d.d.i.k.k.d.a.a.l.K.m.Z.h.l l u 1.=.1.;.1.1.=.1.1.5.5.1.5.1.5.1.1.5.1.5.5.5.7.7.7.7.3.1.1.;.5.3.1.1.3.1.5.2.2.6.1.2.1.6.dXtX5.6.6.5.6.7.5.7.7.5.5.5.7.7.5.3.:.7.3.7.7.7.7.;.7.5.5.1.1.1.1.1.1.1.1.6 1.l 1.6 1.2.l e =.l 1.1.1.1.l 1.1.1.=.1.u =.6.5.5.-.e < - y V K K P P K P I I I T P K H = 0 h 3.p.:.;.2.2.6.:.z 3.x.1 # d a a a a a a a a a a s ! s W s W W W W W s ).W ).).).W W s s <.s `.W `.`.W <.W Q a d =.F.l.f.f.d.d.d.f.f.f.f.s.a.a.7 y.>XaXaX8XjX8XjXjXzXxX;Xz.7.q.a.a.a.d.a.f.f.l.f.a.f.n.n.s.K.3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXoXP.P.N.4.i k l 1.&.1.1.1.1.l 1.e l 6 e e e 5 q 2 k 8.g.g.g.s.j.s.s.f.j.a.s.l 1.1.1 O X > D.V.j f D.hX1XD.V.f C.BXkX/.S.j V.hXhX$X$X2X2X1X<X9X%XV.$XBXhXhX7XC.$XSXAXzXaX|.|.CXAXVXFXJXBX9X*X$XC.g $ < c =.7.k.n.n.l.l.l.k.j.h.a.a.7.a.a.i.i.i.i.a.i.i.i.i.i.i.d.i.i.d.k.i.a.h.a.k.Y.m.Z.h.1.l 1.l 1.1.1.1.1.1.1.1.5.1.5.1.5.1.5.1.1.5.1.1.7.1.;.;.;.;.1.1.3.3.1.5.1.3.1.1.7.7.7.7.7.6.6.tXtX5.1.1.5.1.5.5.3.;.:.;.;.:.7.5.7.5.7.5.5.7.5.7.7.7.5.5.5.3.1.1.1.1.1.l 1.l 1.l 1.e c =.e 2.1.1.;.1.1.1.l 1.1.1.;.1.2.=.=.3.w 0 - J H K K K K K P P I I T T (.(.T L V y < 6 3.:.1.2.2.1.3.;.6.c : > ~ ~ ! a d a a a a a a a s s W W W s s W ).s ).<.s s ).s ).<.E E W W s E E `.E E d d z.G.l.f.f.f.f.f.f.f.l.f.a.a.k.j.c v S.>XiXaXaXcXiX2XW.y.4.h.f.a.f.d.a.d.d.d.f.k.a.f.l.l.s.L.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXA.P.P.M.e.i 5 l u 6 1.1.u u 1.l 1.l l l e e w w 3 3 3.0.q.0.a.s.s.s.f.f.a.s.1.1.e c $ . $ m V.j h m aX7XD.V.h m zXNX%XD.v v 1XZXcX$X/.%X2X>X2X%X@XaXxX<XsX9XD.*XSXBXjXpX|.*XAXVXAXSXFXzX2X2XS.m > $ h k 1.a.l.l.l.l.l.l.s.h.h.a.a.8.a.d.u.i.i.d.g.p.i.i.i.i.d.i.d.i.k.k.x.k.a.a.l.J.Z.Z.h.1.;.e 1.1.=.1.1.l 1.1.1.1.7.1.5.1.7.1.5.5.1.1.7.5.3.:.3.5.5.5.5.7.7.7.7.3.3.7.7.7.7.7.7.7.7.8.tXtX7.7.7.5.5.5.:.3.:.7.;.7.7.7.7.7.7.7.7.7.7.7.5.7.7.7.3.1.5.1.1.1.1.1.1.1.l l 1.e 1.c e e 1.1.1.1.z l 1.1.1.1.2.1.=.-.=.;.h < - J H K K K P K K P P P P P T (.UX(.T L V = 0 c ;.;.5.2.z 3.1.p.x.q $ n ~ ~ ~ ! ! s s a a a s ! W W s ).s s W s ).<.).<.<.).<.).W E E W W E `.).`.).s p z l.F.l.f.G.f.f.f.f.G.l.f.k.l.j.l.r.l 2 c z.Z.tXtXy.c l 8.k.a.u.a.d.a.a.d.a.f.a.f.f.l.l.j.n.P.:XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXB.n.K.U.e.k i l 1.&.l 1.1.e 1.=.1.e l l e w 5 q q 3 l w.0.0.s.a.a.s.a.a.s.a.8.1.6 l , X o j D.v j v 1XhXS.V.v v 9XAX<XV.m h D.cXAXnX6X>X$X$X>X1X6XhX3X>XaX$XC.aXAXgXhXpXS.6XAXCXVXSXSX7X@X/.D.f % < c l 3.k.z.l.l.l.k.f.f.a.q.q.8.8.a.i.p.g.p.i.i.g.d.i.i.g.d.d.i.i.i.k.i.a.h.a.k.J.K.Z.h.1.u l 1.1.6 1.1.;.1.1.1.5.1.5.1.5.1.5.1.5.7.7.7.7.5.7.5.7.5.7.7.7.5.5.5.5.7.7.5.1.1.1.1.1.7.5.tXtX7.7.7.7.7.5.7.5.7.7.7.7.7.7.5.5.7.5.7.5.7.7.7.;.7.5.5.1.1.1.1.1.1.1.l 1.1.1.6 1.2.=.l e e 1.1.1.3.3.l 2.1.1.2.e 1.-.5.i < - J K K K K K K K K K K P K K K K T T T T L H y 0 i 7.5.z c 1.7.p.x.r < > ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ! W s s W s <.).s s s ).s s <.<.).).`.`.`.`.`.`.).W d k h.f.H.H.H.H.v.f.f.f.H.f.l.n.l.h.h.8.e 6 e 5 5 tXdXc r.q.i.d.d.d.a.s.a.f.a.a.d.a.a.f.l.l.k.K.R. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXB.L.P.K.t.z w l l =.1.1.l 1.1.6 l l l e e w 5 q q 1 6 6.u.0.a.s.s.s.s.a.a.s.k.1.u k c + . f D.m j j |.zX2XV.v j S.CXxXS.V.v b S.gXVXSXBXzXfXsXcXbX2X$X<X,XS.*XBXhX7XcX<XS.aXZXCXZXSXZX*XS.D.n > : q 2.u q.l.l.k.l.j.f.s.a.w.q.a.7.q.a.i.u.u.a.i.i.i.a.d.g.i.i.d.i.d.i.d.i.d.i.a.l.J.U.U.z.1.l 1.1.=.1.1.1.1.1.1.1.1.1.5.1.5.1.5.7.5.5.7.6.7.1.1.5.3.5.5.5.5.5.3.3.3.3.5.3.7.5.3.7.7.7.3.tXtX7.7.7.7.7.5.5.5.5.5.5.5.7.5.7.7.7.7.5.7.7.7.7.5.7.5.5.1.7.1.1.1.1.1.l 1.l 1.e 1.e e l e =.1.1.1.1.l 1.l 1.1.2.2.=.=.1.1 @ = H H K K K K K K K K K K K K K P K K K I P P K - 1 3.;.2.4.1.i.5.-.x.q $ n n / ~ ~ '.'.}.'.~ ~ ~ ~ s ~ ! ~ ! ! `.].! `.`.`.`.].].`.].].].].].].`.`.s u x.l.H.H.H.H.H.v.G.v.H.F.v.H.v.f.l.l.8.l u l 1.2.tXtX8.a.a.i.a.a.a.a.a.d.a.a.f.a.f.f.f.l.f.f.U.R..XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXA.v.M.K.b.4.i l 1.1.l l 1.6 1.6 1.1.6 e e e w q q 1 7 7.7.q.a.0.0.a.a.g.a.s.k.7.l l l < . O n M j j V.cXsXD.v j m 8XAX6XC.m v v D.*XaXcXhXaX<X2X%X%X2X<X%X%XaXxX6X7X7X$X%XxXBXBXCXSXcX@XC.m f $ > l =.3.h.l.l.f.f.j.a.a.a.q.8.q.7.i.a.8.i.i.i.a.i.u.i.i.i.i.d.i.d.i.d.k.d.k.i.a.l.K.U.U.r.1.2.l 1.1.u 1.1.1.1.1.1.1.1.1.5.1.5.1.5.1.7.5.7.6.7.5.7.5.5.7.7.7.7.7.7.7.8.7.7.0.8.8.8.8.8.q.tXtX8.8.8.8.8.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.5.7.7.5.;.7.1.1.1.1.1.1.1.1.l 1.;.1.l =.c =.e 2.1.1.;.l 3.l 1.l 1.1.1.6 l w : - V K K K K K K K K K K K K K K K K K K K K P P P V 0 i 3.1.2.=.7.:.=.x.2., d n / ~ ~ ~ './ ~ }.}.'.'.'.'.].~ ].].'.'.].].'.'.].'.].].].].].].].`.`.<.p u.f.v.I.n.H.H.H.H.f.H.H.G.H.H.v.n.H.f.l k z l l u tXtXi.a.h.h.h.x.s.a.d.a.a.f.a.f.d.k.k.n.f.s.T.L. XPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXM.v.v.M.N.9.k e ;.1.l 1.;.l 1.1.u l 1.e e w 5 w q 1 7 3.7.q.w.u.q.a.q.a.q.a.d.a.l 1.l 3 X . g D.n j j *XmX$Xm v j @XBXZX2XV.m v j m C././.S.S.S.W.$X:X2X%X6XhX9X9X7X>X/.1XBXzXjXCXAX*XC.M j : $ , =.=.8.j.f.d.f.f.f.s.s.a.0.8.a.7.8.a.7.i.i.u.i.a.a.a.i.d.g.d.d.i.d.d.k.k.d.i.a.l.J.U.U.z.1.l 1.=.1.1.=.1.1.1.1.1.1.5.5.5.1.1.1.7.5.7.5.6.7.7.8.8.8.i.s.a.a.a.a.a.h.a.a.f.a.a.a.a.i.a.a.tXtXa.a.a.a.a.a.s.a.a.a.a.a.8.0.7.7.8.8.i.7.7.5.5.5.7.7.5.5.5.1.1.1.1.2.2.1.1.l =.l l e l e 1.1.1.1.3.3.l 1.1.1.5.2.6 l , @ y H K K K K K K K P K K K K K K K K K K K P P P P H - < :.;.1.6.l i :.p.x.i B g / ~ ~ ~ n n '.~ }.'.'.'.'.~ ~ '.~ '.'.'.'.'.'.'.'.}.].].].].].].`.W a ,.i.H.I.H.n.H.H.H.H.H.H.H.G.H.H.v.H.n.0.z k c k x l tXtXa.7.a.a.a.r.a.d.a.f.a.f.d.a.k.k.f.n.s.s.Q.K.%XPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXn.v.v.n.K.w.l 5 k l =.e 1.e l e 1.e l e e e w q 1 1 1 w 4.7.>.q.q.q.q.g.q.q.g.a.5.1.l c : . @ D.V.b j M zXcXD.v v j %XZXAX1XD.m m m v y.V.D.S./.$X$X%X$X6XsX<X>X<XiX%X$XjXzXhXBXSXjX/.m j > @ , c e 1.s.s.f.f.j.a.a.a.a.a.a.q.5.7.a.i.i.u.a.i.i.u.i.i.i.i.i.a.p.i.i.i.p.k.i.i.a.f.K.Y.J.j.1.1.1.2.&.5.&.5.1.=.l ;.:.;.:.5.5.u.7.4.4.7.8.i.a.h.a.s.q.a.q.e.0.i.i.a.8.8.7.7.5.u.u.7.:.5.5.tXtXp.u.p.u.p.7.5.7.7.7.i.d.q.e.e.0.e.8.q.q.8.u.7.7.7.7.7.u.p.5.1.1.l l =.6 2.1.=.=.=.l 5 l 1.1.1.:.3.l 3.1.1.=.1.=.1.e @ - V H K K K K K K K P H H H K K K K K K K K K K K P K y $ i 1.1.1.1.4.4.4.3.7.z p d / ~ ~ '.'.'./ }.}./ ~ ~ B./ }.}.'.}.'.].].'.}.'.].].}.].].].`.<.s g.g.f.v.I.I.I.I.H.I.H.L.H.H.H.H.H.v.H.j.q.x x z l 2.4.tXtXa.a.a.a.a.a.a.a.a.a.d.a.f.d.a.a.n.f.e.B.R.L. XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXn.B.v.n.m.h.3.5 e l 1.l 1.e =.=.l 6 l e e e w q 2 q 1 q 3.7.,.g.g.q.q.q.g.a.q.a.7.1.l c , . o g D.V.j v *XmX2Xv m v m 2XBXDXzX2XD.V.D.C.S.S.@X%X%X2X<XiXiX1X>X<XiX2X@XpXzXaXzXmXZX*XD.j f $ $ q e 2.8.a.s.s.s.f.a.a.a.q.i.a.8.7.i.a.i.i.p.i.i.i.i.i.i.i.a.i.i.d.i.p.g.k.k.i.i.k.k.J.U.Y.l.8.2.e e l 1.u l l l 3.4.8.7.i.i.k.k.i.k.k.k.a.i.8.5.p.:.=.5.;.1.;.l x 4.4.9.9.y.y.y.c.c.y.V.V.uXtXc.V.t.y.y.9.9.9.9.x l i 6 6 =.&.&.&.&.&.5.5.7.u.i.i.p.8.p.u.7.1.2.6.2.l e l k l c l e l 1.1.:.5.3.l 1.1.1.1.=.=.=.k @ - J V K V K K K K K K H H V V H H K K K K K K K K P P V % q 2.1.1.1.3.7.7.1.3.9.3 , d / / ~ / / / / / ~ '.'.}.'.}.'.].}.'.}.}.}.}.].].].].}.].).s <.:.a.f.n.H.I.H.H.I.I.H.I.L.L.I.I.B.I.M.L.s.1.k l z 2.3.7.tXtXa.a.a.a.a.a.d.a.a.d.a.a.f.k.f.k.n.w.s.K.K.L. XFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXz.v.v.n.m.N.e.5 i l 1.=.l =.l l =.1.l e e w w q 2 2 1 1 i 7.g.7.q.q.q.g.q.q.q.0.q.7.e k c o O j D.v v V.cXmX/.m m v V.@XhXAXAXzX9X>X%X%X%X2X1XiXsXfXpX2X$X1X6X1X%X>XzXhXaXBXCXcXC.j g > + : r =.2.h.a.s.w.a.f.a.s.a.a.8.q.8.7.a.a.i.u.g.i.i.g.i.g.i.i.i.d.i.i.i.i.d.p.k.i.h.h.k.J.Y.U.m.8.e e =.u l u 3.3.3.3.8.h.a.i.x.i.7.5.&.&.7 7 5 u x x.t.^.A.W.E.-X*X1X7XcXnXBXZXVXVXSXSXHXJXJXuXkXJXJXHXHXSXSXZXCXnXcX6X*X$X/.W.A.Z.y.y.4.1.7 7 7 7 6 6 e l 1.5.=.=.5.1.7.1.l k k i l w l 1.1.;.5.1.l l 1.1.1.2.=.2.1 @ = J K K K K K K K K K H J H K H V H K K K K K P K P P H - 1 1.1.1.1.3.3.1.7.5.x l i f p n / ~ ~ / / / ~ '.'.'.'.'.'.'.].'.}.}.'.}.}.'.'.].].`.s <.,.h.f.n.H.I.I.n.B.L.L.P.I.L.I.I.I.I.P.P.L.w.u k z l 1.4.7.tXtXa.a.a.a.a.a.a.a.a.f.f.a.a.f.d.l.f.0.N.B.M.P.oXSXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXl.n.b.s.n.m.r.e 5 e l e =.l =.=.l l e l e w w 7 2 2 q 8 3 4.0.u.0.g.u.q.g.0.g.7.q.i.1.c c : . . % D.V.v v S.hXhX/.v m m v V.2XzXAXZXCXzXhXhXhXzXhXaX>X%X%X<XsX<X%X<XhXhXaXhXBXBX%Xj g f O + 1 l 6 4.z.a.g.a.a.s.s.a.a.8.8.8.7.a.a.i.i.i.i.i.g.i.g.i.i.p.i.i.d.i.d.i.i.i.i.x.k.a.h.J.Y.U.m.r.e e 2.l 4.q.q.8.i.i.4.2.l 7 2 3 w 4.^.A./.$X6X8XMXSXFXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXCXhX9X2X/.A.V.v h 1 8 8 7 e e =.1.1.1.l 1.l l k l 2.1.1.5.z 1.l 1.l =.=.=.2.< O y H K K K K K K K K K H H H H H V H K K K K K K K K P P - , 1.2.5.1.2.7.7.7.7.3.8.4.p 4 d n / '.'.'.~ <.}.}.}./ '.}.}.}.}.'.].}.}.}.}.}.'.s s s ,.v.H.H.H.I.I.I.I.I.L.L.P.I.P.P.P.Y.P.P.P.s.3.l l 2.1.3.7.q.tXtXa.a.a.a.a.a.f.a.f.a.a.d.a.a.f.l.s.0.M.M.B.I.oXSXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZXl.n.b.s.b.m.j.l w l e 1.6 1.l =.l u e e w w 7 w 2 2 2 8 1 l 3.7.7.g.q.q.q.0.g.:.u.a.8.l w h o . . g @XD.v v S.hXfX%XV.V.V.v m D.%X1XiXfXsXaX6X>X%X@X/.%X>X<X1X2X1XxXhXsXfXBXmX*Xm j 0 % o : c l 1.q.k.a.a.d.g.q.q.g.q.8.8.7.7.a.i.8.u.i.g.i.i.i.i.i.i.g.d.i.i.i.i.d.i.k.k.p.i.a.a.J.K.m.m.h.l l 2.2.2.6.2.6 7 7 8 h ^.W.2XiXzXCXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXBXcX>X%XS.y.q 8 8 7 6 e 2.e l w l 1.5.5.7.3.3.l 1.1.2.=.6.l < & V H K K K K K V K K K H V V H H V H K K K K P K K K P P y < 1.6.7.5.7.2.7.6.7.8.2.1.1.z p d d s '.].}.}.}.}.B.~ / }.}.}.}.}.}.}.}.].'.<.s s ,.p.G.H.H.H.H.H.n.L.P.I.P.P.P.P.P.P.P.P.P.P.I.e.u 4.4.4.4.7.i.a.tXtXa.a.a.a.a.d.a.a.a.d.f.a.f.d.k.l.s.s.M.B.v.M. XSXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXb.B.b.s.s.N.z.4.e e 2.2.e 2.e 1.e 6 l e w w 7 q w 2 q 1 8 2 l 7.0.g.g.0.0.7.g.:.q.u.i.2.w c $ . o m S.D.m m /.sXxX>XD.V.V.V.m V.V.V.C.S.S.S.A.S./.$X2X>X$X%X<XxXsX7XgXzXmX4Xm f 0 $ X o , 2.;.7.f.a.a.a.d.g.q.q.u.q.7.7.8.8.a.i.7.i.i.p.i.i.d.i.i.i.i.d.i.i.i.i.i.i.k.a.i.i.a.a.J.Z.m.Z.z.2.e r r q 1 , h D.2XcXCXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXCXaX@Xy.h 2 2 e l e l 1.5.5.8.3.l 1.1.e =.=.=.5 @ & V H K K K H K K K K I H H H H H H H K P K K P K P P K L V < u 5.5.7.6.7.7.6.7.6.2.7.i.7.u k p p p <.s '.].'.'.'.}.}.}.}.}.}.}.}.].<.s s p q.z.F.v.v.I.I.I.I.I.I.I.I.I.Q.Q.I.Q.P.P.Q.Q.P.v.,.l 4.4.4.8.8.a.a.tXtXa.a.a.a.d.a.d.a.f.a.a.a.k.f.l.l.s.n.M.b.M.K.A.VXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXv.v.v.s.s.z.m.y.l w e l l e 1.e 1.l 6 e e w w w 7 8 1 q 1 8 c 7.7.7.0.7.g.7.,.g.a.g.i.7.l r q O o V.%XV.m V.C.9XxXaX%XD.V.V.V.D.D.D.A.D.S./.%X$X$X$X%X>XsXsX<X1XhXzXmXaXM f > $ o O h 2.;.a.f.q.q.a.a.g.q.0.u.7.7.7.7.q.i.i.7.a.i.i.i.g.g.p.i.i.i.i.i.d.g.d.i.g.i.k.i.i.a.a.J.m.m.U.Z.4.e w q c /.cXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXSXaXv q w w l 1.2.5.8.1.l l 1.1.=.=.=.7 @ & V K K H K K H K K P H J H J H H H H K K K K K P K P K P V > u 6.7.5.2.7.6.7.6.6.7.7.:.7.7.8.4.z i d s a a ! s ~ '.'.'.~ ~ ! ! s s s s ,.k.f.G.F.H.v.I.I.I.I.I.P.I.P.I.I.I.I.P.P.P.P.P.I.g.0.4.4.4.8.q.a.a.a.tXtXa.a.d.f.a.f.a.a.a.a.a.d.a.f.l.f.a.m.n.b.M.L.oXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXb.v.v.b.j.j.n.n.3.6 e e l l 6 u 1.u l e e w 7 q 7 2 1 q 1 1 1 7.7.7.7.0.g.g.7.q.g.a.u.7.5.=.r q : X . o m %XD.m V.C.$X7XhXaX2XC.D.C.S.W.W.W.%X-X-X-X>X<XsXsX<X$X$XyXlXmXgXD.> : & o . X 1 2.6.i.a.a.q.q.q.a.a.a.8.u.7.7.7.8.a.i.7.8.i.i.i.i.i.i.i.i.a.i.i.i.i.i.d.i.d.i.i.a.a.i.a.k.U.m.Z.Y.Z.9.4.q m SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZXy.3.3.8.8.8.7.4.1.z 1.1.1.=.2.r r q : X V K H H H H H K H H K H H H H H H H P K P P K K P P K P y q 6.>.5.7.7.7.7.8.8.6.7.7.8.8.8.i.7.4.3.3.4.3.;.,.s s s s kXtXs ,.,.,.g.d.G.G.H.H.H.H.H.H.I.I.I.I.P.P.P.I.I.Q.P.P.P.P.P.Q.P.F.a.i.i.8.h.a.g.a.a.a.tXtXa.a.a.a.d.a.a.f.d.a.f.k.f.k.h.w.n.J.b.v.n.L.R.BXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXlXs.v.b.b.s.s.n.n.q.6 w e l l i l l u e e w w w q 2 2 2 1 1 1 1 l 3.7.8.7.7.g.0.q.7.q.u.0.7.1.r r w , $ X O j 2X@XD.V.V.S.2XiXzXhXaX9X>X1X1X<X4X6XsXsXxXsX9X$X%X2XiXfXmX6Xm > $ o . . X : l 1.6.a.a.a.g.u.u.q.i.a.u.7.7.7.8.8.i.p.u.8.p.i.i.i.i.i.i.i.g.p.g.i.g.i.i.d.i.i.a.a.i.a.a.h.m.z.Z.Y.R.Z.z.^.y.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.k 7.7.8.q.8.8.7.1.1.l 1.1.1.2.e q 1 < o = K K H K K K I K P K H H H L H J H K K K P K K P P K K y 3 5.u.7.7.7.7.7.7.8.7.7.7.7.7.8.8.8.7.8.8.6.7.5.7.1.5.:.3.kXtXe.e.,.g.d.G.G.G.v.v.H.H.H.I.I.I.I.I.I.P.I.Q.P.P.Q.P.P.P.Q.P.I.f.g.i.x.x.a.a.a.a.a.g.tXtXa.a.a.a.a.a.a.a.f.a.f.f.k.k.a.a.n.n.b.N.N.L.R.mXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXlXs.v.b.b.j.w.b.m.z.3.w e l l l e =.e e e w w w w 2 2 1 1 1 1 1 3 e 4.8.7.:.g.0.8.a.q.g.0.0.8.6.l w k h , @ + f |.$XS.D.D.V.S.%X2XbXcXxXjXjXnXhXgXgX7X*X2X/.S.2XpXxXhX%Xg @ . . . + $ , w 2.l 8.a.a.q.q.q.u.q.q.u.7.7.7.7.8.i.p.p.8.8.i.i.i.i.p.g.i.d.g.i.i.i.d.d.i.d.i.i.a.a.i.i.a.h.n.m.m.Y.W.Z.Z.Z.x V.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,Xz 3.7.0.q.8.8.7.7.2.1.l &.=.2.r e 3 1 8 + - K K K L H I I H I I J H H L H H H H K P P P P P K K K y 5 5.5.7.7.7.7.7.8.8.7.7.8.7.8.8.7.8.8.8.7.8.8.q.8.x.i.x.a.uXuXs.,.s.s.f.v.v.G.H.v.n.n.I.n.v.I.I.I.I.P.P.I.P.I.Q.Q.P.P.Q.H.f.g.a.a.h.h.a.a.a.a.a.a.tXtXa.f.f.a.d.a.a.f.a.a.a.f.l.a.s.j.m.b.b.N.n.P.A.mXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXdXw.n.v.j.s.s.b.n.z.q.e 5 l l e e e e e e 7 q 7 w 2 2 2 2 2 1 1 8 5 l 4.0.q.u.u.7.0.q.q.q.q.i.i.8.2.i k k h , : < V.&X&X/.D.D.V.D.S./.%X%X2X2X%X%XS.C.S.S./.>XhXhX*Xm $ . X + + < q r e l 2.1.a.s.7.7.g.0.7.7.0.7.7.7.7.u.i.i.8.u.u.p.i.i.i.i.g.i.i.i.p.g.i.d.i.i.i.i.a.i.a.a.i.i.a.a.n.Y.m.m.T.Z.z.Z.x.9.C.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmX4.7.s.7.q.a.a.8.7.7.2.1.1.1.1.=.e q 4 1 1 : - H P K L I L L I L L H J H H H H J K L L I P P P P P J 0 u ,.4.7.7.8.7.8.7.8.7.7.7.7.7.7.i.a.8.a.i.q.q.q.a.g.g.d.g.uXuXv.v.v.v.v.v.H.H.H.v.H.I.n.I.I.I.B.L.I.I.Q.I.P.P.I.Q.Q.P.L.f.a.a.i.a.k.h.d.a.d.a.s.d.tXuXd.a.a.f.d.s.d.d.a.a.s.f.k.a.q.n.n.j.b.v.B.P.B.MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXs.n.v.v.s.s.s.j.n.t.1.e e e e e e e e e w w 7 2 2 2 2 1 1 1 1 1 1 2 1.8.i.7.7.7.0.q.a.g.q.i.u.i.8.7.u 6 c h h , < h C.2X1X2X/.S.S.D.V.S.S.A.S.S.W.S.2XbXcXhX5XM % X O : q c c =.2.1.1.7.q.w.7.0.7.0.7.g.7.u.7.7.7.7.7.i.8.7.p.u.p.p.i.i.i.d.i.i.i.i.i.i.i.i.i.a.i.a.i.a.h.i.i.a.a.k.U.m.n.Y.Y.^.Y.z.l x W.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXc.1.a.7.0.a.a.q.8.7.1.1.1.1.1.1.e i 3 4 1 q < @ J P I I L L L I L L H J J H H J H L L I I I I I I K J t :.,.4.7.7.i.7.8.8.8.7.7.7.7.0.7.q.7.0.u.0.u.q.a.a.f.g.g.g.tXtXv.g.f.v.v.H.H.H.n.n.I.I.B.I.I.I.I.P.I.Q.Q.I.Q.I.Q.Q.Q.K.a.a.a.u.a.a.a.a.a.a.a.a.a.a.tXtXa.a.s.a.a.d.f.d.a.d.a.a.f.a.a.n.j.s.v.b.n.P.B.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXb.n.v.v.v.s.s.s.j.z.e.l w e e e e e 7 w w w 7 q q 2 2 2 1 1 1 1 , 2 5 7.8.u.7.q.u.u.7.u.a.u.u.7.7.7.5.5.1.w q h h , , h V.%X1X9XiX<X$X2X2X2X>XbXsXlXfXiX%Xj $ X X @ , h w e =.=.&.1.7.i.h.a.0.7.7.7.7.7.7.0.7.7.7.u.7.7.7.7.i.i.i.i.i.i.i.i.i.g.i.i.i.a.i.i.a.i.i.a.a.i.i.a.i.i.i.a.j.Y.Y.z.U.Y.Z.Z.z.t.y.b 2XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXW.u d.a.a.4.q.q.8.7.1.1.1.1.1.&.1.l 3 4 , 1 q 8 @ y H I I L L L I I L J H H J H L L L L I T T T I I J 0 l p.:.x q.8.8.i.8.i.8.a.7.a.7.0.a.a.u.a.q.q.q.q.s.g.,.f.v.v.tXtXG.f.G.v.H.H.H.B.I.n.I.I.L.L.L.I.P.P.I.Q.I.I.P.P.I.Q.K.l.0.a.a.a.d.a.a.a.a.d.a.d.s.a.tXtXtXtXuXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXb.v.v.v.v.v.w.w.s.v.q.u i e e r e e 6 w 5 5 2 q 2 2 2 2 1 1 1 1 1 1 2 e 6.i.8.u.q.0.u.7.q.:.0.g.:.7.a.7.6.e l c q k h < > > f j D.2X9X7XcX8X6X*X@XC.g $ o + + : q 2.l l &.l ;.;.7.q.h.q.0.g.0.0.0.7.7.7.7.u.7.5.7.8.8.7.7.7.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.d.d.i.d.a.a.a.i.8.i.h.q.U.Y.z.z.U.U.z.y.Z.r.y.y.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xz w.0.7.0.q.q.q.8.7.3.3.1.1.1.;.1.e 3 , , 8 t 8 : - H L L L L L I L T T H L L L L T T L L T T I T I y 7 u.-.u.3.8.8.u.i.8.u.i.q.u.q.g.a.q.q.s.a.s.s.a.f.g.f.f.f.f.v.tXtXv.H.H.H.H.I.v.I.B.H.I.I.L.L.I.P.P.Q.Q.P.Q.Q.Q.Q.oXI.G.,.g.g.a.a.a.a.a.d.f.a.d.a.a.d.uXuXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;Xv.B.v.v.v.s.w.s.w.v.n.q.u u l e w e e w 5 w 3 2 2 2 2 2 1 1 1 1 1 2 1 3 w 4.r.i.7.7.q.g.0.0.g.0.7.7.g.7.7.7.;.6 l w k q h q 8 9 + O O @ % % @ o o X X + : 1 w c 2.=.=.6 1.5.0.0.f.f.a.7.:.:.0.7.7.7.7.7.7.7.5.7.7.8.u.7.u.8.i.p.i.i.p.p.i.i.i.i.i.p.d.i.d.i.d.i.i.i.p.i.a.i.i.i.i.i.a.F.Y.Y.z.J.U.z.z.z.t.y.r.9.9XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX2Xq.0.s.0.s.0.s.s.8.7.7.5.1.1.1.1.e e w 4 1 , 1 2 8 < - t H L L L L L I L T T L L L I T T T T L T T T J t &.:.p.u.6.7.8.7.q.q.q.q.q.q.q.g.a.g.a.a.s.g.a.f.s.s.s.f.v.l.v.tXtXn.v.H.H.H.H.v.I.I.I.I.B.L.P.I.P.P.P.P.P.P.P.Q.I.I.G.,.,.d.f.a.f.d.a.a.f.a.a.f.a.a.f.a.s.a.a.d.f.f.a.f.a.a.j.z.a.q.l.a.a.w.s.v.n.B.I.A.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXv.M.b.v.v.w.s.w.s.s.n.f.3.u i w w w w w w 3 3 2 2 2 2 1 1 1 q 1 2 2 2 2 q w 6.8.7.7.7.0.,.7.7.0.0.7.7.7.u.7.7.7.1.k l w q r r w , $ o . X O : 1 q c z =.=.6.=.1.4.8.s.s.s.a.a.7.7.:.:.0.7.7.7.7.7.7.5.7.p.7.5.8.7.8.p.p.8.i.i.8.i.i.i.i.i.i.i.i.i.d.p.i.p.d.i.i.i.x.i.h.a.i.i.i.k.U.~.z.z.Z.m.z.z.z.r.t.r.v 1XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX$X9.a.s.q.s.a.a.g.a.7.7.7.1.1.;.1.1.l 6 5 1 1 q , 8 7 1 < 0 J L L L L T T T L L T T L L T T I I T T T H t r =.=.7.7.6.8.8.7.q.7.q.g.g.u.g.q.q.a.a.g.g.s.g.g.f.f.f.f.f.v.H.uXtXv.H.v.H.H.H.I.B.I.B.I.I.P.P.P.P.P.P.P.Q.Q.Q.I.I.I.G.a.a.d.d.a.a.d.a.a.a.a.f.a.f.g.a.d.a.f.d.d.a.d.f.g.a.f.l.j.a.f.j.q.w.w.s.b.n.M.P.B.fXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXv.n.v.v.w.w.w.s.w.s.s.k.w.u 7 5 l w w q w 3 3 2 2 8 2 2 q 1 1 1 1 2 2 1 2 2 l 3.8.8.7.:.u.g.q.0.7.0.7.7.g.u.q.8.4.4.2.c w w e 2.z k , < $ : : , q k l l l e e 1.6.8.x.h.h.a.7.7.7.5.5.:.7.7.:.7.7.7.7.7.7.8.8.5.u.8.8.p.8.8.i.p.i.p.i.i.i.i.i.d.i.i.i.i.i.i.i.i.i.i.d.i.i.i.i.i.i.a.8.k.F.~.U.j.m.Z.z.z.z.z.y.r.y.b 2XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX%Xt.4.s.w.a.a.a.a.a.8.8.7.7.1.1.&.=.=.e e 5 2 1 , , 8 1 q 0 < - y H T I I L L L T L L T L L L T T T T J y r =.=.=.6.4.4.a.a.u.7.0.7.q.q.q.q.g.s.a.a.s.s.g.s.s.f.f.f.f.f.v.H.uXuXI.v.H.H.I.H.I.I.I.I.L.L.P.P.P.I.P.P.Q.P.I.P.I.I.G.,.a.a.d.d.a.f.a.a.d.f.d.a.d.a.a.d.g.a.f.a.f.a.a.a.a.a.l.n.q.a.j.q.a.w.w.s.v.N.M.P.B.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXoXv.n.N.v.v.v.w.s.w.s.s.f.h.4.5 5 w w w 7 q 7 2 3 2 2 1 1 1 1 1 1 1 1 1 2 2 1 7 e 2.2.7.7.0.7.0.g.7.0.u.0.q.g.u.7.7.8.q.4.c l 2.=.6 ;.l l w l 1.2.2.e 5.1.1.5.8.8.q.a.s.8.8.7.3.3.5.7.7.7.7.5.7.7.7.5.5.7.7.7.7.7.p.8.p.8.8.8.p.i.i.u.p.i.i.p.i.i.i.i.i.i.p.i.i.i.i.i.d.i.i.a.i.a.x.i.i.a.h.Y.Y.m.c.m.m.j.z.z.t.y.z.z.y.$XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX Xe.g.s.w.a.w.s.a.a.g.7.7.7.7.2.1.6 1.2.l e q 2 1 , , , 8 1 q 8 : : y H I I T T T L L L T T T T T T L J t e &.5.=.=.2.2.4.8.8.8.q.a.q.g.q.q.q.a.a.s.s.a.g.g.f.f.f.f.f.v.v.G.n.tXtXn.H.n.I.n.I.L.L.L.L.L.P.P.P.P.P.P.Q.Q.P.L.n.g.g.s.a.a.d.d.a.a.f.a.f.a.f.a.d.a.f.a.g.s.a.f.a.s.a.a.a.a.k.l.j.a.j.j.q.a.q.s.s.b.N.M.P.B.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE.n.n.b.v.b.s.s.w.s.w.g.s.j.h.z 5 7 w w q 7 2 2 2 2 2 2 2 1 q 1 1 1 1 1 q 2 1 2 2 w l 3.8.7.7.7.7.7.7.q.7.0.q.7.7.7.0.0.4.x q.a.7.5.5.:.&.&.1.5.6.6.5.p.u.i.i.a.q.7.4.3.1.1.1.7.8.7.7.7.7.7.7.;.5.7.5.7.7.7.p.7.7.8.8.7.7.8.8.8.i.8.i.8.i.i.i.i.i.i.i.i.i.i.k.i.i.d.k.p.a.x.i.i.i.i.i.a.k.a.z.R.U.z.j.z.z.h.j.c.t.s.k.j.9.W.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXA.e.f.a.g.s.w.a.a.a.s.q.3.7.7.1.1.1.6 1.=.l l w 2 1 , , q 8 8 8 7 8 8 0 y J H L T T T T T T T T T L J y q e =.5.:.5.=.e 2.1.1.5.8.a.a.a.a.g.q.a.s.a.s.a.s.s.s.g.f.f.f.v.G.n.v.H.tXtXH.H.I.n.I.L.L.L.P.I.P.P.L.P.P.Q.Q.P.P.H.f.g.s.a.a.a.d.a.a.a.a.a.d.a.a.f.a.a.a.a.d.d.d.d.f.a.a.a.d.f.k.l.j.a.j.j.0.8.0.s.s.s.b.n.n.P.B.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXR.v.n.v.v.w.s.s.s.s.s.0.w.s.j.e.l 5 w 5 7 q 2 2 2 2 2 2 q 1 1 1 2 2 1 2 q q 2 1 1 8 7 r 5.5.7.7.7.0.7.7.g.7.5.7.g.0.0.0.7.q.8.7.7.7.7.7.7.7.7.7.7.i.a.u.u.0.7.7.7.3.:.7.7.7.7.7.1.7.8.7.7.5.7.3.5.5.5.7.7.8.8.8.5.p.8.p.p.8.u.p.i.i.i.i.i.i.i.i.i.i.i.i.i.k.i.i.i.k.i.i.i.i.h.i.i.i.i.a.k.8.h.Z.T.Z.z.l.j.h.h.z.z.h.3.h.Z.c D.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXV.9.h.w.s.s.w.s.w.s.s.a.7.2.7.7.1.2.1.=.1.1.e w w 2 1 , 8 1 1 , q 8 q q 8 : : y J J H H L L L H H J y , 4 e 2.=.6.5.=.l e =.1.1.1.7.8.a.i.a.a.a.s.a.a.s.f.s.s.f.f.f.v.f.G.v.G.H.H.tXtXn.n.B.I.I.L.L.P.P.P.P.P.P.P.P.Q.L.H.f.d.a.a.d.d.f.a.d.a.f.a.a.f.f.a.d.f.s.d.d.g.a.s.a.a.f.a.a.a.f.k.l.l.a.a.f.w.5.0.0.s.w.b.n.n.B.P.B.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.v.n.N.v.b.s.s.w.w.s.g.s.w.h.h.4.u 5 w 7 2 2 3 2 3 2 2 2 1 1 1 2 q 2 2 2 1 2 1 1 8 2 7 ;.7.7.:.,.:.7.7.7.7.7.0.0.7.>.:.u.a.7.3.3.0.0.7.7.3.3.3.e.0.4.4.0.0.:.7.7.7.0.:.7.5.7.1.1.5.5.5.;.3.5.5.5.5.7.7.8.7.7.7.5.8.8.6.8.p.8.8.u.i.8.p.i.i.i.i.i.i.i.i.i.i.k.i.i.p.k.i.i.i.i.i.i.a.x.i.h.a.q.h.T.E.l.k.l.j.t.t.h.t.t.w.h.z.9.W.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMXn.4.n.j.e.h.j.s.s.s.s.a.7.5.7.7.7.1.=.=.1.=.1.l e w 2 8 1 8 , 1 , q q q 8 8 8 8 8 8 1 0 q t y 0 0 0 q , 7 =.=.2.c =.l w c l 2.-.5.1.1.1.7.7.a.a.a.a.a.s.a.f.f.s.f.f.f.f.v.v.n.v.v.H.tXtXH.I.I.L.L.L.I.P.P.P.P.P.P.P.P.H.G.g.u.g.d.d.h.k.d.d.a.f.a.a.a.a.a.d.a.a.a.d.d.s.d.a.f.d.d.g.a.f.k.F.l.f.j.j.a.3.0.7.0.w.s.v.v.n.n.P.B.3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXB.B.n.n.b.v.v.w.s.w.s.g.s.0.w.s.q.3.5 3 q q 1 1 q 2 2 2 1 2 1 1 q q 2 2 1 2 2 1 q 1 1 2 3 5 l 2.7.7.7.u.u.u.0.7.7.7.0.0.0.>.0.0.:.0.,.0.7.3.3.3.5.3.3.:.3.0.:.:.:.0.:.7.3.7.7.3.7.7.5.1.5.3.1.1.5.5.7.7.8.6.p.8.8.p.6.i.8.8.p.8.p.8.i.i.i.i.i.p.i.i.i.i.i.i.i.i.k.i.i.i.i.i.k.i.i.i.i.i.i.a.a.h.U.!.Y.r.r.z.k.z.h.t.c.j.e.t.t.y.W.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXhXN.s.b.w.w.j.j.s.s.a.s.a.7.5.5.3.7.1.1.1.=.1.1.l l e w 7 2 q q 8 , , q 0 , < 0 1 1 8 8 8 < < , 8 , 8 , 8 5 r =.=.1.2.=.2.l 2.2.1.=.5.6.1.1.1.6.8.a.s.s.a.a.f.s.f.f.f.f.v.v.v.G.n.H.H.H.uXuXH.n.I.I.M.I.L.L.P.P.R.Q.L.H.F.d.g.a.g.a.a.f.a.a.a.d.a.a.a.a.f.a.s.d.g.a.a.a.a.a.f.d.a.a.d.f.d.f.j.l.k.a.j.h.3.3.7.0.0.w.s.s.b.N.M.P.B.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXB.I.n.b.b.b.s.s.s.w.q.w.a.w.0.q.s.q.l 5 2 q q 1 q 8 2 8 1 1 2 1 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 e 2.2.7.p.u.u.q.u.7.0.3.,.,.0.g.:.0.7.7.7.7.7.7.7.7.7.7.7.5.7.7.3.3.7.3.7.7.7.3.7.7.3.5.5.3.5.1.1.5.7.8.7.8.6.8.8.8.8.8.8.8.i.i.8.i.8.8.8.i.8.i.8.i.i.i.a.i.k.k.p.i.i.x.i.i.i.i.i.i.i.i.k.i.a.h.i.h.Y.!.A.q.k.z.k.r.t.z.h.h.t.r.r.y.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjXZ.s.b.s.w.j.j.s.s.a.a.s.0.7.7.7.3.5.1.1.1.l 1.6 e 1.l e w q 8 8 0 8 q 8 0 8 1 < 1 1 1 1 , , 8 1 1 2 2 2 7 5 e 2.5.=.6.5.1.1.=.5.1.1.1.1.6.1.5.6.1.7.7.8.s.s.f.f.f.f.v.f.v.H.H.v.f.v.v.H.uXuXI.I.L.L.L.P.P.P.P.L.L.H.d.a.i.a.a.a.a.d.a.a.a.a.a.a.a.g.g.d.a.d.a.g.d.a.a.f.d.a.g.s.d.a.l.k.a.k.n.k.q.h.h.8.3.4.4.8.0.a.s.s.v.N.M.P.L.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXB.I.n.n.v.s.s.w.s.s.s.g.a.0.q.s.q.q.r.k 8 8 1 q 1 8 2 2 2 1 2 1 2 2 2 2 q 2 2 1 1 1 q 1 1 4 1 2 5 l 3.7.7.7.7.7.7.:.7.g.7.7.7.0.7.7.7.7.7.7.7.7.7.7.7.5.:.7.5.5.7.7.7.5.3.5.7.7.1.1.1.1.5.1.5.7.5.6.6.u.6.8.8.p.6.i.6.i.8.8.8.8.8.i.i.8.i.i.i.8.8.i.i.i.i.i.x.i.k.i.i.k.h.i.i.i.i.i.i.k.i.h.i.i.i.z.E..Xm.q.z.k.t.t.h.t.j.j.j.t.t.4.S.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXV.w.b.w.s.j.j.h.a.w.a.s.a.7.5.3.3.1.1.1.1.1.&.1.1.=.l e e e 7 2 8 8 q 8 0 8 8 q 1 8 0 1 1 1 1 1 1 1 2 2 2 i i l 1.6.=.=.5.1.5.=.1.5.=.1.5.1.5.1.1.5.1.1.5.7.8.a.h.f.s.f.f.v.v.v.H.n.H.H.H.tXtXI.I.L.L.L.H.I.K.F.G.a.u.u.q.q.a.a.a.a.a.a.a.s.a.d.a.s.d.a.f.f.a.f.d.f.a.a.d.f.a.d.d.d.f.l.a.a.l.J.a.q.r.7.3.7.8.8.8.q.w.s.j.v.N.B.P.K.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXN.B.n.b.s.v.b.s.s.w.s.w.w.a.0.q.0.s.r.8.=.8 2 q 1 2 2 q 1 1 1 2 2 2 q 1 2 2 2 2 1 1 1 1 1 2 1 1 4 3 3 u l 1.5.7.7.u.u.u.7.7.7.7.7.7.7.7.7.7.7.5.5.7.5.3.3.7.5.5.3.5.3.3.1.1.1.5.1.1.1.1.1.5.5.7.8.5.8.6.8.6.8.6.i.8.i.6.i.i.8.p.8.p.8.8.8.8.i.i.i.i.i.a.k.i.i.i.p.i.i.i.i.i.i.i.i.i.i.i.i.p.i.i.a.h.z.!..Xz.q.j.z.j.h.h.j.z.j.t.h.z.9.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXA.c.b.w.w.j.b.j.s.a.s.a.0.7.5.1.7.7.1.1.1.1.1.1.1.6 1.=.e e =.r q q q 8 1 8 q 8 8 8 1 1 1 8 1 1 8 8 2 3 5 5 u u 2.2.=.5.=.1.1.1.1.5.1.1.1.1.6.1.5.6.1.6.6.6.5.7.7.7.q.g.a.s.g.f.f.v.H.n.H.H.tXtXM.n.n.n.f.s.g.g.u.g.g.g.a.d.d.g.a.a.a.a.f.a.d.d.a.f.a.d.a.a.d.f.a.d.d.d.s.a.a.a.f.a.f.k.d.h.m.l.w.a.s.8.1.3.7.7.7.q.q.s.w.s.v.n.M.B.P.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXN.B.n.v.v.v.v.s.w.s.w.g.q.0.q.0.0.w.a.h.=.w 2 q 8 q 2 8 8 2 8 2 q q 8 q 1 2 q 2 2 1 1 1 2 1 2 1 1 1 4 2 3 e 2.1.7.7.7.:.7.7.7.7.7.7.7.7.7.7.5.7.7.5.7.3.5.5.5.5.7.7.5.1.7.5.3.5.5.5.5.5.1.5.1.5.5.7.p.8.6.8.p.8.6.i.8.8.8.i.8.8.i.i.8.p.i.i.i.i.i.i.i.x.i.i.i.i.i.k.i.i.i.i.i.i.i.i.i.k.p.i.i.h.a.h.q.U.XX!.z.q.r.z.j.h.h.z.z.t.t.h.z.b >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xt.m.j.j.j.j.l.k.j.f.a.7.7.7.1.1.1.1.1.2.1.1.1.1.=.l =.=.=.r =.r q q 7 2 1 1 8 8 8 8 8 1 1 1 1 2 2 3 q e e e 1.1.2.1.6.2.=.1.1.5.5.1.5.5.1.1.1.5.1.1.2.x.6.6.6.6.1.6.7.7.7.7.g.q.g.a.s.s.s.a.tXtXa.f.a.s.a.q.0.0.i.a.a.a.a.a.a.a.g.a.a.d.a.d.g.a.a.a.d.g.a.f.a.f.a.d.a.f.a.f.f.d.a.f.f.a.j.l.l.a.q.w.w.1.;.7.8.3.4.8.0.s.a.s.b.n.M.P.P.eXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXc.I.n.v.v.v.s.w.s.w.w.s.s.q.0.0.0.0.q.f.x.=.e 7 2 2 2 2 q 2 q 2 8 q 8 q 2 2 2 2 2 2 1 1 2 2 2 2 1 2 1 1 1 1 3 5 l 1.5.5.7.5.:.5.5.7.7.7.5.5.7.5.5.7.5.3.1.1.1.5.1.1.1.1.1.1.1.1.1.7.5.3.5.5.1.1.5.6.6.8.8.6.8.8.6.i.6.i.8.8.i.8.p.8.i.8.i.8.8.i.8.i.i.i.i.i.i.i.i.i.k.i.i.i.i.h.h.i.i.k.i.i.i.h.8.7.i.h.U.=XW.t.q.h.j.h.r.t.j.j.b.j.h.m.9.sXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3Xt.M.l.w.n.n.j.j.f.a.s.s.7.7.5.1.1.1.1.1.1.1.1.1.=.1.&.=.=.=.r =.=.r e w 7 q q q q q 8 1 8 8 1 2 5 5 5 e e 2.2.1.1.1.=.=.5.6.1.1.2.=.1.=.2.=.5.6.1.6.6.6.6.7.6.6.7.7.7.5.5.5.5.:.7.7.7.7.5.7.7.tXtX7.7.8.i.a.i.a.a.a.i.i.u.q.g.g.a.d.a.a.a.a.a.d.f.f.a.a.f.a.d.d.f.f.d.d.f.a.d.f.a.d.f.d.f.k.l.w.w.w.q.3.1.3.7.7.3.8.q.q.a.s.s.b.N.M.L.R.,XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXb.n.n.b.v.s.s.w.s.s.s.g.a.0.q.0.0.0.0.0.a.w.1.5 7 2 2 2 2 2 q q 2 2 q q 2 q q 2 2 2 2 2 2 2 8 2 2 2 1 1 q 1 4 4 3 5 u ;.1.5.5.5.5.5.3.5.5.7.5.5.5.3.5.5.1.5.1.1.1.5.1.1.1.2.1.1.1.5.5.1.1.5.5.5.5.8.8.6.6.8.8.p.i.8.i.6.i.i.i.p.8.8.p.i.i.i.8.8.i.i.i.i.i.i.i.k.i.k.p.i.i.i.i.i.i.i.i.i.i.i.i.a.q.8.i.k.r.R.;XT.r.a.j.j.z.h.h.j.N.t.w.k.h.V.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXc.N.v.s.b.c.n.f.a.a.a.q.7.7.5.1.1.7.2.1.1.1.1.1.2.1.1.5.=.2.=.=.=.=.=.w w w w q q q 2 2 q q 1 1 3 6 w e 2.=.1.=.5.=.=.1.=.2.2.1.5.=.2.5.5.=.1.5.1.5.1.1.2.1.5.7.7.7.7.7.6.6.6.7.7.7.7.7.7.8.8.8.tXtX7.i.i.i.i.h.i.i.i.x.i.a.q.g.g.a.d.a.f.a.s.f.d.a.f.f.f.f.a.d.f.d.f.d.f.f.a.a.d.f.d.d.d.l.l.q.a.j.w.3.u 3.7.3.3.8.8.8.q.a.w.j.b.n.B.P.R.;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXc.I.n.b.v.b.v.v.w.w.s.w.s.q.0.0.0.0.7.7.q.h.8.1.7 q 2 2 2 q 8 q 2 q q 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 q q q 1 1 4 4 2 2 5 u l u l 1.1.1.3.3.3.1.5.7.3.1.l 1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.5.1.5.6.5.5.5.8.8.6.8.6.6.i.i.6.6.x.8.6.8.i.8.8.8.i.i.p.i.i.8.h.k.i.i.i.d.p.k.i.h.i.i.i.i.i.i.i.i.i.i.i.x.a.i.d.8.z.!.;XE.h.8.h.z.r.t.h.t.c.h.j.h.9.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXT.t.b.n.b.m.b.j.f.f.a.q.7.5.7.3.1.1.1.2.1.&.e 1.;.2.=.1.2.6.2.=.=.=.=.=.=.=.e e e r r w w w w w t 5 l 1.1.2.2.1.=.5.=.5.1.5.2.5.1.5.1.=.5.1.1.1.1.6.1.5.6.5.5.5.5.7.7.7.5.8.8.8.8.u.u.7.7.7.i.i.i.tXtXa.a.i.i.i.i.i.i.h.h.a.a.a.a.a.a.a.a.a.d.d.d.a.f.d.a.d.a.f.f.a.s.d.s.f.a.d.f.f.a.a.f.l.l.s.s.l.h.3.3.4.3.3.3.3.8.8.8.q.w.w.s.v.N.B.L.R.wXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXb.I.n.n.v.v.b.s.w.w.,.s.g.g.q.q.q.w.0.3.3.0.a.q.3.5 5 3 3 2 q 1 3 3 3 3 3 3 3 2 1 1 3 2 3 1 1 q 2 2 1 2 2 q 2 q 3 1 q 1 1 1 2 3 q w e e w e l e e 2.=.w w 6 k 6 6 l &.6 1.l &.1.1.1.1.1.5.2.5.6.7.7.6.7.6.7.6.8.6.i.8.8.8.8.i.8.i.i.i.8.8.i.i.i.8.i.8.i.i.p.i.k.i.i.d.i.a.i.i.a.i.d.d.i.i.i.i.i.i.i.k.i.h.h.z.!.rXE.h.2.q.r.h.z.z.h.m.t.j.t.t.lXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,Xw.m.N.N.N.j.z.j.k.a.0.3.3.1.7.5.7.1.1.1.1.1.1.1.1.1.1.l ;.1.1.1.=.1.1.;.;.&.;.1.=.;.6 6 1.6 e ;.e 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.7.5.1.6.5.7.6.2.7.7.6.p.7.8.8.8.i.7.u.7.u.7.tXtX8.8.a.i.i.a.a.a.g.a.a.a.a.a.a.a.a.f.a.f.a.f.f.a.f.a.a.d.a.a.a.s.f.j.f.f.f.f.a.d.k.m.l.s.s.l.s.0.;.3.7.7.3.3.4.7.8.q.q.q.s.s.s.n.n.B.P.eXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXb.n.n.N.v.v.s.s.v.w.s.s.q.e.g.q.q.0.w.3.;.3.0.q.q.l 5 3 3 3 3 1 3 2 1 2 2 1 1 3 3 3 3 3 1 3 q 3 2 q q 2 q 2 2 2 q 1 2 2 1 1 2 3 3 2 2 3 3 3 3 5 5 5 5 3 5 5 5 6 e 6 1.1.1.1.1.1.1.1.1.1.1.5.1.6.5.6.7.7.7.6.6.8.6.i.i.8.i.i.8.i.8.8.i.i.x.i.i.8.i.i.a.i.i.i.k.p.i.i.i.i.i.i.a.i.i.i.i.i.i.h.i.h.i.i.k.k.h.a.x.m.T.rX-Xz.l 3.h.h.h.r.t.m.z.t.3.Z.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXc.n.c.b.N.z.j.j.k.a.q.7.3.1.1.1.1.1.1.1.1.1.1.1.1.6 =.1.1.1.1.1.1.1.1.l 1.1.1.e 1.6 1.1.l 6 1.l l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.6.5.5.5.1.5.1.1.7.1.7.6.7.7.7.7.6.7.7.p.8.8.p.7.8.a.i.8.i.tXtXa.a.i.i.a.i.a.a.a.a.a.a.a.a.a.f.a.a.d.a.f.a.k.a.f.d.f.f.f.f.f.f.a.a.a.f.l.f.a.n.J.n.s.s.n.0.3.:.3.3.3.3.3.7.4.7.8.q.q.0.s.s.b.n.B.B.P.wXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXb.I.v.N.v.b.v.w.w.s.w.w.w.q.q.q.0.q.7.7.4.7.0.0.q.r.4.5 7 7 2 3 3 2 2 3 2 2 2 3 3 3 4 3 q 3 4 3 3 2 3 3 3 2 2 2 3 3 1 3 2 2 2 2 2 2 7 2 4 3 3 3 3 5 5 5 5 5 l l =.e 1.1.1.1.1.1.1.1.1.1.5.2.1.6.6.4.7.6.7.6.6.8.6.i.6.8.8.i.8.8.i.i.p.8.a.i.i.i.i.i.i.i.i.i.i.d.d.i.i.i.d.i.a.i.a.i.i.i.i.h.i.i.x.i.i.i.p.8.a.8.z.W.wXrXZ.3.3.i.h.h.h.j.t.N.t.x <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X9.N.N.z.N.N.j.j.a.q.5.3.5.5.1.1.1.1.1.1.1.1.1.&.1.1.1.1.=.1.=.l 1.1.e 1.1.1.1.;.1.l 1.1.6 1.1.6 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.6.1.2.5.1.5.1.5.5.6.7.6.7.2.7.6.6.7.8.7.8.8.p.8.8.u.8.7.u.q.tXtXi.i.a.a.i.a.a.a.a.g.a.a.a.f.d.a.a.d.a.f.f.d.f.a.f.f.d.f.d.j.j.a.a.f.a.s.k.k.l.H.l.a.a.n.j.3.;.:.4.3.3.3.3.3.4.8.8.q.a.w.w.s.b.n.N.K.P.wXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZXc.B.v.n.v.v.s.s.s.s.,.g.g.q.q.q.q.q.7.0.0.0.7.3.3.a.q.3.i 5 3 3 1 3 2 3 2 3 3 4 1 3 1 3 4 3 3 4 3 3 1 3 3 3 3 2 1 3 3 3 3 3 3 3 q 7 5 5 i 3 q w w w w l l l l 2.2.1.1.1.1.1.1.1.1.1.1.5.1.5.1.5.5.7.6.7.6.7.8.8.6.i.i.8.8.8.p.8.i.8.i.8.i.i.h.8.i.i.i.8.i.k.i.i.d.i.i.i.i.i.i.i.d.i.d.i.i.i.i.h.i.a.i.i.8.8.h.x.8.z.R.=XrX!.8.3.h.j.n.h.t.h.j.9.V.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXc.M.N.m.m.n.n.l.h.q.7.5.5.7.3.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.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.5.1.5.1.5.1.7.5.6.7.6.7.6.7.8.6.8.8.p.8.8.i.i.8.u.a.i.7.tXtXi.i.a.i.a.a.a.a.a.a.a.d.d.a.d.s.a.d.a.f.a.f.f.k.k.a.f.d.a.f.f.j.j.f.s.f.k.l.l.f.8.w.b.j.w.0.3.e.7.7.3.3.3.7.4.4.8.8.0.w.w.s.b.n.n.P.P.wXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXc.I.n.b.b.s.s.w.w.s.s.s.0.a.0.a.q.8.q.8.0.4.3.3.3.7.q.s.4.u 5 3 3 3 3 3 3 3 3 1 3 3 3 3 q 3 3 3 3 3 3 3 3 1 3 3 4 3 3 3 3 2 2 2 5 5 w w 5 w w w e l e e l 1.e 1.=.1.1.1.1.1.1.1.1.=.5.5.1.6.1.2.2.6.7.6.6.7.8.8.8.8.8.i.i.i.8.i.8.i.i.i.i.8.i.i.i.i.8.i.i.i.i.i.i.i.i.d.d.d.g.i.i.d.i.i.h.i.h.i.h.i.i.h.a.i.h.i.i.h.h.U.rXrX!.r.u s.j.j.n.h.t.h.e.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xb.K.M.m.m.m.l.f.0.3.1.3.7.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.=.5.=.1.1.=.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.2.7.2.1.6.6.5.5.5.1.7.7.4.6.6.6.7.6.6.8.8.8.8.p.8.8.p.8.i.8.a.8.i.tXtXa.a.a.a.a.a.a.a.a.a.a.a.d.a.a.a.f.d.a.f.f.f.k.k.f.f.f.d.k.f.f.a.j.k.l.k.n.n.s.3.q.j.s.0.4.7.0.7.4.3.4.3.3.3.7.8.8.q.q.w.w.s.v.v.N.P.U.;XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXc.I.n.n.n.v.b.s.w.s.w.s.s.s.w.q.0.q.q.7.3.7.7.3.3.:.5.0.q.q.z i 3 3 3 3 q 3 3 q 3 3 1 3 3 3 3 3 3 3 3 3 3 3 4 3 3 p 3 3 3 3 q 2 w w w w w 5 e e e e e l l e =.1.=.=.1.1.1.1.1.1.1.1.1.5.5.5.5.6.6.6.7.7.6.6.8.8.6.8.8.8.6.i.i.6.i.i.8.i.i.i.i.i.i.i.a.i.i.i.i.k.i.i.i.i.i.i.i.i.i.i.i.d.i.k.i.h.i.h.h.q.h.i.i.i.d.i.k.z.z..XeXW.z 7.a.h.z.m.t.z.q.V.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZXc.N.M.m.m.n.n.z.0.5.5.7.7.7.1.1.2.1.1.1.1.1.1.1.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.&.1.1.5.5.5.5.=.1.;.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.2.5.5.6.1.5.2.2.5.5.6.6.6.7.7.7.6.8.8.8.8.8.p.8.8.i.8.8.i.u.a.a.i.tXtXi.i.a.a.a.a.a.a.a.a.f.a.a.f.f.d.f.a.d.d.d.k.f.f.f.k.k.f.f.f.f.j.f.l.l.l.l.s.q.s.j.s.0.4.7.0.4.3.4.7.7.3.5.7.4.7.8.q.q.q.w.j.b.N.N.P.P.:XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXb.I.n.n.n.v.s.s.s.s.w.w.0.s.q.q.q.7.4.4.3.0.0.3.3.:.;.;.8.q.4.3.5 5 3 3 3 q q q 1 1 3 3 3 3 3 3 3 p 3 3 3 4 4 3 3 3 p 3 5 w w w w w e e e e 1.e 2.2.=.l 1.1.1.1.1.1.1.1.1.1.1.=.1.1.1.5.1.2.1.6.5.7.7.6.7.6.6.8.i.8.8.p.8.i.6.i.i.p.i.i.i.i.i.i.p.i.i.a.i.i.i.i.a.a.a.i.a.a.i.d.d.i.i.a.i.k.k.h.a.a.h.i.i.k.k.i.i.i.i.a.r.m.=X;XE.h.4.r.h.N.z.j.j.x 6XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,Xc.n.K.m.n.n.b.g.7.;.7.7.7.1.1.=.1.1.1.1.;.1.1.1.1.1.=.1.1.=.e 1.1.1.1.1.&.1.5.5.1.l c k 3 w r 2.=.5.&.p.:.1.1.1.6.6.2.1.&.1.1.5.5.2.6.2.1.5.6.6.5.2.5.5.1.7.6.7.7.6.7.7.7.6.8.8.8.p.8.p.7.i.i.i.i.7.8.i.tXtXa.a.a.a.a.a.a.a.a.a.f.a.a.f.a.a.s.d.a.j.f.j.f.d.f.d.f.f.k.f.a.j.l.n.l.j.a.s.a.j.s.0.e.7.q.7.3.3.7.4.3.3.3.7.7.8.8.8.8.w.a.s.b.b.n.P.P.;XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXNXc.I.n.b.b.s.s.s.s.w.s.g.w.0.0.q.q.q.q.7.0.7.4.7.7.7.7.:.1.3.8.a.4.l i 3 1 q q 4 p p 4 4 4 3 3 3 3 3 3 3 3 3 3 3 q 3 q w 5 5 5 5 e 6 e e 1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.1.5.1.1.5.5.3.6.7.1.5.7.6.7.7.6.8.6.p.8.8.6.6.6.8.x.p.x.k.i.i.i.h.i.i.a.a.a.7.q.8.q.0.a.s.a.u.i.a.d.i.i.a.k.i.i.a.a.a.i.i.i.h.i.i.d.d.i.i.a.a.z..XeXS.9.q.k.z.z.z.F.4.A.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXA.l.U.m.J.n.n.s.3.3.4.1.7.1.1.1.1.6 1.1.1.1.1.1.1.l 2.1.=.=.1.e 1.1.=.1.1.1.;.5.=.5 , > % & @ % > q e &.p.u.z 1.1.2.5.-.6.5.=.=.=.=.-.-.1.1.1.1.5.5.7.5.1.7.1.5.6.6.4.1.7.7.7.8.8.8.8.8.8.u.8.u.7.8.i.a.i.tXtX8.a.a.a.a.a.a.d.a.a.a.a.d.a.f.f.f.f.f.f.a.a.f.f.d.d.f.k.l.a.j.j.l.j.a.q.j.j.h.q.0.0.q.q.8.8.8.7.7.3.3.7.4.3.4.7.8.q.8.a.a.j.v.b.M.B.P.;XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXw.I.n.b.v.v.v.,.v.w.s.w.s.a.0.0.0.q.8.q.4.7.7.4.3.7.7.3.3.7.7.0.0.7.1.u q q 3 3 p 3 3 3 2 2 5 3 3 3 q 5 3 q 3 3 3 3 5 w w 5 k w 6 l l l 1.1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.6.5.1.5.6.5.4.5.6.1.5.1.7.7.6.7.5.5.7.8.8.p.8.7.i.i.p.i.i.i.k.a.a.a.q.0.0.8.7.7.7.7.5.5.:.5.7.a.a.7.i.i.i.i.i.i.i.d.a.i.i.i.i.h.k.i.k.i.i.a.8.q.m. X-X~.r.4.z.Z.h.J.r.y.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXc.J.U.Z.m.m.j.7.3.3.3.1.1.1.1.1.&.&.1.1.1.1.=.1.l k k l 2.1.1.l ;.:.;.3.l r e t 0 0 * % * * % % * > 0 0 3 l 6.5.1.1.1.;.3.3.1.1.2.l 3.l 1.5.1.1.5.6.1.7.1.6.1.7.6.6.3.6.7.7.8.7.7.7.q.8.u.q.i.7.i.a.7.a.a.tXtXa.a.a.a.a.d.a.d.d.a.s.d.a.f.a.f.f.f.f.a.f.f.k.f.k.k.l.f.l.l.n.n.h.q.a.m.j.s.s.w.q.0.q.8.8.7.4.7.3.3.3.7.7.3.4.8.8.8.8.w.h.w.b.b.N.L.P.:XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXw.H.n.b.s.v.v.w.w.s.w.q.0.q.q.0.0.q.8.4.7.4.7.7.3.7.7.3.3.5.5.5.7.7.0.7.1.u 5 3 2 3 3 q q w q 5 5 q 3 3 q q p 3 k 5 w 5 k i 5 k e e l e 1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.=.5.1.=.1.1.5.1.5.5.3.5.7.3.6.6.7.6.6.7.5.7.8.u.8.8.8.7.7.7.i.a.i.8.a.a.a.q.q.3.3.7.5.5.5.:.:.&.;.6 &.&.;.7.8.q.a.k.k.k.i.d.p.i.i.h.i.i.i.h.i.i.i.h.q.8.q.Z..X=XU.4.q.z.n.z.h.x &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX XN.K.U.m.J.l.q.;.3.3.1.1.1.1.l 1.1.1.1.l 1.1.1.1.=.k l 1.7.7.1.u :.;.3.z k q 0 * * * * * * = * * * * * - * 0 q q l 3.3.:.:.1.1.1.1.z z z 5.1.5.7.1.7.6.5.5.2.7.7.7.7.4.7.7.7.8.u.8.u.u.7.7.i.7.8.u.i.a.a.i.tXtXa.a.a.a.a.a.d.a.a.a.d.f.a.f.d.f.f.a.j.j.a.f.l.k.f.a.l.l.m.n.f.w.w.j.j.s.a.s.q.q.7.0.q.q.8.q.0.7.3.3.3.3.3.7.4.4.8.q.8.w.w.j.b.n.B.B.P.:XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXMXw.I.b.b.v.s.v.w.s.w.s.g.s.0.0.0.0.8.q.4.7.4.3.0.3.7.7.5.;.3.5.3.:.7.0.0.7.5.;.5 5 5 3 q q q q 3 3 3 3 3 3 5 3 k 3 k w 5 5 k l k e l l e 1.&.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.6.1.1.5.5.6.5.4.5.2.7.6.6.7.6.8.u.8.i.p.8.8.p.i.i.h.a.q.q.q.7.7.8.q.7.3.7.4.4.4.1.l 1.1.l l 6 5 5 6 l 1.6.i.k.k.d.i.i.i.i.i.h.i.i.i.i.a.h.h.a.a.h.m.!.!.m.z r.m.l.z.y.V.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXZ.B.m.M.l.m.s.3.1.7.3.1.1.&.1.1.1.1.1.1.1.1.l ;.1.1.1.5.5.5.5.5.;.1.c q 0 0 y = = = = = = = = = = = = = * = * * 0 0 h k z 3.l 1.5.p.5.3.3.1.5.1.7.6.5.6.2.7.7.6.6.7.7.4.7.7.7.8.i.u.i.7.8.i.u.i.7.a.u.8.i.i.tXtXa.a.a.a.a.a.a.a.f.a.s.a.f.d.f.j.f.f.k.f.j.j.j.j.k.l.l.l.l.a.a.s.j.s.a.q.q.q.q.0.0.q.q.q.q.8.7.4.7.3.0.7.3.3.7.8.8.8.a.r.h.s.b.b.N.L.P.XXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXlXv.I.b.b.v.b.v.s.s.s.w.e.0.w.q.0.0.q.7.0.0.0.7.3.3.7.7.3.5.3.;.3.7.:.5.5.7.8.a.3.2.l 5 5 3 3 3 q q w w q w q w 3 w w w w e 5 6 l l l =.l 1.1.l 1.1.1.1.1.1.1.1.1.1.1.=.1.=.5.1.6.1.5.1.5.5.1.5.6.5.7.6.7.7.5.7.8.8.p.7.8.p.8.i.d.k.j.q.q.a.w.e.z k i 3 4 3 , 4 , , , , , < , 4 w 3 7 7 5 e 1.6.i.k.G.d.i.h.i.i.i.h.k.h.i.i.a.i.i.i.h.Y.=X!.r.3.l.M.n.j.9.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXN.Z.b.M.n.z.3.;.3.8.1.6 l 1.6 1.1.1.l 1.&.1.1.1.1.1.&.-.=.6.=.r w 0 0 0 = ; ; ; C C C C C C J C C C C = = = = = = 0 0 0 q k c 2.p.p.u.7.1.5.7.5.7.6.7.7.6.7.6.7.6.6.6.7.7.7.7.8.7.i.7.i.u.7.a.8.a.i.a.a.i.a.tXdXa.a.a.a.f.a.d.a.d.f.d.d.d.f.a.f.j.f.l.l.l.l.f.l.n.n.l.a.w.a.l.n.s.0.7.0.0.0.0.q.q.q.q.q.q.q.0.0.7.3.3.3.7.3.4.8.8.8.8.h.w.j.v.v.B.K.P.XXFXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXb.H.n.b.v.b.s.s.s.q.s.g.g.w.0.q.0.8.8.4.4.7.7.7.7.3.5.7.7.3.;.7.3.3.3.1.5.7.0.7.7.7.3.u 3 3 3 3 k 3 5 q 3 w k 5 5 w w e e l e l 1.e 1.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.5.1.5.5.7.1.5.7.5.5.7.5.6.7.7.7.7.7.7.i.i.h.a.a.d.a.q.w.,.4 # X X X X X X . . . . . . . X . + < q 5 e 7 4 5 u 1.p.a.i.i.i.i.a.i.h.i.a.i.a.i.i.i.k.k.k.Y..XZ.4.3.n.J.k.y.%XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%Xm.M.b.N.j.q.3.3.3.3.1.1.e 1.1.1.l 1.1.1.1.1.1.1.1.1.:.5.3.c t 0 0 = = ; ; C C C G G C Z C C C C C C C C J C = ; = = * * * 0 0 q c 2.p.1.1.1.5.5.7.5.6.6.2.7.6.7.7.7.7.7.7.7.8.7.p.p.u.i.u.i.u.i.7.i.a.8.a.a.tXtXa.a.a.a.a.a.a.f.a.a.f.d.f.d.f.k.l.j.l.l.l.l.m.l.s.0.s.s.k.l.s.w.0.0.0.0.7.0.q.q.q.q.0.q.8.8.q.4.4.7.3.3.7.3.4.8.8.8.8.h.h.w.b.b.N.P.R..XHXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXb.I.n.b.v.s.s.w.s.s.w.g.w.0.0.0.0.7.q.q.7.0.7.7.7.3.3.7.5.7.7.3.l 3.4.4.7.5.1.5.7.7.4.3.z i i q 3 5 q 3 w q w w w w w e w l e e e 1.=.1.1.l 1.1.1.1.1.1.1.1.1.1.1.1.=.1.1.5.1.5.2.5.1.5.1.6.6.7.7.2.6.6.6.3.7.6.5.5.u.i.h.k.l.k.a.a.q.w.p + o % % % % > > f f f g f % o . # 1 w 7 7 4 4 7 5 1.1.8.i.h.i.i.h.h.a.i.h.a.d.i.k.i.i.x.z.T.E.h.;.w.J.z.t.y.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXJXW.K.K.M.b.a.3.3.3.7.1.l 1.;.1.1.&.1.6 =.1.1.1.1.1.1.2.u i 3 0 0 y ; ; C C C Z A D D F ( ( D S G G G G C C C C C V C ; = = = * % 0 q q r 2.2.6.7.5.5.5.7.7.7.6.6.7.6.7.7.7.8.7.8.8.8.i.q.7.8.a.a.7.a.a.i.a.i.a.tXtXa.a.a.f.a.f.d.a.f.a.a.f.f.f.f.k.l.l.J.n.n.l.w.s.s.s.f.s.s.w.0.0.3.7.7.0.q.q.7.q.q.q.0.8.q.q.8.8.7.4.7.7.3.7.7.7.8.q.8.q.s.h.b.v.B.P.P.XXHXKXKXKXKXKXKXKXKXKXKXKX KX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXpXv.v.N.b.v.v.b.s.w.w.s.0.0.0.0.0.0.7.7.7.3.0.3.3.7.3.7.3.3.7.3.:.3.5.3.5.3.5.3.3.3.3.4.7.8.8.4.z k k 3 3 w i 5 5 5 w w k l 6 1.;.1.1.l l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.5.5.5.1.6.1.1.5.1.7.6.6.6.2.1.1.5.6.6.1.7.0.a.f.k.f.f.s.w.d.d.a.4 . . $ m X%X|.|.%XW././.S.|.S.@Xn o X , 5 2 2 3 5 7 2 3 3 2.8.h.k.i.d.d.d.h.a.a.a.h.i.a.i.x.h.z.~.m.7.7.t.N.j.t.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXCXA.n.M.N.b.3.4.3.1.1.1.1.1.1.1.1.1.1.1.1.:.;.1.l l x 2.> 0 * = = C C C C U S ( ( ) _ { | | | { { ) ( F G G C C C C C V Y J = = = * * - 0 q 2.x.6.5.:.u.8.6.1.7.7.5.7.7.7.8.7.8.8.8.8.8.7.i.a.u.8.a.i.i.0.a.a.a.tXtXa.s.a.f.a.a.a.f.f.s.a.a.f.d.f.l.l.m.l.l.f.w.0.w.b.n.v.0.:.4.0.7.7.q.0.q.q.q.q.q.q.q.q.8.8.4.8.3.3.7.3.3.1.3.3.4.4.8.q.q.w.w.s.b.B.K.P.XXFXKXKXKXKXKXKXKXKXKXKXKX KX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXv.v.n.t.v.v.s.s.s.s.w.s.0.a.0.0.0.7.0.7.7.3.0.3.e.3.3.5.7.5.5.3.5.3.:.3.5.3.5.3.3.3.3.3.7.7.4.4.3.3.l i 5 5 k l l l l k u 1.l l u 1.1.&.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.2.2.5.1.5.1.5.5.7.1.7.2.6.6.6.6.7.1.7.0.w.s.j.j.f.a.a.s.d.d.a., . o g %X4X6X4X4X<X6X6X6X<X4X4X1XC.$ + < 2 q 7 7 3 5 2 5 3 6 1.p.i.i.i.i.i.i.h.i.a.a.a.a.a.h.a.a.z.U.z.2.e.m.n.9.<XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXgXV.m.M.b.q.3.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.;.1.l q 0 0 0 ; ; C C G A D D { _ O.} } O.| $.$.$.qXUXqXUX{ %.U A G G C C C C ; ; ; = * * % % : e c 7.7.5.5.5.1.7.7.5.7.7.7.7.7.8.8.8.8.8.7.i.8.i.7.i.q.u.a.u.a.a.tXtXa.a.a.a.s.a.a.a.s.l.l.f.f.l.J.J.l.a.q.a.w.s.b.s.q.e.3.:.;.4.7.4.8.7.8.8.7.q.q.q.q.q.q.q.q.8.8.7.7.3.3.3.7.3.7.7.4.8.8.w.s.s.s.b.B.P.P.oXFXKXKXKXKXKXKXKXKXKXKXKX KX KXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXiXv.v.n.v.w.v.w.s.w.w.w.0.0.0.0.0.0.0.4.0.7.3.0.3.3.3.7.7.3.3.3.5.3.5.3.7.;.7.7.;.3.;.3.3.3.3.7.0.7.0.3.3.u u u u 5 l 5 l 6 1.1.u 1.l 1.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.1.6.1.6.1.1.5.7.2.7.1.7.2.2.7.8.6.7.5.a.a.f.j.l.j.f.a.s.g.s.a.a., . O m 7XzXmXZXZXmXBXBXBXBXCXGXBX*X% o < 2 w 7 3 7 3 3 7 w 3 7 u 7.i.a.i.i.a.a.i.a.h.a.i.h.d.a.a.h.J.U.8.3.c.m.r.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xt.K.n.w.;.1.7.1.1.1.1.1.1.1.1.1.1.l 1.1.c &.:.7.w 0 * = = C G G F ( ) ) _ _ O.O.@.O.$.X.$.#.qX0XIXIXIXIXIXqX| %.A G G G C ; ; ; ; ; * * & & < q 2.8.5.6.6.7.5.7.5.7.6.7.8.8.8.8.8.8.8.i.i.i.7.a.i.u.a.u.a.a.a.uXtXa.s.a.a.a.s.a.k.f.a.a.l.z.J.k.7.q.a.h.j.h.j.e.4.l l 3.3.8.7.7.8.4.7.q.q.q.q.q.q.q.q.0.8.8.8.8.8.4.4.3.3.3.3.3.7.8.8.q.q.w.s.j.b.N.K.P.oXFXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXv.v.N.v.v.v.s.w.s.s.s.w.0.0.0.0.0.0.7.7.3.0.3.7.3.7.7.5.5.7.5.3.:.3.5.3.5.3.3.;.3.3.;.3.3.3.;.:.:.7.3.0.e.e.z l i 5 u l l 6 1.e l l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.1.1.5.1.5.5.5.1.6.5.6.6.6.5.7.8.j.l.l.l.l.f.a.h.s.0.d.g.a., . @ M 6XzXlXxXzXmXzXzXzXzXmXSXDX6X% X 8 e 2 5 7 3 7 3 7 7 2 7 5 6 3.i.a.a.a.a.k.i.i.a.a.i.i.d.h.h.z.U.h.u w.J.j.c.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKX%Xw.K.b.w.u 5.2.1.1.1.6 1.6 1.1.&.1.1.1.1.r &.:.1.q * = ; C G A ( ) ' ' ` ` O.O.O.O.+.+.$.$.0X0X0XqXLXKXKXKXKXPXIXUX%.U G G C C ; ; ; = * * & @ , c 6.8.8.6.7.7.7.7.8.7.7.8.8.8.8.8.a.8.q.8.i.8.i.a.8.a.a.g.a.a.tXtXa.s.a.s.a.a.a.j.f.l.m.m.j.a.q.r.t.h.r.q.3.u l l l 3.3.3.7.8.7.4.q.7.q.8.7.q.q.q.q.0.0.q.r.8.q.8.7.4.3.3.7.3.3.7.4.8.q.q.w.w.j.b.M.K.P.oXFXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3Xv.I.N.b.w.v.v.s.w.w.g.g.0.0.0.0.0.3.4.7.0.3.3.3.7.7.7.3.3.7.;.7.3.5.:.3.3.5.3.3.;.3.3.3.3.;.3.1.;.;.z 3.4.4.8.4.4.2.l u u 1.1.1.1.1.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.1.6.1.5.5.1.5.5.6.1.5.7.7.6.6.1.7.8.h.z.l.l.l.l.k.a.j.a.w.a.i.q.< . O n &XaXsXsXgXgXaXaXhXaXaXmXAX5X% X , 7 2 2 5 7 2 2 3 3 3 7 7 7 u 7.h.k.a.a.a.a.i.a.k.d.i.i.a.k.k.J.U.3.3.l.J.y.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXJX Xt.J.s.4.3.6.1.1.1.1.1.&.l &.1.1.1.1.1.1.l 1.7.c 0 ; C C Z D ( ' ' ` ` ` ] O.O.O.$.O.o.o.$.#.0X0XqXIXPXLXKXKXKXLXLXqX| D D G G C C C = ; * * & % q 2.p.8.6.7.7.7.7.7.7.7.8.8.8.8.a.a.8.i.i.u.i.8.a.a.a.q.a.a.a.tXtXa.a.a.a.a.j.k.l.J.z.k.q.q.w.t.r.9.z k i 5 i l l 3.4.4.3.5.3.0.0.0.0.q.8.q.q.0.q.q.q.q.8.a.8.8.8.7.7.7.3.3.3.3.4.8.8.8.q.a.s.b.b.N.K.P.oXFXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xv.I.b.b.v.v.v.s.s.w.w.q.0.w.0.0.0.0.0.7.3.0.0.3.3.7.7.3.5.7.5.3.5.3.3.7.:.3.7.;.3.3.;.3.1.3.3.z l u u i i 1.4.4.q.8.4.1.l 1.u 1.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.6.1.2.5.1.5.1.7.7.6.6.5.1.7.8.h.l.l.j.l.l.j.j.j.j.s.s.d.i.a.< . O v $XiXpXsXaX<X2X<XsXaXaXhXmX5X> X < q 7 7 3 7 2 7 3 7 2 7 5 5 5 u 7.x.a.a.h.i.h.a.i.k.i.p.i.h.k.z.U.w.;.d.J.y.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXVXA.j.F.s.z 4.1.1.1.1.1.1.1.1.1.1.1.1.6 1.1.5.5.2.t 0 C G F D ) _ ' ` ` ` ` ] ] O.O.$.o.X.o.o.$.#.#.0X0XIXIXLXKXKXLXKXPXIX| { D A A C C V C = * * % , 2.6.7.2.7.7.7.7.7.7.8.8.8.8.8.8.8.8.i.a.q.a.a.i.i.a.a.a.a.a.tXtXa.a.f.f.k.k.k.l.d.a.a.w.r.9.z k k 3 3 5 k k u u l 3.3.0.0.7.4.7.8.4.8.8.0.q.q.a.q.q.0.q.q.8.8.8.7.4.7.3.3.3.7.8.8.8.8.q.w.w.s.n.N.K.I.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xv.I.v.v.v.v.w.w.s.s.s.q.g.0.0.0.0.7.4.0.7.7.7.7.3.7.7.7.7.3.;.7.3.5.7.3.5.3.3.3.3.;.3.3.3.;.3.z l k w q 3 5 u u 1.3.4.q.1.1.l 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.5.2.5.6.5.5.1.5.5.7.5.7.1.1.1.5.h.z.k.l.j.k.k.j.l.f.h.a.w.a.u.8., . o j #X6XiXpXgX1X%X>XiXiXsXxXmX7X% X , 5 5 7 5 2 2 2 7 3 8 3 5 5 7 7 l 7.d.a.i.h.i.a.i.i.k.i.i.k.h.k.Y.z.;.a.z.Z.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXzXc.j.k.q.l 7.1.1.1.1.1.1.1.6 1.1.1.1.1.1.6 ;.5.c h ; Z F ( ) _ ' ' ` ` ` ` ] ] ] O.O. .X. ...o.$.#.#.0XqXIXIXIXIXIXPXIXqXqX$.{ ( D G C C C = = * % < e 6.5.2.7.7.7.8.7.8.8.8.8.8.q.8.8.q.8.a.i.a.i.a.a.a.a.a.a.a.tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXdXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&Xv.v.b.b.v.s.s.s.s.w.q.g.w.w.0.q.q.7.7.7.:.3.3.7.7.7.3.5.7.5.3.7.:.3.;.5.3.3.:.3.3.3.3.3.3.;.3.;.l l u i i i 5 5 5 i l z 8.i.5.1.u l u l 1.1.1.l l 1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.5.5.1.5.a.l.l.n.l.f.j.f.j.j.f.a.s.0.w.q.l : . o g $X6XdXsXaX1X>X%X<XpX7XzXBX3X> . < 6 6 3 2 2 8 7 2 8 3 7 7 5 5 5 7 1.p.k.k.i.k.a.a.i.d.h.a.a.a.k.F.U.q.1.h.m.E.KXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXyXf.n.a.4.1.l 1.2.1.1.1.1.1.1.1.1.1.&.1.1.1.;.7.q ; G F ( ) ) ) _ ' ` ` ` ` ` ` ] ] ] .] .......+.+.$.#.0X0XqXqXqX0X0X0X0X$.$.| ) F G G C C = = * % < l p.p.7.5.8.p.7.8.p.8.7.i.u.q.i.i.a.8.i.8.8.a.a.u.7.q.q.a.tXtXtXdXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xv.v.b.b.v.v.s.s.w.w.w.q.q.q.0.8.0.7.0.7.3.0.3.0.7.3.7.5.3.3.5.5.3.3.3.3.5.3.3.3.3.;.3.3.3.3.3.3.1.l l i 5 k i 5 5 5 5 i l 1.7.7.1.1.6 1.l 1.l l 6 1.1.1.1.1.1.1.1.1.5.1.3.6.1.1.1.1.1.5.5.1.3.5.1.3.7.f.l.l.n.l.l.l.k.l.j.a.a.a.e.8.8.3.< . o j $X6XsXiX1X<X<X%X2XiXaXhXmXiX> . < e e 5 7 7 3 2 7 7 2 2 7 7 5 7 7 e p.h.i.i.a.a.a.i.i.a.a.a.h.i.z.U.h.7.q.z.T.KXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKX>Xs.j.q.1.l l l 1.1.l 1.&.1.6 1.1.1.1.1.1.;.;.u 0 Y S ( ) ) _ _ ' ' ` ` ` ` ` ` ` ] ] ] ] ] ] ] ] ..o.+.+.#.#.0X0X0X0X0X0X#.#.$.O.} ) F G C C C = * - > c 8.i.5.u.7.7.7.p.8.u.u.a.i.u.i.8.i.a.i.a.i.a.i.0.a.s.a.a.a.a.k.n.k.h.h.q.4.3.c c k 5 3 5 5 q i w i i l u 1.1.3.3.3.7.3.0.7.7.q.4.4.q.q.q.q.q.q.q.a.q.q.8.q.8.8.4.4.7.3.3.3.3.3.8.8.w.s.s.b.b.B.P.P.oXFXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xv.B.B.b.v.s.s.s.s.w.0.w.a.q.0.q.0.7.7.0.3.3.:.3.7.5.3.3.5.7.7.3.7.5.7.5.5.5.5.3.3.3.3.3.3.3.3.3.u l u i u w 5 5 5 5 3 7 3 i l 4.8.5.;.&.e 6 1.1.1.l 1.1.1.1.1.1.1.1.2.1.1.1.5.1.5.1.1.5.1.5.5.5.1.7.a.l.l.l.l.n.l.k.h.j.a.a.s.g.7.3.7.4.< . o j %XiXsXdX>X1X<X$X%X1XfXfXmXyXf : r 6 3 7 7 7 7 7 2 2 7 4 7 7 7 5 6 =.i.d.h.h.d.a.a.d.i.h.i.a.h.k.F.z.7.7.z.R.HXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKX$X0.s.4.l l 6 1.1.1.1.1.1.1.1.1.l 1.l 1.1.5.5.q N U ( ( ) ) ) _ ' ' ' ` ` ` ` ` ` ` ` ` ] ] ] ] [ ..+.#.#.#.0X#.#.#.#.#.#.#.#.#.+...| ) F G C C ; = * > q 4.p.7.7.8.p.7.i.8.7.i.7.7.8.i.i.8.i.i.i.a.a.a.i.a.a.s.a.a.k.l.l.j.w.4.3.z l 3 i i 5 i 5 5 w w k k l l l l 3.3.3.3.3.0.3.0.4.7.7.q.8.q.0.q.q.a.q.q.q.q.8.q.q.8.8.7.4.3.3.3.7.7.7.q.q.s.s.b.b.N.P.P.oXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXb.I.N.v.b.w.v.w.s.w.w.g.0.q.0.8.8.8.7.7.7.3.:.3.0.3.7.7.5.3.3.7.3.5.3.3.5.7.7.3.3.3.3.3.3.3.5.3.;.z u l l 5 5 5 5 5 5 5 5 p 3 k 4.q.8.5.l l 2.1.l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.5.7.5.8.k.J.l.l.l.j.s.a.a.a.a.7.u.a.7.1.5.4.< . o j @XpXfXyX,X1X4X1X%X*XpXjXBXiXg . $ c 7 3 7 7 7 7 7 2 3 3 3 3 7 7 7 7 7 7.q.h.a.a.a.i.a.h.a.a.a.d.j.z.m.8.3.h.Z.VXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXHXW.s.q.3.3.l l 1.1.1.1.1.1.1.l 1.&.1.1.1.1.4.4.g ; ( ( ) ) ) ) ' ' ' ' ' ' ' ' ` ` ` ` ] ] ] ] ] [ ..+.#.0X0X0X0X#.+.+.+.+.+.+.+.+...] _ ) F G C C = - % 0 k 8.7.7.8.p.8.8.u.i.7.7.a.8.i.a.a.i.i.a.a.i.a.a.a.j.f.a.f.l.j.h.w.q.3.l z i i 5 k i 5 5 i w w w u u l u l 3.3.3.3.3.7.7.7.7.7.q.8.q.q.q.q.q.q.q.q.q.a.q.q.8.q.7.7.4.3.3.3.3.7.8.7.s.a.s.j.b.N.K.P.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xn.L.N.v.v.v.w.v.s.0.0.s.q.q.0.q.q.8.7.7.7.3.7.0.7.3.3.5.7.7.5.5.7.7.7.7.7.7.7.3.3.7.3.7.4.3.3.3.3.3.l u u i 5 k i k k 5 k 3 p i l 8.8.8.1.1.1.l 1.l 1.1.1.1.1.1.1.1.1.1.1.1.7.1.5.1.5.5.1.5.1.1.7.h.z.l.k.l.j.f.a.a.w.q.q.a.q.7.3.l 1.k : o g @XpXyX1X1X1X>X<X2X@X*XjXBXsXg . $ c i 3 q 7 3 3 2 8 2 3 3 3 2 3 7 7 7 u 8.a.h.a.a.i.a.a.a.i.h.h.h.k.J.a.3.q.Z.BXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXVXA.s.0.3.3.l 3.l 1.1.1.&.1.1.1.1.l 1.l 1.1.3.h N Z ( ( ( ) ' ' ' ' ' ' ' ' ' ' ' ` ` ] ] ] ] ] ] [ ..o.+.#.#.#.#.+.@.....@.@.@.+.+.@...] _ ( A G C C = - > i 4.7.7.7.7.8.p.7.i.i.i.u.a.u.i.i.i.a.a.h.a.a.a.a.a.a.a.j.k.a.e.4.4.z c l k k k k k i k i w w w l l 1.l 1.;.3.3.3.e.7.3.7.e.4.q.q.8.0.q.q.q.a.q.a.q.q.8.q.q.q.7.7.7.5.3.3.7.4.8.q.q.s.s.b.b.M.K.P.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&Xv.I.B.b.v.v.s.v.s.w.0.s.a.0.0.8.q.8.7.7.3.:.:.7.7.3.3.7.3.5.7.3.7.7.7.7.7.5.7.3.3.7.7.3.3.7.3.3.3.l u l l k l k k i i i i i k k l k 4.r.7.2.2.l 6 l 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.3.5.1.i.k.z.l.j.f.f.a.a.a.s.w.0.0.q.4.z z z c : o g %XsXpX1X,X1X>X<X1X%X$XgXzXdXj . @ c i 3 q 3 3 3 3 1 2 1 2 8 3 7 3 7 7 7 1.a.d.i.i.a.a.i.i.k.a.a.a.k.J.z.3.4.Z.jXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXCXV.s.e.3.l l 1.1.1.6 1.1.1.1.1.6 1.1.2.1.1.1.t ; F ( ( ) ) ) ' ) ' ' ' ' ' ' ' ' ' ` ] ] ] ] ] ..@.o.+.o.$.o.+.+.+.@.] [ @.@.@.+.+.+.@.] ` ) D G C C = * 0 4 3.7.u.7.6.8.8.7.i.i.i.i.i.q.i.a.a.a.a.i.a.a.a.s.a.f.j.k.a.q.4.4.x z z k k k k k k k i w w w l l l 1.u 1.l 3.3.3.3.,.3.7.7.q.7.q.8.q.q.a.q.q.q.q.q.q.r.q.q.q.7.7.4.3.5.3.7.7.8.q.q.w.s.b.b.M.K.P.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX XN.L.b.v.v.v.s.w.s.w.w.w.0.w.0.q.q.8.q.7.7.3.3.7.7.:.7.3.3.7.5.3.7.5.7.3.3.7.7.3.7.3.3.7.KXKX7.3.3.z z u u k i 5 5 k k k l l l z z c x 4.i.1.l e 1.1.6 1.1.1.1.1.1.1.1.1.1.7.2.1.5.1.1.5.1.5.1.5.h.l.l.j.a.l.l.k.a.a.a.q.q.u.7.l p p 3 , # o j #XpXfXpXsXdXaXpXaX6X6XhXmXlXm . X : < < < < < < < < 8 8 8 2 2 3 7 7 3 7 1.i.d.i.d.i.a.a.a.a.a.a.h.z.z.z.4.4.Z.cXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXCXy.f.3.;.u 6 l l 1.1.1.1.1.1.1.1.&.1.l 1.1.1.h Z ( ( ( ) ) ) ) ) ) ' ' ' ' ' ' ' ' ` ` ] ] [ [ @.+.#.#.#.#.#.+.#.#.+.[ [ @.@.o.o.o.$.+.] ] _ ) A Z C ; * * , 3.5.7.p.u.7.8.7.i.8.8.a.8.i.a.i.a.i.a.i.h.a.a.a.a.k.k.j.a.7.9.e.x x z x c l k k k k k k w e w 6 l l l l 1.3.:.3.3.7.3.7.4.7.q.8.4.q.0.q.q.q.q.w.a.h.q.q.q.q.0.7.3.3.3.3.4.4.7.q.w.a.s.b.b.N.P.P.oXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.XM.n.N.v.s.w.s.w.w.KXKXKXKXKX0.q.4.4.7.7.7.3.0.7.:.7.3.7.7.7.:.7.:.3.7.7.7.7.7.3.3.3.7.3.KXKX5.3.3.3.l u 5 u i l l l l z l z z l 9.x x x v 9.z e l 3.1.l 2.2.1.1.1.1.=.1.1.1.1.4.5.6.1.1.7.1.5.7.j.f.G.F.y.h > : $ $ # O X X X X . . . X o j @X6XsXsXpXpXpXpXaXpXdXhXBXcX/.j > > : $ @ O O o o o o X X X + : , 4 5 5 6 5.k.d.i.i.h.a.i.a.h.i.a.a.l.m.8.3.z.6XKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXBXt.a.3.l e l 1.;.1.1.1.&.l 1.1.1.r 2.5.u.2.h ; A ( F ( ) ) ) ) ) ) ' ' ) ) ' ' ` ` ] ] ] ] +.#.#.#.0X#.0X0X0X0X#.#.#.+.@.[ [ ..@.@.@.@...] ] ) F A C C = * 0 3 7.7.7.0.q.p.i.i.8.a.7.a.i.a.8.a.h.8.8.a.h.l.a.t.t.d.5.x y.9.9.x x x k 4.l k l k k l l w l u u l l 1.;.;.3.3.7.3.7.7.7.7.e.8.q.8.q.q.q.a.q.q.q.q.q.a.q.q.8.8.8.4.4.3.3.7.4.7.q.q.w.s.j.b.N.K.P.oXSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX XK.n.v.b.s.b.s.s.s.KXKXg.q.KXKX8.7.8.7.7.:.7.7.3.3.7.7.:.7.7.7.3.7.7.7.7.7.:.7.7.3.7.7.7.KXKX7.3.3.l l l l 5 u w l l l l z z z l 9.x 9.c 5XHXZ.w 1.6 l l 2.1.1.1.1.1.1.1.1.1.1.1.1.6.1.1.5.1.5.8.f.l.F.a.< O . X O # $ $ $ $ $ @ o . o j $XiXsXiXiXiXiXiXiX3XiXsXBXcX$X/.C.C.C.C.D.M m n j j j g j f + . O , 5 5 7 1.a.k.i.d.i.i.h.i.i.d.a.a.l.m.q.1.h.6XKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXCXh.h.3.l e l 5.;.1.1.1.1.1.1.1.;.c =.p.p.l h C A ( ( F F ) ) ) ) ) ) ) ) ) ' ' ` ` ] ] [ [ +.#.#.#.#.#.#.#.0X0X0X#.#.#.+.@.] ....@.@.@...] ] _ ( A C C = * % , 3.7.7.7.7.i.p.i.i.i.u.i.a.i.8.a.h.i.a.a.a.a.l.h.r.3.=XW.h 9.x 9.x 9.x z l z l l u 5 k i l 6 u l l 1.3.3.3.3.3.3.3.7.7.4.8.7.4.q.0.q.q.q.w.a.q.a.r.r.q.8.q.8.7.3.7.3.3.3.3.7.q.q.w.s.j.b.N.M.P.oXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.XI.v.N.n.b.s.w.w.w.KXKX0.0.q.KXKX0.4.7.7.3.7.7.5.KXKXKXKXKX7.7.7.7.KXKXKXKX3.7.3.3.KXKXKXKXKX5.3.3.l l l l 5 l l l k l l z x x z 9.9.9.y.CXKXBXy.l 1.&.l 1.1.l l 1.1.1.1.1.1.1.1.1.6.1.6.5.;.5.a.s.b.l.3 X . X f m M D.D.D.M m n g f % @ O o O j %X9XdXiXsXgXiXiXiX3XiXhXmXjX9X@X|.S.C.S.C.S.C.C.C.S.S.C.@X@Xm # . : 5 7 5 ;.i.d.d.d.i.d.d.i.a.a.a.a.k.J.q.l r.<XKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXzXt.d.3.l w e 1.1.1.1.1.1.1.1.;.l x =.p.5.w g C F ( F ( F ) ) ) ) ) ) ) R ) ) ` ` } ] ....@.#.+.#.#.#.#.#.#.#.0X0X0X#.#.#.+...........@...[ ] ` ) F G C C * * , l 3.0.7.7.7.p.i.i.i.a.a.i.8.h.i.8.h.h.a.a.a.z.z.4.W.KXzXh y.y.9.x x x z l z k l k i i k i w u l l 1.;.3.;.3.5.3.4.7.0.4.7.q.8.q.q.q.q.a.w.a.q.a.a.q.r.q.q.4.8.4.7.3.3.7.3.7.8.q.a.w.j.b.N.K.P.oXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.Xn.n.v.b.s.b.s.w.s.KXKX0.0.q.KXKX7.0.7.7.7.7.7.3.KXKX7.7.KXKX3.7.3.7.7.7.KXKX7.3.KXKX3.3.KXKX7.3.3.3.l l l e i l l l z z z 4.x x 9.9.x C.KXKXKXBXx l 6 l l 1.1.1.1.1.1.1.1.1.1.6.1.6.1.6.1.;.5.j.h.j.h.4 . X > M S.S.S.S.S.S.S.S.|.S.S.D.m m j m %XiXiXiXpXpXiX6XiX3XiXcXzXZXBX6X$X*X*X&X2X-X2X2X$X$X*X$X*X$X@Xf . + 3 7 7 6 8.a.i.i.h.a.i.h.a.a.a.h.h.z.a.1.r.6XKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXCXt.a.3.l 5 1.5.;.1.;.1.1.1.1.1.2.2.=.p.4.0 ; Z F F F F F F ) F ) ) ) ) R R ' } ` ] ....o.o.+.+.@.+.+.+.+.#.#.#.#.#.0X#.#.#.+...] ..o.o.o.[ ] ` ' F G Y C = * : 5 z 8.7.u.u.x.i.i.a.a.8.a.a.h.8.a.h.a.q.k.b.h.6.R.HXKXHXV.x y.x x x x x z z k l l k l i l l l u l l 3.;.3.3.3.3.4.4.7.7.7.4.q.8.8.0.q.q.q.q.q.q.q.r.8.q.q.8.8.3.3.3.3.7.7.7.q.q.a.s.j.b.M.K.P.oXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.Xn.v.v.b.b.s.s.s.s.KXKXq.0.q.KXKX7.7.KXKXKXKX3.3.KXKX7.3.KXKX7.7.5.KXKXKXKXKX7.3.KXKX3.7.KXKX5.3.3.3.l l l l l l l l 4.l 4.4.4.9.y.x y.<XKXKXKXKXhXx l 5 u 2.1.1.1.1.=.1.1.1.1.1.1.6.1.1.1.1.8.k.j.h.z.p . f S.<XiXpXpXpXaXsXaXsXsXhXzXzXzX6X&X1XsXdX3X7XpXiX7XiX6XiXpXxXAXGXBXxXhXxXxXxXxXxXfXfXfXxXxXAXBX5Xj X + 2 2 7 6 7.i.a.a.a.i.k.a.a.a.k.a.h.m.h.1.r.6XKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXCXZ.a.3.l w 1.1.;.1.1.1.=.1.;.l 1.2.=.6.c 0 ; Z S F ( S D ( ( ) ) ) R F ( ) ' ` . .....o.o.o.o.o.@.@.+.@.+.+.+.#.#.#.#.#.#.#.#.@.[ [ @.[ [ ] ` ' ( A Y C = * % 1 r 8.i.u.i.8.a.8.a.a.i.i.i.a.i.q.h.q.a.l.z.4.z.JXKXKXKX>Xi y.x 9.9.z x z z c k l k l l i l u l l 1.;.3.3.3.3.3.7.0.7.e.0.7.e.8.q.q.q.q.q.q.q.q.q.a.q.8.8.8.4.4.7.3.3.3.3.4.8.q.w.w.b.n.B.B.I.oXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.XI.B.N.b.b.b.s.w.w.KXKX0.0.q.KXKX8.4.7.7.7.7.3.:.KXKX7.7.KXKX3.7.KXKX7.7.KXKX7.3.KXKX7.3.KXKX5.3.3.3.3.l l l l z l x 4.4.4.4.4.4.v b c.AXKXKXKXKXKXdXk l l l 1.1.1.1.1.1.1.1.1.1.1.5.5.1.7.3.8.k.n.j.r., . . g %XxXZXZXZXBXZXZXZXZXNXBXBXBXmXhX3XiXsXkXpXpXpX7XyX7X6X6XiXaXhXmXzXzXhXxXxXxXxXxXzXxXxXxXxXDXFXcXg . 9 7 2 7 7 3.i.a.a.a.a.i.a.i.k.a.a.h.F.z.3.x.aXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXSXU.7.3.l 5 1.1.1.1.1.1.1.1.1.1.1.=.6.1.h ; ; Z Z F F S F ( ( ( ( F F R ) ' ` } ] .......o.o.o.o.@.+.o.o.o.@.@.+.#.#.#.#.#.#.#.+.[ ] ] ] [ ] ] ' ) F G C ; * @ : t x.i.u.i.8.8.a.i.a.i.a.a.h.x.h.a.a.a.l.w.k ZXKXKXKXKXBXx b v b y.z x x x z z l k k l l l l l l 1.;.3.3.3.3.3.3.3.7.7.4.0.8.q.q.q.q.q.a.w.q.a.r.q.r.q.q.8.8.4.3.3.3.7.3.8.q.q.a.s.s.b.N.L.P.oXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.XI.N.v.v.s.s.s.w.s.KXKX0.0.KXKXq.0.7.7.7.7.7.7.:.KXKX3.5.KXKX7.7.KXKX7.3.KXKX:.3.KXKX3.3.KXKX5.3.3.l l l l l z z l 4.x 4.4.x.y.x y.v A.KXKXKXKXKXKXKX%X1.1.6 e 1.1.=.1.1.1.1.1.1.1.6.=.1.2.7.8.k.z.k.t., . o g %XpXzXzXzXxXzXzXxXxXxXfXhXhXhXsXfXsXdXdXgX4X1X>X>X1X1X9X6XiX3XpX6XpXiXpXgXaXaXpX7XpXpXaX8XnXBXjXj X 9 2 q 7 7 1.i.i.a.a.h.a.a.a.i.a.a.q.J.z.3.r.sXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXSXT.7.3.u 5 1.;.;.1.u 1.=.1.1.1.=.=.6.6.h ; C C Z F F S F ( D ( D D R F ) ' ` } ` ...o. ...........o.o.o.o.@.@.+.+.+.#.#.#.#.#.+.@.] [ [ ] [ ] ` ' D G C = * & @ q 4.i.i.i.4.q.a.a.i.a.a.a.h.h.a.a.h.k.a.&.eXKXKXKXKXKXJXA.x c.b 9.x x x 3.l l k l k l l l l l z 1.u 3.1.1.3.3.3.7.0.7.0.7.8.8.q.q.q.q.q.q.q.a.a.q.q.8.q.8.8.3.7.3.3.7.3.8.8.q.w.a.j.b.B.L.B.oXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXoXM.n.c.v.v.b.s.g.w.KXKXKXKXKX7.7.7.4.7.7.7.7.7.7.KXKXKXKXKX7.3.7.3.KXKXKXKXKX3.7.7.KXKXKXKXKX3.3.1.3.3.z z z l l z 3.x x 4.x q.9.9.b *XKXKXKXKXKXKXKXHXZ.u 6 u u =.6.1.1.1.1.1.2.1.1.1.1.1.1.a.k.j.h.h.q . X f S.3XfXfXfXgXfXlXsXiX,XsXfXgXsXaXgXsXdXsXpX4X&X$X#X@X@X$X5X3X3XyX3X3X3XdX2X&X>X4XpXiX6X6XpXhXBXhXj . + 2 7 7 7 &.i.i.a.a.i.i.h.a.d.d.a.a.m.m.l r.nXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXW.5.5.6 k l =.5.1.1.1.1.1.1.;.1.5.8.c 0 ; ; Z Z Z S S F ( D D D D F R ) | } } . . ... .] .... .....o.o.o.o.@.@.+.+.+.#.#.#.#.+.+.] ] [ ] ] ] ` ' D G C = - & @ 0 4.8.7.u.i.i.i.i.i.i.a.i.a.8.k.7.l.j.u S.KXKXKXKXKXKXKX*Xz t.x b x 4.x x 4.x z l z l l l l l 1.3.1.1.3.3.3.3.7.7.4.4.7.0.e.8.8.0.q.q.q.a.a.r.q.q.r.q.q.8.8.4.7.3.3.7.8.8.8.w.w.s.b.b.B.B.P.oXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX XM.I.b.v.v.s.s.w.s.q.q.g.0.0.0.7.4.4.7.7.:.3.0.7.KXKX7.7.5.7.7.5.3.3.3.3.0.3.3.0.7.3.0.3.7.3.3.3.1.z 1.z z l l z 3.z x 4.4.x q.w.e.b nXKXKXKXKXKXKXKXKXfX4.;.i u e =.1.1.1.=.1.1.1.1.1.1.7.1.a.h.j.a.h.q X X f C.bXaXsXfXlXfXiX1X&X%XiXsXdXgXaXpXpXgXfXdX3X*X$X@X@XC./.*X<X3X6XyX4X6XpX*X%X%X%X&X1XiX3X7XfXNXcXj . @ q 2 7 7 1.h.h.i.a.i.i.a.a.i.k.h.k.F.z.1.t.CXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKX$X7.5.5 c k =.5.1.;.1.1.1.1.1.;.u.8.t * ; C C Z Z A S S D D D D F F ( ' ` } } . ... .] .. ..... .o.o.o.o.+.+.o.@.+.+.+.+.#.+.#.+.O.] ] ] ] ] ` ' ( G Y = * & o < l 8.7.q.i.u.i.u.8.i.a.a.s.8.a.h.z.e.e.BXKXKXKXKXKXKXKX7Xx w.w.b x 9.x x x z l l l l l z 1.1.3.1.1.z 3.3.3.e.:.7.4.7.7.0.0.8.q.0.q.q.q.a.q.q.r.q.q.8.q.q.8.8.7.3.3.3.8.8.7.w.s.w.j.b.N.P.P.oXVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%Xn.n.v.b.b.s.s.w.w.q.q.q.0.0.0.0.7.7.7.7.7.7.3.7.KXKX7.3.5.7.3.7.0.3.e.7.3.3.3.7.3.7.0.3.3.4.7.3.3.1.3.z l 3.1.z z 4.x 4.x 9.e.r.y.v HXKXKXKXKXKXKXKXKXKX-Xl 6 ;.l e 1.1.1.1.1.1.1.1.1.1.2.1.q.h.s.a.r.1 . X f C.bXfXfXdXyX3X4X<X<X%X3XdXsXsXfXdXsXxXxXfXpX4X&X@XC.C.D.@X1X3XyX3X3XyXpX>X&X$X%X%X$X*X4XiXhXNXhXj . @ 7 2 2 7 1.a.k.h.h.k.h.a.k.a.a.k.k.z.m.1.^.FXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKX<X7.5.6 k k 1.5.1.1.1.1.l 1.1.l 5.4.q * = C C Z Z A F S D F D D F R R ) } } } . . . .....] ... .} ` } } ..o.o.@.+.+.+.#.#.+.+.+.] ] ] ] ] ] ` ' ) A C = * & . % l 4.e.7.i.i.i.i.i.a.i.i.q.s.u.F.a.l ,XKXKXKXKXKXKXKXKXVXc.e.c.b b x x x 2.x l l l l l l l 1.1.2.1.3.3.3.:.3.e.7.7.7.4.0.4.q.7.q.8.q.q.q.q.q.a.q.q.q.8.8.8.8.7.3.3.7.4.8.7.s.s.a.b.n.N.K.P.oXAXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&Xn.I.v.w.v.v.v.w.s.w.w.0.0.0.0.4.0.4.7.7.3.7.7.7.7.5.7.7.7.3.7.7.:.3.7.7.3.3.3.0.3.7.3.3.3.3.3.3.1.3.3.l z 1.l 3.3.4.4.4.x 9.e.e.x C.KXKXKXKXKXKXKXKXKXKXAXt.:.&.5 c 1.1.1.1.1.1.1.1.1.1.7.1.8.h.s.a.r.1 . . f C.<XfXdX<X>X4XyXpXdX&XyXgXsXsXaXpXfXmXmXxXfXiX>X%X@XC.D.C.1X4X3X3X3X3XdX*X$X*X>X*X&X@X%X1XsXZXhXj . + 7 2 7 7 1.i.i.h.a.h.i.k.h.a.d.k.h.z.Z.1.z.KXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXfX4.1.e i c =.-.2.1.1.1.;.1.1.l 3.2.q 0 ; ; Z Z Z A A F S S S F F D %.' } } } . ... . . ... . .} ` ` ` ` ..o...o.+.+.+.#.+.+.+.+.O.] O.] ] ` ` ' ) A C = * & o : l 4.3.0.i.i.8.i.i.i.a.a.4.s.a.F.8.c.FXKXKXKXKXKXKXKXKXKXS.z t.v 9.4.x x x z c 2.z k l l l 3.1.1.1.3.3.3.3.3.7.3.4.7.0.0.7.q.0.0.q.q.q.q.q.q.8.r.q.8.q.8.e.8.4.3.3.4.8.8.8.w.w.w.j.n.M.K.P.oXAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXS.3X3X1X1X4XiX3X4XyX$X3XfXlXsXsXpXxXZXBXmXjXgX7X1X@X/.M C.1X3X3X3X3XyXpX>X&X*X>X2X&X$X|.&XsXNXhXv . + w 2 7 7 1.h.k.a.k.i.h.a.a.a.k.a.h.z.m.2.A.KXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXBXt.1.6 5 l 1.1.1.1.l 1.1.1.1.l 1.4.c 0 ; ; Z C Z Z A A S S F F F R { _ ` } . . . . . ..... .` ` ` } . .o.o.....+.+.+.+.+.+.+.+.O.] ` ] ] ] ` ' ) A C = & o @ , l 7.e.e.8.8.a.i.i.a.i.h.7.s.F.7.l pXKXKXKXKXKXKXKXKXKXKX$Xz 9.y.9.9.x 9.4.x 2.c 3.l l l 1.l l 1.3.z 3.;.3.3.3.3.3.0.3.7.0.8.0.0.q.8.q.q.a.a.q.q.q.q.q.q.4.8.8.3.3.3.4.8.7.w.a.s.b.m.N.P.I.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXdXtXtXdXdXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXC.<XfXsXiX3X3X3X3X3X$XyXfXfXlXsXsXxXBXAXBXmXxXfXiX>X@XC./.<X3X3X3X3XiXpX1X*X>X2X$X$X&X>X6XfXZXxXm X @ q 7 7 5 1.a.k.h.d.h.a.h.k.a.k.k.h.F.z.=.=XKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXGXA.l 6 6 l 2.1.1.1.1.=.1.1.1.1.1.7.2.q = ; ; C Z Z F A S S S A F D { _ } } } } . . . . . .} } } X.X.o.X.o.o.....o.o.+.+.+.+.+.+.O.` ] ` ] ` ` _ ) A C * & & : q 7.a.0.q.i.a.i.a.a.a.i.a.d.d.k.z V.KXKXKXKXKXKXKXKXKXKXKXiX9.9.9.y.4.x 4.4.2.x l z l l l 1.1.1.1.1.1.3.3.3.3.:.e.3.7.4.0.7.7.7.0.q.0.q.q.q.q.a.q.x.8.q.8.8.8.4.3.3.7.7.8.q.w.s.a.v.b.M.K.K.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xn.I.v.b.v.v.s.w.w.q.q.0.0.0.0.4.0.3.3.0.3.7.7.7.7.3.3.7.3.7.7.7.3.e.7.7.7.7.:.e.3.7.3.3.3.3.3.3.1.3.3.l l 1.4.2.4.4.4.9.y.e.r.9.v JXKXKXKXKXKXKXKXKXKXKXKXKX,X4.l w 1.1.1.1.1.1.1.1.1.;.1.1.8.h.f.0.8.h X X f C.<XhXxXxXfXdXyX3X3X$X3XsXsXsXsXsXsXzXAXAXAXNXxXlX6X&X@X&X<X3XiXyX3X3XpX>X&X$X$X&X1X9X4XpXxXZXzXM X + q 2 7 5 1.h.i.k.a.k.k.a.k.a.k.k.k.U.h.2.kXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKX.Xi =.5 l 1.1.1.1.1.1.1.1.=.=.&.5.i.r = ; ; C Z Z Z A S S A A S R { _ } } } } . . ... . . .} X.X.X.o.o.X.o.o.o.o.o.@.o.+.o.o.o.O.` ` ] ` ` ` _ ) G J * @ @ > w i.i.7.a.i.i.i.i.i.i.a.a.d.G.s.z dXKXKXKXKXKXKXKXKXKXKXKXzXt.b b y.x.b 9.x x 4.2.4.l l 1.l 1.l 1.l 1.1.;.;.3.:.3.3.3.7.0.q.4.0.0.7.q.0.q.q.q.q.q.q.q.q.8.8.4.4.3.3.7.4.8.7.w.a.w.s.b.M.P.P.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xb.I.b.b.s.s.b.s.s.s.w.0.0.0.3.0.3.3.7.7.3.0.3.0.7.7.7.7.7.7.:.3.7.3.7.7.7.7.7.3.3.3.3.3.3.3.1.3.3.1.3.3.z 4.4.x 4.4.9.9.b e.r.9.S.KXKXKXKXKXKXKXKXKXKXKXKXKXFXz.1.&.l 1.1.=.1.1.=.1.1.1.1.1.7.a.w.w.q.k X X f S.1XpXsXlXxXxXfXpXiX$X<XsXsXsXdXpXsXzXDXHXHXSXBXhXiX1X1X<X4XiX<X<XiX7XpX1X2X$X1X9X6X6X9X6XcXzXnXj . + 2 5 2 5 5.a.h.h.a.h.h.h.i.k.k.h.F.F.z.c ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKX1X1.1.6 k 2.5.1.1.1.;.1.1.1.2.1.5.5.c g ; Z C Z Z Z S S Z S S S D { ' } } } } } . . .X. .} } X.X.X.X.o...o.o.o.o.o.o.@.@.+.o.o.O.` ] ] ` ` ` _ ) G = * @ % q c 8.i.8.i.i.a.q.i.q.a.a.a.d.f.a.y.KXKXKXKXKXKXKXKXKXKXKXKXSXV.y.w.4.x 4.x x x 3.z 4.l l l l 1.l 1.l 3.3.1.3.3.3.3.3.3.7.3.4.7.0.0.7.8.8.q.q.q.q.q.q.q.8.8.8.8.7.3.3.7.7.8.8.w.w.s.b.b.B.P.P.XXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xv.I.b.b.v.b.s.w.w.w.0.0.0.0.0.3.3.e.7.7.7.3.:.7.7.:.7.7.3.7.7.7.7.0.3.7.7.7.7.3.7.3.3.3.3.3.1.1.1.z l z l 4.4.4.x 4.b 9.v v r.x 4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXW.7.;.i l l 6 1.1.1.e 1.1.1.1.1.a.w.e.3.h X . % |.>XpXdXsXfXlXlXzXhXiXiXlXdXdXgXfXsXfXBXHXLXGXCXzXfXiXyXiX6XiXyX9X6X6X6XaX9X9XiXpX6X9X7X6XcXCXjX> 9 2 5 7 6 7.a.i.a.a.i.i.a.a.i.k.h.F.F.h.h JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXBX8.5.i k =.=.1.1.l 1.1.1.1.l l ;.:.x g g ; C Z Z S S S S S S S R ) ) ` } } } } . .X.o.} } } } X. .X.X. .o.o. .o.o.o.o.@.o.o.o.] ` ` ` ` ` ' _ D G = * @ > l z x.q.8.p.a.a.a.8.0.a.s.g.f.a.3.>XKXKXKXKXKXKXKXKXKXKXKXKXKXD.9.z.e.b x x x z x z z x x l z l l 1.3.l 1.3.3.3.3.3.7.3.3.3.7.4.4.8.q.q.8.q.q.q.a.q.r.q.x.q.8.7.7.7.7.3.3.7.8.q.r.s.b.N.B.I.P.-XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXb.I.N.b.v.s.w.s.s.w.w.e.0.7.7.3.7.3.7.7.7.7.3.0.:.7.0.3.0.3.7.7.7.7.7.:.7.7.7.7.3.3.3.3.3.3.1.3.1.3.1.3.z x 4.x 4.9.x 9.9.9.t.b mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXr.;.6 l l 1.1.;.1.1.1.1.1.u 1.a.h.w.8.c X % |.4XaXaXsXhXsXcXhXhXlXfXfXsXfXsXsXsXdXsXzXAXAXBXzXfXdXdXiX3XiXiXpXiX6X6XaX6X6X7X7X6X6XiXiXxXZX@Xo X : 7 3 8 6 q.a.a.a.i.k.k.a.h.d.k.z.l.F.6.^.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXHXz.7.5 z 1.=.1.=.1.;.1.1.=.e l 3.5.l t g ; C Z Z Z Z S Z Z U U ( ) | } } } .} } . .X.} } } } X.X.X.X.X.X.......o.o.o.o.o.o...` _ ` ` ' ` ' ) D C = & $ , x 4.r.8.8.8.u.i.a.a.q.g.a.a.f.0.k GXKXKXKXKXKXKXKXKXKXKXKXKXKX@X9.h.e.b 9.x x z x x 4.z 4.l l l 3.1.1.z 3.1.z 3.3.3.:.3.7.e.7.7.0.q.8.q.q.q.8.q.q.q.q.q.8.8.8.8.7.4.3.3.3.7.8.r.h.j.b.n.N.B.P.-XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXv.v.n.t.v.s.s.w.s.w.q.0.e.7.0.7.7.7.3.:.3.7.7.7.0.3.3.7.7.7.7.:.7.3.3.0.:.7.7.3.7.3.3.3.3.3.1.1.3.1.z z 1.4.4.4.x x 9.9.v 9.9.y.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXZ.3.5 l l 1.l 1.1.2.1.1.1.;.1.q.q.8.8.c + o M 7XhXcXaXcXaXpXpXiXiXiX6X3X3X1X<XbXdXsXpXpXgXaXpXiXiXiXyXsXxX7X*X$X2X>X>X&X&X>X>X>X1X>X,X1XS.< + # , 5 3 7 1.a.a.a.a.h.a.h.a.i.k.k.k.l.J.2.%XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW.1.u l 4.1.1.1.1.1.1.1.1.1.l 1.5.2.h f ; ; Z Z Z U S S S A S ( { | } } } } } } . .X.} X.} } X.X.X.X.X...o.o...o.o.o.o.o.o.X.` ` _ ` ` ' ' ) U ; * @ < h 6.8.8.q.i.i.i.i.8.a.q.q.q.d.f.3.W.KXKXKXKXKXKXKXKXKXKXKXKXKXKX*Xv r.y.b 9.9.4.x 1.z 1.x l l l l l 1.1.1.1.3.3.3.3.:.7.7.3.3.3.7.0.0.8.q.8.q.q.q.q.q.r.8.q.8.8.8.7.4.7.3.8.4.8.q.a.s.v.N.B.I.P.-XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXv.I.n.b.b.s.s.s.w.w.q.g.0.0.3.3.7.7.7.e.0.3.0.7.3.7.7.:.7.7.7.7.3.0.3.7.3.0.7.3.7.3.3.3.3.3.1.l 1.z 3.l z 4.4.x 9.9.9.y.t.v e.V.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX$X3.u 6 l 1.l =.1.1.1.1.1.;.1.7.h.a.8.x < O X $ h m m V.V.V.^.y.b b v b h h g C.>XiXsXdXiXiXiXyXyXiXdXdXlXhXC.> : , , , , , , < < < 1 , 1 < 9 , , 4 7 4 7 7.a.a.a.a.a.a.i.a.a.i.k.j.l.z.l zXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXaXl l 5 1.2.1.u 1.1.1.l =.=.l 1.5.=.c h = ; Z Z Z U U S Z A U D { | } } X.} X.} . .X.X.} } } } X.X.X.X.X.......o.o.o.o.+.o.O._ _ _ ` _ _ ) ( A = * % , k x.8.8.i.a.i.a.8.a.a.a.0.s.s.a.u mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXv r.c.b x x x x x z z z x l l l 4.1.1.z 1.3.3.3.3.3.:.3.3.7.7.3.7.q.8.8.q.q.r.q.q.q.q.8.8.8.q.8.4.7.3.7.8.8.8.q.t.s.b.n.B.B.P.=XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXmXB.H.N.b.s.s.s.s.s.w.q.e.0.0.0.3.7.7.7.7.:.7.3.7.7.7.3.0.,.7.7.7.:.7.0.7.7.3.0.3.7.3.3.3.3.3.1.1.3.1.1.z l 4.4.4.x 9.9.b 9.c.z &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXt.l 6 6 1.1.1.1.1.1.1.1.1.;.1.q.a.i.q.x h 4 , 4 h 4 3 3 3 3 w 3 3 k p 4 + o j S.<XsXdXdXpXdXiXiXiXiXsXzXzXm O + , 4 1 1 1 8 , , , 8 < 8 2 2 q 8 4 4 7 u a.a.a.d.k.h.k.k.k.h.k.k.z.J.a.4.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXr.3.6 l l 1.1.1.1.=.1.1.1.l l =.=.l h g N ; Z Z Z Z S U Z U U ) { } } } } .} } . .X.} } | } } } } X.X. .....o.o.o.o.o.X.} _ _ _ ' ' ) ) ( C * % > q 4.i.8.i.i.i.a.a.q.a.a.a.q.a.f.7.t.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXc.9.w.9.9.9.x 4.z z 4.z 4.l z l l 1.1.l 3.1.3.3.3.z 3.e.:.7.4.4.8.7.q.q.8.q.8.q.q.q.q.q.r.8.4.8.4.4.4.3.4.8.8.q.w.h.v.n.M.K.P.;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXB.H.n.b.v.s.s.s.w.q.q.g.e.0.e.7.0.7.3.7.0.3.7.7.3.0.7.0.3.3.0.3.3.7.7.7.7.7.3.3.3.3.3.3.3.3.1.3.3.l 3.l z 4.9.4.e.9.9.y.9.y.z fXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZ.l i u 1.1.1.1.1.1.1.1.;.;.;.q.h.k.6.4.9.8.6.9.4.3.3.3.4.4.3.1.l z k 3 @ g C.4XfXpXpXkXdXyXdXiX3XdXzXmXm X + h k 3 2 7 2 2 2 8 8 2 8 2 2 8 3 5 2 7 ;.a.d.a.d.h.h.h.k.h.h.h.k.l.m.7.Y.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.7.1.l l 1.1.1.1.1.1.1.=.l e =.5.5.l t = ; Z Z Z U S U Z S S { { } } } } } O.O. . .X.X.X.} | } | } X.X...o.......X.o.$.O._ _ _ _ _ ' ) ( F ; * % , k 8.i.x.i.i.a.i.q.a.a.i.a.a.s.j.&.rXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXV.9.w.9.y.v 9.z z z z x l l l l 1.1.3.1.3.3.l 3.3.3.3.3.3.3.4.7.7.q.8.q.8.q.8.q.q.q.q.8.q.4.8.7.7.7.7.3.8.8.8.q.h.j.b.n.B.P.P.wXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXN.I.K.b.v.s.b.w.s.q.q.g.0.e.7.7.3.3.7.7.7.:.7.7.7.3.:.3.3.3.7.7.3.,.7.7.:.7.0.3.7.3.3.3.3.3.1.1.3.z 1.z z 4.4.4.x 9.e.y.t.t.z BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX*X4.;.6 2.l 2.1.1.=.1.1.1.u ;.4.8.8.7.8.q.8.7.e.3.4.q.3.;.3.4.z z z l i # . g C.1XiXyXpXdXdXiXdXdX3XsXxXzXm o + q 2 3 2 7 2 2 2 8 8 7 2 2 7 2 4 7 7 7 3.f.d.g.d.a.d.a.h.h.k.h.h.J.n.u bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9X4.1.1.l 1.1.1.l &.1.1.1.l 2.=.=.5.1.t g ; Y Z Z S S U U U S ( { | | } } } } X.} } X.X.$.X.} } } } X.X.X...X.o...X.o.O.| _ | _ _ _ ) ( ( Z = & > 4 k 8.i.i.i.a.i.i.8.a.w.e.q.a.a.s.6 ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXC.9.9.9.e.e.x x x 3.4.z 4.l z 1.l 1.l 1.3.1.3.3.3.3.3.3.3.3.7.7.0.0.8.8.q.q.q.q.q.q.q.q.q.8.q.8.4.3.3.7.3.4.8.r.h.j.b.N.B.P.K.,XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXb.I.n.n.v.b.s.s.s.w.q.0.0.0.7.7.7.4.3.7.7.3.7.3.3.7.7.7.0.3.7.3.7.7.7.7.e.3.:.3.7.;.3.3.3.1.3.l 1.3.z 3.x 4.4.4.e.9.e.y.w.w.b SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXe.7.&.r c e 5.&.1.1.l 1.1.6 2.8.8.4.7.8.4.4.4.3.4.z 3.z :.z k k l l h # . > D.4XpXpXdXgXpXpXgXpXdXfXxXhXM X + k 7 2 2 2 2 2 2 8 1 2 2 2 2 7 7 3 7 u q.h.a.a.d.a.a.k.k.k.k.h.t.J.G.z AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXb i.&.;.1.1.1.1.1.1.1.=.1.1.=.1.1.2.h f ; C C Z Z S S U U Z S %.| | } } } } X.X.X. .X.o.X.X.X.X.X.X.X.X...o.o.o.o.O.| | { _ _ _ ) ( ( S ; * % q w 7.q.p.i.8.i.8.a.a.i.q.e.0.d.a.:.V.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@Xy.9.e.y.b 9.x x 4.4.z z z l 4.3.1.z 1.3.1.1.3.1.z 3.3.3.3.7.3.4.8.q.8.8.q.q.q.q.0.q.q.0.0.0.8.7.4.7.3.3.7.q.q.s.s.v.n.M.P.B.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXN.n.M.v.v.v.s.w.s.w.q.e.0.0.7.7.7.7.0.7.7.7.0.3.:.7.7.3.3.:.7.0.7.7.7.7.3.3.3.3.3.3.3.3.3.1.3.1.z l 3.z 4.4.4.e.9.9.e.9.c.9.V.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZ.1.=.5 r l 5.1.l l 1.1.1.6 2.4.q.8.8.q.7.4.4.4.3.3.3.3.3.3.k z 3.l q # > D.1XdX<X4X1X1X1X4X1X1XpXmXzXM X + k 7 7 2 2 2 2 7 8 2 2 8 8 7 7 5 7 7 3.h.k.a.d.d.k.k.h.h.a.k.h.z.F.i.A.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.r.&.&.1.1.1.1.1.1.&.1.1.1.1.1.=.2.l q 0 ; C Z A Z Z U U S S S { | | } ` } } } .X. .X.X.X.X.X.X.X.X.X.X.X.X.$.X.} ) { { ) ) ) ( ( F C * & % q z 8.8.i.8.a.i.i.8.i.i.8.q.s.d.d.;.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xy.y.y.9.9.x x 3.4.4.z 3.z 3.l z 3.1.3.1.3.3.1.3.1.3.3.5.3.4.4.7.0.8.q.q.8.8.q.q.0.q.8.q.7.q.8.7.7.3.3.3.7.q.w.s.j.b.n.L.P.K.3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXB.v.M.b.v.s.s.w.w.q.g.e.0.3.3.3.7.e.7.7.7.:.7.3.3.7.7.0.7.7.7.3.0.7.7.7.7.:.7.3.7.3.3.3.3.1.3.z 3.z z 3.4.4.4.9.9.9.y.t.c.e. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXdX4.2.6 l l 5.=.1.1.l 1.u 1.6 1.8.q.q.q.8.4.4.4.4.3.3.z ;.3.i z 3.l k $ > D.>XfX1X&X&X&X&X>X&X%XyXzXzXM X + h 5 7 7 2 8 2 2 8 2 2 2 7 7 5 7 7 6 8.h.j.a.d.d.k.h.k.a.h.k.h.m.F.l pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXz h.6 1.6 1.1.1.1.6 1.2.1.=.2.1.1.;.k 0 ; ; Z Z Z S U U U U U U %.| | O.} } } } } X. . .} } X.X.X.X.X.X.X.X.X.| { ) ) ) ) ) ( ( Z ; ; & @ < c 7.8.8.i.i.i.8.a.a.i.d.d.w.a.d.i.6 CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXhXc.t.y.9.b 9.z z z 4.z x 1.x l 3.1.1.3.1.3.3.3.1.3.3.3.3.5.7.3.7.7.4.8.q.q.q.q.q.q.0.7.q.7.0.8.4.7.7.3.3.7.q.w.s.s.v.B.L.R.A.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXR.v.n.b.v.v.v.w.s.w.q.g.0.,.0.0.7.7.7.7.3.0.0.3.3.3.7.:.7.7.7.7.0.7.7.7.3.7.7.3.3.3.;.3.3.1.3.3.3.z 3.4.x 4.4.9.9.9.t.t.t.x 4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXy.3.u i l =.1.u l 1.1.1.6 6 u 3.8.q.8.q.8.8.q.8.4.3.3.3.7.z z 3.1.k $ $ V.1XhX4X,X3X4X1X,X>X&XdXzXnXM X + q 7 2 2 2 2 8 2 2 2 7 2 7 7 7 7 6 7.h.h.a.k.f.a.h.k.a.k.a.k.l.n.h.y.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXv q.&.=.&.1.1.1.1.1.1.=.1.1.=.1.1.:.l 0 * ; ; Z Z Z ( U U U U S ( %.| } } } } } } X. . .X.X.X. .O.X.X.$.X.} | { %.{ ( ) ( ( ( ( Z ; * & % q z 8.8.x.i.i.i.a.u.a.i.g.a.q.d.d.=.A.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXc.y.y.y.y.9.x x 4.4.x 3.z 1.3.l 3.3.1.3.l 1.l 3.1.3.3.3.3.3.7.7.e.8.q.4.8.8.q.q.7.0.q.0.0.7.7.4.3.3.7.7.4.q.q.s.s.v.B.L.P.B.hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xv.n.v.b.v.s.s.s.w.q.0.0.7.3.3.7.3.7.7.3.7.7.:.e.3.7.7.3.7.3.7.7.7.3.:.7.3.7.3.5.3.3.3.3.1.3.1.4.l 4.x 4.9.e.e.9.t.t.t.c.x fXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X3.l i u =.6 1.1.1.l 1.l e u 1.7.8.q.q.8.q.8.8.8.7.7.7.7.u 3.1.3.k $ : D.>XfXiX,X1X1X1X,X>X1XfXzXzXD.o + q 7 7 7 2 2 8 7 2 2 7 7 5 7 7 7 1.i.k.h.a.a.k.a.h.k.k.h.k.l.J.l.l $XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xu 5.6 1.l 1.1.1.1.=.1.=.2.2.1.1.:.1.q > * ; N Z Z Z Z ( U U U U U %.{ | } } } } } } X. .X. .X.X.$.$.O.} | { %.( { { ( ( ( ( ; ; * & # , k 8.7.u.x.u.8.i.u.i.i.i.g.0.a.l.i.l hXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXV.9.v t.e.9.x 4.x 4.z z 4.z 2.4.4.1.z 1.3.3.1.1.3.;.3.5.5.3.7.7.7.q.8.q.8.q.q.q.7.0.q.q.0.0.3.7.5.4.7.4.8.i.w.h.j.b.n.B.P.A.MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXv.B.v.v.b.s.w.s.w.q.0.0.0.0.0.3.3.0.7.0.7.7.3.:.7.7.7.0.:.0.3.7.7.7.7.7.7.:.3.3.3.3.3.3.1.3.4.3.4.3.4.4.e.e.e.w.t.c.c.c.v CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXt.4.i u 1.1.e 1.l 1.1.1.l 6 u 3.q.q.q.r.q.q.r.8.q.0.7.0.z z 1.5.z $ $ V.1XdXsX3X1X1X1X&X&X3XpXxXzXC.o + 3 5 7 8 2 7 7 7 2 2 3 7 2 7 7 =.i.k.k.d.a.a.f.a.h.k.k.k.k.F.Y.a.h.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXz.5.1.1.1.1.1.1.1.1.1.1.2.=.2.1.=.c q % % * ; ; ; Z Z Z S U U U U U ( { { | | } } } } } } } } O.} | | { { %.( ( %.( S ( ; ; ; % o . $ q c i.i.p.i.8.a.a.i.i.i.i.d.s.a.k.&.A.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.y.c.y.9.9.9.4.x 4.x 3.x 4.3.3.1.3.1.3.3.l 3.3.1.3.3.3.3.7.4.0.7.4.4.8.q.8.q.q.q.0.0.0.0.0.7.4.3.7.7.8.8.a.h.h.b.b.B.B.P.R.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,Xb.v.v.v.v.b.v.w.s.s.0.0.7.e.7.e.3.0.3.3.0.3.3.:.0.7.7.0.3.7.7.7.7.7.7.7.:.7.3.3.3.3.3.3.1.3.3.4.4.3.4.9.9.9.e.w.t.c.c.c.c.VXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX X3.:.u l 1.1.1.l 1.l 6 1.6 6 1.8.q.q.h.h.a.x.q.q.8.7.7.3.3.1.3.k $ $ m *XiXsXsX1X1X1X>X1XsXfXxXmXM o O q w 2 7 2 7 7 2 2 3 7 5 7 7 e 8.k.k.k.h.k.f.a.a.d.k.k.h.l.J.m.5.=XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,X1.7.5.1.2.2.1.1.1.1.1.1.=.1.=.e r w > # & * = ; C Z Z S S S ( U U U U ( %.{ { _ { | } } | | | | ) ( ( U ( ( ( S S S C C = % o . X , h 4.8.i.i.p.a.i.8.i.i.a.8.a.s.h.7.l sXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xy.t.c.9.9.x x 4.4.x 3.z 4.z 3.3.3.3.1.1.3.3.3.3.3.3.3.3.3.7.3.0.4.7.7.q.q.q.q.7.0.0.7.7.4.7.7.4.3.7.4.8.w.h.s.b.n.M.L.P. XVXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX7Xc.H.H.v.v.s.w.s.s.w.0.e.0.:.7.3.3.7.7.3.3.7.7.7.3.:.7.7.7.:.3.7.7.3.7.3.3.3.3.3.3.z 3.3.z z 3.3.3.4.4.e.9.e.y.e.w.c.c.c. XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXZXq.p.;.h 1.1.1.1.1.6 1.1.1.1.;.2.8.x.h.a.8.a.a.a.7.7.4.3.7.z z z : % M *X7XiXsX<X,X:X>XeXdXsXxXzX/.o O q 7 2 2 2 2 7 2 7 4 7 7 5 6 5.k.k.a.a.h.a.a.h.a.k.k.a.h.j.M.q.r.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXv >.;.=.e =.6 1.1.1.1.1.l 1.1.e e w p $ X o % * ; ; Z A A S Z S U U U U ( ( ( ( %.U { { { %.( ( U U ( ( ( S S Z Z C ; * & o X $ 5 4.r.8.8.a.i.a.8.8.8.a.a.q.a.a.z.l Z.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX5Xc.l.c.t.9.9.3.3.3.3.4.z 3.3.3.3.2.4.4.3.6.4.3.1.;.3.3.3.3.3.7.3.7.0.7.q.8.q.q.8.q.8.8.q.7.q.0.3.4.4.7.q.q.a.f.j.v.B.L.P..XFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXhXc.H.v.v.b.s.s.w.q.0.0.0.0.:.7.3.3.3.7.,.3.7.7.7.0.7.7.7.3.7.7.7.5.3.5.7.5.3.3.1.3.3.3.3.4.3.z z 4.4.4.4.9.e.e.t.t.c.N.c.-XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X;.7.l l l l 1.l l 1.1.;.1.1.1.7.8.h.a.a.q.i.q.a.8.e.7.7.z z k 9 > M &XiXkXdXiX1X2X>XbXpXpXvXxX/.O @ 7 7 5 5 7 2 2 7 w 3 2 7 6 6.i.h.k.k.h.k.a.k.a.k.l.k.l.k.J.F.5.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX,X;.7.2.2.1.1.;.1.1.1.&.l 1.1.l e e p < O . . & * ; ; ; Z Z Z S S S ( ( U U U U ( ( S ( U U ( U ( U U S S S Z ; ; ; * & . . X : q l 4.r.8.8.i.u.8.8.8.q.a.8.q.a.l.8.x fXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMXc.n.y.y.9.e.4.4.3.9.3.3.z 3.3.3.4.3.3.3.1.3.3.1.3.3.3.;.3.3.3.0.7.0.0.4.e.8.8.e.q.4.7.0.q.q.4.3.7.7.q.8.q.h.j.l.n.M.P.P.:XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXc.I.n.v.b.v.v.s.q.s.0.0.0.7.7.7.3.7.7.7.7.7.7.7.3.7.3.7.7.7.7.3.7.7.5.3.3.5.3.z 3.z 1.3.3.z 4.3.4.4.e.8.9.e.e.w.c.c.N.t.3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXc.1.5.&.l u l 1.1.l 1.1.1.1.2.7.2.8.i.q.a.q.i.a.q.8.7.7.3.z i : . $ m $XyXsXdXhX7X<X<X7XiXbXxXBX/.X 9 =.=.7 5 7 7 7 7 w 7 7 5 3.i.h.k.h.a.k.h.k.h.k.k.j.k.k.F.Y.a.Z.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXm.k 4.e 2.1.1.1.1.1.l 1.=.1.e r 2 1 , $ O o X o & * ; ; C Z Z Z S Z ( ( U U U ( ( U D S ( ( U U S A Z Z C ; ; * & o . X : 1 2.x.4.4.8.8.a.i.u.8.a.a.a.8.a.a.G.k.5 S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXy.j.c.y.y.e.e.e.9.z 9.3.3.3.3.3.1.3.1.1.1.3.1.1.3.;.3.3.3.7.3.0.4.7.7.q.8.q.8.8.0.8.0.4.4.7.7.3.3.7.8.8.q.h.j.b.n.B.P.P.:XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXc.B.n.v.v.s.s.w.w.0.0.0.0.7.0.7.3.7.7.3.7.7.7.0.3.3.,.7.:.7.3.5.7.3.3.7.3.3.3.3.z 3.3.3.3.3.3.4.4.4.4.9.4.9.t.w.c.c.N.y.aXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX7Xx p.5.1.6 1.1.1.1.1.;.;.1.1.1.1.7.7.a.a.a.i.a.a.7.7.8.7.z k : O M 6X7XiXpXsXaXiXbXiXaXcXBXBXj . 9 w 7 2 5 w 5 2 3 7 5 &.3.a.a.h.a.h.h.h.h.h.k.h.f.s.h.k.Y.h.h.kXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXb x l 1.1.1.1.1.1.1.&.1.=.w e e 2 8 < < % @ o o & & * = ; ; Z Z Z ( Z ( ( Z ( ( S F F F S Z S Z G C ; = * & & o + : h 4.r.h.-.x.8.8.8.8.a.q.7.a.a.8.8.a.k.F.7.9.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXc.w.c.y.9.9.9.9.e.4.e.4.4.4.e.3.1.1.1.1.1.3.3.;.3.3.3.3.3.7.3.7.7.7.4.q.8.q.q.4.7.0.4.0.7.7.0.3.7.7.0.q.q.h.j.b.B.K.P.P.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXB.n.n.b.b.b.s.s.w.s.0.0.e.,.3.7.3.3.,.7.7.:.7.3.3.3.7.3.0.3.0.7.7.5.7.7.3.1.3.3.1.x 1.z 3.z 3.4.4.8.e.q.y.9.t.c.c.N.c.c.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXA.5.6.1.1.e 1.1.l 1.1.1.1.1.1.1.1.:.0.a.a.a.a.0.q.q.8.8.3.z < X g 5XhXhXaXfXxXxXxXsXxXxXjX@Xo X < 1 2 7 7 7 7 7 7 7 6 7.a.a.a.s.a.a.k.h.k.k.k.k.s.s.l.J.m.c /.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX Xk 3.&.1.=.1.;.=.u 1.l =.w w e w q , , , < : $ O o o & % * ; ; ; ; Z Z ( ( Z Z Z S S F Z Z C ; ; * * & & @ $ , c x r.x.i.i.x.8.8.i.i.i.i.a.a.i.a.8.a.h.l.a.u 3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.t.c.y.t.9.e.e.4.e.4.4.4.4.3.3.4.3.3.3.3.3.3.1.;.3.3.3.3.3.7.3.4.4.7.7.4.8.7.7.7.e.7.7.e.0.3.7.4.0.7.q.a.h.j.n.M.B.B.P.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXR.v.n.v.b.v.s.s.w.w.0.0.7.3.7.3.3.3.7.3.0.7.3.7.7.7.7.7.7.7.7.5.7.3.5.1.3.3.1.1.3.1.3.3.3.3.4.4.4.4.8.q.9.r.t.c.N.N.N.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjXh.7.1.1.1.1.1.l ;.1.1.1.1.1.1.5.5.5.7.8.8.a.q.i.7.7.7.3.z 4 $ X + v S./.S.W.S.S.S.S.S.S.m < + 9 q 2 7 7 2 5 7 7 5 e 6.i.h.h.a.a.s.a.k.k.k.k.k.k.k.k.F.J.r.A.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXZ.7.5.=.2.1.1.1.&.6 1.=.w 7 7 w w w q q 8 < : : $ # & & & % % * ; ; ; ; ; Z ; ; Z ; ; ; ; * * - & @ @ < r 4.q.h.8.8.x.i.8.p.i.p.i.i.i.7.q.8.a.q.a.a.h.k.8.E.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&Xe.c.t.t.t.e.q.q.9.0.4.4.4.4.7.1.3.3.1.3.3.3.1.3.3.;.3.3.7.3.0.3.7.7.7.8.8.q.7.7.7.0.7.3.7.7.3.4.7.q.q.q.a.j.n.n.P.P.R.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xv.I.n.b.b.s.s.s.w.0.0.0.0.0.3.3.0.3.7.7.:.0.3.7.7.7.7.:.7.7.4.7.7.5.5.5.3.1.x 4.l 3.3.3.3.4.4.4.4.4.e.9.r.t.c.c.N.c. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X7.7.l 6 l 1.u 1.1.1.1.1.1.1.7.1.1.7.7.8.8.i.a.7.7.7.z l w w 1 1 3 1 2 1 8 , < 8 , < < , 8 q q w e 7 7 7 5 5 5 2.x.h.d.a.a.a.j.s.a.k.j.k.j.h.j.k.F.L.k.9.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXq.a.6 2.l 1.e 1.1.6 =.w w e w w w q 2 w 7 8 < < > % # O o & & & % % * * * * tXtX* * % % @ O O $ 1 c x.p.p.p.i.i.p.p.7.3.a.i.i.i.a.i.7.a.8.8.a.a.h.z.a.y.DXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXe.y.t.y.t.r.9.e.4.4.e.4.e.3.4.1.4.4.3.4.3.3.;.3.;.3.3.3.3.3.3.3.7.4.7.e.7.e.8.0.7.4.7.4.7.3.4.7.8.8.q.w.s.j.n.B.P.P.oXmXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xs.v.b.v.s.b.s.w.w.0.0.0.3.7.3.7.0.3.3.7.7.7.7.3.7.7.3.7.7.7.:.3.3.3.;.3.3.5.3.3.3.3.z z 3.4.4.e.9.e.e.9.^.t.N.c.N.N.>XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX.Xq.3.3.u 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.p.8.8.3.1.l z l u u i i 5 5 3 3 3 5 5 5 5 5 5 5 5 5 5 5 4 7 7 u 5.i.k.k.k.h.i.d.i.k.i.k.k.h.r.q.r.k.L.l.z yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X4.8.1.k l 1.1.5.1.1.w w 5 5 7 2 2 w q q 5 2 2 8 , < < : $ O X X X o o o & tXtXo X X X + < w i.6.x.i.x.6.6.0.8.i.8.q.i.8.7.a.q.i.a.8.a.a.8.d.d.l.8.8.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXNXx N.t.w.w.e.e.w.9.4.q.3.3.z z 3.3.3.3.3.3.3.3.3.3.3.3.3.7.0.3.0.3.0.3.7.7.e.7.4.7.7.7.7.4.7.7.7.0.q.q.q.w.j.b.M.P.P.XXGXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXs.I.v.v.s.b.s.w.0.0.0.0.3.3.3.3.7.:.7.3.:.7.7.7.:.3.3.:.7.:.z 3.:.3.3.3.3.5.;.3.3.3.e.3.3.e.8.9.q.e.9.r.y.t.N.c.B.c.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW.z e.1.1.u e 1.1.1.1.1.1.1.1.1.1.1.1.1.1.8.8.8.4.3.3.z l z l i u i i i 5 5 i 5 5 5 5 6 5 5 7 7 2 5 i 1.8.a.i.i.i.i.h.k.a.h.h.d.k.i.i.k.h.h.Y.F.u %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXZ.l 6.5 1.1.6 1.1.6 e e 5 q 7 q 7 2 2 3 3 3 2 3 1 , , , < : : @ o X . tXtX X @ , c 9.4.6.8.6.6.8.6.8.8.7.8.8.8.8.i.8.8.8.a.8.i.a.q.i.i.F.h.i iXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXy.w.c.w.w.w.e.q.q.9.4.e.3.e.3.3.3.7.3.3.3.;.3.3.3.3.3.3.3.3.7.3.7.3.0.0.4.7.7.7.0.e.7.4.7.7.4.4.8.8.q.q.w.b.n.M.P.B.:XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXw.K.n.v.s.s.s.w.w.0.0.0.7.3.0.3.0.7.:.7.3.0.7.3.3.,.7.:.7.7.3.3.z 3.3.3.3.5.3.3.3.3.3.3.4.e.4.9.r.e.9.r.y.t.c.B.c.A.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXV.l 8.1.u 1.1.1.1.1.1.1.1.7.1.1.1.2.1.1.5.6.4.1.l l z l z l u l u u i w 5 6 5 5 6 7 7 5 5 5 6 6 3.4.8.q.a.i.i.x.a.h.a.h.a.h.h.a.a.F.k.k.J.F.l A.JXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXy.4.p.1.6 l 1.=.=.w w 5 7 q 7 3 3 3 3 5 3 5 q q q 2 1 8 , , < < : @ + + tXdX: q b 4.2.7.8.8.6.6.6.6.8.i.7.i.8.8.8.8.q.7.8.8.8.q.8.q.q.k.F.k.l >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXV.w.t.t.w.w.e.q.9.q.4.4.e.3.3.7.7.3.3.3.3.5.3.3.3.3.3.3.7.3.3.7.3.7.3.7.7.7.0.7.7.7.7.0.3.7.7.8.8.8.q.w.h.b.n.B.P.P.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXb.n.n.v.b.s.s.s.w.g.0.e.,.3.3.7.7.7.3.3.7.3.0.3.3.3.3.7.7.3.;.3.3.3.3.3.;.3.3.7.3.3.z 3.4.4.8.q.e.e.w.t.t.b.N.A.c.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXZ.5 7.3.;.u 1.1.1.1.1.1.2.7.1.1.1.1.=.=.1.1.l 5 i l l u l l i l i k l u l l u u 6 6 6 l 1.1.7.8.a.8.8.8.h.k.a.a.i.k.i.k.k.h.q.h.F.F.Y.z.l A.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXzXy.6.i.1.6 l l e e e w w 7 q q w q 5 q w q w w w q q q 1 1 , , , 1 1 q tXdX4.z 4.6.p.5.6.8.6.8.6.8.8.8.8.7.8.8.8.a.8.a.a.7.a.i.a.8.h.m.k.e W.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX|.w.t.t.w.w.w.q.q.9.q.4.3.e.e.3.3.3.3.3.3.3.3.:.3.3.3.3.7.7.3.3.0.3.0.7.e.7.7.e.7.4.0.0.7.3.e.8.8.q.q.a.h.b.N.B.P.P.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXB.b.n.b.b.s.s.w.w.0.0.0.7.3.3.3.0.7.7.3.7.7.7.,.3.7.:.7.3.:.3.3.3.3.3.3.;.3.3.3.3.3.3.3.4.4.e.q.r.e.w.w.c.n.N.M.c.|.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXV.u q.1.1.;.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l 6 5 5 5 u 5 u e 5 e l u u u l u 1.1.1.1.5.2.7.8.8.8.8.a.i.i.a.a.a.a.k.a.a.d.k.q.h.h.k.L.k.z A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXz.k 1.l 6 l 7 e w 5 7 q 2 3 3 k 5 q w q 5 q q e e w w w 2 1 2 3 c l tXtX6.6.6.5.5.5.5.7.7.7.8.8.8.7.8.8.8.8.8.q.8.a.8.a.q.q.a.a.h.r.i S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX4Xe.t.t.t.w.w.e.q.q.9.4.4.3.3.7.3.3.3.5.3.3.3.3.3.3.3.3.3.3.3.0.3.7.3.0.0.0.4.0.7.7.7.4.0.3.0.8.q.q.r.s.s.b.n.B.P.R.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXoXv.n.n.s.b.b.s.w.0.0.7.7.e.7.3.7.3.:.7.7.7.3.3.7.:.3.3.7.7.3.3.3.;.3.3.3.3.3.3.3.3.3.z 4.e.4.e.e.w.w.c.c.B.B.M.c.*XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXZ.;.8.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.l 5 5 3 i 5 5 5 w k e k u l l 1.1.1.1.8.8.6.p.i.i.8.u.i.a.a.a.a.i.i.a.i.a.h.a.h.a.h.h.J.z.9. XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjXc.3.8.1.k w e w w w 7 2 3 3 5 q w 3 3 2 2 2 q w w 5 w w 5 5 5 6 e tXtX6.5.5.5.7.8.8.7.7.7.8.8.8.8.8.8.8.8.8.8.8.8.8.a.a.h.h.h.j.z S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjX9.c.t.t.w.w.r.q.q.9.4.4.4.3.3.7.3.3.3.;.3.3.3.3.3.3.3.3.3.3.3.0.3.0.0.3.7.4.4.4.0.4.7.3.3.7.8.q.q.q.w.b.n.N.B.P.oXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;Xv.n.v.b.v.s.w.0.g.0.0.7.7.3.7.0.:.7.7.7.7.7.3.3.7.7.3.7.3.3.3.3.3.3.3.3.3.:.3.3.z 3.z e.e.4.q.e.r.w.t.c.N.M.B.V.8XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXT.1.8.5.1.l 1.1.1.2.1.1.1.1.1.1.2.2.l e 5 k w w e l l l e l ;.1.1.7.7.7.i.6.8.8.i.i.8.i.g.i.i.a.a.a.q.a.a.h.a.a.a.d.k.z.J.F.3.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXZ.6.8.5 q e e w w 2 3 3 3 3 q k w q 2 3 7 q q 2 5 w 5 e l l 1.1.tXtX7.6.7.7.7.3.5.7.7.7.7.7.8.8.8.8.8.8.8.i.8.8.8.a.a.a.h.a.q.-XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXw.b.t.w.w.w.e.q.q.4.e.4.4.4.7.3.3.3.3.3.;.7.3.3.3.3.3.7.7.e.7.0.3.3.3.0.0.0.7.0.0.0.0.7.7.0.q.q.q.w.s.j.v.B.K.P.XXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXe.n.v.s.s.s.s.s.w.0.e.,.7.7.3.7.7.7.3.:.3.3.3.3.3.3.3.3.3.3.3.3.;.;.3.3.3.3.3.3.3.4.4.3.4.q.e.e.t.w.c.b.N.B.c.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xq.7.4.l l 1.1.l l l l 1.6.5.l 2.l l ;.l l l l l l l l l 1.5.6.7.8.8.7.8.8.8.8.8.8.8.a.a.8.8.i.8.a.a.a.8.q.a.d.G.F.J.a.8.-XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXC.4.u.*.e e w q q w w k q q k w w w 3 7 5 5 7 5 5 u u u l 1.3.tXtX6.6.6.6.6.6.8.7.7.8.8.8.8.i.a.8.p.a.8.9.9.i.a.a.z.a.7.a.5XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXB.w.s.b.c.9.h.r.q.q.7.0.0.e.7.7.0.3.0.3.3.7.7.7.3.7.3.:.3.3.3.3.3.0.3.3.3.7.7.3.3.7.4.7.4.3.7.7.q.a.k.b.b.B.R.R.XXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXc.n.n.b.s.b.s.w.w.0.7.7.3.3.3.7.3.:.7.3.3.:.3.7.3.3.7.3.3.3.;.3.3.3.3.5.5.3.3.3.e.3.4.4.4.e.e.w.w.w.c.N.B.N.c.C.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXeX8.5.u.;.z z l ;.l 1.1.1.1.l 1.l 6 l 1.6 1.l 1.l 1.1.2.1.5.7.8.8.6.8.8.7.8.8.8.8.8.8.8.8.8.8.a.h.i.i.h.k.k.d.F.F.4.t.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX-X4.4.6.6 7 l w w q 3 5 3 3 3 3 3 3 3 i 5 5 5 5 l u l l 3.7.tXtX6.6.6.6.7.6.7.7.8.8.8.8.8.7.1.i.p.i.i.q.q.h.u.d.k.1.Z.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xe.b.t.t.w.h.e.q.0.0.4.7.4.3.3.3.7.3.7.3.7.7.e.:.3.e.:.3.3.:.e.7.3.7.3.e.7.3.7.7.0.4.3.7.0.0.0.0.g.l.b.c.B.P.P.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXB.v.n.b.s.s.s.w.s.w.0.0.3.3.7.7.7.0.3.7.:.7.3.3.3.3.3.3.3.3.3.3.;.3.3.3.3.3.3.3.3.4.4.4.4.q.e.w.w.w.w.c.M.N.c.%XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXU.&.7.e.u 1.1.1.5.3.;.;.1.1.1.1.l l l 1.2.1.1.1.1.1.1.5.7.6.8.6.8.8.8.8.8.7.8.a.8.a.8.h.a.i.a.8.i.k.G.F.J.k.2.A.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXc.7.7.5.&.5 k k w 5 w 5 5 5 5 5 5 5 i w l l l l l 1.3.1.tXtX6.6.6.7.6.6.8.7.7.8.8.7.8.8.q.7.8.i.i.i.h.s.F.p.5.-XAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXpXz n.b.e.w.h.q.q.0.e.0.0.e.0.0.0.3.4.3.7.3.7.7.3.3.:.3.3.3.3.7.7.3.7.3.3.7.0.3.3.7.7.7.3.0.0.0.w.s.l.b.b.L.R.R.NXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXR.v.v.n.v.s.s.s.0.0.0.0.7.7.7.7.7.3.0.3.7.7.3.3.3.3.5.7.3.3.3.3.3.3.3.3.:.3.3.3.3.4.4.4.e.9.q.w.w.w.c.c.B.A.c.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXW.3.7.7.5.5.5.=.1.l 3.1.l 1.l 1.1.1.1.1.1.1.2.5.1.6.5.7.6.6.7.6.7.7.8.8.8.8.8.a.a.8.8.i.8.h.a.a.F.F.k.2.y.1XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCX X9.u 5.1.l 5 5 k 5 5 5 k l i i 5 i l e u l 1.1.1.1.5.tXtX6.6.7.7.6.8.8.8.7.8.8.8.8.7.4.q.8.p.k.k.k.a.;.j.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXz v.b.w.t.r.w.q.q.0.4.4.0.7.4.0.0.7.0.7.7.7.3.3.7.3.3.3.7.3.3.3.3.7.e.7.7.3.7.3.4.7.4.7.0.0.0.w.s.l.b.B.P.R.A.DXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXXXv.v.v.v.s.s.w.s.0.0.0.4.0.4.7.7.0.3.7.7.7.3.3.3.3.3.3.3.7.3.3.;.3.3.3.7.3.3.4.3.4.4.8.9.q.e.w.w.c.c.b.N.B.c.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXdXl.i 3.5.5.5.1.l l 1.1.1.1.l 1.l 1.1.1.1.1.6.6.6.7.6.7.6.7.5.8.7.8.7.7.8.8.i.8.8.8.h.h.h.h.z.h.2.c /.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXhXD.i u 7.u u 5 i 5 5 5 k k 5 5 l l l u 1.1.1.5.5.8.tXtX7.7.6.7.8.8.8.8.p.8.8.i.8.i.8.8.i.k.k.r.1.i.-XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXVXc.w.v.w.t.w.a.w.0.0.0.0.e.q.0.0.7.7.7.4.4.7.3.3.e.3.e.:.3.e.7.3.3.e.:.3.7.0.3.0.0.7.4.7.0.0.0.s.s.s.N.B.P.R. XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXv.n.s.v.j.j.s.w.g.0.0.7.3.7.e.7.7.7.7.7.7.3.3.3.3.7.3.3.3.3.3.3.3.;.3.5.3.3.e.3.4.3.0.0.e.e.j.t.j.c.N.c.c.S.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX%Xv e.;.1.5.u z 3.1.1.1.1.1.1.1.1.1.5.6.1.1.5.5.1.1.6.5.6.7.7.8.8.7.8.8.8.q.x.h.h.k.k.h.3.z S.zXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXpXZ.4.1.l l l e u u i w l l l l l l 1.1.7.5.7.6.tXtX7.7.8.7.8.7.8.7.8.8.a.8.a.h.a.8.z.h.i 9.W.ZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xe.v.b.e.w.w.w.q.0.0.0.0.8.q.8.8.4.0.0.4.7.7.3.3.3.0.:.7.3.3.3.7.7.7.7.3.7.3.4.e.0.4.0.0.q.g.s.s.v.v.B.P.R.,XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXfXn.n.b.n.b.s.w.s.q.0.0.e.0.4.7.0.7.7.7.3.3.3.3.3.3.3.3.3.5.3.3.;.3.3.3.7.3.7.7.4.4.4.q.e.9.w.t.j.j.c.z.c.c.&XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAX=Xw.5.7.q.4.1.3.3.1.1.1.1.1.1.5.5.5.6.6.1.6.1.5.1.1.5.6.7.7.8.8.8.8.q.h.h.k.k.a.7.8..XZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXxXW.9.4.4.4.l l l l k e l l l 2.1.3.1.5.7.7.tXtX7.7.7.8.7.7.7.7.8.8.a.a.a.h.k.x.1.q.-XZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyX0.v.b.e.t.w.q.q.0.0.e.q.q.7.e.8.q.7.0.7.7.7.0.3.3.3.3.3.3.3.7.7.7.7.e.3.3.7.7.7.7.7.4.0.q.s.s.s.v.v.B.I.R.pXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXB.v.v.b.h.f.g.s.q.0.0.7.0.3.7.7.3.,.:.3.3.7.0.7.7.7.:.3.;.3.3.3.3.3.3.3.3.e.3.4.4.e.4.e.w.w.w.w.c.w.N.N.c.BXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAX%Xy.z 7.u.u.u.7.:.:.1.1.1.7.5.5.7.7.1.1.5.1.5.1.1.1.7.3.7.a.a.a.G.G.a.q.4.y.,XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBX Xb 4.7.u.>.:.;.l 1.u l z 1.5.7.4.2.2.tXtX3.3.7.7.8.i.i.a.a.s.d.d.i.i.x.Z.1XSXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXy.w.v.t.9.w.w.q.0.0.0.7.0.0.0.0.0.4.7.7.e.e.7.7.0.7.3.7.7.3.7.e.7.3.3.7.7.7.0.7.4.4.0.0.q.q.w.s.v.B.B.oXoXZXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXoXv.v.b.j.f.g.s.q.0.0.0.0.7.3.3.3.3.3.3.:.7.7.7.7.7.3.7.7.3.3.3.3.3.3.3.3.3.3.4.8.q.4.4.9.e.w.c.w.c.N.N.V.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXgXA.t.9.z 1.7.i.u.5.7.7.u.5.5.5.6.1.1.6.1.1.2.7.i.a.i.i.7.7.3.3.y.A.sXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXDXiXA.w.0.7.3.7.7.5.5.;.3.7.8.8.8.x.tXtX7.i.i.i.i.i.i.a.a.q.4.9.c.A.fXDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXA.w.b.s.t.w.w.q.0.0.0.g.0.q.q.7.0.0.0.4.7.e.3.0.0.4.3.3.e.3.3.:.3.3.7.3.7.e.7.7.7.e.0.0.e.q.w.b.N.B.B.oXoXDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xv.n.b.b.v.f.s.s.0.0.0.3.7.3.3.7.3.3.,.3.0.7.7.7.7.3.3.3.3.3.3.3.3.3.4.z 4.3.4.4.q.4.9.q.r.t.t.t.b.c.c. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAX7XS.V.r.8.6.p.5.3.7.a.a.i.7.7.7.7.5.7.5.6.6.7.1.3.t.n.S.pXGXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAX*XA.Z.y.2.1.6.p.7.7.7.7.8.7.tXtXu.i.i.8.7.7.q.r.z.Z./.7XAXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&Xw.b.s.b.w.w.w.q.0.7.g.0.7.0.0.0.0.0.4.0.4.7.4.7.7.7.7.3.7.7.7.3.0.3.7.3.0.7.0.7.4.0.0.q.w.s.b.m.K.P.P.&XPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXv.n.b.b.v.f.s.s.0.0.7.0.7.7.7.7.7.3.3.3.7.7.3.3.7.7.:.7.7.3.7.4.3.3.3.4.3.4.4.4.9.q.9.r.e.w.c.c.N.B.c.fXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXBX9X/.W.Z.c.e.9.z i :.:.;.:.7.i.i.z.Z.R.%X3XZXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXzX1XW.A.Z.z.a.i.i.8.8.tXtXq.r.t.c.A.|.-XiXZXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXjXc.b.b.j.t.w.w.w.0.q.q.q.q.q.0.0.0.0.8.q.8.0.q.0.e.7.4.3.7.3.e.7.3.0.3.4.0.4.7.q.e.q.q.w.s.s.n.N.M.oXB.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXB.v.N.b.v.v.g.s.0.0.0.0.7.4.4.3.e.3.3.:.0.0.7.7.7.7.7.3.3.7.3.3.7.3.3.4.3.3.9.8.4.q.9.e.w.w.c.c.c.N.c.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXHXAXBXjX7X6X4X<X1X<XpXfXxXSXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXSXBXhXfXpX3X6XtXtXgXzXBXAXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXc.c.j.n.t.w.w.q.0.q.q.q.q.q.0.0.7.7.q.8.q.0.7.0.4.4.7.7.7.3.7.3.0.7.4.7.4.7.0.7.0.0.q.w.s.n.n.N.L.P.oXmXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXPXoXv.n.b.v.v.s.s.w.0.0.0.4.7.7.3.7.7.3.3.7.7.3.:.7.7.7.3.3.3.5.3.3.3.3.z e.3.4.9.q.r.q.e.q.t.b.c.B.c.A.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKX&Xt.n.l.j.s.w.w.q.s.q.q.q.q.q.0.q.q.8.e.8.7.0.0.7.7.7.e.7.7.7.3.0.7.0.0.0.0.7.8.e.q.w.w.j.n.n.M.P.P.oXDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xv.n.b.v.v.s.s.w.0.7.0.7.7.7.7.7.e.3.3.7.7.7.7.7.7.3.3.3.3.3.3.3.3.3.3.3.4.4.4.4.r.e.r.e.t.b.N.N.c.tXKXKXPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXgXc.n.l.j.s.w.w.0.w.g.q.q.0.q.0.0.q.q.8.8.8.q.4.7.7.4.7.7.3.7.7.0.4.3.8.8.7.8.q.e.q.w.w.s.n.M.I.P.oXoXJXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXMXb.v.v.v.w.s.s.w.q.q.e.q.0.7.,.7.:.7.3.e.7.0.7.7.e.7.3.5.3.3.3.3.3.4.1.4.3.4.q.e.w.q.j.t.t.j.N.N.9.VXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXJXV.n.G.j.j.s.s.w.w.s.q.q.q.0.0.0.e.7.q.0.e.0.0.0.0.0.7.e.0.0.0.:.,.e.0.0.7.q.q.q.q.w.s.b.n.M.P.oXB.MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXA.n.G.n.b.s.s.w.q.q.7.8.7.0.e.3.,.3.7.4.4.3.7.7.3.3.3.3.3.3.3.3.3.3.4.4.3.e.9.e.w.e.w.j.b.c.N.N.S.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKX KX KX KXKXKX KXKX KXKX KXKXKXKXKXKXKXKXKX&Xw.F.b.b.s.w.w.w.w.w.q.q.q.0.e.0.0.0.0.7.0.0.7.7.0.e.7.7.0.7.7.7.7.e.7.0.0.q.q.a.s.v.b.M.B.P.P.A.AXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX XM.n.n.b.v.j.s.w.q.e.q.q.0.3.3.3.7.,.4.7.7.e.7.7.3.3.3.7.3.5.3.3.7.3.4.3.4.4.e.e.q.w.t.N.b.c.e.sXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKX KXKXKX KXKX KXKXKXKXKX KX KXKXKXKXKXKXKXKXKXKXCXb.v.b.s.s.w.w.w.w.w.w.q.q.q.0.e.0.q.q.0.7.0.0.0.0.0.0.e.e.e.0.0.7.0.0.0.q.q.w.a.h.v.b.M.B.P.P.XXGXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXb.n.n.b.v.j.s.w.q.q.q.7.0.7.7.,.3.0.7.7.7.3.7.3.3.3.3.3.3.3.3.3.4.3.4.3.4.q.e.e.h.t.b.w.c.N.c.VXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX KXKX KXKXKX KXKXKX KXKX KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKX Xs.b.s.w.w.w.w.w.0.w.q.0.0.0.0.q.q.7.0.q.7.0.0.7.0.0.0.0.0.7.0.7.0.0.q.q.0.s.a.s.b.n.M.P.R.B.dXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXN.m.v.w.b.b.h.s.w.q.q.0.q.e.7.3.0.0.4.0.4.7.7.3.e.3.3.3.3.7.3.3.6.1.4.3.e.9.9.q.e.t.c.c.B.w. XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKX KXKX KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXdXw.b.s.b.b.w.w.s.w.w.w.0.w.0.w.q.q.0.0.0.0.0.0.7.0.0.7.7.0.0.0.0.0.q.0.q.a.s.s.s.v.B.L.P.P.A.CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX-Xb.v.v.v.j.j.s.w.w.q.q.q.0.0.0.3.0.3.7.7.e.7.3.:.3.7.3.3.3.3.3.2.3.2.3.4.e.e.w.9.w.w.c.c.w.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKX KXKXKXKXKXKXKXKXKXKXKX KXKX KXKXKX KXKX KXKXKXKXKX KX KXKXKXKXKXKXKXKXKXKXKXFXZ.b.b.b.s.w.s.s.s.w.w.w.w.0.0.0.q.q.q.0.0.0.q.q.0.0.0.q.0.0.0.0.q.q.q.q.s.s.v.b.n.B.P.P.B.XXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXNXc.B.v.b.b.j.s.s.w.r.q.q.0.7.0.0.0.3.7.4.3.3.7.7.3.3.3.3.3.3.3.4.4.4.3.4.e.e.e.t.c.t.B.t.oXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKX KXKXKXKX KX KXKXKX KXKX KXKX KXKXKXKXKXKXKXKXKXKXKX Xb.b.b.s.c.j.j.w.s.g.w.0.w.w.q.0.q.q.q.q.0.0.0.0.q.0.q.0.0.0.q.q.q.q.q.s.s.f.n.n.B.P.P.P.MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXA.w.B.v.b.j.s.w.g.s.g.q.0.0.0.0.0.7.8.4.7.4.7.4.3.3.3.3.3.1.3.1.1.1.4.e.9.q.e.r.9.b.M.y.3XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXCXj.b.s.b.b.s.w.a.w.w.w.w.q.q.q.w.q.q.q.q.q.q.0.0.4.0.0.0.0.8.0.0.0.w.w.s.f.s.b.B.B.P.P. XJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXw.n.v.j.b.t.s.s.g.e.q.0.e.0.0.8.4.e.8.7.7.7.7.3.7.3.3.4.1.1.4.3.4.4.4.q.e.h.t.t.M.n.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXuXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXoXw.n.n.v.w.b.s.w.q.q.0.0.0.0.8.q.8.0.0.4.3.3.7.4.3.3.3.1.3.1.3.4.4.9.r.e.r.z.c.N.t.1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXkXtXtXtXtXtXtXtXtXtXtX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXw.n.H.v.w.t.w.e.g.0.w.0.0.0.q.8.e.0.7.7.7.7.3.3.3.3.3.3.1.2.1.4.4.4.r.r.w.t.N.c.V.FXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xw.P.H.s.c.j.j.j.j.s.s.s.w.w.q.q.q.0.0.0.0.0.0.0.0.0.q.q.w.w.s.s.v.v.f.L.M.P.A.A.NXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX Xe.s.n.f.w.w.e.w.w.q.q.w.0.0.q.7.7.0.4.7.3.4.3.3.1.3.1.3.2.3.4.4.q.w.w.w.c.c.c.7XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmXc.v.L.n.b.n.b.b.s.s.s.s.w.w.w.w.w.0.0.0.0.0.0.0.0.q.w.w.q.w.s.b.v.v.L.P.P.P.A.yXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXBXB.e.v.H.s.t.w.s.s.g.q.0.0.q.8.7.q.7.3.7.3.5.4.3.3.3.1.1.3.3.4.8.q.w.w.t.b.t.A.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:Xe.K.n.n.n.n.b.s.s.s.s.s.w.w.s.w.s.w.w.0.w.0.q.s.w.w.s.s.s.s.v.v.n.B.v.P.B.|.HXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXdXc.f.F.f.s.s.s.f.s.q.0.0.q.8.8.e.0.4.7.5.4.3.3.3.3.1.3.2.4.4.9.e.t.t.c.b.c.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXB.v.L.H.n.n.n.n.v.s.b.s.w.s.s.s.s.s.s.g.a.a.s.a.a.s.s.s.s.v.n.n.B.B.B.P.oXmXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXPX:Xw.f.G.s.b.w.w.w.s.w.0.q.0.q.7.7.7.3.3.3.3.3.3.3.3.1.7.3.9.9.e.b.j.b.t.;XLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXc.n.I.M.M.n.b.b.v.n.b.b.j.s.s.s.w.w.s.w.s.w.w.s.j.b.l.n.n.n.B.B.P.P.oXlXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXA.w.H.v.w.w.9.w.w.w.0.q.0.0.4.4.3.3.1.3.l l 3.l 3.1.3.q.e.e.9.w.N.w.W.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>Xe.P.b.B.v.v.M.v.s.v.b.j.s.w.s.w.w.w.w.w.w.w.b.t.j.m.n.n.B.B.P.P.R.8XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXB.q.H.v.l.j.s.s.w.q.e.7.0.7.7.3.3.3.3.3.3.l 1.4.1.8.3.q.t.w.w.w.A.SXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXFX Xb.L.B.B.B.B.v.v.b.b.b.b.j.b.w.b.b.s.s.s.s.b.b.b.v.I.P.v.B.P.B.tXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXN.s.n.f.l.f.w.w.w.0.0.7.4.4.3.3.3.l 4.l 3.l 4.4.e.4.q.z.j.y.c.MXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKX KXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXA.v.B.P.v.v.B.B.v.v.b.b.v.b.b.v.b.j.b.b.b.b.b.N.B.n.P.Q.P.B.4XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXAXN.h.l.l.f.q.0.0.w.0.0.0.3.3.3.4.l 1.3.1.4.4.4.3.w.h.r.x V.mXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKX KXKXKX KXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSXW.N.v.P.B.v.v.b.N.n.N.n.b.b.v.N.b.b.n.n.n.N.B.B.P.R.P.R.gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX Xb.t.w.j.j.w.w.0.0.7.7.4.5.4.3.3.1.3.4.4.4.e.w.9.z D.CXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKX KXKXKXKXKX KXKX KXKXKX KX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGX>Xc.N.M.B.B.n.M.n.B.n.n.n.n.v.n.n.N.M.B.P.B.B.P.R. XmXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFX:XB.e.t.j.a.a.w.q.0.0.7.7.8.3.3.4.3.4.8.8.w.w.v %XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKX KXKXKX KXKXKXKXKXKXKX KXKX KX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXhXR.n.R.N.B.M.M.M.L.M.M.M.M.M.M.M.B.P.P.P.R.R.4XDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX Xt.e.a.f.s.s.q.0.7.7.7.8.5.7.8.8.4.z 9.A.xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKX KXKX KXKXKXKX KXKX KXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXyXT.B.N.B.B.L.L.I.P.P.P.P.P.P.P.P.B.A.XXmXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXfXE.b.7.7.7.u.a.d.a.q.7.:.&.6 l t.E.8XHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKX KXKX KXKXKX KXKX KXKX KXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXSX4XoXB.N.N.L.P.P.I.P.P.L.B.B.oX1XMXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXmX1X XZ.e.c b x x b y.S.%X6XCXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKX KXKXKX KXKX KXKXKX KXKX KXKX KXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXNXpX&XoXA.A.A.A. XXX4XmXDXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJXHXCXBXBXBXMXCXVXHXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKX KXKXKXKX KXKX KXKX KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXSXVXSXSXFXPXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX",
"KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXtXtXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX"
};

File diff suppressed because it is too large Load Diff

View File

@ -1,516 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
// Include
// ---------
#include "nJoy.h"
#include "LogManager.h"
// Declare config window so that we can write debugging info to it from functions in this file
#if defined(HAVE_WX) && HAVE_WX
PADConfigDialognJoy* m_ConfigFrame = NULL;
#endif
// Variables
// ---------
#define _EXCLUDE_MAIN_ // Avoid certain declarations in nJoy.h
FILE *pFile;
std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE PadState[4];
InputCommon::CONTROLLER_MAPPING PadMapping[4];
bool g_EmulatorRunning = false;
bool g_SearchDeviceDone = false;
int NumPads = 0, NumGoodPads = 0, LastPad = 0;
#ifdef _WIN32
HWND m_hWnd = NULL, m_hConsole = NULL; // Handle to window
#endif
SPADInitialize *g_PADInitialize = NULL;
PLUGIN_GLOBALS* globals = NULL;
// Standard crap to make wxWidgets happy
#ifdef _WIN32
HINSTANCE g_hInstance;
#if defined(HAVE_WX) && HAVE_WX
class wxDLLApp : public wxApp
{
bool OnInit()
{
return true;
}
};
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);
#endif
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
DWORD dwReason, // reason called
LPVOID lpvReserved) // reserved
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
#if defined(HAVE_WX) && HAVE_WX
wxSetInstance((HINSTANCE)hinstDLL);
int argc = 0;
char **argv = NULL;
wxEntryStart(argc, argv);
if (!wxTheApp || !wxTheApp->CallOnInit())
return FALSE;
#endif
}
break;
case DLL_PROCESS_DETACH:
#if defined(HAVE_WX) && HAVE_WX
wxEntryCleanup();
#endif
break;
default:
break;
}
g_hInstance = hinstDLL;
return TRUE;
}
#endif
#if defined(HAVE_WX) && HAVE_WX
wxWindow* GetParentedWxWindow(HWND Parent)
{
#ifdef _WIN32
wxSetInstance((HINSTANCE)g_hInstance);
#endif
wxWindow *win = new wxWindow();
#ifdef _WIN32
win->SetHWND((WXHWND)Parent);
win->AdoptAttributesFromHWND();
#endif
return win;
}
#endif
// Input Plugin Functions (from spec's)
// ------------------------------------
// Get properties of plugin
// ------------------------
void GetDllInfo(PLUGIN_INFO* _PluginInfo)
{
_PluginInfo->Version = 0x0100;
_PluginInfo->Type = PLUGIN_TYPE_PAD;
#ifdef DEBUGFAST
sprintf(_PluginInfo->Name, "nJoy (DebugFast) by Falcon4ever");
#else
#ifndef _DEBUG
sprintf(_PluginInfo->Name, "nJoy by Falcon4ever");
#else
sprintf(_PluginInfo->Name, "nJoy (Debug) by Falcon4ever");
#endif
#endif
}
void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
{
globals = _pPluginGlobals;
LogManager::SetInstance((LogManager *)globals->logManager);
}
// Call config dialog
// ------------------
void DllConfig(HWND _hParent)
{
if (!g_SearchDeviceDone)
{
g_Config.Load(); // load settings
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
// Populate joyinfo for all attached devices
Search_Devices(joyinfo, NumPads, NumGoodPads);
g_SearchDeviceDone = true;
}
#if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame)
m_ConfigFrame = new PADConfigDialognJoy(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// Only allow one open at a time
if (!m_ConfigFrame->IsShown())
m_ConfigFrame->ShowModal();
else
m_ConfigFrame->Hide();
#endif
}
void DllDebugger(HWND _hParent, bool Show) {}
// Init PAD (start emulation)
// --------------------------
void Initialize(void *init)
{
INFO_LOG(PAD, "Initialize: %i", SDL_WasInit(0));
g_PADInitialize = (SPADInitialize*)init;
g_EmulatorRunning = true;
#ifdef _WIN32
m_hWnd = (HWND)g_PADInitialize->hWnd;
#endif
#ifdef _DEBUG
DEBUG_INIT();
#endif
if (!g_SearchDeviceDone)
{
g_Config.Load(); // load settings
// Populate joyinfo for all attached devices
Search_Devices(joyinfo, NumPads, NumGoodPads);
g_SearchDeviceDone = true;
}
}
void Close_Devices()
{
PAD_RumbleClose();
/* Close all devices carefully. We must check that we are not accessing any undefined
vector elements or any bad devices */
if (SDL_WasInit(0))
{
for (int i = 0; i < NumPads; i++)
{
if (joyinfo.at(i).joy)
{
if(SDL_JoystickOpened(i))
{
INFO_LOG(WIIMOTE, "Shut down Joypad: %i", i);
SDL_JoystickClose(joyinfo.at(i).joy);
}
}
}
}
for (int i = 0; i < 4; i++)
PadState[i].joy = NULL;
// Clear the physical device info
joyinfo.clear();
NumPads = 0;
NumGoodPads = 0;
}
// Shutdown PAD (stop emulation)
// -----------------------------
/* Information: This function can not be run twice without an Initialize in between. If
it's run twice the SDL_...() functions below will cause a crash.
Called from: The Dolphin Core, PADConfigDialognJoy::OnClose() */
void Shutdown()
{
INFO_LOG(PAD, "Shutdown: %i", SDL_WasInit(0));
// Always change this variable
g_EmulatorRunning = false;
// Stop debugging
#ifdef _DEBUG
DEBUG_QUIT();
#endif
Close_Devices();
// Finally close SDL
if (SDL_WasInit(0))
SDL_Quit();
// Remove the pointer to the initialize data
g_PADInitialize = NULL;
g_SearchDeviceDone = false;
}
// Set buttons status from keyboard input. Currently this is done from wxWidgets in the main application.
// --------------
void PAD_Input(u16 _Key, u8 _UpDown)
{
// Check that Dolphin is in focus, otherwise don't update the pad status
if (!IsFocus()) return;
// Check if the keys are interesting, and then update it
for(int i = 0; i < 4; i++)
{
if (!PadMapping[i].enable)
continue;
for(int j = InputCommon::CTL_L_SHOULDER; j <= InputCommon::CTL_START; j++)
{
if (PadMapping[i].buttons[j] == _Key)
{ PadState[i].buttons[j] = _UpDown; break; }
}
for(int j = InputCommon::CTL_D_PAD_UP; j <= InputCommon::CTL_D_PAD_RIGHT; j++)
{
if (PadMapping[i].dpad2[j] == _Key)
{ PadState[i].dpad2[j] = _UpDown; break; }
}
}
}
// Save state
// --------------
void DoState(unsigned char **ptr, int mode)
{
#ifdef RERECORDING
Recording::DoState(ptr, mode);
#endif
}
void EmuStateChange(PLUGIN_EMUSTATE newState)
{
}
// Set PAD status
// --------------
// Called from: SI_DeviceGCController.cpp
// Function: Gives the current pad status to the Core
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
{
// Check if the pad is avaliable, currently we don't disable pads just because they are
// disconnected
if (!PadState[_numPAD].joy)
return;
// Clear pad status
memset(_pPADStatus, 0, sizeof(SPADStatus));
// Check that Dolphin is in focus, otherwise don't update the pad status
if (g_Config.bCheckFocus || IsFocus())
GetJoyState(PadState[_numPAD], PadMapping[_numPAD], _numPAD, joyinfo[PadMapping[_numPAD].ID].NumButtons);
// Get type
int TriggerType = PadMapping[_numPAD].triggertype;
int TriggerValue = PadState[_numPAD].halfpress ? 100 : 255;
// The analog controls
// -----------
// Read axis values
int i_main_stick_x = PadState[_numPAD].axis[InputCommon::CTL_MAIN_X];
int i_main_stick_y = -PadState[_numPAD].axis[InputCommon::CTL_MAIN_Y];
int i_sub_stick_x = PadState[_numPAD].axis[InputCommon::CTL_SUB_X];
int i_sub_stick_y = -PadState[_numPAD].axis[InputCommon::CTL_SUB_Y];
int TriggerLeft = PadState[_numPAD].axis[InputCommon::CTL_L_SHOULDER];
int TriggerRight = PadState[_numPAD].axis[InputCommon::CTL_R_SHOULDER];
// Check if we should make adjustments
if (PadMapping[_numPAD].bSquareToCircle) InputCommon::Square2Circle(i_main_stick_x, i_main_stick_y, _numPAD, PadMapping[_numPAD].SDiagonal);
// Radius adjustment
if (PadMapping[_numPAD].bRadiusOnOff) InputCommon::RadiusAdjustment(i_main_stick_x, i_main_stick_y, _numPAD, PadMapping[_numPAD].SRadius);
// C-stick
if (PadMapping[_numPAD].bSquareToCircleC) InputCommon::Square2Circle(i_sub_stick_x, i_sub_stick_y, _numPAD, PadMapping[_numPAD].SDiagonalC);
if (PadMapping[_numPAD].bRadiusOnOffC) InputCommon::RadiusAdjustment(i_sub_stick_x, i_sub_stick_y, _numPAD, PadMapping[_numPAD].SRadiusC);
// Convert axis values
u8 main_stick_x = InputCommon::Pad_Convert(i_main_stick_x);
u8 main_stick_y = InputCommon::Pad_Convert(i_main_stick_y);
u8 sub_stick_x = InputCommon::Pad_Convert(i_sub_stick_x);
u8 sub_stick_y = InputCommon::Pad_Convert(i_sub_stick_y);
// Convert the triggers values, if we are using analog triggers at all
if (PadMapping[_numPAD].triggertype == InputCommon::CTL_TRIGGER_SDL)
{
if (PadMapping[_numPAD].buttons[InputCommon::CTL_L_SHOULDER] >= 1000) TriggerLeft = InputCommon::Pad_Convert(TriggerLeft);
if (PadMapping[_numPAD].buttons[InputCommon::CTL_R_SHOULDER] >= 1000) TriggerRight = InputCommon::Pad_Convert(TriggerRight);
}
// Set Deadzone
float deadzone = (128.00 * (float)(PadMapping[_numPAD].deadzone + 1.00)) / 100.00;
float distance_main = (float)sqrt((float)(main_stick_x * main_stick_x) + (float)(main_stick_y * main_stick_y));
float distance_sub = (float)sqrt((float)(sub_stick_x * sub_stick_x) + (float)(sub_stick_y * sub_stick_y));
// Send values to Dolpin if they are outside the deadzone
if (distance_main > deadzone)
{
_pPADStatus->stickX = main_stick_x;
_pPADStatus->stickY = main_stick_y;
}
if (distance_sub > deadzone)
{
_pPADStatus->substickX = sub_stick_x;
_pPADStatus->substickY = sub_stick_y;
}
// The L and R triggers
// -----------
// Neutral value, no button pressed
_pPADStatus->button |= PAD_USE_ORIGIN;
// Check if the digital L button is pressed
if (PadState[_numPAD].buttons[InputCommon::CTL_L_SHOULDER])
{
if (!PadState[_numPAD].halfpress)
_pPADStatus->button |= PAD_TRIGGER_L;
_pPADStatus->triggerLeft = TriggerValue;
}
// no the digital L button is not pressed, but the analog left trigger is
else if (TriggerLeft > 0)
_pPADStatus->triggerLeft = TriggerLeft;
// Check if the digital R button is pressed
if (PadState[_numPAD].buttons[InputCommon::CTL_R_SHOULDER])
{
if (!PadState[_numPAD].halfpress)
_pPADStatus->button |= PAD_TRIGGER_R;
_pPADStatus->triggerRight = TriggerValue;
}
// no the digital R button is not pressed, but the analog right trigger is
else if (TriggerRight > 0)
_pPADStatus->triggerRight = TriggerRight;
// Update the buttons in analog mode too
if (TriggerLeft > 0xf0) _pPADStatus->button |= PAD_TRIGGER_L;
if (TriggerRight > 0xf0) _pPADStatus->button |= PAD_TRIGGER_R;
// The digital buttons
// -----------
if (PadState[_numPAD].buttons[InputCommon::CTL_A_BUTTON])
{
_pPADStatus->button |= PAD_BUTTON_A;
_pPADStatus->analogA = 255; // Perhaps support pressure?
}
if (PadState[_numPAD].buttons[InputCommon::CTL_B_BUTTON])
{
_pPADStatus->button |= PAD_BUTTON_B;
_pPADStatus->analogB = 255; // Perhaps support pressure?
}
if (PadState[_numPAD].buttons[InputCommon::CTL_X_BUTTON]) _pPADStatus->button|=PAD_BUTTON_X;
if (PadState[_numPAD].buttons[InputCommon::CTL_Y_BUTTON]) _pPADStatus->button|=PAD_BUTTON_Y;
if (PadState[_numPAD].buttons[InputCommon::CTL_Z_TRIGGER]) _pPADStatus->button|=PAD_TRIGGER_Z;
if (PadState[_numPAD].buttons[InputCommon::CTL_START]) _pPADStatus->button|=PAD_BUTTON_START;
// The D-pad
// -----------
if (PadMapping[_numPAD].controllertype == InputCommon::CTL_DPAD_HAT)
{
if (PadState[_numPAD].dpad == SDL_HAT_LEFTUP || PadState[_numPAD].dpad == SDL_HAT_UP || PadState[_numPAD].dpad == SDL_HAT_RIGHTUP ) _pPADStatus->button|=PAD_BUTTON_UP;
if (PadState[_numPAD].dpad == SDL_HAT_LEFTUP || PadState[_numPAD].dpad == SDL_HAT_LEFT || PadState[_numPAD].dpad == SDL_HAT_LEFTDOWN ) _pPADStatus->button|=PAD_BUTTON_LEFT;
if (PadState[_numPAD].dpad == SDL_HAT_LEFTDOWN || PadState[_numPAD].dpad == SDL_HAT_DOWN || PadState[_numPAD].dpad == SDL_HAT_RIGHTDOWN ) _pPADStatus->button|=PAD_BUTTON_DOWN;
if (PadState[_numPAD].dpad == SDL_HAT_RIGHTUP || PadState[_numPAD].dpad == SDL_HAT_RIGHT || PadState[_numPAD].dpad == SDL_HAT_RIGHTDOWN ) _pPADStatus->button|=PAD_BUTTON_RIGHT;
}
else
{
if (PadState[_numPAD].dpad2[InputCommon::CTL_D_PAD_UP])
_pPADStatus->button |= PAD_BUTTON_UP;
if (PadState[_numPAD].dpad2[InputCommon::CTL_D_PAD_DOWN])
_pPADStatus->button |= PAD_BUTTON_DOWN;
if (PadState[_numPAD].dpad2[InputCommon::CTL_D_PAD_LEFT])
_pPADStatus->button |= PAD_BUTTON_LEFT;
if (PadState[_numPAD].dpad2[InputCommon::CTL_D_PAD_RIGHT])
_pPADStatus->button |= PAD_BUTTON_RIGHT;
}
// Update error code
_pPADStatus->err = PAD_ERR_NONE;
}
///////////////////////////////////////////////// Spec functions
//******************************************************************************
// Supporting functions
//******************************************************************************
// Search for SDL devices
// ----------------
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
{
// Close opened devices first
Close_Devices();
bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
// Warn the user if no gamepads are detected
if (_NumGoodPads == 0 && g_EmulatorRunning)
{
PanicAlert("nJoy: No Gamepad Detected");
return false;
}
// Update the PadState[].joy handle
for (int i = 0; i < 4; i++)
{
if (_NumPads > (u32)PadMapping[i].ID)
if(joyinfo.at(PadMapping[i].ID).Good)
PadState[i].joy = joyinfo.at(PadMapping[i].ID).joy;
}
return Success;
}
// Check if Dolphin is in focus
// ----------------
bool IsFocus()
{
return true;
#ifdef _WIN32
HWND RenderingWindow = NULL; if (g_PADInitialize) RenderingWindow = g_PADInitialize->hWnd;
HWND Parent = GetParent(RenderingWindow);
HWND TopLevel = GetParent(Parent);
HWND Config = NULL; if (m_ConfigFrame) Config = (HWND)m_ConfigFrame->GetHWND();
// Support both rendering to main window and not, and the config and eventual console window
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config || GetForegroundWindow() == m_hConsole)
return true;
else
return false;
#else
return true;
#endif
}

View File

@ -1,111 +0,0 @@
// Project description
// -------------------
// Name: nJoy
// Description: A Dolphin Compatible Input Plugin
//
// Author: Falcon4ever (nJoy@falcon4ever.com)
// Site: www.multigesture.net
// Copyright (C) 2003 Dolphin Project.
//
//
// Licensetype: GNU General Public License (GPL)
//
// 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, version 2.0.
//
// 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 2.0 for more details.
//
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
//
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//
#ifndef __NJOY_h__
#define __NJOY_h__
// Includes
// ----------
#include <vector> // System
#include <cstdio>
#include <ctime>
#include <cmath>
#include "../../../Core/InputCommon/Src/SDL.h" // Core
#include "../../../Core/InputCommon/Src/XInput.h"
#include "Common.h" // Common
#include "Setup.h"
#include "pluginspecs_pad.h"
#include "IniFile.h"
#include "Config.h" // Local
#if defined(HAVE_WX) && HAVE_WX
#include "GUI/AboutBox.h"
#include "GUI/ConfigBox.h"
#endif
// Define
// ----------
// SDL Haptic fails on windows, it just doesn't work (even the sample doesn't work)
// So until i can make it work, this is all disabled >:(
#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32)
#define SDL_RUMBLE
#else
#ifdef _WIN32
#define RUMBLE_HACK
#define DIRECTINPUT_VERSION 0x0800
#define WIN32_LEAN_AND_MEAN
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "winmm.lib")
#include <dinput.h>
#endif
#endif
#define INPUT_STATE wxT("PUBLIC RELEASE")
#define RELDAY wxT("21")
#define RELMONTH wxT("07")
#define RELYEAR wxT("2008")
#define THANKYOU wxT("`plot`, Absolute0, Aprentice, Bositman, Brice, ChaosCode, CKemu, CoDeX, Dave2001, dn, drk||Raziel, Florin, Gent, Gigaherz, Hacktarux, JegHegy, Linker, Linuzappz, Martin64, Muad, Knuckles, Raziel, Refraction, Rudy_x, Shadowprince, Snake785, Saqib, vEX, yaz0r, Zilmar, Zenogais and ZeZu.")
#define PLUGIN_VER_STR wxT("Based on nJoy 0.3 by Falcon4ever\nRelease: ") RELDAY wxT("/") RELMONTH wxT("/") RELYEAR wxT("\nwww.multigesture.net")
// Variables
// ---------
#ifndef _EXCLUDE_MAIN_
extern SPADInitialize *g_PADInitialize;
extern FILE *pFile;
extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
extern InputCommon::CONTROLLER_STATE PadState[4];
extern InputCommon::CONTROLLER_MAPPING PadMapping[4];
#ifdef _WIN32
extern HWND m_hWnd, m_hConsole; // Handle to window
#endif
extern int NumPads, NumGoodPads, LastPad; // Number of goods pads
#endif
// Custom Functions
// ----------------
void Close_Devices();
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
void DEBUG_INIT();
void DEBUG_QUIT();
bool IsFocus();
bool ReloadDLL();
void PAD_RumbleClose();
#endif // __NJOY_h__

View File

@ -1,115 +0,0 @@
nJoy v0.3 by Falcon4ever 2008
A Dolphin Compatible Input Plugin
Copyright (C) 2003 Dolphin Project.
Changelog
==========================================================================
0.3: 3nd version of nJoy
- Release: July 2008
- Support for four players
- Misc. improvements
0.2: 2nd version of nJoy
- Release: 14th July 2005
- Now using SDL instead of DirectInput9
- Config/INI support
- Adjustable deadzone
- First public release
0.1: First version of nJoy
- Private Release: january 2005
- Using DirectInput9
- Specially made for the Logitech Rumblepad 2, but other joypads work too
- Advanced debug window, activated during gameplay
- No deadzone configurable
- No config/Ini
The Author
==========================================================================
* Falcon4ever (nJoy@falcon4ever.com)
System and Software Requirements
==========================================================================
Dolphin
The latest Dolphin release, avaible at www.dolphin-emu.com
SDL.dll (SDL-1.2.13)
(included with this release)
latest version avaible at www.libsdl.org
A Joystick
A Windows 9x compatible input device
Plugin Information
==========================================================================
nJoy was written in C++, compiled with Microsoft Visual Studio 2005 Professional Edition.
nJoy uses SDL for joysticks, mouse and keyboard.
For the graphical interface plain Win32 code was used.
How to install
==========================================================================
Just unzip the content of the zipfile to your dolphin plugin dir and place
sdl.dll in the root dir.
example config:
[C:]
|
+-Dolphin Dir
+-DolphinWx.exe File
+-SDL.dll File
|
+-Plugins Dir
+-nJoy.dll File
FAQ
==========================================================================
What's SDL???
SDL is the Simple DirectMedia Layer written by Sam Lantinga.
It provides an API for audio, video, input ...
For more information go to http://www.libsdl.org/
Where can I download the latest releases???
nJoy will be released @ www.multigesture.net
Can I mirror this file???
Sure, just don't forget to add a link to:
www.multigesture.net OR www.dolphin-emu.com
-------------------- -------------------
Why should I use nJoy instead of the default input plugin???
At this moment the default plugin only supports keyboard input.
nJoy supports Joysticks. And besides that, if you have an GC-adapter
you can use your original GC controllers with dolphin !
Could you add [insert feature here] please???
no.
But perhaps...
NO!
Hmm... There is coming smoke out of my pc, wtf?
err, this plugin comes without any warranty,
use it at own risk :)
What should I do if my question isn't listed here???
Just panic, call 911 or leave a message on:
(1) Emutalk http://www.emutalk.net/forumdisplay.php?f=100
(2) NGemu http://forums.ngemu.com/dolphin-discussion/
Thanks / Greetings
==========================================================================
Special Thanks too:
F|RES & ector
Greetings too:
`plot`, Absolute0, Aprentice, Bositman, Brice, ChaosCode, CKemu,
CoDeX, Dave2001, dn, drk||Raziel, Florin, Gent, Gigaherz, Hacktarux,
icepir8, JegHegy, Linker, Linuzappz, Martin64, Muad, Knuckles, Raziel,
Refraction, Rudy_x, Shadowprince, Snake785, Saqib, vEX, yaz0r,
Zilmar, Zenogais and ZeZu.
AAaannd everyone else I forgot ;)...