--- /dev/null
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.Build.0 = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.ActiveCfg = Debug|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.Build.0 = Debug|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.ActiveCfg = Release|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.Build.0 = Release|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.ActiveCfg = Release|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="DCHook"
+ ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath=".\DCHook.cpp">
+ </File>
+ <File
+ RelativePath=".\DCHook.def">
+ </File>
+ </Filter>
+ <Filter
+ Name="\83w\83b\83_\81[ \83t\83@\83C\83\8b"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ </Filter>
+ <Filter
+ Name="\83\8a\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File
+ RelativePath=".\dchook.rc">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+//---------------------------------------------------------------------------
+//
+// \96â\91è\93_\81F
+// Ver0.50
+//
+// \8dÅ\93K\89»\82Ì\89Û\91è\81F
+// standard library\82ð\8eg\82í\82È\82¢\82æ\82¤\82É\82·\82é
+// \8b¤\97L\97Ì\88æ\82ð\91\9d\82â\82·
+//
+// Tips:
+// \93Ë\91RDetach\82³\82ê\82é\8c»\8fÛ
+// --> Hook Function\82Å\97á\8aO\82ª\94\90¶\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\8d\82\82¢
+// \82à\82µ\82\82Í\81A\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Å\97á\8aO\94\90¶\82µ\82Ä\82¢\82é
+// \8b¤\97L\83\81\83\82\83\8a\82É\82Â\82¢\82Ä
+// \95¨\97\9d\83\81\83\82\83\8a\82ª\93¯\88ê\82¾\82¯\82Å\82 \82Á\82Ä\81A\98_\97\9d\83A\83h\83\8c\83X\82Í\93¯\88ê\82Æ\82Í\8cÀ\82ç\82È\82¢\81I\81I
+// \8f]\82Á\82Ä\81A\8b¤\97L\83\81\83\82\83\8a\8fã\82Épointer\82ð\94z\92u\82·\82é\82±\82Æ\82Í\8aî\96{\93I\82É\8aë\8c¯\81I\81I
+#define STRICT
+#include <windows.h>
+#include <tchar.h>
+#pragma hdrstop
+#ifndef GWL_WNDPROC
+#define GWL_WNDPROC (-4) // \82±\82Ì\92è\8b`\82ª\82È\82¢\82Æerror\82É\82È\82Á\82½ 2014.11.19
+#endif
+#include <tlhelp32.h>
+#include <imagehlp.h>
+#pragma comment(lib, "ImageHlp")
+#include "DCHook.h"
+#ifndef UNICODE
+#include "..\VxD\hk95d.h"
+#endif
+#include "MonitorScale.h"
+
+// Compiler //
+#pragma warning( disable : 4710 ) // \82Ç\82¤\82µ\82Ä\82±\82¤\82¢\82¤warning\82ª\8fo\82Ä\82\82é\82Ì\82©\81H
+
+// Configuration //
+#define USE_SCALING 1 // Uses DPI scaling
+
+#define USE_DBW 1 // DBW\82ð\8eg\97p\82·\82é
+#define USE_SHARE0 1 // share\82µ\82Ä\82à\96â\91è\82È\82¢\95Ï\90\94
+
+#define METAEXTTEXTOUT 1 // MetaMethod\82ÅExtTextOutx\82ðhook\82·\82é
+#define HOOK_GETDC 0 // GetDC(),ReleaseDC()\82ðhook\82·\82é
+#define HOOK_TEXT 0 // DrawText(Ex),TextOut,TabbedTextOut\82Ìhooking
+#define USE_REDRAW 1
+#define HOOK_BITBLT 0 // 2016.1.15 \8aO\82µ\82Ä\82Ý\82½
+#define HOOK_PAINT 0
+#define GUARD 0 // \8b¤\97L\83\81\83\82\83\8a\82ðVirtualProtect\82Åguard\82·\82é
+ // \97L\8cø\82É\82·\82é\82ÆApplication\8fI\97¹\8e\9e\82É\88Ù\8fí\8fI\97¹\82ª\94\90¶\82·\82é
+ // Application close ->
+ // \8c´\88ö\81FDettach\82·\82é\91O\82É\81AOS or Application\82ª
+ // Protected code\97Ì\88æ\82É\8f\91\82«\8d\9e\82Ý\82ð\8ds\82Á\82Ä\82¢\82é\82æ\82¤\82¾
+
+#define USE_INVALIDATE 0 // \95`\89æ\91O\82ÉInvalidate\82ð\91\97\82é(IE5@Win98\82Í\95K\97v)
+#define INVALIDATE_TRUE 0 // InvalidateRect\82Årepaint\82ð\8ds\82¤
+#define ORG_OFFSET 1 // ViewPort\82Ìorg offset\8f\88\97\9d\82ð\8ds\82¤
+
+#define USE_OPTIMALINVALID 1 // \8dÄ\95`\89æ\97Ì\88æ\82ð\82È\82é\82×\82\8f¬\82³\82\82·\82é
+#define USE_VXD 0 // no longer support (Win9x)
+#define EXC_WOW64 0 // do not attach on WOW64
+
+#define MAX_KEYS 8 // \83L\81[\83t\83\89\83O\82Ì\8dÅ\91å\92è\8b`\90\94
+
+#define DEBUG_HITTEXT 0 // for debug hit text
+
+// ExtTextOut hooking\82ÅMetafile\82à\8eg\97p\82·\82é
+// \92P\93Æ\82Å\8ds\82¤\8fê\8d\87\82Í\81ARETRYMETA
+#if HOOK_PAINT || HOOK_GETDC || !USE_REDRAW
+#define USE_META 1
+#else
+#define USE_META 0
+#endif
+
+#define RETRYMETA 1
+
+#if USE_DBW
+#include <stdio.h>
+#else // !USE_DBW
+#undef DEBUG_HITTEXT
+#define DEBUG_HITTEXT 0
+#endif // !USE_DBW
+
+#define MOVESEND_POST 1
+
+// Type Definitions //
+
+// Macros //
+#if GUARD
+#define PROTECT_SHARE() ShareProtect( true )
+#define UNPROTECT_SHARE() ShareProtect( false )
+#else
+#define PROTECT_SHARE()
+#define UNPROTECT_SHARE()
+#endif
+
+#if USE_DBW
+#define DBW dbw
+#else
+#define DBW (void)
+#endif
+void dbw(const char *format, ...);
+
+#define WM_AMODI (WM_APP+0x400) // app communication message with AMODI
+#define WM_MOVESEND (WM_APP+0x208) // DCH_MOVESEND\82Ì\91ã\82í\82è\82ÉPostMessage\82Å\91\97\82é
+#define AMODI_CMD_QUERY 0
+#define AMODI_CMD_PAGE_CAPTURE 1
+
+#define tsizeof(type) sizeof(type)
+#define int_bool(v) ((v)!=0)
+
+#pragma warning (disable : 4996)
+
+//==============================================//
+// TString template class //
+//==============================================//
+template <class T>
+class TString {
+protected:
+ T *Buffer;
+ int Size; // Buffer size in character
+ int Length; // String length in character
+public:
+ TString();
+ ~TString();
+ void Clear()
+ { Buffer[0] = '\0'; Length = 0; }
+ void Set( const T *str, int len );
+ void Set( TString *obj )
+ { Set( obj->c_str(), obj->Length ); }
+ void Cat( const T *str, int len );
+ operator const T *() const
+ { return Buffer; }
+ T operator [] ( int index )
+ { return Buffer[index]; }
+ const T *c_str()
+ { return Buffer; }
+ int GetLength() const { return Length; }
+ int GetByte() const { return Length * sizeof(T); }
+// int GetSize() const { return Size; }
+};
+template <class T>
+TString<T>::TString()
+{
+ Size = 256; // initial size
+ Buffer = new T[ Size + 1 ];
+ if (!Buffer)
+ Size = 0;
+ Length = 0;
+}
+template <class T>
+TString<T>::~TString()
+{
+ if (Buffer)
+ delete[] Buffer;
+}
+template <class T>
+void TString<T>::Set( const T *str, int len )
+{
+ if (Buffer){
+ if ( Size < len ){
+ // not enough space to store
+ delete[] Buffer;
+ } else goto j1;
+ }
+ Buffer = new T[ len + 1 ];
+ Size = len;
+ if (Buffer){
+j1:;
+ CopyMemory( Buffer, str, len*sizeof(T) );
+ Buffer[len] = '\0';
+ Length = len;
+ } else {
+ Size = 0;
+ Length = 0;
+ }
+}
+template <class T>
+void TString<T>::Cat( const T *str, int len )
+{
+ if (!Buffer){
+ Set( str, len );
+ return;
+ }
+ int newlen = Length + len;
+ if (Size < newlen){
+ T *p = new T[ newlen + 1 ];
+ if (p)
+ CopyMemory( p, Buffer, newlen*sizeof(T) );
+ delete[] Buffer;
+ Buffer = p;
+ Size = newlen;
+ }
+ if (Buffer){
+ CopyMemory( Buffer+Length, str, len * sizeof(T) );
+ Buffer[newlen] = '\0';
+ Length = newlen;
+ } else {
+ Size = 0;
+ Length = 0;
+ Set( str, len );
+ }
+}
+
+int GetTextFromPoint( HDC hdc, const char *text, int len, int pos, int pos_y, const int *dx=NULL );
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int len, int pos, int pos_y, const int *dx=NULL );
+
+bool CaptureImage(HWND hwnd, bool movesend, bool non_block);
+bool WaitAndGetResult(const TCHAR *text_path, unsigned waittime);
+HANDLE WaitForResult(const TCHAR *text_path, unsigned waittime);
+HWND FindAMODI();
+int SendAMODI(int cmd, const char *data, int len);
+void CheckAMODIAlive();
+void SendMoveMessage();
+void SendCancelMove();
+DWORD WINAPI SendMoveThread(LPVOID vdParam);
+void CheckWOW64();
+
+extern "C" {
+//==============================================//
+// Prototypes //
+//==============================================//
+typedef HDC (WINAPI *FNBeginPaint)( HWND, LPPAINTSTRUCT );
+typedef BOOL (WINAPI *FNEndPaint)( HWND, CONST PAINTSTRUCT * );
+typedef HDC (WINAPI *FNGetDC)( HWND );
+typedef int (WINAPI *FNReleaseDC)( HWND, HDC );
+typedef BOOL (WINAPI *FNExtTextOutW)(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx );
+typedef BOOL (WINAPI *FNExtTextOutA)(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+typedef BOOL (WINAPI *FNBitBlt)(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop );
+
+typedef LONG (WINAPI *FNTabbedTextOutA)( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin );
+typedef LONG (WINAPI *FNTabbedTextOutW)( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin );
+typedef BOOL (WINAPI *FNTextOutA)( HDC hdc, int x, int y, LPCSTR str, int count );
+typedef BOOL (WINAPI *FNTextOutW)( HDC hdc, int x, int y, LPCWSTR str, int count );
+typedef int (WINAPI *FNDrawTextA)( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format );
+typedef int (WINAPI *FNDrawTextW)( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format );
+typedef int (WINAPI *FNDrawTextExA)( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+typedef int (WINAPI *FNDrawTextExW)( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+
+typedef BOOL (WINAPI *FNMoveToEx)(HDC hdc, int x, int y, LPPOINT pt );
+
+
+HDC WINAPI _BeginPaint( HWND hwnd, LPPAINTSTRUCT ps );
+BOOL WINAPI _EndPaint( HWND hwnd, CONST PAINTSTRUCT *ps );
+HDC WINAPI _GetDC( HWND hwnd );
+int WINAPI _ReleaseDC( HWND hwnd, HDC hdc );
+BOOL WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+BOOL WINAPI _ExtTextOutW(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx );
+BOOL WINAPI _BitBlt(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop );
+
+LONG WINAPI _TabbedTextOutA( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin );
+LONG WINAPI _TabbedTextOutW( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin );
+BOOL WINAPI _TextOutA( HDC hdc, int x, int y, LPCSTR str, int count );
+BOOL WINAPI _TextOutW( HDC hdc, int x, int y, LPCWSTR str, int count );
+int WINAPI _DrawTextA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format );
+int WINAPI _DrawTextW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format );
+int WINAPI _DrawTextExA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+int WINAPI _DrawTextExW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+
+BOOL WINAPI _MoveToEx( HDC hdc, int x, int y, LPPOINT pt );
+
+void ShareProtect( bool f );
+DWORD SetWriteProtect( LPVOID addr, bool f );
+bool ChangeMemory( void *dst, const void *src, unsigned size );
+bool LoadVxD();
+void UnloadVxD();
+
+static HMODULE ModuleFromAddress(PVOID pv);
+
+// Prototypes for PSAPI.DLL //
+typedef BOOL (WINAPI *FNEnumProcessModules)( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );
+typedef DWORD (WINAPI *FNGetModuleFileNameExA)( HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize );
+typedef HANDLE (WINAPI *FNCreateToolhelp32Snapshot)( DWORD dwFlags, DWORD th32ProcessID );
+typedef BOOL (WINAPI *FNModule32First)( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
+typedef BOOL (WINAPI *FNModule32Next)( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
+
+
+LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam );
+LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam );
+bool CaptureText( HWND hwnd, bool movesend );
+bool DoCapture(HWND hwnd, POINT pt, bool movesend, bool image_only=false, bool runOnLaunchedProc=false, bool nonBlock=false);
+void DokoPopMenu( HWND hwnd );
+void ToggleClick( HWND hwnd );
+int CALLBACK EnumMetaFileProc( HDC hdc, HANDLETABLE *, CONST ENHMETARECORD *mfr, int nobj, LPARAM user );
+
+//__declspec(dllexport)
+BOOL WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+
+#if METAEXTTEXTOUT
+void ExtTextOutHit();
+#endif
+
+void DoScale(HDC hdc, POINT *pts, int num);
+
+// Prototypes for High DPI //
+typedef enum _PROCESS_DPI_AWARENESS {
+ Process_DPI_Unaware = 0,
+ Process_System_DPI_Aware = 1,
+ Process_Per_Monitor_DPI_Aware = 2
+} PROCESS_DPI_AWARENESS;
+
+typedef HRESULT (WINAPI *FNGetProcessDPIAwareness)(HANDLE hprocess, PROCESS_DPI_AWARENESS *value);
+typedef HRESULT (WINAPI *FNSetProcessDPIAwareness)(PROCESS_DPI_AWARENESS value);
+
+//==============================================//
+// Shared Section //
+//==============================================//
+#pragma data_seg(".sdata")
+#pragma bss_seg( ".sbss" )
+HWND hwndCallback = NULL;
+#if USE_VXD
+char VxDpathName[256]; // HK95.vxd path
+#endif
+DWORD siPageSize = 0;
+HWND hwndOrg = NULL;
+HWND hwndAMODI = NULL;
+bool OnlyAMODI = false;
+bool tryAMODI = false;
+bool MoveSend = false;
+#if USE_DBW
+int attach = 0;
+#endif
+#if USE_VXD
+bool WindowsNT;
+#else
+const bool WindowsNT = true;
+#endif
+bool Initialized = false; // Whether this module initialized or not
+DWORD idDokopopProcess; // DKPP.EXE process ID
+HHOOK hMouseHook; // Windows Hook Handle for mouse
+bool ClickOnlyEnabled = false;
+
+struct TKeyConfig {
+ unsigned char Action;
+ int Flag;
+};
+
+TKeyConfig KeyConfig[MAX_KEYS] = {
+ { KA_POPUP, KF_CONTROL }, // Ctrl+click
+ { KA_POPUP_NC, KF_CLICKONLY }, // click\82¾\82¯\82Åpopup(DO NOT CHANGE)
+// { KA_MENU, KF_CONTROL | KF_MENU }, // dokopop menu
+// { KA_MENU, KF_CONTROL | KF_MENU | KF_CLICKONLY }, // dokopop menu
+ { KA_TOGGLE, KF_CONTROL | KF_MENU }, // dokopop menu
+ { 0, 0 }
+};
+
+bool fWow64 = false;
+
+POINT CursorPoint; // Client area coordinate //
+POINT ScreenPoint; // Screen coordinate //
+POINT PrevCursorPoint;
+HWND hwndLast = NULL;
+DWORD PrevMoveTime = 0;
+bool MoveSent = true;
+bool OnlyImage = false;
+
+bool MouseMoving;
+
+RECT rcClient;
+RECT rcInvalid;
+RECT rcOrgInvalid; // \8dÄ\95`\89æ\91O\82Éinvalid\82¾\82Á\82½\97Ì\88æ
+bool HitFound;
+bool RButtonUpCancel = false; // \8e\9f\82ÌRButtonUp\82Í\94j\8aü\82·\82é
+bool LButtonUpCancel = false; // \8e\9f\82ÌLButtonUp\82Í\94j\8aü\82·\82é
+bool MButtonUpCancel = false; // \8e\9f\82ÌMButtonUp\82Í\94j\8aü\82·\82é
+bool LButtonDown = false;
+bool MButtonDown = false;
+
+HINSTANCE hPSAPI; // handle of PSAPI.DLL(NT only)
+FNEnumProcessModules fnEnumProcessModules;
+FNGetModuleFileNameExA fnGetModuleFileNameExA;
+FNCreateToolhelp32Snapshot fnCreateToolhelp32Snapshot;
+FNModule32First fnModule32First;
+FNModule32Next fnModule32Next;
+
+#if USE_META || RETRYMETA
+HDC OrgHDC;
+HDC hdcMeta;
+#endif
+HDC hdcExtTextOut;
+#if HOOK_GETDC
+HDC OrgGetDC;
+#endif
+
+int BitBltCount; // \8c»\8dÝ\82ÌBitBlt\89ñ\90\94
+int ExtTextOutCount; // \8c»\8dÝ\82ÌBand\93à\82ÌExtTextOut\89ñ\90\94(A/W\82Æ\82à)
+int TargetBitBltCount; // \8c\9f\8d¸\91Î\8fÛ\82ÌBitBlt(\8f\89\89ñ\95`\89æ\8cã\82É\94»\92è)
+POINT TargetOffset; // \8c\9f\8d¸\91Î\8fÛ\82ÌBitBlt\82Ì\95`\89æ\83I\83t\83Z\83b\83g(\8f\89\89ñ\95`\89æ\8cã\82É\94»\92è)
+bool RetryPhase;
+
+#if METAEXTTEXTOUT
+// hit text information
+TString<char> *FoundTextA;
+TString<wchar_t> *FoundTextW;
+int FoundLocA;
+int FoundLocW;
+
+// \8dÅ\8cã\82É\95`\89æ\82µ\82½\83e\83L\83X\83g\82Ì\8fî\95ñ
+// for text merge
+int LastX; // \8dÅ\8cã\82É\95`\89æ\82µ\82½\83e\83L\83X\83g\82Ì\89E\8fã\8dÀ\95W
+int LastY;
+TString<char> *LastTextA;
+TString<wchar_t> *LastTextW;
+#endif // METAEXTTEXTOUT
+
+bool MoveSendMode;
+
+TCHAR AMODIPath[256];
+bool ExtAMODI = false;
+int ScaleX = 0; // 96\82ð1\82Æ\82µ\82½\89æ\96Ê\82Ì\8ag\91å\97¦
+int ScaleY = 0;
+int generation = 0;
+
+TCHAR ImageTextPath[256+40]; // OCR\97pimage filename or text filename
+DWORD SaveImageTime;
+bool CaptureImageBlocking = false;
+
+const char STR_USER32[] = "user32.dll";
+const char STR_GDI32[] = "gdi32.dll";
+const char STR_KERNEL32[] = "kernel32.dll";
+const TCHAR STR_PSAPI[] = _T("psapi.dll");
+
+// KERNEL32.DLL //
+const char STR_CreateToolhelp32Snapshot[] = "CreateToolhelp32Snapshot";
+const char STR_Module32First[] = "Module32First";
+const char STR_Module32Next[] = "Module32Next";
+
+// PSAPI.DLL //
+const char STR_EnumProcessModules[] = "EnumProcessModules";
+const char STR_GetModuleFileNameExA[] = "GetModuleFileNameExA";
+
+const char STR_BeginPaint[] = "BeginPaint";
+const char STR_EndPaint[] = "EndPaint";
+const char STR_BitBlt[] = "BitBlt";
+const char STR_GetDC[] = "GetDC";
+const char STR_ReleaseDC[] = "ReleaseDC";
+
+const char STR_ExtTextOutA[] = "ExtTextOutA";
+const char STR_ExtTextOutW[] = "ExtTextOutW";
+const char STR_TabbedTextOutA[] = "TabbedTextOutA";
+const char STR_TabbedTextOutW[] = "TabbedTextOutW";
+const char STR_TextOutA[] = "TextOutA";
+const char STR_TextOutW[] = "TextOutW";
+const char STR_DrawTextA[] = "DrawTextA";
+const char STR_DrawTextW[] = "DrawTextW";
+const char STR_DrawTextExA[] = "DrawTextExA";
+const char STR_DrawTextExW[] = "DrawTextExW";
+
+#if USE_SHARE0
+#pragma data_seg()
+#pragma bss_seg()
+#endif
+
+//==============================================//
+// Module depend values //
+//==============================================//
+HINSTANCE hInstance; // attached instance
+DWORD idProcess; // attached process
+HANDLE hProcess; // Hook\8e\9eGetCurrentProcess()\82Í\8eg\82¦\82È\82¢
+ // Hook\8e\9e\82Ìcurrent process\82ª\8f\91\82«\8a·\82¦\82½\82¢thunk\82Ìprocess\82Æ\88ê\92v\82·\82é\82Æ\82Í\8cÀ\82ç\82È\82¢\82½\82ß
+ // \82»\82Ì\82½\82ß\81ADLL\82Ìattach\8e\9e\82ÉWriteProcessMemory()\97p\82Éprocess handle\82ð\8eæ\93¾\82·\82é
+DWORD curProcess; // hooking process
+#if USE_VXD
+HANDLE vxd_Handle = INVALID_HANDLE_VALUE; // Not shared
+#endif
+
+#if !MOVESEND_POST
+HANDLE SendMoveEvent = NULL;
+DWORD SendMoveThreadId;
+#endif
+
+HINSTANCE hInstSHCore = NULL;
+FNGetProcessDPIAwareness GetProcessDPIAwareness = NULL;
+
+//==============================================//
+// APIHOOK //
+//==============================================//
+class APIHOOK {
+public:
+ const char *ModName;
+ const char *FuncName;
+protected:
+ bool ExcludeMe;
+ bool Hooked;
+public:
+ PROC OrgFunc; // not shared@NT
+protected:
+ PROC HookFunc; // not shared
+ // Process dedicated values //
+public:
+ static void *MaxAppAddr; // Maximum private memory address
+protected:
+ static APIHOOK *LinkTop; // top of APIHOOK link
+ APIHOOK *LinkNext; // next pointer of API HOOK link
+public:
+ APIHOOK( const char *modname, const char *name, void *hookfunc, bool excme = true );
+ ~APIHOOK();
+ bool GetProcOrgFunc( HINSTANCE hInst );
+ bool GetProcOrgFunc();
+ bool HookAgain();
+ void Finish();
+protected:
+ bool StoreCode( );
+ void RestoreCode( );
+protected:
+ static void ReplaceIATEntryInAllMods( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew );
+ static bool ReplaceIATEntryInOneMod( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
+};
+
+const BYTE cPushOpCode = 0x68; // The PUSH opcode on x86 platforms
+APIHOOK* APIHOOK::LinkTop = NULL;
+PVOID APIHOOK::MaxAppAddr = NULL;
+
+APIHOOK::APIHOOK( const char *modname, const char *funcname, void *hookfunc, bool excme )
+{
+// DBW("APIHOOK constructor:%08X %s %s",this, modname, funcname);
+ Hooked = false;
+ ModName = modname;
+ FuncName = funcname;
+ HookFunc = (PROC)hookfunc;
+ ExcludeMe = excme;
+ LinkNext = LinkTop;
+ LinkTop = this;
+ if (!MaxAppAddr){
+ // Functions with address above lpMaximumApplicationAddress require
+ // special processing (Windows 98 only)
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ MaxAppAddr = si.lpMaximumApplicationAddress;
+ }
+}
+
+APIHOOK::~APIHOOK()
+{
+ Finish();
+ // Remove this object from the linked list
+ APIHOOK* p = LinkTop;
+ if (p == this) { // Removing the head node
+ LinkTop = p->LinkNext;
+ } else {
+ // Walk list from head and fix pointers
+ for (; p->LinkNext; p = p->LinkNext){
+ if (p->LinkNext == this) {
+ // Make the node that points to us point to the our next node
+ p->LinkNext = p->LinkNext->LinkNext;
+ break;
+ }
+ }
+ }
+}
+bool APIHOOK::GetProcOrgFunc()
+{
+ return GetProcOrgFunc( GetModuleHandleA( ModName ) );
+}
+bool APIHOOK::GetProcOrgFunc( HINSTANCE hInst )
+{
+ if (Hooked) return true;
+
+ // Save information about this hooked function
+ OrgFunc = ::GetProcAddress( hInst, FuncName);
+ if (!OrgFunc){
+ DBW("Function doesn't exist =%s:%s", ModName, FuncName);
+ return false;
+ }
+
+ if (OrgFunc > MaxAppAddr) {
+// DBW("The address is in a shared DLL; the address needs fixing up");
+ PBYTE pb = (PBYTE)OrgFunc;
+ if (pb[0] == cPushOpCode){
+ // Skip over the PUSH op code and grab the real address
+ PVOID pv = * (PVOID*) &pb[1];
+ OrgFunc = (PROC) pv;
+ }
+ }
+
+ // Set assembler code for hooking at the org entry
+ if ( !StoreCode() ){
+ DBW("Cannot write process memory");
+ return false;
+ }
+
+ Hooked = true;
+ return true;
+}
+bool APIHOOK::StoreCode( )
+{
+ DBW("StoreCode:%s %s", ModName, FuncName);
+ // Hook this function in all currently loaded modules
+ ReplaceIATEntryInAllMods( this, OrgFunc, HookFunc );
+ return true;
+}
+void APIHOOK::RestoreCode()
+{
+ DBW("RestoreCode:%s %s", ModName, FuncName);
+ ReplaceIATEntryInAllMods( this, HookFunc, OrgFunc );
+}
+void APIHOOK::ReplaceIATEntryInAllMods( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew )
+{
+ HMODULE hmodThisMod = obj->ExcludeMe
+ ? ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL;
+
+ DWORD cbNeeded;
+ HMODULE hMods[1024];
+ unsigned i;
+ if (fnCreateToolhelp32Snapshot){
+ // Toolhelp\82ª\8eg\97p\82Å\82«\82é\8fê\8d\87\82Í\8eg\97p\82·\82é
+ // Get the list of modules in this process
+ HANDLE hSnapshot = fnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, idProcess);
+
+ MODULEENTRY32 me = { sizeof(me) };
+ for (BOOL fOk = fnModule32First(hSnapshot,&me); fOk; fOk = fnModule32Next(hSnapshot,&me)){
+ // NOTE: We don't hook functions in our own module
+ if (me.hModule != hmodThisMod){
+ // DBW("Module : %s %s", me.szModule,FuncName);
+ // Hook this function in this module
+ ReplaceIATEntryInOneMod( obj, pfnCurrent, pfnNew, me.hModule);
+ }
+ }
+ CloseHandle( hSnapshot );
+ } else {
+ if( fnEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
+ {
+ for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
+ {
+ if (hMods[i] != hmodThisMod){
+ char szModName[MAX_PATH];
+ // Get the full path to the module's file.
+ if ( fnGetModuleFileNameExA( hProcess, hMods[i], szModName,
+ sizeof(szModName))){
+ // DBW("Module : %s %s", szModName, FuncName );
+ ReplaceIATEntryInOneMod( obj, pfnCurrent, pfnNew, hMods[i]);
+ }
+ }
+ }
+ }
+#if USE_DBW
+ else DBW("EnumProcessModules failed");
+#endif
+ }
+}
+
+// This functions is almost taken from Jeffrey Richter's sample, thank you.
+bool APIHOOK::ReplaceIATEntryInOneMod( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
+{
+ if (!hProcess) return false;
+
+ // Get the address of the module's import section
+ ULONG ulSize;
+ PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
+ ImageDirectoryEntryToData(hmodCaller, TRUE,
+ IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
+
+ if (!pImportDesc){
+// DBW("No import section : %s", obj->ModName);
+ return false;
+ }
+
+ // Find the import descriptor containing references to callee's functions
+ for (; pImportDesc->Name; pImportDesc++){
+ PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);
+ if (lstrcmpiA(pszModName, obj->ModName) == 0)
+ break; // Found
+ }
+
+ if (pImportDesc->Name == 0){
+// DBW("This module doesn't import any functions from this callee");
+ return false; // This module doesn't import any functions from this callee
+ }
+
+ // Get caller's import address table (IAT) for the callee's functions
+ PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
+ ((PBYTE) hmodCaller + pImportDesc->FirstThunk);
+
+ // Replace current function address with new function address
+ for (; pThunk->u1.Function; pThunk++){
+ // Get the address of the function address
+ PROC* ppfn = (PROC*) &pThunk->u1.Function;
+ // Is this the function we're looking for?
+ BOOL fFound = (*ppfn == pfnCurrent);
+ if (!fFound && (*ppfn > MaxAppAddr)){
+ // If this is not the function and the address is in a shared DLL,
+ // then maybe we're running under a debugger on Windows 98. In this
+ // case, this address points to an instruction that may have the
+ // correct address.
+ PBYTE pbInFunc = (PBYTE) *ppfn;
+ if (pbInFunc[0] == cPushOpCode){
+ // We see the PUSH instruction, the real function address follows
+ ppfn = (PROC*) &pbInFunc[1];
+
+ // Is this the function we're looking for?
+ fFound = (*ppfn == pfnCurrent);
+ }
+ }
+
+ if (fFound){
+ // The addresses match, change the import section address
+ if (!WriteProcessMemory(hProcess, ppfn, &pfnNew, sizeof(pfnNew), NULL)){
+ if (SetWriteProtect( (LPVOID)ppfn, false )==~0){ // write protection release
+ DBW("SetWriteProtect failed: %08X %s %s", ppfn, obj->ModName, obj->FuncName);
+ return false;
+ }
+#if USE_VXD
+ if (!WindowsNT && IsBadWritePtr(ppfn,sizeof(pfnNew))){
+ // Windows9x shared DLL section
+ // change memory attribte using VxD
+ if (!ChangeMemory( ppfn, &pfnNew, sizeof(pfnNew) )){
+ DBW("ChangeMemory failed");
+ }
+ } else
+#endif
+ {
+ if (!WriteProcessMemory(hProcess, ppfn, &pfnNew, sizeof(pfnNew), NULL)){
+ //SetWriteProtect( ppfn, true ); // restore protection
+ DBW("%08X %08X %08X %08X %s %s", hProcess, ppfn, &pfnNew, sizeof(pfnNew), obj->ModName, obj->FuncName );
+ DBW("WriteProcessMemory failed : %d",GetLastError());
+ return false;
+ }
+ }
+ }
+ return true; // We did it, get out
+ }
+ }
+
+ //DBW("Not found");
+
+ // If we get to here, the function is not in the caller's import section
+ return false;
+}
+bool APIHOOK::HookAgain()
+{
+ if ( Hooked ) return true;
+
+ // Set assembler code for hooking at the org entry
+ if ( !StoreCode() ){
+ DBW("Cannot write process memory@rehook");
+ return false;
+ }
+
+ Hooked = true;
+ return true;
+}
+void APIHOOK::Finish()
+{
+ if ( !Hooked ) return;
+ RestoreCode();
+ Hooked = false;
+}
+// Returns the HMODULE that contains the specified memory address
+static HMODULE ModuleFromAddress(PVOID pv)
+{
+ MEMORY_BASIC_INFORMATION mbi;
+ return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
+ ? (HMODULE) mbi.AllocationBase : NULL);
+}
+
+#if HOOK_PAINT || RETRYMETA
+APIHOOK BeginPaintHook( STR_USER32, STR_BeginPaint, _BeginPaint );
+APIHOOK EndPaintHook( STR_USER32, STR_EndPaint, _EndPaint );
+#endif
+
+#if HOOK_BITBLT
+APIHOOK BitBltHook( STR_GDI32, STR_BitBlt, _BitBlt );
+#endif
+
+#if HOOK_GETDC
+APIHOOK GetDCHook( STR_USER32, STR_GetDC, _GetDC );
+APIHOOK ReleaseDCHook( STR_USER32, STR_ReleaseDC, _ReleaseDC );
+#endif
+
+#if METAEXTTEXTOUT
+APIHOOK ExtTextOutAHook( STR_GDI32, STR_ExtTextOutA, _ExtTextOutA );
+APIHOOK ExtTextOutWHook( STR_GDI32, STR_ExtTextOutW, _ExtTextOutW );
+#if HOOK_TEXT
+APIHOOK TabbedTextOutAHook( STR_USER32, STR_TabbedTextOutA, _TabbedTextOutA );
+APIHOOK TabbedTextOutWHook( STR_USER32, STR_TabbedTextOutW, _TabbedTextOutW );
+APIHOOK TextOutAHook( STR_GDI32, STR_TextOutA, _TextOutA );
+APIHOOK TextOutWHook( STR_GDI32, STR_TextOutW, _TextOutW );
+APIHOOK DrawTextAHook( STR_USER32, STR_DrawTextA, _DrawTextA );
+APIHOOK DrawTextWHook( STR_USER32, STR_DrawTextW, _DrawTextW );
+APIHOOK DrawTextExAHook( STR_USER32, STR_DrawTextExA, _DrawTextExA );
+APIHOOK DrawTextExWHook( STR_USER32, STR_DrawTextExW, _DrawTextExW );
+#endif
+#endif // METAEXTTEXTOUT
+
+__declspec(dllexport)
+bool WINAPI Init( HWND _hwnd, const char * /*module_name*/, bool windowsnt, const char *vxd_path )
+{
+ DBW("Init:%08X %d", _hwnd, windowsnt);
+ hwndCallback = _hwnd;
+ if ( Initialized ){
+ return true;
+ }
+#if USE_VXD
+ WindowsNT = windowsnt;
+ if (vxd_path){
+// DBW("vxd_path=%s",vxd_path);
+ lstrcpy( VxDpathName, "\\\\.\\" );
+ lstrcat( VxDpathName, vxd_path );
+ if (!LoadVxD()){
+ DBW("Cannot open VxD:%s:%d", VxDpathName,GetLastError() );
+ return false;
+ }
+ }
+#endif
+
+// HINSTANCE hDll = GetModuleHandle( module_name );
+ hMouseHook = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)MouseProc, hInstance, NULL );
+ if (!hMouseHook){
+ DBW("SetWindowsHookEx error: %d", GetLastError());
+ return false;
+ }
+
+// hKeyHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyboardProc, hDll, NULL );
+
+ Initialized = true;
+
+#if GUARD
+ PROTECT_SHARE();
+ DBW("%08X(%08X) Protected", (((INT_PTR)&ExtTextOutAHook) / siPageSize) * siPageSize,&ExtTextOutAHook);
+#endif
+
+ idDokopopProcess = GetCurrentProcessId();
+
+ // get AMODI infomation.
+ if (!tryAMODI){
+ tryAMODI = true;
+ hwndAMODI = FindAMODI();
+#if 0
+ if (hwndAMODI){
+ DWORD procId;
+ if (GetWindowThreadProcessId(hwnd, &procId)){
+ HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, procId);
+ if (hProc){
+ memset(AMODIPath, 0, sizeof(AMODIPath));
+ if (GetModuleFileNameEx(hProc, NULL, AMODIPath, sizeof(AMODIPath))>0){
+ // OK
+ }
+ CloseHandle(hProc);
+ }
+ }
+ }
+#endif
+ }
+
+ return true;
+}
+
+__declspec(dllexport)
+void WINAPI Uninit()
+{
+ UNPROTECT_SHARE();
+ if ( !Initialized ) return;
+
+ DBW("Uninit");
+ UnhookWindowsHookEx( hMouseHook );
+
+// UnhookWindowsHookEx( hKeyHook );
+
+#if USE_VXD
+ UnloadVxD();
+#endif
+
+ Initialized = false;
+}
+__declspec(dllexport)
+int WINAPI Config( int clickonly, int keyaction, int keyflag )
+{
+ DBW("Config:%d %d %d", clickonly, keyaction, keyflag);
+ if (clickonly!=-1)
+ ClickOnlyEnabled = int_bool(clickonly);
+ if ( keyflag != 0 ){
+ for ( int i=0;KeyConfig[i].Action;i++ ){
+ if (KeyConfig[i].Action == keyaction){
+ KeyConfig[i].Flag = keyflag;
+ break;
+ }
+ }
+ }
+ return 0;
+}
+__declspec(dllexport)
+int WINAPI Config2( const struct TDCHConfig *cfg )
+{
+ DBW("Config2: %d %d", cfg->ScaleX, cfg->ScaleY);
+
+ MoveSend = cfg->MoveSend ? true : false;
+ MoveSent = false;
+ OnlyImage = cfg->OnlyImage;
+ ScaleX = cfg->ScaleX;
+ ScaleY = cfg->ScaleY;
+
+ if (cfg->UseAMODI){
+ if (!ExtAMODI){
+ if (!hwndAMODI)
+ hwndAMODI = FindAMODI();
+ }
+ } else {
+ hwndAMODI = NULL;
+ ExtAMODI = false;
+ return 0;
+ }
+
+ OnlyAMODI = int_bool(cfg->OnlyAMODI);
+ AMODIPath[0] = '\0';
+ ExtAMODI = false;
+ if (cfg->AMODIPath[0]){
+ size_t len = strlen(cfg->AMODIPath);
+ if (len<sizeof(AMODIPath)-2){
+ memcpy(AMODIPath, cfg->AMODIPath, len);
+ if (AMODIPath[len-1]!='\\'){
+ AMODIPath[len] = '\\';
+ len++;
+ }
+ AMODIPath[len] = '\0';
+ ExtAMODI = true;
+ }
+ }
+ dbw("Config2[%d]: %d %d %s", ++generation, cfg->ScaleX, cfg->ScaleY, AMODIPath);
+ return 0;
+}
+//Note:
+// non_block = true\82Ì\8fê\8d\87
+// \81Ewait\8fó\91Ô\82É\82 \82é\82©\82Ç\82¤\82©\82Í\81AWaitForCaptureResult( false, 0 ) < 0 \82Å\82í\82©\82é\81B
+// \81E\95K\82¸\8dÅ\8cã\82É\82ÍWaitForCaptureResult(1,...)\82ð\8cÄ\82Ñ\8fo\82·\82±\82Æ\81B
+__declspec(dllexport)
+int WINAPI Capture( HWND hwnd, POINT *ppt, bool movesend, bool non_block )
+{
+ DBW("Capture:%08X %d,%d %d %d", hwnd, ppt ? ppt->x : 0, ppt ? ppt->y : 0, movesend, non_block);
+ if (!hwnd)
+ hwnd = hwndLast;
+ POINT pt;
+ if (ppt)
+ pt = *ppt;
+ else
+ pt = PrevCursorPoint;
+ const bool image_only = true;
+ const bool runOnLaunchedProc = false;
+ return int_bool(DoCapture(hwnd, pt, movesend, image_only, runOnLaunchedProc, non_block));
+}
+//Note:
+// waittime\82ÍCapture()\8aJ\8en\82µ\82Ä\82©\82ç\82Ì\8co\89ß\8e\9e\8aÔ
+// polling\82·\82é\8fê\8d\87\82Íwaittime\82ð\8f\82µ\82¸\82Â\91\9d\82â\82·\95K\97v\82 \82è(\82»\82Ì\8fê\8d\87\82Ísend_text=0)
+// CaptureImage\82ð\8ds\82Á\82½\8fê\8d\87\82Í\81A\81u\95K\82¸\81vWaitForCaptureResult( 1, ... )\82ð\8cÄ\82Ñ\8fo\82·\95K\97v\82ª\82 \82é\81B
+// \82»\82¤\82µ\82È\82¢\82Æ\81ACaptureImageBlocking\82ª true \82É\82È\82Á\82½\82Ü\82Ü\81B
+//
+// return:
+// 0 : wait\92\86\82Ì\82à\82Ì\82Í\82È\82µ
+// 1 : OK(text ready)
+// -1: timeout
+__declspec(dllexport)
+int WINAPI WaitForCaptureResult( bool send_text, unsigned waittime )
+{
+ DBW("WaitForCaptureResult: %d %d %d", send_text, waittime, CaptureImageBlocking);
+ if (!CaptureImageBlocking) return 0;
+
+ if (send_text){
+ if (WaitAndGetResult(ImageTextPath, waittime)){
+ return 1;
+ }
+ } else {
+ HANDLE hf = WaitForResult(ImageTextPath, waittime);
+ if (hf){
+ CloseHandle(hf);
+ return 1;
+ }
+ }
+ return -1;
+}
+#if GUARD
+void ShareProtect( bool f )
+{
+ LPVOID BaseAddress = (LPVOID)((((INT_PTR)&ExtTextOutAHook) / siPageSize) * siPageSize);
+
+ DWORD OldProtect;
+ if ( !VirtualProtect( BaseAddress, siPageSize, f ? PAGE_READONLY : PAGE_READWRITE, &OldProtect ) ){
+ DBW("Cannot change protect:%08X@rehook",BaseAddress);
+ }
+}
+#endif
+DWORD SetWriteProtect( LPVOID addr, bool f )
+{
+ LPVOID BaseAddress = (LPVOID)((((INT_PTR)addr) / siPageSize) * siPageSize);
+
+ DWORD OldProtect;
+ if ( !VirtualProtect( BaseAddress, siPageSize, f ? PAGE_READONLY : PAGE_READWRITE, &OldProtect ) ){
+ DBW("Cannot change protect:%08X-%08X@rehook %d", (INT_PTR)BaseAddress>>32, BaseAddress, GetLastError());
+ return ~0;
+ }
+ return OldProtect;
+}
+#if USE_VXD
+// change write protected memory for Windows9x
+bool ChangeMemory( void *dst, const void *src, unsigned size )
+{
+ DWORD DIOC_count;
+ if ( vxd_Handle == INVALID_HANDLE_VALUE ){
+ if (!LoadVxD())
+ return false;
+ }
+
+ bool r = int_bool(DeviceIoControl( vxd_Handle, DIOC_CHANGE_MEMORY, (void*)src, size, dst, 0, &DIOC_count, NULL));
+#if USE_DBW
+ if ( !r ){
+ DBW("DeviceIoControl failed");
+ }
+#endif
+ return r;
+}
+bool LoadVxD()
+{
+ if (vxd_Handle!=INVALID_HANDLE_VALUE){
+ DBW("Already loaded VxD");
+ return true;
+ }
+ vxd_Handle=CreateFile(&VxDpathName[0],0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
+ return vxd_Handle != INVALID_HANDLE_VALUE;
+}
+void UnloadVxD()
+{
+ if (vxd_Handle == INVALID_HANDLE_VALUE)
+ return;
+ CloseHandle(vxd_Handle);
+ vxd_Handle = INVALID_HANDLE_VALUE;
+}
+#endif
+int GetKeyFlag( )
+{
+ int r = 0;
+ if ( GetKeyState( VK_SHIFT ) & 0x8000 ) r |= KF_SHIFT;
+ if ( GetKeyState( VK_CONTROL ) & 0x8000 ) r |= KF_CONTROL;
+ if ( GetKeyState( VK_MENU ) & 0x8000 ) r |= KF_MENU;
+ if ( GetKeyState( VK_LWIN ) & 0x8000 ) r |= KF_LWIN;
+ if ( GetKeyState( VK_RWIN ) & 0x8000 ) r |= KF_RWIN;
+ if ( ClickOnlyEnabled && r == 0 ) r = KF_CLICKONLY;
+// if ( GetKeyState( VK_APPS ) & 0x8000 ) r |= KF_APPS;
+ return r;
+}
+LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam )
+{
+ if ( code < 0 || code != HC_ACTION )
+ return CallNextHookEx( hMouseHook, code, wParam, lParam );
+
+ MOUSEHOOKSTRUCT *mhs;
+ HWND hwnd;
+ int kf;
+ int i;
+
+#if 0
+ if (wParam!=0x200 && wParam!=0xA0)
+ dbw("WParam:%08X", wParam);
+#endif
+
+ curProcess = GetCurrentProcessId();
+ bool runOnLaunchedProc = false;
+
+ switch ( wParam ){
+ case WM_LBUTTONDOWN:
+ // case WM_NCLBUTTONDOWN:
+ LButtonDown = true;
+ LButtonUpCancel = false;
+// if (LButtonUpCancel)
+// goto j_end;
+ kf = KF_LEFTCLICK;
+ goto j_rbuttondown;
+ case WM_MBUTTONDOWN:
+ // case WM_NCMBUTTONDOWN:
+ MButtonDown = true;
+ MButtonUpCancel = false;
+// if (MButtonUpCancel)
+// goto j_end;
+ kf = KF_MIDCLICK;
+ goto j_rbuttondown;
+ case WM_RBUTTONDOWN:
+ // case WM_NCRBUTTONDOWN:
+ DBW("RButtonDown");
+ RButtonUpCancel = false;
+// if (RButtonUpCancel)
+// goto j_end;
+ kf = 0;
+ if (LButtonDown){
+ kf = KF_LRCLICK;
+ }
+ j_rbuttondown:;
+ mhs = (MOUSEHOOKSTRUCT*)lParam;
+ hwnd = WindowFromPoint( mhs->pt );
+ //hwnd = mhs->hwnd;
+#if 0
+ HWND h = GetParent( hwnd );
+ if ( h )
+ hwnd = h;
+#endif
+ kf |= GetKeyFlag();
+
+#if 0
+ dbw("kf=%02X", kf);
+#endif
+
+ if (curProcess == idDokopopProcess){
+ // runs on launched process -> ignored.
+ DBW("Runs on launched proc(%d)", curProcess);
+ runOnLaunchedProc = true;
+ }
+
+ for ( i=0;KeyConfig[i].Action;i++ ){
+ //DBW("%d:%d %x", i, KeyConfig[i].Action, KeyConfig[i].Flag);
+ if ( kf == KeyConfig[i].Flag ){
+ switch ( KeyConfig[i].Action ){
+ case KA_POPUP:
+ case KA_POPUP_NC:
+ {
+ const bool move_send = false;
+ if (DoCapture(hwnd, mhs->pt, move_send, OnlyImage, runOnLaunchedProc)){
+j_discard:
+ if (wParam == WM_LBUTTONDOWN)
+ LButtonUpCancel = true;
+ if (wParam == WM_MBUTTONDOWN)
+ MButtonUpCancel = true;
+ else
+ RButtonUpCancel = true;
+ return 1; // discard this message
+ }
+ }
+ break;
+ case KA_MENU:
+ DokoPopMenu( hwnd );
+ goto j_discard;
+ case KA_TOGGLE:
+ DBW("KA_TOGGLE");
+ ToggleClick( hwnd );
+ goto j_discard;
+ }
+ }
+ }
+ break;
+ case WM_RBUTTONUP:
+ DBW("WM_RBUTTONUP:%d",RButtonUpCancel);
+ if ( RButtonUpCancel ){
+ RButtonUpCancel = false;
+ return 1; // no longer process the message
+ }
+ break;
+ case WM_LBUTTONUP:
+ LButtonDown = false;
+ if ( LButtonUpCancel ){
+ LButtonUpCancel = false;
+ return 1; // no longer process the message
+ }
+ break;
+ case WM_MBUTTONUP:
+ MButtonDown = false;
+ if ( MButtonUpCancel ){
+ MButtonUpCancel = false;
+ return 1; // no longer process the message
+ }
+ break;
+ case WM_MOUSEMOVE:
+ if (MoveSend){
+ mhs = (MOUSEHOOKSTRUCT*)lParam;
+ hwnd = WindowFromPoint( mhs->pt );
+ if (PrevCursorPoint.x!=mhs->pt.x || PrevCursorPoint.y!=mhs->pt.y){
+ PrevMoveTime = GetTickCount();
+ MoveSent = false;
+ PrevCursorPoint = mhs->pt;
+ hwndLast = hwnd;
+ //DBW("Moving:%d %d", mhs->pt.x, mhs->pt.y);
+ SendMoveMessage();
+#if 0
+ //TODO: 5pixel\96¢\96\9e\82Å\82 \82ê\82ÎDoCapture\82·\82é
+#endif
+ } else {
+ if (!MoveSent){
+#if 0 // 2014.11.18 inc.srch\82Å\97\8e\82¿\82é\82Ì\82Å\82Æ\82è\82 \82¦\82¸comment out
+ const int MOVE_SEND_INTERVAL = 50; // msec
+ if (GetTickCount()-PrevMoveTime > MOVE_SEND_INTERVAL){
+ MoveSent = true;
+ if (DoCapture(hwndLast, PrevCursorPoint, true)){
+ // stop the capture from the main.
+ SendCancelMove();
+ }
+ }
+#endif
+ }
+ }
+ }
+ break;
+ }
+
+//j_end:;
+ return CallNextHookEx( hMouseHook, code, wParam, lParam );
+}
+
+bool DoCapture(HWND hwnd, POINT pt, bool movesend, bool image_only, bool runOnLaunchedProc, bool non_block)
+{
+ CursorPoint = ScreenPoint = pt;
+ ScreenToClient( hwnd, &CursorPoint );
+
+ if (!image_only && !runOnLaunchedProc){
+ //DBW("hwnd:%08X %d %d", (int)hwnd, CursorPoint.x, CursorPoint.y);
+ if ((!hwndAMODI && !ExtAMODI) || !OnlyAMODI){
+ // Redraw Metafile //
+ UNPROTECT_SHARE();
+ DBW("Target : %08X %d", hwnd, curProcess);
+ bool r = CaptureText( hwnd, movesend );
+ PROTECT_SHARE();
+ if (r){
+ return true; // discard this message
+ }
+ }
+ }
+ if (image_only || hwndAMODI || ExtAMODI){
+ if (CaptureImage(hwnd, movesend, non_block))
+ return true;
+ }
+ return false;
+}
+
+void CallbackMain(int msg, const void *data, int len, HWND wparam=0)
+{
+ COPYDATASTRUCT cds;
+ cds.dwData = msg;
+ cds.cbData = len;
+ cds.lpData = (LPSTR)data;
+ SendMessage( hwndCallback, WM_COPYDATA, (WPARAM)wparam, (LPARAM)&cds );
+}
+
+void DokoPopMenu( HWND hwnd )
+{
+ CallbackMain(DCH_MENU, NULL, 0, hwnd);
+}
+void ToggleClick( HWND hwnd )
+{
+ CallbackMain(DCH_TOGGLE, NULL, 0, hwnd);
+}
+#if 0
+LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
+{
+ if ( code < 0 || code != HC_ACTION )
+ return CallNextHookEx( hKeyHook, code, wParam, lParam );
+
+ if ( wParam == VK_CONTROL ){
+ if ( lParam & (KF_UP<<16) ){
+ // control key up
+ // -> hold on time
+ goto j1;
+ } else
+ if ( !(lParam & (KF_REPEAT<<16)) ){
+ // control key down and not repeat
+// DBW("wparam=%08X lparam=%08X",wParam,lParam);
+ long nowt = GetTickCount();
+ if ( nowt - LastTypeTime < GetDoubleClickTime() ){
+// DBW("On/off!");
+ ClickOnlyEnabled = !ClickOnlyEnabled;
+ MessageBeep( MB_OK );
+ // -> cancel time
+ } else {
+ // -> hold on time
+ LastTypeTime = nowt;
+ goto j1;
+ }
+ } else {
+ // control key down and repeat
+ // -> cancel time
+ }
+ }
+ LastTypeTime -= 10000;
+j1:;
+ return CallNextHookEx( hMouseHook, code, wParam, lParam );
+}
+#endif
+
+//__declspec(dllexport)
+#if HOOK_PAINT || RETRYMETA
+HDC WINAPI _BeginPaint( HWND hwnd, LPPAINTSTRUCT ps )
+{
+// DBW("BeginPaint");
+ HDC hdc = ((FNBeginPaint)BeginPaintHook.OrgFunc)( hwnd, ps );
+ OrgHDC = hdc;
+ ps->hdc = hdcMeta;
+#if 1
+ ps->rcPaint.left = 0;
+ ps->rcPaint.top = 0;
+ ps->rcPaint.right = rcInvalid.right;
+ ps->rcPaint.bottom = rcInvalid.bottom;
+#endif
+ return hdcMeta;
+}
+//__declspec(dllexport)
+BOOL WINAPI _EndPaint( HWND hwnd, CONST PAINTSTRUCT *ps )
+{
+ ((PAINTSTRUCT*)ps)->hdc = OrgHDC;
+ return ((FNEndPaint)EndPaintHook.OrgFunc)( hwnd, ps );
+}
+#endif
+#if HOOK_GETDC
+HDC WINAPI _GetDC( HWND hwnd )
+{
+ DBW("GetDC");
+ HDC hdc = ((FNGetDC)GetDCHook.OrgFunc)( hwnd );
+ OrgHDC = hdc;
+ if ( hwnd == hwndOrg ){
+ return hdcMeta;
+ } else {
+ return OrgHDC;
+ }
+}
+int WINAPI _ReleaseDC( HWND hwnd, HDC hdc )
+{
+ DBW("ReleaseDC");
+ if ( hdc == hdcMeta ){
+ hdc = OrgHDC;
+ }
+ int r = ((FNReleaseDC)ReleaseDCHook.OrgFunc)( hwnd, hdc );
+ return r;
+}
+#endif
+
+#if METAEXTTEXTOUT
+//__declspec(dllexport)
+BOOL WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx )
+{
+ DBW("_ExtTextOutA");
+ POINT pt;
+ GetCurrentPositionEx(hdc,&pt);
+
+ BOOL r = ((FNExtTextOutA)ExtTextOutAHook.OrgFunc)( hdc, x, y, option, rc, str, count, dx );
+
+ hdcExtTextOut = hdc;
+
+ if ( r
+#if USE_META
+ && hdcMeta != hdc
+#endif
+ && count > 0 ){
+ RECT _rc;
+ if ( rc ){
+ _rc.right = rc->right;
+ _rc.bottom = rc->bottom;
+ } else {
+ _rc.right = rcClient.right;
+ _rc.bottom = rcClient.bottom;
+ }
+ if ( GetTextAlign( hdc ) & TA_UPDATECP ){
+ _rc.left = pt.x;
+ _rc.top = pt.y;
+ } else {
+ _rc.left = x;
+ _rc.top = y;
+ }
+ if ( RetryPhase ){
+ if ( TargetBitBltCount == BitBltCount ){
+ _rc.right += CursorPoint.x; //*+++ bug \82±\82¤\82µ\82È\82¢\82Æ\95\9d\82ª\82¹\82Ü\82\82Ähit\82µ\82È\82¢
+ OffsetRect( &_rc, TargetOffset.x, TargetOffset.y );
+ } else {
+ return r;
+ }
+ } else {
+ ExtTextOutCount++;
+ }
+#if ORG_OFFSET /* fixed 2001.1.14 for IE@win2k */
+ POINT vpt;
+ POINT wpt;
+ GetViewportOrgEx( hdc, &vpt );
+ GetWindowOrgEx( hdc, &wpt );
+ OffsetRect( &_rc, vpt.x-wpt.x, vpt.y-wpt.y);
+#else
+#if USE_DBW
+ POINT vpt;
+ POINT wpt;
+ GetViewportOrgEx( hdc, &vpt );
+ GetWindowOrgEx( hdc, &wpt );
+ if (vpt.x != wpt.x || vpt.y != wpt.y)
+ DBW("!!!Org DIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+#endif
+#endif
+
+ // \98A\91±\82µ\82½\83e\83L\83X\83g\82Ì\8fê\8d\87\82Í
+ // \98A\8c\8b\82·\82é
+ if (LastY == _rc.top && LastX == _rc.left ){
+ // \98A\91±\82µ\82½\83e\83L\83X\83g\95`\89æ\81¨\98A\8c\8b
+ LastTextA->Cat( str, count );
+ } else {
+ LastTextA->Set( str, count );
+ }
+ LastX = _rc.left;
+ LastY = _rc.top;
+
+ if ( PtInRect( &_rc, CursorPoint ) )
+ {
+#if DEBUG_HITTEXT
+ char *buf = new char[ count + 1 ];
+ CopyMemory( buf, str, count );
+ buf[count] = '\0';
+ DBW("CheckA -- %d %d %d %d (%d,%d)", _rc.left, _rc.top, _rc.right, _rc.bottom, CursorPoint.x, CursorPoint.y, count);
+ DBW("%s", buf);
+ delete[] buf;
+#endif
+ int loc = GetTextFromPoint( hdc, str, count, CursorPoint.x - _rc.left, CursorPoint.y - _rc.top, dx );
+ if ( loc != -1 ){
+ FoundLocA = loc + LastTextA->GetLength() - count;
+ FoundTextA->Set( LastTextA );
+#if DEBUG_HITTEXT
+ DBW("HitA loc=%d Len=%d Text=%ws", FoundLocA, FoundTextA->GetLength(), FoundTextA->c_str());
+#endif
+ }
+ }
+ }
+
+ return r;
+}
+//__declspec(dllexport)
+BOOL WINAPI _ExtTextOutW(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx )
+{
+// DBW("_ExtTextOutW");
+ POINT pt;
+ GetCurrentPositionEx(hdc,&pt);
+
+ BOOL r = ((FNExtTextOutW)ExtTextOutWHook.OrgFunc)( hdc, x, y, option, rc, str, count, dx );
+
+ hdcExtTextOut = hdc;
+
+ if ( r
+#if USE_META
+ && hdcMeta != hdc
+#endif
+ && count > 0 ){
+ RECT _rc;
+ if ( rc ){
+ _rc.right = rc->right;
+ _rc.bottom = rc->bottom;
+ } else {
+ _rc.right = rcClient.right;
+ _rc.bottom = rcClient.bottom;
+ }
+ if ( GetTextAlign( hdc ) & TA_UPDATECP ){
+ _rc.left = pt.x;
+ _rc.top = pt.y;
+ } else {
+ _rc.left = x;
+ _rc.top = y;
+ }
+ if ( RetryPhase ){
+ if ( TargetBitBltCount == BitBltCount ){
+ _rc.right += CursorPoint.x; //*+++ bug \82±\82¤\82µ\82È\82¢\82Æ\95\9d\82ª\82¹\82Ü\82\82Ähit\82µ\82È\82¢
+ OffsetRect( &_rc, TargetOffset.x, TargetOffset.y );
+ } else {
+ return r;
+ }
+ } else {
+ ExtTextOutCount++;
+ }
+#if ORG_OFFSET /* fixed 2001.1.14 for IE@win2k */
+ POINT vpt;
+ POINT wpt;
+ GetViewportOrgEx( hdc, &vpt );
+ GetWindowOrgEx( hdc, &wpt );
+ OffsetRect( &_rc, vpt.x-wpt.x, vpt.y-wpt.y);
+#else // !ORG_OFFSET
+#if USE_DBW
+ POINT vpt;
+ POINT wpt;
+ GetViewportOrgEx( hdc, &vpt );
+ GetWindowOrgEx( hdc, &wpt );
+ if (vpt.x != wpt.x || vpt.y != wpt.y)
+ DBW("!!!Org DIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+#endif // USE_DBW
+#endif // !ORG_OFFSET
+
+ // \98A\91±\82µ\82½\83e\83L\83X\83g\82Ì\8fê\8d\87\82Í\98A\8c\8b\82·\82é
+ if (LastY == _rc.top && LastX == _rc.left ){
+ // \98A\91±\82µ\82½\83e\83L\83X\83g\95`\89æ\81¨\98A\8c\8b
+ LastTextW->Cat( str, count );
+ } else {
+ LastTextW->Set( str, count );
+ }
+ LastX = _rc.left;
+ LastY = _rc.top;
+
+ if ( PtInRect( &_rc, CursorPoint ) )
+ {
+ DBW("%04X %04X %04X %04X",
+ str[0],
+ str[1],
+ str[2],
+ str[3]);
+#if DEBUG_HITTEXT
+ wchar_t *buf = new wchar_t[ count + 1 ];
+ CopyMemory( buf, str, count*sizeof(wchar_t) );
+ buf[count] = '\0';
+ DBW("CheckW -- %d %d %d %d (%d,%d)", _rc.left, _rc.top, _rc.right, _rc.bottom, CursorPoint.x, CursorPoint.y, count);
+ DBW("%ws", buf);
+ delete[] buf;
+#endif
+ int loc = GetTextFromPoint( hdc, str, count, CursorPoint.x - _rc.left, CursorPoint.y - _rc.top, dx );
+ if ( loc != -1 ){
+ FoundLocW = loc + LastTextW->GetLength() - count;
+ FoundTextW->Set( LastTextW );
+#if DEBUG_HITTEXT
+ DBW("HitW loc=%d Len=%d Text=%ws", FoundLocW, FoundTextW->GetLength(), FoundTextW->c_str());
+#endif
+ }
+ }
+ }
+
+ return r;
+}
+#endif // !METAEXTTEXTOUT
+
+#if HOOK_BITBLT
+BOOL WINAPI _BitBlt(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop )
+{
+ DBW("BitBlt:%08X %d %d %d %d <- %08X %d %d", hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc );
+ BOOL r = ((FNBitBlt)BitBltHook.OrgFunc)(hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc, rop );
+// DBW("BitBlt:%08X %d %d %d %d <- %08X %d %d", hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc );
+ if ( r && hdcExtTextOut == hdcsrc ){
+ if ( !RetryPhase ){
+ // \8d¡\89ñ\82ÌBitBlt\8e\9e\82ÉExtTextOut\82ª\82 \82Á\82½\82©\81H
+ if ( ExtTextOutCount > 0 ){
+ // CursorPoint\82ª\8aÜ\82Ü\82ê\82é\82©\81H
+ DBW("ExtTextOutCount=%d",ExtTextOutCount);
+ if ( (xdest <= CursorPoint.x)
+ && (xdest+width > CursorPoint.x)
+ && (ydest <= CursorPoint.y)
+ && (ydest+height > CursorPoint.y)
+ ){
+ TargetBitBltCount = BitBltCount;
+ TargetOffset.x = xdest - xsrc;
+ TargetOffset.y = ydest - ysrc;
+ DBW("TargetOffset %d %d (%d,%d %dx%d)<-(%d,%d)",
+ TargetOffset.x, TargetOffset.y,xdest,ydest,width,height,xsrc,ysrc);
+#if USE_DBW
+ {
+ POINT vpt;
+ POINT wpt;
+ GetViewportOrgEx( hdcdest, &vpt );
+ GetWindowOrgEx( hdcdest, &wpt );
+ DBW("BitBlt OrgDIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+ SIZE sz1;
+ SIZE sz2;
+ GetViewportExtEx( hdcdest, &sz1 );
+ GetWindowExtEx( hdcdest, &sz2 );
+ DBW("BitBlt Ext %d (%d,%d) (%d,%d)", GetMapMode(hdcdest), sz1.cx, sz1.cy, sz2.cx, sz2.cy );
+#if 1
+ XFORM xform;
+ GetWorldTransform( hdcdest, &xform );
+ {
+ char buf[100];
+ sprintf(buf,"== [%d] %g %g %g %g %g %g", GetGraphicsMode(hdcdest), xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy);
+ DBW(buf);
+ }
+#endif
+ }
+#endif
+ }
+#if METAEXTTEXTOUT
+ if ( TargetBitBltCount != -1 ){
+ // \82·\82Å\82É\82Ù\82©\82Ìband\82Åhit\82µ\82Ä\82¢\82é\8fê\8d\87\81A
+ // Cancel ExtTextOut
+ FoundLocA = -1;
+ FoundLocW = -1;
+ }
+#endif
+ }
+ }
+ BitBltCount++;
+ DBW("BitBltCount=%d",BitBltCount);
+ ExtTextOutCount = 0;
+ return r;
+ } else {
+// DBW("Unknown destination BitBlt %08X(%d,%d %dx%d)<-%08X(%d,%d)",hdcdest,xdest,ydest,width,height,hdcsrc,xsrc,ysrc);
+ }
+ return r;
+}
+#endif
+
+#if HOOK_TEXT
+#define HK1( name, ret_type, args ) \
+ ret_type r = ((FN##name)name##Hook.OrgFunc) args; \
+ return r
+LONG WINAPI _TabbedTextOutA( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin )
+{
+ DBW("_TabbedTextOutA");
+ HK1( TabbedTextOutA, LONG, ( hdc, x, y, str, count, ntabs, tabs, origin ) );
+}
+LONG WINAPI _TabbedTextOutW( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin )
+{
+ DBW("TabbedTextOutW");
+ HK1( TabbedTextOutW, LONG, ( hdc, x, y, str, count, ntabs, tabs, origin ) );
+}
+BOOL WINAPI _TextOutA( HDC hdc, int x, int y, LPCSTR str, int count )
+{
+ DBW("_TextOutA");
+ HK1( TextOutA, BOOL, ( hdc, x, y, str, count ) );
+}
+BOOL WINAPI _TextOutW( HDC hdc, int x, int y, LPCWSTR str, int count )
+{
+ DBW("_TextOutW");
+ HK1( TextOutW, BOOL, ( hdc, x, y, str, count ) );
+}
+int WINAPI _DrawTextA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format )
+{
+ DBW("s5");
+ HK1( DrawTextA, int, ( hdc, str, count, rc, format ) );
+}
+int WINAPI _DrawTextW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format )
+{
+ DBW("s6");
+ HK1( DrawTextW, int, ( hdc, str, count, rc, format ) );
+}
+int WINAPI _DrawTextExA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params )
+{
+ DBW("s7");
+ HK1( DrawTextExA, int, ( hdc, str, count, rc, format, params ) );
+}
+int WINAPI _DrawTextExW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params )
+{
+ DBW("s8");
+ HK1( DrawTextExW, int, ( hdc, str, count, rc, format, params ) );
+}
+#endif // HOOK_TEXT
+
+bool CaptureText( HWND hwnd, bool movesend )
+{
+ if ( !hwnd ){
+ return false;
+ }
+
+ MoveSendMode = movesend;
+
+ //DoScale(NULL, &CursorPoint, 1);
+
+#if METAEXTTEXTOUT
+ FoundLocA = -1;
+ FoundLocW = -1;
+ FoundTextA = new TString<char>;
+ FoundTextW = new TString<wchar_t>;
+ LastTextA = new TString<char>;
+ LastTextW = new TString<wchar_t>;
+#endif
+
+#if !USE_REDRAW
+ HRGN hRgn;
+#endif
+
+ GetClientRect( hwnd, &rcClient );
+ GetUpdateRect( hwnd, &rcOrgInvalid, FALSE );
+
+#if USE_OPTIMALINVALID
+ SetRect( &rcInvalid, 0, max(CursorPoint.y - 64,0), rcClient.right, max(CursorPoint.y + 64,0) );
+#else
+ rcInvalid = rcClient;
+#endif
+
+#if !USE_REDRAW
+ hRgn = CreateRectRgn( rcInvalid.left, rcInvalid.top, rcInvalid.right, rcInvalid.bottom );
+
+#if USE_INVALIDATE
+ InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#endif
+
+ SendMessage( hwnd, WM_PAINT, 0, 0 );
+ SendMessage( hwnd, WM_NCPAINT, (WPARAM)hRgn, 0 );
+#endif
+
+ hwndOrg = hwnd;
+
+#if USE_META
+ HDC hdc;
+#endif
+
+ HINSTANCE hPSAPI = NULL;
+ HMODULE hInst;
+ HMODULE hInstGdi;
+
+ hInst = GetModuleHandleA( STR_KERNEL32 );
+ fnCreateToolhelp32Snapshot = (FNCreateToolhelp32Snapshot)GetProcAddress( hInst, STR_CreateToolhelp32Snapshot );
+ if (fnCreateToolhelp32Snapshot){
+ // Toolhelp\82É\82æ\82émodule enumration\82ª\8eg\97p\89Â\94\
+ fnModule32First = (FNModule32First)GetProcAddress( hInst, STR_Module32First );
+ fnModule32Next = (FNModule32Next)GetProcAddress( hInst, STR_Module32Next );
+ } else {
+ // Toolhelp\82ª\91¶\8dÝ\82µ\82È\82¢\8fê\8d\87
+ hPSAPI = LoadLibrary( STR_PSAPI );
+ DBW("LoadLibrary : %08X",hPSAPI);
+ if (!hPSAPI){
+ DBW("Cannot load PSAPI.DLL!!");
+ return false;
+ }
+ fnEnumProcessModules = (FNEnumProcessModules)GetProcAddress( hPSAPI, STR_EnumProcessModules );
+ fnGetModuleFileNameExA = (FNGetModuleFileNameExA)GetProcAddress( hPSAPI, STR_GetModuleFileNameExA );
+ }
+
+ hInst = GetModuleHandleA( STR_USER32 );
+#if USE_DBW
+ if ( !hInst ){
+ DBW("Cannot load USER32.DLL");
+ return false;
+ }
+#endif
+ hInstGdi = GetModuleHandleA( STR_GDI32 );
+#if USE_DBW
+ if ( !hInstGdi ){
+ DBW("Cannot load GDI32.DLL");
+ goto err9;
+ }
+#endif
+
+#if METAEXTTEXTOUT
+ if ( !ExtTextOutAHook.GetProcOrgFunc( hInstGdi ) ){
+ DBW("Cannot find ExtTextOutA");
+ goto err8;
+ }
+ if ( !ExtTextOutWHook.GetProcOrgFunc( hInstGdi ) ){
+ DBW("Cannot find ExtTextOutW");
+ goto err7;
+ }
+#endif
+
+#if HOOK_BITBLT
+ if ( !BitBltHook.GetProcOrgFunc( hInstGdi ) ){
+ DBW("Cannot find BitBlt");
+ goto err71;
+ }
+#endif
+ RetryPhase = false;
+ TargetBitBltCount = -1;
+ BitBltCount = 0;
+ ExtTextOutCount = 0;
+
+#if HOOK_PAINT
+ if ( !BeginPaintHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook BeginPaint");
+ goto err73;
+ }
+ if ( !EndPaintHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook EndPaint");
+ goto err6;
+ }
+#endif
+
+#if HOOK_TEXT
+ TabbedTextOutAHook.GetProcOrgFunc( hInst );
+ TabbedTextOutWHook.GetProcOrgFunc( hInst );
+ TextOutAHook.GetProcOrgFunc( hInstGdi );
+ TextOutWHook.GetProcOrgFunc( hInstGdi );
+ DrawTextAHook.GetProcOrgFunc( hInst );
+ DrawTextWHook.GetProcOrgFunc( hInst );
+ DrawTextExAHook.GetProcOrgFunc( hInst );
+ DrawTextExWHook.GetProcOrgFunc( hInst );
+#endif
+
+#if USE_META
+ hdc = GetDC( hwnd );
+ if ( !hdc ){
+ DBW("Cannot get DC");
+ goto err5;
+ }
+#endif
+
+#if HOOK_GETDC
+ if ( !GetDCHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook GetDC");
+ goto err4;
+ }
+ if ( !ReleaseDCHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook ReleaseDC");
+ goto err3;
+ }
+#endif
+
+ {
+ DBW("Hooked successfully");
+// rect.right = 9999;
+// rect.bottom = 9999;
+#if 0
+ int iWidthMM = GetDeviceCaps(hdc, HORZSIZE);
+ int iHeightMM = GetDeviceCaps(hdc, VERTSIZE);
+ int iWidthPels = GetDeviceCaps(hdc, HORZRES);
+ int iHeightPels = GetDeviceCaps(hdc, VERTRES);
+
+ // Use iWidthMM, iWidthPels, iHeightMM, and iHeightPels to determine the
+ // number of .01-millimeter units per pixel in the x and y directions.
+
+ int iMMPerPelX = (iWidthMM * 100)/iWidthPels;
+ int iMMPerPelY = (iHeightMM * 100)/iHeightPels;
+ DBW("-%d %d-",iMMPerPelX, iMMPerPelY);
+
+ // Convert client coordinates to .01-mm units.
+
+ rcClient.left = rcClient.left * iMMPerPelX;
+ rcClient.top = rcClient.top * iMMPerPelY;
+ rcClient.right = rcClient.right * iMMPerPelX;
+ rcClient.bottom = rcClient.bottom * iMMPerPelY;
+#endif
+
+#if USE_META
+ hdcMeta = CreateEnhMetaFile(hdc,
+ NULL,
+ &rcClient, "DCHook\0EnhMetaFile\0");
+ if ( !hdcMeta ){
+ DBW("Cannot create Meta file");
+ goto err3;
+ }
+
+ DBW("hdcMeta=%08X", hdcMeta);
+#endif
+
+#if USE_REDRAW
+ RedrawWindow( hwnd, &rcInvalid, NULL, RDW_UPDATENOW | RDW_NOERASE | RDW_NOFRAME | RDW_INVALIDATE );
+#else
+ WNDPROC PaintWndProc = (WNDPROC)GetWindowLong( hwnd, GWL_WNDPROC );
+ SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#endif
+#if HOOK_GETDC
+ ReleaseDCHook.Finish();
+ GetDCHook.Finish();
+#endif
+
+#if HOOK_TEXT
+ TabbedTextOutAHook.Finish( );
+ TabbedTextOutWHook.Finish( );
+ TextOutAHook.Finish( );
+ TextOutWHook.Finish( );
+ DrawTextAHook.Finish( );
+ DrawTextWHook.Finish( );
+ DrawTextExAHook.Finish( );
+ DrawTextExWHook.Finish( );
+#endif
+
+#if HOOK_PAINT
+ EndPaintHook.Finish();
+ BeginPaintHook.Finish();
+#endif
+
+#if HOOK_BITBLT
+ BitBltHook.Finish();
+#endif
+
+#if METAEXTTEXTOUT
+ ExtTextOutAHook.Finish();
+ ExtTextOutWHook.Finish();
+#endif
+
+ // Notify start enumrate meta-file
+ CallbackMain(DCH_START, &CursorPoint, sizeof(CursorPoint), hwnd);
+
+ HitFound = false;
+
+#if USE_META
+ HENHMETAFILE emf = CloseEnhMetaFile( hdcMeta );
+
+ if ( emf )
+#endif
+ {
+#if METAEXTTEXTOUT
+ if ( FoundLocA != -1 || FoundLocW != -1 ){
+// DBW("Hit ExtText:%d %d",FoundLocA,FoundLocW);
+ // ExtTextOutx hook\82Ì\82Ù\82¤\82ð\97D\90æ\82·\82é
+ ExtTextOutHit( );
+ HitFound = true;
+ } else
+#endif
+ {
+#if USE_META
+ // Create compatible device-context for enumration
+ HDC _hdc = CreateCompatibleDC( hdc );
+ HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+ HGDIOBJ gdiobj = SelectObject( _hdc, hbitmap );
+
+ DBW("Start meta");
+ // Enumerate meta-file
+ EnumEnhMetaFile( _hdc, emf, EnumMetaFileProc, NULL, &rcClient );
+ DBW("End meta");
+
+ // Delete compatible device-context
+ SelectObject( _hdc, gdiobj );
+ DeleteObject( hbitmap );
+ DeleteDC( _hdc );
+#endif
+ }
+#if USE_META
+ DeleteEnhMetaFile( emf );
+#endif
+ }
+#if USE_META
+ else {
+ DBW("emf is NULL");
+ }
+#endif
+
+#if METAEXTTEXTOUT
+ if ( !HitFound && TargetBitBltCount != -1 ){
+ DBW("Search from band:%d",TargetBitBltCount);
+#if USE_META
+ // Band\82©\82ç\8c\9f\8dõ
+ hdcMeta = CreateCompatibleDC( hdc );
+ if ( !hdcMeta ){
+ DBW("Cannot create HDC in retry");
+ } else
+#endif
+ {
+#if USE_META
+ HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+ HGDIOBJ gdiobj = SelectObject( hdcMeta, hbitmap );
+ DBW("hdcMeata=%08X", hdcMeta);
+#endif
+
+ BitBltCount = 0;
+ RetryPhase = true;
+#if METAEXTTEXOUT
+ FoundLocA = -1;
+ FoundLocW = -1;
+#endif
+
+#if METAEXTTEXTOUT
+ ExtTextOutAHook.HookAgain();
+ ExtTextOutWHook.HookAgain();
+#endif
+#if HOOK_BITBLT
+ BitBltHook.HookAgain();
+#endif
+#if HOOK_PAINT
+ BeginPaintHook.HookAgain();
+ EndPaintHook.HookAgain();
+#endif
+
+// DBW("t1:%d %d %d %d",rcClient.left, rcClient.top,rcClient.right,rcClient.bottom);
+
+#if USE_INVALIDATE
+ InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#endif
+
+#if USE_REDRAW
+ RedrawWindow( hwnd, &rcInvalid, NULL, RDW_UPDATENOW | RDW_NOERASE | RDW_NOFRAME | RDW_INVALIDATE );
+#else
+ CallWindowProc( (WNDPROC)PaintWndProc, hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#endif
+
+#if HOOK_PAINT
+ EndPaintHook.Finish();
+ BeginPaintHook.Finish();
+#endif
+#if HOOK_BITBLT
+ BitBltHook.Finish();
+#endif
+
+#if METAEXTTEXTOUT
+ ExtTextOutAHook.Finish();
+ ExtTextOutWHook.Finish();
+#endif
+#if USE_META
+ SelectObject( hdcMeta, gdiobj );
+ DeleteObject( hbitmap );
+ DeleteDC( hdcMeta );
+#endif
+ if ( FoundLocA != -1 || FoundLocW != -1 ){
+ DBW("Found in BitBlt ExtText:%d %d",FoundLocA,FoundLocW);
+ ExtTextOutHit( );
+ HitFound = true;
+ }
+ }
+ }
+#endif // METAEXTTEXTOUT
+
+#if RETRYMETA
+ if ( !HitFound ){
+ HENHMETAFILE emf;
+#if !USE_META
+ HDC hdc = GetDC( hwnd );
+ if ( !hdc ){
+ DBW("Cannot get DC");
+ goto err01;
+ }
+#endif
+#if HOOK_PAINT
+ if ( !BeginPaintHook.HookAgain( ) ){
+ DBW("Cannot hook BeginPaint");
+ goto err02;
+ }
+ if ( !EndPaintHook.HookAgain( ) ){
+ DBW("Cannot hook EndPaint");
+ goto err03;
+ }
+#else
+ if ( !BeginPaintHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook BeginPaint");
+ goto err02;
+ }
+ if ( !EndPaintHook.GetProcOrgFunc( hInst ) ){
+ DBW("Cannot hook EndPaint");
+ goto err03;
+ }
+#endif
+
+ hdcMeta = CreateEnhMetaFile(hdc,
+ NULL,
+ &rcClient, _T("DCHook\0EnhMetaFile\0"));
+ if ( !hdcMeta ){
+ DBW("Cannot create Meta file");
+ goto err04;
+ }
+ DBW("hdcMeta=%08X", hdcMeta);
+// InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#if 1 // 2000.7.15 NT\82Å\82à\82È\82º\82±\82Á\82¿\82É\82µ\82Ä\82¢\82È\82©\82Á\82½\82Ì\82©\82í\82©\82ç\82È\82¢\82ª\81E\81E\81E
+ SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#else
+ // Notepad\82Å\82Í\88Ù\8fí\8fI\97¹\82·\82é\82½\82ß\8bp\89º
+ // \89½\82à\82È\82¢\82Æ\82±\82ë\82ÅCtrl+\89E\83N\83\8a\83b\83N
+ WNDPROC PaintWndProc = (WNDPROC)GetWindowLong( hwnd, GWL_WNDPROC );
+ if ( PaintWndProc ){
+ PaintWndProc( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+ }
+#endif
+ EndPaintHook.Finish();
+ BeginPaintHook.Finish();
+
+ emf = CloseEnhMetaFile( hdcMeta );
+
+ if ( emf ){
+ HDC _hdc = CreateCompatibleDC( hdc );
+ HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+ HGDIOBJ gdiobj = SelectObject( _hdc, hbitmap );
+
+ DBW("Start meta-retry");
+ // Enumerate meta-file
+ EnumEnhMetaFile( _hdc, emf, EnumMetaFileProc, NULL, &rcClient );
+ DBW("End meta-retry");
+
+ // Delete compatible device-context
+ SelectObject( _hdc, gdiobj );
+ DeleteObject( hbitmap );
+ DeleteDC( _hdc );
+ DeleteEnhMetaFile( emf );
+ }
+ err04:
+ EndPaintHook.Finish();
+ err03:
+ BeginPaintHook.Finish();
+ err02:
+#if !USE_META
+ ReleaseDC( hwnd, hdc );
+#endif
+ err01:;
+ }
+#endif
+
+ // Notify end enumrate meta-file
+ CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, hwnd);
+ }
+
+#if USE_META
+ ReleaseDC( hwnd, hdc );
+#endif
+
+ if ( rcOrgInvalid.right != 0 ){
+ DBW("Update OrgInvalid--------");
+ InvalidateRect( hwnd, NULL, INVALIDATE_TRUE );
+ }
+
+ goto jreturn;
+
+#if HOOK_GETDC || USE_META
+err3:;
+#endif
+#if HOOK_GETDC
+ GetDCHook.Finish();
+err4:;
+#if USE_META
+ ReleaseDC( hwnd, hdc );
+#endif
+#endif
+#if USE_META
+err5:;
+#endif
+#if HOOK_PAINT
+ EndPaintHook.Finish();
+err6:;
+ BeginPaintHook.Finish();
+err73:;
+#endif
+#if HOOK_BITBLT
+ BitBltHook.Finish();
+#endif
+#if HOOK_BITBLT
+err71:;
+#endif
+#if METAEXTTEXTOUT
+ ExtTextOutWHook.Finish();
+err7:;
+ ExtTextOutAHook.Finish();
+err8:
+#endif
+ if (hPSAPI)
+ FreeLibrary( hPSAPI );
+#if USE_DBW
+err9:
+#endif
+ HitFound = false;
+jreturn:;
+#if USE_VXD
+ if (vxd_Handle!=INVALID_HANDLE_VALUE)
+ UnloadVxD();
+#endif
+#if METAEXTTEXTOUT
+ delete FoundTextA;
+ delete FoundTextW;
+ delete LastTextA;
+ delete LastTextW;
+#endif
+
+ return HitFound;
+}
+#if METAEXTTEXTOUT
+void ExtTextOutHit()
+{
+ if ( FoundLocA != -1 ){
+ // Hit on ANSI
+ DBW("Hit on ANSI@ExtTextOut");
+ CallbackMain(DCH_HITTEXT1, FoundTextA->c_str(), FoundTextA->GetByte(), (HWND)FoundLocA);
+ } else {
+ // Hit on UNICODE
+ DBW("Hit on UNICODE@ExtTextOut");
+ CallbackMain(DCH_HITTEXT2, FoundTextW->c_str(), FoundTextW->GetByte(), (HWND)FoundLocW);
+ }
+}
+#endif // METAEXTTEXTOUT
+
+void DoScale(HDC hdc, POINT *pts, int num)
+{
+ //TODO: hInst, proc\82Íglobal\82É\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+
+ int scale = 0;
+ if (ScaleX && ScaleY){
+ scale = ScaleX; // \8ew\92è\82µ\82½scaling parameter
+ } else {
+ scale = GetMonitorScale();
+ if (scale == 96) return;
+ }
+
+#if 1
+#if 1
+ PROCESS_DPI_AWARENESS value = Process_DPI_Unaware;
+ if (hInstSHCore){
+ if (!GetProcessDPIAwareness){
+ GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInstSHCore, "GetProcessDpiAwareness");
+ }
+ if (GetProcessDPIAwareness){
+ GetProcessDPIAwareness(hProcess, &value);
+ DBW("DPIAware: value=%d", value);
+ }
+ }
+ if (value != Process_System_DPI_Aware){
+ int dpi_x = scale;
+ int dpi_y = scale;
+ DBW("dpi: %d,%d", dpi_x, dpi_y);
+ for (int i=0;i<num;i++){
+ pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+ pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+ }
+ }
+#else
+ HINSTANCE hInst = NULL;
+ FNGetProcessDPIAwareness GetProcessDPIAwareness = NULL;
+ //FNSetProcessDPIAwareness SetProcessDPIAwareness = NULL;
+ //if (!GetProcessDPIAwareness)
+ {
+ hInst = LoadLibrary("shcore.dll");
+ if (hInst){
+ GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInst, "GetProcessDpiAwareness");
+ //SetProcessDPIAwareness = (FNSetProcessDPIAwareness)GetProcAddress(hInst, "SetProcessDpiAwareness");
+ //DBW("DPI API:%08X %08X", GetProcessDPIAwareness, SetProcessDPIAwareness);
+ DBW("DPI API:%08X", GetProcessDPIAwareness);
+ }
+ }
+ if (GetProcessDPIAwareness || (ScaleX && ScaleY)){
+ int dpi_x, dpi_y;
+ PROCESS_DPI_AWARENESS value;
+ if (GetProcessDPIAwareness && hdc){
+ HRESULT hRes = GetProcessDPIAwareness(hProcess, &value);
+ DBW("DPIAware: value=%d", value);
+ //SetProcessDPIAwareness(Process_System_DPI_Aware);
+ dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
+ dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
+ DBW("dpi: %d, %d", dpi_x, dpi_y);
+ } else {
+ dpi_x = ScaleX;
+ dpi_y = ScaleY;
+ }
+ for (int i=0;i<num;i++){
+ pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+ pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+ }
+#if 0
+ if (SetProcessDPIAwareness){
+ SetProcessDPIAwareness(value);
+ }
+#endif
+ }
+ if (hInst){
+ FreeLibrary(hInst);
+ }
+#endif
+#else // \8b\8c\83R\81[\83h
+ HINSTANCE hInst = NULL;
+ if (!GetProcessDPIAwareness){
+ hInst = LoadLibrary("shcore.dll");
+ DBW("shcore=%08X", hInst);
+ if (hInst){
+ GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInst, "GetProcessDPIAwareness");
+ SetProcessDPIAwareness = (FNSetProcessDPIAwareness)GetProcAddress(hInst, "SetProcessDPIAwareness");
+ DBW("DPI API:%08X %08X", GetProcessDPIAwareness, SetProcessDPIAwareness);
+ }
+ }
+ if (GetProcessDPIAwareness || (ScaleX && ScaleY)){
+ int dpi_x, dpi_y;
+ PROCESS_DPI_AWARENESS value;
+ if (GetProcessDPIAwareness && hdc){
+ HRESULT hRes = GetProcessDPIAwareness(hProcess, &value);
+ SetProcessDPIAwareness(Process_System_DPI_Aware);
+ dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
+ dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
+ } else {
+ dpi_x = ScaleX;
+ dpi_y = ScaleY;
+ }
+ for (int i=0;i<num;i++){
+ pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+ pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+ }
+ if (SetProcessDPIAwareness){
+ SetProcessDPIAwareness(value);
+ }
+ if (hInst){
+ FreeLibrary(hInst);
+ }
+ }
+#endif
+}
+
+int CALLBACK EnumMetaFileProc( HDC hdc, HANDLETABLE *ht, CONST ENHMETARECORD *mfr, int nobj, LPARAM /* user */ )
+{
+ PlayEnhMetaFileRecord( hdc, ht, mfr, nobj );
+
+ //DBW("iType=%d",mfr->iType);
+
+ switch ( mfr->iType ){
+ case EMR_EXTTEXTOUTA:
+ case EMR_EXTTEXTOUTW:
+ {
+ EMREXTTEXTOUTW *emr = (EMREXTTEXTOUTW*)mfr;
+
+ //DBW("(%d,%d) <%d=%d=%d=%d>", CursorPoint.x, CursorPoint.y, emr->rclBounds.left, emr->rclBounds.top,emr->rclBounds.right, emr->rclBounds.bottom);
+#if 1
+ if ( PtInRect( (RECT*)&emr->rclBounds, CursorPoint ) ){
+ DBW("(%d,%d) <%d=%d>", CursorPoint.x, CursorPoint.y, emr->rclBounds.left, emr->emrtext.ptlReference.x);
+#if 0
+ {
+ SIZE sz1, sz2;
+ GetWindowExtEx( hdc, &sz1 );
+ GetViewportExtEx( hdc, &sz2 );
+ DBW("%d-%d %d-%d", sz1.cx, sz1.cy, sz2.cx, sz2.cy);
+ }
+#endif
+ int loc;
+ if ( mfr->iType == EMR_EXTTEXTOUTW ){
+ //DBW("offString=%d nChars=%d left=%d top=%d offDx=%d", emr->emrtext.offString, emr->emrtext.nChars, emr->rclBounds.left, emr->rclBounds.top, emr->emrtext.offDx);
+ //DBW("text=%ws", (wchar_t*) ( ((char*)emr) + emr->emrtext.offString ));
+ loc = GetTextFromPoint( hdc, (wchar_t*) ( ((char*)emr) + emr->emrtext.offString ),
+ emr->emrtext.nChars,
+ CursorPoint.x - emr->rclBounds.left /* + emr->emrtext.ptlReference.x */,
+ CursorPoint.y - emr->rclBounds.top /* + emr->emrtext.ptlReference.y */,
+ ((int*)(((char*)emr) + emr->emrtext.offDx)) );
+ } else {
+ loc = GetTextFromPoint( hdc, ((char*)emr) + emr->emrtext.offString,
+ emr->emrtext.nChars,
+ CursorPoint.x - emr->rclBounds.left /* + emr->emrtext.ptlReference.x */,
+ CursorPoint.y - emr->rclBounds.top /* + emr->emrtext.ptlReference.y */,
+ ((int*)(((char*)emr) + emr->emrtext.offDx)) );
+ }
+ if ( loc != -1 ){
+// char *buf = NULL;
+ const char *text = ((char*)emr) + emr->emrtext.offString;
+ int len = emr->emrtext.nChars;
+ if ( mfr->iType == EMR_EXTTEXTOUTW ){
+ // WIDE
+ //DBW("len=%d loc=%d text=%ws", len, loc, text);
+ CallbackMain(DCH_HITTEXT2, text, len * sizeof(wchar_t), (HWND)loc);
+#if 0
+ // UNICODE->ANSI
+ // ANSI\8fã\82Å\82Ìloc\82ð\8b\81\82ß\82é\82½\82ß\81A\91O\94¼\82Æ\8cã\94¼\82ð\95ª\82¯\82Ä\95Ï\8a·
+ wchar_t *wp = (wchar_t*) ( ((char*)emr) + emr->emrtext.offString );
+ buf = new char[ emr->emrtext.nChars * 2 ];
+ memset( buf, 0, emr->emrtext.nChars*2 );
+ // \91O\94¼\95\94\95ª
+ len = 0;
+ if ( loc > 0 ){
+ len = WideCharToMultiByte( CP_ACP, 0, wp, loc,
+ buf, emr->emrtext.nChars * 2, NULL, NULL );
+ }
+ int newloc = len;
+ // \8cã\94¼\95\94\95ª
+ if ( emr->emrtext.nChars > (unsigned int)loc ){
+ len += WideCharToMultiByte( CP_ACP, 0, wp+loc, emr->emrtext.nChars - loc,
+ buf+len, emr->emrtext.nChars * 2 - len, NULL, NULL );
+ }
+ loc = newloc;
+ text = buf;
+#endif
+
+ } else {
+ // ANSI
+ CallbackMain(DCH_HITTEXT1, text, len, (HWND)loc);
+ }
+
+ DBW("Found@Enum");
+#if 0
+ CallbackMain(DCH_HITTEXT1, text, len, (HWND)loc);
+ if ( buf )
+ delete buf;
+#endif
+#if 0
+ {
+ char b[100];
+ sprintf(b,"exScale=%f eyScale=%f ptlReference=(%d,%d)",emr->exScale, emr->eyScale, emr->emrtext.ptlReference.x, emr->emrtext.ptlReference.y );
+ DBW(b);
+ DBW("iGraphicsMode=%d", emr->iGraphicsMode);
+ }
+#endif
+#if 0
+ {
+ for ( int i=0;i<(int)emr->emrtext.nChars;i++ ){
+ DBW(">%d", ((int*)(((char*)emr) + emr->emrtext.offDx))[i] );
+ }
+ }
+#endif
+// DBW("[%d %d][%d %d]text=(%s)", emr->rclBounds.left, emr->rclBounds.top, CursorPoint.x, CursorPoint.y, text);
+// result = false; // stop enumration // \8d\82\91¬\89»\82Ì\82½\82ß\93r\92\86\82Å\8fI\82í\82è\82É\82µ\82½\82¢\82ª\81E\81E\81E\82Ç\82¤\82µ\82æ\82¤\81H
+#if METAEXTTEXTOUT
+ // prevent to get from ExtTextOut hook
+ FoundLocA = -1;
+ FoundLocW = -1;
+#endif
+ HitFound = true;
+ }
+ }
+#else // for debug
+ if ( mfr->iType == EMR_EXTTEXTOUTW ){
+ CallbackMain(DCH_EXTTEXTOUTW, emr, sizeof(EMREXTTEXTOUTW) + emr->emrtext.nChars * sizeof(wchar_t), (HWND)hdc);
+ } else {
+ CallbackMain(DCH_EXTTEXTOUTA, emr, sizeof(EMREXTTEXTOUTA) + emr->emrtext.nChars, (HWND)hdc);
+ }
+#endif
+ }
+ break;
+ }
+ return true;
+}
+
+} // extern "C"
+
+// text\82Ì\90æ\93ª\82ð(0,0)\82Æ\82µ\82½\8dÀ\95W\82Å\81Apos\82Ì\88Ê\92u\82É\82 \82étext\82Ì\95¶\8e\9a\88Ê\92u\82ð\95Ô\82·
+int GetTextFromPoint( HDC hdc, const char *text, int len, int pos_x, int pos_y, const int *dx )
+{
+ if ( pos_x < 0 || pos_y < 0 ) return -1;
+
+ int count = 0;
+ SIZE sz;
+ int *rdx = NULL;
+ if ( dx ){
+ rdx = new int[len];
+ memset( rdx, 0, len*sizeof(int) );
+ }
+ if ( !GetTextExtentExPointA( hdc, text, len, pos_x, &count, rdx, &sz ) ){
+ DBW("GetTextExtentExPointA Failure!!");
+ if ( rdx )
+ delete rdx;
+ return -1;
+ }
+#if METAEXTTEXTOUT
+ LastX += sz.cx; // update
+#endif
+ // size over check
+ if ( pos_y > sz.cy
+ || pos_x > sz.cx
+ ){
+ if ( rdx ) delete rdx;
+ return -1;
+ }
+ DBW("A:len=%d pos_x=%d sz.cx=%d", len, pos_x, sz.cx);
+ if ( dx && count > 0 ){
+ // ex.
+ // Win98,Notepad\82Ì\93ú\96{\8cê\8fã\82Å
+ // dx = 0, 8, 0, 8, 0, 8, ...
+ // rdx = 9,10, 9,10, 9,10, ...
+#if 0
+ {
+ int i;
+ for ( i=0;i<len;i++ ){
+ DBW(" dx[%2d]=%d",i,dx[i]);
+ }
+ for ( i=0;i<count;i++ ){
+ DBW("rdx[%2d]=%d",i,rdx[i+1]-rdx[i]);
+ }
+ }
+#endif
+ // spacing\82Ì\8cë\8d·\82ð\8cv\8eZ
+ // Times New Roman\82È\82Ç\82Å\92²\82×\82é\82Æ\82©\82È\82è\82Ì\8cë\8d·\82ª\82 \82é\81B\82È\82º\81H
+
+ int i = 0;
+ int j = 0;
+ int sumdx = 0;
+// DBW("rd(x)[0]=%d,%d",dx[0],rdx[0]);
+ if ( rdx[0] ){
+ if ( dx[0] ){
+ sumdx = dx[0] - rdx[0];
+ } else {
+ sumdx = dx[1] - rdx[0];
+ }
+ i++;
+ j++;
+ }
+ for ( ;i<count;i++,j++ ){
+#if 0
+ if ( rdx[i] == rdx[i-1] ){ j--; continue;} // for multi-bytes font
+ //*++ \82 \82Æ\82Å ExtTextOut API manual\82ð\8eQ\8fÆ
+ sumdx += dx[j] - (rdx[i]-rdx[i-1]);
+// DBW("%3d <> %3d", dx[j], rdx[i]-rdx[i-1]);
+#else // Win98\82Å\82Í\81Amulti-byte\82Å\82à\95ª\8eU\82³\82¹\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82é\82½\82ß\81Adx\82Å\94»\92f
+ sumdx += (dx[j]?dx[j]:dx[j+1]) - (rdx[i]-rdx[i-1]);
+#endif
+ }
+// DBW("sumdx=%d",sumdx);
+ if ( !GetTextExtentExPointA( hdc, text, len, pos_x - sumdx, &count, rdx, &sz ) ){
+ if ( rdx )
+ delete rdx;
+ return -1;
+ }
+ }
+ if ( rdx )
+ delete rdx;
+ return count;
+}
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int len, int pos_x, int pos_y, const int *dx )
+{
+#if USE_VXD
+ if (WindowsNT)
+#endif
+ {
+ if ( pos_x < 0 || pos_y < 0 ) return -1;
+
+ int count = 0;
+ SIZE sz;
+ int *rdx = NULL;
+ if ( dx ){
+ rdx = new int[ len ];
+ memset( rdx, 0, len );
+ }
+ if ( !GetTextExtentExPointW( hdc, text, len, pos_x, &count, rdx, &sz ) )
+ {
+ DBW("GetTextExtentExPointW Failure!!");
+ if ( rdx )
+ delete[] rdx;
+ return -1;
+ }
+#if METAEXTTEXTOUT
+ LastX += sz.cx;
+#endif
+ // size over check
+ if ( pos_y > sz.cy
+ || pos_x > sz.cx
+ ){
+ if ( rdx ) delete[] rdx;
+ return -1;
+ }
+ DBW("W:len=%d pos_x=%d sz.cx=%d", len, pos_x, sz.cx);
+ if ( dx && count > 0 ){
+ // spacing\82Ì\8cë\8d·\82ð\8cv\8eZ
+ // Times New Roman\82È\82Ç\82Å\92²\82×\82é\82Æ\82©\82È\82è\82Ì\8cë\8d·\82ª\82 \82é\81B\82È\82º\81H
+ int i = 0;
+ int j = 0;
+ int sumdx = 0;
+ // DBW("rd(x)[0]=%d,%d",dx[0],rdx[0]);
+ if ( rdx[0] ){
+ sumdx = dx[0] - rdx[0];
+ i++;
+ j++;
+ }
+ for ( ;i<count-1;i++,j++ ){
+#if 0
+ if ( rdx[i] == rdx[i-1] ){ j--; continue;} // for multi-bytes font
+ //*++ \82 \82Æ\82Å ExtTextOut API manual\82ð\8eQ\8fÆ
+ sumdx += dx[j] - (rdx[i]-rdx[i-1]);
+ // DBW("%3d <> %3d", dx[j], rdx[i]-rdx[i-1]);
+#else
+ sumdx += (dx[j]?dx[j]:dx[j+1]) - (rdx[i]-rdx[i-1]);
+#endif
+ }
+ // DBW("sumdx=%d",sumdx);
+ if ( !GetTextExtentExPointW( hdc, text, len, pos_x - sumdx, &count, rdx, &sz ) ){
+ if ( rdx )
+ delete rdx;
+ return -1;
+ }
+ }
+ if ( rdx )
+ delete rdx;
+ return (count == len && sz.cx < pos_x) ? -1 : count;
+ }
+#if USE_VXD
+ else {
+ char *buf = new char[ len * sizeof(wchar_t) ];
+ memset( buf, 0, len * sizeof(wchar_t) );
+ int ansilen = WideCharToMultiByte( CP_ACP, 0, text, len, buf, len*sizeof(wchar_t), NULL, NULL );
+ int r = GetTextFromPoint( hdc, buf, ansilen, pos_x, pos_y, dx );
+ delete buf;
+ return r;
+ }
+#endif
+}
+
+#define WMCD_EXISTCHECK 0x4000
+#define WMCD_SETPOINT 0x4001
+
+class TDC {
+ HDC hdc;
+ HWND hwnd;
+public:
+ TDC()
+ :hwnd(NULL)
+ {
+ hdc = GetDC(NULL);
+ }
+ TDC(HWND _hwnd)
+ :hwnd(_hwnd)
+ {
+ hdc = GetWindowDC(hwnd);
+ }
+ ~TDC()
+ {
+ reset();
+ }
+ void reset()
+ {
+ if (hdc){
+ ReleaseDC(hwnd, hdc);
+ hdc = NULL;
+ }
+ }
+ operator HDC() { return hdc; }
+ bool operator !() { return hdc==NULL; }
+};
+
+bool CaptureImage(HWND hwnd, bool movesend, bool non_block)
+{
+ MoveSendMode = movesend;
+ CaptureImageBlocking = false;
+
+ bool capture_page = false;
+ if (hwndAMODI){
+ capture_page = SendMessage(hwndAMODI, WM_AMODI, AMODI_CMD_PAGE_CAPTURE, 0) ? true : false;
+ }
+
+ // Get the rect of the target window.
+ RECT rcTarget;
+ if (!GetWindowRect(hwnd, &rcTarget)){
+ // window died?
+ return false;
+ }
+ if (!ExtAMODI){
+ if (!IsWindowEnabled(hwndAMODI)){
+ // AMODI died?
+ hwndAMODI = FindAMODI();
+ if (!hwndAMODI)
+ return false;
+ }
+ }
+ int w = rcTarget.right - rcTarget.left;
+ int h = rcTarget.bottom - rcTarget.top;
+ if (w==0 || h==0){
+ return false; // no area in the target.
+ }
+
+ POINT ptCursor; // \89æ\91\9c\8fã\82Ì\83J\81[\83\\83\8b\88Ê\92u
+ int x, y;
+ if (capture_page){
+ x = rcTarget.left;
+ y = rcTarget.top;
+ ptCursor.x = ScreenPoint.x - rcTarget.left;
+ ptCursor.y = ScreenPoint.y - rcTarget.top;
+ } else {
+ // x\95û\8cü : target rect\82Ì\8d¶\92[\82©\82ç
+ // y\95û\8cü : cursor point\82Ì\8fã\89º100 pixel
+ x = rcTarget.left;
+ int offs = 100;
+ if (ScreenPoint.y - rcTarget.top < offs){
+ if (ScreenPoint.y < rcTarget.top) return false; // click on out of rect?
+ y = rcTarget.top;
+ h = ScreenPoint.y - rcTarget.top + offs;
+ } else {
+ y = ScreenPoint.y - offs;
+ h = offs * 2;
+ }
+ if (y+h>rcTarget.bottom){
+ h = rcTarget.bottom - y;
+ }
+ ptCursor.x = ScreenPoint.x - rcTarget.left;
+ ptCursor.y = ScreenPoint.y - y;
+ }
+
+ if (0){
+ HWND hwnd = GetDesktopWindow();
+ RECT rc;
+ GetWindowRect(hwnd, &rc);
+ x = 0;
+ y = 0;
+ w = rc.right - rc.left;
+ h = rc.bottom - rc.top;
+ }
+
+ if (!capture_page){
+ // Notify start enumrate
+ CallbackMain(DCH_START, &CursorPoint, sizeof(CursorPoint), hwnd);
+ }
+
+ bool ok = false;
+
+ TDC hdc;
+
+ if (!hdc){
+ goto jend;
+ }
+
+#if USE_SCALING
+ POINT pts[3];
+ pts[0].x = x;
+ pts[0].y = y;
+ pts[1].x = w;
+ pts[1].y = h;
+ pts[2].x = ptCursor.x;
+ pts[2].y = ptCursor.y;
+ DoScale(hdc, pts, 3);
+ //DBW("%d,%d %d,%d,%d,%d -> %d,%d %d,%d,%d,%d", ptCursor.x, ptCursor.y, x, y, w, h, pts[2].x, pts[2].y, pts[0].x, pts[0].y, pts[1].x, pts[1].y);
+ x = pts[0].x;
+ y = pts[0].y;
+ w = pts[1].x;
+ h = pts[1].y;
+ ptCursor.x = pts[2].x;
+ ptCursor.y = pts[2].y;
+#endif
+
+ // capture image
+
+ int wlen = (w*3+3)&~3;
+
+ /* \8f\91\82«\8d\9e\82Ý\97p\83o\83b\83t\83@\82Ì\83T\83C\83Y\8cv\8eZ */
+ DWORD dwFSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + wlen * h;
+
+ /* \83o\83b\83t\83@\8am\95Û\82Æ\83|\83C\83\93\83^\90Ý\92è */
+ LPBYTE lpBuf = (LPBYTE)new char[dwFSize];
+ if (!lpBuf){
+ goto jend;
+ }
+
+ LPBITMAPFILEHEADER lpHead = (LPBITMAPFILEHEADER)lpBuf;
+ LPBITMAPINFOHEADER lpInfo = (LPBITMAPINFOHEADER)(lpBuf+sizeof(BITMAPFILEHEADER));
+ LPBYTE lpPixel = lpBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+
+ /* 24\83r\83b\83gBMP\83t\83@\83C\83\8b\82Ì\83w\83b\83_\8dì\90¬ */
+ lpHead->bfType = ('M'<<8) +'B';
+ lpHead->bfSize = dwFSize;
+ lpHead->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+ lpInfo->biSize = sizeof(BITMAPINFOHEADER);
+ lpInfo->biWidth = w;
+ lpInfo->biHeight = h;
+ lpInfo->biPlanes = 1;
+ lpInfo->biBitCount = 24;
+
+ HBITMAP hBmp = CreateCompatibleBitmap(hdc, w, h);
+ if (hBmp){
+ HDC hdcMem = CreateCompatibleDC(hdc);
+ if (hdcMem){
+ HDC hOld = (HDC)SelectObject(hdcMem, hBmp);
+ if (hOld!=(HDC)GDI_ERROR){
+ BOOL r = BitBlt(hdcMem, 0, 0, w, h, hdc, x, y, SRCCOPY);
+ SelectObject(hdcMem, hOld);
+ if (r){
+// int lines = GetDIBits(hdc, hBmp, 0, h, NULL, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS);
+ int lines = GetDIBits(hdc, hBmp, 0, h, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS);
+ if (lines!=0){
+ ok = true;
+ } else {
+ dbw("GetDIBits error??? %d h=%d w=%d bfSize=%d", GetLastError(), h, w, dwFSize);
+ }
+ } else {
+// dbw("BitBlt error??? %d", GetLastError());
+ }
+ }
+ DeleteObject(hdcMem);
+ }
+ DeleteObject(hBmp);
+ }
+
+ hdc.reset();
+
+ if (ok){
+ ok = false;
+
+ //TCHAR path[sizeof(AMODIPath)+40];
+ TCHAR *path = ImageTextPath;
+ size_t path_size = sizeof(ImageTextPath);
+ size_t len;
+ if (ExtAMODI){
+ len = _tcslen(AMODIPath);
+ _tcscpy(path, AMODIPath);
+ } else {
+ memset(path, 0, path_size);
+ len = GetTempPath((DWORD)path_size, path);
+ }
+ if (len>0){
+ // send image to AMODI
+ SYSTEMTIME t;
+ GetLocalTime(&t);
+ if (ExtAMODI){
+ wsprintf(path+len, /*path_size-len,*/ _T("\\%04d-%02d-%02d-%02d%02d%02d-(%d,%d).bmp"),
+ t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, ptCursor.x, ptCursor.y);
+ } else {
+ wsprintf(path+len, /*path_size-len,*/ _T("\\amodi\\%04d-%02d-%02d-%02d%02d%02d.bmp"),
+ t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
+ SendAMODI(WMCD_SETPOINT, (char*)&ptCursor, sizeof(ptCursor));
+ }
+ HANDLE fh = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (fh!=INVALID_HANDLE_VALUE){
+ DWORD dwSize;
+ WriteFile(fh, lpBuf, dwFSize, &dwSize, NULL);
+ CloseHandle(fh);
+ SaveImageTime = GetTickCount();
+
+ if (capture_page){
+ ok = true;
+ } else {
+ len = (int)_tcslen(path);
+ _tcsncat(path+len, _T(".txt"), path_size-len);
+ if (non_block){
+ CaptureImageBlocking = true;
+ } else {
+ if (WaitAndGetResult(path, 3000))
+ ok = true;
+ }
+ }
+ }
+ }
+ }
+ delete[] lpBuf;
+
+jend:
+ if (!CaptureImageBlocking){
+ if (!capture_page){
+ CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, hwnd );
+ }
+ }
+
+ return ok;
+}
+
+bool WaitAndGetResult(const TCHAR *path, unsigned waittime)
+{
+ bool ok = false;
+
+ // wait and get text from AMODI
+
+ HANDLE fh = WaitForResult(path, waittime);
+
+ CaptureImageBlocking = false;
+
+ if (fh==INVALID_HANDLE_VALUE){
+ DBW("file open timeout");
+ CheckAMODIAlive();
+ } else {
+ DWORD size = GetFileSize(fh, NULL);
+ if (size>0){
+ unsigned bufsize = size+sizeof(wchar_t);
+ char *text = new char[bufsize];
+ if (text){
+ DWORD rbyte;
+ if (ReadFile(fh, text, size, &rbyte, NULL)){
+ if (rbyte==size){
+ *(wchar_t*)&text[size] = '\0';
+ // text\82Ì\82P\8ds\96Ú\82Í\89ð\90Í\8fî\95ñ
+ // format
+ // (\83}\83E\83X\83J\81[\83\\83\8b\82Ì\82 \82é\83e\83L\83X\83g\88Ê\92u[\95¶\8e\9a\96Ú zero-index])
+ int loc = 0;
+ int col = 0;
+ wchar_t *p = (wchar_t*)text;
+ while (*p){
+ wchar_t c = *p++;
+ if (c=='\n'){
+ break;
+ }
+ if (col==0){
+ loc = _wtoi(p);
+ col++;
+ }
+ }
+
+ DBW("%d:%ws", loc, p);
+ CallbackMain(DCH_HITTEXT2, p, bufsize - (int)((char*)p-text), (HWND)loc);
+
+ ok = true;
+ }
+ }
+ delete[] text;
+ }
+ }
+ CloseHandle(fh);
+ DeleteFile(path);
+ }
+ CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, NULL );
+ return ok;
+}
+
+HANDLE WaitForResult(const TCHAR *path, unsigned waittime)
+{
+ HANDLE fh = INVALID_HANDLE_VALUE;
+
+ while (1){
+ fh = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (fh!=INVALID_HANDLE_VALUE)
+ break;
+
+ DWORD now = GetTickCount();
+ if (now-SaveImageTime > waittime)
+ break;
+
+ Sleep(10);
+ }
+
+ return fh;
+}
+
+#define APPNAME _T("Auto MODI")
+
+static HWND hwndFind;
+static BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
+{
+ TCHAR wndname[80];
+ if (GetWindowText(hwnd, wndname, tsizeof(wndname))<0){
+ return TRUE;
+ }
+ if (_tcscmp(wndname, APPNAME)){ return TRUE; }
+
+ COPYDATASTRUCT cd;
+ cd.dwData = WMCD_EXISTCHECK;
+ cd.lpData = (void*)APPNAME;
+ cd.cbData = (DWORD)(_tcslen(APPNAME)+1)*sizeof(TCHAR);
+ if ( SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM)&cd ) )
+ {
+ // found
+ hwndFind = hwnd;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+HWND FindAMODI()
+{
+ hwndFind = NULL;
+ EnumWindows(EnumWindowsProc, 0);
+ return hwndFind;
+}
+
+int SendAMODI(int cmd, const char *data, int len)
+{
+ COPYDATASTRUCT cd;
+ cd.dwData = cmd;
+ cd.lpData = (void*)data;
+ cd.cbData = len;
+ return (int)SendMessage(hwndAMODI, WM_COPYDATA, 0, (LPARAM)&cd);
+}
+
+void CheckAMODIAlive()
+{
+ CallbackMain(DCH_LAUNCH_AMODI, NULL, 0, 0);
+}
+
+void SendMoveMessage()
+{
+#if MOVESEND_POST
+ PostMessage(hwndCallback, WM_MOVESEND, MouseMoving ? 0 : -1, 0);
+#else
+// CallbackMain(DCH_MOVESEND, pt, sizeof(*pt), 0);
+ MouseMoving = true;
+ if (SendMoveEvent) SetEvent(SendMoveEvent);
+#endif
+}
+void SendCancelMove()
+{
+#if MOVESEND_POST
+ PostMessage(hwndCallback, WM_MOVESEND, MouseMoving ? 0 : -1, 0);
+#else
+// CallbackMain(DCH_MOVESEND, NULL, 0, (HWND)-1);
+ MouseMoving = false;
+ if (SendMoveEvent) SetEvent(SendMoveEvent);
+#endif
+}
+
+#if !MOVESEND_POST
+// main program\82ÌWindows message\8f\88\97\9d\82ª\8fd\82¢\82Æ\81ACalblackMain\82à\8fd\82\82È\82é\82½\82ß\81A
+// mouse move\82Í\95Êthread\82Å\8f\88\97\9d
+DWORD WINAPI SendMoveThread(LPVOID vdParam)
+{
+ while(1){
+ if (WaitForSingleObject(SendMoveEvent, INFINITE) != WAIT_OBJECT_0){
+ break;
+ }
+ CallbackMain(DCH_MOVESEND, NULL, 0, (HWND)(MouseMoving ? 0 : -1));
+ }
+ return 0;
+}
+#endif
+
+#if EXC_WOW64 && defined(_M_X64)
+void CheckWOW64()
+{
+ typedef BOOL (WINAPI *FNIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
+
+ FNIsWow64Process _IsWow64Process = (FNIsWow64Process)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
+ if (_IsWow64Process){
+ BOOL flag = FALSE;
+ if (_IsWow64Process(hProcess, &flag)){
+ fWow64 = int_bool(flag);
+ }
+ }
+}
+#endif
+
+bool EnablePrivilege(LPTSTR lpszPrivilege, bool bEnable)
+{
+ BOOL bResult;
+ LUID luid;
+ HANDLE hToken;
+ TOKEN_PRIVILEGES tokenPrivileges;
+
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
+ return false;
+
+ if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
+ CloseHandle(hToken);
+ return false;
+ }
+
+ tokenPrivileges.PrivilegeCount = 1;
+ tokenPrivileges.Privileges[0].Luid = luid;
+ tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
+
+ bResult = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
+
+ CloseHandle(hToken);
+
+ return bResult && GetLastError() == ERROR_SUCCESS;
+}
+
+/*======================================================================//
+// DllMain
+//----------------------------------------------------------------------//
+// Description:
+//
+// Arguments:
+//
+// Return Value:
+//
+//======================================================================*/
+#ifdef _MSC_VER
+BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID )
+#else
+int WINAPI DllEntryPoint(HINSTANCE hInst, DWORD reason, LPVOID)
+#endif
+{
+ switch ( reason ){
+ case DLL_PROCESS_ATTACH:
+ hInstance = hInst;
+ idProcess = GetCurrentProcessId();
+ for (int i=0;i<2;i++){
+ hProcess = OpenProcess( PROCESS_ALL_ACCESS|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, TRUE, idProcess );
+ if ( hProcess ){
+#if USE_DBW
+ DBW("Attach %d(%08X)-%d : %08X", idProcess, hProcess, attach++,_ExtTextOutA);
+#endif
+ break;
+ } else {
+ DBW("OpenProcess Error: %08X %d", idProcess, GetLastError());
+ if (i==0){
+ if (!EnablePrivilege(SE_DEBUG_NAME, true)) {
+ break; // failed
+ }
+ }
+ }
+ }
+#if EXC_WOW64 && defined(_M_X64)
+ CheckWOW64();
+#ifdef _WIN64
+ if (fWow64){
+ DBW("WOW64 true");
+ return FALSE;
+ }
+#else
+ if (!fWow64){
+ DBW("WOW64 false");
+ return FALSE;
+ }
+#endif
+ DBW("fWow64=%d", fWow64);
+#endif
+ if (siPageSize==0){
+ SYSTEM_INFO si;
+ GetSystemInfo( &si );
+ siPageSize = si.dwPageSize;
+ }
+ hInstSHCore = LoadLibrary(_T("shcore.dll"));
+#if !MOVESEND_POST
+ SendMoveEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ CreateThread(NULL , 0 , SendMoveThread , NULL , 0 , &SendMoveThreadId);
+#endif
+ break;
+ case DLL_PROCESS_DETACH:
+// UNPROTECT_SHARE();
+#if !MOVESEND_POST
+ if (SendMoveEvent){
+ CloseHandle(SendMoveEvent);
+ SendMoveEvent = NULL;
+ }
+#endif
+ if (hInstSHCore){
+ FreeLibrary(hInstSHCore);
+ hInstSHCore = NULL;
+ }
+#if USE_DBW
+ DBW("Detach %d-%d", GetCurrentProcessId(),--attach);
+#endif
+ if ( hProcess ){
+ CloseHandle( hProcess );
+ }
+ break;
+ }
+ return TRUE;
+}
+//---------------------------------------------------------------------------
+static HWND hWin = NULL;
+static const char *clsname = "TDbgMsgForm";
+static const char *winname = "Debug Messenger";
+void dbw( const char *format, ... )
+{
+ if ( !hWin ){
+ hWin = FindWindowA( clsname, winname );
+ if ( !hWin ) return;
+ }
+ va_list ap;
+ va_start( ap, format );
+ char buf[ 2048 ];
+#ifdef _WIN64
+ strcpy(buf, "x64:");
+ wvsprintfA( buf+4, format, ap );
+#else
+ wvsprintfA( buf, format, ap );
+#endif
+ COPYDATASTRUCT cds;
+ cds.dwData = 1; // Indicate String
+ cds.cbData = (DWORD)strlen(buf);
+ cds.lpData = buf;
+ SendMessage( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+ va_end( ap );
+}
--- /dev/null
+LIBRARY DCHOOK
+DESCRIPTION 'DC hook for event hot keys'
+
+SECTIONS
+ .sdata READ WRITE SHARED
+ .sbss READ WRITE SHARED
+ .stext READ SHARED
+
+EXPORTS
+ Config @1
+ Init @2
+ Uninit @3
+ Config2 @4
+ Capture @5
+ WaitForCaptureResult @6
+
--- /dev/null
+#ifndef __DCHOOK_H
+#define __DCHOOK_H
+
+struct TDCHConfig {
+ int UseAMODI : 1;
+ int OnlyAMODI : 1;
+ int MoveSend : 1;
+ int OnlyImage : 1;
+ int ScaleX;
+ int ScaleY;
+ char AMODIPath[_MAX_PATH];
+};
+
+extern "C" {
+
+__declspec(dllexport) bool WINAPI Init( HWND, const char *module_name, bool windowsnt, const char *vxd_path );
+__declspec(dllexport) void WINAPI Uninit();
+__declspec(dllexport) unsigned int WINAPI Debug();
+
+typedef bool (WINAPI *FNDCHInit)( HWND, const char *module_name, bool windowsnt, const char *vxd_path );
+typedef void (WINAPI *FNDCHUninit)();
+typedef int (WINAPI *FNDCHConfig)( int clickonly, int keyaction, int keyflag );
+typedef int (WINAPI *FNDCHConfig2)( struct TDCHConfig *cfg );
+typedef int (WINAPI *FNDCHCapture)( HWND hwnd, POINT *pt, bool movesend, bool non_block );
+typedef int (WINAPI *FNDCHWaitForCaptureResult)( bool send_text, unsigned waittime );
+typedef unsigned int (WINAPI *FNDebug)();
+
+}
+
+/* WM_COPYSTRUCT message */
+#define DCH_START 0x1000
+#define DCH_END 0x1001
+#define DCH_EXTTEXTOUTA 0x1002
+#define DCH_EXTTEXTOUTW 0x1003
+#define DCH_HITTEXT1 0x1010
+#define DCH_HITTEXT2 0x1011 // UNICODE\82Ì\82Ý(DCH_HITTEXT2\82Ì\82 \82Æ\81ADCH_HITTEXT3\82ª\82\82é)
+#define DCH_HITTEXT3 0x1012 // ANSI\82Ì\82Ý
+// UNICODE\82Å\88µ\82¢\82½\82¢\8fê\8d\87\82Í\81ADCH_HITTEXT2\82ÆDCH_HITTEXT3\82ð\8eg\97p\82·\82é
+// UNICODE\82Å\88µ\82¢\82½\82\82È\82¢\8fê\8d\87(UNICODE->ANSI\95Ï\8a·\82ð\95K\97v\82Æ\82·\82é\8fê\8d\87)\82Í\81ADCH_HITTEXT1\82Ì\82Ý\82ð\8eg\97p\82·\82é
+#define DCH_MOVESEND 0x0200 // DCH_END\82Æ\82Ì\91g\82Ý\8d\87\82í\82¹ or \92P\91Ì
+
+#define DCH_MENU 0x1100 // DokoPop Menu
+#define DCH_TOGGLE 0x1101 // Toggle Click Only
+#define DCH_LAUNCH_AMODI 0x1102 // Launch AMODI if not alive
+
+/* Do not use 0x12xx!! */
+
+/* Key Definitions */
+#define KA_POPUP 1
+#define KA_MENU 2
+#define KA_TOGGLE 3
+#define KA_POPUP_NC 0x10
+
+#define KF_SHIFT 0x01
+#define KF_CONTROL 0x02
+#define KF_MENU 0x04
+#define KF_LWIN 0x08
+#define KF_RWIN 0x10
+#define KF_APPS 0x20
+#define KF_LEFTCLICK 0x40
+#define KF_CLICKONLY 0x80
+#define KF_LRCLICK 0x100
+#define KF_MIDCLICK 0x200
+
+
+#endif // __DCHOOK_H
+
--- /dev/null
+# Microsoft Developer Studio Generated NMAKE File, Based on DCHook.dsp
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+OUTDIR=.
+INTDIR=.
+# Begin Custom Macros
+OutDir=.\.
+# End Custom Macros
+
+
+ALL : "$(OUTDIR)\DCHook.dll"
+
+
+
+CLEAN :
+ -@erase "$(INTDIR)\dchook.res"
+ -@erase "$(INTDIR)\dchook.obj"
+ -@erase "$(INTDIR)\dchook.sbr"
+ -@erase "$(OUTDIR)\DCHook.dll"
+ -@erase "$(OUTDIR)\DCHook.exp"
+ -@erase "$(OUTDIR)\DCHook.lib"
+ -@erase "$(OUTDIR)\DCHook.map"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /ML /W4 /GX /G4 /GA /O1 /I "$(MSAADEV)\inc32" /D "WIN32" /D "NDEBUG"\
+ /D "_WINDOWS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\DCHook.pch" /YX /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=./
+CPP_SBRS=./
+MTL_PROJ=/nologo /I "$(MSAADEV)\inc32" /D "NDEBUG" /mktyplib203 /win32
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\dchook.res" /i "$(MSAADEV)\inc32" /d "NDEBUG"
+
+LINK32=link.exe
+LINK32_FLAGS=user32.lib kernel32.lib gdi32.lib advapi32.lib \
+ /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)\DCHook.pdb" /map:"$(INTDIR)\DCHook.map" /machine:I386\
+ /def:".\dchook.def" /out:"$(OUTDIR)\DCHook.dll"\
+ /implib:"$(OUTDIR)\DCHook.lib" /libpath:"$(MSAADEV)\lib"
+DEF_FILE= \
+ ".\dchook.def"
+LINK32_OBJS= \
+ "$(INTDIR)\dchook.res" \
+ "$(INTDIR)\dchook.obj"
+
+"$(OUTDIR)\DCHook.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+SOURCE=.\dchook.rc
+
+"$(INTDIR)\dchook.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+SOURCE=.\dchook.cpp
+DEP_CPP_KEYS_= "DCHook.h"
+
+"$(INTDIR)\dchook.obj" : $(SOURCE) $(DEP_CPP_KEYS_) "$(INTDIR)"
+
--- /dev/null
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcxproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.Build.0 = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.ActiveCfg = Debug|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.Build.0 = Debug|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.ActiveCfg = Release|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.Build.0 = Release|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.ActiveCfg = Release|x64
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="DCHook"
+ ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/DCHook.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|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/DCHook.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="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="17"
+ />
+ <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="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\DCHook.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\DCHook.def"
+ >
+ </File>
+ <File
+ RelativePath=".\MonitorScale.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="\83w\83b\83_\81[ \83t\83@\83C\83\8b"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="\83\8a\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\dchook.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8C65CE15-64F8-43E6-968D-DBBB96858BB2}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+ <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)DCHook.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+ <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)DCHook.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+ <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+ <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="DCHook.cpp" />
+ <ClCompile Include="MonitorScale.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="DCHook.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="dchook.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="ソース ファイル">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="ヘッダー ファイル">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="リソース ファイル">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="DCHook.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ <ClCompile Include="MonitorScale.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="DCHook.def">
+ <Filter>ソース ファイル</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="dchook.rc">
+ <Filter>リソース ファイル</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+#include <windows.h>
+#include <tchar.h>
+
+#if WINVER<0x0601
+#define QDC_ALL_PATHS 0x00000001
+#define QDC_ONLY_ACTIVE_PATHS 0x00000002
+#define QDC_DATABASE_CURRENT 0x00000004
+typedef enum
+{
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
+typedef enum
+{
+ DISPLAYCONFIG_ROTATION_IDENTITY = 1,
+ DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
+ DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
+ DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
+ DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_ROTATION;
+typedef enum
+{
+ DISPLAYCONFIG_SCALING_IDENTITY = 1,
+ DISPLAYCONFIG_SCALING_CENTERED = 2,
+ DISPLAYCONFIG_SCALING_STRETCHED = 3,
+ DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
+ DISPLAYCONFIG_SCALING_CUSTOM = 5,
+ DISPLAYCONFIG_SCALING_PREFERRED = 128,
+ DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_SCALING;
+typedef struct DISPLAYCONFIG_RATIONAL
+{
+ UINT32 Numerator;
+ UINT32 Denominator;
+} DISPLAYCONFIG_RATIONAL;
+typedef enum
+{
+ DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
+ DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
+ DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_SCANLINE_ORDERING;
+typedef enum
+{
+ DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
+ DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
+ DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_MODE_INFO_TYPE;
+typedef struct DISPLAYCONFIG_2DREGION
+{
+ UINT32 cx;
+ UINT32 cy;
+} DISPLAYCONFIG_2DREGION;
+typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
+{
+ UINT64 pixelRate;
+ DISPLAYCONFIG_RATIONAL hSyncFreq;
+ DISPLAYCONFIG_RATIONAL vSyncFreq;
+ DISPLAYCONFIG_2DREGION activeSize;
+ DISPLAYCONFIG_2DREGION totalSize;
+ UINT32 videoStandard;
+ DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+} DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
+typedef enum
+{
+ DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
+ DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
+ DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
+ DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
+ DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
+ DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
+} DISPLAYCONFIG_PIXELFORMAT;
+typedef enum
+{
+ DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
+ DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
+ DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
+ DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
+ DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_TOPOLOGY_ID;
+typedef enum
+{
+ DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
+ DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
+ DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
+ DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
+ DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
+ DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_DEVICE_INFO_TYPE;
+
+typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
+{
+ LUID adapterId;
+ UINT32 id;
+ UINT32 modeInfoIdx;
+ UINT32 statusFlags;
+} DISPLAYCONFIG_PATH_SOURCE_INFO;
+typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
+{
+ LUID adapterId;
+ UINT32 id;
+ UINT32 modeInfoIdx;
+ DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
+ DISPLAYCONFIG_ROTATION rotation;
+ DISPLAYCONFIG_SCALING scaling;
+ DISPLAYCONFIG_RATIONAL refreshRate;
+ DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+ BOOL targetAvailable;
+ UINT32 statusFlags;
+} DISPLAYCONFIG_PATH_TARGET_INFO;
+typedef struct DISPLAYCONFIG_PATH_INFO
+{
+ DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
+ DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
+ UINT32 flags;
+} DISPLAYCONFIG_PATH_INFO;
+typedef struct DISPLAYCONFIG_TARGET_MODE
+{
+ DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
+} DISPLAYCONFIG_TARGET_MODE;
+typedef struct DISPLAYCONFIG_SOURCE_MODE
+{
+ UINT32 width;
+ UINT32 height;
+ DISPLAYCONFIG_PIXELFORMAT pixelFormat;
+ POINTL position;
+} DISPLAYCONFIG_SOURCE_MODE;
+typedef struct DISPLAYCONFIG_MODE_INFO
+{
+ DISPLAYCONFIG_MODE_INFO_TYPE infoType;
+ UINT32 id;
+ LUID adapterId;
+ union
+ {
+ DISPLAYCONFIG_TARGET_MODE targetMode;
+ DISPLAYCONFIG_SOURCE_MODE sourceMode;
+ };
+} DISPLAYCONFIG_MODE_INFO;
+typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
+{
+ DISPLAYCONFIG_DEVICE_INFO_TYPE type;
+ UINT32 size;
+ LUID adapterId;
+ UINT32 id;
+} DISPLAYCONFIG_DEVICE_INFO_HEADER;
+
+#endif
+
+typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
+typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
+typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
+typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
+
+class TDllHandle {
+protected:
+ HINSTANCE hInst;
+public:
+ TDllHandle(HINSTANCE _hInst)
+ :hInst(_hInst)
+ {
+ }
+ ~TDllHandle(){
+ if (hInst) FreeLibrary(hInst);
+ }
+ HINSTANCE inst(){ return hInst; }
+ operator HINSTANCE (){ return hInst; }
+ FARPROC GetProcAddress(LPCSTR name)
+ { return ::GetProcAddress(hInst, name); }
+};
+
+static TDllHandle *dllHandle = NULL;
+static FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes;
+static FNQueryDisplayConfig _QueryDisplayConfig;
+static bool called = false;
+static HMONITOR hPrevMonitor = NULL;
+static int prevDpi = 0;
+class TDestructor {
+public:
+ ~TDestructor(){ if (dllHandle){ delete dllHandle; dllHandle = NULL; } }
+} destructor;
+
+int GetMonitorScale()
+{
+ int dpi = 96;
+
+ if (!called){
+ called = true;
+ HINSTANCE hDll = LoadLibrary( _T("user32") );
+ if (!hDll)
+ return dpi;
+
+ TDllHandle hInst(hDll);
+ dllHandle = new TDllHandle(hDll);
+
+ _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)dllHandle->GetProcAddress("GetDisplayConfigBufferSizes");
+ if (!_GetDisplayConfigBufferSizes) return dpi;
+ _QueryDisplayConfig = (FNQueryDisplayConfig)dllHandle->GetProcAddress("QueryDisplayConfig");
+ if (!_QueryDisplayConfig) return dpi;
+ }
+
+ if (!dllHandle) return dpi;
+
+ POINT pt;
+ GetCursorPos( &pt );
+ HMONITOR hMonitor = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL );
+ if (!hMonitor) return dpi;
+
+ if (hMonitor == hPrevMonitor){
+ return prevDpi;
+ }
+ hPrevMonitor = hMonitor;
+
+ MONITORINFOEX LogicalMonitorInfo;
+ LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);
+ GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+ int LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+ int LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+ UINT32 numofpath;
+ UINT32 numofmode;
+ _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
+
+ DISPLAYCONFIG_PATH_INFO *dpis = new DISPLAYCONFIG_PATH_INFO[numofpath];
+ DISPLAYCONFIG_MODE_INFO *pModeInfoArray = new DISPLAYCONFIG_MODE_INFO[numofmode];
+ DISPLAYCONFIG_TOPOLOGY_ID tid;
+ _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid); //TODO: Windows7 or later
+
+ int PhysicalDesktopWidth = LogicalDesktopWidth;
+ int PhysicalMonitorWidth = LogicalMonitorWidth;
+
+ for (int i=0;i<(int)numofmode;i++){
+ if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE){
+ //DBW("%d: %d", i, pModeInfoArray[i].sourceMode.width);
+ PhysicalDesktopWidth = pModeInfoArray[i].sourceMode.width;
+ //int PhysicalDesktopWidth =
+ //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+ //return 96 * 1;
+ } else
+ if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){
+ PhysicalMonitorWidth = pModeInfoArray[i].targetMode.targetVideoSignalInfo.activeSize.cx;
+ //DBW("%d: %d", i, PhysicalMonitorWidth);
+ }
+ }
+
+ //int PhysicalMonitorWidth = pModeInfoArray[i].sourceMode.width;
+ //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+ delete[] dpis;
+ delete[] pModeInfoArray;
+
+ return prevDpi = dpi * PhysicalDesktopWidth / LogicalDesktopWidth;
+}
--- /dev/null
+#ifndef __MonitorScale_h
+#define __MonitorScale_h
+
+int GetMonitorScale();
+
+#endif
--- /dev/null
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug.ActiveCfg = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug.Build.0 = Debug|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release.ActiveCfg = Release|Win32
+ {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="DCHook"
+ ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/DCHook.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/DCHook.lib"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\DCHook.cpp">
+ </File>
+ <File
+ RelativePath="..\DCHook.def">
+ </File>
+ <File
+ RelativePath="..\MonitorScale.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="\83w\83b\83_\81[ \83t\83@\83C\83\8b"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ </Filter>
+ <Filter
+ Name="\83\8a\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File
+ RelativePath="..\dchook.rc">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{B8C9A2E3-2767-45C7-91B5-1B717C3653F3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|Win32.Build.0 = Debug|Win32
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|x64.ActiveCfg = Debug|x64
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|x64.Build.0 = Debug|x64
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|Win32.ActiveCfg = Release|Win32
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|Win32.Build.0 = Release|Win32
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|x64.ActiveCfg = Release|x64
+ {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="DCHook"
+ ProjectGUID="{B8C9A2E3-2767-45C7-91B5-1B717C3653F3}"
+ RootNamespace="DCHook"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ 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|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ 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="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ />
+ <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="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ ModuleDefinitionFile="DCHook.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\DCHook.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\DCHook.def"
+ >
+ </File>
+ <File
+ RelativePath="..\MonitorScale.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="\83w\83b\83_\81[ \83t\83@\83C\83\8b"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="\83\8a\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\dchook.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcxproj", "{16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x64.ActiveCfg = Debug|x64
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x64.Build.0 = Debug|x64
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x86.ActiveCfg = Debug|Win32
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x86.Build.0 = Debug|Win32
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x64.ActiveCfg = Release|x64
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x64.Build.0 = Release|x64
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x86.ActiveCfg = Release|Win32
+ {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>DCHook</RootNamespace>
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\DCHook.cpp" />
+ <ClCompile Include="..\MonitorScale.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\DCHook.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="ソース ファイル">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="ヘッダー ファイル">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="リソース ファイル">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\DCHook.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ <ClCompile Include="..\MonitorScale.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\DCHook.def">
+ <Filter>ソース ファイル</Filter>
+ </None>
+ </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+#ifndef __DCHook64_h
+#define __DCHook64_h
+
+// App -> dchk64.exe
+
+enum eHookDllCmd {
+ HDC_Load = WM_APP+0x100,
+ HDC_Unload,
+ HDC_Init,
+ HDC_Uninit,
+ HDC_Config,
+ HDC_Config2,
+ HDC_Capture,
+ HDC_CaptureAsync,
+ HDC_CaptureAsyncWait,
+ HDC_Debug,
+};
+
+struct HDCInitParam {
+ HWND hwnd;
+ //char module_name[];
+ //bool windowsnt;
+ //const char *vxd_path;
+};
+
+struct HDCConfigParam {
+ int clickonly;
+ int keyaction;
+ int keyflag;
+};
+
+// dchk64.exe -> App
+#define UM_SHORTCUT (WM_APP+33)
+
+// WPARAM value
+#define SCINX_NOTIFY64 (0x1000) // notify from 64bit HookDll
+
+#endif
--- /dev/null
+========================================================================
+ Win32 アプリケーション: dchk64 プロジェクトの概要
+========================================================================
+
+この dchk64 アプリケーションは、AppWizard により作成されました。
+
+このファイルには、dchk64
+アプリケーションを構成する各ファイルの内容の概要が含まれています。
+
+
+dchk64.vcxproj
+ これは、アプリケーション ウィザードを使用して生成された VC++
+ プロジェクトのメイン プロジェクト ファイルです。
+ ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション
+ ウィザードで選択されたプラットフォーム、
+ 構成、およびプロジェクト機能に関する情報が含まれています。
+
+dchk64.vcxproj.filters
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター
+ ファイルです。
+ このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する
+ 情報が含まれています。 この関連付けは、特定のノー
+ ドで同様の拡張子を持つファイルのグループ化を
+ 示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル"
+ フィルターに関連付けられています)。
+
+dchk64.cpp
+ これは、メインのアプリケーション ソース ファイルです。
+
+/////////////////////////////////////////////////////////////////////////////
+AppWizard によって、次のリソースが作成されました。
+
+dchk64.rc
+ これは、プログラムが使用するすべての Microsoft Windows リソースの一覧です。RES
+ サブディレクトリに格納されるアイコン、ビットマップ、
+ およびカーソルをインクルードしています。 このファイルは、Microsoft Visual C++
+ で直接編集できます。
+
+Resource.h
+ これは、新しいリソース ID を定義する標準のヘッダー ファイルです。
+ このファイルの読み込みおよび更新は、Microsoft Visual C++ で行います。
+
+dchk64.ico
+ これは、アプリケーションのアイコン (32x32) として使用されるアイコン
+ ファイルです。
+ このアイコンは、メイン リソース ファイル dchk64.rc
+ にインクルードされます。
+
+small.ico
+ これは、アプリケーションのアイコンの小さいバージョン (16x16) を含むアイコン
+ ファイルです。 このアイコンは、メイン リソース ファイル dchk64.rc
+ にインクルードされます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他の標準ファイル :
+
+StdAfx.h、StdAfx.cpp
+ これらのファイルは、dchk64.pch
+ という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj
+ という名前のプリコンパイル済みの型ファイルを構築するために使用されます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他のメモ :
+
+AppWizard では "TODO:"
+コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース
+コードを示します。
+
+/////////////////////////////////////////////////////////////////////////////
--- /dev/null
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by dchk64.rc
+//
+
+#define IDS_APP_TITLE 103
+
+#define IDR_MAINFRAME 128
+#define IDD_DCHK64_DIALOG 102
+#define IDD_ABOUTBOX 103
+#define IDM_ABOUT 104
+#define IDM_EXIT 105
+#define IDI_DCHK64 107
+#define IDI_SMALL 108
+#define IDC_DCHK64 109
+#define IDC_MYICON 2
+#ifndef IDC_STATIC
+#define IDC_STATIC -1
+#endif
+// \90V\82µ\82¢\83I\83u\83W\83F\83N\83g\82Ì\8e\9f\82Ì\8aù\92è\92l
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NO_MFC 130
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32771
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 110
+#endif
+#endif
--- /dev/null
+// dchk64.cpp : \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83G\83\93\83g\83\8a \83|\83C\83\93\83g\82ð\92è\8b`\82µ\82Ü\82·\81B
+//
+
+#include "stdafx.h"
+#include "dchk64.h"
+#include "../../DCHookTest/HookLoader.h"
+#include "../DCHook64.h"
+
+#define MAX_LOADSTRING 100
+
+// \83O\83\8d\81[\83o\83\8b\95Ï\90\94:
+HINSTANCE hInst; // \8c»\8dÝ\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X
+TCHAR szTitle[MAX_LOADSTRING]; // \83^\83C\83g\83\8b \83o\81[\82Ì\83e\83L\83X\83g
+TCHAR szWindowClass[MAX_LOADSTRING]; // \83\81\83C\83\93 \83E\83B\83\93\83h\83E \83N\83\89\83X\96¼
+
+const char *StrDCHOOKDLL = "DKPUHK64.dll";
+THookLoader HookDll(StrDCHOOKDLL);
+
+HWND hWnd = NULL;
+HWND hwndParent = NULL;
+HANDLE hMutex = NULL;
+bool WindowsNT = true;
+
+#ifdef _DEBUG
+#define DBW dbw
+#else
+#define DBW
+#endif
+void dbw( const char *format, ... );
+
+// \82±\82Ì\83R\81[\83h \83\82\83W\83\85\81[\83\8b\82É\8aÜ\82Ü\82ê\82é\8aÖ\90\94\82Ì\90é\8c¾\82ð\93]\91\97\82µ\82Ü\82·:
+ATOM MyRegisterClass(HINSTANCE hInstance);
+BOOL InitInstance(HINSTANCE, LPTSTR lpCmdLine, int);
+void Cleanup();
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
+
+int atox( const TCHAR *str, TCHAR **next );
+
+int APIENTRY _tWinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPTSTR lpCmdLine,
+ int nCmdShow)
+{
+ UNREFERENCED_PARAMETER(hPrevInstance);
+ //UNREFERENCED_PARAMETER(lpCmdLine);
+
+ MSG msg;
+ HACCEL hAccelTable;
+
+ // \83O\83\8d\81[\83o\83\8b\95¶\8e\9a\97ñ\82ð\8f\89\8aú\89»\82µ\82Ä\82¢\82Ü\82·\81B
+ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ LoadString(hInstance, IDC_DCHK64, szWindowClass, MAX_LOADSTRING);
+ MyRegisterClass(hInstance);
+
+ // \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\8f\89\8aú\89»\82ð\8eÀ\8ds\82µ\82Ü\82·:
+ if (!InitInstance (hInstance, lpCmdLine, nCmdShow))
+ {
+ return FALSE;
+ }
+
+ hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DCHK64));
+
+ // \83\81\83C\83\93 \83\81\83b\83Z\81[\83W \83\8b\81[\83v:
+ while (GetMessage(&msg, NULL, 0, 0))
+ {
+ if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+ Cleanup();
+
+ return (int) msg.wParam;
+}
+
+
+
+//
+// \8aÖ\90\94: MyRegisterClass()
+//
+// \96Ú\93I: \83E\83B\83\93\83h\83E \83N\83\89\83X\82ð\93o\98^\82µ\82Ü\82·\81B
+//
+// \83R\83\81\83\93\83g:
+//
+// \82±\82Ì\8aÖ\90\94\82¨\82æ\82Ñ\8eg\82¢\95û\82Í\81A'RegisterClassEx' \8aÖ\90\94\82ª\92Ç\89Á\82³\82ê\82½
+// Windows 95 \82æ\82è\91O\82Ì Win32 \83V\83X\83e\83\80\82Æ\8cÝ\8a·\82³\82¹\82é\8fê\8d\87\82É\82Ì\82Ý\95K\97v\82Å\82·\81B
+// \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\81A\8aÖ\98A\95t\82¯\82ç\82ê\82½
+// \90³\82µ\82¢\8c`\8e®\82Ì\8f¬\82³\82¢\83A\83C\83R\83\93\82ð\8eæ\93¾\82Å\82«\82é\82æ\82¤\82É\82·\82é\82É\82Í\81A
+// \82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+//
+ATOM MyRegisterClass(HINSTANCE hInstance)
+{
+ WNDCLASSEX wcex;
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hIcon = NULL; //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PDHK64));
+#ifdef _DEBUG
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+#else
+ wcex.hCursor = NULL; //LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = NULL; //(HBRUSH)(COLOR_WINDOW+1);
+#endif
+ wcex.lpszMenuName = NULL; //MAKEINTRESOURCE(IDC_PDHK64);
+ wcex.lpszClassName = szWindowClass;
+ wcex.hIconSm = NULL; //LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
+
+ return RegisterClassEx(&wcex);
+}
+
+//
+// \8aÖ\90\94: InitInstance(HINSTANCE, LPTSTR, int)
+//
+// \96Ú\93I: \83C\83\93\83X\83^\83\93\83X \83n\83\93\83h\83\8b\82ð\95Û\91¶\82µ\82Ä\81A\83\81\83C\83\93 \83E\83B\83\93\83h\83E\82ð\8dì\90¬\82µ\82Ü\82·\81B
+//
+// \83R\83\81\83\93\83g:
+//
+// \82±\82Ì\8aÖ\90\94\82Å\81A\83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Å\83C\83\93\83X\83^\83\93\83X \83n\83\93\83h\83\8b\82ð\95Û\91¶\82µ\81A
+// \83\81\83C\83\93 \83v\83\8d\83O\83\89\83\80 \83E\83B\83\93\83h\83E\82ð\8dì\90¬\82¨\82æ\82Ñ\95\\8e¦\82µ\82Ü\82·\81B
+//
+BOOL InitInstance(HINSTANCE hInstance, LPTSTR lpCmdLine, int nCmdShow)
+{
+ hInst = hInstance; // \83O\83\8d\81[\83o\83\8b\95Ï\90\94\82É\83C\83\93\83X\83^\83\93\83X\8f\88\97\9d\82ð\8ai\94[\82µ\82Ü\82·\81B
+
+ TCHAR ModuleName[_MAX_PATH];
+ GetModuleFileName(NULL, ModuleName, sizeof(ModuleName)/sizeof(TCHAR));
+ hMutex = CreateMutex(NULL, FALSE, ModuleName);
+ if (GetLastError()==ERROR_ALREADY_EXISTS){
+ return FALSE; // dup launched
+ }
+
+#ifdef _DEBUG
+ const int width = 800;
+ const int height = 400;
+#else
+ const int width = 0;
+ const int height = 0;
+#endif
+
+ hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInstance, NULL);
+
+ if (!hWnd)
+ {
+ return FALSE;
+ }
+
+ hwndParent = (HWND)(LONG_PTR)atox(lpCmdLine, NULL);
+ //DBW("hwndParent=%d", (int)(LONG_PTR)hwndParent);
+ if (hwndParent){
+ PostMessage(hwndParent, UM_SHORTCUT, SCINX_NOTIFY64, (LPARAM)hWnd);
+ //DBW("Posted");
+ }
+
+#ifdef _DEBUG
+ ShowWindow(hWnd, nCmdShow);
+ UpdateWindow(hWnd);
+#endif
+
+ return TRUE;
+}
+
+void Cleanup()
+{
+ if (hMutex){
+ CloseHandle(hMutex);
+ hMutex = NULL;
+ }
+}
+
+//
+// \8aÖ\90\94: WndProc(HWND, UINT, WPARAM, LPARAM)
+//
+// \96Ú\93I: \83\81\83C\83\93 \83E\83B\83\93\83h\83E\82Ì\83\81\83b\83Z\81[\83W\82ð\8f\88\97\9d\82µ\82Ü\82·\81B
+//
+// WM_COMMAND - \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83\81\83j\83\85\81[\82Ì\8f\88\97\9d
+// WM_PAINT - \83\81\83C\83\93 \83E\83B\83\93\83h\83E\82Ì\95`\89æ
+// WM_DESTROY - \92\86\8e~\83\81\83b\83Z\81[\83W\82ð\95\\8e¦\82µ\82Ä\96ß\82é
+//
+//
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ //int wmId, wmEvent;
+ PAINTSTRUCT ps;
+ HDC hdc;
+
+ switch (message)
+ {
+ case WM_CREATE:
+ HookDll.Load(hWnd);
+#ifdef _DEBUG
+ {
+ if (!HookDll.Init(hWnd)){
+ DBW("Hook.Init error");
+ }
+#if 0
+ HookDll.Config(-1, KA_POPUP, KF_CONTROL);
+ TDCHConfig cfg;
+ memset(&cfg, 0, sizeof(cfg));
+ cfg.UseAMODI = 0;
+ cfg.MoveSend = 0;
+ cfg.ScaleX = 0;
+ cfg.ScaleY = 0;
+ HookDll.Config2(&cfg);
+#endif
+ }
+#endif
+ break;
+#if 0
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // \91I\91ð\82³\82ê\82½\83\81\83j\83\85\81[\82Ì\89ð\90Í:
+ switch (wmId)
+ {
+ case IDM_ABOUT:
+ DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
+ break;
+ case IDM_EXIT:
+ DestroyWindow(hWnd);
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ break;
+#endif
+ case WM_PAINT:
+ hdc = BeginPaint(hWnd, &ps);
+ EndPaint(hWnd, &ps);
+ break;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+
+ case WM_COPYDATA:
+ {
+ COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
+ if ( !cds ) break;
+ switch (cds->dwData){
+ case HDC_Init:
+ {
+ HDCInitParam &p = *(HDCInitParam*)cds->lpData;
+ return HookDll.Init(p.hwnd);
+ }
+ case HDC_Uninit:
+ HookDll.Uninit();
+ break;
+ case HDC_Config:
+ {
+ HDCConfigParam &p = *(HDCConfigParam*)cds->lpData;
+ return HookDll.Config(p.clickonly, p.keyaction, p.keyflag);
+ }
+ case HDC_Config2:
+ return HookDll.Config2((TDCHConfig*)cds->lpData);
+ case HDC_Capture:
+ return HookDll.Capture();
+ case HDC_CaptureAsync:
+ return HookDll.CaptureAsync();
+ case HDC_CaptureAsyncWait:
+ return HookDll.CaptureAsyncWait();
+ case HDC_Debug:
+ return HookDll.Debug();
+ }
+ }
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ return 0;
+}
+
+int atox( const TCHAR *str, TCHAR **next )
+{
+ unsigned val = 0;
+ while ( 1 )
+ {
+ TCHAR c = *str;
+ if ( c >= '0' && c <= '9' ){
+ val = (val<<4) + (c - '0');
+ } else if ( c >= 'A' && c <= 'F' ){
+ val = (val<<4) + ( c - 'A' + 10 );
+ } else if ( c >= 'a' && c <= 'f' ){
+ val = (val<<4) + ( c - 'a' + 10 );
+ } else {
+ break;
+ }
+ str++;
+ }
+ if ( next ) *next = (TCHAR*)str;
+ return val;
+}
+
+static HWND hWin = NULL;
+static const TCHAR *clsnameW = _T("TDbgMsgForm");
+static const TCHAR *winnameW = _T("Debug Messenger");
+
+void dbw( const char *format, ... )
+{
+ if ( !hWin ){
+ hWin = FindWindow( clsnameW, winnameW );
+ if ( !hWin ) return;
+ }
+ va_list ap;
+ va_start( ap, format );
+ char buf[ 2048 ];
+ wvsprintfA( buf, format, ap );
+ COPYDATASTRUCT cds;
+ cds.dwData = 1; // Indicate String
+ cds.cbData = (DWORD)strlen(buf)+1;
+ cds.lpData = buf;
+ SendMessageA( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+ va_end( ap );
+}
+
+static const char *MyWinTitle = "<Processing...>";
+HANDLE WinExecEx( const char *cmd, int show, const char *dir, const char *title )
+{
+ STARTUPINFO sui;
+ memset( &sui, 0, sizeof(STARTUPINFO) );
+ sui.cb = sizeof(STARTUPINFO);
+ sui.dwFlags = STARTF_USESHOWWINDOW;
+ sui.wShowWindow = (WORD)show;
+ sui.lpTitle = (LPTSTR)(title ? title : MyWinTitle);
+ PROCESS_INFORMATION pi;
+ if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+ return NULL;
+ return pi.hProcess;
+}
--- /dev/null
+#pragma once
+
+#include "resource.h"
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dchk64", "dchk64.vcxproj", "{5CBB6025-CCD7-40F7-8279-2B633DFA63CA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|Win32.Build.0 = Debug|Win32
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|x64.ActiveCfg = Debug|x64
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|x64.Build.0 = Debug|x64
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|Win32.ActiveCfg = Release|x64
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|Win32.Build.0 = Release|x64
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|x64.ActiveCfg = Release|x64
+ {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{5CBB6025-CCD7-40F7-8279-2B633DFA63CA}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>dchk64</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <None Include="dchk64.ico" />
+ <None Include="ReadMe.txt" />
+ <None Include="small.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="dchk64.h" />
+ <ClInclude Include="Resource.h" />
+ <ClInclude Include="stdafx.h" />
+ <ClInclude Include="targetver.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\DCHookTest\HookLoader.cpp" />
+ <ClCompile Include="dchk64.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="dchk64.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="ソース ファイル">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="ヘッダー ファイル">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="リソース ファイル">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="ReadMe.txt" />
+ <None Include="small.ico">
+ <Filter>リソース ファイル</Filter>
+ </None>
+ <None Include="dchk64.ico">
+ <Filter>リソース ファイル</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="targetver.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="Resource.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="dchk64.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ <ClCompile Include="dchk64.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\DCHookTest\HookLoader.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="dchk64.rc">
+ <Filter>リソース ファイル</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h dchk64.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83X \83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
--- /dev/null
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN // Windows \83w\83b\83_\81[\82©\82ç\8eg\97p\82³\82ê\82Ä\82¢\82È\82¢\95\94\95ª\82ð\8f\9c\8aO\82µ\82Ü\82·\81B
+// Windows \83w\83b\83_\81[ \83t\83@\83C\83\8b:
+#include <windows.h>
+
+// C \83\89\83\93\83^\83C\83\80 \83w\83b\83_\81[ \83t\83@\83C\83\8b
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
--- /dev/null
+#pragma once
+
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\82Æ\81A\97\98\97p\82Å\82«\82é\8dÅ\82à\8fã\88Ê\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\82ª\92è\8b`\82³\82ê\82Ü\82·\81B
+
+// \88È\91O\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\97p\82É\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83r\83\8b\83h\82·\82é\8fê\8d\87\82Í\81AWinSDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82µ\81A
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\91O\82É\81A\83T\83|\81[\83g\91Î\8fÛ\82Æ\82·\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8e¦\82·\82æ\82¤\82É _WIN32_WINNT \83}\83N\83\8d\82ð\90Ý\92è\82µ\82Ü\82·\81B
+
+#include <SDKDDKVer.h>
--- /dev/null
+#include <windows.h>
+#pragma hdrstop
+#include <tchar.h>
+#include <System.hpp>
+#include "StringLib.h"
+#include "DCHookLoader.h"
+#include "HookLoader.h"
+#include "Util.h"
+
+// LoadHook()\82Íapplication\97§\82¿\8fã\82ª\82è\8e\9e\81A\82Ü\82½\82ÍConfiguration\8e\9e\82É\82P\89ñ\82¾\82¯\8cÄ\82Î\82ê\82é
+// UnloadHook()\82ÍLoadHook()\82Æ\95K\82¸\91Î\82Å\8eg\97p\82·\82é
+
+#define USE_HOOK64 1
+
+#if USE_HOOK64
+#define IsWow64() (fWow64)
+#else
+#define IsWow64() (false)
+#endif
+
+/// THookArray ///
+THookArray::~THookArray()
+{
+ clear();
+}
+
+bool THookArray::Load(HWND hwnd)
+{
+ bool ret = true;
+ foreach(Hooks, it, hook_vec){
+ if (!(*it)->Load(hwnd)){
+ ret = false;
+ break;
+ }
+ }
+ return ret;
+}
+void THookArray::Unload()
+{
+ foreach(Hooks, it, hook_vec){
+ (*it)->Unload();
+ }
+}
+void THookArray::Uninit()
+{
+ foreach(Hooks, it, hook_vec){
+ (*it)->Uninit();
+ }
+}
+bool THookArray::Init(HWND hwnd)
+{
+ DBW("HookArray::Init");
+ bool ret = true;
+#if 0 // debug code
+ DBW("Init1"); Hooks[1]->Init(hwnd); // 64bit
+ DBW("Init0"); Hooks[0]->Init(hwnd); // 32bit
+#else
+ foreach(Hooks, it, hook_vec){
+ if (!(*it)->Init(hwnd)){
+ ret = false;
+ }
+ }
+#endif
+ return ret;
+}
+void THookArray::Init32(HWND hwnd)
+{
+ Hooks[0]->Init(hwnd);
+}
+int THookArray::Config( int clickonly, int keyaction, int keyflag )
+{
+ foreach(Hooks, it, hook_vec){
+ (*it)->Config(clickonly, keyaction, keyflag);
+ }
+ return 0;
+}
+int THookArray::Config2( struct TDCHConfig *cfg )
+{
+ foreach(Hooks, it, hook_vec){
+ (*it)->Config2(cfg);
+ }
+ return 0;
+}
+int THookArray::Capture()
+{
+ int ret = 0;
+ foreach(Hooks, it, hook_vec){
+ if ((*it)->Capture())
+ ret = 1;
+ }
+ return ret;
+}
+int THookArray::CaptureAsync()
+{
+ int ret = 0;
+ foreach(Hooks, it, hook_vec){
+ if ((*it)->CaptureAsync())
+ ret = 1;
+ }
+ return ret;
+}
+int THookArray::CaptureAsyncWait()
+{
+ int ret = 0;
+ foreach(Hooks, it, hook_vec){
+ int r = (*it)->CaptureAsyncWait();
+ if (r!=0){
+ ret = r;
+ break;
+ }
+ }
+ return ret;
+}
+int THookArray::Debug()
+{
+ int ret = 0;
+ foreach(Hooks, it, hook_vec){
+ int r = (*it)->Debug();
+ if (r)
+ ret = r;
+ }
+ return ret;
+}
+
+void THookArray::clear()
+{
+ Uninit();
+ foreach(Hooks, it, hook_vec){
+ delete *it;
+ }
+ Hooks.clear();
+}
+
+bool THookArray::IsLoaded()
+{
+ if (Hooks.size()==0)
+ return false;
+ return Hooks[0]->IsLoaded();
+}
+
+/// TDCHookLoader ///
+TDCHookLoader::TDCHookLoader(bool use64)
+ :Use64(use64)
+{
+ EnableSendAllKeys = false;
+ Hook64 = NULL;
+ Hook32 = NULL;
+ LoadPending = false;
+}
+#if !defined(DSKSVR) && !defined(DCHOOK)
+void TDCHookLoader::SaveProfile(const tchar *param_string)
+{
+ prof.WriteString(PFS_SHORTCUT, StrParams, param_string);
+}
+
+tnstr TDCHookLoader::LoadProfile()
+{
+ return prof.ReadString(PFS_SHORTCUT, StrParams, _T(""));
+}
+#endif
+
+bool TDCHookLoader::LoadHook( HWND hwndParent )
+{
+ if (Hooks.IsLoaded() || LoadPending) return true;
+
+ if (Hooks.size()==0){
+ Hooks.add(Hook32 = new THookLoader(NAME_DKPPHKDLL) );
+#ifdef _DEBUG
+ if (!DebugHook)
+#endif
+ {
+ if (Use64 && IsWow64()){
+ Hooks.add(Hook64 = new THookLoader64(hwndParent));
+ }
+ }
+ }
+
+ if (!Hooks.Load(hwndParent)){
+ DBW("Hooks.Load failed");
+ return false;
+ }
+
+ if (Hook64 && Hook64->IsPending()){
+ LoadPending = true;
+ hwndSavedParent = hwndParent;
+ return true;
+ }
+
+ LoadHookPost(hwndParent);
+
+ return true;
+}
+
+void TDCHookLoader::LoadHookPost(HWND hwndParent)
+{
+ Hooks.Init(hwndParent);
+#if 0
+ int num = LoadKeyProfiles();
+ if ( num > 0 || EnableSendAllKeys ){
+ if ( !Hooks.InitHook( hwndParent, UM_SHORTCUT ) ){
+ num = 0;
+ }
+ }
+
+#if !defined(DSKSVR) && !defined(DCHOOK)
+ //Note: SendAllKeys\82ð\97L\8cø\82É\82·\82é\82Æ32bitApp\8fã\82Å\93ñ\8fd\82É\83C\83x\83\93\83g\82ª\91\97\82ç\82ê\82Ä\82\82é\81B\81i\8c´\88ö\95s\96¾\81j
+ // \82»\82Ì\82½\82ß\82±\82Ì\90Ý\92è\82¾\82¯\82Í32bit\91¤\82¾\82¯\97L\8cø\82É\82·\82é\81B
+ // \81i64bitApp\8fã\82Å\82Í\93ñ\8fd\82É\82È\82ç\82È\82¢\81j
+ // \82È\82¨\81A64bitHook\82¾\82¯\82ðload\82µ\82½\8fê\8d\87\82Í\83C\83x\83\93\83g\82ª\82Ü\82Á\82½\82\82±\82È\82\82È\82é\81i\82±\82ê\82à\8c´\88ö\95s\96¾\81j
+ if (Hook32)
+ Hook32->Add( NULL, EnableSendAllKeys, FUNC_SENDALLKEYS );
+#endif
+
+ if ( num == 0 && !EnableSendAllKeys ){
+ Hooks.Unload();
+ }
+#endif
+}
+
+void TDCHookLoader::UnloadHook()
+{
+ LoadPending = false;
+ if (!Hooks.IsLoaded()){
+ return;
+ }
+ //Hooks.FinishHook();
+ Hooks.Uninit();
+ Hooks.Unload();
+ //if ( fWindowsNT )
+ {
+#if 1 // \82µ\82Î\82ç\82\82Í\82±\82Á\82¿\82Ì\95û\96@(C++Builder\82ª\91Î\89\9e\82µ\82Ä\82¢\82È\82¢ - \82Æ\82¢\82¤\82©\81AMS\82Ìbug\82Å\82¤\82Ü\82link\82Å\82«\82È\82¢)
+ typedef long (WINAPI *FNBroadcastSystemMessage)
+ (DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);
+ HINSTANCE hDll = LoadLibrary( _T("user32") );
+ if ( hDll ){
+ FNBroadcastSystemMessage _BroadcastSystemMessage = (FNBroadcastSystemMessage)GetProcAddress( hDll, "BroadcastSystemMessage");
+ if ( _BroadcastSystemMessage ){
+ UINT msg = RegisterWindowMessage( _T("wmBroadcastForUnhook") );
+ if ( msg ){
+ DWORD receipt = BSM_APPLICATIONS;
+ _BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 ); // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
+ }
+ }
+ FreeLibrary( hDll );
+ }
+#else
+ UINT msg = RegisterWindowMessage( "wmBroadcastForUnhook" );
+ DWORD receipt = BSM_APPLICATIONS;
+ BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 ); // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
+#endif
+ }
+}
+
+void TDCHookLoader::Config( int clickonly, int keyaction, int keyflag )
+{
+ Hooks.Config(clickonly, keyaction, keyflag);
+}
+void TDCHookLoader::Config2( struct TDCHConfig *cfg )
+{
+ Hooks.Config2(cfg);
+}
+
+void TDCHookLoader::Capture()
+{
+ Hooks.Capture();
+}
+void TDCHookLoader::CaptureAsync()
+{
+ Hooks.CaptureAsync();
+}
+void TDCHookLoader::CaptureAsyncWait()
+{
+ Hooks.CaptureAsyncWait();
+}
+void TDCHookLoader::Init32(HWND hwnd)
+{
+ Hooks.Init32(hwnd);
+}
+
+void TDCHookLoader::Notify64(LPARAM lParam)
+{
+ DBW("Notify64 : lParam=%08X Hook64=%08X", lParam, Hook64);
+ if (!Hook64 || !lParam)
+ return;
+ Hook64->Notify64();
+ Hook64->SetTarget((HWND)lParam);
+ if (LoadPending){
+ LoadHookPost(hwndSavedParent);
+ LoadPending = false;
+ }
+}
+
--- /dev/null
+#ifndef __DCHookLoader_h
+#define __DCHookLoader_h
+
+#include <vector>
+using namespace std;
+
+enum eShortCutIndexes {
+ SCINX_AUTOSRCH_TOGGLE,
+ SCINX_AUTOSRCH_ON,
+ SCINX_AUTOSRCH_OFF,
+ SCINX_TOPMOST,
+ SCINX_TO_MAIN,
+ SCINX_QUICK_POPUP,
+ SCINX_POPUP_WINDOW,
+ SCINX_GROUP_CHANGE_1,
+ SCINX_GROUP_CHANGE_2,
+ SCINX_GROUP_CHANGE_3,
+ SCINX_GROUP_CHANGE_4,
+ SCINX_CBDSRCH,
+ SCINX_CLIPHISTORY,
+ SCINX_TAB_CHANGE_1,
+ SCINX_TAB_CHANGE_2,
+ SCINX_TAB_CHANGE_3,
+ SCINX_TAB_CHANGE_4,
+ SCINX_LAST,
+};
+
+#define SCINX_NOTIFY64 (0x1000) // notify from 64bit HookDll
+
+#include "HookDll.h"
+
+class THookArray : public THookDllI {
+protected:
+ typedef vector<THookDllI*> hook_vec;
+ vector<THookDllI*> Hooks;
+public:
+ virtual ~THookArray();
+ void add(THookDllI*dll)
+ {
+ Hooks.push_back(dll);
+ }
+ int size() const
+ { return Hooks.size(); }
+ virtual bool Load(HWND hwnd);
+ virtual void Unload();
+
+ virtual bool Init(HWND hwnd);
+ void Init32(HWND hwnd);
+ virtual void Uninit();
+ virtual int Config( int clickonly, int keyaction, int keyflag );
+ virtual int Config2( struct TDCHConfig *cfg );
+ virtual int Capture();
+ virtual int CaptureAsync();
+ virtual int CaptureAsyncWait();
+ virtual int Debug();
+ virtual bool IsLoaded();
+ THookDllI &operator [](int i)
+ { return *Hooks[i]; }
+protected:
+ void clear();
+};
+
+class TDCHookLoader {
+protected:
+ bool Use64;
+ bool EnableSendAllKeys;
+ THookArray Hooks;
+ class THookLoader64 *Hook64; // reference pointer
+ class THookLoader *Hook32; // reference pointer
+ bool LoadPending;
+ HWND hwndSavedParent;
+public:
+ TDCHookLoader(bool use64);
+ bool LoadHook( HWND hwndParent );
+ void UnloadHook();
+ void Config( int clickonly, int keyaction, int keyflag );
+ void Config2( struct TDCHConfig *cfg );
+ void Capture();
+ void CaptureAsync();
+ void CaptureAsyncWait();
+
+ // for 64bit OS
+ void Notify64(LPARAM lParam);
+ bool IsReady() const
+ { return !LoadPending; }
+
+ void Init32(HWND hwnd); // for debug
+protected:
+ void LoadHookPost(HWND hwndParent);
+ int LoadKeyProfiles( );
+};
+
+extern ::TDCHookLoader shortcut;
+
+#endif // __DCHookLoader_h
+
--- /dev/null
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+#include <tchar.h>
+#include "DCHookMain.h"
+#include <stdio.h>
+#include <shellapi.h>
+#include "StringLib.h"
+#include "PopupConfig.h"
+#include "Notify.h"
+#include "DCHookLoader.h"
+#include "prgprof.h"
+#include "MODINotifyDlg.h"
+#include "prgconfig.h"
+#include "OCRTextFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+
+/*------------------------------------------*/
+/* Configuration */
+/*------------------------------------------*/
+// Popup\82Ì\82½\82Ñ\82ÉDLL\82ðUnload/Load\82·\82é
+// \94½\89\9e\82µ\82È\82\82È\82Á\82½\82Æ\82«\82Ì\82½\82ß\82Ì\91Î\8fÇ\97Ã\96@
+// Note: 2013.3.12
+// inc.srch ON\82Ì\82Æ\82«\81AMoveSent\82ª\8fí\82Éreset\82³\82ê\82Ä\82µ\82Ü\82¤\82½\82ß\81A
+// mouse\82ªstill\8fó\91Ô\82Å\82 \82Á\82Ä\82à\89½\93x\82àinc.srch\82Ì\83\8a\83N\83G\83X\83g\82ª\82â\82Á\82Ä\82\82é\81B
+// \82Ù\82©\81Apopup/inc.srch\82ð\82â\82é\82½\82Ñ\82ÉDLL\93à\82Ì\95Ï\90\94\82ªreset\82³\82ê\82é\82½\82ß\82±\82ê\82Í\82æ\82ë\82µ\82\82È\82¢\81B
+#define DETACHRELEASE 0
+
+#define MIGROUP_INDEX 1 // \8e«\8f\91\83O\83\8b\81[\83v\95Ï\8dX\83\81\83j\83\85\81[\82Ìindex
+
+// PDIC\8bN\93®\8cã\82ÌOpenLink()\8e¸\94s\8e\9e\82Ìretry\82¨\82æ\82Ñwaittime
+#define OPEN_RETRY 5
+#define OPEN_WAITTIME 500 // [mSec]
+
+#define DPI_DETECT 0 // DPI Detect in main (monitor\82²\82Æ\82Ì\90Ý\92è\82ª\82Å\82«\82È\82¢\82½\82ßdebug\97p)
+
+#define DEF_USE64 (false)
+
+/*------------------------------------------*/
+/* Definitions */
+/*------------------------------------------*/
+#define URL_MODI_INSTALL "http://support.microsoft.com/kb/982760"
+
+#define DEF_POPUPKEY (KF_CONTROL)
+#define DEF_TOGGLEKEY (KF_CONTROL+KF_MENU)
+
+#define WM_AMODI (WM_APP+0x400) // app communication message with AMODI
+
+#define FLG_MOVESEND 0x40000000 // mouse move send
+
+#pragma resource "*.dfm"
+TDCHookMainForm *DCHookMainForm;
+
+#define COMPANYNAME "Software\\DokoPopProject\\"
+
+bool Reboot = false;
+
+/*------------------------------------------*/
+/* Prototypes */
+/*------------------------------------------*/
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data );
+#ifdef USE_UNICODE
+// Unicode\82Å\93n\82·\8fê\8d\87
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data );
+#endif;
+void GetGroupList(TMyIni &ini, TStringList &list);
+#if DPI_DETECT
+int GetMonitorScale();
+#endif
+
+//---------------------------------------------------------------------------
+__fastcall TDCHookMainForm::TDCHookMainForm(TComponent* Owner)
+ : TForm(Owner)
+{
+ hDll = NULL;
+ EnablePopup = true;
+
+ WindowsNT = false;
+
+ OSVERSIONINFO VersionInfo;
+ VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&VersionInfo);
+ switch (VersionInfo.dwPlatformId){
+ case VER_PLATFORM_WIN32_NT:
+ WindowsNT = true;
+ break;
+ }
+ CheckWOW64();
+ BootUp = true;
+ Capturing = false;
+ PopupText = NULL;
+ DoPopupRetry = 0;
+ CaptureMode = CM_TEXT | CM_IMAGE;
+ AMODIAvail = false;
+ MouseIncSrch = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormCreate(TObject *Sender)
+{
+ Ini = new TMyIni( HKEY_CURRENT_USER, COMPANYNAME APPREGNAME, true );
+// DBW("Handle=%08X",Handle);
+
+#ifdef _DEBUG
+ Left = Ini->ReadInteger( PFS_MAIN, "Left", Left );
+ Top = Ini->ReadInteger( PFS_MAIN, "Top", Top );
+ Width = Ini->ReadInteger( PFS_MAIN, "Width", Width );
+ Height = Ini->ReadInteger( PFS_MAIN, "Height", Height );
+#endif
+
+ GroupOpen = Ini->ReadInteger( PFS_CONFIG, PFS_GROUPOPEN, false );
+ GroupName = Ini->ReadString( PFS_CONFIG, PFS_GROUPNAME, "" );
+ CtrlClose = Ini->ReadInteger( PFS_CONFIG, PFS_CTRLCLOSE, false );
+ IgnoreJ = Ini->ReadInteger( PFS_CONFIG, PFS_IGNOREJ, true );
+ Banner = Ini->ReadInteger( PFS_CONFIG, PFS_BANNER, true );
+
+#ifndef _DEBUG
+ BorderStyle = bsNone;
+
+ Memo->Visible = false;
+ Panel1->Visible = false;
+ Splitter1->Visible = false;
+ Menu->Items->Delete( 0 );
+ Image->Visible = true;
+// Title->Caption = Title->Caption + " " + StrVersion;
+// Title->Align = alBottom;
+#if 0
+ Title->Visible = true;
+#endif
+
+ AnsiString bmp = ExtractFilePath( Application->ExeName );
+ bmp += NAME_BMPFILE;
+ if ( FileExists( bmp ) ){
+ Image->Picture->Bitmap->LoadFromFile( bmp );
+ }
+
+ Width = Image->Picture->Width;
+ Height = Image->Picture->Height;
+
+ // To center
+ Left += ( ( ( GetSystemMetrics( SM_CXSCREEN ) - ( Width ) ) / 2 + 4 ) & ~7 ) - Left;
+ Top += ( ( GetSystemMetrics( SM_CYSCREEN ) - ( Height ) ) / 2 ) - Top;
+#endif
+
+ SavedWidth = Width;
+
+#ifdef _DEBUG
+ BootTimer->Interval = 100;
+ Width = SavedWidth;
+ WindowState = wsNormal;
+#else
+ if ( !Banner ){
+ BootTimer->Interval = 10;
+ // \82È\82ñ\82ÆVisible = false;\82É\82·\82é\82Æ\81A
+ // \83A\83C\83R\83\93\89»\82µ\82½\82Æ\82«\81E\81E\81E\83A\83C\83R\83\93\82ª\95\\8e¦\82³\82ê\82é
+ // \83A\83C\83R\83\93\89»\82µ\82È\82¢\82Æ\82«\81E\81E\83A\83C\83R\83\93\82Í\8fo\82Ä\82±\82È\82¢
+ // \95Ï\82È\8ed\97l\81H
+ // \82Æ\82¢\82¤\82í\82¯\82Å\95\9d\82ð\83[\83\8d\82É\82µ\82ÄWindow\82ð\94ñ\95\\8e¦\89»\82Æ\82¤\82¢\8e×\93¹\82È\95û\96@
+ // \8dÅ\8f\89\82©\82ç\82¸\82Á\82ÆVisible=false\82Æ\82¢\82¤\95û\96@\82à\82 \82é\82ª\81A
+ // VCL\82ªMainWindow\82ð\95K\82¸visible\82É\82·\82é\8f\88\97\9d\82ð\8ds\82Á\82Ä\82¢\82é\82½\82ß\95s\89Â\94\
+ // \82Ù\82©\82É\82¢\82¢\95û\96@\82ª\82 \82Á\82½\82æ\82¤\82È\8bC\82ª\82·\82é\82ª\81A\81A\81A\81A
+ Width = 0;
+ } else {
+ Visible = true; // \8dÅ\8f¬\89»\82Å\8bN\93®\82·\82é\82Æ\81A\83A\83C\83R\83\93\95\\8e¦\82ª\8fÁ\82¦\82È\82¢\82½\82ß\81B
+ // \82±\82Ì\95û\96@\82ª\93K\93\96\82Å\82 \82é\82©\82Ç\82¤\82©\90[\82\8dl\82¦\82Ä\82¢\82È\82¢\81E\81E
+ // (\82½\82Ü\82½\82Ü\82¤\82Ü\82\93®\82¢\82½:-)
+ Width = SavedWidth;
+ WindowState = wsNormal;
+ }
+#endif
+
+ //TODO: default=ON\82É\82·\82é\82Æ\95s\88À\92è\82É\82È\82é\82Ì\82Å\82µ\82Î\82ç\82def=false
+ //MouseIncSrch = Ini->ReadInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
+ CaptureMode = Ini->ReadInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
+ InitAMODI();
+ btnOK->Left = (SavedWidth - btnOK->Width)>>1;
+ btnOK->Top = Height - btnOK->Height - 8;
+ lbVersion->Caption = StrVersion;
+ lbVersion->Left = btnOK->Left + btnOK->Width + 4;
+ lbVersion->Top = btnOK->Top;
+
+ BootTimer->Enabled = true;
+
+ if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+ tmMODINotify->Enabled = true;
+ }
+
+// Application->OnIdle = IdleHandler;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormCloseQuery(TObject *Sender,
+ bool &CanClose)
+{
+ if (AMODIAvail){
+ TerminateAMODI();
+ }
+ if (OCRTextForm){
+ OCRTextForm->Visible = false;
+ delete OCRTextForm;
+ OCRTextForm = NULL;
+ }
+ RegisterTrayIcon( false );
+#ifdef _DEBUG
+ WINDOWPLACEMENT wp;
+ wp.length = sizeof(WINDOWPLACEMENT);
+ GetWindowPlacement( Handle, &wp );
+ RECT &rc = wp.rcNormalPosition;
+ Ini->WriteInteger( PFS_MAIN, "Left", rc.left );
+ Ini->WriteInteger( PFS_MAIN, "Top", rc.top );
+ Ini->WriteInteger( PFS_MAIN, "Width", rc.right - rc.left );
+ Ini->WriteInteger( PFS_MAIN, "Height", rc.bottom - rc.top );
+#endif
+
+ miUnhookClick( this );
+
+ delete Ini;
+ if (PopupText){
+ delete[] PopupText;
+ PopupText = NULL;
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormKeyPress(TObject *Sender, char &Key)
+{
+#ifndef _DEBUG
+ if ( Key == 0x1b ){
+ Key = 0;
+ Start();
+ }
+#endif
+}
+#if 0
+void __fastcall TDCHookMainForm::IdleHandler(TObject *sender, bool &done)
+{
+ if (NotifyAMODIEnabled){
+ NotifyAMODIEnabled = false;
+ NotifyAMODI();
+ }
+}
+#endif
+//---------------------------------------------------------------------------
+// Menu event
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miDicGroup(TObject *Sender)
+{
+ // \8e«\8f\91\83O\83\8b\81[\83v
+ AnsiString name = ((TMenuItem*)Sender)->Caption;
+ if ( name.Length() ){
+ OpenDicGroup( name.c_str() );
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miClickOnlyClick(TObject *Sender)
+{
+ miClickOnly->Checked = !miClickOnly->Checked;
+ EnableClickOnly( miClickOnly->Checked );
+ MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miIncSearchClick(TObject *Sender)
+{
+ miIncSearch->Checked = !miIncSearch->Checked;
+ MouseIncSrch = miIncSearch->Checked;
+ Ini->WriteInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
+ SetupConfig2();
+ if (MouseIncSrch){
+ HWND hwnd = FindPdic();
+ if (hwnd){
+ MoveToTop(hwnd);
+ }
+ }
+}
+//---------------------------------------------------------------------------
+#if 0 // change capture mode
+ if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+ InitAMODI();
+ }
+ if (AMODIAvail){
+ SetupConfig2();
+ } else {
+ NotifyAMODI();
+ }
+
+ MenuClosed();
+#endif
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miEnablePopupClick(TObject *Sender)
+{
+ if ( miEnablePopup->Checked ){
+ miUnhookClick( this );
+ EnablePopup = false;
+ } else {
+ miHookClick( this );
+ EnablePopup = true;
+ }
+ MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miOCRTextClick(TObject *Sender)
+{
+ if (!OCRTextForm) OCRTextForm = new TOCRTextForm(this);
+ OCRTextForm->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miOptionClick(TObject *Sender)
+{
+ if (PopupConfigDlg){
+ MoveToTop(PopupConfigDlg->Handle);
+ return;
+ }
+
+ // Configuration //
+ PopupConfigDlg = new TPopupConfigDlg( this );
+ PopupConfigDlg->cbGroupOpen->Checked = GroupOpen;
+ PopupConfigDlg->edGroupName->Text = GroupName;
+ PopupConfigDlg->SetPopupKey( Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
+ PopupConfigDlg->SetToggleKey( Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
+ PopupConfigDlg->cbCtrlClose->Checked = CtrlClose;
+ PopupConfigDlg->cbIgnoreJ->Checked = IgnoreJ;
+ PopupConfigDlg->cbBanner->Checked = Banner;
+ bool useAMODI = CaptureMode & CM_IMAGE ? true : false;
+ PopupConfigDlg->SetCaptureMode( CaptureMode );
+ PopupConfigDlg->SetScaler( Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0) );
+ PopupConfigDlg->edAMODIPath->Text = AMODIPath;
+ PopupConfigDlg->SetMODIAvail( AMODIAvail );
+ bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, DEF_USE64);
+ PopupConfigDlg->cbUse64->Checked = use64;
+ SetForegroundWindow( PopupConfigDlg->Handle );
+ if ( PopupConfigDlg->ShowModal() == IDOK ){
+ GroupOpen = PopupConfigDlg->cbGroupOpen->Checked;
+ GroupName = PopupConfigDlg->edGroupName->Text;
+ CtrlClose = PopupConfigDlg->cbCtrlClose->Checked;
+ IgnoreJ = PopupConfigDlg->cbIgnoreJ->Checked;
+ Banner = PopupConfigDlg->cbBanner->Checked;
+ AMODIPath = PopupConfigDlg->edAMODIPath->Text;
+ Ini->WriteInteger( PFS_CONFIG, PFS_POPUPKEY,
+ PopupConfigDlg->GetPopupKey() );
+ Ini->WriteInteger( PFS_CONFIG, PFS_TOGGLEKEY,
+ PopupConfigDlg->GetToggleKey() );
+ CaptureMode = PopupConfigDlg->GetCaptureMode();
+ Ini->WriteInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
+ Ini->WriteInteger( PFS_CONFIG, PFS_SCALE, PopupConfigDlg->GetScaler() );
+ Ini->WriteString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
+ Ini->WriteInteger(PFS_CONFIG, PFS_USE64, PopupConfigDlg->cbUse64->Checked);
+ SaveConfig();
+ SetupConfig();
+ if (!useAMODI && (CaptureMode & CM_IMAGE) && !AMODIAvail){
+ // AMODI off->ON \82©\82Â AMODI\82ª\82¢\82È\82¢\8fê\8d\87
+ NotifyAMODI();
+ }
+ if (PopupConfigDlg->cbUse64->Checked != use64){
+ // 64bit hook \95Ï\8dX\8e\9e
+ Unhook();
+ Hook();
+ }
+ }
+ delete PopupConfigDlg;
+ PopupConfigDlg = NULL;
+}
+void __fastcall TDCHookMainForm::miReadMeClick(TObject *Sender)
+{
+ ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miAboutClick(TObject *Sender)
+{
+ // show version dialog
+#if 1
+ Width = SavedWidth;
+ btnOK->Visible = true;
+ btnOK->SetFocus();
+ Visible = true;
+#else
+ VersionDlg = new TVersionDlg( this );
+ VersionDlg->ShowModal();
+ delete VersionDlg;
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miCheckLatestClick(TObject *Sender)
+{
+ ShowLatestVersion();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miCloseClick(TObject *Sender)
+{
+ MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miReloadClick(TObject *Sender)
+{
+ // \8dÄ\8bN\93®
+ Unhook();
+ Hook();
+ MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miHookClick(TObject *Sender)
+{
+ if ( !Hook() ){
+ Application->MessageBox( "DLL\82ð\8f\89\8aú\89»\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82¹\82ñ\r\8fI\97¹\82µ\82Ü\82·", APPNAME, MB_OK );
+ Close();
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miUnhookClick(TObject *Sender)
+{
+ Unhook();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miConfigClick(TObject *Sender)
+{
+ miOptionClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miDdeTestClick(TObject *Sender)
+{
+#ifdef _DEBUG
+ DoPopup( _t("test"), NULL, false );
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miTestClick(TObject *Sender)
+{
+#ifdef _DEBUG
+#if 1
+ hDll->Init32(Handle);
+#endif
+#if 0
+ NotifyAMODI();
+#endif
+#if 0
+ miIncSearchClick(Sender);
+#endif
+#if 0
+ if (hDll){
+ hDll->Capture();
+ }
+#endif
+#endif // _DEBUG
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miExitClick(TObject *Sender)
+{
+ Close();
+}
+//---------------------------------------------------------------------------
+// Popup on tray icon //
+void __fastcall TDCHookMainForm::pmTrayIconPopup(TObject *Sender)
+{
+ // Add group names to menu
+ TAppIni ini;
+ if ( !ini.hroot ){
+ return;
+ }
+
+ int sel = ini.ReadInteger( PFS_COMMON, PFS_GRPSEL, -1 );
+
+ TStringList *strs = new TStringList;
+ TMenuItem *sub = pmTrayIcon->Items->Items[MIGROUP_INDEX];
+ for ( ;sub->Count;){
+ sub->Delete(0);
+ }
+ GetGroupList(ini, *strs);
+ int index = 0;
+ for ( int i=0;i<strs->Count;i++ ){
+ AnsiString name = strs->Strings[i];
+ if (name.IsEmpty() || name.AnsiPos("::")==1){
+ continue; // Ignore the group.
+ }
+ TMenuItem *item = new TMenuItem( this );
+ item->Caption = name;
+ item->OnClick = miDicGroup;
+ sub->Add( item );
+ // Check current group name //
+ if ( sel == index ){
+ item->Checked = true;
+ }
+ index++;
+ }
+ delete strs;
+ miGroup->Visible = sub->Count != 0;
+ // Check enable popup item //
+ miIncSearch->Checked = MouseIncSrch;
+ miEnablePopup->Checked = EnablePopup;
+
+ miOCRText->Visible = CaptureMode & CM_IMAGE ? true : false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::btnOKClick(TObject *Sender)
+{
+#ifndef _DEBUG
+ Width = 0;
+#endif
+ MenuClosed();
+}
+//---------------------------------------------------------------------------
+// Timers
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::TestTimerTimer(TObject *Sender)
+{
+#ifdef _DEBUG
+#if 0
+ if ( DCDebug ){
+ char *p = (char*)DCDebug( );
+ if ( memcmp( share, p, COMPSIZE ) ){
+ DBW("Different");
+ for ( int i=0;i<COMPSIZE;i++ ){
+ DBW("[%02X:%02X]", (unsigned char)share[i],(unsigned char)p[i]);
+ }
+ memcpy( share, p, COMPSIZE );
+ }
+ }
+#endif
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::BootTimerTimer(TObject *Sender)
+{
+ Start();
+}
+//---------------------------------------------------------------------------
+// \82±\82ê\82ð\82â\82ç\82È\82¢\82Æ\81A\81h\83\81\83j\83\85\81[\82ð\95Â\82¶\82é\81h\82ð\8eÀ\8ds\8cã\81A
+// \83A\83C\83R\83\93\82ª\83^\83X\83N\83o\81[\82É\8ec\82Á\82Ä\82µ\82Ü\82¤\81B\82È\82º\81H\81H
+void __fastcall TDCHookMainForm::tmMenuCloseTimer(TObject *Sender)
+{
+ Visible = true;
+ Visible = false;
+ ShowWindow( Application->Handle, SW_HIDE );
+ tmMenuClose->Enabled = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmNotifyTimer(TObject *Sender)
+{
+ if ( NotifyForm ){
+ tmNotify->Enabled = false;
+ delete NotifyForm;
+ NotifyForm = NULL;
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmPopupTimer(TObject *Sender)
+{
+ PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND : 0), (LPARAM)PopupText );
+ PopupText = NULL; // release ownership
+ tmPopup->Enabled = false; // stop timer
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMouseMoveTimer(TObject *Sender)
+{
+ tmMouseMove->Enabled = false;
+
+ if (!hDll)
+ return;
+ //hDll->Capture();
+ hDll->CaptureAsync();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMODIInstallCheckTimer(TObject *Sender)
+{
+ if (MODIInstalled()){
+#if 0
+ Reboot();
+#else
+ // \8dÅ\8f\89\82Ìpopup\82Å\97\8e\82¿\82Ä\82µ\82Ü\82¤\81H
+ if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+ InitAMODI();
+ }
+ if (AMODIAvail){
+ SetupConfig2();
+ }
+#endif
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMODINotifyTimer(TObject *Sender)
+{
+ tmMODINotify->Enabled = false;
+ if (!AMODIRunable()){
+ NotifyAMODI();
+ }
+}
+//---------------------------------------------------------------------------
+// Mouse Events
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseDown(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+ if ( BootUp ) return;
+ Capturing = true;
+ SetCapture( Handle );
+ CapPoint.x = X;
+ CapPoint.y = Y;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseMove(TObject *Sender,
+ TShiftState Shift, int X, int Y)
+{
+ if ( Capturing ){
+ POINT pt;
+ GetCursorPos( &pt );
+ Left = pt.x - CapPoint.x;
+ Top = pt.y - CapPoint.y;
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseUp(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+ if ( BootUp )
+ Start();
+ Capturing = false;
+}
+//---------------------------------------------------------------------------
+// User Functions
+//---------------------------------------------------------------------------
+void TDCHookMainForm::InitAMODI()
+{
+ AMODIPath = Ini->ReadString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
+ SetupAMODI();
+}
+void TDCHookMainForm::Start()
+{
+ BootTimer->Enabled = false;
+#ifndef _DEBUG
+ ShowWindow( Application->Handle, SW_HIDE );
+ Visible = false;
+ Width = 0;
+#endif
+ if ( BootUp ){
+ RegisterTrayIcon( true );
+ miHookClick( this );
+ BootUp = false;
+ }
+}
+//---------------------------------------------------------------------------
+bool TDCHookMainForm::Hook()
+{
+ if ( hDll ){
+ DBW("Already hooked");
+ return true; // already loaded
+ }
+
+ bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, false);
+ hDll = new TDCHookLoader(use64);
+ if (!hDll->LoadHook(Handle)){
+ DBW("Load failed");
+ delete hDll;
+ hDll = NULL;
+ return false;
+ }
+
+ miHook->Enabled = false;
+ miUnhook->Enabled = true;
+
+ if (hDll->IsReady()){
+ SetupConfig();
+ extern HWND hwnd64;
+ PostMessage(Handle, UM_SHORTCUT, SCINX_NOTIFY64, (LPARAM)hwnd64);
+ }
+
+ DBW("Hook OK");
+
+ return true;
+}
+void TDCHookMainForm::Unhook()
+{
+ if ( !hDll ) return;
+
+ hDll->UnloadHook();
+ delete hDll;
+ hDll = NULL;
+
+ miHook->Enabled = true;
+ miUnhook->Enabled = false;
+}
+//---------------------------------------------------------------------------
+#ifdef _DEBUG
+// text\82Ì\90æ\93ª\82ð(0,0)\82Æ\82µ\82½\8dÀ\95W\82Å\81Apos\82Ì\88Ê\92u\82É\82 \82étext\82Ì\95¶\8e\9a\88Ê\92u\82ð\95Ô\82·
+int GetTextFromPoint( HDC hdc, const char *text, int pos )
+{
+ int len = lstrlen(text);
+ int left = 0;
+ int right = len;
+ SIZE sz;
+ int loc;
+ for(;;){
+ loc = (right + left)/2;
+ if ( right - left <= 1 ){
+ break;
+ }
+ GetTextExtentPoint32A( hdc, text, loc, &sz );
+// DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
+ if ( pos < sz.cx ){
+ right = loc;
+ } else {
+ left = loc;
+ }
+ }
+ return (right+left)/2;
+}
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int pos )
+{
+ int len = lstrlenW(text);
+ int left = 0;
+ int right = len;
+ SIZE sz;
+ int loc;
+ for(;;){
+ loc = (right + left)/2;
+ if ( right - left <= 1 ){
+ break;
+ }
+ GetTextExtentPoint32W( hdc, text, loc, &sz );
+// DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
+ if ( pos < sz.cx ){
+ right = loc;
+ } else {
+ left = loc;
+ }
+ }
+ return (right+left)/2;
+}
+#endif
+void TDCHookMainForm::EvCopyData(TMessage& msg )
+{
+ COPYDATASTRUCT *cds = (COPYDATASTRUCT*)msg.LParam;
+ if ( !cds ){ return; }
+ switch ( cds->dwData ){
+ case DCH_MOVESEND:
+ //DBW("DCH_MOVESEND");
+ // mouse move message
+ EvMoveSend(msg.WParam==0);
+ break;
+ case DCH_START:
+ CursorPoint = *(POINT*)cds->lpData;
+#ifdef _DEBUG
+ PaintBox->Canvas->FillRect( PaintBox->Canvas->ClipRect );
+#endif
+ if (PopupText){
+ delete[] PopupText;
+ PopupText = NULL;
+ }
+ break;
+ case DCH_END:
+ case DCH_END | DCH_MOVESEND:
+ if ( PopupText ){
+ PopupMoveSend = cds->dwData & DCH_MOVESEND ? true : false;
+ PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND : 0), (LPARAM)PopupText );
+ if (OCRTextForm) OCRTextForm->SetText(PopupText);
+ PopupText = NULL; // release ownership
+ }
+ break;
+ case DCH_HITTEXT1: // single char
+ {
+ DBW("DCH_HITTEXT1");
+ if (PopupText)
+ delete[] PopupText;
+#ifdef USE_UNICODE
+ // ANSI -> Unicode
+ //*+++ \93®\8dì\96¢\8am\94F 2002.12.4
+ PopupText = new tchar[ cds->cbData*2 + 1 ];
+ // \91O\94¼\95\94\95ª
+ PopupLoc = MultiByteToWideChar( CP_ACP, 0,
+ (LPCSTR)cds->lpData, msg.WParam, PopupText, cds->cbData*2 );
+ // \8cã\94¼\95\94\95ª
+ int r = MultiByteToWideChar( CP_ACP, 0,
+ &((char*)cds->lpData)[msg.WParam], cds->cbData-msg.WParam, &PopupText[PopupLoc], cds->cbData-PopupLoc );
+ PopupText[PopupLoc+r] = '\0';
+#else // !USE_UNICODE
+ PopupText = new tchar[ cds->cbData + 1 ];
+ memcpy( PopupText, cds->lpData, cds->cbData );
+ PopupText[cds->cbData] = '\0';
+ PopupLoc = msg.WParam;
+#ifdef _DEBUG
+ Memo->Lines->Add( PopupText );
+ edFound->Text = PopupText + msg.WParam;
+ TestTimer->Enabled = true;
+ if ( DCDebug ){
+ char *p = (char*)DCDebug( );
+ memcpy( share, p, COMPSIZE );
+ }
+#endif
+#endif
+ }
+ break;
+ case DCH_HITTEXT2: // wide char
+ {
+ DBW("DCH_HITTEXT2");
+ if (PopupText)
+ delete[] PopupText;
+#ifdef USE_UNICODE
+ PopupText = new tchar[ cds->cbData + 1 ];
+ memcpy( PopupText, cds->lpData, cds->cbData );
+ PopupText[cds->cbData/sizeof(tchar)] = '\0';
+ PopupLoc = msg.WParam;
+#else // !USE_UNICODE
+ // Unicode -> ANSI
+ //*+++ \93®\8dì\96¢\8am\94F 2002.12.4
+ PopupText = new tchar[ cds->cbData + 1 ];
+ // \91O\94¼\95\94\95ª
+ BOOL defchar;
+ PopupLoc = WideCharToMultiByte( CP_ACP, 0,
+ (wchar_t*)cds->lpData, msg.WParam,
+ PopupText, cds->cbData, 0, &defchar );
+ // \8cã\94¼\95\94\95ª
+ int r = WideCharToMultiByte( CP_ACP, 0,
+ &((wchar_t*)cds->lpData)[msg.WParam], (cds->cbData>>1)-msg.WParam,
+ &PopupText[PopupLoc], cds->cbData-PopupLoc, 0, &defchar );
+ PopupText[PopupLoc+r] = '\0';
+#endif
+ }
+ break;
+#ifdef _DEBUG
+ case DCH_EXTTEXTOUTA:
+ case DCH_EXTTEXTOUTW:
+ {
+ EMREXTTEXTOUTW *emr = (EMREXTTEXTOUTW*)cds->lpData;
+ wchar_t *p = (wchar_t*) ( ((char*)emr) + emr->emrtext.offString );
+ char *buf = NULL;
+#if 0
+ char b[200];
+ sprintf(b,"exScale=%f eyScale=%f ptlReference=(%d,%d)",emr->exScale, emr->eyScale, emr->emrtext.ptlReference.x, emr->emrtext.ptlReference.y );
+ DBW(b);
+#endif
+ if ( cds->dwData == DCH_EXTTEXTOUTW ){
+ buf = new char[ emr->emrtext.nChars * 2 ];
+ memset( buf, 0, emr->emrtext.nChars*2 );
+ WideCharToMultiByte( CP_ACP, 0, p, emr->emrtext.nChars, buf, emr->emrtext.nChars * 2, NULL, NULL );
+ }
+ const char *text = buf ? buf : (char*)p;
+ Memo->Lines->Add( text );
+ PaintBox->Canvas->TextOut( emr->rclBounds.left, emr->rclBounds.top, text );
+
+ if ( PtInRect( (RECT*)&emr->rclBounds, CursorPoint ) ){
+ int loc = GetTextFromPoint( (HDC)msg.WParam, text, CursorPoint.x - emr->rclBounds.left );
+ if ( loc != -1 ){
+ edFound->Text = text + loc;
+ }
+ }
+ if ( buf )
+ delete[] buf;
+ }
+ break;
+#endif
+ case DCH_MENU:
+ DokoPopMenu( false );
+ break;
+ case DCH_TOGGLE:
+ PostMessage( Handle, WM_TOGGLE, 0, 0 );
+ break;
+ case WMCD_EXISTCHECK: // exist check
+ if ( cds->cbData != strlen(APPNAME)+1 ){
+ msg.Result = false;
+ return;
+ }
+ msg.Result = (memcmp( cds->lpData, APPNAME, strlen(APPNAME)+1 ) == 0);
+ return;
+ case DCH_LAUNCH_AMODI:
+ SetupAMODI();
+ //Reboot(); // AMODI.exe\8dÄ\8bN\93®\82Å\82Í\89ð\8c\88\82Å\82«\82È\82¢\82½\82ß
+ break;
+ }
+ return;
+}
+//---------------------------------------------------------------------------
+bool WaitTransaction( TDdeClientConv *dde )
+{
+#if 1
+ for ( int i=0;i<100000;i++ ){
+ Application->ProcessMessages();
+ if ( !dde->WaitStat ){
+// DBW("DCHook:Wait OK");
+ return true;
+ }
+ }
+ DBW("DCHook:Wait failure");
+ return false;
+#else
+ return true;
+#endif
+}
+// ANSI\82Å\93n\82·\8fê\8d\87
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data )
+{
+#ifdef USE_UNICODE
+ int ansilen = Data.Length();
+ wchar_t *buf = new wchar_t[ansilen*2+1];
+ int len = MultiByteToWideChar( CP_ACP, 0,
+ (LPCSTR)Data.c_str(), ansilen, buf, ansilen*2 );
+ buf[len] = '\0';
+ bool r = DdePoke( dde, Item, (wchar_t*)buf );
+ delete[] buf;
+ return r;
+#else // !USE_UNICODE
+ HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
+ if ( !hszItem ) return false;
+ HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, Data.c_str(), Data.Length() + 1,
+ 0, hszItem, dde->DdeFmt, 0);
+ bool r = false;
+ if ( hszDat ){
+ HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
+ dde->DdeFmt, XTYP_POKE, 10000, NULL);
+ r = hdata ? true : false;
+ }
+ DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
+ return r;
+#endif
+}
+#ifdef USE_UNICODE
+// Unicode\82Å\93n\82·\8fê\8d\87
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data )
+{
+ // Item\96¼\82ÍANSI\81A\83f\81[\83^\82ÍUNICODE //
+ int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT;
+ HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
+ if ( !hszItem ) return false;
+ HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, (LPBYTE)Data, (_tcslen(Data)+1)*sizeof(wchar_t),
+ 0, hszItem, ddeFmt, 0);
+ bool r = false;
+ if ( hszDat ){
+ HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
+ ddeFmt, XTYP_POKE, 10000, NULL);
+ r = hdata ? true : false;
+ }
+ DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
+ return r;
+}
+#endif
+TDdeClientConv *TDCHookMainForm::OpenPdic( const char *topic )
+{
+ TDdeClientConv *PdicDde = new TDdeClientConv( this );
+
+ PdicDde->ConnectMode = ddeManual;
+ static int entry = 0;
+ PdicDde->Name = AnsiString("PdicDde") + (++entry);
+ PdicDde->ServiceApplication = DDE_SERVICE_NAME;
+ if ( !PdicDde->SetLink( DDE_SERVICE_NAME, topic ) ){
+ DBW("DCHook:Cannot SetLink");
+ delete PdicDde;
+ return NULL;
+ }
+ if ( !PdicDde->OpenLink( ) ){ // \82±\82±\82ª\92x\82¢\81I\81I
+ // PDIC auto launch
+ if ( LaunchPdic() ){
+ for(int i=0;i<OPEN_RETRY;i++){
+ if ( PdicDde->OpenLink() ){
+ return PdicDde;
+ }
+ Sleep(OPEN_WAITTIME);
+ }
+ }
+ DBW("PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(OpenPdic)");
+ Application->MessageBox( "PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(OpenPdic)", APPNAME, MB_OK );
+ delete PdicDde;
+ return NULL;
+ }
+ return PdicDde;
+}
+#ifdef USE_UNICODE
+static const TCHAR *clsname = TEXT("TPdicMain.UnicodeClass");
+#else
+static const TCHAR *clsname = TEXT(DDE_SERVICE_NAME);
+#endif
+static const TCHAR *winname = NULL;
+HWND TDCHookMainForm::FindPdic( )
+{
+ HWND hWin = FindWindow( clsname, winname );
+ if ( !hWin ){
+ // PDIC auto launch
+ if ( LaunchPdic() ){
+ hWin = FindWindow( clsname, winname );
+ if ( !hWin ){
+ DBW("PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(FindPdic)");
+ Application->MessageBox( "PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(FindPdic)", APPNAME, MB_OK );
+ return NULL;
+ }
+ }
+ }
+ return hWin;
+}
+#if !USE_DDE
+LRESULT TDCHookMainForm::SendCopyData( HWND hwnd, int message, const char *str )
+{
+ COPYDATASTRUCT cds;
+ cds.dwData = message;
+ cds.lpData = (LPSTR)str;
+ cds.cbData = lstrlen(str)+1;
+ SendMessage( hwnd, WM_COPYDATA, (WPARAM)Handle, (LPARAM)&cds );
+}
+#endif
+void TDCHookMainForm::ClosePdic( TDdeClientConv *dde )
+{
+ dde->CloseLink();
+ delete dde;
+}
+bool TDCHookMainForm::DoPopup( const tchar *text, const tchar *prevtext, bool movesend )
+{
+ static int ct = 0;
+ if ( ct >= 1 ){
+ if (PopupText){
+ // already pending
+ DBW("Reentrant!!!!!");
+ return true;
+ }
+ HWND hwnd = FindPopupWindow( );
+ if (hwnd){
+ HWND hwndParent = GetParent( hwnd );
+ if (hwndParent){
+ DBW("Parent exist!!!!");
+ hwnd = hwndParent;
+ }
+ DBW("Retry again:%d:%08X",ct,hwnd);
+ // \95K\82¸PostMessage()\82Åclose\82·\82é\82±\82Æ\81B
+ // CloseWindow()\82Å\82ÍPopup Winodow\82Ì\8f\89\8aú\89»\92\86\82É
+ // close\8f\88\97\9d\82ð\8eÀ\8ds\82µ\82Ä\82µ\82Ü\82¢\81A
+ // popup window\82ª\82¨\82©\82µ\82È\8fó\91Ô\82É\82Í\82¢\82Á\82Ä\82µ\82Ü\82¤\8fê\8d\87\82ª\82 \82é
+ PostMessage( hwnd, WM_CLOSE, 0, 0 );
+ return false;
+ } else {
+ if (ct >= 1 ){
+ DBW("Not found popup window");
+ if (DoPopupRetry++ > 10){
+ DoPopupRetry = 0;
+ return true; // abort
+ } else {
+ return false; // retry
+ }
+ }
+ }
+ }
+ DoPopupRetry = 0;
+ ct++;
+
+#if USE_DDE
+ // Windows9x\82Å\82Í\81ADDE transaction\82ª\92x\82¢\82Æ\82«\82ª\82 \82é
+ // why? - because of 24bit OS:-)
+ // ->\82Æ\8ev\82Á\82Ä\81AWM_COPYDATA version\82ð\8dì\82Á\82Ä\82¢\82½\82ç\91¬\82\82È\82Á\82½\81H\81H\81H
+ // ->WM_COPYDATA\89» project\82Í\92\86\92f
+ TDdeClientConv *PdicDde;
+ bool r;
+
+ if (movesend){
+ // incremental search
+ PdicDde = OpenPdic("Simulate");
+ if (!PdicDde){
+ ct--;
+ return true;
+ }
+ r = DdePoke(PdicDde, "InputWord3", text);
+ if (!r){
+ DBW("PDIC DDE : InputWord3 failure");
+ delete PdicDde;
+ ct--;
+ return true;
+ }
+ } else {
+ // popup
+ if (GroupOpen){
+ PdicDde = OpenPdic( "Simulate" );
+ if (PdicDde){
+ DdePoke( PdicDde, "Open", GroupName );
+ PdicDde->CloseLink();
+ delete PdicDde;
+ }
+ }
+ PdicDde = OpenPdic( "Dictionary" );
+ if ( !PdicDde ){
+ ct--;
+ return true;
+ }
+
+ r = DdePoke( PdicDde, "Open", "" );
+ if ( !r ){
+ DBW("PDIC DDE : Open failure");
+ PdicDde->CloseLink();
+ delete PdicDde;
+ ct--;
+ if ( GroupOpen ){
+ static int ct = 0;
+ ct++;
+ if ( ct == 1 ){
+ Application->MessageBox(
+ "\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\r"
+ "DokoPop!\82Å\81u\8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\81v\82ð\97L\8cø\82É\82µ\82Ä\82¢\82é\8fê\8d\87\82Í\81A\82·\82Å\82ÉPDIC\96{\91Ì\82Å\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82é\8e«\8f\91\82Æ\8b¤\97L\88á\94½\82ð\8bN\82±\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\r"
+ "DokoPop!\82ÆPDIC\96{\91Ì\82Å\8eg\97p\82µ\82Ä\82¢\82é\8e«\8f\91\82É\93¯\88ê\82Ì\82à\82Ì\82ª\82È\82¢\82©\92²\82×\82Ä\82\82¾\82³\82¢\r"
+ "\82à\82µ\82 \82Á\82½\8fê\8d\87\82Í\93o\98^\8bÖ\8e~\82È\82Ç\8b¤\97L\82Å\82«\82é\82æ\82¤\82È\8fó\91Ô\82É\82µ\82Ä\82\82¾\82³\82¢\r"
+ "\82±\82Ì\83\81\83b\83Z\81[\83W\82Ì\88Ó\96¡\82ª\82í\82©\82ç\82È\82¢\8fê\8d\87\82Í\81A\81u\8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\81v\8b@\94\\82ð\8eg\82í\82È\82¢\82Ù\82¤\82ª\88À\91S\82Å\82·"
+ ,
+ APPNAME, MB_OK );
+ } else {
+ SetForegroundWindow( Handle );
+ }
+ ct--;
+ }
+ return true;
+ }
+ if ( CtrlClose )
+ DdePoke( PdicDde, "PopupSearchConfig", "c1" ); // Ctrl close
+ // Sleep(1000);
+ DdePoke( PdicDde, "PopupSearchConfig", "o1w1" ); // overlap window and no wait transaction
+ if ( prevtext && (prevtext != text) ){
+ //DBW("prevtext="FMTS,prevtext);
+ DdePoke( PdicDde, "PopupSearch2", (tchar*)prevtext );
+ // ExecuteMacro( "PopupSearch2", true );
+ WaitTransaction( PdicDde );
+ } else {
+ //DBW("text="FMTS,text);
+ DdePoke( PdicDde, "PopupSearch", (tchar*)text );
+ // PdicDde->ExecuteMacro( "PopupSearch", true );
+ WaitTransaction( PdicDde );
+ }
+ DdePoke( PdicDde, "Close", "" );
+ }
+ ClosePdic( PdicDde );
+#else // !USE_DDE
+ // WM_COPYDATA\82É\82æ\82é\95û\96@(\82Ü\82¾document\89»\82³\82ê\82Ä\82¢\82È\82¢\95û\96@(Ver.4.30)
+ // PDIC/W32 Ver.4.22\81`\82É\91Î\89\9e
+ // \82½\82¾\82µ\81AVer.4.29\82Ü\82Å\82Í\81AWMCD_POPUPSEARCH\82ÆWMCD_POPUPSEARCH2\82Í\93¯\82¶
+
+ // WM_COPYDATA code //
+ // \88È\89º\82Ì\90\94\92l\82Í\8f«\97\88\95Ï\82í\82é\89Â\94\\90«\82ª\82 \82é(undocumented) //
+ #define WMCD_GETVERSION 0x0001
+ #define WMCD_CHECKOPEN 0x0010
+ #define WMCD_AUTOSEARCH 0x0020
+ #define WMCD_AUTOSEARCHMODE 0x0021
+
+ #define WMCD_ISOPENED 0x0080
+ #define WMCD_CLOSE 0x0081
+
+ #define WMCD_POPUPSEARCH 0x0100
+ #define WMCD_POPUPSEARCH2 0x0101
+ #define WMCD_POPUPSEARCHPOINT 0x0102
+ #define WMCD_POPUPSEARCHCONFIG 0x0103
+ #define WMCD_POPUPSEARCHDIALOG 0x0104
+ #define WMCD_POPUPSEARCHWINDOW 0x0105
+
+ #define WMCD_SPELLCHECK 0x0110
+
+ HWND hwnd = FindPdic();
+ if ( !hwnd ){
+ ct--;
+ return;
+ }
+
+ bool r;
+ if ( CtrlClose )
+ SendCopyData( hwnd, WMCD_POPUPSEARCHCONFIG, "c1" );
+ POINT pt;
+ GetCursorPos( &pt );
+ char buf[20];
+ wsprintf( buf, "%d,%d", pt.x, pt.y );
+ SendCopyData( hwnd, WMCD_POPUPSEARCHPOINT, buf );
+ if ( prevtext && (prevtext != text) ){
+ DBW("prevtext=%s",prevtext);
+ SendCopyData( hwnd, WMCD_POPUPSEARCH2, prevtext );
+ } else {
+ DBW("text=%s",text);
+ SendCopyData( hwnd, WMCD_POPUPSEARCH, text );
+ }
+ SendCopyData( hwnd, WMCD_CLOSE, "" );
+#endif // !USE_DDE
+ ct--;
+ DBW("DCHook:Exit Popup:%d",ct);
+
+#if DETACHRELEASE
+ if ( EnablePopup ){
+ miUnhookClick( this );
+ miHookClick( this );
+ }
+#endif
+ return true;
+}
+//---------------------------------------------------------------------------
+// EvPopup
+// WParam : text location & FLG_MOVESEND
+// LParam : text pointer (must be freed when done)
+void TDCHookMainForm::EvPopup(TMessage &msg)
+{
+ //DBW("EvPopup");
+ if (!msg.LParam)
+ return;
+
+ tchar *text = (tchar*)msg.LParam;
+ int loc = msg.WParam & ~FLG_MOVESEND;
+ bool movesend = msg.WParam & FLG_MOVESEND ? true : false;
+
+ int start, end;
+ int prevstart;
+ if ( !GetWord( text, loc, start, end, prevstart, true, 10, true, IgnoreJ ) ){
+ // no words
+ delete[] text;
+ return;
+ }
+#ifdef _DEBUG
+ edWord->Text = text + start;
+ edPrev->Text = loc + prevstart;
+#endif
+
+ if (DoPopup( text + start, text + prevstart, movesend )){
+ // done
+ delete[] text;
+ } else {
+ // retry again
+ if (PopupText)
+ delete[] PopupText; // \82 \82Æ\82É\97\88\82½\82Ù\82¤\82ð\97D\90æ\82·\82é
+ PopupText = text;
+ PopupLoc = loc;
+ PopupMoveSend = movesend;
+ tmPopup->Enabled = true; // start timer for delayed popup
+ }
+ //DBW("EvPopup - end");
+}
+void TDCHookMainForm::EvMoveSend(TMessage &msg)
+{
+ EvMoveSend(msg.WParam==0);
+}
+void TDCHookMainForm::EvMoveSend(bool enable)
+{
+ tmMouseMove->Enabled = false;
+ if (enable){
+ tmMouseMove->Enabled = true;
+ }
+}
+void TDCHookMainForm::RegisterTrayIcon( bool flag )
+{
+ NOTIFYICONDATA m_tnid; //\82±\82ê\82Í*.h\82Å\92è\8b`\82µ\82Ä\82¨\82
+
+ m_tnid.cbSize = sizeof(NOTIFYICONDATA);
+ m_tnid.hWnd = Handle;
+ m_tnid.uID = 1;
+ m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
+ m_tnid.uCallbackMessage = WM_NOTIFYICON;
+ // Get small icon from me
+ HICON hIconSm;
+ HICON hIcon;
+ ExtractIconEx( Application->ExeName.c_str(), -2, &hIcon, &hIconSm, 1 );
+ m_tnid.hIcon = hIconSm;
+ lstrcpy(m_tnid.szTip, APPNAME );
+ Shell_NotifyIcon( flag ? NIM_ADD : NIM_DELETE, &m_tnid);
+}
+void TDCHookMainForm::EvNotifyIcon(TMessage &msg)
+{
+ //UINT uID = (UINT) msg.WParam;
+ UINT uMouseMsg = (UINT) msg.LParam;
+ if (uMouseMsg == WM_LBUTTONDBLCLK)
+ {
+ miOptionClick( this );
+ }
+ else if (uMouseMsg == WM_RBUTTONDOWN)
+ {
+ DokoPopMenu( true );
+ }
+}
+//---------------------------------------------------------------------------
+void TDCHookMainForm::SaveConfig()
+{
+ Ini->WriteInteger( PFS_CONFIG, PFS_GROUPOPEN, GroupOpen );
+ Ini->WriteString( PFS_CONFIG, PFS_GROUPNAME, GroupName.c_str() );
+ Ini->WriteInteger( PFS_CONFIG, PFS_CTRLCLOSE, CtrlClose );
+ Ini->WriteInteger( PFS_CONFIG, PFS_IGNOREJ, IgnoreJ );
+ Ini->WriteInteger( PFS_CONFIG, PFS_BANNER, Banner );
+}
+void TDCHookMainForm::OpenDicGroup( const char *name )
+{
+ TDdeClientConv *dde = OpenPdic( PFS_PDIC );
+ if ( !dde )
+ return;
+ // \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93\8f\88\97\9d //
+ if ( name[0] == '&' )
+ name++;
+ DdePoke(dde, "OpenGroup", (tchar*)mustr(name));
+ ClosePdic( dde );
+}
+//---------------------------------------------------------------------------
+// DokoPop\82Ì\90Ý\92è
+void TDCHookMainForm::SetupConfig()
+{
+ EnableClickOnly( miClickOnly->Checked );
+ if (hDll){
+ hDll->Config( -1, KA_POPUP,
+ Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
+ hDll->Config( -1, KA_TOGGLE,
+ Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
+
+ SetupConfig2();
+ }
+ SetupAMODI();
+}
+void TDCHookMainForm::SetupConfig2()
+{
+ if (!hDll)
+ return;
+
+ TDCHConfig cfg;
+ memset(&cfg, 0, sizeof(cfg));
+ cfg.UseAMODI = AMODIAvail && (CaptureMode & CM_IMAGE);
+ cfg.OnlyAMODI = AMODIAvail && !(CaptureMode & CM_TEXT);
+ cfg.MoveSend = MouseIncSrch;
+ //cfg.OnlyImage = 1; //TODO:
+ if (AMODIPath.data()){
+ strncpy(cfg.AMODIPath, AMODIPath.c_str(), sizeof(cfg.AMODIPath)-1);
+ }
+
+ int dpiDetect = Ini->ReadInteger(PFS_CONFIG, PFS_DPI_DETECT, 1);
+ if (dpiDetect){
+#if DPI_DETECT
+ cfg.ScaleX = GetMonitorScale();
+#endif
+ } else {
+ cfg.ScaleX = Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0);
+ }
+ cfg.ScaleY = cfg.ScaleX;
+ hDll->Config2(&cfg);
+}
+void TDCHookMainForm::SetupAMODI()
+{
+ if (AMODIPath.data()){
+ AMODIAvail = true;
+ } else {
+ HWND hwnd = FindAMODI();
+ if (hwnd){
+ AMODIAvail = true;
+ } else {
+ AMODIAvail = LaunchAMODI();
+ if (!AMODIAvail){
+ HWND hwnd = FindAMODI();
+ if (hwnd)
+ AMODIAvail = true;
+ }
+ }
+ }
+ if (AMODIAvail){
+ tmMODIInstallCheck->Enabled = false;
+ }
+}
+void TDCHookMainForm::EnableClickOnly( bool enable )
+{
+ if (hDll)
+ hDll->Config( enable, 0, 0 );
+}
+void TDCHookMainForm::DokoPopMenu( bool all )
+{
+// Width = 0;
+ SetForegroundWindow( Handle );
+ POINT pt;
+ GetCursorPos( &pt );
+ miEnablePopup->Visible = all;
+ miReload->Visible = !all;
+ miClose->Visible = !all;
+ miExit2->Visible = all;
+ pmTrayIcon->TrackButton = tbRightButton;
+ pmTrayIcon->Popup( pt.x, pt.y );
+ MoveToTop( Handle );
+// MoveToTop( pmTrayIcon->WindowHandle );
+}
+void TDCHookMainForm::MenuClosed()
+{
+ Visible = false;
+ ShowWindow( Application->Handle, SW_HIDE );
+ tmMenuClose->Enabled = true;
+}
+void TDCHookMainForm::EvToggle( TMessage &msg )
+{
+ miClickOnlyClick( this );
+ ShowNotify();
+}
+void TDCHookMainForm::EvShortcut( TMessage &msg )
+{
+ switch (msg.WParam){
+ case SCINX_NOTIFY64:
+ DBW("SCINX_NOTIFY64:%08X %08X", msg.LParam, hDll);
+ if (hDll){
+ hDll->Notify64(msg.LParam);
+ SetupConfig();
+ }
+ break;
+ }
+}
+void TDCHookMainForm::EvGetVersion( TMessage &msg )
+{
+ msg.Result = VersionValue;
+}
+//---------------------------------------------------------------------------
+// \89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF\95\\8e¦
+void TDCHookMainForm::ShowNotify()
+{
+ POINT pt;
+ GetCursorPos( &pt );
+ if ( !NotifyForm ){
+ NotifyForm = new TNotifyForm( this );
+ } else {
+ NotifyForm->Visible = false;
+ }
+ NotifyForm->enable = miClickOnly->Checked;
+ NotifyForm->Left = pt.x + 8;
+ NotifyForm->Top = pt.y + 8;
+ NotifyForm->Setup();
+ NotifyForm->Show();
+ SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
+ SetWindowPos( NotifyForm->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
+ tmNotify->Enabled = false;
+ tmNotify->Enabled = true;
+}
+void TDCHookMainForm::NotifyAMODI()
+{
+ MODINotifyDialog = new TMODINotifyDialog(this);
+ MODINotifyDialog->ShowModal();
+ if (MODINotifyDialog->LinkClicked || AMODIRunable()){
+ tmMODIInstallCheck->Enabled = true;
+ }
+ delete MODINotifyDialog;
+}
+void TDCHookMainForm::Reboot()
+{
+ ::Reboot = true;
+ Close();
+}
+void GetGroupList(TMyIni &ini, TStringList &list)
+{
+ AnsiString s = ini.ReadString("Group", "::GroupNames::", "");
+ if (s.IsEmpty()){
+ // for old version (not work correctly)
+ ini.ReadValues( "Group", &list);
+ } else {
+ const TCHAR *p = _tcstok(s.c_str(), _T("\t"));
+ while (p){
+ list.Add( p );
+ p = _tcstok(NULL, _T("\t"));
+ }
+ }
+}
+
+#if DPI_DETECT
+#if WINVER<0x0601
+#define QDC_ALL_PATHS 0x00000001
+#define QDC_ONLY_ACTIVE_PATHS 0x00000002
+#define QDC_DATABASE_CURRENT 0x00000004
+typedef enum
+{
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
+ DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
+typedef enum
+{
+ DISPLAYCONFIG_ROTATION_IDENTITY = 1,
+ DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
+ DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
+ DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
+ DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_ROTATION;
+typedef enum
+{
+ DISPLAYCONFIG_SCALING_IDENTITY = 1,
+ DISPLAYCONFIG_SCALING_CENTERED = 2,
+ DISPLAYCONFIG_SCALING_STRETCHED = 3,
+ DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
+ DISPLAYCONFIG_SCALING_CUSTOM = 5,
+ DISPLAYCONFIG_SCALING_PREFERRED = 128,
+ DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_SCALING;
+typedef struct DISPLAYCONFIG_RATIONAL
+{
+ UINT32 Numerator;
+ UINT32 Denominator;
+} DISPLAYCONFIG_RATIONAL;
+typedef enum
+{
+ DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
+ DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
+ DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
+ DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_SCANLINE_ORDERING;
+typedef enum
+{
+ DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
+ DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
+ DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_MODE_INFO_TYPE;
+typedef struct DISPLAYCONFIG_2DREGION
+{
+ UINT32 cx;
+ UINT32 cy;
+} DISPLAYCONFIG_2DREGION;
+typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
+{
+ UINT64 pixelRate;
+ DISPLAYCONFIG_RATIONAL hSyncFreq;
+ DISPLAYCONFIG_RATIONAL vSyncFreq;
+ DISPLAYCONFIG_2DREGION activeSize;
+ DISPLAYCONFIG_2DREGION totalSize;
+ UINT32 videoStandard;
+ DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+} DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
+typedef enum
+{
+ DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
+ DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
+ DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
+ DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
+ DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
+ DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
+} DISPLAYCONFIG_PIXELFORMAT;
+typedef enum
+{
+ DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
+ DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
+ DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
+ DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
+ DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_TOPOLOGY_ID;
+typedef enum
+{
+ DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
+ DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
+ DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
+ DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
+ DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
+ DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_DEVICE_INFO_TYPE;
+
+typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
+{
+ LUID adapterId;
+ UINT32 id;
+ UINT32 modeInfoIdx;
+ UINT32 statusFlags;
+} DISPLAYCONFIG_PATH_SOURCE_INFO;
+typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
+{
+ LUID adapterId;
+ UINT32 id;
+ UINT32 modeInfoIdx;
+ DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
+ DISPLAYCONFIG_ROTATION rotation;
+ DISPLAYCONFIG_SCALING scaling;
+ DISPLAYCONFIG_RATIONAL refreshRate;
+ DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+ BOOL targetAvailable;
+ UINT32 statusFlags;
+} DISPLAYCONFIG_PATH_TARGET_INFO;
+typedef struct DISPLAYCONFIG_PATH_INFO
+{
+ DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
+ DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
+ UINT32 flags;
+} DISPLAYCONFIG_PATH_INFO;
+typedef struct DISPLAYCONFIG_TARGET_MODE
+{
+ DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
+} DISPLAYCONFIG_TARGET_MODE;
+typedef struct DISPLAYCONFIG_SOURCE_MODE
+{
+ UINT32 width;
+ UINT32 height;
+ DISPLAYCONFIG_PIXELFORMAT pixelFormat;
+ POINTL position;
+} DISPLAYCONFIG_SOURCE_MODE;
+typedef struct DISPLAYCONFIG_MODE_INFO
+{
+ DISPLAYCONFIG_MODE_INFO_TYPE infoType;
+ UINT32 id;
+ LUID adapterId;
+ union
+ {
+ DISPLAYCONFIG_TARGET_MODE targetMode;
+ DISPLAYCONFIG_SOURCE_MODE sourceMode;
+ };
+} DISPLAYCONFIG_MODE_INFO;
+typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
+{
+ DISPLAYCONFIG_DEVICE_INFO_TYPE type;
+ UINT32 size;
+ LUID adapterId;
+ UINT32 id;
+} DISPLAYCONFIG_DEVICE_INFO_HEADER;
+
+#endif
+
+typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
+typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
+typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
+typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
+
+class TDllHandle {
+protected:
+ HINSTANCE hInst;
+public:
+ TDllHandle(HINSTANCE _hInst)
+ :hInst(_hInst)
+ {
+ }
+ ~TDllHandle(){
+ if (hInst) FreeLibrary(hInst);
+ }
+ HINSTANCE inst(){ return hInst; }
+ operator HINSTANCE (){ return hInst; }
+};
+
+int GetMonitorScale()
+{
+ int dpi = 96;
+
+ HINSTANCE hDll = LoadLibrary( user32 );
+ if (!hDll)
+ return dpi;
+
+ TDllHandle hInst(hDll);
+
+ FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)GetProcAddress(hInst, "GetDisplayConfigBufferSizes");
+ if (!_GetDisplayConfigBufferSizes) return dpi;
+ FNQueryDisplayConfig _QueryDisplayConfig = (FNQueryDisplayConfig)GetProcAddress(hInst, "QueryDisplayConfig");
+ if (!_QueryDisplayConfig) return dpi;
+
+ POINT pt;
+ GetCursorPos( &pt );
+ HMONITOR hMonitor = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL );
+ if (!hMonitor) return dpi;
+
+ MONITORINFOEX LogicalMonitorInfo;
+ LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);
+ GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+ int LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+ int LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+ UINT32 numofpath;
+ UINT32 numofmode;
+ _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
+
+ DISPLAYCONFIG_PATH_INFO *dpis=new DISPLAYCONFIG_PATH_INFO[numofpath];
+ DISPLAYCONFIG_MODE_INFO *pModeInfoArray =new DISPLAYCONFIG_MODE_INFO[numofmode];
+ DISPLAYCONFIG_TOPOLOGY_ID tid;
+ _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid); //TODO: Windows7 or later
+
+ int PhysicalDesktopWidth = LogicalDesktopWidth;
+ int PhysicalMonitorWidth = LogicalMonitorWidth;
+
+ for (int i=0;i<(int)numofmode;i++){
+ if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE){
+ dbw("%d: %d", i, pModeInfoArray[i].sourceMode.width);
+ PhysicalDesktopWidth = pModeInfoArray[i].sourceMode.width;
+ //int PhysicalDesktopWidth =
+ //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+ //return 96 * 1;
+ } else
+ if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){
+ PhysicalMonitorWidth = pModeInfoArray[i].targetMode.targetVideoSignalInfo.activeSize.cx;
+ dbw("%d: %d", i, PhysicalMonitorWidth);
+ }
+ }
+
+ //int PhysicalMonitorWidth = pModeInfoArray[i].sourceMode.width;
+ //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+ delete[] dpis;
+ delete[] pModeInfoArray;
+
+ return dpi * PhysicalDesktopWidth / LogicalDesktopWidth;
+}
+#endif
+
+
--- /dev/null
+object DCHookMainForm: TDCHookMainForm
+ Left = 467
+ Top = 181
+ Width = 443
+ Height = 369
+ Caption = 'DCHookMainForm'
+ Color = clWhite
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ Menu = MainMenu
+ OldCreateOrder = False
+ PopupMenu = pmTrayIcon
+ Position = poScreenCenter
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ OnKeyPress = FormKeyPress
+ PixelsPerInch = 96
+ TextHeight = 12
+ object Splitter1: TSplitter
+ Left = 105
+ Top = 0
+ Width = 6
+ Height = 228
+ Cursor = crHSplit
+ end
+ object PaintBox: TPaintBox
+ Left = 111
+ Top = 0
+ Width = 316
+ Height = 228
+ Align = alClient
+ end
+ object Image: TImage
+ Left = 111
+ Top = 0
+ Width = 316
+ Height = 228
+ Align = alClient
+ AutoSize = True
+ Center = True
+ Picture.Data = {
+ 07544269746D61703A320100424D3A3201000000000000000000280000003401
+ 0000E80000000100080001000000042E01000000000000000000000100000001
+ 0000000000000101010002020200030303000404040005050500060606000707
+ 070008080800090909000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F
+ 0F00101010001111110012121200131313001414140015151500161616001717
+ 170018181800191919001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F
+ 1F00202020002121210022222200232323002424240025252500262626002727
+ 270028282800292929002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F
+ 2F00303030003131310032323200333333003434340035353500363636003737
+ 370038383800393939003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F
+ 3F00404040004141410042424200434343004444440045454500464646004747
+ 470048484800494949004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F
+ 4F00505050005151510052525200535353005454540055555500565656005757
+ 570058585800595959005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E005F5F
+ 5F00606060006161610062626200636363006464640065656500666666006767
+ 670068686800696969006A6A6A006B6B6B006C6C6C006D6D6D006E6E6E006F6F
+ 6F00707070007171710072727200737373007474740075757500767676007777
+ 770078787800797979007A7A7A007B7B7B007C7C7C007D7D7D007E7E7E007F7F
+ 7F00808080008181810082828200838383008484840085858500868686008787
+ 870088888800898989008A8A8A008B8B8B008C8C8C008D8D8D008E8E8E008F8F
+ 8F00909090009191910092929200939393009494940095959500969696009797
+ 970098989800999999009A9A9A009B9B9B009C9C9C009D9D9D009E9E9E009F9F
+ 9F00A0A0A000A1A1A100A2A2A200A3A3A300A4A4A400A5A5A500A6A6A600A7A7
+ A700A8A8A800A9A9A900AAAAAA00ABABAB00ACACAC00ADADAD00AEAEAE00AFAF
+ AF00B0B0B000B1B1B100B2B2B200B3B3B300B4B4B400B5B5B500B6B6B600B7B7
+ B700B8B8B800B9B9B900BABABA00BBBBBB00BCBCBC00BDBDBD00BEBEBE00BFBF
+ BF00C0C0C000C1C1C100C2C2C200C3C3C300C4C4C400C5C5C500C6C6C600C7C7
+ C700C8C8C800C9C9C900CACACA00CBCBCB00CCCCCC00CDCDCD00CECECE00CFCF
+ CF00D0D0D000D1D1D100D2D2D200D3D3D300D4D4D400D5D5D500D6D6D600D7D7
+ D700D8D8D800D9D9D900DADADA00DBDBDB00DCDCDC00DDDDDD00DEDEDE00DFDF
+ DF00E0E0E000E1E1E100E2E2E200E3E3E300E4E4E400E5E5E500E6E6E600E7E7
+ E700E8E8E800E9E9E900EAEAEA00EBEBEB00ECECEC00EDEDED00EEEEEE00EFEF
+ EF00F0F0F000F1F1F100F2F2F200F3F3F300F4F4F400F5F5F500F6F6F600F7F7
+ F700F8F8F800F9F9F900FAFAFA00FBFBFB00FCFCFC00FDFDFD00FEFEFE00FFFF
+ FF0003A601A501A402A301A202A102A0029F029E019D019C029B029A01990298
+ 02970296019503940193029202910190028F018E028D028C028B018A02890188
+ 02870286028502840283028202810280027F027E027D017C027B027A02790278
+ 02770176027502740173027201710270016F026E016D016C026B026A01690268
+ 0167026601650264016301620261026000035F5E5D00025C025B015A02590003
+ 58575600025500035453520002510005504F4E4D4C00024B00034A4948000247
+ 00044544434202410011403F3E3D3C3B3A3938373635343332313000022F0006
+ 2E2D2C2B2A2902280004272625240223022201210120021F021E011D021C021B
+ 021A0219021801170316011501140213021201110110020F00030E0D0C00020B
+ 020A0003090807000306010503040203030206010C0008010202020301040405
+ 03040105020601040803070203010200000001A702A601A502A402A301A202A1
+ 01A0029F029E029D029C019B019A029902980297029601950294019302920291
+ 0190028F018E028D028C028B028A028901880287018602850384018302820281
+ 0280027F027E027D017C027B027A027902780277017602750274017302720171
+ 0270016F026E016D016C026B026A016902680167026601650264016301620261
+ 026000035F5E5D00025C015B025A015901580257015601550254000553525150
+ 4F00024E00054D4C4B4A49000248000647464544434202410006403F3E3D3C3B
+ 02390004383735340233000A3231302F2E2D2C2B2A2902280004272625240223
+ 012202210120021F011E021D021C011B031A0219021801170216021502140113
+ 011202110110010F020E010D020C010B020A0109020801070206020502040303
+ 030206010D000701020203030504020301040205040405030702040101000000
+ 03A701A601A502A401A302A202A102A0019F029E019D029C029B019A02990298
+ 01970296019502940293029201910290028F018E028D028C018B028A02890288
+ 01870286028502840283018202810280027F027E027D027C027B017A02790278
+ 02770176027502740173027201710270016F026E016D016C026B026A01690268
+ 01670266016502640163016202610160025F015E015D025C00035B5A59000258
+ 015702560005555453525100025000054F4E4D4C4B00024A0009494847464544
+ 43424100024000113F3E3C3B3A393837363534333231302F2E00022D00062C2B
+ 2A292827022601250223022201210120021F011E021D021C021B011A03190118
+ 02170216011503140113021201110210010F020E010D020C010B020A01090208
+ 01070306010503040203040206010D0007010003020304000205020406030604
+ 06030202020304020301000001A802A701A602A501A402A302A201A102A0019F
+ 029E029D029C019B029A0299019802970296019502940293019202910290018F
+ 028E028D018C028B028A0189028802870286028501840283018202810380027F
+ 027E017D027C027B027A0279017802770276017502740173027201710170026F
+ 016E016D026C016B026A0269026801670266000365646300026202610003605F
+ 5E00025D00035C5B5A00025901580157025600045554535202510006504F4E4D
+ 4C4B024A0020494847464544434241403F3E3D3C3B3A39383736353433323130
+ 2F2E2D2C2B2A02290006282726252423022201210120021F021E011D021C011B
+ 021A0219021801170316011502140213021202110110020F010E020D020C010B
+ 020A0209010802070206020502040303030207010D0004010302000803040709
+ 0A08060405030704090304020301000002A802A701A602A502A401A302A201A1
+ 02A0029F019E029D019C029B029A029901980297019602950294029301920291
+ 0290018F028E028D018C028B028A018902880287028601850184028302820281
+ 0280027F037E017D027C017B027A027901780277017601750274027300037271
+ 7000026F026E016D026C016B026A026901680267000366656400026301620261
+ 0160015F025E015D015C025B00035A595800025701560255000754535251504F
+ 4E00024D00164C4B4A494847464544434241403F3E3D3C3B3A39383702350003
+ 34333100023000032E2D2C00022B00082A29282726252423022201210120021F
+ 011E021D011C011B021A0319011802170116031502140213021202110210010F
+ 020E010D020C020B020A0209010801070306020503040303030206010D000201
+ 0302020300090405080B0F100E0A0600050307040A0304020201000001A902A8
+ 02A701A601A502A402A301A202A101A0029F029E029D019C029B019A02990298
+ 01970296019502940293029202910190028F028E018D028C028B018A02890288
+ 01870286018502840283018202810280027F037E017D027C017B027A01790278
+ 01770176027502740173017202710170026F016E026D016C026B016A02690168
+ 0267016602650003646362000261026000035F5E5D00025C00055B5A59585700
+ 0256015502540009535251504F4E4D4C4B00024A000449484746024400204341
+ 403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524230222
+ 01210120021F011E011D021C011B021A01190218021702160215031401130312
+ 01110310020F010E020D020C020B010A03090108020702060205030403030302
+ 06010C00030101020203000D04050607090B0F13151410090400040308040203
+ 0104070303020201000002A902A801A702A601A501A402A302A202A101A0029F
+ 029E019D029C029B019A0199039801970296029501940293019202910290028F
+ 018E028D018C028B018A0289028802870186028502840183018202810280027F
+ 027E027D027C017B027A0179017802770176027501740273017202710170016F
+ 026E026D016C016B026A0169026801670266000365646300026201610260015F
+ 015E025D00045C5B5A5902580157015602550153015202510022504F4E4D4C4B
+ 4A494847464544434241403F3E3D3C3B3A3938373534333231302F2E022D0008
+ 2B2A292827262524022302210120011F021E011D011C021B021A011902180117
+ 0316021502140213021202110210020F030E020D020C010B020A030902080207
+ 02060205020403030A020D010302000A0304050607090B0D101402180003140C
+ 060004030C04060304020101000003A902A801A702A601A502A401A302A201A1
+ 02A0019F029E029D029C019B019A029902980297019602950294029301920291
+ 0290018F028E018D018C028B028A018902880287028601850284018301820281
+ 0280027F027E017D027C027B017A017902780177027602750174017302720171
+ 0170026F016E026D016C016B026A016902680167016602650164016302620161
+ 026000035F5E5D00025C00045B5A595802570006565554535251025000074F4E
+ 4D4C4B4A490002470019464544434241403E3D3C3B3A39383736353433323130
+ 2F2D2C00022B012A0129022700042524232202210004201F1E1D021C011B021A
+ 0119021802170216021502140213021203110210020F020E030D020C020B020A
+ 020902080207020601050106030503040B031002001003040506080A0C0E1115
+ 181A170F070402030E0405030502000001AA02A902A802A701A601A502A402A3
+ 02A201A102A0029F019E029D029C019B019A0299029802970196029502940193
+ 029201910290018F028E028D018C028B018A0289018802870286018502840183
+ 018202810280027F017E027D027C017B017A0279027801770276000375747300
+ 0272000371706F00026E026D016C016B026A0169016802670266000465646362
+ 02610160025F00055E5D5C5B5A0002590003585756000255002D54535251504F
+ 4E4D4C4B4A494847464544434241403F3E3D3C3B393837363534333231302F2E
+ 2D2C2B2A292827000225022300052221201F1E00021D011C011B021A01190218
+ 01170216021502140213021202110310020F030E010D040C020B020A03090408
+ 01070A0602050204050502040703060203030204000E0507080A0C0E1115181A
+ 1810070402030E0407030302000003AA01A902A802A701A602A501A402A301A2
+ 02A101A0029F029E029D019C019B029A02990298029701960195029401930292
+ 01910290028F028E018D028C018B018A02890188028702860185028401830182
+ 02810280017F027E027D017C027B017A02790178017702760003757473000272
+ 01710170026F016E016D026C026B00036A696800026701660265000464636261
+ 026000045F5E5D5C025B00045A595857025600085554535251504F4E024D0008
+ 4C4B4A49484745440243000C4241403F3D3C3B3A393837350234000C3231302F
+ 2E2D2C2B2A29282702250123012202210005201F1E1D1C00021B011A01190218
+ 02170216011501140313021201110310030F020E030D020C040B020A0A090108
+ 0107030800050908090809000208050702060205010406030402030301040305
+ 000E0607080A0C0E1114181A1810070402030F0406030302000001AB02AA02A9
+ 02A801A701A602A502A402A301A202A102A0019F029E029D019C019B029A0299
+ 029800039796950002940193039201910290018F028E018D028C018B018A0289
+ 018802870286018502840183018202810180027F017E027D017C027B017A0279
+ 017801770276017501740273000372717000026F016E026D016C016B026A0003
+ 6968670002660003656463000262000561605F5E5D00025C00045B5A59580257
+ 0004565554530252000E51504F4E4D4C4B4A4948474645430242001D41403F3E
+ 3D3C3A3938373635333231302F2E2D2C2B2A292726252423220002210005201F
+ 1E1D1C00021B00031A19180002170116021502140113021202110310030F020E
+ 030D030C040B060A020B050C0C0B010A01090308020702060205060405030204
+ 010502060307000C080A0C0E1114171A170F070403030F0407030102000001AC
+ 01AB02AA01A902A802A701A602A502A402A301A201A102A0029F029E019D029C
+ 019B029A0199029801970196029502940193029202910190018F028E018D028C
+ 018B018A0289018802870286018501840283018201810280017F027E00037D7C
+ 7B00027A017902780177027601750274000473727170026F00036E6D6C00026B
+ 00036A6968000267000366656400026300056261605F5E00025D00055C5B5A59
+ 58000257000356555400025300105251504F4E4D4C4B4A494847464544430241
+ 001E403F3E3D3B3A3938373635343331302F2E2D2C2B2A292827262524232221
+ 021F00041E1D1C1B021A0119011802170116021501140113021203110210020F
+ 020E030D050C050B010C010B030C020D020E090F030E030D010C010B020A0109
+ 04080207060604050504010501060307000D08090A0C0E10131619170F070400
+ 030310040703000002AC01AB02AA01A902A802A702A601A502A402A301A201A1
+ 02A0029F019E019D029C019B029A019902980297019601950294019302920291
+ 0190028F018E018D028C018B018A028901880287018602850184018302820181
+ 0180027F017E017D027C017B017A02790178017702760006757473727170026F
+ 016E016D026C00046B6A696802670003666564000263000362616000025F0004
+ 5E5D5C5B025A015902570156015502540013535251504F4E4D4C4B4A49484746
+ 454443424000023F00123E3D3B3A3938373635343331302F2E2D2C2B02290128
+ 022600072524232221201F00021D00041C1B1A19021801170216011501140213
+ 021201110210030F020E030D090C020D020E030F021001110312031301120113
+ 021202110110010F030E020D010C060B010A0509020803070206020502040205
+ 010601070308000C090A0B0D0F121618160F0804030308040305060406030000
+ 02AC02AB01AA02A902A801A702A602A501A402A301A202A101A0029F019E019D
+ 029C019B029A0299019802970196019502940293019202910190028F018E018D
+ 028C018B018A028901880287018601850284000483828180027F017E027D0004
+ 7C7B7A790278000477767574027300047271706F026E00036D6C6B00026A0005
+ 69686766650002640005636261605F00025E00045D5C5B5A0259000458575655
+ 025401520151025000074F4E4D4C4B4A49000247014601440243001542413F3E
+ 3D3C3B3A3938373635333231302F2E2D2C00022A012902270126012402230121
+ 0120021F00061E1D1C1B1A19021800031716150002140113021201110310020F
+ 030E0B0D010E010F021001110212021301140215061601150214021302120111
+ 0410060F030E010D010C020B020A020903080207010601050204020501060207
+ 0308000B0A0B0D0F121518161008040002030804040507040503000001AD02AC
+ 01AB02AA02A901A802A702A602A50003A4A3A20002A101A0029F019E019D029C
+ 029B029A029900049897969502940293019202910190028F018E018D028C018B
+ 018A0289000388878600028500038483820002810004807F7E7D027C00077B7A
+ 79787776750002740173017202710006706F6E6D6C6B026A0007696867666564
+ 63000262000561605F5E5D00025C00045B5A59580257002C565554535251504F
+ 4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938363534333231302F2E
+ 2D2C2B2A022800072625242322212000021F00081E1D1C1B1A19181702160115
+ 01140213021202110110020F030E030D010C020D010E030F0210000611121314
+ 151603170218051903180117011605150114011505140313011202110004100F
+ 0E0D020C020B010A02090308010702060405010603070208000B090B0D0F1115
+ 17161008040002030804050509040203000003AD01AC01AB02AA02A901A802A7
+ 01A602A501A401A302A201A102A0019F029E029D019C019B029A029900049897
+ 969502940293019201910290018F028E00038D8C8B00028A0004898887860285
+ 000484838281028000047F7E7D7C027B00087A79787776757473027200087170
+ 6F6E6D6C6B6A026900086867666564636261026000065F5E5D5C5B5A02590009
+ 58575655545352515000024F014D014C024B000B4A4948474645444342403F00
+ 023E001E3D3B3A393837363534333231302F2E2D2B2A29282726252423222120
+ 1F1E021D00081C1B1A191817161503140213021201110210010F030E040D020E
+ 00040F1112130214000615161718191A021B011C041B071A0619041A03190118
+ 02170004161514130211010F010E030D00030C0B0A0003090308010701060305
+ 020603070208000B090A0C0E111416150F080400020307040A05050402030000
+ 01AE02AD01AC02AB02AA01A902A801A701A602A501A401A302A202A101A0029F
+ 019E029D019C019B029A029900049897969502940293000392919000028F0004
+ 8E8D8C8B028A01890188028700078685848382818000027F000E7E7D7C7B7A79
+ 7877767574737271027000096F6E6D6C6B6A6968670002660009656463626160
+ 5F5E5D00025C00035B59580002570004565554530252002151504F4E4D4C4B4A
+ 494847464544434241403F3E3D3C3B3A39383736353433313000022F00162D2C
+ 2B2A292827262524232221201F1E1D1C1B1A1918021700031615140002130112
+ 0313011201110210010F030E020F02100009111213141718191A1B00021C041D
+ 011E031D061C021D021E081F021E021C000B1B1A19181715141311100F00020E
+ 020D010C010B030A02090208010702060205020601070208000D0708090A0C0E
+ 1013161510080400020306040B0506040103000002AE02AD01AC01AB02AA01A9
+ 02A801A701A602A502A401A302A201A101A0029F019E029D019C019B029A0199
+ 029800039796950002940193019202910003908F8E00028D00058C8B8A898800
+ 0287000E868584838281807F7E7D7C7B7A790278001877767574737271706F6E
+ 6D6C6B6A69686766656463626160025F000C5E5D5C5B5A595857565554530252
+ 000D51504F4E4D4C4B4A49484746450002440027434241403F3E3C3B3A393837
+ 363534333231302F2E2D2C2B292827262524232221201F1E1D1C1B00021A0004
+ 191817160215011401130212011101120313011201110410000B111314151618
+ 191B1C1D1E00021F0320031F061E021F02200004212223240525000324232200
+ 0221000D1F1E1D1C1B1A19181715141311000210010F020E010D020C010B030A
+ 02090208010701060205010602070208000D0708090A0C0E1013161510090500
+ 020305040D050604000003AE01AD02AC0003ABAAA90002A801A702A602A501A4
+ 01A302A201A101A0029F019E029D00039C9B9A00029901980197029600049594
+ 939202910004908F8E8D028C00058B8A89888700028600188584838281807F7E
+ 7D7C7B7A7978777675747372716F6E6D026C00086B6A69686765646302620010
+ 61605F5E5D5C5B5A59585756555453520251000D504F4E4D4C4B4A4948474645
+ 4400024300104241403F3E3D3C3B3A3837363534333202310017302F2D2C2B2A
+ 292827262524232221201F1E1D1C1B1A19000218000317161500021401130212
+ 041103120313000B141517191B1C1E1F20212200022303220721032200062324
+ 252627280629001628272625242221201F1E1D1C1B1A19181615141312110210
+ 00030F0E0D00030C020B020A02090208010703060207050800050A0C0D101200
+ 021500031009050007040E050504000002AF01AE01AD02AC01AB01AA02A901A8
+ 02A702A60003A5A4A30002A20003A1A09F00029E019D029C019B019A02990006
+ 9897969594930292000691908F8E8D8C028B00078A898887868584000283002D
+ 8281807F7E7C7B7A7978777675747372706F6E6D6C6B6A696867666564636261
+ 605F5E5D5C5B5A595857565554000253000351504F00024E000D4D4C4B4A4948
+ 4746454443424100024000143F3E3D3C3B3A393837363534333231302F2E2D2C
+ 022A00062928272625240222000B21201F1E1D1C1B1A19181700021601150114
+ 02130712000C13151617191B1C1E202122240625022405230224000426272829
+ 022A022B022C032D012C022B00082A292827252423220220000D1F1E1D1B1A19
+ 181716151413120002110110010F020E010D030C020B020A0209010801070306
+ 0107060800050A0C0D0F1200021500031109050007040F050404000002AF01AE
+ 02AD01AC02AB01AA01A902A801A702A60003A5A4A30002A20004A1A09F9E029D
+ 019C019B029A00069998979695940293000B9291908F8E8D8C8B8A8988000287
+ 0033868584838281807F7E7D7C7A7978777675747271706F6E6D6C6B6A696867
+ 6665646361605F5E5D5C5B5A59585756555453525100025000034E4D4C00024B
+ 000E4A494847464544434241403F3E3D023C001C3B3A39383736353433323130
+ 2F2E2D2C2B2A29282726252423222120021F00031E1D1C00021A011902180004
+ 171615140413011402150009161718191B1E2022240002260127052801270326
+ 042500082627282A2C2D2E2F0530032F012E022D00172C2B2A29282725242322
+ 21201F1E1D1C1B1A1918171615000214000413121110020F020E010D030C010B
+ 020A020901080107030601070608000A0A0C0D0F121415110A05070409050206
+ 050502040105000002AF01AE02AD02AC01AB01AA02A901A801A702A60004A5A4
+ A3A202A10003A09F9E00029D00069C9B9A9998970296019501940292004B9190
+ 8F8E8D8C8B8A898887868584838281807F7E7D7C7B7A78777675747371706F6E
+ 6D6B6A696867666564636261605E5D5C5B5A595857565554535251504F4E4D4C
+ 4B4A49484746454443000242000841403F3E3D3C3B3A02390011383736353433
+ 3231302F2E2D2C2B2A292800022702250003242322000220011F011E021D0003
+ 1B1A19000218041701160315000C16181A1C1E20212224252729022A032B022A
+ 012902280527000828292B2C2E2F313304340233013202310130012F022E022C
+ 00042B2A29270226012402230221000C201F1E1D1C1B1A191817161502140003
+ 131211000210020F020E010D020C010B020A020902080407060800050A0B0D0F
+ 110002140003110A050006040A050206050502040105000001B002AF02AE0003
+ ADACAB0002AA0005A9A8A7A6A50002A40003A3A2A10002A0000A9F9E9D9C9B9A
+ 9998979602950194019302910037908F8E8D8C8B8A8988878684838281807F7E
+ 7D7C7B7A79777675747371706F6E6C6B6A6968676564636261605F5E5C5B5A59
+ 5857565553000252000551504F4D4C00024B000C4A494847464544434241403F
+ 023E00083D3C3B3A3938373602350134023201310130022E00052D2C2B2A2900
+ 02280127012602240007232221201F1E1D00041C011A011904180119021A0009
+ 1B1C1D1F2124272A2C00022D052E022D022C022B032A022900092A2B2C2E3032
+ 3435360005370235000934333231302F2E2D2C00022B00112A29282726252423
+ 2221201F1E1D1C1B1A000219011801170216000315141300021202110110020F
+ 010E020D010C010B020A03090108040706080005090B0D0E110002140003110B
+ 0500060406050606060501040105000001B002AF02AE0003ADACAB0002AA0005
+ A9A8A7A6A50002A4000FA3A2A1A09F9E9D9C9B9A999897969500029400499392
+ 908F8E8D8C8B8A8988878685848381807F7E7D7C7B7A78777675747271706F6D
+ 6C6B6A68676665636261605F5D5C5B5A5958565554535251504F4E4D4C4B4A49
+ 48474645444342000241000A403F3E3D3C3B3A39383702360004353433320231
+ 022F00082E2D2C2B2A292827022600092524232221201F1E1D00021C00031B1A
+ 1B00051C000D1D1F2021232527292C2E2F31320003340133013202310230032E
+ 022D022E012F0230013101330235000337383900033A0239000C383736353433
+ 3231302F2E2D022C00092B2A29282726252423000222000421201F1E021C011B
+ 011A0219000318171600021501140113021202110110020F010E020D020C010B
+ 020A0309010803070608000A090B0C0E111314120B06060404050C0604050000
+ 02B002AF0005AEADACABAA0002A90059A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99
+ 9897969594939291908F8E8D8C8B8A88878685848382817F7E7D7C7B7A787776
+ 747372716F6E6D6C6A69686765646361605F5E5D5B5A5958575554535251504F
+ 4E4D4C4B4A494847460002440009434241403F3E3D3C3B00023A000639383736
+ 3534023300093231302F2E2D2C2B2A0002290005282726252400022301220221
+ 0006201F1E1D1C1B041A000E1C1F212326282A2C2E3031333435063601350234
+ 02330632000633343537393A023B053D023C013B023A00083937363534333231
+ 023000072F2E2D2C2B2A29000228000B27262524232221201F1E1D00021C011B
+ 011A021901170116021502140113021202110110020F020E020D020C020B020A
+ 010901080307010802090308000A090B0C0E111314120C06060404050C060405
+ 000001B101B002AF0005AEADACABAA0002A901A801A702A50059A4A3A2A1A09E
+ 9D9C9B9A9998979695949391908F8E8D8C8B8A8988868584838281807E7D7C7A
+ 79787775747372716F6E6C6B6A686766646362615F5E5C5B5A59585655545352
+ 514F4E4D4C4B4A494847464544434241403F3E00023D013B013A023900033837
+ 360002350233000332313000022F00052E2D2C2B2A0002290004282726250224
+ 022201210120031F011E011D021B0319000A1B1D2024292D3134353703380439
+ 013805370336033702380006393A3B3C3E3F0241024202410240023E00103D3C
+ 3B3A393837363534333231302F2E022D000D2C2B2A2928272625242322212000
+ 021F00031E1D1C00021B00051A1918171600021502140113031201110210020F
+ 030E010D020C020B010A020904080309000C08090A0B0D0E101314120C060604
+ 03050E060305000001B101B002AF01AE02AC005AABAAA9A8A7A6A5A4A3A2A1A0
+ 9F9D9C9B9A9998969594939291908E8D8C8B8A89888785848382817F7E7D7C7A
+ 79787775747271706E6D6C6B69686665646261605E5D5C5A5958565554535250
+ 4F4E4D4C4B4A49484745444342410240013F023D00083C3B3A39383736350234
+ 000433323130022F00042E2D2C2B022A00052928272625000224012301220221
+ 0004201F1E1D041C011B031900091B1E23282D3235383A00053B083A023B033C
+ 00043D3E3F400241014201440245034601450244000443424140023E013D013C
+ 023A0012393837363534333231302F2E2D2C2B2A29280227000C262524232221
+ 201F1E1D1C1B021A0119021801170116021503140213011201110210040F010E
+ 020D020C010B020A010903080409000C08090A0C0D0E101314130C0705040405
+ 0F06020500000006B1B0AFAEADAC02AB0064AAA9A8A7A5A4A3A2A1A09F9E9C9B
+ 9A99989695949392908F8E8C8B8A89888785848382807F7E7D7C7A7978767573
+ 72716F6E6D6B6A696766646361605F5D5C5B5A585755545251504F4E4C4B4A49
+ 4847464544434241403F3E3D3C3B3A393837363534330232000331302F00022E
+ 022C00032B2A2900022800032726250002240003232221000220011F021E011D
+ 011C021B021A041900091B1E242A3035393A3C00023D063C023D023F01400241
+ 024202430003444648000249054A0249001048474645444342403F3E3D3C3B3A
+ 393802370003363534000232000431302E2D022C00102B2A2928272625242322
+ 21201F1E1D1C021B011A0219021800031716150004140213011202110310020F
+ 030E020D00030C0B0A000809000C08090A0C0D0E111315130D07050404050806
+ 03070506010500000067B1B0AFAEADACABAAA9A8A7A6A4A3A2A1A09E9D9C9B9A
+ 98979694939291908E8D8C8A89888785848382807F7E7C7B7A78777674737270
+ 6F6D6C6A696867656462615F5E5C5B5A585756545351504E4D4C4B4A48474645
+ 44434241403F3E3D3C3B3A39383736353400023300043231302F022E00042D2C
+ 2B2A0229000328272600022500032423220002210120011F021E011D021C011B
+ 011A02190318000B191B1D20252B31373B3D3E00033F03400341000542434546
+ 470003480005494A4B4D4E000350024F00164E4D4C4B4A494847464443424140
+ 3F3E3D3C3B3A39380237000E3635343231302F2E2D2C2B2A2928022600052523
+ 22212000021F021E011D021C011B021A01190318011701150414021301120211
+ 0210050F010E020D020C010A0A09000A0A0C0D0E111315130D07050404050806
+ 0307060600000061B1B0AFAEADACABAAA8A7A6A5A3A2A1A09F9D9B9A99989695
+ 949291908E8D8B8A89888685848281807F7D7C7B797876757472716F6E6C6B6A
+ 686766646361605E5D5B5A585756545352504F4D4C4B4948474645444241403F
+ 3E3D3C3B3A393837360002350133013202310005302F2E2D2C00022B00032A29
+ 280002270003262524000223022201210120021F021E011D011C021B011A0119
+ 02180317000D181B20262A2F34393D4042434400024502470148054900054A4B
+ 4D4F50000251015201530254015501540253000A51504F4E4C4B4A4948470245
+ 000D444241403F3E3D3C3B3A393837000236000D343331302F2E2D2C2B292827
+ 260002250005242322212000031F011E011D031C011B011A0219021801170116
+ 04150213031201110510020F010E020D010C010B080A0209000A0A0C0D0E1013
+ 15130D07050403050506070702060207020600000061B1B0AFAEADACAAA9A8A6
+ A5A3A2A1A09E9D9C9A989796949391908E8D8B8A888786858382807F7E7C7B7A
+ 787775747371706F6D6C6A696766646362605F5D5B5A585756545351504E4D4C
+ 4A49484645444342403F3E3D3C3B3A39383736353433320002310004302F2E2D
+ 022C00052B2A292827000226000325242300022201210220011F021E011D041C
+ 00041B1A191805170011181C212830383D41444647494A4B4C4D4E00024F0250
+ 034F000550525456580004590258000F575655545351504E4D4C4B4A49484600
+ 0245000444424140023F00073D3C3B3A39373600023500073332312F2D2C2B00
+ 022A0128012704250005242322212000031F021E021D011C011B021A02190118
+ 01170316021501140213031204110210020F010E020D010C010B040A020B040A
+ 000B0C0D0E101315130E070403000304030504060C07020600000060B0AFAEAD
+ ACABA9A8A7A5A4A2A1A09E9D9B9A9896959392908F8D8C8A888785848381807F
+ 7D7C7A797776747372706F6E6C6B6A6867656362605F5E5C5B59575654535250
+ 4F4D4C4A49484645444241403F3E3C3B3A393837363534333231302F032E0004
+ 2D2C2B29022800032726250002240123012202210120021F011E021D011C031B
+ 011A021900031A1917000316000C181B1E20232A323B43494C4D044F02500251
+ 01520254025600065758595B5C5D035E00145D5C5B5A59575655535251504E4D
+ 4C4B4A4948460245000444424140023F00063D3C3B3938360234000733323130
+ 2E2C2B00022A00032928270002260325022301210220021F031E011D021C011B
+ 021A021901180317021601140313041203110210020F00040E0D0C0B030A040B
+ 030A000C0C0D0F111315140F08040304050504060E070000005EB0AFAEADABAA
+ A9A7A6A4A3A1A09E9D9B9998969493918F8D8C8A8987858482817F7E7D7B7A78
+ 77757472716F6D6C6B6A6967666463615F5E5C5B595856555352504F4D4C4A49
+ 4846454342413F3E3D3C3B3A3837363534333231302F2E2D022C012B032A0004
+ 2928262502240123012202210120021F011E021D021C011B021A011902180717
+ 000C181B212B34383A3F444A4E500552000A53545556585A5C5E5F6002610362
+ 0261001B605F5D5C5B5A59575654535251504E4D4C4B4A494847464544424100
+ 024000073F3E3D3C393633000432000531302E2C2B00032A0128012702260325
+ 00032423220002210120011F031E021D021C011B031A01190118021702160115
+ 01140613031202110110020F00030E0D0C00050B010C040B000A0C0E0F111416
+ 15100905020404050406060702080707000002AF004EADACAAA9A8A6A4A3A1A0
+ 9E9C9A9997959391908E8C8A8987868482817F7D7C7A797776747371706E6D6B
+ 696867656462615F5E5C5B595856555352504F4D4C4A494746454342413F3E3D
+ 3B3A39380236023400073332302F2E2D2C00022B00042A292827032601250124
+ 0523012203210004201F1E1D021C011B011A021902180417000B191B1D20242B
+ 37485558560002550003565758000259025A00085B5D5E606162646504660265
+ 001F64636261605E5D5C5B5958575654535251504F4E4D4C4A49484746454442
+ 4100024000073F3E3D3C3936330004320130012F022D012C012B022A00032928
+ 2700022602250224000423222120041F011E011D031C011B021A011901180217
+ 0216011503140713011201110210020F010E020C010B050C030B000A0C0E0F11
+ 14161511090503040305040606070408050700000052AFAEADABAAA8A6A5A3A1
+ 9F9E9C9A98969493918F8D8B8987868482807E7D7B7A7876757372706E6D6B6A
+ 686765646261605E5D5B5A5856555352504F4D4C4A494746454342413F3E3C3B
+ 3A3837363534333202310007302F2D2B2A292800022701260125022404230224
+ 01260129022A0129012802290004282725230222000321201F00021E031D0010
+ 1E2023272B30374251626D6E6A66646202630264000565646566670002680369
+ 0268026700206665646261605F5E5D5B5A5958575655545251504F4E4D4B4A49
+ 474645444342044000073F3E3D3A373534000233000332302F00022E00072D2C
+ 2B2A29282700032603250124012202210320011F021E021D021C021B00041A19
+ 181703160315021401130314021301120111021000050F0E0D0C0B00030C010D
+ 010C020B00060C0D0E1011140216000311090500030403050306060708080207
+ 00000050AFADACAAA9A7A5A3A19F9D9C9A98959392908E8C8A88868482807E7C
+ 7B7977757472716F6D6B6A6967666462615F5E5C5B595856555352504F4D4C4A
+ 494746454342403F3D3C3B3A3837363433323130032F022E00072C2A28272625
+ 240002230222000D23242527292B2E32373A3938370002380004373633310230
+ 022F012E022D012B022A000F2C2E32363C424C5765707778746F6C00066A0269
+ 056A02690268002267666564636261605F5E5D5B5A5958575655545251504F4E
+ 4C4B4948474544434240023F034000073F3E3B3836353300023201310130022F
+ 00052E2D2C2B2A000228032703260004242322210320021F021E021D031C0003
+ 1B1A190004170316021504140213021201110210010F010D050C020D00080C0B
+ 0C0D0E10111402160003110A050003040305030604070C080000004DAEACABA9
+ A7A6A4A2A09D9B9A989593918F8D8B89868482807E7C7B79777573716F6E6C6B
+ 6967666463615F5E5C5B595857555452504F4D4C4A494746444342403F3D3C3B
+ 39383635343331302F00022E012D022C022B00052A2927252400042302240009
+ 26282C2F34373A3D41000244014304420003413F3E00023D00073E3F403F3C3A
+ 37000236000A383A3F444C555F686F76027A000477726F6C056B056A03690268
+ 016702660165016302620160015F025E001B5D5B5A5958575655535251504F4D
+ 4C4A494746444241403E3C3D3F00024100073F3E3C3936343200043102300006
+ 2F2E2D2C2B2A02290228022700052625242322000321021F031E031D021C0003
+ 1B1A19000318031702160115041402130212000411100F0E050D010E010D030C
+ 00050D0E1012140002160003110A050003040305020604070D080000004EADAB
+ A9A7A6A4A2A09E9B99979592908E8C89878582807E7C7A78767472716F6D6B6A
+ 68666462615F5E5C5A595856555352504F4D4B4A494746444341403F3D3C3B39
+ 383635343231302F2E2D2C2B022A022902270126042500122627292B2D303337
+ 3B3F42444546474847460345014403430003444546000247000345413F00023D
+ 000B3E41464D555E676D71737700027A00057874706D6C00026B036A06690268
+ 016702660003656463000262000C61605F5E5D5B5A58575554530251000D504F
+ 4D4C4B4947464543413E3D00023B013C013F02410006403F3C39353302310432
+ 0131022F00032E2D2C00032A0229022800032726250002240006232221201F1E
+ 021F041E00031D1C1B00021A0219011802170216021502140115021401130212
+ 000311100F00040D030E010D020C00050D0F1012140002160003120A05000304
+ 0205030604070D080000004BACAAA8A6A4A2A09E9C999794928F8D8A88868381
+ 7F7D7A78767472706E6C6A6866656361605E5D5B595856555351504E4D4B4A49
+ 4746444341403E3D3B3A39373635333231302E2D2C2B2A000229012802270426
+ 000E27282B2D2F3235383B3E4042444606470246064501460147034900034846
+ 430003410009444950575F676D7173000274000977797A7874716E6C6B00026A
+ 07690268026702660003656463000262000A61605E5D5B5A585653510250024F
+ 00074E4D4B4A484645000244000443413F3E023D013E01400242000641403D3A
+ 3634053302320130022F012E012C022B032A0003292827000226022500052423
+ 22212000021F0120031F021E011D011C021B00031A1918000217021601150214
+ 031501140313000412110F0E020D040E00080D0C0D0E0F10121402160003120B
+ 0500030402050306030709080209030800000046ABA9A7A5A3A09E9C99979491
+ 8F8C898785827F7D7B78767472706D6B6A68666462605E5C5B59585654535150
+ 4E4C4B49484645444241403E3D3B3A383736343332312F2E2D2C022A01290628
+ 000E292A2C2E3033363B3E414445464702480349014803470246044500044647
+ 4849034A000E484745444345484D545C646C71740276000D7574757678797875
+ 716E6C6B6A0003690668026702660265000D646362605F5E5C5A585653515000
+ 024D034E00054C4A484644000243014402450143024204410008424342413E3C
+ 393702350234023300063231302F2E2D032B022A022901280127032600032524
+ 220002210520021F00031E1C1B00021A00031918170005160215031601150214
+ 0005131211100F00040E020F010E020D00050E0F1012150002170003130B0500
+ 0204030502060407040807090208010900000043A9A8A5A3A19E9C9A9794918E
+ 8B898683817E7C797674726F6D6B69676563615F5D5B5957565453514F4E4C4B
+ 494746454342403F3E3D3C3A393736343332302F2E2D2C00032A0015292A2B2C
+ 2E2F31323436393C3F4244474A4B4C4D4C00024B034A02490148014705460147
+ 02480149014A024B014A01490247000B4647494E5359616970757900027A000F
+ 78777574757677797875726F6C6B6A000269066802670266000D65646362615F
+ 5C5A595855535100034F024D024E00054D4A4947460003450008464847464544
+ 4342024101420243000742403D3A3836350002340133013202310130012F022E
+ 012D022C022B012A022901280127022600042524232203210220031F00031E1D
+ 1B00021A0119021802170118021706160115021400041312110F030E00040F10
+ 0F0E020D00050E0F1112150002170003130C0600020403050206030705080A09
+ 0000003FA8A6A4A19F9C999794918E8B888683807D7B787572706D6B68666462
+ 605E5C5A58565453514F4E4C4B494746444342403F3D3C3B3938373634333230
+ 2F2E2D00022C022B00102C2D2F3033373B3F42444648494B4C4D024E034F024E
+ 00034D4C4B00024A0003494849000248014703480149024A014B034A04490011
+ 4C4F545B626970757A7C7D7E7D7B79777600027401750176027800087673706D
+ 6B6A69680567026602650008636261605F5E5B57035501530150034F0150024F
+ 0150024F00034C4B4A00054900074A48474644424000023F000A404243423F3C
+ 3A38363504330332000431302F2E022D00032C2B2A0003290003282726000225
+ 0124012204210120041F011D011C021B021A0219041802170118021702160115
+ 0214000313111000040F0210000D0F0E0D0E101113151718140D070002040205
+ 0306030703080C0900000035A6A5A29F9D9A9794918E8B8885827F7C79767371
+ 6E6B696663615F5D5B59575553514F4D4C4A494746444341403E3D3B3A383736
+ 35000234000332302F00042E022F000C313234383B3F43474B4E515202530154
+ 0253025201510150024F014E024D014C024B034A0149054A054B034A000C4B4D
+ 4F52575D636A71787C7F038100077F7E7D7B797776000274000C757677787673
+ 706D6B6A68660564016302620004605F5E5C035B000359565400025500055451
+ 4F4E4F00025103520005514F4E4D4C00024B034A000648474544413F023E0007
+ 3F4143423F3B38000237013602350234023303320131012F022E00042D2C2B2A
+ 0229000328272600022501240123022202210220031F011E011D021C031B031A
+ 041902180217011602150003141312000210010F02100211010F030E00041011
+ 131602180003150D0700020402050306030703080509040A030900000033A5A3
+ A19D9B9895928E8B8885827E7B7875726F6C696764625F5D5A58565452504E4C
+ 4A4847454442413F3E3C3B3938373534330004310330000F313436393B3E4144
+ 484C4F52545657000358025700085655545352504F4E024D024C014B024C044B
+ 034C014B044C000F4B4C4D5052565C61676D74797E8184000285000A84838280
+ 7F7D7B7977760374000B7677787774716E6B69666100045F035E015C025B025A
+ 035901580156035501540152025001510252000753545352514F4E00024C014B
+ 024A00074948464543414000033F014102430004403D3A390338013701360235
+ 01340233000332313000022F00032E2D2B00022A022901270126022502240123
+ 022201210420021F011E011D051C021B031A0219021802170116021500051412
+ 11100F0002100211000F100F0E0F101113161819150E07050400020503060207
+ 03080609070A0000002FA4A19F9B9895928F8B8884817E7B7774716E6B686562
+ 5F5D5A585653514F4D4A4947454342403F3D3C3B393836353400023203310011
+ 32333536383B3F44494D5052545658595A00035B015A0259000A585756555453
+ 5251504F024E024D054E054D024C00114D4E505254575B60656C72787D818486
+ 87000288001C8786858382807F7D7B7977757473747577787775726F6C68635D
+ 5A59025A0159025A045903580157065601550154025301520453000652504E4D
+ 4C4B024A000849484746454442410340000741434443403D3B00033901380237
+ 00033635330002320231022F00032E2D2C00032B00042A292726022502240123
+ 022201210320021F011E011D041C011D021C011B021A03190218021700051615
+ 1413110003100211000312111000020F000B111214161819160F080504000205
+ 0206030702080509090A0000002FA2A09D9996938F8C8885817E7A77736F6C69
+ 6663605D5A585553514F4D4B48464442403E3D3C3B3A39373534333231000232
+ 000E3335383D4145484A4E5255585A5C055D025C00035B5A5900025801570156
+ 025501540253035208510150014F024E00124F505152565A5E63676C71777C81
+ 8587898A028B00148A89888786858382807F7D7B797674727172747602770008
+ 7573706C67615B58045702580257045801570556025701560155025402530252
+ 025100064F4E4D4C4B4A0249014802470004464544430442000743454443403C
+ 3A000339023801370135023302320131023000032F2E2D00032C00032B292800
+ 0326022501240223012202210120021F011E031D011C021D021C011B021A0419
+ 031800071716151412111000021103120110020F000B111214161819170F0805
+ 0400020502060207030804090A0A00000024A09E9B9794908D8985817E7A7773
+ 6F6B6864615E5B585553504E4C4A48464441403E3C3B033A023B013901360334
+ 000F36393D40454A4F535658595B5C5D5E00025F025E025D015C025A01590258
+ 025707560255015602550254065300105456585B5F63696E74797E8185888A8C
+ 038D028C00108B8A89888786858482817F7D7B787571026E0003707376000277
+ 00097674706C67605B5857000256015701580359025A02590157055602570004
+ 58575554025202510250024F024E00044C4B4A49034802470146014404430144
+ 0246000544413E3B3A0003390004383735340233013202310004302F2E2D032C
+ 00032B29280003270126012502240223022201210220021F011E041D021C021B
+ 051A011902180006171615141312021102120003131211000210000B11121416
+ 181A17100905040002050206020703080309070A020B020A000000229F9C9995
+ 928E8A86827E7A77736F6B6763605C595653504E4B494745444342413F3E023C
+ 00133D4044474846403D3F4145494E5155585B5D5E00035F045E015D025C025B
+ 035A0359035804590258025701580557001258595C5D6063676B6F74797E8286
+ 898B8D8E048F018E028D00168C8B8A89888786858482817F7C7875716D6A6C70
+ 73760277000B7675726E69635F5C5A595800025A045B015A0259015805570358
+ 015701550453025201510250024F024D00034C4B4A0002490248014705450146
+ 0247000545423F3B3A00023902380004373635340233013202310008302F2E2D
+ 2C2B2A29032803270126022501240223012201210320021F021E031D021C051B
+ 011A0219000518171615140005120003131211000210000911121416191A1710
+ 090004050206030701080309070A030B020A000000199D9A97938F8B87837F7B
+ 77736F6B67635F5B5855524F4C4A47000245024401460147024800064746484B
+ 5157025B000B57514E4F515457595B5C5E00045F015E015D035C025B025A025B
+ 025C015D015C025B035A015B015A02590158025900155A5B5C5D5F616366696D
+ 7074787C7F8386898C8D8F00039001910390018F018E028D00068C8B8A898887
+ 0286001B8482807C78726F6E6C6B6D7073767778777673706C68645F5C5B5A00
+ 025B055C025B045A0659015701550254000355545300025202510150024F0004
+ 4E4D4B4A034902480547000C484744413E3C3B3A383738370236013502340006
+ 333231302F2E022D00032C2B2A00022904280127022602250124022301220321
+ 0220021F011E021D011C011B021C031B021A0005191817161500021302120004
+ 131413120210000911131517191A1811090003050306030701080309030A080B
+ 010A000000189B9995918D8984807C78746F6B67635F5B585552504D4B490248
+ 00064A4B4E51545602580004595A5D6002620160015D025A025B015C025D015E
+ 025D015E025D00045C5B5C5B075C025D025E015D015C025B025A035C00145D5E
+ 60616366696B6F72767A7D818386888A8C8D028F019008910190028F00038E8D
+ 8C00028B000C898887868583807D78726D6C036D00056E70737677000278000A
+ 7774726F6A65605D5C5B025C025D045E015D045C000B5B5A5B5C5B5A59575655
+ 560002550254015301510250024F00044E4C4B4A044901480347000748494845
+ 413E3D00023C013903380237013602340133013202310130012F022E012D022C
+ 012B042A022902280327000426252423022202210004201F1E1D021C021B031C
+ 021B011A0119021800061715141312130314011303110008131517191B191209
+ 03050206020703080209040A090B000000159A97938F8B86827D7975706C6863
+ 605D5A5856545300045100075356585B5E606200026305620161025F055E045D
+ 015C015D035C035D045E015D025C025D025E025D025E00165F61636567696C6F
+ 7275787B7E8185888A8B8C8D8E8F0290049106920291029000038F8E8D00028C
+ 000B8A8988868482807D79757100026E026F00066E6D6F727678027900087776
+ 73706A645F5D045C00095D5E5D5E5F605F5E5D00045C035D00045B5A59570355
+ 015601550254000A535251504F4E4C4B4A490448000447464748024900084643
+ 41403F3D3B390438013702340233013202310330022F012E042D012C022B012A
+ 0229022800082726252423222120021F00031E1D1C00041B031C021B00061A19
+ 18171614031301140215011302110009121315171A1B1A130A00030502060207
+ 03080209040A090B000000139895918D88847F7B76716D686562605F5E5D5C00
+ 045B00075C5D5F60626364000363026202610260015F045E035D015E075F0260
+ 035F065E00185F6061626465676A6C6F7276787C7E818486888A8B8D8F900291
+ 0290089107920191029000108F8E8D8C8B89878583807E7C7A78767502730008
+ 71706E6C6D71757702790007787674716B646000025E035D045E00056062615F
+ 5E00045C035D00055C5B5A5856000255015602550354000452514F4E024D0003
+ 4B4948000447000346474900024A000749464442403E3C000239000538393837
+ 350004340433033201310130022F00102E2D2C2B2A292A292827262524232120
+ 021F021E011D011C041B051C00061B1A191816150414021501130211000A1213
+ 15171A1B1A130A0602050206020702080309030A070B020C010B000000129794
+ 908B86817D78736E6A656463646564630562016301620263036201610360015F
+ 095E025F01600161026207610160015F026000176162646667696B6D6F717477
+ 7A7E818487888A8C8D8E8F00039001910492059104920191079201910290000A
+ 8F8D8C8B888682807F7D037C001A7B7A77757371706D6B6C707477797A797775
+ 726E696462605F5E025D035E0005606261605F00025D015C015B045C00045B5A
+ 595703560355000656555452514F024E014C014A02480249014A0249014A024B
+ 00084A474542403E3C3A0239013A023902380437013602350234000333313000
+ 022F012E012D022B012A0229022800062726252423220220021F021E011D031C
+ 011B011C031D011C011B021A0003191715000414021501140212000A13141517
+ 1A1C1A130A0602050206020702080209030A040B060C010B0000000E96928E89
+ 847F7A75706B6764656702680167016503640263016202610260025F015E065D
+ 015E015F02600861036002610003626364000265001267686B6E717477797B7E
+ 80828487898C8D8F0290049103920191069201910E92000A91908F8E8C8A8987
+ 8481037E037F00067E7D7A76726F026E00076D6A6B6E73777900027A000B7877
+ 74716C6763615F5E5D00045E0460025F015E015C025B015C025D00045C5A5957
+ 025600045756555602570008555452504F504F4D024B034C044B000B4C4A4743
+ 403F3E3D3C3B3C00023D023C013B013A02390003383736000235000334323000
+ 032E00042D2C2B2A042900032827260002250003242321000220041F021E031D
+ 021E021D00071C1B1A1918161500021401150216000D151312131416181A1C1B
+ 140B060002050206020702080209030A040B070C0000000D94908C87827D7873
+ 6E69656467000269000368676400036300046261605F025E035D025C025D025E
+ 00035F606100036201610360035F00156061626466686B6D6F7174777B7E8285
+ 87898A8B8D00028E00038F9091000292019301920393079203930C9202910008
+ 908F8E8D8B8987850284000D82818081828381807E7C78736E00026C00086D6C
+ 6A6B6F747879027A000C797876736E6863605E5C5D5E035F035E025F0003605F
+ 5D00025C015D025E00045D5A595807570004565554530352000351504F00024E
+ 014D014C044B00084C4B48444241403F023E023F023E00033D3C3B0002390237
+ 000636353433312E052D012C012B032A01290128022700052625242322000221
+ 0620011F011E021F021E021D00051C1B1A191700031501160217011503130009
+ 1516181B1C1B150B060002050206010703080209020A030B090C00000013938F
+ 8B85807B76706B666364686968676563620002610160015F025E045D025E015F
+ 0360025F0006605F605F605F026000136160616365686B6F7275787B7F818487
+ 8A8D8F0002900291059207930194049302920193019203930992000A91908F8E
+ 8D8B8987858403830184058500098483817E7B7976726E00046C00146B6D7175
+ 78797A7B7A7977746F6863605E5C5D5F0360015F025E015F0260015F035D015E
+ 025F015D025A0159015702560357015601540353025400085352504F4E4D4C4B
+ 034A014B024C00074B48464442414000033F013E023D00043B3A393703360135
+ 02330131012F052E012D012C022B022A00042928272602250124012302220121
+ 012004210420021F011E011D021C00041B191716021501160217011603130009
+ 1516181B1D1C150B060002050206010702080309020A030B060C030D00000012
+ 918E89847F79746E696461626768676564620360025E015D025E025F02600361
+ 0160015F025D025E026000166163646667686A6E71757A7E8285878A8D8E9091
+ 929303940D93039401930194089304920291000A908F8E8C8B89868584820281
+ 0004838485860388000D87868482807E7C79787673706E00046D00056E727678
+ 7A00037B000B7A7875716C6663605E5F600002620161015F025E015F0260015F
+ 035E00055F605E5B5900025A0158025502560003555452000251015302540003
+ 53504E00024D014C014B024A000F494B4C4D4E4D4B49464341403F3E3D00023C
+ 023B013A0138023702360005353433323100052F012E012D022B022A00032928
+ 2700032601250124022301220821032000081F1E1D1C1B1A181703160218000D
+ 161413141516181B1D1C160C060002050206010702080209020A030B040C060D
+ 0000000D908D88827D77726C67615E5F64000266000464636160025F015E025D
+ 035E025F016004610018605F60626466686A6C6F7174777A7E8185888B8E8F90
+ 929302940595029406930C94039303920291000D908F8E8C8A89878685838281
+ 820002830004848587880389000E88878583817E7D7C7B7A7977747203700008
+ 6F6E707477787A7B027C00087B7977746F696561025F0005606263626000025F
+ 00056062636261000260025F00075E5B595A5B59560004550154015302520005
+ 535453524F00034D024C014A0249014B014C034E00074D4A464342403E00043C
+ 00043B3A393802370236013501340233013201310230022F00042E2D2C2B022A
+ 01290228032702260003252322000421032202210220021F00061E1D1C1B1917
+ 0216011702180008171413141517191B021D0003170D07000205010602070208
+ 0209020A020B040C070D0000000A8F8B86817B76706A655F025C016102650007
+ 646361605F5E5D00025C035B00075C5D5F6163656700026800126A6D70727579
+ 7C7F818386898B8C8F909293039401950696019502940193029402930E940292
+ 000A908F8E8D8C8A87858380027E017F02810005838487888900048A00098987
+ 86858482807E7D00027C00067D7B797776740473000872747576787A7B7D027C
+ 00077A7875706A656100025F016103630162026001610163036400066361605F
+ 5E5D035B0159015705560155015404530003524F4E00044D014C024B024D014E
+ 024F00074D4A464341403E00043C00033B3A3900033802370136013503340132
+ 02310004302F2E2D022C012B012A022905280003272624000223062204210120
+ 011F021E00041D1B1A180317000418191815021400041617191B021D0004170E
+ 07050206020701080309020A020B030C080D000000188E8B85807A746E69635D
+ 59585D6265646361605F5D5C5B5A03580017595B5F646A6E717476797C7F8285
+ 87898B8D8E8F9091920002930294039507960395039403930494059302940006
+ 9594918D89860284000383807D00027B027A00107C808487898B8C8D8C8A8887
+ 868483810280017F037E037D00077C7A78777675760003770175027300037579
+ 7C00027D000B7C7B7976716A64615F6061000363026200036162640003650006
+ 646361605E5D045B02590358025701550354000453525150034F0150014F024E
+ 014F014E034F00074C48454342403E00023D023E013D013C023B00063A393837
+ 3635033401330232000431302F2E022C00032B2A290003280329000328272600
+ 022501240323022205210120021F00071E1C1A19181718000219000E18161516
+ 191D1E1F201E180E07050306010701080209020A030B020C050D040E0000000E
+ 8D8A847F79736D68625C575559600263000962615F5E5C5B5A5958000257000F
+ 585A5F69737B7F828487898B8C8E8F0002910392029303940595029604970196
+ 02950494029301920293029202910190028F01910192029400058F87817E7D00
+ 027F017E027C037D00048083888A038C00058B89858281000480017F027E017D
+ 027E027D00047C7B7A79057A000379777300026F000F73787C7D7E7D7C7B7873
+ 6D686563620006630262016301640265026400056261605E5C00025A025B045A
+ 0003595856000455025401530252015301520251055000044F4C474502430142
+ 01410440000A3F3E3D3C3B3A3837363503340333000532302F2E2D00022C012B
+ 012A03280129012A0229000328272600022501240123072202210006201F1E1D
+ 1B1903180010191A1916171F293135332E251B0E07050306010701080209020A
+ 020B030C040D050E000000168D89847E78726C67615C5652555C626362605F5E
+ 5C5B035A01590258000C5A616F7E86898B8D8E8F909102920193099403950296
+ 0697000396959400039301920191039000058F8E8D8C8A00028900038A8C9000
+ 0293000590898381800002820181027F0180028100048285888A028B00048987
+ 847F027E017F01800281017F027D017E027F017D017B037A017C027E000B7D7C
+ 7A78746F6C6E74797C00037E00097D7C7976716D696665000263026206630264
+ 000763646362605E5B00025A025C015B035C00045B5A58570358025702550254
+ 00055352515051000250025100074E4A4846454443000242000B41403F3E3D3C
+ 3B3A3837360005350234000433312F2E022D00032C2B2A000329042A00052928
+ 2625240002230422022302220121022000041F1E1C1A031800101A1B1A171D2E
+ 48595F5747311F0F08050206020701080209020A020B030C030D060E0000000B
+ 8D89837E78716B66615B550002510159016002620003605F5E00025C025B025C
+ 00095A595B6374848B8E8F000290019102920293029408950596039702960003
+ 95949300029100058F8E8D8B8A0003890003878685000283000B84868A8E9193
+ 928F8B88850002840183028204830003848586000288000386848200027F0003
+ 808182000283000782807F8081807E00027C017D017F0281000D7F7D7A777472
+ 6F6E71757A7C7E00027F000C7E7D7B7875716D69666463620263056402630162
+ 02630004615F5D5C025B035C015D035E015D015C045B00035957550002540003
+ 535251000250035102520006504D4B484544024202410004403F3E3C033B0139
+ 01380637000636353432302F022E022D012C052B022A00042928262502240823
+ 0222000621201F1E1C1A031900101A1B1A1823406D8995846640230F08050206
+ 010702080209020A020B020C030D070E000000158C89837D77716B65605B544F
+ 4E555E626361605E5D00035C000B5D5E5D5B5C6475858D8F9000029103920293
+ 019403950003969596000295069602950194019302920008918E8C8B8A878483
+ 0281018201830382000D80818386898C8E919493918D88000386018502830006
+ 8281828384850286018404810004828385860287000385838200048104830004
+ 817D787502720171026F00057174777B7E00037F000A7E7C7977736F6B686564
+ 0263016401630464016303620160015F045D015E035F016001610260025E015D
+ 015C025A0003585553000352015103500251015202530007514E4B4745444100
+ 0340000541403F3E3D00023C00033B3A3900053800073736353332313000032F
+ 012E042D012C022B00042A292827022602250624022300072221201F1D1B1A00
+ 021900101A1C1B18284D84A9B3A07A4A270F08050206010702080209020A010B
+ 020C030D080E000000158C88837D77716A645F59544E4C515B62646261605F00
+ 025D00045C5E5F5E025D00056372838C90000391029203930194029504960195
+ 0496019502930003918F8C00048A0188028600048583807E027D017E017F0380
+ 000D7F808285888B8D909495938F89000286000487858382028101840585000E
+ 827F8082848587888A8B8A8885840282018301850286000683817E7A75740373
+ 0007716F6E7073797D000280027F00097D7B78746F6A67656400036302620163
+ 01640265000363626000025F00046065676A036B00066A686663615F025C0004
+ 5A5857560253000452555859025A0003595653000354000353504F00024D0006
+ 4B4744424345034700124643403E3C3D3F42434544413C383634333203310130
+ 022F012E022F01300233000634312F2A28260225032401250224022301250128
+ 022A00052927221E1D00021C0004192A528E02B30009AD8352301B15100D0900
+ 0208000A090C11131614130F0E0D040E050F000000108C88837D77716A645E58
+ 534D4A4E5861026300096261605F5E5D5E5F6000025E0006616D7F8A8F900391
+ 02920293029401950196039501940293001292918F8D8C8985807F8082838281
+ 8281807E067D017E038000108183878A8C8F939695908B878687858202810182
+ 03850384018202810005838587888900038A0003898784000283000B84868784
+ 7F7D7C7A7877760002750172016F026C000371787D00048000077E7C78726C67
+ 65000264016302610260000C616365666463626368707A800282028000097E7C
+ 78726C645E5B59000257000E5554575D656C7174736F675F5A570256015A0160
+ 0265001C60574D4749505A5F615D554A444349535B5F61605A51473E38363433
+ 023201310130022F000B30353F484E4F4A40332A26000225022404250028282D
+ 3641484C4A463D3228221D1A2A528EB3B4B08B62493C383125190E0A0C16242F
+ 332F2619110D040E050F000000108C89837D77716A645E58524C484A545E0363
+ 00106261605E5D5E5F605F5E606979888F90049101920493029402930007918F
+ 8D8C8B89870002850182017E027B017C067D037C017E027F00047E7D7E800281
+ 00078082868A8C8F930002960007938E8A8785838000027F0180018302850184
+ 03830282000383858700038802870003888684000283018502860183027E0009
+ 7D7C7B7A787776737000026D000470777C8002810007807F7D79736C66000364
+ 0003626162000263016401660267001666656467738496A0A3A2A19E9D9B9790
+ 86796C635D5A0258002F5C677586929A9D9B9488796B60595C687D898D826F59
+ 4D52657A85887E6D594E546576848C8F8C84766452433A3634000233000E3231
+ 302F3240556B797C705C413002260425000826272B34465A6D79027F000B796C
+ 5A4532251D2B528FB30002B400039A7F73000270000F67523A20111326455B66
+ 5B4629160D00020E070F0000000C8D89837D77716A645E58524C024700034F5B
+ 620004630161015F025E015F026100065F606674848D02900391029201910190
+ 028F028E00048D8A88860285000C83828182807D7B7C7B7A797A037C027D0008
+ 7E7F8081807F7E800383001084878B8D8F939697958F8A858382807F027E0180
+ 0183028402830184018502840185018602870186038501840382018402850182
+ 0380001D7F7D7C7A797673706F7071777C80818281807E7B77716C6967666566
+ 6800026901680269000C686766656B7B94AEBDC2C1C002BF0010BEBCB7AC9D88
+ 74645D5A5E6D829AACB702BC0013BBB8AE9D887262647596ABB3A38764566180
+ 9D0002AD00129B7F6561718BA1ACB1B2B0ADA18E735843370234013301310230
+ 000C2F364A6C8FA4A997795036280227012602270008282A384F6D8A9CA402A7
+ 000BA49C8B715236222D538FB30002B40013AFA3A0A1A29A87673F1F1D366588
+ 998967391B00030E050F0210000000118E8A847E77716B655E58524C47454B56
+ 6000036300106462615E5D5E60626160636D7D8A8F9004910004908D89870286
+ 0287018601850384018202800004817F7D7C027D027C017D027E017F03800004
+ 818284850283018501870388000B8A8C8D8F929698948D87820002810008807E
+ 7C7B7D8083850286000387888700038500078687888785828100028001820384
+ 0181018002810180017D027B00037A777300027100057375797D80000382000F
+ 817F7D7A76726D6967686A6C6D6C6A0002690268000667666C7F9EBD04CC05CB
+ 0010C9BDA78C72615E6A83A1BAC6C7C3C0C102C50028BCA78A706C7EA5BFC3B8
+ 987264779CB9C1BCA2816E7792AFBDBEB9B5B7BCBDB29774523E353433320331
+ 000438517AA502BA0006B08B5A3A2A29042800162A344C7195AEB7B4ADACB0B4
+ B09A774F2F30538FB3B402B50012B3AFB1AEADAC8F6235283F769FAFA077411D
+ 020E040F0410000000128E8A857F78726B655F58524C474346515D6202630264
+ 01620160025D015F0262000760616876858D9000049100048F8A858102800181
+ 048300038483810002800282058003810003808183000284000385878800028A
+ 0189048A0289028A018D0192029700069289837F7E7F0280037F000380838600
+ 0388018A01890288028601870289000986838180818283848300028100118281
+ 7F7C7A7C7B78757475787A7B7E8182000283000882807E7C7975706B026A0006
+ 6D6E6F6D6B690267036800046E81A2C202CD02CC0003C9C5C60003CC0009CBC0
+ A5826A66799AB90002C80005C1B0A7ABBC0002C70007BEA3817583AAC40002C3
+ 0005A7877D91B10002C10016B69477748DAEC0BFB7A3989EB1BEBDB390674838
+ 36350233023200043A5480AC02BA0006B8915D3B2A2903280006292E416690B3
+ 02B70015A28E8C99B0B4B5988D6C657BA3B3B4B5B6A99D9BA90002AD000DAA81
+ 4A323D6B91A2916C3C1B0E00050F0410000000128F8B867F79726C666059534D
+ 4742434B586002630010646563615D5C5E6162605F636E7F8B8F0291000A9291
+ 908B847E7B7A7B7E028000038182810002800004818485840383018503860185
+ 018603880189018A048B00058A89888785000284000A868A909698948C86827F
+ 028004820006818385878889038B000C89868587898A88868482818202830006
+ 82818081807E027B027D017C027A017B017C027D00037F818200028300088281
+ 807D7A77726D026C016E026F00036E6B690002670168026900046F82A3C302CD
+ 0003CCC6B20002A801B501C502CC0010CBB895767087ABC7C8C6AC92848BA4C0
+ 02C70006B38F7E86ABC502C40004B9A39CAB03C1000EA47F6D7CA0BFC0BD9F7F
+ 6E7895B502BD0006A47A553E37350234023200043A5480AB02BA0008B9935F3D
+ 2D2C2B2A0229000F334E7CA8B8B7A780625C749AB4B5AD0004FF01E102B40007
+ B5A887706F88A90002AD000C935C3735567785785731180E020F071000000019
+ 908C86807A736D67615A544E48434146535E6263646564625E00025C00095F61
+ 605F606877878F00029102920009908B837B7776787B7E00057F000580838689
+ 8800028701880189038A01890188048702890388000587858483810002800004
+ 83878D9402980007938E87807E7F810002830184038502840187018B028C000E
+ 8A8786878889888785838283828103800281017F027C017F0281027F037E0004
+ 7F808183028400088382807E7B78736F026D026E00046F6D6A68026700076869
+ 6A6F83A3C30002CD0010CCB89B888697B0C9CCCBC5A5827B91B602C80007BE9B
+ 7C6B7491B60002C70007BC9A858BACC6C50002C401BE01B903C10006B38E6D69
+ 84AC02C10007B48C65515D7FA90002BD000FB1875D41373534333231395480AB
+ BA0002B9000D9A6E5245433F38322E39588BB40002B800079665433D5886AE00
+ 02B504FF01E102B40007B595684B4A6B9B0002AD000C9C68392E446470654526
+ 150E020F05100111011000000015918D87817B746E68625B554F494440424D5A
+ 6062630002650005635F5C5B5D000260025F00046370818D029200069392908A
+ 81790275000E787A7D7F8081828385878A8C8B8A038900068A8B8A8784820281
+ 00038284850002830585001D84838283868A919799979188807C7D7E80828588
+ 87848384888C8D8C8A000387038800038785830003820581001B828180818485
+ 848381807F7E7F8081838485848381807D7974706E00056D016A016802670169
+ 026A00047083A3C302CD0008CCB18D7670819EBE02CB000FCAAE8D8497BAC8C9
+ B99472606A88B10002C70006C09E888DADC602C402C301C202C10007BFA07960
+ 6688B10002C10007AF835A445173A30002BD0008B58C5F423735333202310004
+ 3A5480AB03B90016AA8B776D6A655A4B3D425F92B7B8B58E59352F4C7CA902B5
+ 04FF01E102B40003B28B58000238015C019202AD000C9F6C3B2E477181724825
+ 130E020F0410021101100000000E928E88827C766F69635D57504B4502400023
+ 49575F6162656665615C5B5C5F61605E5F697A8A91939493918A807977787C7E
+ 82858700058900058A8B8A89870002860005888988837E00027C00037D7F8300
+ 0584001C85888A89868584868A909698968E857E7B7A7B7D80868A898887898B
+ 028D018B01880287000688898887868502840003858483000282028301850286
+ 01870288000486848281027F00047E808284038500098482817E7A76716E6D00
+ 026C026D00056B6A69686900026A000E6F83A3C3CECDCBAF8870667691B803CB
+ 000EB5928797BAC9CABC9875626C8AB302C70006BF9E878CADC602C402C303C2
+ 0018B69069566186AFC1C0B1875F485577A5BEBDB38A5D413635023200073132
+ 3B5580ABBA0003B90017AEA4A09E988B755A516391B7B8B7905D39324F80ABB5
+ B60004FF01E103B4018E015C023E0161019502AD000B9D69393252859885532A
+ 1300030F021005110000001A938F89837D77716B645E58524C46413F45525D61
+ 62646766625E025B00035E616000025E00056473849094000295000F938E8682
+ 7F808384878A8B8C8B89860002840285018403830005868887817E00027D0003
+ 7E80840002860005848382848900028D018B0289000A8A8D919598968E85817F
+ 027E000380838800028B000A8A8B8C8E8D8C8987868703880187028802890003
+ 888784000283018501870289038A0005898784818000037F0004808284850286
+ 00098583827F7C77726E6D00026C036D016C016A026900068FB4B7C1D1E102E7
+ 0008E6D0A87765738DB403CB000EB79485AADBEEF1EEDAAC787F9BBC02C80007
+ DDCBC2C6CCC7C60002C501E003E10010DAA368535C99D6EBEEEBD39E626989B0
+ 02BE000EAC82583E3534333266999EABC1D005BA02B802BA0007B39F7F6772B7
+ E00002EC0007DFB4684B658FB40002B504FF000AE1B6D1E7E4CE8E5876A102AD
+ 01C301AF029B0007A599AD9861321600030F021005110000001A94908B857F79
+ 726C66605A544E48423F424D5A6061636667645F025B000A5D60615F5E616C7D
+ 8C940296000595938F8C88000486028800088786837F7D7E80810382000B8385
+ 8786827F7E7D7E8185000288018602840187018C0290018E038C00038E909400
+ 02980009938E8B87848384868800038B000A8C8D8E8D8A87858485860288000D
+ 898B8C8D8E8C8A88858385888B00038C00058B8986817E00027F038000038284
+ 8500038600078483807C76716E00026D016E026F00036D6B6A00026801B30AFF
+ 0006FDC4818EB5CC02CB0003B89EDC0007FF0004EFB4B2C802C904FF0005E9C8
+ C7C5D70004FF0005F69F786DD20007FF0003ECA6A40003BE00059D734F3C3600
+ 0335019A04FF01F403BB0004BAB0AAAF02BA02B900039FB0F50006FF0004FDC3
+ 8BA602B501A704FF01EB01F205FF0003DA9AAE0002AD01EF03FF0007EB9DAF9D
+ 69371800030F0110041102120000000F95928C86807A746E68625C564F494400
+ 023F001647545D6062656765615D5B5C5F61605F606776889296029700099694
+ 918E89878483820002810007807E7C7B7D808200028302820004848685830380
+ 000A8184898B8A878687898E0290018D018A0288000A8A8D92989A9995928C87
+ 0285000486888A8B028A000E8B8C8B8885848382838587898C8D028F00088D8B
+ 89858385898C028D00078C8A87837F7E7F000481000382848500038700068584
+ 817D756F026C016D026F00036E6D6900036701B30CFF0004F2A4B8CC02CB01BD
+ 01EE09FF0005FED6CAC9B80004FF0005E9C8C6C7F70004FF0004D7B29EEA09FF
+ 01FE01CF02BF0005AA8660463A000437019B04FF01F402BB0007BAAB8E8088A2
+ BA0002B901D40AFF0005E9B7B5AD8C000CFF0005DEAEAD9CEC0003FF0008ECA2
+ AFA3713B1A0F0210041103120000001796938D87827C76706A645E58514B4641
+ 3E424D585E616400026701640160025D015E0261026000066570828F96970298
+ 000796938F8984817E00027D00037E7F7D00027C00037E818400028502820284
+ 01830482000583878B8D8B0002880189018B028D00038B8682000280000B8388
+ 8F969A9B9996908A8500028401860189028A028900038A898600028400068281
+ 8285888A028B00098E8F8D8C8A8684858A00028C00058B8A8885820002810009
+ 83848382818283858700028800078685827E78726F00026E027000076E6C6967
+ 6869B5000DFF01F101C202CC01CB01E504FF0003ECD8EC0004FF0004F9C4B49E
+ 04FF0004EDC8C6DD04FF0004EABDB6E004FF0003E9D1E80004FF0008F7B8A68B
+ 6B4E3F3A02380237019B04FF01F401BB02BA00099C725D6488AFB9C6FE0003FF
+ 0004FAD0D5F704FF0004D0A38A6906FF01F901FB04FF0005FEB69B79E70003FF
+ 0008EDA7AFA778401D0F0210021105120000001098948F89837E78726C66605A
+ 534D4842023E000A46535C60626769676360025E001761636261636B7B8B9497
+ 989997948F87817C7A797A7C7E00037F00078082858785828000028102800381
+ 01830187028B00038A888900038A00048885827F027E000F82878D93999C9B97
+ 918A848283858800028B01880286000484838486038701880489018D02900008
+ 8E8B8785868A8B8A028800038786850004860184018302810003838587000288
+ 0007878684807C767300037000086F6D6A6867696CB704FF01FB02E701EB01F6
+ 05FF0004E1CDCCCE04FF0005E07F8FA0D90004FF0003C895810005FF0003E6CA
+ FB0003FF0004FDA39FAF04FF0005DB697B90D20004FF0009BD816852433C3A39
+ 38000237019B04FF01F401BB02BA00089A6E575F84ACB9E604FF00057F5E7796
+ F80003FF0004F1785E4605FF0004BF8C88DB04FF000FB56D4DB5C0C2CCD1ACAF
+ AC7F45200F00021002110512000000189996918B85807A746E68625C554F4A44
+ 3F3D424D595E6064026900166663605F61636463646874849196989998948D84
+ 7E7A027900047A7E80810282000581828485830003810180017F027E027D0004
+ 818587880287000688898A88858402830282000584868B909600029B000D958E
+ 878281828386898B8884830002820005858A8D8E8C00048A00068B8E9192908C
+ 02870004898C8B88038600088788898887868483028200038385870002880007
+ 878684827E787300037000036E6C6A00026900036B6EB80004FF01F703CE01C6
+ 01EB04FF01F702CD01D604FF00059F6A737E980004FF0003D3776B0006FF01F6
+ 04FF0004BC6B73AB04FF000593525B68860004FF0005CA5C4F443D00023A0239
+ 000338379B0004FF01F403BB0008A683717996B5B9F703FF0006E9353F4D5AC8
+ 04FF0003633A2E0004FF0005E650544E7A0004FF0008B43926150C1D468303AF
+ 0003854922000310021104120113000000209A97928D87817C76706A645E5751
+ 4C46413D3F48555B5D61686B69666260616403650006676E7D8C95980299000B
+ 968F86817E7B7C7D808182000283018202810280018102830003817F7D00037C
+ 00037F8385000387000788898B8985838500028600068586888A8E94029A0003
+ 92898300027F0008818284888B89848102800007858B8F91908F8E00038C0005
+ 909293928C00028700058B8D8C8987000286000688898A898886028503830185
+ 018702880007878685837E766F00026D00036E6D6C00026A00046B6D6FB804FF
+ 0003F7CFCE0002CD01D705FF0003D0C5D50004FF0005866465696D0004FF0003
+ D76461000AFF0005F15E5557AC0004FF0005754A4B4F530004FF0007CF47423F
+ 3C3B3A000439019C04FF01F701CC02CB0005C9B19EA3B30002BA04FF0006C92F
+ 31353B9F04FF00035D27240004FF0005C52D2F2E480004FF0004AE17102F03FF
+ 019603AF0003884A23000210021103120313000000119C98948E89837E78726C
+ 66605A544E494300023E000A4450595B5F666B6C686402610163016603670005
+ 6B7787939900029A000898948E88827D7E80048200048382807E027C00057F83
+ 858482000281038000038284850003870006898B8A8786870288038900088A8D
+ 92999A93898302800282018301850288001C84818082858A8E919291908E8D8E
+ 919395928C87888C8E8D8B8A898A028C00038A88870002860185018402830184
+ 0186038800068786837E766E026B026C016B026A00046C6E70B804FF0003F7CF
+ CE0002CD01D105FF0003CEAFC60004FF000590646362660004FF0003D15D5E00
+ 0AFF019B014E024C01A004FF017E01490247014C04FF01C9024000033F3D3C00
+ 033B00033A3B9D000AFF0003F7DCBC0002BA01FD03FF01D2022D00032C2D9D00
+ 04FF00035221220004FF0005C61C1D1F460004FF019E0208014603FF0007A0AC
+ AFAC844A23000210011103120413000000219D9A95908A857F7A746E68625C56
+ 504B45403E414B565A5C636A6D6A666261636700036900066A728291989A029B
+ 000498948F8902830003848382000281000482838180027F0181018405850184
+ 0183028200038384860002880003898B8A00028902880189018A038C00078E93
+ 989A968C84000280038100058387898783000282001285888C909291908D8C8E
+ 919596928C898B8D028E048F00048E8C89870486018401830281018401870288
+ 0006878684807870046B00076968696B6D6FB70004FF0003F5C3C80002C701C6
+ 05FF0003BB93A20004FF0005B86564628D0004FF0003B65E5F0009FF0006F45F
+ 504F4E7F04FF01AB01490247017B04FF01AA01420241013F023E023D023C019D
+ 0CFF0004ECAEA1E603FF0006F93C2E2D2CD103FF0004FC31222304FF0005F42B
+ 1E1F7A0004FF01780207016203FF0008A292A49372411F100211021205130000
+ 001A9F9B97928C87817C76706A645E58524D48423F404853595A5F67026D0006
+ 68636163676A036B0005707D8D979A00029C00089B98948F8987868404820283
+ 00038283840002830185028602870008868584828182848702880289048A018B
+ 018D038E00088F92979A99918883038200138182858987858486888B8E919290
+ 8D8A8B8F930002960008918B898C8F909192029100048F8D8B88028602870003
+ 86848100027E000B82868889888785827B736D00026C00086B6968696B6D6FB7
+ 04FF0006F2A6AAABAAA905FF0004A47B74F003FF0005FA9B6680E80004FF0003
+ 83605F0004FF01E201E604FF0006C854504F53EE03FF0005F9884B69E40004FF
+ 00076D45444341403F00023E00033D3C9D000DFF0003BE73A60004FF0004C447
+ 359604FF01C10222012305FF0004CD5E75F504FF01360207018403FF0008A466
+ 726752311A10021102120313021400000022A19D99938E89837E78726C66605A
+ 554F4A45403F454F57595C646C6F6B656263666A026C00126B6E7888949A9C9D
+ 9C9B97938D888583828302820006838485868786028401850186028702860185
+ 01830281018301860288000387888900028B018A018B028D00158C8D8E91969A
+ 9C968C868382838182848889888A8C00028D018F02910190018E028C000A9093
+ 9594908B898C8F9102920006908F8D8B89880389000488868480027D00038085
+ 8800028900068786837E766F026D00086C6A68696A6D6EB604FF0006EE888B8C
+ 8A9305FF00048C6D6BA00BFF0004CB62605E04FF0003DA82E70004FF0005C652
+ 4E4D8D000BFF000DC24746454341403F3E3D3C3B9C0004FF0005EE8082A2EF00
+ 04FF0004EB4C48DE0AFF01FC014D03230CFF01C4010A020701A503FF0008AE36
+ 3C372D1F141002110112031303140000002AA29E9A95908B85807A746E69635D
+ 57514C47423F424A54585A616A706E686463666A6D6C6B6D73819099039D0006
+ 9C9A968F89840383028201850487018601850284018504870286000F85838284
+ 86878687898B8C8B8C8D8C00028B00088D91969A9D9A91880384000483828487
+ 0288018B028E00038D8E90000391000C8F8D8F9192918D89888B8E900291018E
+ 018C028B038C00068B8988868480027D000B8085888A8988878580787100026E
+ 00086D6C696A6B6D6EB704FF01EC017502770175019D05FF00056F696A6BAD00
+ 09FF0005D86A605E5C0004FF0004D66975EA04FF01C50151024D019C09FF01D1
+ 01500246000A4443403F3E3D3C3B399C04FF01E602410140017305FF00044733
+ 45E008FF0003F86F2600032304FF01B301FB05FF0003F5400B00020701BC03FF
+ 0009BC171A1917141110110002120313031400000013A4A09C97918C87827C76
+ 716B655F59544E49440002400016454F56595E676F706B666364696D6C6B6C70
+ 7B8B979D029E00069D9B98938C87028400048281828506860285018603870186
+ 018502870009858384868887898B8C00028D018C028D000B8C8D8F92979B9D9C
+ 948B8400028200098180828487898B8D8C00028A018D018F0390028F00098E8C
+ 8B8988898C8F90000291018F018E038F000D8E8D8B88868482807E7F82868900
+ 028A0006888786827B73027000036F6D6B00026A00036B6DB70004FF01EB016D
+ 026E017201DF04FF0003E1696B00036D00038ED5FD0004FF0007E3A565605E5D
+ 5B0004FF0005D5626073EF0004FF0007C5514E4C75CCFC0004FF0004DD934946
+ 0245000A444341403F3D3C3A399C04FF0005E5383736560005FF014C02300003
+ 3A98E70004FF0005F5B54B2A2700032404FF00036F60DD0003FF0004D74D150B
+ 020701DA03FF0003D60C0D00020E010F01100211021202130314011500000023
+ A5A29D98938E89847E79736D68625C56514C46423F424A53575B636B706E6965
+ 63676B00036C00056E7584939C00039E00069D9B979089840281018201830286
+ 028502840285028600088788898886878987028500068688898B8D8E04900291
+ 000C929395979A9C9D978D868382038101830187038A00048988898B048D028E
+ 018C038A00138B8C8F9192949594939291908F8C898785838100028000048284
+ 8789028A0288000487847D750370016E016B026A00036B6DB70004FF01F302A1
+ 01B801E905FF0003B16D6E00026F00086D6C6B708589867202650005625F5D5C
+ 5B0004FF0015D563625E5A58555351504F4E4D4B4A536E747057470003460245
+ 000A444341403F3E3D3B3A9C04FF0005E539373BB50005FF013B03310232000A
+ 4D616052322E2D2B27250224000426282520021D00081F4855442521160C0208
+ 01F703FF01F7010C020D00030E0F10000211011203130214021500000014A6A3
+ 9F9A95908B86807B756F6A645E59534E49440240000E454F565A5E666E6F6B66
+ 6364686B026C00066D717E8E9A9E029F00069E9C99928A82027F000382848500
+ 02860185028401850287000588898A8B89000287028802870006888B8D8F9192
+ 02940193029401950396000E97989B9D9A918985838281828488028C018D018B
+ 0389028A001A8B8C8D8E8D8B8C8D8E909395979899979592908E8D8B89888684
+ 0283000884858688898B8A890288000486807873027100076F6C6B6A6C6EB800
+ 0DFF01EF017A026F026E00056D6B6A696700036600046766615D035C04FF000E
+ D563625F5A57555352504F4E4D4C034B014A0149024803470007464544434241
+ 4000023F00033D3C9D0004FF0004FCE5E4F905FF01CF0133073201310230000B
+ 2F2D2B282524252728262100021D00081F2022252622160C020805FF010C020D
+ 00040E0F101102120113041402150000002CA8A5A09C97928D88827D77726C67
+ 615B56514B46423F424B54585B616A6E6D68646366696B6C6D707887969D039F
+ 00059D9992888000027C00047F82848603870286018702880389018802860003
+ 87888900028A00038D8F91000293029403920194019603970008989A9E9C948C
+ 888703860003888C8F000290018D028B018C018E038F018E028F000790919395
+ 97989900029A000C989592908E8D8C8A898A898802870005888786888900028B
+ 01890288000D87837D777372706E6D6E7072BA000CFF0004F892706E036D016C
+ 026A0169016802670006686967635F5D025E04FF01D5026300075F5956555352
+ 5000024F024E014D024C014B014A04490004484745440243024202410003403F
+ 9F000DFF016E02330132023101320233001A3231302F2E2C2926242527292722
+ 1E1D1F2022252622170C080705FF010C010D020E00030F101100021201130314
+ 031500000025A9A6A29E99948F8A847F7A746F69635E58534E49444041475157
+ 595D656D6E6A666365686B00026D00066F7480909B9F02A000059E9A91877E00
+ 027A00057B7E8185870002880389028800058786848382000283000886888A8B
+ 8D90929302910190018F028E0003919597000398019B029F00059A93908C8900
+ 02880003898C8F0002910005908F9192930002940393000395989900029A039B
+ 000B9A9894918F8E8F8E8C898A00038C00048B8A898802860188028B018A0388
+ 000686827D77747202710004727577BC0BFF01E2018A026F016E036D016C026A
+ 026903680007696865615F60610004FF01D502640007615B595755525000024F
+ 00034E4F4E00034D014C014B034A00054948474645000344024300034241A000
+ 0BFF0003F6863500023301320231013202330232000631302F2D2A2602250010
+ 272928231E1D1F2022252623180C080705FF00050C0D0E0F1000021101120213
+ 02140315011600000021AAA7A39F9A96918C86817C76716B66605B56504B4642
+ 40454E55585A616A6F6C670002640021676A6C6D6E717A89979EA0A1A09C9286
+ 7C78797A7C7E81838588898A88868584810002800181028200068587898A8D8F
+ 02910003908F9000028F0004909396980299000A9A9CA0A19F9A958E88870288
+ 00038A8D8F00028E000690949697999A029900039A9B9C00069B000499979390
+ 028E0290018F028D028F00058E8C8B89870002840004878B8C8A028800068988
+ 85807A750271000672747779A4CE05CD02CC0004C7B29070036F036E016D016B
+ 0269016A02690368000367666400036302C602C5000CAB6465635F5B58555351
+ 4F4E034F014E024F014E014D034C00044B4A49480347000646454442417D02B9
+ 03B804B70006A981473635340233023201330234001A333231302F2D2B272526
+ 282A28231E1D1F2123252723180D080702A503A600060C0D0E0F101102120213
+ 0214021502160000002EACA9A5A19C97938E88837E79736E68635D58534D4844
+ 41434B5357585D676E6F6A656465696B6C6D6E7481929CA002A100069E968A7F
+ 797A027C000E7B7D7F818486888784807F7E8082028300088486888A8C8F9193
+ 0394029500049495969703980003999B9E0002A000109C948C85838485878A8C
+ 8D8F9295989A059C00059B9A989798000499000397959100028F000492949392
+ 0291001A908E8B8A87848284878B8C8B88898A8987827C767170717376780279
+ 00067674737473720271017202710170046F016E016B04690368026700056867
+ 666564000263000E626160626465635F5B585653514F024E034F00055051504F
+ 4E00024D014C014B024A00074948474645434200024000043F3E3C3B023A0239
+ 01380237033602350334023502340007333231302E2B280002260014282A2924
+ 1F1E1F2123252723190D080708090A0B020C00050D0E0F101100021201130314
+ 0115031600000016ADAAA6A29E99948F8A85807B76706B65605A55504B460243
+ 000A495156575A636C706D6702640168016B026C000C6D717B8B99A0A2A1A09A
+ 8E810279047C027E001380818486827C7B7D828688898B8D8E90929495000296
+ 02970198029701960395001694929496999DA09C938B868486888A8C8D8E9091
+ 9497039A00059B9C9B9996000294019604970003989795000294019501960295
+ 000E9493908C898784838486898C8D8C028A00108B8A88847E77717071727374
+ 7677757402720171087000056F706F6D6A000268026901680467000668676664
+ 626102620260000B616465645F5A575554525000024E034F015001510250014E
+ 014D024C014B024A01490247000445434140033F013E013C043A000339383700
+ 0336013702360635001E34333231302E2C282627282A2925201E1F2023252723
+ 190D080708090A0B020C00050D0E0F101100021201130214011504160000003A
+ AFACA8A49F9B96918C87827D78726D68625D58534D484443474F5557585E686F
+ 6E696563666A6C6B6C6E7584959EA1A2A19D92857C797A7B7C7D037E00048083
+ 8683027F000683898D8F9192029301940496039503960013949392918F8D9194
+ 989CA19F98928D898A8D8F00038D00058F909395960002950197029901970195
+ 02930394000395969900029A029902980006979694918D880285000684858788
+ 8A8C028D000F8C8B8C8B8985807873727372706F71000374017202710270036F
+ 026E026F0009706F6E6C6A696A69680004670004686764620260016201630262
+ 000C63656665615C58575554514F044E034F00044E4D4C4B024A024900074847
+ 464543414000033F013E013C043A013901380237013602370236013501340335
+ 00093635343332312F2C290002270015292B2A26201E1F2123252723190D0807
+ 08090A0B0C00020D00050E0F101112000213011402150216021700000026B0AD
+ AAA5A19D98938E89847F7A75706A655F5A55504A4643454D5356575A636B6F6C
+ 66636468026A000D6B6D727E8F9BA1A2A19F978B8100027D00047E8081820484
+ 000786848283878D900002920004939493940395019401930392000494969594
+ 02930006929194989B9F02A300039E999300028E000391928F00028D00038E8F
+ 910002930003919294000296019501930291000692939496979A049C00079B99
+ 9795928D87000284018701880389018A018C038E028D00108C8A868078747374
+ 726F6D6E71737473027201710170026F036E0170036F026E016C026B01690268
+ 0467000666636162636402650164026502660009635E5A575554524F4E00024D
+ 014C034D00044E4D4C4B034A000749484645444341000240033E013C053B013A
+ 01390338033701360235033602350006343231302D2A02270129022B01270121
+ 021F001121222527241A0E080708090A0B0C0D0E0F0002100111011202130114
+ 02150216021700000017B1AFABA7A39F9A95918C87827D77726D67625D58524D
+ 4800024500034A5256000258015E0167026E000D6964636568696A6B6F778796
+ 9F0003A100059C938B87840003830184028701850484000385888C00038F0290
+ 01910193089401960398019703980015999A9DA1A4A5A19C98939192938F8C8D
+ 8E8F9192910002920193039401930292000693949597999B039D000B9C9B9996
+ 928E898584878A00028C018B028A018C018E028F028E00058D8B867F78000374
+ 01720170026F00057072737473000272027102720171047000036F6D6E00026D
+ 016C01690368036700056663626365000466016503660009645F5A5756545351
+ 4F00044D014E024F00034E4D4C00024A0005494847464500024400044342413F
+ 033E053D013C013B023A0139033805370236000E35343332302E2A2827292B2C
+ 2721021F001121232527251B0E080708090A0B0C0D0E0F000210000311121300
+ 02140215021602170000001CB3B0ADA9A4A09C97938E89847F7A746F6A645F5A
+ 544F4A4645495056025800095B636C6E6B6562636600026900076A6D737F909C
+ A10002A200149F9A938D87848281828584828182838485878A8B038C00038F92
+ 9400039500059697989798000899000A98999BA0A3A5A39D989302910005928F
+ 8D8C8D00048F0193019502960195019602950006949596989A9C039D000F9C9B
+ 999694908C8987888A8D8F8E8C00028B00058C8E8F908F00028E00068B87807A
+ 767503740004737273740275000574737271730002750173047100036F6C6B00
+ 036C016A0369026801670165026303640265036602670004645E595702560004
+ 55545351065000074F4E4D4B4A49480002470003454445000244014301410340
+ 01410240013F023E013D023C013B013A0339023803370136023500053433312F
+ 2C000228012A022C01280122021F001121232628251B0F080708090A0B0C0D0E
+ 0F00021000041112131402150216021701180000001CB4B2AEAAA6A29E999590
+ 8B86817C77726C67625D57524D4845474E540258000A595F686D6C6763626568
+ 026900066B6F788898A002A20014A19D968D8682807E7F8281807F8183858687
+ 8889028800038A8E910004930194019603970598029703960010999EA3A5A39C
+ 958F8D8E8F8D8B898A8D028E00058F949899980003970198019A029B049D019B
+ 019A029900059693918F8D00028B018C018E029000038F8D8C00028B018D018F
+ 0290028F00078D89847E79767500067602750174017302720005747776747200
+ 03710004706C6A6B026C026B016A036901670166026403630164016502660167
+ 0268000B66615D5B5A5958575654520004510003504F4E00024C014A01490248
+ 0147064601450144034302420141013F023E023D013C023B013A013903380337
+ 00073635343332302C00022900052A2C2D292300021F001121232628251C0F08
+ 0708090A0B0C0D0E0F00021000041112131402150116021702180000001DB6B3
+ B0ACA8A49F9B97928D88837E79746F6A65605A55504A47464A51560002580009
+ 5B636B6E6A6562646700036900056C7381939D0003A200079F978D8784838200
+ 0283018202810003838587000288028702860009888B8D8E8F8E8D8F91000293
+ 01940395019603970396000A989DA1A4A39C918A898A028D018B0289018C028D
+ 00038E959900029C029B019C019D049F00049E9D9B980396000394929000038F
+ 000490919091029000038E8D8C00028B018E039000068F8E8B857F7903750006
+ 767576777675027400097372737577767473720002730004716D6A6B026C026D
+ 00066C6B6A69686702660165016302620164016502660368000964605D5B5A59
+ 5756530003510250024F00054E4D4C4A49000248054702480147014602450007
+ 44434241403F3E00023D00043C3B3A390638013702360008353433302D2A292A
+ 022D00172A23201F21232628261C10080708090A0B0C0D0E0F10110002120003
+ 131415000216011703180000001DB7B5B1ADA9A5A19D9994908B86817C76716C
+ 67625D57524D4846474D540002580009595F686E6D6863646600036800066A6F
+ 7A8C9AA002A20009A09B948E8B8785848300028100058385888A8B00028A0189
+ 0688038A00058C909193940003960198019904980297000C999DA1A29E938C89
+ 8A8C8D8C028900068B8D8E92989C039F019E049F019E019D029B000399969400
+ 02950004949392930494019201910390018E018B028900038C90910002900005
+ 8F8B857D77000374000373727300027402730272000773747778777574000373
+ 0172016F066D016C016B036A0005696867666300026100056263646567000268
+ 000965605C5A58575554520004510150024F00074E4D4C4A4948490002480549
+ 00114847464544434241403F3E3D3C3B3A393800023701380239023800073736
+ 353433312E00022A00052B2D2E2A24000220000821242628261E110902080009
+ 090A0B0C0D0E0F1011000212000413141516021703180000001EB9B6B3AFABA7
+ A39F9B96928D88837E79746F6A655F5A554F4B47464A5156025800095C656D6F
+ 6A656365670002680006696E7585959E03A2000D9F99928C868381807F808386
+ 8800038A0189048B038A018D028E000390939400029501960297029801970196
+ 02970005959291959B0002A00005988F8B8A8C00028E028D00068F9193969B9E
+ 049F019D019B0299029B0299000497959394029501960498000497959391038F
+ 018D018A0286018A018F03910005908D877E7600027301720271017201730272
+ 02710009727375777877757473000472000371706F00036E00036C6A6900026A
+ 000569686766640004620263016602680007645E5A5856555400025304520151
+ 0150024F00044E4D4B4A0449044A00074948474644434200024100043F3E3C3B
+ 023A000339383700023601370138023901380237000C363534322F2B2A2B2D2E
+ 2B250220000822242628271F120A02080009090A0B0C0D0E0F10110002120004
+ 131415160217031800000026BAB8B4B1ADA9A5A19C98948F8A85817C77716C67
+ 625C57524D4846484E55575859606B6F6D670264016601680269000F6C717D8E
+ 9BA1A3A2A19C938A827E7D00027B00057C80848687000386018A018D0290028F
+ 01900391019201930294029502960003959492000291000E92908D8B8F969FA3
+ 9F9893908F9002910006909193949799039A029C000F9A949193989A99989593
+ 929394969800039A0005999896929000028D00078C8A8785868A8F000391000D
+ 908E898279747372717273727000036F00097173767879787574720002700172
+ 0174027301710270016E016B0269026A01680266026501640563000B65676965
+ 5E595857555453000354000353525100035000054F4E4C4B4A00074901480246
+ 000345434100034000033E3D3B00043A01390137023500133638393A39383736
+ 353433302C2A2B2D2F2C26000221000822242729281F120A0208000D090A0B0C
+ 0D0E0F1011121314150002160117021802190000001ABBB9B6B3AFABA7A39E9A
+ 96928D88837E79746F6A655F5A55504B0247000E4C525657585D676E6F6A6564
+ 6567026800156B6F7786969FA2A3A29E978D85807E7B7A7B7D7F810004830188
+ 018D028F018E038F018D018C028D018E018F0392000491908F8D028C018F018E
+ 028C00039198A10002A500039F999300028F029000038F919400059301950297
+ 000995908D91989A9997940004910003939597000299001E9896938F8C8A8887
+ 868584868A8E919291908F8C867F79767372747574720371000C727476787978
+ 7673716F70720373000A7271706F6C6B6A6B6967026502660365000F64636264
+ 676966605B5958575655560002550004535251500251025000034E4D4B000249
+ 02480147024800074746454442403F00024000033E3C3A000239023A01390137
+ 023501370139023A023900073837363533302D00022B000E2D2F2D2722212325
+ 27292820120A0208000D090A0B0C0D0E0F101112131415000216011702180219
+ 0000001FBDBAB7B4B1ADA9A5A09C98948F8A85817C77726C67625D58534D4947
+ 49505500025700095A626C706D676463660002670007696C727F909CA10002A3
+ 0007A19D978F87817C00027B00047D7E80820284001085888B8A8887898B8987
+ 858687888B8E0290018E018C038A018B038D000B90959CA3A7A6A199918B8A00
+ 038B00048F92918F02900191029201910190028E000693999B989591048F0290
+ 000992969794918F8C89860003840007858486898D90920002910009908E8A85
+ 7F7A76747500027701760174037300087475777978767471026F000371727100
+ 0272000571706F6E6D00026C016A016705660265000C62616264686A68645F5D
+ 5A590357000456555352045102520005504E4C4A490003480007494847464543
+ 4100044000033E3C3B00023A02390138013702360138013A023B00043A393837
+ 0236000334312D00022B000E2D2F2D2823222325282A2820130A02080008090A
+ 0B0C0D0E0F110212000413141516021701180219011A0000001BBEBCB9B6B2AE
+ ABA7A29E9A96918D88837E79746F6A65605B56504B000248014C015302570009
+ 585E68706F6A6563650002670007686A6F798998A00003A30008A19D978E8680
+ 7E7F03800016828485868889878584878A898785868788898C8E8D8B0289000A
+ 8A8C8F919293969BA0A502A70009A0958C86858688898E0002930190058F000C
+ 8E8F9195999C9B969491908F048E000D919495928F8E8B878482838586000285
+ 0004878A8F920291000F908F8C89837E797778797A7978777500037401750277
+ 0005767471707100027202710370016F036E016C016A04670009686766646261
+ 63656900026A00066764605C5A58025701560154025203510352000A514E4C4B
+ 4A4948494A48024700044543414002410003403E3D00023B013A023902380237
+ 0138013A023B023A00073938373635322E00022C000E2E302E2823222426282A
+ 2821130A0208000B090A0B0C0D0E10111213140002150116021701180219011A
+ 0000002ABFBDBAB7B4B0ADA9A5A19D98948F8B86817C77726D68635E59534E4A
+ 47494F5456575A636E716D67646503670007696D7482939EA20002A30010A29F
+ 9A9288817E808281808183858688028902870188028B000488878889028A018C
+ 028E000D8C8D8E909497999A9B9DA0A2A60002A8000DA1968C86858687898D92
+ 95939100028F000E908F8E8F93999C9D9C9795939290038F000F909294959391
+ 8F8B878381828587860002840187018D029202910007908E8B86807B7A00027B
+ 027A02780176037401750276017502730006727374737170036F036E00046D6B
+ 6A680569016801670265000366686A00026B00066A66615C5A58025601550254
+ 01530152025103520005504E4C4B4A000249000E4A4947464746444241424140
+ 3F3E023D013C023B013A0239000338393A00043B00073A39383736332E00022C
+ 000F2E302F2924232426282A2921140A08000209000A0A0C0D0E0F1011121314
+ 02150116021701180119021A0000002BC1BFBCB9B6B2AFABA7A39F9B96928D88
+ 837F7A75706B65605B56514C48474B505456585F6A716F6A6665670003680006
+ 6B707A8B9AA002A30013A29F9A9187807C7E81828182838485878A8C8B00028A
+ 028B028A038C00038D8F9000028F0012909295989B9D9E9FA0A2A3A6A8A9A49A
+ 8E870285000987898D939795918E8D00028E00048F91969B029E019B01970396
+ 01940292000393949600029700099593908C888481828500028602840004868C
+ 9192039100058F8C87817D00037C027A02780276027703750474000675767471
+ 706F0270026E00036D6C6A000269016A026B026C00046B6A69680269016A026B
+ 00066A67625D595804570256015402530152025100064F4D4B4A494802490003
+ 48464500024700044644434203410140023F013E023D013C023B033A013B023C
+ 00033B3A39000238000336332F00022C001D2E31302A25232527292A2922140B
+ 08090A0B0C0D0E0F1011121314151600021701180219021A0000001DC2C0BDBB
+ B8B4B1ADA9A5A19D9994908B86817C77726E68635E59544F4A000247000A4B50
+ 55575C676F716C6802660167026800076A6D7482949EA20002A3000B9F998D82
+ 7D7B7C7F8082840003850005878B8D8E8D00028B028C018E038F019001920293
+ 029400079597999B9D9E9F0002A0000EA1A3A6A7A69E91898687888A8C910295
+ 0009918C8B8D8E9093979B00029D019B01980299000F9896959698999A999896
+ 948F8B88850002830484000685888D92939202910005908D88837F00037C0006
+ 7B7A7877767702790377047602770174017102700271036E016C026B016C036D
+ 026C016A066900096A6B6A68645F5A5857000558000756555452514F4D00024C
+ 014B0449014802470348000347454300044202410140023F00043E3D3C3B023A
+ 013B033C00073B3A393837343000022C001F2E31302B25242527292A2922150B
+ 08090A0B0C0D0E0F101112131415161718000219021A011B00000029C3C2BFBC
+ B9B5B2AEABA7A39F9B97928D89847F7A75706B66615C57524C4846474C52575B
+ 626C706E6A000366000F6768696B6F7A8C9BA2A4A3A0988B8000027B027C0003
+ 7D80850003860003888C8F000290028F00079092939493949500069602970003
+ 999A9B00029C029B00079DA0A4A5A1948A000286000E888A8C909496928C8A8B
+ 8E929598029B029C029B019A01980297000C989B9C9B99979694908B88870285
+ 0184028200058486898E9200029302920007908E8A85807C7A00027B00057A78
+ 77787A00027B027900037A787700047601740372017301720470046F00046E6C
+ 6B690366016702680169016A026B00056965615D5B00025A0359000858575553
+ 51504F4E024D014C014B044A0349024A00044947464502440243014201410240
+ 00083F3E3C3B3A393A3B023C013B023A000439373531022D012F0231000B2C26
+ 242527292A2923160C00020900100A0B0C0D0E0F10111213141516171819021A
+ 021B0000002AC5C3C0BDBBB7B4B1ADA9A5A19D9995908B87827D78736E69645F
+ 5A554F4A4645484F56595E686E6F6B6702650267000768696C748496A00002A3
+ 0005A19B8F837D00027C027B00088085888A8B8D909205940295000394939200
+ 039300079291929193949500029602970296001B979BA0A5A39A8F8987898B8C
+ 8F9294928E8C8E93989B9A9998999C00029D00059A9695969800029B00099A97
+ 959495928E8A8900028801870385000586888C9194000293000B92918F8A847F
+ 7A78797A780002770178017B047C00047B7A7774057300067475767574730272
+ 027000066F6E6C6A68660264016503670168016A026C00076A66625E5C5B5900
+ 02580257000355535100054F024E014D034C014D044C00054B49484645000244
+ 024301420240023F00033D3C3A000239013A013C023D013C023B00043A383631
+ 022E012F023200052E2724252700022900042823170D0209000B0A0B0C0D0E0F
+ 1011121415000216000317181900021A021B0000002AC6C5C2BFBCB9B6B3AFAB
+ A8A4A09B97938E8985807B76716C67625D58524D4945464B53585B626B6E6C67
+ 0264016602670019686A707D8F9CA2A3A29E968C8682817E7D8085898C8E8F90
+ 92000393019202910190018D028B028C018B028A00068B8D9092939502960397
+ 0008999CA1A6A7A0958D028A000E8D8E90939493919092989C9D9B9A0298019B
+ 029E019B0297029900059A99989795000294000393908D00048B018A01880387
+ 00038B9093000294000793928F8A837D79000278017903780179017A047C0004
+ 7B7975730272000B737476777877767573717000036E00056D6C6A6865000264
+ 01660267001368696B6D6C6A65615D5C5A5856555655545251000450024F014E
+ 034D024E024D024C00054A4846444300044201410140023F00083E3D3C3B3A3B
+ 3C3D023E00113D3C3B3A3937322F2E3032332F2825262700022900042824180D
+ 0209000D0A0B0C0D0E0F101112141516170002180119021A011B011C00000027
+ C7C6C3C1BEBBB8B5B1ADAAA6A29E9995918C87827E79746F6A65605B55504B47
+ 45495056595E6700026D000568656465660002670014696D768797A0A2A3A19C
+ 968E8783807F8084888B048D038E038D00058C8987888A00048B00068E909395
+ 96970499000D9A9B9DA2A7A9A59E979290919300029401950194029301950199
+ 029B029A000799989A9E9F9E9B00039C000A9B9A9896959493918F8E028C000A
+ 8D8E8D8A8786878A8E930295000B9493908A837D7A7877787900057A037B0012
+ 7977747271727374777877767472706F6E6D036E00036D6B6900026601670168
+ 0469016B026C000769635E5B5A5957000356015501540253025202510150024F
+ 054E014D014C024B00054A4744434200044300074241403F3E3D3C00023B013C
+ 023E013F013E023D000C3C3B3A3733302F303334302A022601280129022A0003
+ 26190D000209000E0A0B0C0D0E0F10111314151617180219021A011B011C0000
+ 002EC9C7C5C2BFBCBAB6B3AFACA8A4A09C98938F8A85817C77726D68635D5853
+ 4E4946474D54585B626A6D6A666465660267000F686B717F919DA2A3A29F9A90
+ 87827F00027E000480858889028A018B028C028D018E028F028E018F01910492
+ 019301940295019602970498000A9A9DA2A7A9A8A5A09A950294019602970008
+ 9695949596979899029B00039A9B9D00029F019E039F00049D9B989602950003
+ 928F8C00028D028C028D01890286000487898D920395000F94918D87827E7B78
+ 797B7C7D7C7A790003780005777674727100027200087375767573727170056E
+ 026F016E016C036A01690268000367686A00026C000469635E5B025A01590258
+ 0157015603540153025202510250014E034D024C034B00034947450003440145
+ 01440243000642413F3E3D3C023B013D013E033F013E023D000B3C3B3834312F
+ 313334312B0002270129012A022C0003271A0E000209000F0A0B0C0D0E0F1012
+ 1314151617181900021A011B021C0000002BCAC9C6C4C1BEBBB8B5B2AEABA7A2
+ 9E9A96928D88837F7A75706B66605B56514C48464A5156595F676D6C69000266
+ 01670168026900066B6E788999A102A2000FA09B91888281807E7F8386898B8D
+ 8E00038F01910192049301940495029401920190028F0190039200139395979A
+ 9FA5A9AAA9A6A09A9695969798979600029502960004989A9C9D029C029D019E
+ 019F02A000049F9D9A9703950192018E028C00038D8C8B00028C01890286000E
+ 87888B9195969594928F8B85807D027A017C027D00047C7A7877027600047778
+ 7572027000066F707375747302720171026F027003710007706E6D6B6A676500
+ 0264000966696C6D6A66615D5B00025A02580003575655000254025300035453
+ 52000251014F014D044C014B024A000349474600024502460145034300054240
+ 3F3E3D00023C013D013E0240023F000D3E3D3C3B3935312F313335312B000227
+ 0129012B022D0003281B0E00020900110A0B0C0D0E0F1112131415161718191A
+ 1B00021C011D00000021CBCAC8C5C3C0BDBAB7B4B0ADA9A5A19D9994908B8682
+ 7D78736E69635E59544F4A00024700094D54585C646B6E6B6800026700126869
+ 6A6B6D7482939EA1A2A19D978F8A8683028100058486888C8E000290038F0003
+ 9091920002910292029302920003918E8A00028800118A8D8E8F929596989BA1
+ A6AAABA9A39D970002950197019903980297000496979A9B049D029C019E02A0
+ 00039F9B9800029502960003938F8D00028E018D028A018B018903870004888B
+ 9094029600079593908B837F7D00047B00057A79787775000273000476787672
+ 027000036F70730002750474037303720007716F6D6C6B696600026300096465
+ 686B6D6C67625D00025B015A0258015701560355015402550006545251504E4C
+ 024B034C00044B4A494802470346014503430242000741403F3E3D3E3F000340
+ 023F000C3E3D3C3A363230313435322C022800072A2B2D2E291C0E0002090011
+ 0A0B0C0D0E101112131415161718191A1B00021C011D0000002CCDCBC9C7C4C1
+ BFBCB9B6B2AFABA7A39F9B97928E8984807B76716C67615C57524D48474B5257
+ 5960686E6D6A03670009696A6C6D717B8B99A00002A100069F9C97918C860284
+ 000C8687888A8B8C8B8A8988898B028D00038C8D8E00028F00058E8F908E8A00
+ 028800068A8C8E9092950296000C989DA4A9ABAAA59F98959496029802990198
+ 019902980005999A9B9C9D00039C000D9E9FA09D9A989798999793908F000290
+ 00048E8C8B8A058900038B8F93000396000594918B827D00027C00047B7A7977
+ 03760274017502780176017303720174017602780477000876757372706F6E6C
+ 026B00036A6967000365000866686B6D6C67615D025C00035B59580002570656
+ 000554514F4E4D00044C014D014C024B014A0349024802470145024402430005
+ 4241403E3D00023E013F034000113F3E3D3C3B373331323436332D29282A2B00
+ 022E00032A1C0F000209000F0A0B0C0D0F1011121314161718191A00021B011C
+ 021D0000002DCECDCBC8C6C3C1BEBAB7B4B1ADAAA6A29E9A95918C87827E7974
+ 6F6A655F5A55504B47494E55585D656C6E6B680002660013686A6B6C6F768393
+ 9DA0A1A09E9B97908A8685000386018702860285028401860189058B028D018C
+ 018E029000098D8B8C8D8F9193959800029900099A9EA3A8ABA9A6A099000295
+ 0198029B00039A999A00029B00049998999A029B029A019B019D029F00039E9C
+ 9B00039A0197019304910003908E8C00028A058C000A8E9295979695938D857F
+ 027D00047C7A7977037500037374760002790178037701780579000978777675
+ 74726F6E6D00026C036B016A016904680169016B026D00096963605D5C5B5A59
+ 58000257045600045553524F044E00034F4E4F00024E014D024C024B02490005
+ 4847464544000243000442413E3D023B00033C3D3F000240023F000B3E3D3B38
+ 3432333536342E00022900192A2C2E2F2B1E100A090A0B0C0D0F101112131516
+ 1718191A1B00021C021D0000002DCFCECCCAC7C5C2BFBCBAB6B3B0ACA8A4A09C
+ 98948F8A85807C77726D68635D58534E49484C53575B616A6F6D69000266000A
+ 67686A6C6E727C8B999F02A000069F9D98918984028302840283038200078386
+ 888A8B8C8D00028C018E028F019102930004929192940295000396989A00039B
+ 00139DA1A5A9AAA8A39C9697999D9C9A999A9B9C990002970198049900039A9B
+ 9D00039E029D00049C9A969302920391000C908E8C8D8F908F8D8B8C91950297
+ 000C9694908983807E7D7B7A787502740273000476797A7B037C00037B7A7800
+ 047600077574737271706E00036D016C026D036C026B00036A6B6C00026E0007
+ 6B66625E5C5B590002580557015601550254015305520251000C504F4E4D4C4B
+ 4A494847464402430006424342403E3C023B00043C3D4041024000273F3E3D3C
+ 383532333537352F2A292B2D2F302C20110A090A0B0C0D0F1011121415161718
+ 191A1B00021C021D0000002AD1CFCDCBC9C7C4C1BEBCB8B5B2AEABA7A39F9B96
+ 928D88837F7A75706B66615C56514C494A50565A5E66026D016A016702650013
+ 67696B6D707683939C9FA09F9C968D85807F80000282000A83848587898A8C8E
+ 8F900291029001910393029501940293000694959493959703980004999CA0A6
+ 02AA01A6019F029800049A9D9C9A0299029A0198029501970299029A0299019B
+ 019D029E039D00059B97959493000392000C91908F909291908C898B90950298
+ 001D9796928D87827F7E7C7B79767472717274777A7C7D7E7C78757372717300
+ 02740173027202710170026F0170026F016E026D016C016B026A016B016D026E
+ 00086B66605D5B5A585702580157015602570156025503560155035400045251
+ 4F4E024C014A0249000547464544430003420243000342403F00023E013F0140
+ 0341024000273F3E3D3A363334363736302B2A2B2D2F312D21120B090A0B0C0E
+ 0F1011131415161718191A1B1C00021D011E00000049D2D1CFCDCAC8C6C3C0BD
+ BAB7B4B1ADA9A5A19D9995908B86827D78736E69645F59544F4B4A4E55595C62
+ 6A6E6C6865646567696B6E727D8D999EA09F9C968D86817F808285888B8D8F00
+ 0291039203910004908E8F90029103920190018E028F00048E8D8F920295000A
+ 9697999EA5AAACA9A39B0299019A019902980499029801970298019B019C029A
+ 019B019D039E00049F9E9C990296019702960195029402930008918F8E8B8A8C
+ 91950398000C97948E87817E7D7C7B7A77740273000A74757778797C7D7B7773
+ 027101720173027401730271017205710006706F6E6C6B6A0369016B016C026E
+ 00086B65605C5A5958570258000457555657045601570156025500065453514F
+ 4D4B024903480005474645444300034201430244014301420341034202410006
+ 403F3E3D3B3702340020363836312B2A2C2E30322E22130B090A0B0D0E0F1011
+ 131415161718191A1B1C021D011E0000002BD3D2D0CECCCAC7C5C2BFBCB9B6B3
+ AFACA8A4A09C98938E8985807B76716C67625C57524D4A4D545A5C5F6700026D
+ 016A01670264000966686A6D707787959D00029F00059E9A928B840002800005
+ 8285898D8F000490018F018E038D018A0288028900198A8C8D8E8C8B8C8F8E8F
+ 91939798999A9B9FA5AAACAAA59E9A00029902980499019A029B00039A999B00
+ 029E00059C9B9C9E9F0002A00004A19F9D9A0298000A999A9B9A989795928E8B
+ 028A00058B8E929598000299000598958F867E00037B00037A79760002750176
+ 04770006787B7D7C78750273047401730372027100067271706F6E6D026B026A
+ 036B00086C6D6E6D68635E5A0358000359585600025503570256025504540004
+ 514D4B4903470007484948474645430002420243000444454443034104420141
+ 024000253F3E3B373435363837312C2B2C2E30322F23130B090A0B0D0E0F1011
+ 1314151617191A1B1C00021D021E00000046D4D3D1CFCDCBC9C6C4C1BEBBB8B5
+ B2AEAAA7A39F9A96918C88837E79746F6A655F5A554F4B4C52595B5D656C6F6C
+ 6865646567696C6E7480909B9E9F9E9C968D85807F80838603880289028A0289
+ 00048B8C89860385000986888A8C8D8E919495000296000497999A9B029A0009
+ 9CA1A7ABAAA6A09B9800039701980199029A00039B9C9D00029C00069FA2A19E
+ 9D9E04A000049F9D9C9A029900099B9D9E9D9A96928F8C00028A00068B8D9092
+ 9497039900049690887F037B017A017902770004797A797702760006787A7C7B
+ 79760274017502740273047202710170016F036E026D016C036D00096C6D6E6F
+ 6E6B665F5A0002580004595A5856025503570256000355545300025400095351
+ 4D4A484746474800024A00044948464403430344014301410340024101430242
+ 000641403F3E3C380235001F373938322C2B2C2E30323024140B090A0B0D0E0F
+ 10111314151617191A1B1C00021D021E00000030D5D4D2D0CECDCAC8C5C3C0BD
+ BAB7B4B1ADA9A5A19D98948F8B86817C77726D68625D58524E4C50575B5D636B
+ 706F6A660265000967686A6D717A89979D00029F00049D978D85028000047F80
+ 82830282000C83858788898A8D8E8C8987860285000886888A8B8E9295970296
+ 0010959697969594959BA2A9AAA8A29B989702960197019A049C00049D9C9DA0
+ 02A301A0049F00039E9C9A00059900089A9C9D9B9792908E028D00038E8F9000
+ 0291019301960399000597928A817B00027A000779777677797A790002750008
+ 7678797B79777574027501740173027104720171027001710270016F026E026D
+ 016E036D00076E706F6B645E5900025700055A5B5A5857000656015501530352
+ 000551504E4B49000348014A024B00044A4846450544000343424000033F0003
+ 40414300024202410004403F3C3902360020373938332D2B2D2E30333025150B
+ 090A0B0D0E0F10121314151618191A1B1C1D021E011F0000002CD6D5D3D2D0CE
+ CCC9C7C5C2BFBCB9B6B3AFABA8A4A09B97928E89847F7A75706B65605A55504D
+ 50565B5D616A0271016D0168026600096768696B6E7482919B00029F00089E9A
+ 928B878582810280000F7F7E80838587888A8D908F8D8B8A8900028801870288
+ 0005898C91929000038F0190029102920010979FA8AAA9A49E9896959496999D
+ 9E9D029C00039B9C9F0002A201A102A000089F9D9B9998999A99039800069998
+ 9693919002910392019102900003929598000299000597948D837C0002790178
+ 01770276000A77787775747778797A780576000573716F707100037202700271
+ 0003706F6E00026D066C016E026F00046A625C590258015A025C00065A585755
+ 54550356000354514F00024E00054F4E4D4C4B00024A034B014A024801470246
+ 0345000344434100024001410242014401430242000541403F3D390002360137
+ 0239001D342E2C2E2F31333126150C090A0B0D0E0F11121314151618191A1B1C
+ 1D00021E011F00000025D7D6D4D2D1CFCDCBC8C6C4C1BEBBB8B5B2AEAAA6A29E
+ 9A95918C87827D78736E68635D585300024F000C545A5D60677074706B676667
+ 02680012696C707B8A979D9F9E9C98928D898582807F027D0011808485868788
+ 8B8E908F8D8C8B898886840002850188018C058D000F8E8F929493969EA7AAA9
+ A59F9A98970002960199029D019C049B00039DA0A10003A000039E9B9A000299
+ 00049A9B9A98039700069694939293950296000894918F8E8F919498029A0005
+ 98958F857C000378000676757475767702750177027800037978760003770004
+ 767472710272000473727170026F00036E6C6B00026C016B036A02680169016B
+ 026E00076A635D5B59585A00025C000D5A58565453545556575552504F000350
+ 014F024E024C044B024A02490248024700034645440004430344014302420007
+ 41403D3A373637000239001E352F2D2E3032343227160C090A0B0D0E0F111213
+ 14161718191A1B1C1D1E021F00000031D8D7D5D4D2D0CECCCAC8C5C3C0BDBAB7
+ B4B0ADA9A5A19D98948F8A85807B76716B66605B56514F53595D5F646D74736E
+ 6A00056800066B6D7583929B029E00099D9A958F898583828000027E01820285
+ 00058687888A8C00028E028D000B8C8A878382848687898A8C00038D00038E8F
+ 930002950003969CA40002A90009A6A09B9A999897989B00039C039B019C019E
+ 039F000B9E9D9B9A999A9C9D9C999700029600109796949597999896928E8D8E
+ 8F919498029A0006999691887E79027800087776747576787776037504770176
+ 02770276027403730005726F6E6D6B00026A026B000F6A696A68666566696D6E
+ 6C66615E5B000259025B00035A58560002540255035601540453025200045150
+ 4F4E024D014C014D024C014B014A034900034847460002450444014502440009
+ 434241403E3B38373800023A000B36302E2F3133353228170C00020A000F0B0D
+ 0E0F111213141617181A1B1C1D00021E021F00000032D9D8D6D5D3D2D0CDCBC9
+ C7C4C2BFBCB9B6B3AFABA7A39F9B96928D88837E79746E69645E59545052585D
+ 5F62697274706D6A0269026800076A6C717C8C989C00029D00049A948C850481
+ 028001830185028601870289018A0389028B00068885817F828502870008888A
+ 8D8E8F9091920293000A9599A0A7A8A59E989798029902970199039B019C029D
+ 039E019D019C059B029C00039D9B990002970399029A000498969390028F0290
+ 000491949799029A000598938B807A0002780177017602740177027A000B7876
+ 7576797A7976747576000277017601750273000772716F6E6D6C6B00036A0269
+ 000D6A68656465686D6F6E6A65605C00025900055A5C5B5A5800035602550156
+ 035702560155025400065351504F4E4D034C014B014902480249000448474645
+ 02440143024402450144014302420006413E3B383738023A000B37312E2F3033
+ 353329180D00020A00100B0D0E0F111213141617191A1B1C1D1E021F01200000
+ 0026DAD9D8D6D4D2D1CFCDCBC9C6C3C1BEBBB8B5B1AEAAA6A29E9994908B8681
+ 7C77726C67615C5602520006575C5F61656E027300036F6C6A00036900076A6C
+ 6F7786949A00029C00059A938A817D00027E00057F808284850002860387000C
+ 8684838487898683817F818403850004888A8C8E0291000A908F9092959AA3A7
+ A39A02940196029800069695979A9B9D029E049D019C029B029C029D00059C9B
+ 9C9D9C00029B00069D9E9D9C99940291039201910290001B9396989A9B99958E
+ 847D7A7978777576787B7C797776787B7C7A7500027200057476777574000273
+ 01720171026F000F6E6D6C6B696867686968656465696D00026F00076A645F5B
+ 58575900025B025A000459585756025501580259000357565500025400065250
+ 4F4D4C4A03490004484645460247024601450244000443424344024502440008
+ 4342413F3C393739023B01370132032F000632353329180D020A00110C0D0E0F
+ 111213141617191A1B1C1D1E1F00022000000033DBDAD9D7D5D4D2D0CECCCAC8
+ C5C2C0BDBAB7B3B0ACA8A4A09C97928D88837F7A756F6A645F595452555A5E5F
+ 626A7274716D6B00036A000E6B6C6F74808F989B9C9A958D847F027D00047E80
+ 838503870004868483820280000881858886848382830285028400048688898C
+ 029000178D8A8B8E91959FA6A59D9897999B99969596989B9D9F9E00029D019C
+ 029B000B9A9B9D9EA09F9D9C9DA0A10003A0001E9F9D9B97939293949392908E
+ 8D9094989A9B9A97928A84807D7B7A797A7C027E017C017A027900047B7C7A75
+ 0271000573757675730002720271037000056F6D6B6968000367016602640003
+ 666A6D00026E000469615C5902570005585958595B00025A0004585655560258
+ 00035755540003520003514F4D00024B00034A49480002470446034502440243
+ 00034243440003450009444342413F3C39383900023B000338322F00022E0006
+ 3135342A190D020A00110C0D0E0F111214151617191A1B1C1D1E1F0002200000
+ 0027DCDBD9D8D7D5D3D2D0CECCC9C7C4C2BFBCB9B6B2AFABA7A39F9A95908B86
+ 817D78726D67625C56000253001C575C5F61677175736F6C6A696A6B6D6F727B
+ 89959A9B9A98938D8680027E0008808184878887858304820004838688870386
+ 0387028500048687888A028D000C8987888B8F959FA7A8A4A09D029C019A0296
+ 0017979A9C9D9E9D9C9B9A999A9B9C9E9FA0A1A0A1A2A4A3A000029E019D029B
+ 00089A97969593918F8D028C00048F93979A029B000A9895908B86817F7E7D7E
+ 037F00037E7D7B00027A00037B7A76000274017602770006767371706F700371
+ 0003706E6C00026B0003696867000266000467696B6D026E000469625C590258
+ 015902580159035B01590158035601550154025301510252000351504E00024D
+ 00034C4B4900044802470446014502440243000544454645440002430013413F
+ 3C3A38393B3C39332F2E2F3135342B1A0E00020A00130C0D0E0F111214151617
+ 191A1B1C1D1E1F2021000000002FDCDBDAD9D8D6D4D3D1CFCDCBC8C6C3C1BEBB
+ B8B4B1ADA9A5A19D98938E8984807B75706A655F59545254595D60656E000275
+ 0019716C6867686B6D7072778390989A9B9A98938C837F7E8082850004860185
+ 02840003858687000288028701880189028A0188028701880189028A00118B8A
+ 8886878A8F97A1A8ABA8A4A09C9B980002960004989A9C9B029C00079B9A9998
+ 999A9B00029C00039EA2A40002A50005A4A19C999A00029C00089D9C9B989491
+ 8E8C028B00058D8F93979A00029C00079996938E88838100047F027E027F000E
+ 7D7A797A79777677797A79777470026E016F0470016F036E016D016C026B036A
+ 016C016D026F00076B645F5C5B5A5B00065A0005595756555400025202530252
+ 02510004504F4E4F024E014C044B024902480005474645444300024201430144
+ 034500064443413F3D3A0239001F3B3C3933302F303336352C1B0E0A0B0C0D0E
+ 0F111214151618191A1B1D1E1F000220012100000028DDDCDBDAD8D7D5D4D2D0
+ CECCCAC8C5C3C0BDBAB6B3AFACA8A49F9B96918C87827D78736D68625C570252
+ 000A555B60646A7275726D6702640009676B7072757E8B969A00029B00089996
+ 8E847E7D7F810283000482838788068902880189028A00068B8A88878889038A
+ 0389028A000C8B9099A3A9ABA9A59E999796039501970299049A0199029A019B
+ 019A029900139BA0A2A4A3A29F9B9A9C9E9F9E9D9A9794918E00028C000F8E8F
+ 9092969A9C9D9A97948F88838100027F00097D7C7B7C7E7F7D79770002780277
+ 0007787A7B7976747200037102700171017304720010716F6E6D6B6A696B6D6F
+ 706E68635F5D025C015B0559000356555400025302520006535453525150024F
+ 014E034F014D024C014B014A0249024700054644434241000240001541434546
+ 45444342403D3B393A3B3C3A343130323400023600152D1C0F0A0B0C0D0E0F11
+ 1214151618191A1C1D1E1F000220012100000030DEDDDCDBD9D8D7D5D3D2D0CE
+ CBC9C7C4C1BEBBB8B5B1AEAAA6A29E99948F8A85807B76706A655F5954515258
+ 5E62666E027400216E67605E61676D71747A8693999B9A99958D827B7A7C7E80
+ 7F7E81878A8C8B8A890003880189028B028A01890287000388898A00048B000D
+ 8E908E8D919AA3A9ACA9A39B960003940393019603980007999A9B9C9D9C9A00
+ 029900049B9E9FA103A202A0029F00099E9C9B98969593929100039000188F90
+ 94999C9D9B98948F8983807F7E7C7978797C7D7C7976037701760178027A0178
+ 01760375017601750274000B75767574737271706F6C6A00026900096B6D6F70
+ 6F6A65605D00025C00035A585700025801570155045304540003535251000250
+ 044F00044E4C4B4A024902480004474645440243014202410142014303460006
+ 454443413E3B023A00043B3D3A3502310007323537362D1C0F00020A00110C0D
+ 0E10111214151718191B1C1D1E1F20000221000001DE01DD02DC003BDAD9D7D6
+ D4D3D1CFCDCBC8C6C3C0BDBAB7B4B0ADA9A5A09C97928D88837E78736D68625C
+ 565251555C60636A72747069615C5E646B6F7376818E9700029A000599948B81
+ 7A000279017B037E000381878A00028C00068B88868586880489000487868586
+ 0288018B028C00108E9193918F9299A1A8ABA9A2999493950396000997989997
+ 95979A9C9D00029E00049C9A9B9D02A001A201A402A50005A4A29F9C9A000299
+ 001598979697969593918F8D8E93989C9D9C999590888200027F000B7E7B7876
+ 77797B7C79777800037900067A7B7A7877780279027A0278000B77767572706F
+ 6E6F6E6D6C00026B00096C6D6E706F6A64605C00035B01590358015601540353
+ 0154055501540253015202510005504F4E4C4B00044A02490003484746000245
+ 02440005434445464700024600144543423F3C3A3B3C3D3B363130323538372E
+ 1D0F020A00110C0D0E10111214151718191B1C1D1E1F2000022100000058DFDE
+ DDDCDBDAD8D7D5D4D2D0CECCCAC8C5C2BFBCB9B6B3AFABA7A39E9995908B8680
+ 7B75706A655F59545152585E61676F74726C656162666A6E71747B8994999A99
+ 968F87807D7B7C7F808284878A8B8C8D89858485868703880004878685870288
+ 018B028D00098F9193929092979FA60002AB0003A69F9B00029A039B029A0007
+ 9B99989A9C9D9E00029D029C019E01A103A402A50005A4A3A19D9A0002970298
+ 0299000B9A9997938F8D8C8D91979B00029D00059A9690878100027E00037D7B
+ 780002760006787B7C7B7A7B027C017D037E027C027B037A000779777674726F
+ 6D00026C016D046E036D016E026F00046C66625E035C015A0258025702560004
+ 555455560357025602550154015302520250014F024D024C014B024A01490247
+ 02450244014502460347000646454443403D023B000D3C3E3C36312F31353837
+ 2E1E0F00020A00110C0D0E101112141517181A1B1C1D1E1F2000022100000031
+ E0DFDEDDDCDBDAD8D7D5D3D2CFCDCBC9C7C4C1BEBBB8B5B1ADA9A5A19C97938E
+ 88837E78736D68625C565251565D60646C000273000D6E676566686B6D707277
+ 82909700029A001298958E86807D7C7F82848688898A8B8D8A86048501860387
+ 0388001587898C8E8F909192919091959CA4A9ABAAA59F9C9A00039B0299019C
+ 019D049E019D019C029B00079CA0A4A6A5A3A20003A000039F9C990002970003
+ 9A9B9C00029B00049895918E028C000C8D91969B9D9E9B979189827F027E017C
+ 017A027800037A7D7E00027D017E017F0480027F00047E7C7977037600057573
+ 716F6E00026C00036D6E6F00036E036D00086E6F706E6964605D025C015A0458
+ 02590158015704580007595857565554530002520250014F014E024D00034B4A
+ 49000248000347464400024300034445460005470014464443413E3B3C3D3E3D
+ 37312E303538372F1F10020A00100C0D0E101112141517181A1B1C1D1F200221
+ 012200000041E0DFDEDDDCDBDAD9D7D6D4D3D1CECDCBC8C6C3C0BDBAB7B3B0AC
+ A8A39F9A95908B86817B76706B655F595451545A60636A71746F6865676A6C6D
+ 6F71747D8A959900029A0009979188807C7B7D82860004870003888A89000287
+ 02880187028601870189028C00048A888A8C028E048F00198D8E91979EA5AAAB
+ A69E989596989794969B9FA1A2A09E9D9C00029B00079C9FA4A5A3A09E00039D
+ 00069B999897999D029E00069C9894918F8D028E000C8F91969A9D9F9D99948D
+ 8580027F00067E7D7C7B7C7E047F0280017F017E037D00057C79747172000273
+ 000772716F6D6C6D6E00036F026D000C6B6A6B6C6D6E706E69635F5D025C015A
+ 03580004595B5C5B035A0259025800045655545203510150024F00054E4D4C4B
+ 4900034800034746450002440145024602470248000647464544413F023C0008
+ 3D3E3D37312F3135023800163020110B0A0C0D0E101112141517181A1B1C1E1F
+ 202102220000004EE1E0DFDEDDDCDBDAD9D7D5D4D2D0CECCCAC7C5C2BFBCB9B5
+ B2AEAAA6A29D98938E89837E79736D67625C565253595F63676F74716A67686A
+ 6C6D6E7072788592989A99979188827E7D7E838687860284018503870008898A
+ 89878685868A028E018C028A018B028C00118E8F908E8C8B8D9299A2A9ABA69B
+ 928F91000295000893959A9FA2A3A2A0029F019D029C00069FA3A4A29F9D029C
+ 000C9A989695969A9FA19F9B9690028E018F01910290000B9295999D9F9D9A95
+ 8E858000027E037D00037B7A7B00037E017D027C017B0479000677746F6E7072
+ 0271000B6F6D6B6A6D6F6E6D6C6A69000268000C696A6C6D6F6E68625F5D5C5D
+ 035B035A015B015A0358000557565554520002510004504F504F044E024D014C
+ 024A02490248000347464500034602470248002847464544423F3D3C3E3F3E39
+ 3231333639383120110B0A0C0D0E101112141617181A1B1C1E1F202102220000
+ 02E10035E0DFDEDDDCDBDAD8D6D5D3D1CFCDCBC9C6C3C1BEBBB7B4B0ACA8A4A0
+ 9B96918C86817C76706A655F595453585E62656C73746F6A6900026B00086D6E
+ 6F7176808D960299000898948D86827F80820284000983818284868788898800
+ 04860188018B028E018D018C038B00058A8C8F919000028E00118F9399A1A7AB
+ A89E948F90949594959A9F0002A30005A2A1A09F9D00029C00059FA2A3A19E00
+ 029D00039B9997000296000A999DA1A29F9A948F8E9102930192029100039498
+ 9C00029E00059B968E847D00027B037A00097977787C7D7C7B79780003770004
+ 7876726F026D00067072706F6D6C026900036B6C6A00026901680267000D6869
+ 6A6B6D6F6E6A64615F5E5D00035C00055B5A59585600045400065352514F4E4F
+ 0350014F034C034D014C024B01490548054704480005474645434000023D013E
+ 023F00053A3433343700023900163122120B0A0C0D0E101112141617181A1B1C
+ 1E1F20210222000001E201E102E002DE0030DDDCDBD9D7D6D4D2D1CFCDCAC8C5
+ C3BFBCBAB6B3AFABA7A29E99938F89847E79736D68625C5654575D6163697175
+ 726E026B000A6A6C6D6F71747B8893980299000496908781037E017F02810280
+ 0003838586000288000B8581828485878A8C8D8E8F00038E00048F9093950296
+ 000697989A9CA1A502AA0005A39B9594960002970006989CA0A2A09F029E019C
+ 029A00069C9FA1A2A19F029E019D039C00089D9FA0A19F9C9996029300109596
+ 9593929193969A9D9E9B978F847C037A0009797A7978797C7E7D790002770006
+ 7675777876720270017102730170016E026D016A036903670268000E696A6B6C
+ 6D6E706F6B66625F5D5C035B00055C5A59575500035202510250024E014F0350
+ 00064E4C4B4A4C4D024C024B0003494748000349014802470248024902480008
+ 47464543413E3D3E023F00053B3634353700023900163323130B0A0C0D0E1011
+ 12141617181A1B1D1E1F202102220000002CE3E2E1E0DFDEDDDCDBDAD9D7D5D3
+ D2D0CECCC9C7C4C1BEBCB8B5B1ADA9A5A09B96918C86817C76706A655F590256
+ 00145B6063666D74736F6C6B6A6B6C6E707377829097029900049791867F037C
+ 017E037F0004808284860287018402800007818386888A8C8E00039001920193
+ 0294000395969700029A029B00089DA1A7ABA9A39D990297000698999DA09F9C
+ 039A000599989A9C9F0002A0029E019F01A005A10004A09F9E9C029B019A0199
+ 0398000F969492919396999D9E9C9991877D7A00027B027A027900057B7E807E
+ 7A0004780279000478757475027601750171026E00046F6D6A6903680003696B
+ 6C00026D026E026F001271706B65605D5B595A5B5C5D5C5A5856545303520351
+ 0350034F00064D4C4B4D4E4D034C014A0249024A000449484746024701480249
+ 00094847464544413E3D3E00023F013C01370235001937393A3324130B0A0C0D
+ 0E101113141617181A1B1D1E1F2022000223000001E301E202E101E002DE0031
+ DDDCDBD9D8D6D4D3D1CFCDCBC9C6C3C0BDBAB7B3AFABA7A39E99948F89847E79
+ 736D68625C5756595F63656A7174716E6C00026B000F6C6E7072757D8B95999A
+ 98948C8681000280028100067E7D7E8082830284018301810280000782868889
+ 8A8C8E00028D018E0291038F019101940296000995969AA2A8AAA69E98000294
+ 000795979B9E9D9A98000299000B98999C9D9E9D9B999A9C9F0002A1019F029E
+ 019C029B00059C9D9E9D9C00029A0003989693000392000994989C9E9D9A948B
+ 8100027D000B7E7C7A797A7C8081807D7C00057A017802770278000377767200
+ 026F000571706E6D6C00026D016E026F0170056F027000046C655F5C0259015A
+ 015C025D00065C5B595857560255045301520251015001510250044F014E024D
+ 014C014B024A024901470146044501470249014801470246000344423F00023E
+ 023F001D3C37353638393A3425140C0A0B0D0E101113141617191A1C1D1E1F20
+ 2200022300000007E4E3E2E1E0DFDE0002DD002FDCDAD9D7D5D4D3D1CECCCAC8
+ C5C2BFBCB9B5B1ADA9A5A19C97928C87817C76706B655F5956575D6265686F75
+ 74706E00026C00096D6E6F717379869198000299000C97928E88848384827F7B
+ 7C7E027F018001810282000380818300028702860005888A89888A00028D018A
+ 0289018A018D0290000F8F90939CA5A9A49A938F909395989B00029C029B000B
+ 9A989A9C9D9C9A9796989A00029B0004999798990298000A9A9D9FA09F9D9B9A
+ 97940491000393979B00029E00089B968F888381807D027A000C7B7E8182817F
+ 7E7C79787978027700087879787675747271027300037271700006710170016E
+ 036D00066F706D665F5B025900075B5C5D5E5D5C5A0002580257015601550553
+ 035203510004504F4E4C034A0349000348474500054301460249024800064746
+ 4543403E033D001D3A363436383A3B3526150C0A0B0D0E101113141617191A1C
+ 1D1E1F2122000223000002E4002BE3E2E1E0DFDEDDDCDBDAD8D6D5D3D1CFCECC
+ C9C6C3C1BEBBB7B4B0ABA7A39E99948F8A847F79736D67625C00025700095C62
+ 65676D7476737000036D00086E6F707276808D96029900059896938D88000285
+ 0183017E027A017C037D017F01810383000784878684838588000289018A028D
+ 00068B898685888A028B00128C8F97A1A7A49A928F9092939495979A9C9E029C
+ 049B0198029700049A9B99960294019602970003989B9E0002A000089F9D9B98
+ 94908F900291000D92969A9D9E9C98928B8582817E00027B017D01800381000C
+ 7F7E7B787778777677797A7804770276000375737100067000036F6E6C00026B
+ 00096C6E6F6E67605C5A5900025B035C00035B59570004560003545352000253
+ 000454535251035000044F4E4C4A024801490348024701450544014703490148
+ 024700084543403E3C3B39370233001A35383A3B3627150C0A0B0D0F10111314
+ 1617191A1C1D1E202122022300000004E5E4E3E202E10033E0DFDEDDDCDBD9D8
+ D6D5D3D1CFCDCBC8C5C3BFBCB9B6B2AEAAA6A19C97928D87817C76706A655F59
+ 575A6064666A727675727000036E00126F7071737B8893989A999895918B8784
+ 817D0279017B017D027F00038183850003860009878583818386898A8C00028D
+ 00148C8985838487898A8D8F959FA7A69E948F8E9091029000089194999D9E9D
+ 9B99029A000398979900029C019A02960297000798999B9E9F9E9D00029C0005
+ 9A95908E8F0002910019909194999C9E9D99938B837F7E7C7A7B7E8081807F7E
+ 7D7B790004780179027B017A0179037A00047875726F076D00036E6D6C00026A
+ 00086B6E6F6E69635E5B055A0003595857000255035601550153025202530152
+ 02510350024F014D014C034B024A014902480147014604450147034903480024
+ 4644413F3C393734323336383A3B3628160C0A0B0D0F101113141617191A1C1D
+ 1E2021220223000001E502E40006E3E2E1E0DFDE02DD0023DCDAD9D7D6D4D2D0
+ CECCCAC7C5C1BEBBB8B4B0ACA8A49F9A948F8A847F79736D68625C0002580005
+ 5C6265686F000275000374727000046F0006717277839097039A001C97928B85
+ 807D7A77787A7C7E8183858688898A8987848283868A8C8D028E00118D898583
+ 85878A8D909398A0A7A9A3999200038F018D028C00078F949B9D9C9A97000398
+ 000597999B9D9A0002980299000698999C9E9C9A029900069A99959190910292
+ 000E909193979B9E9D9A948D847F7D7C027B017E0280017E047C017B027C017D
+ 037C017B037A000679787572706F036E00046D6C6B6C036E016D026C016E026F
+ 00046C66615C025A025900065857555453540456015504540253015203510250
+ 014F024E014D024C014A0148044702450003444546000249014A014902480008
+ 4644423F3D3B39360234001C36383A3B3729170C0A0B0D0F101113141617191A
+ 1C1D1F202122232400000005E6E5E4E3E20002E1002FE0DFDEDDDCDBDAD8D7D5
+ D3D2CFCDCBC9C6C3C0BDBAB7B3AFABA6A19C97928C87817C76706B655F595759
+ 5F63676D74000276000374727100037000067172757E8B95039A00089891887F
+ 7A787778027A0004797C808402860188018B028D00078C8987888A8D8F000391
+ 0190018D028B000E8D8F929497999CA2A9ABA79E958F028E048D01900197029C
+ 0003999798000299000798999B9D9C9A9900029A0299000A9A9B9997989A9B9A
+ 979404920005908F91959A00029E00079B97918B84807F00027E027F00037E7C
+ 7B00037C00077E7F807F7D7B790002780277000376747100027003720170016F
+ 026E026F027000046F6E6D6E027000056D67605C5900025A0008585655545253
+ 5455025602570156025501540253015203510150034F024E00044C4B4A470346
+ 0147044501470149024A0249000648464542403F023E001D3C383637383A3B37
+ 29170D0B0C0D0E101113141617191A1C1D1F202123000224000001E601E502E4
+ 01E302E20028E1E0DFDEDDDCDBD9D8D6D4D3D1CFCDCAC8C5C2BFBCB9B5B1ADA9
+ A49F9A958F8A847F79736D68615C025700055B61666B72000278000376747200
+ 0471000672747A859198029A00129790857C7877797C7E7C797B7F8386878A8E
+ 0390018F028E00038F90920003930192039100049396999A029B000A9DA3A9AC
+ AAA2978E8B8D028E00048F8E9198029C00059A97989B9C00039B019D019C029B
+ 00039D9E9B00029801990298019A029D00059C9894919000029100058E8C8E94
+ 9900029E00079C98948F88828100038000057F7D7C7B7C00027D00077E7F807E
+ 7B797600027700087675716F6D6F717402750173017206710004706E6D6E0270
+ 00056C655F5A5900025A00065856555453540255000654555657555402520151
+ 0250014F0450034F014E024D014B014A0249014801490548044A000649484745
+ 4240023F001E403F3B3837383A3B382A180D0B0C0D0E101113141617191B1C1D
+ 1F2022230224000001E602E502E40006E3E2E1E0DFDE02DD002FDCDAD9D7D5D4
+ D2D0CECCC9C7C4C1BEBBB7B3AFABA7A29D98928D87817C76706B645E5956585E
+ 65696F7679787674730003720273001876808C96999A989289817C7B7E828380
+ 7E7C7D8084878B8E048F048E018F029001910190039101930197039A000D999A
+ A0A8ACABA4968D8A8D909100029001920197029A000498979A9D029E019D019C
+ 049D000EA0A19E99979697989C9E9D9A96930390000E8E8A898D93989D9F9D99
+ 948E8680027E027F017E017C037B00097C7B7C7D7E7C7A787600027700037674
+ 7000026E00036F717400027500037473720002710270000C6F6E6C6B6C6F706D
+ 66605B59025B000359565500025400045657565502540005555251504F00044E
+ 01500151025201510250024F014E014D024C014B054A0249014A014B024A0008
+ 49484745423F3E3F0241001E3D3837393A3B382B180E0B0C0D0E101113141617
+ 191B1C1E1F2022232425000001E702E601E502E40036E3E2E1E0DFDEDDDCDBDA
+ D8D6D5D3D1CFCDCBC8C6C3C0BDB9B5B1ADA9A5A09B95908A847F79736E67615C
+ 57565B63676B717779787674037202730005757B87939800029A0007968F8780
+ 7D7E810002820007817F7E8082858900028B038A018902880004898A8C8B028C
+ 00058E8F909296000399000C98999FA6AAACA6998E8A8C900492019303950197
+ 019B029D049E00039F9E9F0002A100169E9A959493969B9C9995949392918F8A
+ 87888C92979B029E00079A958D837C797A00027C017B017902780279000E7879
+ 7A7B7A797877767574737271037000037172730002720171026E016D026C000F
+ 6A69686A6D706E68625C5A5B5C59560002550005565758575600025500035451
+ 5000024F014E014D024E015001520253000352515000024F024E014D024C024B
+ 024A0349014A024B024A0005494746433F00023D002040413D3937393A3C382B
+ 190E0B0C0D0E101113141618191B1C1E1F202223242500000004E8E7E6E502E4
+ 01E302E2002FE1E0DFDEDDDCDBD9D8D6D4D2D0CECCCAC7C5C2BFBBB7B3AFABA7
+ A39E98938D87827C76716B655F59565A6166686D7400027A0003777573000272
+ 000773747578828F9700029A001498938A817C7A7B7C7F807F80818385878887
+ 85840285000386878800028902870007888B8E909396970003980008999DA2A7
+ ABA89D92028C00128F939492908F9194979B9D9C9B9D9E9FA0A1029F02A0000A
+ 9E9A95929094999A97930294000A93908C8785878A8E9499029E00059B958D82
+ 7A0002760277017601750476000375787A00027B000579787674730002720273
+ 0171046F000470716F6D036A02690005686665676B00026E000369625C00025A
+ 00055B5856555600065700035655520002510250034F00085052535452514F4E
+ 034D014C034B014A024903480149024B024A0005494846434000023E001E4142
+ 3E3937383A3C392C190E0B0C0D0E1011131516181A1B1C1E1F21222402250000
+ 02E801E701E602E50006E4E3E2E1E0DF02DE002ADDDCDAD9D7D5D3D2D0CECBC9
+ C6C3C0BDBAB6B2AEAAA5A09B95908A857F79736D68625B57585F65686C74027C
+ 00037A77730002720008737475777E8A9499029A0008968F877F7B7A7C7F0280
+ 018202850286028801850281018201860388018703840004878A8E9102940393
+ 000495979BA302A9000DA1958D8A8C929594919092979B00029E029C00039E9F
+ A00002A1019F039D00099B9996949396999A99000297001495918C8986848586
+ 898F979D9E9C9790857B767503740003757675000374000B777A7C7B79787773
+ 706F710002730171026E026F0004706F6D6B0568000A67656465686D6E69615C
+ 025900055A595756570003580159025801570155035302520151025001510352
+ 0004514F4D4C024B024A0449024802470148014A034B024A0004494744410240
+ 0242001C3F3937393B3C392C1A0E0B0C0D0E1011131516181A1B1D1E20212324
+ 0225000002E801E701E603E50006E4E3E2E1E0DF02DE0038DDDBDAD8D6D5D3D1
+ CFCDCAC8C5C2BFBCB8B4B0ACA8A39E98938D88827C76706A645E59585C63686C
+ 757E7F7C79757372737576777B869198029A000B99958E867F7D7E8081828500
+ 0488028900218682808286888786858382838486898E91908D8C8D9092969EA6
+ A9A4998F898A8E00029302920008959B9FA19F9D9E9F029E029F019C019A029B
+ 029C019A0298019A029B00089A9897948F8A88850283001182848B949B9E9D99
+ 938A817B78767475770002790005777574767900027C00047A79787402700172
+ 02740171026E026F027000036E6B690002680367016602650006686D6F6A625D
+ 035A015902580359035A0003595755000254025300035251500004510003504E
+ 4C00024B00034A4948000247000348494A00024901480149024A034B00064A49
+ 4846444202410243001C3F3A38393B3C3A2D1A0E0B0C0D0E1011131516181A1B
+ 1D1E202123240225000001E902E801E701E602E501E401E302E20033E1E0DFDE
+ DDDCDAD9D8D6D4D3D1CECCCAC7C4C1BEBAB7B3AEAAA6A09B96908B857F79736D
+ 67615B585A60676C747D817F7B787500027401750277000479818D96039A0004
+ 98938B8302800281018301860388028901880185028200048386878603840283
+ 00178587898C8E8C8A898B8E909299A1A7A69C918A898D91920002910006949B
+ 9FA1A09E029D019C019B029C00049A999C9D029F019E039D00119C9B97949392
+ 8F8B88848281808289939A00029E00079A968F88817C7800027700117A7C7D79
+ 76747577797B7A7978757372730002740171016F036E00066F706F6D6B6A0369
+ 026A0269000A6B6E706D67625F5D5B59055800065A5B5A595653035201510650
+ 00034F4E4D00044B00034A49470002480149024B034A044B014A014802460144
+ 0141023F01410243001E3F3A38393B3C3A2E1B0E0B0C0D0E1011131516181A1B
+ 1D1F202123242526000002E902E801E701E602E50005E4E3E2E1E00002DF002A
+ DEDCDBDAD9D7D5D3D2CFCDCBC9C6C3C0BCB9B5B1ACA8A39E99938E88827C7670
+ 6A645E59585D646A717B028100077E7A7775747577000278000A7E899498999A
+ 99958D8503800004818284860387000388868500028400058587898785000286
+ 0285000687898B8C8B8A0289000D8B8D8F90959EA5A7A1968D8A8C000290028F
+ 000692999D9F9E9C069B00049A9B9EA002A201A1019F029D00049B9994910290
+ 00138F8B8885838280828891999D9E9B97928B837D000379017B027C00037875
+ 7300027401760278017702760175017303740172026F00036E6D6E000270016F
+ 016E026D066C000C6D6F71706B66625E5B5A585703560159025A000359555100
+ 0350034F014E054F014E044D014C014B094A034B000749474542403E3C00023B
+ 000D3F4243403A38393B3C3A2F1C0E00020B00100D0F1012131516181A1B1D1F
+ 202123240226000002E902E801E702E601E501E402E30034E2E1E0DFDEDDDCDB
+ DAD8D6D5D3D1CFCDCAC8C5C1BEBBB7B3AFABA6A19C96918B857F79736D67615B
+ 575960676E788082807C797602750176027800047B85909703990006958E857F
+ 7D7E027F0180018103830484000885888A8C8A888A8B028900158A8C8E8D8B8A
+ 8B8C8D8F9091959DA4A8A59B918C8D00028F028E000390959900029B039C019B
+ 019C039D019E02A102A201A0019C0399000398949000028E00058D8B88858300
+ 0382000E8790979C9E9C98938C837C797778027A017901760473000774767776
+ 7576750002740275017302710170026F03720170026F00036E6D6C00036B0008
+ 6C6F71706A645F5C0259015701560255000756595A5957545000024E014F034E
+ 034D014E014F0250014F024E014C024B00064A4B4A49484703480149024A000E
+ 4744423E3C3B39383A3F4243403B023900063B3C3A2F1D0F020B00100D0F1012
+ 131517181A1B1D1F202223250226000001EA01E903E801E701E602E501E401E3
+ 02E2003CE1E0DFDEDDDCDBD9D7D6D4D2D0CECCC9C6C3C0BDBAB5B1ADA8A39E99
+ 948E88827C76706A645E58575B636A737D82817D7A77767576777879808C9497
+ 0299000B958D837B797B7C7B7A7D80000381000B82838485888A8D8C8B8C8D00
+ 038C028E018C028A000F8E9092939596999EA4A9A8A0948E8C00028D018E0290
+ 000692949597999B039A019E02A101A0019F029D00049E9C989603970192018F
+ 028C00058B8A898684000283001384888F969B9E9D99948C837B777576787978
+ 7600057401750176027504760277017502740175047401720171026F00036E6D
+ 6C00046B00076E706F69625D5A0002580157035501570258000457565350054E
+ 014D024C00054B4C4D4F4E00024D014B014A0248034900034846450002460147
+ 0148024A000E484543413F3E3C3B3D404344413C0239001A3B3D3B311E100B0C
+ 0D0F1012141517181A1C1D1F212224252627000002EA02E901E801E702E602E5
+ 0006E4E3E2E1E0DF02DE002EDDDCDAD9D7D5D3D2CFCDCBC8C5C2BFBCB8B4AFAB
+ A6A19C97918B857F79736D67615B56575C646E7A81827F7B7876027500077677
+ 787D8791960002980006958C80787576037700037C8082000281000482858687
+ 0288028900038A8C8D00028C000F8D8E8D8B8A8C929597989A9B9C9FA40002A8
+ 0007A298908C8A8B8F00029202900025929497989796989DA09F9B9896979A9B
+ 9A98979695918E8B8A8B8A8987848385868A8F949A00029D00099A948C827975
+ 7475760002770175037601750576017702780004797A79780277037600057574
+ 71706F00026E016D016C026B026A016C026F000769625D5A5859580003560257
+ 0356000354514F00054E00054D4C4A494A00034D00034C4B4A000249044A0148
+ 0247000C4647494A4B4A4948474544430241014202440141013D0239001A3B3D
+ 3C311E100B0C0D0F1012141617191A1C1E20212324252627000002EA02E902E8
+ 01E702E602E50006E4E3E2E1E0DF02DE002DDDDBDAD8D6D4D3D1CFCCCAC7C4C1
+ BEBAB6B1ADA9A49F99948E88827D77706A645D5854565D68758082807C797700
+ 0275000D7677787A828C949798968E8278000274000A7576787F838583828386
+ 0387018402830005868A8B8A8B00048D00078E919598999A9B00029C00129DA0
+ A4A7A49C938E8A8B8F93928F8E9092940397000A999C9D9B979291939899029A
+ 0007979593908D8B8A00028B00118A89868487898A8D92989C9D9B968E847A00
+ 047501740275017701780779037A027B00037A7877000276000D757675737170
+ 6F6E6D6C6B696800026700076A6E6F6B65605C00025A01590157055602570003
+ 55525000034F034E014D014C024A014C044D014C064B014A014803460003484A
+ 4B00024C014B014A024901470145024300044445423D023A00183C3E3C311E10
+ 0B0C0D0F1112141618191B1C1E20212324260227000001EB03EA01E902E801E7
+ 01E602E502E40037E3E2E1E0DFDEDDDCDBD9D7D5D4D2D0CECBC9C6C3C0BCB8B4
+ B0ABA6A19C96918B85807A736D67605A55535762707D83827E7B787675767700
+ 0278000A7D879195979690867C7602750003767A800002840004828082850284
+ 000983817F8084888A898B00028C00058D909294960003970499001E9A9FA4A6
+ A19A928C8A8C90918F8E8F919396989B9C9B9A98959290929597029800059694
+ 92908E00038B00058C8B8A888700038900158A8F969B9D9C9791887E77757473
+ 727374777A7C7D00027C037A0179037A00047B7A78770276000975767472706F
+ 6D6B690002680267000F66676A6D6F6D67625E5C5A5956555600025703580004
+ 565452510250034F024E014C034B024C024B064A0008484643424346494B024D
+ 014C024B00034A494600024402450143013E023A00063C3E3C311E10020C0012
+ 0E0F1113141618191B1D1E20212324262728000002EB02EA02E901E801E702E6
+ 02E50005E4E3E2E1E00002DF0023DEDDDCDAD9D7D5D3D1CFCDCAC7C5C1BEBBB6
+ B2AEA9A49F99948E88827D76706A645D5700025300125B6A798384807D7A7775
+ 767778777A838D9302950004938C837B0377017A017E028000067E7D8082807E
+ 037D00037F8488000289018A028C00048D9092930392001F9496979694959AA1
+ A5A49C938C898B8F91908E8F909295989B9C9B98969593000292019401950294
+ 01930192029100048E8C8B8A048B028A000F8887898E949A9D9C99938A7F7774
+ 72000270000471727578027A01790178037600047576787A027B000D79787775
+ 7473716D6C6B6A6968000269016A0269000B6A6B6E6F6D67615E5C5A58000256
+ 01580159025A000558565554530002520151034F014E024D014B014A03490147
+ 0548024700084644413F4144484B034D024C00034B4A470004450143013F023B
+ 001A3C3E3D331F110C0D0E1011131416181A1C1D1F21222425262728000003EB
+ 02EA02E901E801E702E602E50006E4E3E2E1E0DF02DE002CDDDBDAD8D6D4D3D1
+ CECCC9C6C3C0BDB8B4B0ACA7A29C97918B85807A746D67605A55525663748185
+ 837E7B78037600137877787E89919495938F867C76757677797B7C00027B000D
+ 7E807E7B797A7B7F848889888A00038C018E0290000791909193969897000296
+ 019A01A002A400069D948D8B8D900292000391929300029401960199029A0199
+ 029701960194039202910007929392918F8D8B000289000B8A8B8C8B8A878688
+ 8C929800029C000799948B8178747100026F0006707273757675027302720273
+ 000374787A00027B000779777471706F6C000268026900036B6C6E00026D016C
+ 036B000C6D6F6E6A65615E5C5856575803590003575554000353000352514F00
+ 024E034D014B014A024901480547000D4645464544413F4143474B4D4E00034D
+ 00054C4B4846450002460144013F023B00063D3F3E342112020D00120E101213
+ 1517181A1C1E1F21222425272829000001EC02EB03EA01E902E801E702E602E5
+ 002EE4E3E2E1E0DFDEDDDCDBD9D7D5D4D2D0CDCBC8C5C2BEBAB7B2AEA9A49F9A
+ 948E88827D77706A645D5753545E6D7C02840004807D79770276000C7877787B
+ 858E92949390877B02730274001275787B7A797B7E7D7B797B7D8084878A898A
+ 038C00038D8F910002930003949597000298029900079C9FA3A5A19B96000392
+ 0493029500069495969899980397019501920391000992949594928F8D8B8A00
+ 048B00038C8B89000287000C8A90969B9C9A968E857C76730271017301750376
+ 00047573727002710004727376780279000377736F00036C000C6967686A6C6D
+ 6F706F6E6C69026700096A6D6F6D6964605C5900025701580157035601550153
+ 02520253000451504F4D044C014B014A02490147014803470146014502460007
+ 4543414244474B00044E024D014B0149044601450140023C00063E403F362313
+ 020D00120F1112131517191B1C1E2021232426272829000002EC02EB03EA02E9
+ 0003E8E7E60002E501E402E30031E2E1E0DFDEDDDBDAD8D6D5D3D1CFCCCAC7C4
+ C0BDB9B5B1ACA7A29D97918B85807A736D67605A55535864748084827E7B7800
+ 0277037800047A818A910293000591897D74720003740178027C027A017C027D
+ 00067C7E818283850289038B00048A8B8E91039301940395000B97999B9EA2A5
+ A6A29D9793000491000492959796039501960197029500079695939293949600
+ 029500059392908E8D00038E028C00148D8C898685888E959A9C9B9790867C76
+ 73727374047600047573716F026E00096F707274767776716D00036B02690003
+ 6A6D6E00026F00056E6D6C69660002640167016C026F00056B655F5B59000357
+ 0156015503560003545253000254000452504E4D044C014B024A014905480247
+ 0004484746440243000444474B4E034F024E00044C4A4746024701460141023D
+ 013F0241000337241400020E00120F1112141617191B1D1F202223252628292A
+ 000001ED01EC02EB03EA02E901E801E702E602E50004E4E3E2E102E00023DFDE
+ DDDBD9D8D6D4D2D0CECBC8C5C2BFBBB7B3AEA9A49F9A948E88827D76706A635D
+ 5700025300035A687A0002830004807C7978027702780018797E868E9293928C
+ 817773747574777C7D7B7A7C7F807F81038401850288028900068887888B8D8E
+ 038F000E908F9092979A9DA1A5A7A5A099930490019101940297029502940195
+ 029401950196039502970195029201930192029102920190018F028E000F8C87
+ 8382868D93999C9B9890867A74000271000370727300027400057573716F6D00
+ 026C000A6E6F7073757776716D6B036A016B016C026E016D026C026B000C6967
+ 6667696D706E69635D590458015702550256015404530003524F4E00044D024E
+ 00034D4C4B00064A034900034746450002440003474B4F000350024F00034D4B
+ 48000247000348474200023E00063F4241392615020E00121011131416181A1C
+ 1D1F212223252728292A000001ED02EC02EB03EA01E902E801E702E601E501E4
+ 02E30031E2E1E0DFDEDDDCDAD9D7D5D3D1CFCDCAC7C4C1BDB9B5B1ACA7A29D97
+ 918B85807A736D66605A54515360748284817E7B790002770178027900047B82
+ 8B90029200048E877D760275000374767900037A017D01810382018302840185
+ 0187028601850284000386898B00038A018B028C000C8D8F94979A9EA3A7A6A2
+ 9B95059200039395960002940004959798970295029601970196029701940292
+ 0494029500069492908E8A8402810004858B9198029C00079992877A736F6E00
+ 026D00086F70727473706F6E026D000A6E6F7073767876716D6B0269016B026D
+ 016E016D026B026C016D016C026A00086B6D6F706D67605B0258015902580157
+ 0355025401520353000552504F4E4F00035001510150024F014E024D034C024B
+ 014A0249014802470148014C02500251025000084E4C494748494843023F0140
+ 024200173A27150F0E1012131517191B1C1E202123242627292A2B00000002ED
+ 02EC02EB03EA01E902E801E702E601E501E402E30030E2E1E0DFDEDDDCDAD8D6
+ D5D3D1CFCCC9C6C3BFBBB7B3AFAAA59F9A948E88827D767069635D5752515B6E
+ 7E8583807D7A03780179027A00157E878E9192908B837C7876747678797A7C7F
+ 818281000280002181828485848281828386898A88878687898A8B8D9093969B
+ A2A7A8A49E989594930002940193029400099395989B9D9A9896950003960295
+ 01940293029502960297000695928E8B87840281000D858A90969B9C9A94897C
+ 736F6D00026C00036D6F7100027401710170026F016E026F0010717477787671
+ 6D6A68696C6E6F706F6E046F00056E6D6C6D6E00027000056D68615C59000558
+ 015603550154015202530254015302520553025202510004504F4E4D044C034B
+ 00074A494A4D505152000251000C504F4D4A48494A4944403F41024300033B28
+ 1600020F001011131416181A1B1D1F2022232527282A022B000001EE02ED02EC
+ 02EB02EA02E901E802E701E602E50005E4E3E2E1E00002DF002CDEDDDBD9D8D6
+ D4D2D0CDCAC8C4C1BDB9B5B1ACA7A29D97918B858079736C66605A5451556477
+ 8283817E7B790278001F797A797C838B9092918E89827B76757677787A7C7E7F
+ 807F7E7F80818384830002810007838486878889880002860188018A028C000B
+ 8D8F93989FA5A7A5A09A9500029200039395930003920196019B029E00039C99
+ 96000294019505940195019602970298002096938F8B8886848183868A8F949A
+ 9C9B958C7F75706E6D6C6D7072747572706E046D000D6F72757776726E6A6869
+ 6D6F72000273027201710270016E036D000A6E6F706E69625D5A595802570158
+ 0456015503530154015602550156015503540153025202510005504F4E4C4B00
+ 064C034B00044E5152530252000951504E4B494A4B4A4500024000064244433A
+ 27160210001011131517181A1C1E1F2123242527282A022B000001EE03ED02EC
+ 02EB02EA02E901E801E702E602E50028E4E3E2E1E0DFDEDDDCDAD9D7D5D3D1CF
+ CCC9C6C3BFBBB8B3AFAAA59F9A948E88827C767069635D56025100085B6D7D83
+ 817E7C7A0378027900047B80898E02910019908C847B747273747577797B7C7E
+ 7F80828182838483818385000286000487898B8A0289018B018D028E00068F91
+ 94979CA102A5000DA199928E8D9195938F8E91969B00029C00039B9996000294
+ 059500159698999A999795928F8B888685848385888A8D929800029B0006978E
+ 8378716E036C00076E707374716E6C00036B000E6C6D70737675736F6B696A6D
+ 707202740012737271706F6E6C6A696A6C6E6D69635E5B590458025602570156
+ 035404550156015404530152025100055251504E4D00024C054D034C00034F52
+ 5300025402530010524F4C4A4B4C4B4742414243403524160211001012141618
+ 191B1D1E202224252628292B022C000002EE02ED02EC02EB03EA01E901E802E7
+ 02E601E501E402E3002AE2E1E0DFDEDDDCDAD8D6D4D2D0CDCBC8C5C1BEBAB6B1
+ ACA8A29D97918B857F79736C666059535054647702820013807D7A797778797A
+ 7B7E868C9091908D847A73000270000A72737577787B7E818485028400038687
+ 860002840186018702880003898B8C00028D048F000B91939495979BA1A39F96
+ 8E00028A00078F95938E8D9196000398029901980396029701980299000C9B9C
+ 9B9793908E8C89868586058700038A909600029B00079891867B736E6C00026A
+ 00076C6E7072706D6B00036A00096B6E7274767573706E00026C00176D707173
+ 7472716F6E6D6B68666465686C6E6B65605C5A00035901580257000359585700
+ 0255035604550254015502540353000352515000054F034E034D000350525400
+ 035500065453514E4B4C024D01480143024200173F382B1D141112131517191B
+ 1C1D1F2123242627292A2C00022D000003EE02ED01EC03EB03EA01E901E802E7
+ 02E60006E5E4E3E2E1E002DF0021DEDCDBD9D7D5D4D1CFCCC9C6C3BFBCB8B3AF
+ AAA5A09A948E88827C766F69635C5600025100085D718083817E7B790277000D
+ 797A7B7D838A8F91908D877D76000270027100077274777A7D80830003840385
+ 0003838182000484000485888A8C028D028C00198E8F908F90959DA19E97918D
+ 8E939796918F9194959698999A000499059A029B000398938F00028D001B8B87
+ 8586888A89868482868D959A9B99938A7E756F6C69686A6C6E000271016E026B
+ 026A00036B6F74000277000775716F6E6D6E6F00047100116F6D6B6968676462
+ 6162666B6F6C67605D00025A0459035A01580157035801570356025502560155
+ 01540453015201510450014F034E034D014F01530556000355535000024D000A
+ 4E4F4A45423F372B1E1602120006131416181A1C021E00092022232527282A2B
+ 2C00022D000001EF02EE03ED01EC03EB03EA0003E9E8E70002E602E50031E4E3
+ E2E1E0DFDEDDDCDAD8D6D5D3D0CECBC8C5C1BEB9B5B1ACA8A29D97918B857F79
+ 726C665F595351586B7E84837F7C790002770178017A027C000380878D000290
+ 00068E898077706F027000067174777A7B7C027E027F0380000B7D7A7B7D7E7D
+ 7C7E82858700028802870288038900098F99A0A19B969291920002950191028E
+ 00059093979A9C00029D029E00039D9B990003970298000994918F8E8D8C8886
+ 8900028B01870183027F0014848B93999B9A958D8278716D6A696A6C6F72736F
+ 026D016C026B00076F74777875716F00026D016F0370000A6E6D6B6966656465
+ 646302620008666B6F6D66605D5A0459015A015C025B015A025900045A595857
+ 035603570156055501540352025301520150034F024E00035055570003580257
+ 000D55524F4E50514D46413A2C1E15000212001213141617191B1D1E1F212324
+ 2627292A2C2D022E000002EF03EE02ED02EC02EB02EA02E901E801E702E60004
+ E5E4E3E202E10030E0DFDEDDDBDAD7D6D4D2CFCCCAC7C3C0BCB8B4AFAAA5A09A
+ 948E88827C756F69625C555155657A8485817E7B7877787A027C00047D838A8E
+ 028F000B8A81766E6D6F7071747677000278017A027C017B027C00067B797778
+ 7A7C027B00077C7F8285868584000283000B828384868D97A0A29D979000028C
+ 000A8E908F8D8E91969B9E9F02A0000CA19F9C98949192949593908F0390000E
+ 8F8D8C8D8C8884818081858B9297029B0007968F867D75706D00026B00056C6E
+ 71737000026E016D026C016F01730277000A75726E6C6B6D6E6D6C6B026A0004
+ 69666463026501640263000A666B6F6E68625D5A59580259015B015C075B015A
+ 0259025A035B035A0259015A0158025701560257000456555455025400035556
+ 5800055A0024595754515052534F473F342418121113141517181A1C1D1F2022
+ 242527282A2B2C2D2E2F000002EF03EE02ED03EC02EB02EA01E901E802E702E6
+ 0006E5E4E3E2E1E002DF0020DEDCDBD9D7D5D3D1CECBC8C5C1BEBAB6B1ADA7A2
+ 9D97918B857F78726C655F58025300085F73828584807D7A0278017A037C0003
+ 80878C00028E00098C84786D6B6D717374000373000476797C7B037A00077978
+ 7778797A7B00027C00047E8083840383001982818285898F979FA29E97918B8A
+ 8B8E8F9092969A9C9D9C9D00029E00069C989591909202940192028F01910393
+ 000591908E8A8600028200068486898C9096029B000D97928B837B74716E6D6C
+ 6D6F7000026F0018706F6E6D6E71757674716E6B6A6B6C6A696A6B6C6B686564
+ 026503640167016C026F00046A645F5C025A00035B5C5D00035E015F09600261
+ 0260025F00055E5D5C5A5900025806570003585A5B00025C015D015C025D025C
+ 015A015602530008545551483C2D1F1502120008141517181A1B1D1F02210009
+ 23252628292A2C2D2F000230000001F003EF01EE03ED02EC02EB03EA01E901E8
+ 02E702E6002CE5E4E3E2E1E0DFDEDDDCDAD8D6D4D2CFCDCAC7C3C0BCB8B4AFAA
+ A5A09A948E88817B756F69625B5553596A7D02850015827F7C7978797C7D7C7E
+ 848A8D8E8C877C716A6C700002740005726F70737800027B017A037901780277
+ 001976777A7D7C7D7F8284838485868586898D92989EA2A19D979000028B0005
+ 8E9091939600029803970299019702940293001295969594929394969593918E
+ 8D8A87858689028A000F8B8F949A9B98948E877F7873716F6D00026C00126D6E
+ 7072716F6E6D6F737572706D6C6B6C6B026900066B6E6F6D6B68026600066564
+ 6364676C027000086B6662615F60626302640165026603670266066502640008
+ 6362605F5D5A5856025502540008555456595C5E5F60055F00245E5C59565556
+ 57524737261A151314151718191B1D1F212223252628292A2B2D2E2F30310000
+ 02F002EF03EE01ED03EC03EB02EA0003E9E8E70002E60004E5E4E3E202E1002F
+ E0DFDEDDDBD9D7D5D3D1CECCC9C5C2BEBAB6B2ADA8A29C97918B847E78726C65
+ 5E5853546175838683807C7A78797B00027D000C7E82888C8D8C8980756C6A6E
+ 02720008706D6E72767A7B7A04790005777573757900027D00037C7E82000286
+ 01880189028A00138B8C8F92979DA2A4A29D948C8A8D8F919293940002930294
+ 00079593929193959600039802970005969594918F00038D028C018B028C018B
+ 028900168C92989B99959089817A7573726F6E6D6E6F7173716F026D00057074
+ 75727000046D016C026A016C016F0270000E6D6B686766656465676C70716E6B
+ 026901680169026A076B016A02690268056700096665646261605E5B5A000259
+ 015803570004585C5F6105620361000B5F5B5856585953443020170002150008
+ 1617191A1B1D1F210223000A242627292A2C2D2E2F300231000001F102F002EF
+ 02EE02ED03EC02EB02EA01E901E802E702E60006E5E4E3E2E1E002DF0029DDDC
+ DAD8D6D4D2D0CDCAC7C3C0BCB8B4AFAAA59F9A948E87817B756E68615B55535A
+ 6D808684817D7A00027800077A7C7E7D7F858A00028C000E8A83796E696A6E6F
+ 6E6D6F727679027A0379000D7877757475797C7D7C7D82868800038901880289
+ 000E8B8E949CA1A4A39F978F8B8D8F91029201910290019202940192028F0003
+ 93969800039A0005999896939000028E00038F8E8F00039000038F8D8A000286
+ 000F8990969A9995918B847D79777674730002720005737475737000026E0005
+ 707476747000046E016D026C016D016F027000046F6E6C6A0269026A00056C6F
+ 7374730002710270046F046E026D016C016B026A036904680267026600036564
+ 620003610260025F0004606162630664000C6362605C58565758503F2A1C0216
+ 00171718191B1C1D1F202223252627292A2C2D2E2F3031323300000001F102F0
+ 03EF02EE02ED02EC02EB02EA02E901E802E701E601E502E4002FE3E2E1E0DFDE
+ DDDBD9D7D6D4D1CFCCC9C5C2BEBAB6B2ADA8A29C97918A847E78716B645E5753
+ 56657A8586827F7B79000278017B027D00037E828800028C00088A867D726A69
+ 6B6D026E0010707376797A797A7B7A79787776777A7C037D0181018403860185
+ 03840005878C93999F0002A200039F999200038E0190029100188F8E8F929596
+ 9491929598999A9997969593918F90929392049100038F8B870002830003878E
+ 94000299000996918C867F7B7978770006760174017202700005717476747000
+ 026E016F016E046D00036E707100027201710270017101720273017503760275
+ 01740273017202710370026F026E00036D6C6B00026A01690768026701660465
+ 0364026302640765000C64635F5A555455544A37241A02170012181A1B1C1E1F
+ 202123242627292A2C2D2E2F023102330134000002F102F003EF02EE02ED02EC
+ 02EB02EA02E901E802E701E601E502E4002EE3E2E1E0DFDEDCDAD9D7D5D3D0CD
+ CAC7C4C0BCB8B4AFAAA59F9A948D87817B746E67615A55545E72818584807C79
+ 0278017A037D000C80868B8C8B8881776D696A6C026E00056F7275797A00027B
+ 00097C7B79787978797C7E00037F00038183840002850284001285878B8F9498
+ 9CA0A19E97908C8B8A8C8E8F0290000791949799989697000298000497969491
+ 039000088F9093969593908F029000118E89838082868C92989A97928D87807B
+ 7900037701780277000C76757473727172747573706F026E00096D6C6D6E7072
+ 747577000478057903780177027602750003747372000371000B706F6E6D6B69
+ 68666463620005610262000461605F5E035D025C035D025F0160056100055F5D
+ 59534F00024E00054B402E201A00021900051A1C1D1E20000222000E23252627
+ 292A2C2D2E30313233340235000003F102F002EF02EE03ED02EC02EB02EA01E9
+ 01E802E702E60005E5E4E3E2E10002E00024DFDDDCDAD8D6D4D1CFCCC9C5C2BE
+ BAB6B2ADA8A29C96908A847E77716A645D575358687B02840007817D7A787779
+ 7C00027D00037F858A00028C00088A867D736C6A6B6D026C00046F73787C027D
+ 00087E7D7C7B7C7B7C7F028102820003838485000486000D898C8F9296989B9F
+ A09C948D890002880007898D919394969800029901980196029700069592918F
+ 8E8F038E0005909495938F00028C00138E8F8D88838183858990969A97938E89
+ 827D7A00027900057879787674000273027202710173027401720170026F0008
+ 6E6F717477797A7B057D047C017B027A01790178027700147675737271706F6D
+ 6B6865625E5A5754514F4E4D034C024D00044E4D4B4A024805470007484A4C4D
+ 4F5051000350000B4F4D494441403F3B32251D00021B021C00141E1F20222324
+ 252627292A2B2D2E2F31323334350236000004F102F002EF01EE04ED01EC03EB
+ 01EA01E903E801E701E602E50025E4E3E2E1E0DFDEDDDBD9D7D5D3D0CDCBC7C4
+ C0BCB8B4AFAAA59F99938D87807A746D676059000254000B5F738185827E7B78
+ 77787A00027D00037E848A00028D00078C89827A726D6B00026C00066B6E7378
+ 7C7F03800181018003810283038402850003878889000288000D8A8C8F919597
+ 9A9D9F9D96908C00038900058D9093959600029700079593929394928E00028D
+ 018E018F038E019002920190018D028C028D00048B8886850284000B878E9599
+ 98938F8A847F7C00027B00067A79777573720573000574757776750002760005
+ 77787A7C7E00027F0480027F017E037D00187C7B7A79777675736F6A68676663
+ 5E58534D48423D3935320230012F022E022F00063031302F2E2D052C00062D2E
+ 2F3133350536000435343330022E001C2C2A25201D1C1D1E1F20212224252627
+ 28292B2C2D2E30313233343502360137000001F203F103F002EF02EE03ED01EC
+ 02EB02EA01E902E802E70005E6E5E4E3E20002E102DF0028DEDCDAD8D6D4D2CF
+ CCC9C6C2BEBAB6B1ADA7A19B95908A837D76706A635C5653596B7D85837F7C78
+ 0277000E797B7C7D81888D8E8D8B87817A73046D00066F72777B7D7E027F0280
+ 0281028202810482018502860283000E8586888C9194969A9D9F9B958E890287
+ 0010888A8D90939493918F909192918C8B8C038F0190029102920005918F8E8C
+ 8A0004890006878482858C930298000C94908B86817E7D7C7B7A787702750176
+ 017702780003797A7C00027E027F0280028105820481000F807F7D7C7B7A7775
+ 726F6D69645B5100024D000C4C48413B342E2A25221F1D1C061B021C031D051C
+ 031D021E0120012102220723012203210120011F021E011F0120022100032223
+ 24000226000E27292A2B2D2E2F3031323334353602370138000002F203F102F0
+ 02EF03EE02ED02EC03EB01EA01E902E801E702E60033E5E4E3E2E1E0DFDEDDDB
+ D9D7D5D3D0CECBC7C4C0BCB8B4AFAAA49E98928C868079736C665F5853556478
+ 8485817D797776777900027A00037D848B00028E000D8D8A8681797270717071
+ 727476000278027900067A7B7C7D7E7D027C017D037C00037F817F00027C0005
+ 7E7F82878C00028F000793999E9D988E8600028100148284888D90918E8B8C8D
+ 9092918D8B8C8E8F909302940293000792908D8A878688000289000F86828184
+ 8A909697938F8B8783807F000280017F017E037D017E01800281000382838400
+ 02850186058504840183028202810010807D7976736F69635C56524D463B2F2B
+ 022C00072A25211D1B191700021604150416021705180419031A021B041C041D
+ 041E041F01200221000322232400022501260128022900082A2C2D2E30313233
+ 023400033536370002380139000001F301F204F102F002EF02EE02ED03EC02EB
+ 01EA01E902E802E701E601E502E4002DE3E2E1E0DFDEDCDAD8D6D4D2CFCCC9C6
+ C2BEBAB6B1ACA6A09B958F89827C756F68625B55545D718185837F7B78000276
+ 0007777675767D858900028A00088988847F7774737202710172037300067475
+ 76777879037A027B017A027900037B7D7C00037B001A7C7F858889888C939C9D
+ 968B837D7C7E81878C8D8C8987888B8F0292000F8F8E8D8E8F9194969594928F
+ 8D8B890002870004898A87830281000E84898D9294918D8985807E8083850286
+ 0187028602870288068902880387018601850284001982817F7D7B777069625B
+ 534A423A332F2C27211A18191A191800021606150216031704180219041A031B
+ 031C051D041E031F03200121022203230004242526270228000D2A2B2C2D2E2F
+ 3031323334353600023701380239013A000001F302F203F103F002EF02EE02ED
+ 03EC02EB01EA01E902E802E701E601E502E4002DE3E1E0DFDEDDDCDAD7D5D3D0
+ CECBC8C4C0BCB8B3AFA9A39E98928C857F78726B645E5753596A7D8584817D79
+ 770002760010747270747A7E7F80828485827C76747303710272000371727300
+ 02750276000C7778797B7C7B7A797B7C7D7C037B001B7E82858483868E989B94
+ 88807C7B7C8085898A89878586888D9091000290028E00088F91949594918F8C
+ 028A038B00038C8A8500028200048385878A028B000A898886827D7B7D83878A
+ 048B028C018B028C038B028A02890288001A878684817E7A75706B665E534940
+ 38312A241F1C1B191816151403150516021703180219031A031B031C031D031E
+ 041F0420042103220323022402250226012701280229000D2A2B2C2D2E2F3031
+ 323334353600023701380239023A013B000002F303F202F103F001EF03EE02ED
+ 03EC01EB01EA02E902E802E70031E6E5E4E3E2E1E0DFDEDDDBD9D6D4D2CFCCC9
+ C6C2BEBAB5B1ABA5A09A948E88817B746E67605A545664788485827F7B787600
+ 0275000973706F707375777A7E00028300037F77730003720173027403730474
+ 00067577797B7C7B027A00047B7C7D7C037B017C017F03810007858D979B9589
+ 8000027C00057D7E81848600028702860004878B8E90028F00138E8D8E909394
+ 928F8D8C8B8C8E8F8E8D8A86850002860007858684817B787B00027E00077C7B
+ 7D83888B8C00048D018E038D028C028B00188A89888785827E7972695F574E47
+ 41393028231F1C1A18170716021703180319021A031B021C031D031E031F0320
+ 022104220523042403250326022702280229012A022B012C012D022E00072F30
+ 3132333435000236013701380239023A023B013C000003F302F202F103F003EF
+ 02EE02ED02EC02EB01EA01E902E803E70006E6E5E4E3E2E102DF0028DDDCDAD8
+ D6D4D1CECBC8C4C0BCB7B3AEA8A39D97918A847E77706A635C56555E72818584
+ 817D7976027402750007737173777A7D81000284017E01760271017401750277
+ 00037675740004730007727376797C7D7C00027B00037C7D7E00057C000D7E80
+ 8283878F979C988D837E7C00027D00057E80838789000388018C028E028D028B
+ 00068C9092949290058F00058E8D8C8B8A000389000F87837E756861656D7276
+ 7A7E83888B00028C018D028E018F028E00188D8C8B898785827F7A746D655C50
+ 4439312B27231F1C191803170116031702180319021A031B021C031D021E031F
+ 0220022104220223042404250426042704280329032A022B012C012D022E022F
+ 013002310005323334353600023701380139023A023B033C013D000001F402F3
+ 03F203F101F003EF02EE03ED02EC02EB01EA01E902E802E70004E6E5E4E302E2
+ 002EE0DFDEDDDBD9D7D5D2D0CDC9C6C2BEBAB5B0ABA59F9A948D87807A736D66
+ 605A565A6A7C8485837F7A7774727377027800047C8285870289000B867E7671
+ 7275787A79767400027202710272000674777B7F807F027D017F0280027F0380
+ 000E828486888C91989C9B9288817E7D027E00057F82878B8C00028B000A8D8E
+ 8D8B8987888C90930295029301920190058E018D018C038B00138781796B5647
+ 4850586069727B81858788898B00028C00148B898784817C77716B645C52483F
+ 362D26201C1A02190218011703180219031A021B031C021D031E021F03200221
+ 03220223022404250226042704280429042A052B022C022D032E012F02300231
+ 02320133013402350136013702380139013A023B023C023D033E000001F403F3
+ 03F202F103F002EF02EE03ED02EC01EB02EA01E902E802E70030E6E5E4E3E2E1
+ E0DFDEDCDAD8D6D3D1CECBC8C4C0BCB7B2ADA8A29C96908A837D766F69635D58
+ 576274828684817C797502720006777B7D82888D028F000C8E8A827B75737578
+ 7A79757104700006727476797C80028201810182038401830182028300158485
+ 87898A8D91969B9D9890877F7D7E7F8081868B00028D000B8C8D8E8C8A868487
+ 8C9194000396002095938F8D8E909192908E8F908F8981786548312C30363D48
+ 54606A707375787C027E00117B77726D665E564E463F362F2924201D1A000619
+ 021A031B021C031D011E031F0220032102220323022403250226032702280329
+ 022A052B032C052D062E032F0230043101320233023402350136013702380239
+ 013A023B023C023D023E033F000002F403F302F203F102F003EF01EE03ED03EC
+ 0003EBEAE90003E801E701E602E5002DE4E3E2E1DFDEDDDBD9D7D5D2CFCCC9C6
+ C2BEB9B5B0AAA49F99928C867F79726C66605A565C6D7E8586837E7B77000274
+ 0006787C7E82898F02910005908D877F77000273017602790174026F03710006
+ 737678797B7E028101820184028600048583818202830015848687898B8F949A
+ 9D9A93887E7B7C7E7F8184888900028A018B028D00068A8582868D9203930294
+ 0005939190919200049300099596948E867A613F2500021B000B1D21272F3842
+ 484B4F545900025D000E59544E47413A332D2824211E1C1B031A021B041C011D
+ 021E031F0320022103220223022402250226022703280229032A022B032C042D
+ 032E032F0730053104320333033402350236023702380139013A033B023C013D
+ 033E033F0340000001F502F403F303F202F103F001EF03EE02ED02EC02EB01EA
+ 01E903E801E701E602E5002CE4E3E2E0DFDEDCDAD8D6D4D1CECBC8C4C0BBB7B2
+ ACA7A19B958F89827C756F68635D57596679848685817C7802740006797E7F81
+ 878E0391000C8F8B82797372747778747071037201740177037800057B7F8183
+ 85000287018601840282000F83848587888A8C8F93979B9A93877D00027A0010
+ 7C7F828485848587898D8C898482868D028F028E019203940293001092939599
+ 9A9B9A97928B7B5E3A20161402150009181A1E2326282B2E3200023600093431
+ 2D292623211E1D00051C021D031E011F03200221022202230324022503260227
+ 03280129022A032B022C022D032E032F03300431043206330534063503360337
+ 03380239033A013B023C023D033E023F03400441000002F502F402F303F202F1
+ 03F002EF03EE01ED03EC02EB01EA01E902E802E70029E6E5E4E3E2E1E0DFDDDC
+ DAD7D5D2CFCCC9C5C2BDB9B4AFA9A49E98928B857E78716B655F595761748200
+ 0286000C827D787473787E7F80848B9002920007918E88807975740002750003
+ 73717200027301720174027602750005787C7F82850003860017858483848587
+ 88898B8C8D8F929699948A807C7B7D8083000284000B838486888B8C89858488
+ 8D00038E019002930194029500049496989C039F000A9D9A958C7857341E1614
+ 0215011602170006191A1B1C1E1F03210120011F021E051D021E021F02200221
+ 02220323012402250326022702280329022A022B022C032D022E032F02300331
+ 023203330434033503360A3706380439043A023B033C023D023E033F02400541
+ 0442000002F503F402F303F202F102F003EF02EE01ED04EC02EB01EA01E902E8
+ 02E70028E6E5E4E3E2E1E0DEDDDBD8D6D3D1CECBC7C3BFBAB6B1ACA6A09A948E
+ 88817B746E68625C585D6D7E0286000C837E797573777D7F8082898F0392000B
+ 908D878079747372706F710003720003737475000272000574777B7E81000282
+ 0181038001810183028401850286000987898C90959690888100027E01810183
+ 02840005838485888C00028E00048B8A8D9002920016939493909195999B9EA0
+ A2A3A2A19E9B94876C492C1C021702180319021A021B021C011D041E031F0220
+ 022102220223022403250226022702280129032A022B022C022D032E022F0230
+ 033102320333023403350336033703380539093A083B053C033D043E033F0240
+ 044104420643000003F502F403F302F203F102F002EF03EE03ED02EC01EB02EA
+ 01E902E802E70030E6E5E4E3E1E0DFDDDCD9D7D5D2CFCCC8C5C1BCB8B3AEA8A3
+ 9D97918A847E77716A655F595A67798486847F7B7776787C0280000481878E92
+ 02930007918F8B857D757100036F01700371000B72737472717275787A7B7C00
+ 037B00037D7F800002810180027F000E80828587898F95948E857F7E81820284
+ 000B838485898E92949392949500049600069492959CA1A303A502A4000AA29F
+ 9A8E795939251C1A021B021C021D021E021F0420022102220223022403250126
+ 022702280329022A022B022C012D032E022F0230023103320233033402350336
+ 033702380339043A043B033C063D0D3E063F05400341054205430744000001F6
+ 02F503F403F303F202F102F002EF03EE02ED02EC02EB01EA01E902E802E7002D
+ E6E5E4E3E2E1DFDEDCDAD8D6D3D0CDCAC7C3BEBAB5B1ABA5A09A938D87817A74
+ 6D68625B5A6275828685817E7A00027900077C7F8081858C9100029300089291
+ 8D88807872700272017301720271017201730374017501770279017803770003
+ 787B7E000280017F017D027B00037C7F8200028400098991948F86807E808200
+ 0384000685878A8E9395039602970198019A029C00049DA0A4A702A8000CA7A6
+ A5A4A29C917D62432D21021E021F032002210222032302240225022603270228
+ 0229022A022B022C022D022E022F023002310232023303340235023602370338
+ 0239033A033B023C033D043E043F0640104108420543074409450244000002F6
+ 03F502F402F303F203F102F002EF03EE02ED02EC02EB01EA01E903E80028E7E6
+ E5E4E3E1E0DFDDDBD9D7D5D2CFCBC8C4C0BCB7B3ADA8A29C96908A847D77706A
+ 645E5B60707F0286000783807D7B7A7B7E0002810011848A90939493918F8A83
+ 7A74727475767500027301740175027601770179037A01770375000376787C00
+ 027E017D017C027B00037C7E810002820006868F94918A850282000383858600
+ 02870010898C8F91939496989A9D9FA2A4A6A7A804AA000DA9A7A5A19B8F7D63
+ 47312622210002220223022402250226032702280229022A022B022C022D022E
+ 022F0230023102320233023402350236033702380239023A033B033C033D033E
+ 033F034003410342074319440A450B460345000002F603F503F402F302F203F1
+ 03F002EF02EE02ED03EC02EB01EA01E902E80029E7E6E5E4E3E2E1E0DEDCDAD8
+ D6D3D0CDCAC6C2BEB9B5B0AAA59F99938D87807A746D67615D5F6A7982000284
+ 0003817E7C00027B017E0281000483878E930295000B93908B837A7573757778
+ 77000275017603770008787A7C7B7977757402750176017A067C000F7D7F8283
+ 8489919695918B8684858800038B000E8E919395979A9EA0A2A5A7A8AAAB03AC
+ 02AB000BAAA9A69F9485735E4734290003250226022702280229022A032B022C
+ 022D022E022F0230023102320233023402350236023702380239023A033B023C
+ 023D023E033F03400341034203430444034507462547044807470346000001F7
+ 02F603F502F403F301F204F102F003EF02EE02ED03EC01EB02EA01E902E80031
+ E7E6E5E4E3E1E0DFDDDBD9D7D4D1CECBC8C4C0BBB7B2ADA7A29C96908A837D77
+ 716B65605F636E777D80817F7D7B7C7E820002830003858C9200029600059592
+ 8C827900027401760377000476787A7B037A00077B7C7B797675760002770178
+ 017C027E00037D7F800002810006838688898E95029A001497918B888A8E9293
+ 94979A9D9FA1A3A6A8A9AAAB02AC02AD000EAEADACABA8A49B8B76604E3F332C
+ 02280229022A022B022C022D022E022F02300231023202330234023502360237
+ 02380239023A023B033C023D023E023F02400341024203430344034503460347
+ 054805491B4A134906480347000001F703F602F503F403F302F203F102F002EF
+ 03EE02ED02EC02EB01EA01E903E8002AE7E5E4E3E2E1E0DEDDDBD8D6D3D0CDC9
+ C6C2BDB9B4AFAAA49E99938D87817B746E6863605E61676E757A037B00037C7E
+ 82000384000B8A91969796948F847B767700027902780003797B7E0002800003
+ 7F7D7C00027D017C027B017C027D00037E808200028401860188028900178B8D
+ 8F91959A9D9E9C98949294989B9D9EA1A4A6A7A8A90002AB01AC04AD03AE000C
+ ADAAA49C907E67503F36302D032C012D012E032F023001310232023303340235
+ 0236023702380239023A023B023C023D023E023F024002410342024302440345
+ 0346044702480349044A054B044C074D084E084D074C104B044A054903480000
+ 02F703F602F502F403F303F202F103F002EF02EE02ED03EC02EB01EA01E902E8
+ 0025E7E6E5E4E3E2E1DFDEDCD9D7D4D1CECBC7C4BFBBB6B2ACA7A19C96908A84
+ 7E78726C67625D00025A000F5D63696E72777A7D818485848990950002980008
+ 97928B837F808180027E00037F818500038701850283018403850486000F8789
+ 8B8C8E909192939496979A9DA00002A1019F029D00079EA0A2A4A5A7A90002AA
+ 02AB02AC01AD03AE000DADAEADABA69C8E7D6B5645393200032F023002310132
+ 0233013402350236023703380239023A023B023C023D023E023F024002410242
+ 0343024402450346024702480349034A044B024C034D054E054F075007510850
+ 0B4F034E074D074C034B044A0449000001F802F703F602F503F403F302F202F1
+ 03F002EF02EE02ED03EC02EB01EA01E902E80026E7E6E5E4E2E1E0DFDDDAD8D6
+ D3D0CDC9C5C1BDB8B4AFAAA49F99948D88827C76706B65605B5702550008575B
+ 626A72787E8302860009898F95999A9997938E00028C00088B89878687898B8C
+ 038B00048A8B8D8E068F019001910293019502960197029900069A9C9D9FA1A2
+ 05A30006A4A5A6A8A9AA02AB02AC03AD000FAEADACAAA8A39B8F7D6855473D36
+ 330002320133023401350236013702380239023A023B023C023D023E023F0240
+ 024102420243024404450246024702480349024A034B024C034D034E044F0450
+ 03510752085302540A53075207510350044F054E064D024C044B044A000001F8
+ 03F702F603F502F403F302F203F102F003EF02EE02ED02EC02EB01EA02E90029
+ E8E7E6E5E4E3E2E1DFDEDBD9D7D4D1CECBC7C3BFBBB6B2ADA7A29D97918B8580
+ 7A756F6A645F5A5652000250000C5259636C757E8587898F9599029B00149A98
+ 979594908B8887888A8B898887898A8D9093069401950196029702980199019A
+ 029B00069C9D9FA0A1A203A403A50004A6A7A9AA03AB01AD02AC000FABAAA8A5
+ A09992877A6A58483D38360002350003363738000239013A023B023C013D023E
+ 023F0240024102420343024402450246034702480249024A024B034C024D024E
+ 044F025002510452055304540655055609570756045508540553035202510550
+ 034F054E024D034C024B034A000002F802F703F603F502F403F303F202F102F0
+ 03EF01EE03ED02EC02EB01EA02E90036E8E7E6E5E4E2E1E0DFDDDAD8D6D3D0CD
+ C9C5C1BDB9B4AFAAA5A09B958F89847F79746E69645F5A56514E4D4E535A6370
+ 7D84888E9599039C029B00049A97928B02870189028B018902860005888B8F92
+ 95000696029702980199039A029C00049D9E9FA002A20003A3A4A50004A601A7
+ 02A802A90012A8A7A5A39F9A948C82766B60554B423C3938023900043A3B3C3D
+ 023E013F0240014102420243024402450246034702480249024A024B034C024D
+ 034E024F0350035102520353035402550456075704580959025A0359035A0459
+ 075806570256045503540353035203510450044F024E024D034C034B000002F8
+ 03F703F603F502F403F302F202F103F002EF02EE02ED02EC03EB01EA01E902E8
+ 0029E7E6E5E3E2E1DFDEDCD9D7D4D1CECBC7C4BFBBB7B2ADA8A39E98938D8883
+ 7D78736E69645F5B56524F00024C000A4D525C6B767F88939A9D029E029D0004
+ 9C9B9792029000049293949202900004919395970498039702980299049A019B
+ 029C019D019E039F01A102A203A30014A2A09F9E9C9996928D87807870665C53
+ 4B45413E033C013D013E023F0003404142000243014402450146024702480249
+ 024A024B034C024D024E024F0350025102520353035402550356025705580259
+ 055A075B0B5C015D015C025D095C055B045A0559025804570256035502540553
+ 025203510250024F034E024D024C024B000004F802F703F602F503F402F303F2
+ 02F103F002EF02EE03ED02EC01EB01EA02E9002CE8E7E6E5E4E3E1E0DFDDDBD8
+ D5D2D0CDC9C6C2BDB9B5B0ABA6A19C97918C87827D78736E6965605C5854504D
+ 024B00084F57606A7889979E02A0039E019D019B0499029A0199019807970296
+ 05940195029601970196029502940395019406930013928F8B87827D77716B65
+ 5F59544E494541403F00023E00083F40414243444546024701480249024A014B
+ 014C034D024E014F0250045102520253035403550256035703580359035A025B
+ 055C025D085E0F5F0160095F045E065D025C045B025A03590358025703560255
+ 04540253035202510250034F024E014D034C000004F802F703F603F502F403F3
+ 03F202F102F002EF03EE02ED02EC01EB02EA02E9003BE8E7E6E5E3E2E1E0DEDC
+ D9D7D4D1CECBC8C4C0BCB7B3AEAAA5A09B95908B86817D78736E6A65615D5956
+ 53504D4C4D505662768B999F9E9C9A999700029602950294000D9392918F8D8C
+ 8B8A898887868400028302820008838586878482807D037C00047A7774720271
+ 001072716F6B66615C57524E4B48464443410340014102420143024501470248
+ 0004494A4B4C024D014E024F0150025102520253015403550356035703580459
+ 025A025B035C035D035E055F05600661176206610460055F025E025D035C025B
+ 045A0259025803570356035501540253035202510250014F024E034D014C0000
+ 01F903F803F703F603F502F403F302F202F103F002EF03EE02ED02EC01EB01EA
+ 02E9002FE8E7E6E5E4E3E2E1DFDDDAD8D5D3D0CDCAC6C2BEBAB6B1ADA8A39E9A
+ 95908B86817D7874706B67635F5C595653504E00024D00045360758702900019
+ 8C88858281807F7D7B79787674716E6C6B696766656462616000025F00096063
+ 656663605D5958000257000655524F4D4C4D024E00074D4B4846444241000540
+ 000F4142434445464748494A4B4C4D4E4F000250015101520253015402550156
+ 025702580259035A035B035C035D045E035F0360046103620563066418650664
+ 0463046203610360025F035E025D035C035B025A025902580357035601550254
+ 0353025201510250024F034E014D000002F903F803F702F603F503F403F301F2
+ 04F102F002EF03EE02ED02EC01EB01EA02E901E802E60031E5E3E2E1DFDEDCD9
+ D7D5D2CECCC8C4C1BDB9B4B0ACA7A29E9994908B86827E7975706D6965625F5C
+ 595654514F50545F6B00027300166E686461605E5C5B59575553514F4D4C4A48
+ 47464544024301420141024200074445464543424000043F013E023D00033C3D
+ 3E00063F024000164142434445464748494A4B4C4D4E4F505152535455560257
+ 02580159025A015B025C025D035E045F02600461046203630464046504660967
+ 106809670666046503640363036202610260035F025E025D045C025B025A0259
+ 025803570156025502540153025202510350024F024E000003F903F803F703F6
+ 02F503F402F302F203F103F002EF02EE02ED03EC0004EBEAE9E802E7002DE6E4
+ E3E2E0DFDDDBD8D6D3D0CDCAC7C3BFBCB8B4AFABA6A29D9995908B87837F7B76
+ 736F6B6865625F5C5A5855000253001655595B5A5753514E4D4C4A4948464544
+ 4241403F3E3D023C013B033A0539013A013B063A033B033C00063D3E3F404142
+ 02430145024601480149024A000E4B4D4E4F50515253545556575859025A015B
+ 015C025D015E025F0260026102620363046402650466046704680769086A136B
+ 096A0469036805670266036503640163036203610260035F025E025D025C025B
+ 025A0259035801570256015502540253025202510250034F000001FA03F902F8
+ 04F702F603F502F403F302F203F102F002EF03EE02ED02EC01EB02EA0043E9E8
+ E7E6E5E3E2E1E0DEDCD9D7D5D2CFCCC9C6C2BFBBB7B3AFAAA6A19D9994908C88
+ 84807C7975716E6B686663615E5C5A585756555352504E4D4B4A494847464544
+ 4300024201410240023F013E033D083C033D023E023F02400004414243440245
+ 01470148024900104A4B4C4D4E4F5051535455565758595A025B00045C5D5E5F
+ 0260016102620163026402650266026703680469056A056B076C086D126E066D
+ 076C046B046A0369036802670366036502640263026203610260025F025E025D
+ 025C025B025A0159025802570256015503540253025201510250024F000001FA
+ 04F902F803F703F603F502F403F303F202F102F003EF02EE02ED01EC01EB02EA
+ 02E90041E8E7E6E4E3E2E1DFDDDBD9D6D4D1CECBC8C5C1BEBAB6B2AEAAA5A29E
+ 9995918E8A86827F7B7875726F6C6A676563615F5D5B59585655535251504F4E
+ 4D4C4B4A49000248014702460245014403430A42014302440245024600034748
+ 4900024A00124B4C4D4E4F505152535455565758595A5B5D025E00065F606162
+ 636402650166026701680269026A036B046C046D036E086F09700E7100037071
+ 700002710770056F056E046D036C036B046A0269036803670166036502640263
+ 026202610260025F025E025D015C025B025A0259015802570256025502540253
+ 015202510250014F000002FA03F904F801F704F603F502F402F303F202F103F0
+ 02EF02EE02ED02EC01EB02EA0045E9E8E7E6E5E3E2E1E0DEDCDAD8D5D3D0CDCB
+ C7C4C1BDBAB6B2AEAAA6A29E9B97938F8B8885817E7B787673706E6C6A686664
+ 62605F5D5C5A595857565554535251504F4E4D00024C024B014A03490A480149
+ 024A024B024C00034D4E4F00025000165152535455565758595A5B5C5D5E5F60
+ 6162636465660267000368696A00026B026C026D026E026F0370037106720973
+ 14740B73067203710570036F036E036D036C026B036A02690368026702660265
+ 02640263026202610260025F015E025D025C015B025A02590258025702560155
+ 02540253015202510250000003FA03F903F803F702F603F503F402F303F202F1
+ 03F001EF03EE03ED01EC01EB02EA0041E9E8E7E6E4E3E2E1DFDDDBD9D7D5D2CF
+ CDCAC7C4C0BDBAB6B2AEABA7A3A09C9995918E8B8784817F7C79777573716F6D
+ 6B696765646361605F5E5D5C5B5958575600025500035453520002510250024F
+ 094E034F0250015102520003535455000256000E5758595A5B5C5D5E5F606162
+ 63640265016601680269016A016B026C00036D6E6F0002700271027202730374
+ 047506761D770776077503740373047203710370036F036E026D046C026B016A
+ 0269036802670266026502640163026202610160025F035E015D025C025B025A
+ 0159025802570156025502540153025202510150000004FA03F903F802F703F6
+ 03F503F402F302F203F102F003EF02EE02ED01EC01EB02EA0041E9E8E7E6E5E4
+ E3E2E0DFDDDBD8D6D4D2CFCCCAC6C3C0BDB9B6B2AFACA8A5A19E9B9794918D8B
+ 888583807E7B7977767472706E6C6B6A68676665646362605F5E5D00025C0004
+ 5B5A595802570256065502540555025601570158025900035A5B5C00025D000A
+ 5E5F606162636465666702680006696A6B6C6D6E026F01700271000372737400
+ 02750276027703780679077A087B0F7A08790678047703760475037403730272
+ 03710370026F036E036D026C016B026A03690268026701660265026402630262
+ 01610260025F025E025D015C025B025A02590158025701560255015402530252
+ 0251000005FA02F903F803F703F602F503F403F302F203F102F002EF03EE02ED
+ 01EC01EB02EA0040E9E8E7E6E5E4E3E1E0DEDCDAD8D6D4D1CECCC9C6C3C0BDBA
+ B6B3B0ADAAA6A3A09D999693918E8B89868482807E7C7A7877757372716F6E6D
+ 6C6B6A6867666564026300046261605F025E025D025C045B015A055B025C025D
+ 015E025F000360616200026300096465666768696A6B6C00026D016E016F0270
+ 00057172737475000276027701780279017A047B037C067D0F7E0B7D087C057B
+ 037A0579047803770376037502740273037202710370026F036E026D016C026B
+ 026A0269036801670266026502640263016202610260015F025E025D015C025B
+ 015A025902580257015601550254025301520251000006FA02F903F803F703F6
+ 02F503F402F303F202F103F001EF03EE02ED01EC02EB02EA0043E9E8E7E5E4E3
+ E2E1DFDDDBDAD7D5D3D1CECCC9C6C4C0BEBAB7B4B2AFABA8A5A29F9C99979492
+ 908D8B89878583817F7E7C7A79777675747271706F6E6D6C6B6A696867000266
+ 0165026401630562026106620263026401650166026701680169026A00036B6C
+ 6D00026E00046F70717202730003747576000277000378797A00027B027C027D
+ 027E037F0480088103820A810A80047F057E057D037C037B047A037903780377
+ 0276027503740273037202710270026F026E026D026C026B026A036901680267
+ 0166026502640263016202610160025F025E015D025C025B025A015901580257
+ 025601550254025301520151000002FB04FA03F903F803F702F603F502F403F3
+ 02F203F103F002EF01EE03ED01EC01EB02EA003DE9E8E7E6E5E4E3E2E1DFDDDB
+ D9D7D5D3D0CECCC9C7C4C1BEBBB9B6B3B0ADAAA8A5A29F9D9A989693918F8D8B
+ 8A8886848281807E7D7C7A797877767574000272000571706F6E6D00026C016B
+ 026A036909680269026A026B016C026D016E026F017002710005727374757600
+ 02770178027900037A7B7C00027D027E017F028001810382038305840C850984
+ 0683048204810580047F037E037D037C037B037A027904780277027602750274
+ 0373027202710270026F026E016D036C026B016A026902680267026601650264
+ 0163026202610160025F025E015D025C015B025A025902580157015602550154
+ 02530252000001FC03FB02FA04F903F802F703F603F503F402F303F202F103F0
+ 02EF02EE02ED01EC01EB02EA003EE9E8E7E6E5E4E3E2E0DEDDDBD9D7D5D3D1CE
+ CCCAC7C5C2BFBDBAB8B5B2AFADAAA8A5A3A09E9C9997969492908E8D8B898886
+ 85848281807F7E7D7C7B797802770003767574000273017202710270036F026E
+ 076F0270027101720273017402750176027701780179027A017B017C027D027E
+ 017F018002810182028302840285038603871188068706860485038404830482
+ 04810380027F037E037D037C037B037A03790178037701760275037402730272
+ 01710370026F016E026D026C026B026A01690268016702660265026401630262
+ 01610260015F025E025D015C025B025A01590258025701560255015402530152
+ 000001FC03FB03FA03F903F803F703F603F502F403F302F202F103F002EF02EE
+ 02ED01EC02EB01EA01E902E8003FE7E6E5E3E2E1E0DEDDDBD9D7D5D3D1CFCDCB
+ C8C5C3C1BEBCB9B7B4B2AFADABA8A6A4A2A09E9C9A9897959392908E8D8B8A89
+ 88878584838281807F7E7D7C7B00027A01790278027703760875037602770378
+ 0179027A017B027C017D027E017F028001810282028301840185028601870288
+ 0389048A038B0A8C078B048A0589048803870386048503840383028203810280
+ 037F037E037D047C017B037A0279027802770276027502740273027202710270
+ 026F016E026D026C026B016A0269026802670166016502640263026201610260
+ 015F025E025D015C025B025A0159025801570256015502540253000002FC03FB
+ 03FA03F903F803F703F603F502F403F302F202F103F002EF02EE01ED02EC02EB
+ 01EA01E902E80039E7E6E4E3E2E1E0DEDCDBD9D7D5D4D2CFCDCBC9C7C5C2C0BE
+ BCB9B7B5B3B0AEABAAA8A6A4A2A09E9D9B9A989795949291908F8E8C8B8A8988
+ 870002850004848382810280017F027E027D047C067B037C027D037E027F0280
+ 018102820283018402850186028702880189028A028B028C038D048E0D8F068E
+ 038D038C048B048A0389038803870386038503840283028202810280037F037E
+ 037D027C037B027A0279017803770276017502740273027202710270016F026E
+ 026D026C016B026A0269016802670266026501640263016202610160025F025E
+ 015D025C025B015A0259025801570156025502540153000002FC04FB03FA03F9
+ 02F804F703F602F503F402F303F201F103F003EF02EE01ED02EC02EB003EEAE9
+ E8E7E6E5E4E3E2E1DFDEDCDBD9D7D6D4D2D0CECCCAC8C6C4C1BFBDBBB9B7B5B3
+ B1AFADABAAA8A6A4A3A1A09E9D9B9A99979695949391908F8E8D8C8B028A0004
+ 898887860285028402830582048103820283038402850286028703880189028A
+ 018B028C028D038E028F029005910D9206910390038F028E048D048C038B028A
+ 0289048801870386038502840283028202810380037F027E037D027C027B027A
+ 0279027802770276027502740173027202710270016F026E026D026C016B026A
+ 0269016802670266016502640263016202610260015F025E015D025C025B015A
+ 015902580257015602550254000004FC03FB02FA03F903F804F702F603F502F4
+ 03F303F202F103F001EF03EE01ED01EC03EB003DEAE9E8E7E6E5E4E3E2E1E0DE
+ DDDBD9D8D6D5D3D1CFCDCBC9C7C5C3C1BFBEBCB9B7B6B4B3B1AFADACAAA9A7A6
+ A4A3A1A09F9D9C9B9A999896959493929100029000048F8E8D8C028B028A0289
+ 0588048705880389028A028B028C038D028E018F029003910392039303940295
+ 0194089508940393039203910290048F038E038D028C028B038A038902880187
+ 0386028502840283028203810280037F027E037D027C017B037A027901780277
+ 0276027502740173027202710170026F026E026D016C026B026A016902680267
+ 0266016502640163026201610260025F015E025D015C025B025A025901580157
+ 025602550154000001FD03FC03FB03FA03F902F804F703F603F502F403F303F2
+ 02F102F001EF03EE01ED02EC02EB01EA01E902E80039E7E6E5E4E3E2E1E0DEDD
+ DBDAD8D7D5D4D2D0CECCCBC9C7C6C4C2C0BEBCBBB9B8B6B5B3B1AFAEACABAAA9
+ A7A6A5A3A2A1A09F9E9C9B9A999897000296000395949300029201910290028F
+ 058E068D048E038F029003910392029303940395039604970B98079703960395
+ 03940393029203910290038F038E028D028C028B038A02890188038702860285
+ 02840283028202810280037F027E037D027C027B017A03790278017702760275
+ 01740273027201710270026F026E026D016C026B016A02690268026701660265
+ 01640263026202610160015F025E025D025C015B015A02590258015701560355
+ 000001FD03FC03FB04FA03F903F803F703F603F502F403F302F202F102F003EF
+ 02EE01ED01EC03EB0005EAE9E8E7E60002E50037E4E3E2E1E0DFDDDCDAD9D7D6
+ D5D3D1CFCECCCBC9C7C6C4C2C0BFBDBCBAB9B8B6B4B3B2B0AFAEACABAAA9A8A7
+ A6A5A3A2A1A09F9E9D9C9B00029A019902980197029602950494039302920693
+ 039403950396049703980399079A059B019A029B089A02990398039703960395
+ 02940293039202910290028F028E028D028C038B028A01890388018703860185
+ 02840283038202810280027F037E027D027C027B027A01790278027702760275
+ 01740273017202710270026F026E016D026C026B016A02690168026702660165
+ 02640263016202610260015F025E015D025C025B015A02590158025701560255
+ 000001FD03FC05FB03FA03F902F804F703F602F503F402F303F202F102F003EF
+ 02EE01ED01EC03EB0004EAE9E8E702E60031E5E4E3E2E1E0DFDEDCDBD9D8D7D5
+ D4D2D1CFCECCCBC9C8C6C5C3C1C0BFBDBCBBB9B8B7B5B4B3B2B1AFAEADACABAA
+ A9A8A70002A50006A4A3A2A1A09F029E019D029C029B029A03990B980599039A
+ 069B049C0A9D039E049D079C029B039A02990298039702960395029402930292
+ 02910290028F028E028D028C028B028A02890288028702860285028402830282
+ 02810280027F037E027D017C027B027A02790178027702760275027402730172
+ 02710170026F026E026D026C016B026A02690168026701660265026401630262
+ 02610160025F025E025D015C015B025A0259015802570256000002FD04FC03FB
+ 03FA03F903F803F703F604F501F403F303F202F102F003EF02EE01ED01EC02EB
+ 02EA0003E9E8E70002E60030E5E4E3E2E1E0DFDEDDDCDAD9D7D6D4D3D2D0CFCE
+ CCCBC9C8C6C5C4C2C1C0BFBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADAC02AA0004
+ A9A8A7A602A501A402A301A201A102A0039F039E0E9D049E0A9F0DA0059F049E
+ 049D039C029B029A0299039801970296029502940293029202910290028F028E
+ 028D028C028B028A0289028801870286028501840383028202810280037F027E
+ 027D027C027B017A0279017802770276027502740173027202710270016F026E
+ 026D016C026B026A0169026802670166026502640163026202610160025F015E
+ 025D025C015B025A0159025801570256000004FD03FC02FB05FA02F903F803F7
+ 04F602F502F403F302F203F102F003EF02EE01ED01EC03EB0003EAE9E80002E7
+ 0006E6E5E4E3E2E102E0001EDFDDDCDBD9D8D7D6D4D3D2D1CFCECDCCCAC9C8C6
+ C5C4C3C2C0BFBEBDBCBA02B90004B8B7B5B402B30003B1B0AF0002AE0003ADAC
+ AB0002AA01A902A801A701A602A503A403A304A203A101A206A10EA208A305A2
+ 05A102A0059F029E029D029C039B029A02990198029702960295029402930292
+ 02910290028F028E028D018C028B028A02890288018702860285038401830282
+ 02810280027F037E017D027C027B027A01790278027702760275017402730272
+ 02710170026F026E016D026C026B026A01690268016702660265016402630262
+ 01610260015F025E025D015C025B015A025902580257000004FD04FC04FB02FA
+ 03F903F803F703F603F502F403F302F202F103F002EF03EE01ED01EC02EB02EA
+ 01E901E802E70005E6E5E4E3E20002E1002BE0DFDEDDDCDBD9D8D7D6D5D4D2D1
+ D0CFCDCCCBCAC9C8C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B20002B1
+ 01B001AF02AE01AD01AC02AB01AA02A903A804A706A61CA505A405A302A202A1
+ 03A0029F029E039D029C029B029A019902980297029602950294019302920391
+ 0190028F028E028D028C018B038A018902880287028601850284028302820281
+ 0280027F027E027D027C027B017A027902780277017602750274027302720271
+ 0170026F016E026D026C026B016A026902680167016602650264026301620261
+ 0160025F025E025D015C025B015A025901580257000005FD03FC04FB03FA02F9
+ 04F803F702F603F502F403F303F202F103F001EF03EE02ED01EC01EB03EA01E9
+ 01E802E70004E6E5E4E302E20003E1E0DF0002DE001DDDDBDAD9D8D7D6D5D4D2
+ D1D0CFCECDCCCBCAC9C8C6C5C4C3C2C1C0BFBE0002BD0007BCBBBAB9B8B7B600
+ 02B501B401B302B201B101B002AF02AE02AD02AC04AB03AA10A90BA804A705A6
+ 03A503A402A302A202A103A0029F029E029D029C019B029A0299029802970196
+ 029502940293029202910190028F028E028D028C028B028A0289018802870186
+ 038502840183028202810280027F027E027D027C027B017A0279027801770276
+ 027502740273027201710270016F026E026D026C026B016A0169026802670266
+ 016502640263016202610160025F025E015D025C015B025A02590258000006FD
+ 03FC03FB04FA02F903F803F704F602F503F402F303F202F103F001EF03EE01ED
+ 02EC02EB02EA01E902E80004E7E6E5E402E30003E2E1E00002DF0015DEDDDCDB
+ DAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBC90002C80008C7C6C5C4C3C2C1C002BF
+ 0005BEBDBCBBBA0002B901B801B702B601B501B402B302B201B102B003AF03AE
+ 05AD07AC0DAB04AA03A905A803A702A602A503A402A302A202A102A0029F029E
+ 019D029C029B019A0299029802970196029502940293029202910290028F028E
+ 018D028C028B028A0189028802870186028502840283028202810280017F027E
+ 027D027C027B027A0279017802770276027501740273027201710270026F026E
+ 026D016C026B026A0169026801670266026502640163026201610260025F015E
+ 025D025C015B025A01590258000006FD04FC03FB04FA03F902F803F703F602F5
+ 03F403F302F202F103F001EF04EE02ED01EC02EB01EA02E901E801E702E601E5
+ 02E40003E3E2E10002E00015DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCC
+ CB0002CA0007C9C8C7C6C5C4C30002C20004C1C0BFBE02BD01BC02BB01BA01B9
+ 02B801B702B602B501B402B302B203B103B004AF06AE07AD08AC04AB02AA01A9
+ 02AA02A902A802A702A603A502A402A302A201A102A0019F029E029D019C029B
+ 019A0299039801970296039501940293029201910290028F028E028D018C028B
+ 028A0189028802870286018502840283028202810280017F037E017D027C027B
+ 027A0279017802770276027502740173027202710170026F026E026D026C026B
+ 016A0269026801670266016502640263026201610260025F015E015D025C025B
+ 025A02590001}
+ PopupMenu = pmTrayIcon
+ Visible = False
+ OnMouseDown = ImageMouseDown
+ OnMouseMove = ImageMouseMove
+ OnMouseUp = ImageMouseUp
+ end
+ object lbVersion: TLabel
+ Left = 320
+ Top = 180
+ Width = 53
+ Height = 15
+ Caption = 'version'
+ Color = clBlack
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWhite
+ Font.Height = -15
+ Font.Name = '\82l\82r \82o\96¾\92©'
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Memo: TMemo
+ Left = 0
+ Top = 0
+ Width = 105
+ Height = 228
+ Align = alLeft
+ PopupMenu = pmTrayIcon
+ TabOrder = 0
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 228
+ Width = 427
+ Height = 82
+ Align = alBottom
+ TabOrder = 1
+ object edFound: TEdit
+ Left = 4
+ Top = 8
+ Width = 454
+ Height = 20
+ BorderStyle = bsNone
+ Color = clBtnFace
+ TabOrder = 0
+ end
+ object edWord: TEdit
+ Left = 4
+ Top = 28
+ Width = 454
+ Height = 20
+ BorderStyle = bsNone
+ Color = clBtnFace
+ TabOrder = 1
+ end
+ object edPrev: TEdit
+ Left = 4
+ Top = 48
+ Width = 454
+ Height = 20
+ BorderStyle = bsNone
+ Color = clBtnFace
+ TabOrder = 2
+ end
+ end
+ object btnOK: TButton
+ Left = 192
+ Top = 204
+ Width = 125
+ Height = 21
+ Caption = 'OK'
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ ModalResult = 1
+ ParentFont = False
+ TabOrder = 2
+ Visible = False
+ OnClick = btnOKClick
+ end
+ object MainMenu: TMainMenu
+ Left = 80
+ Top = 40
+ object File1: TMenuItem
+ Caption = '&File'
+ object miHook: TMenuItem
+ Caption = '&Hook'
+ ShortCut = 16456
+ OnClick = miHookClick
+ end
+ object miUnhook: TMenuItem
+ Caption = '&Unhook'
+ Enabled = False
+ ShortCut = 16469
+ OnClick = miUnhookClick
+ end
+ object N2: TMenuItem
+ Caption = '-'
+ end
+ object miConfig: TMenuItem
+ Caption = '&Config'
+ OnClick = miConfigClick
+ end
+ object N6: TMenuItem
+ Caption = '-'
+ end
+ object miDdeTest: TMenuItem
+ Caption = '&Dde Test'
+ OnClick = miDdeTestClick
+ end
+ object miTest: TMenuItem
+ Caption = 'T&est'
+ OnClick = miTestClick
+ end
+ object N1: TMenuItem
+ Caption = '-'
+ end
+ object miExit: TMenuItem
+ Caption = 'E&xit'
+ OnClick = miExitClick
+ end
+ end
+ end
+ object pmTrayIcon: TPopupMenu
+ AutoHotkeys = maManual
+ AutoPopup = False
+ OnPopup = pmTrayIconPopup
+ Left = 144
+ Top = 88
+ object miInstallMODI: TMenuItem
+ Caption = 'MODI\82Ì\83C\83\93\83X\83g\81[\83\8b....'
+ Visible = False
+ end
+ object miGroup: TMenuItem
+ Caption = '\8e«\8f\91\83O\83\8b\81[\83v(&G)'
+ end
+ object miClickOnly: TMenuItem
+ Caption = '\89E\83N\83\8a\83b\83N\8c\9f\8dõ(&N)'
+ OnClick = miClickOnlyClick
+ end
+ object miIncSearch: TMenuItem
+ Caption = '\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`(&I)'
+ Visible = False
+ OnClick = miIncSearchClick
+ end
+ object miEnablePopup: TMenuItem
+ Caption = '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\97L\8cø(&E)'
+ OnClick = miEnablePopupClick
+ end
+ object miOCRText: TMenuItem
+ Caption = '\94F\8e¯\83e\83L\83X\83g\82Ì\95\\8e¦(&T)'
+ Visible = False
+ OnClick = miOCRTextClick
+ end
+ object N4: TMenuItem
+ Caption = '-'
+ end
+ object miOption: TMenuItem
+ Caption = '\90Ý\92è(&O)...'
+ OnClick = miOptionClick
+ end
+ object miReadMe: TMenuItem
+ Caption = '\90à\96¾\8f\91\82ð\95\\8e¦(&M)'
+ OnClick = miReadMeClick
+ end
+ object miAbout: TMenuItem
+ Caption = '\83o\81[\83W\83\87\83\93(&V)...'
+ OnClick = miAboutClick
+ end
+ object miCheckLatest: TMenuItem
+ Caption = '\8dÅ\90V\94Å\82Ì\8am\94F'
+ OnClick = miCheckLatestClick
+ end
+ object N5: TMenuItem
+ Caption = '-'
+ end
+ object miClose: TMenuItem
+ Caption = '\83\81\83j\83\85\81[\82ð\95Â\82¶\82é(&C)'
+ OnClick = miCloseClick
+ end
+ object miReload: TMenuItem
+ Caption = 'DokoPop!\82Ì\8dÄ\8bN\93®(&R)'
+ OnClick = miReloadClick
+ end
+ object miExit2: TMenuItem
+ Caption = 'DokoPop!\82Ì\8fI\97¹(&X)'
+ OnClick = miExitClick
+ end
+ end
+ object BootTimer: TTimer
+ Enabled = False
+ Interval = 1500
+ OnTimer = BootTimerTimer
+ Left = 128
+ Top = 144
+ end
+ object TestTimer: TTimer
+ Enabled = False
+ Interval = 100
+ OnTimer = TestTimerTimer
+ Left = 208
+ Top = 161
+ end
+ object tmMenuClose: TTimer
+ Enabled = False
+ Interval = 10
+ OnTimer = tmMenuCloseTimer
+ Left = 40
+ Top = 168
+ end
+ object tmNotify: TTimer
+ Enabled = False
+ OnTimer = tmNotifyTimer
+ Left = 40
+ Top = 273
+ end
+ object tmPopup: TTimer
+ Enabled = False
+ Interval = 100
+ OnTimer = tmPopupTimer
+ Left = 96
+ Top = 273
+ end
+ object tmMouseMove: TTimer
+ Enabled = False
+ Interval = 100
+ OnTimer = tmMouseMoveTimer
+ Left = 144
+ Top = 273
+ end
+ object tmMODIInstallCheck: TTimer
+ Enabled = False
+ Interval = 3000
+ OnTimer = tmMODIInstallCheckTimer
+ Left = 192
+ Top = 276
+ end
+ object tmMODINotify: TTimer
+ Enabled = False
+ OnTimer = tmMODINotifyTimer
+ Left = 232
+ Top = 273
+ end
+end
--- /dev/null
+//---------------------------------------------------------------------------
+#ifndef DCHookMainH
+#define DCHookMainH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Menus.hpp>
+#include "../DCHook/DCHook.h"
+#include <ExtCtrls.hpp>
+#include <DdeMan.hpp>
+#include <Graphics.hpp>
+//---------------------------------------------------------------------------
+#include "Util.h"
+#include "StringLib.h"
+
+#define WM_POPUP (WM_APP+0x200)
+#define WM_NOTIFYICON (WM_APP+0x201)
+#define WM_TOGGLE (WM_APP+0x202)
+#define UM_SHORTCUT (WM_APP+33)
+#define WM_MOVESEND (WM_APP+0x208) // DCH_MOVESEND\82Ì\91ã\82í\82è\82ÉPostMessage\82Å\91\97\82é
+
+class TDCHookMainForm : public TForm
+{
+typedef TForm super;
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TMainMenu *MainMenu;
+ TMenuItem *File1;
+ TMenuItem *miExit;
+ TMenuItem *miHook;
+ TMenuItem *miUnhook;
+ TMenuItem *N1;
+ TMenuItem *miTest;
+ TMemo *Memo;
+ TSplitter *Splitter1;
+ TPaintBox *PaintBox;
+ TPanel *Panel1;
+ TMenuItem *miDdeTest;
+ TEdit *edFound;
+ TEdit *edWord;
+ TEdit *edPrev;
+ TPopupMenu *pmTrayIcon;
+ TMenuItem *miExit2;
+ TMenuItem *miAbout;
+ TMenuItem *N5;
+ TMenuItem *N6;
+ TMenuItem *miOption;
+ TMenuItem *miGroup;
+ TMenuItem *N4;
+ TMenuItem *miEnablePopup;
+ TTimer *BootTimer;
+ TImage *Image;
+ TTimer *TestTimer;
+ TButton *btnOK;
+ TLabel *lbVersion;
+ TMenuItem *miClickOnly;
+ TMenuItem *miReload;
+ TMenuItem *miClose;
+ TTimer *tmMenuClose;
+ TTimer *tmNotify;
+ TTimer *tmPopup;
+ TMenuItem *miReadMe;
+ TMenuItem *miIncSearch;
+ TTimer *tmMouseMove;
+ TMenuItem *N2;
+ TMenuItem *miConfig;
+ TMenuItem *miInstallMODI;
+ TTimer *tmMODIInstallCheck;
+ TTimer *tmMODINotify;
+ TMenuItem *miCheckLatest;
+ TMenuItem *miOCRText;
+ void __fastcall miHookClick(TObject *Sender);
+ void __fastcall miUnhookClick(TObject *Sender);
+ void __fastcall miExitClick(TObject *Sender);
+ void __fastcall miTestClick(TObject *Sender);
+ void __fastcall miDdeTestClick(TObject *Sender);
+ void __fastcall FormCreate(TObject *Sender);
+ void __fastcall miAboutClick(TObject *Sender);
+ void __fastcall miOptionClick(TObject *Sender);
+ void __fastcall pmTrayIconPopup(TObject *Sender);
+ void __fastcall miEnablePopupClick(TObject *Sender);
+ void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+ void __fastcall BootTimerTimer(TObject *Sender);
+ void __fastcall ImageMouseUp(TObject *Sender, TMouseButton Button,
+ TShiftState Shift, int X, int Y);
+ void __fastcall FormKeyPress(TObject *Sender, char &Key);
+ void __fastcall TestTimerTimer(TObject *Sender);
+ void __fastcall btnOKClick(TObject *Sender);
+ void __fastcall ImageMouseDown(TObject *Sender, TMouseButton Button,
+ TShiftState Shift, int X, int Y);
+ void __fastcall ImageMouseMove(TObject *Sender, TShiftState Shift, int X,
+ int Y);
+ void __fastcall miClickOnlyClick(TObject *Sender);
+ void __fastcall miReloadClick(TObject *Sender);
+ void __fastcall miCloseClick(TObject *Sender);
+ void __fastcall tmMenuCloseTimer(TObject *Sender);
+ void __fastcall tmNotifyTimer(TObject *Sender);
+ void __fastcall tmPopupTimer(TObject *Sender);
+ void __fastcall miReadMeClick(TObject *Sender);
+ void __fastcall miIncSearchClick(TObject *Sender);
+ void __fastcall tmMouseMoveTimer(TObject *Sender);
+ void __fastcall miConfigClick(TObject *Sender);
+ void __fastcall tmMODIInstallCheckTimer(TObject *Sender);
+ void __fastcall tmMODINotifyTimer(TObject *Sender);
+ void __fastcall miCheckLatestClick(TObject *Sender);
+ void __fastcall miOCRTextClick(TObject *Sender);
+private: // \83\86\81[\83U\81[\90é\8c¾
+ //void __fastcall IdleHandler(TObject *sender, bool &done);
+
+ bool BootUp;
+ bool Capturing;
+ POINT CapPoint;
+ class TDCHookLoader *hDll;
+
+ int SavedWidth;
+
+ // Popup Configuration //
+ bool GroupOpen;
+ AnsiString GroupName;
+ bool CtrlClose;
+ bool IgnoreJ;
+ bool Banner;
+ int CaptureMode; // 0:conventional 1:use AMODI
+ bool AMODIAvail; // AMODI available or not
+ AnsiString AMODIPath;
+ bool MouseIncSrch;
+public: // \83\86\81[\83U\81[\90é\8c¾
+ __fastcall TDCHookMainForm(TComponent* Owner);
+ void EvCopyData(TMessage&);
+ void InitAMODI();
+ void Start();
+ void MenuClosed();
+ void ShowNotify();
+ void EvToggle( TMessage & );
+ void EvShortcut( TMessage & );
+ void EvGetVersion( TMessage & );
+
+ // Hooking //
+ bool Hook();
+ void Unhook();
+
+ // Popup Control //
+ POINT CursorPoint;
+ void SetupConfig();
+ void SetupConfig2();
+ void SetupAMODI();
+ bool EnablePopup;
+ bool DoPopup( const tchar *text, const tchar *prevtext, bool movesend );
+ tchar *PopupText;
+ int PopupLoc;
+ bool PopupMoveSend;
+ void EvPopup(TMessage &);
+ int DoPopupRetry;
+ void EvMoveSend(TMessage &);
+ void EvMoveSend(bool enable);
+
+ // Tray Icon Control //
+ void RegisterTrayIcon( bool flag );
+ void EvNotifyIcon( TMessage & );
+ void SaveConfig();
+ void EnableClickOnly( bool enable );
+ void DokoPopMenu( bool all );
+
+ // PDIC Control //
+ void __fastcall miDicGroup(TObject *Sender);
+ void OpenDicGroup( const char *name );
+ TDdeClientConv *OpenPdic( const char *topic );
+ void ClosePdic( TDdeClientConv *dde );
+
+ // WM_COPYDATA control //
+ HWND FindPdic( );
+ LRESULT SendCopyData( HWND hwnd, int message, const char *str );
+
+ void NotifyAMODI();
+
+ void Reboot();
+
+protected:
+ BEGIN_MESSAGE_MAP
+ VCL_MESSAGE_HANDLER(WM_COPYDATA, TMessage, EvCopyData)
+ VCL_MESSAGE_HANDLER(WM_POPUP, TMessage, EvPopup)
+ VCL_MESSAGE_HANDLER(WM_MOVESEND, TMessage, EvMoveSend)
+ VCL_MESSAGE_HANDLER(WM_NOTIFYICON, TMessage, EvNotifyIcon)
+ VCL_MESSAGE_HANDLER(WM_TOGGLE, TMessage, EvToggle)
+ VCL_MESSAGE_HANDLER(UM_SHORTCUT, TMessage, EvShortcut)
+ VCL_MESSAGE_HANDLER(WM_GET_VERSION, TMessage, EvGetVersion)
+ END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDCHookMainForm *DCHookMainForm;
+//---------------------------------------------------------------------------
+
+extern bool Reboot;
+
+#endif
+
--- /dev/null
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value="DCHookTest.exe"/>
+ <OBJFILES value="obj\DCHookTest.obj obj\DCHookMain.obj obj\StringLib.obj
+ obj\PopupConfig.obj obj\Util.obj obj\Notify.obj obj\mustr.obj
+ obj\HookDLl.obj obj\HookLoader.obj obj\DCHookLoader.obj obj\prgprof.obj
+ obj\MODINotifyDlg.obj obj\prgconfig.obj obj\OCRTextFrm.obj"/>
+ <RESFILES value="DCHookTest.res obj\icon.res"/>
+ <IDLFILES value=""/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES) DCHookMain.dfm PopupConfig.dfm Notify.dfm MODINotifyDlg.dfm
+ OCRTextFrm.dfm"/>
+ <LIBFILES value=""/>
+ <LIBRARIES value="VCLDB50.lib TNTLIBR.lib Vclx50.lib vcl50.lib"/>
+ <SPARELIBS value="vcl50.lib Vclx50.lib TNTLIBR.lib VCLDB50.lib"/>
+ <PACKAGES value="vcl50.bpi"/>
+ <PATHCPP value=".;"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+ <RELEASELIBPATH value="$(BCB)\lib\release"/>
+ <LINKER value="ilink32"/>
+ <USERDEFINES value="USE_UNICODE;DCHOOK"/>
+ <SYSDEFINES value="NO_STRICT"/>
+ <MAINSOURCE value="DCHookTest.cpp"/>
+ <INCLUDEPATH value="K:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl"/>
+ <LIBPATH value="K:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+ <WARNINGS value="-w-par -w-8027 -w-8026"/>
+ <WARNOPTSTR value=""/>
+ </MACROS>
+ <OPTIONS>
+ <CFLAG1 value="-O2 -H=dchooktest.csm -Vx -Ve -X- -a4 -5 -b- -k- -vi -c -tW -tWM"/>
+ <PFLAGS value="-N2obj -N0obj -$Y- -$L- -$D- -v -JPHNE -M"/>
+ <RFLAGS value=""/>
+ <AFLAGS value="/mx /w2 /zn"/>
+ <LFLAGS value="-Iobj -D"" -aa -Tpe -GD -s"/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
+ <ALLRES value="$(RESFILES)"/>
+ <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=1
+MajorVer=2
+MinorVer=0
+Release=23
+Build=77
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=Doko Pop Project
+FileDescription=DokoPop for Windows
+FileVersion=2.0.23.77
+InternalName=DokoPop
+LegalCopyright=Copyright (c) DokoPopProject
+LegalTrademarks=
+OriginalFilename=DKPP.EXE
+ProductName=DokoPop
+ProductVersion=2.0
+Comments=
+
+[Excluded Packages]
+$(BCB)\Bin\dclite50.bpl=Borland Integrated Translation Environment
+
+[HistoryLists\hlIncludePath]
+Count=16
+Item0=K:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item1=K:\Borland\CBuilder5\Bin;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item2=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item3=R:\Borland\CBuilder5\Bin\;C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item4=R:\Borland\CBuilder5\Bin;C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item5=C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item6=C:\Borland\CBuilder5\Bin;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item7=..\..\Filer;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item8=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl;D:\units\
+Item9=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item10=$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item11=$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item12=$(BCB)\include;$(BCB)\include\vcl;..\..\units;$(BCB)\include\vcl;..\..\units
+Item13=
+Item14=$(BCB)\include;$(BCB)\include\vcl
+Item15=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=13
+Item0=K:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item1=K:\Borland\CBuilder5\Bin;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item2=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item3=R:\Borland\CBuilder5\Bin\;C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item4=R:\Borland\CBuilder5\Bin;C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item5=C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item6=C:\Borland\CBuilder5\Bin;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item7=..\..\Filer;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item8=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;D:\units\
+Item9=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\units
+Item10=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\units
+Item11=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\lib
+Item12=
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=10
+Item0=USE_UNICODE;DCHOOK
+Item1=USE_UNICODE;DCHOOK;_DEBUG
+Item2=USE_UNICODE;_DEBUG;DCHOOK
+Item3=USE_UNICODE;UNICODE;_UNICODE;_DEBUG;DCHOOK
+Item4=USE_UNICODE;_DEBUG
+Item5=USE_UNICODE
+Item6=_DEBUG
+Item7=_DEBUG;USE_UNICODE
+Item8=_UNICODE
+Item9=DEBUG
+
+[HistoryLists\hlIntOutputDir]
+Count=2
+Item0=obj
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+ <!-- EurekaLog First Line
+[Exception Log]
+EurekaLog Version=6105
+Activate=0
+Activate Handle=1
+Save Log File=1
+Foreground Tab=0
+Freeze Activate=0
+Freeze Timeout=0
+SMTP From=eurekalog@email.com
+SMTP Host=
+SMTP Port=25
+SMTP UserID=
+SMTP Password=
+Append to Log=0
+TerminateBtn Operation=2
+Errors Number=32
+Errors Terminate=3
+Email Address=
+Email Object=
+Email Send Options=0
+Output Path=
+Encrypt Password=
+AutoCloseDialogSecs=0
+WebSendMode=0
+SupportULR=
+HTMLLayout Count=15
+HTMLLine0="%3Chtml%3E"
+HTMLLine1=" %3Chead%3E"
+HTMLLine2=" %3C/head%3E"
+HTMLLine3=" %3Cbody TopMargin=10 LeftMargin=10%3E"
+HTMLLine4=" %3Ctable width="100%%" border="0"%3E"
+HTMLLine5=" %3Ctr%3E"
+HTMLLine6=" %3Ctd nowrap%3E"
+HTMLLine7=" %3Cfont face="Lucida Console, Courier" size="2"%3E"
+HTMLLine8=" %3C%%HTML_TAG%%%3E"
+HTMLLine9=" %3C/font%3E"
+HTMLLine10=" %3C/td%3E"
+HTMLLine11=" %3C/tr%3E"
+HTMLLine12=" %3C/table%3E"
+HTMLLine13=" %3C/body%3E"
+HTMLLine14="%3C/html%3E"
+AutoCrashOperation=2
+AutoCrashNumber=10
+AutoCrashMinutes=1
+WebURL=
+WebUserID=
+WebPassword=
+WebPort=0
+AttachedFiles=
+ProxyURL=
+ProxyUser=
+ProxyPassword=
+ProxyPort=8080
+TrakerUser=
+TrakerPassword=
+TrakerAssignTo=
+TrakerProject=
+TrakerCategory=
+TrakerTrialID=
+ZipPassword=
+PreBuildEvent=
+PostSuccessfulBuildEvent=
+PostFailureBuildEvent=
+ExceptionDialogType=2
+Count=0
+EMail Message Line Count=0
+loNoDuplicateErrors=0
+loAppendReproduceText=0
+loDeleteLogAtVersionChange=0
+loAddComputerNameInLogFileName=0
+loSaveModulesAndProcessesSections=1
+loSaveAssemblerAndCPUSections=1
+soAppStartDate=1
+soAppName=1
+soAppVersionNumber=1
+soAppParameters=1
+soAppCompilationDate=1
+soAppUpTime=1
+soExcDate=1
+soExcAddress=1
+soExcModuleName=1
+soExcModuleVersion=1
+soExcType=1
+soExcMessage=1
+soExcID=1
+soExcCount=1
+soExcStatus=1
+soExcNote=1
+soUserID=1
+soUserName=1
+soUserEmail=1
+soUserPrivileges=1
+soUserCompany=1
+soActCtlsFormClass=1
+soActCtlsFormText=1
+soActCtlsControlClass=1
+soActCtlsControlText=1
+soCmpName=1
+soCmpTotalMemory=1
+soCmpFreeMemory=1
+soCmpTotalDisk=1
+soCmpFreeDisk=1
+soCmpSysUpTime=1
+soCmpProcessor=1
+soCmpDisplayMode=1
+soCmpDisplayDPI=1
+soCmpVideoCard=1
+soCmpPrinter=1
+soOSType=1
+soOSBuildN=1
+soOSUpdate=1
+soOSLanguage=1
+soOSCharset=1
+soNetIP=1
+soNetSubmask=1
+soNetGateway=1
+soNetDNS1=1
+soNetDNS2=1
+soNetDHCP=1
+soCustomData=1
+sndShowSendDialog=1
+sndShowSuccessFailureMsg=0
+sndSendEntireLog=0
+sndSendXMLLogCopy=0
+sndSendScreenshot=1
+sndUseOnlyActiveWindow=0
+sndSendLastHTMLPage=1
+sndSendInSeparatedThread=0
+sndAddDateInFileName=0
+sndAddComputerNameInFileName=0
+edoSendErrorReportChecked=1
+edoAttachScreenshotChecked=1
+edoShowCopyToClipOption=1
+edoShowDetailsButton=1
+edoShowInDetailedMode=0
+edoShowInTopMostMode=0
+edoUseEurekaLogLookAndFeel=0
+edoShowSendErrorReportOption=1
+edoShowAttachScreenshotOption=1
+edoShowCustomButton=0
+csoShowDLLs=1
+csoShowBPLs=1
+csoShowBorlandThreads=1
+csoShowWindowsThreads=1
+csoDoNotStoreProcNames=0
+boPauseBorlandThreads=0
+boDoNotPauseMainThread=0
+boPauseWindowsThreads=0
+boUseMainModuleOptions=1
+boCopyLogInCaseOfError=1
+boSaveCompressedCopyInCaseOfError=0
+boHandleSafeCallExceptions=1
+boCallRTLExceptionEvent=0
+boCatchHandledExceptions=0
+loCatchLeaks=0
+loGroupsSonLeaks=1
+loHideBorlandLeaks=1
+loFreeAllLeaks=1
+loCatchLeaksExceptions=1
+cfoReduceFileSize=1
+cfoCheckFileCorruption=0
+cfoUseEL7=0
+Count mtInformationMsgCaption=1
+mtInformationMsgCaption0="Information."
+Count mtQuestionMsgCaption=1
+mtQuestionMsgCaption0="Question."
+Count mtErrorMsgCaption=1
+mtErrorMsgCaption0="Error."
+Count mtDialog_Caption=1
+mtDialog_Caption0="Error occurred"
+Count mtDialog_ErrorMsgCaption=2
+mtDialog_ErrorMsgCaption0="An error has occurred during program execution."
+mtDialog_ErrorMsgCaption1="Please read the following information for further details."
+Count mtDialog_GeneralCaption=1
+mtDialog_GeneralCaption0="General"
+Count mtDialog_GeneralHeader=1
+mtDialog_GeneralHeader0="General Information"
+Count mtDialog_CallStackCaption=1
+mtDialog_CallStackCaption0="Call Stack"
+Count mtDialog_CallStackHeader=1
+mtDialog_CallStackHeader0="Call Stack Information"
+Count mtDialog_ModulesCaption=1
+mtDialog_ModulesCaption0="Modules"
+Count mtDialog_ModulesHeader=1
+mtDialog_ModulesHeader0="Modules Information"
+Count mtDialog_ProcessesCaption=1
+mtDialog_ProcessesCaption0="Processes"
+Count mtDialog_ProcessesHeader=1
+mtDialog_ProcessesHeader0="Processes Information"
+Count mtDialog_AsmCaption=1
+mtDialog_AsmCaption0="Assembler"
+Count mtDialog_AsmHeader=1
+mtDialog_AsmHeader0="Assembler Information"
+Count mtDialog_CPUCaption=1
+mtDialog_CPUCaption0="CPU"
+Count mtDialog_CPUHeader=1
+mtDialog_CPUHeader0="CPU Information"
+Count mtDialog_OKButtonCaption=1
+mtDialog_OKButtonCaption0="%26OK"
+Count mtDialog_TerminateButtonCaption=1
+mtDialog_TerminateButtonCaption0="%26Terminate"
+Count mtDialog_RestartButtonCaption=1
+mtDialog_RestartButtonCaption0="%26Restart"
+Count mtDialog_DetailsButtonCaption=1
+mtDialog_DetailsButtonCaption0="%26Details"
+Count mtDialog_CustomButtonCaption=1
+mtDialog_CustomButtonCaption0="%26Help"
+Count mtDialog_SendMessage=1
+mtDialog_SendMessage0="%26Send this error via Internet"
+Count mtDialog_ScreenshotMessage=1
+mtDialog_ScreenshotMessage0="%26Attach a Screenshot image"
+Count mtDialog_CopyMessage=1
+mtDialog_CopyMessage0="%26Copy to Clipboard"
+Count mtDialog_SupportMessage=1
+mtDialog_SupportMessage0="Go to the Support Page"
+Count mtMSDialog_ErrorMsgCaption=1
+mtMSDialog_ErrorMsgCaption0="The application has encountered a problem. We are sorry for the inconvenience."
+Count mtMSDialog_RestartCaption=1
+mtMSDialog_RestartCaption0="Restart application."
+Count mtMSDialog_TerminateCaption=1
+mtMSDialog_TerminateCaption0="Terminate application."
+Count mtMSDialog_PleaseCaption=1
+mtMSDialog_PleaseCaption0="Please tell us about this problem."
+Count mtMSDialog_DescriptionCaption=1
+mtMSDialog_DescriptionCaption0="We have created an error report that you can send to us. We will treat this report as confidential and anonymous."
+Count mtMSDialog_SeeDetailsCaption=1
+mtMSDialog_SeeDetailsCaption0="To see what data the error report contains,"
+Count mtMSDialog_SeeClickCaption=1
+mtMSDialog_SeeClickCaption0="click here."
+Count mtMSDialog_HowToReproduceCaption=1
+mtMSDialog_HowToReproduceCaption0="What were you doing when the problem happened (optional)?"
+Count mtMSDialog_EmailCaption=1
+mtMSDialog_EmailCaption0="Email address (optional):"
+Count mtMSDialog_SendButtonCaption=1
+mtMSDialog_SendButtonCaption0="%26Send Error Report"
+Count mtMSDialog_NoSendButtonCaption=1
+mtMSDialog_NoSendButtonCaption0="%26Don't Send"
+Count mtLog_AppHeader=1
+mtLog_AppHeader0="Application"
+Count mtLog_AppStartDate=1
+mtLog_AppStartDate0="Start Date"
+Count mtLog_AppName=1
+mtLog_AppName0="Name/Description"
+Count mtLog_AppVersionNumber=1
+mtLog_AppVersionNumber0="Version Number"
+Count mtLog_AppParameters=1
+mtLog_AppParameters0="Parameters"
+Count mtLog_AppCompilationDate=1
+mtLog_AppCompilationDate0="Compilation Date"
+Count mtLog_AppUpTime=1
+mtLog_AppUpTime0="Up Time"
+Count mtLog_ExcHeader=1
+mtLog_ExcHeader0="Exception"
+Count mtLog_ExcDate=1
+mtLog_ExcDate0="Date"
+Count mtLog_ExcAddress=1
+mtLog_ExcAddress0="Address"
+Count mtLog_ExcModuleName=1
+mtLog_ExcModuleName0="Module Name"
+Count mtLog_ExcModuleVersion=1
+mtLog_ExcModuleVersion0="Module Version"
+Count mtLog_ExcType=1
+mtLog_ExcType0="Type"
+Count mtLog_ExcMessage=1
+mtLog_ExcMessage0="Message"
+Count mtLog_ExcID=1
+mtLog_ExcID0="ID"
+Count mtLog_ExcCount=1
+mtLog_ExcCount0="Count"
+Count mtLog_ExcStatus=1
+mtLog_ExcStatus0="Status"
+Count mtLog_ExcNote=1
+mtLog_ExcNote0="Note"
+Count mtLog_UserHeader=1
+mtLog_UserHeader0="User"
+Count mtLog_UserID=1
+mtLog_UserID0="ID"
+Count mtLog_UserName=1
+mtLog_UserName0="Name"
+Count mtLog_UserEmail=1
+mtLog_UserEmail0="Email"
+Count mtLog_UserCompany=1
+mtLog_UserCompany0="Company"
+Count mtLog_UserPrivileges=1
+mtLog_UserPrivileges0="Privileges"
+Count mtLog_ActCtrlsHeader=1
+mtLog_ActCtrlsHeader0="Active Controls"
+Count mtLog_ActCtrlsFormClass=1
+mtLog_ActCtrlsFormClass0="Form Class"
+Count mtLog_ActCtrlsFormText=1
+mtLog_ActCtrlsFormText0="Form Text"
+Count mtLog_ActCtrlsControlClass=1
+mtLog_ActCtrlsControlClass0="Control Class"
+Count mtLog_ActCtrlsControlText=1
+mtLog_ActCtrlsControlText0="Control Text"
+Count mtLog_CmpHeader=1
+mtLog_CmpHeader0="Computer"
+Count mtLog_CmpName=1
+mtLog_CmpName0="Name"
+Count mtLog_CmpTotalMemory=1
+mtLog_CmpTotalMemory0="Total Memory"
+Count mtLog_CmpFreeMemory=1
+mtLog_CmpFreeMemory0="Free Memory"
+Count mtLog_CmpTotalDisk=1
+mtLog_CmpTotalDisk0="Total Disk"
+Count mtLog_CmpFreeDisk=1
+mtLog_CmpFreeDisk0="Free Disk"
+Count mtLog_CmpSystemUpTime=1
+mtLog_CmpSystemUpTime0="System Up Time"
+Count mtLog_CmpProcessor=1
+mtLog_CmpProcessor0="Processor"
+Count mtLog_CmpDisplayMode=1
+mtLog_CmpDisplayMode0="Display Mode"
+Count mtLog_CmpDisplayDPI=1
+mtLog_CmpDisplayDPI0="Display DPI"
+Count mtLog_CmpVideoCard=1
+mtLog_CmpVideoCard0="Video Card"
+Count mtLog_CmpPrinter=1
+mtLog_CmpPrinter0="Printer"
+Count mtLog_OSHeader=1
+mtLog_OSHeader0="Operating System"
+Count mtLog_OSType=1
+mtLog_OSType0="Type"
+Count mtLog_OSBuildN=1
+mtLog_OSBuildN0="Build #"
+Count mtLog_OSUpdate=1
+mtLog_OSUpdate0="Update"
+Count mtLog_OSLanguage=1
+mtLog_OSLanguage0="Language"
+Count mtLog_OSCharset=1
+mtLog_OSCharset0="Charset"
+Count mtLog_NetHeader=1
+mtLog_NetHeader0="Network"
+Count mtLog_NetIP=1
+mtLog_NetIP0="IP Address"
+Count mtLog_NetSubmask=1
+mtLog_NetSubmask0="Submask"
+Count mtLog_NetGateway=1
+mtLog_NetGateway0="Gateway"
+Count mtLog_NetDNS1=1
+mtLog_NetDNS10="DNS 1"
+Count mtLog_NetDNS2=1
+mtLog_NetDNS20="DNS 2"
+Count mtLog_NetDHCP=1
+mtLog_NetDHCP0="DHCP"
+Count mtLog_CustInfoHeader=1
+mtLog_CustInfoHeader0="Custom Information"
+Count mtCallStack_Address=1
+mtCallStack_Address0="Address"
+Count mtCallStack_Name=1
+mtCallStack_Name0="Module"
+Count mtCallStack_Unit=1
+mtCallStack_Unit0="Unit"
+Count mtCallStack_Class=1
+mtCallStack_Class0="Class"
+Count mtCallStack_Procedure=1
+mtCallStack_Procedure0="Procedure/Method"
+Count mtCallStack_Line=1
+mtCallStack_Line0="Line"
+Count mtCallStack_MainThread=1
+mtCallStack_MainThread0="Main"
+Count mtCallStack_ExceptionThread=1
+mtCallStack_ExceptionThread0="Exception Thread"
+Count mtCallStack_RunningThread=1
+mtCallStack_RunningThread0="Running Thread"
+Count mtCallStack_CallingThread=1
+mtCallStack_CallingThread0="Calling Thread"
+Count mtCallStack_ThreadID=1
+mtCallStack_ThreadID0="ID"
+Count mtCallStack_ThreadPriority=1
+mtCallStack_ThreadPriority0="Priority"
+Count mtCallStack_ThreadClass=1
+mtCallStack_ThreadClass0="Class"
+Count mtCallStack_LeakCaption=1
+mtCallStack_LeakCaption0="Memory Leak"
+Count mtCallStack_LeakData=1
+mtCallStack_LeakData0="Data"
+Count mtCallStack_LeakType=1
+mtCallStack_LeakType0="Type"
+Count mtCallStack_LeakSize=1
+mtCallStack_LeakSize0="Total size"
+Count mtCallStack_LeakCount=1
+mtCallStack_LeakCount0="Count"
+Count mtSendDialog_Caption=1
+mtSendDialog_Caption0="Send."
+Count mtSendDialog_Message=1
+mtSendDialog_Message0="Message"
+Count mtSendDialog_Resolving=1
+mtSendDialog_Resolving0="Resolving DNS..."
+Count mtSendDialog_Login=1
+mtSendDialog_Login0="Login..."
+Count mtSendDialog_Connecting=1
+mtSendDialog_Connecting0="Connecting with server..."
+Count mtSendDialog_Connected=1
+mtSendDialog_Connected0="Connected with server."
+Count mtSendDialog_Sending=1
+mtSendDialog_Sending0="Sending message..."
+Count mtSendDialog_Sent=1
+mtSendDialog_Sent0="Message sent."
+Count mtSendDialog_SelectProject=1
+mtSendDialog_SelectProject0="Select project..."
+Count mtSendDialog_Searching=1
+mtSendDialog_Searching0="Searching..."
+Count mtSendDialog_Modifying=1
+mtSendDialog_Modifying0="Modifying..."
+Count mtSendDialog_Disconnecting=1
+mtSendDialog_Disconnecting0="Disconnecting..."
+Count mtSendDialog_Disconnected=1
+mtSendDialog_Disconnected0="Disconnected."
+Count mtReproduceDialog_Caption=1
+mtReproduceDialog_Caption0="Request"
+Count mtReproduceDialog_Request=1
+mtReproduceDialog_Request0="Please describe the steps to reproduce the error:"
+Count mtReproduceDialog_OKButtonCaption=1
+mtReproduceDialog_OKButtonCaption0="%26OK"
+Count mtModules_Handle=1
+mtModules_Handle0="Handle"
+Count mtModules_Name=1
+mtModules_Name0="Name"
+Count mtModules_Description=1
+mtModules_Description0="Description"
+Count mtModules_Version=1
+mtModules_Version0="Version"
+Count mtModules_Size=1
+mtModules_Size0="Size"
+Count mtModules_LastModified=1
+mtModules_LastModified0="Modified"
+Count mtModules_Path=1
+mtModules_Path0="Path"
+Count mtProcesses_ID=1
+mtProcesses_ID0="ID"
+Count mtProcesses_Name=1
+mtProcesses_Name0="Name"
+Count mtProcesses_Description=1
+mtProcesses_Description0="Description"
+Count mtProcesses_Version=1
+mtProcesses_Version0="Version"
+Count mtProcesses_Memory=1
+mtProcesses_Memory0="Memory"
+Count mtProcesses_Priority=1
+mtProcesses_Priority0="Priority"
+Count mtProcesses_Threads=1
+mtProcesses_Threads0="Threads"
+Count mtProcesses_Path=1
+mtProcesses_Path0="Path"
+Count mtCPU_Registers=1
+mtCPU_Registers0="Registers"
+Count mtCPU_Stack=1
+mtCPU_Stack0="Stack"
+Count mtCPU_MemoryDump=1
+mtCPU_MemoryDump0="Memory Dump"
+Count mtSend_SuccessMsg=1
+mtSend_SuccessMsg0="The message was sent successfully."
+Count mtSend_FailureMsg=1
+mtSend_FailureMsg0="Sorry, sending the message didn't work."
+Count mtSend_BugClosedMsg=2
+mtSend_BugClosedMsg0="These BUG is just closed."
+mtSend_BugClosedMsg1="Contact the program support to obtain an update."
+Count mtSend_UnknownErrorMsg=1
+mtSend_UnknownErrorMsg0="Unknown error."
+Count mtSend_InvalidLoginMsg=1
+mtSend_InvalidLoginMsg0="Invalid login request."
+Count mtSend_InvalidSearchMsg=1
+mtSend_InvalidSearchMsg0="Invalid search request."
+Count mtSend_InvalidSelectionMsg=1
+mtSend_InvalidSelectionMsg0="Invalid selection request."
+Count mtSend_InvalidInsertMsg=1
+mtSend_InvalidInsertMsg0="Invalid insert request."
+Count mtSend_InvalidModifyMsg=1
+mtSend_InvalidModifyMsg0="Invalid modify request."
+Count mtFileCrackedMsg=2
+mtFileCrackedMsg0="This file is cracked."
+mtFileCrackedMsg1="The application will be closed."
+Count mtException_LeakMultiFree=1
+mtException_LeakMultiFree0="Multi Free memory leak."
+Count mtException_LeakMemoryOverrun=1
+mtException_LeakMemoryOverrun0="Memory Overrun leak."
+Count mtException_AntiFreeze=1
+mtException_AntiFreeze0="The application seems to be frozen."
+Count mtInvalidEmailMsg=1
+mtInvalidEmailMsg0="Invalid email."
+TextsCollection=English
+EurekaLog Last Line -->
+</IDEOPTIONS>
+</PROJECT>
--- /dev/null
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+USERES("DCHookTest.res");
+USEFORM("DCHookMain.cpp", DCHookMainForm);
+USEUNIT("StringLib.cpp");
+USEFORM("PopupConfig.cpp", PopupConfigDlg);
+USEUNIT("Util.cpp");
+USEFORM("Notify.cpp", NotifyForm);
+USERC("icon.rc");
+USEUNIT("mustr.cpp");
+USEUNIT("HookDLl.cpp");
+USEUNIT("HookLoader.cpp");
+USEUNIT("DCHookLoader.cpp");
+USE("..\Diary.txt", File);
+USEUNIT("prgprof.cpp");
+USEFORM("MODINotifyDlg.cpp", MODINotifyDialog);
+USEUNIT("prgconfig.cpp");
+USEFORM("OCRTextFrm.cpp", OCRTextForm);
+//---------------------------------------------------------------------------
+#include "prgconfig.h"
+#include "DCHookMain.h"
+//---------------------------------------------------------------------------
+
+WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+#if __PROTO
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+ if ( (st.wYear>=2016 && st.wMonth>=12) || st.wYear>=2017){
+ int ret = MessageBox(NULL, "\8e\8e\8dì\94Å\82Ì\8eg\97p\8aú\8cÀ\82ª\90Ø\82ê\82Ü\82µ\82½\81B\90V\82µ\82¢DokoPop!\82ð\93ü\8eè\82µ\82Ä\82\82¾\82³\82¢", APPNAME, MB_YESNO);
+ if (ret != IDNO){
+ ShowLatestVersion();
+ return 0;
+ }
+ }
+#endif
+
+ HWND hwnd = FindPrev();
+ if ( hwnd ){
+ if (CheckVersion(hwnd)<0){
+ // The older version already lauched.
+ MessageBox(NULL, "DokoPop!\82ª\82·\82Å\82É\8bN\93®\82µ\82Ä\82¢\82Ü\82·\81B\r\8cÃ\82¢\83o\81[\83W\83\87\83\93\82ÌDokoPop!\82ð\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä\82\82¾\82³\82¢", APPNAME, MB_OK);
+ return 0;
+ }
+ MoveToTop( hwnd );
+ return 0;
+ }
+ try
+ {
+ Application->Initialize();
+ Application->Title = "DokoPop";
+ Application->CreateForm(__classid(TDCHookMainForm), &DCHookMainForm);
+ Application->Run();
+ }
+ catch (Exception &exception)
+ {
+ Application->ShowException(&exception);
+ }
+ if (Reboot){
+ _WinExec(Application->ExeName.c_str(), SW_SHOW, 0);
+ }
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+
--- /dev/null
+//---------------------------------------------------------------------------
+#ifndef DCHookTestH
+#define DCHookTestH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Menus.hpp>
+//---------------------------------------------------------------------------
+class TForm1 : public TForm
+{
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TMainMenu *MainMenu1;
+ TMenuItem *File1;
+ TMenuItem *Exit1;
+ TMenuItem *Hook1;
+ TMenuItem *Unhook1;
+ TMenuItem *N1;
+private: // \83\86\81[\83U\81[\90é\8c¾
+public: // \83\86\81[\83U\81[\90é\8c¾
+ __fastcall TForm1(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TForm1 *Form1;
+//---------------------------------------------------------------------------
+#endif
--- /dev/null
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = DCHookTest.exe
+OBJFILES = DCHookTest.obj DCHookMain.obj StringLib.obj PopupConfig.obj Util.obj \
+ Notify.obj
+RESFILES = DCHookTest.res icon.res
+MAINSOURCE = DCHookTest.cpp
+RESDEPEN = $(RESFILES) DCHookMain.dfm PopupConfig.dfm Notify.dfm
+LIBFILES =
+IDLFILES =
+IDLGENFILES =
+LIBRARIES = Vclx50.lib vcl50.lib
+PACKAGES = vcl50.bpi
+SPARELIBS = vcl50.lib Vclx50.lib
+DEFFILE =
+# ---------------------------------------------------------------------------
+PATHCPP = .;
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES =
+SYSDEFINES = NO_STRICT
+INCLUDEPATH = ..\..\Filer;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+LIBPATH = ..\..\Filer;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+WARNINGS= -w-par -w-8027 -w-8026
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -H=dchooktest.csm -Vx -Ve -X- -a4 -5 -b- -k- -vi -c -tW -tWM
+IDLCFLAGS =
+PFLAGS = -$Y- -$L- -$D- -v -JPHNE -M
+RFLAGS =
+AFLAGS = /mx /w2 /zn
+LFLAGS = -D"" -aa -Tpe -GD -s
+# ---------------------------------------------------------------------------
+ALLOBJ = c0w32.obj sysinit.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE. It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+ $(BCB)\BIN\$(LINKER) @&&!
+ $(LFLAGS) -L$(LIBPATH) +
+ $(ALLOBJ), +
+ $(PROJECT),, +
+ $(ALLLIB), +
+ $(DEFFILE), +
+ $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+ $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+ $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+ $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+ $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
--- /dev/null
+0 ICON "dkpps.ico"
--- /dev/null
+==============================================================
+ \82Ç\82±\83|\83b\83v\81I/Unicode Ver.2.0
+==============================================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@WindowsXP/Vista/7/8/8.1
+
+ \81¦Windows2000\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B
+
+\96â\91è\93_ -------------------------------------------------------
+
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@DKPU20.EXE\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.0.67\88È\8d~ \82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81y\92\8d\88Ó\81zWin32\94ÅDokoPop!\82Æ\93¯\8e\9e\82É\8fí\92\93\82³\82¹\82Ä\82¨\82\82±\82Æ\82Í\89Â\94\\82Å\82·\82ª\81A
+ \83|\83b\83v\83A\83b\83v\82Ì\82½\82ß\82Ì\83L\81[\91\80\8dì\82Í\95Ê\81X\82Ì\91g\82Ý\8d\87\82í\82¹\82É\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+ \83^\83X\83N\83g\83\8c\83C\82ð\89E\83N\83\8a\83b\83N\82µ\82Ä\81u\90Ý\92è...\81v\82Å\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+ \93¯\8e\9e\8fí\92\93\82É\82Í\91o\95û\82Æ\82àVer.1.11\88È\8fã\82ª\95K\97v\82Å\82·\81B
+
+ \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+ \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+ \82Å\82«\82Ü\82¹\82ñ\81B
+
+ \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83N \82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+ \82½\82ß\81A\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+ \81i\81u\82Í\82¶\82ß\82É\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82\82é\81j
+ \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+ \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+ \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+ \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+ \91I\82ñ\82Å\82\82¾\82³\82¢\81B
+ Alt + \89E\83N\83\8a\83b\83N \82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83N \82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82¶\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+ \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83` - PDIC\96{\91Ì\82Å\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ð\8ds\82¢\82Ü\82·
+ PDIC\88È\8aO\82Ì\83A\83v\83\8a\8fã\82Å\83}\83E\83X\82ð\88Ú\93®\82·\82é\82Æ\81A
+ WORD\97\93\82É\83}\83E\83X\89º\82Ì\83e\83L\83X\83g\82ª\8e©\93®\93I\82É\83R\83s\81[\82³\82ê\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦ - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93 - version\95\\8e¦
+\81@\8fI\97¹ - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+ \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+ \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+ \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82\82é\83E\83B\83\93\83h\83E\82Ì
+ \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+ \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+ DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+ \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+ \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+ \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+ PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+ \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+ \82µ\82Ü\82·\81B
+
+ \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+ \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+ \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82¶\82é
+ Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+ \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+ \83E\83B\83\93\83h\83E\82ð\95Â\82¶\82Ü\82·\81B
+ \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82\82¾\82³\82¢\81j
+
+ \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+ \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95¶\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+ \8d¬\8dÝ\95¶\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82\82È\82è\82Ü\82·\81B
+ \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+ \8aÜ\82Þ\95¶\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+ \81¡AMODI\82ð\8eg\97p\82·\82é
+ \82±\82Ì\8b@\94\\82ð\97L\8cø\82É\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82Ü\82·\81B
+ \92Ê\8fí\81A\82±\82±\82Í\95K\82¸\97L\8cø\82É\82µ\82Ä\82\82¾\82³\82¢\81B
+ \81¦\82±\82Ì\8b@\94\\82ð\8eg\97p\82·\82é\82É\82Í\81AMODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+ \81@\95\\8e¦\82É\8f]\82Á\82Ä\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ \81¦AMODI\82Æ\82ÍMODI\8b@\94\\82ð\97\98\97p\82·\82é\95t\91®\8eÀ\8ds\83t\83@\83C\83\8bamodi.exe\82Ì\82±\82Æ\82Å\82·\81B
+
+ \81¡AMODI\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+ MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+ \8fê\8f\8a\82Æ\82µ\82Ä\81A
+ \amodi
+ \82ð\8ew\92è\82µ\82Ü\82·\81B
+ \97á\81F
+ \\server\temp\amodi
+ \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95¶\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95¶\96@\82ð\95×\8b\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+
+\97\9a\97ð ---------------------------------------------------------
+
+>> Ver.2.00 <<
+ \81EMODI\91Î\89\9e\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+ \81E\83}\83E\83X\88Ú\93®\82É\82æ\82éPDIC\96{\91Ì\82Ì\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\8b@\94\\82Ì\92Ç\89Á
+
+>> Ver.1.23 <<
+ \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+ \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+ \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+ \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+ \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+ \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+ \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+ - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+ - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+ PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+ \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82¶\82½\82ß\81j
+ * \95¶\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+ \81y\8c´\88ö\81z
+ \81@\8eæ\93¾\82µ\82½\95¶\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+ \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95¶\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95¶\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+--------------------------------------------------------------
--- /dev/null
+#include <windows.h>
+#pragma hdrstop
+#include "HookDll.h"
+
--- /dev/null
+#ifndef __HookDll_h
+#define __HookDll_h
+
+class THookDllI {
+public:
+ virtual ~THookDllI(){}
+ virtual bool Load(HWND hwnd) = 0;
+ virtual void Unload() = 0;
+ virtual bool IsLoaded() = 0;
+
+ virtual bool Init(HWND hwnd) = 0;
+ virtual void Uninit() = 0;
+ virtual int Config( int clickonly, int keyaction, int keyflag ) = 0;
+ virtual int Config2( struct TDCHConfig *cfg ) = 0;
+ virtual int Capture( ) = 0;
+ virtual int CaptureAsync() = 0;
+ virtual int CaptureAsyncWait() = 0;
+ virtual int Debug() = 0;
+};
+
+
+#endif
--- /dev/null
+#include <windows.h>
+#pragma hdrstop
+#include "stdafx.h"
+#include "HookLoader.h"
+#include "../DCHook64/DCHook64.h"
+#include "Util.h"
+
+#define HOOK64_SUBDIR 0 // x64\8aÖ\98A\83t\83@\83C\83\8b\82Ísub directory x64\82Ö
+
+HWND hwnd64;
+
+THookLoader::THookLoader(const char *dllname)
+ :DllName(dllname)
+{
+ hDll = NULL;
+ DCHInit = NULL;
+ DCHConfig = NULL;
+ DCHConfig2 = NULL;
+ DCHCapture = NULL;
+ DCHWaitForCaptureResult = NULL;
+ DCHUninit = NULL;
+#ifdef _DEBUG
+ DCDebug = NULL;
+#endif
+
+ hThread = NULL;
+ dwThreadId = 0;
+}
+THookLoader::~THookLoader()
+{
+ Uninit();
+}
+bool THookLoader::Load(HWND hwnd)
+{
+ if (hDll)
+ return true;
+
+ hDll = LoadLibrary( DllName );
+ if ( !hDll )
+ {
+ GetLastError();
+#ifndef _DEBUG
+ DBW("Cannot load DLL:%s",DllName);
+#endif
+ // DKPPHK.DLL \82ª\82È\82¯\82ê\82Î DCHOOK.DLL\82ðload
+ DllName = "DCHOOK.DLL";
+
+ hDll = LoadLibrary( DllName );
+ if ( !hDll ){
+ DBW("Cannot load DLL:%s",DllName);
+ return false;
+ }
+ }
+
+ DCHInit = (FNDCHInit)GetProcAddress( hDll, "Init" );
+ DCHUninit = (FNDCHUninit)GetProcAddress( hDll, "Uninit" );
+ DCHConfig = (FNDCHConfig)GetProcAddress( hDll, "Config" );
+ DCHConfig2 = (FNDCHConfig2)GetProcAddress( hDll, "Config2" );
+ DCHCapture = (FNDCHCapture)GetProcAddress( hDll, "Capture" );
+ DCHWaitForCaptureResult = (FNDCHWaitForCaptureResult)GetProcAddress( hDll, "WaitForCaptureResult" );
+#ifdef _DEBUG
+ DCDebug = (FNDebug)GetProcAddress( hDll, "Debug" );
+#endif
+
+ if (!DCHInit || !DCHUninit || !DCHConfig || !DCHConfig2 || !DCHCapture || !DCHWaitForCaptureResult){
+ FreeLibrary(hDll);
+ hDll = NULL;
+ return false;
+ }
+
+#if 0
+#ifdef USE_UNICODE
+ const char *pVxdPath = NULL;
+#else
+ AnsiString VxdPath;
+ if (!WindowsNT){
+ // for Windows9x
+ VxdPath = ExtractFilePath( Application->ExeName );
+ char path[256];
+ GetShortPathName( VxdPath.c_str(), path, sizeof(path) );
+ VxdPath = path;
+ VxdPath += "HK95D.VXD";
+ }
+ const char *pVxdPath = VxdPath.data();
+#endif
+
+ if ( !DCHInit( hwnd, DllName, WindowsNT, pVxdPath ) ){
+ FreeLibrary( hDll );
+ hDll = NULL;
+ DBW("Cannot initialized DLL");
+ return false;
+ }
+#endif
+
+ return true;
+}
+
+void THookLoader::Unload()
+{
+ if (!hDll)
+ return;
+ DCHUninit();
+ FreeLibrary(hDll);
+ hDll = NULL;
+ DCHUninit = NULL;
+}
+
+bool THookLoader::Init(HWND hwnd)
+{
+ DBW("Init");
+ return DCHInit(hwnd, NULL, NULL, NULL);
+}
+void THookLoader::Uninit()
+{
+ if (DCHUninit) DCHUninit();
+}
+
+int THookLoader::Capture()
+{
+ if (!hDll)
+ return 0;
+ return DCHCapture(NULL, NULL, true, false);
+}
+int THookLoader::CaptureAsync()
+{
+ if (!hDll)
+ return 0;
+ int ret = DCHCapture(NULL, NULL, true, true);
+ int result = DCHWaitForCaptureResult(false, 0);
+ DBW("result:%d", result);
+ if (result != 0){
+ // wait data\82 \82è
+ OpenThread();
+ }
+ return ret;
+}
+int THookLoader::CaptureAsyncWait()
+{
+ return 0;
+}
+
+void THookLoader::OpenThread()
+{
+ DBW("OpenThread: %08X", hThread);
+ if (hThread) return;
+
+ ThreadEnd = false;
+ hThread = CreateThread(NULL, 0, cbWaitCaptureThread, this, CREATE_SUSPENDED, &dwThreadId);
+ ResumeThread(hThread);
+}
+
+DWORD WINAPI THookLoader::cbWaitCaptureThread(LPVOID This)
+{
+ ((THookLoader*)This)->WaitCaptureThread();
+ return 0;
+}
+
+void THookLoader::WaitCaptureThread()
+{
+ DCHWaitForCaptureResult(true, 3000);
+ hThread = NULL;
+}
+
+static const char *MyWinTitle = "<Processing...in dchook>";
+inline HANDLE __WinExec( const char *cmd, int show, const char *dir=NULL )
+{
+ return WinExecEx(cmd, show, dir, MyWinTitle);
+}
+
+//#ifdef _DEBUG
+#if 0
+const char *StrDCHK64EXE = "..\\dchk64\\x64\\Debug\\dchk64.exe"; // for debug
+#else
+#if HOOK64_SUBDIR
+const char *StrDCHK64EXE = "x64\\DKPUHK64.exe";
+#else
+const char *StrDCHK64EXE = "DKPUHK64.exe";
+#endif
+#endif
+
+THookLoader64::THookLoader64(HWND hwnd_recv)
+ :hwndRecv(hwnd_recv)
+{
+ hwndTarget = NULL;
+ hProc = NULL;
+ LoadPending = false;
+}
+THookLoader64::~THookLoader64()
+{
+ if (hProc)
+ CloseHandle(hProc);
+ Unload();
+}
+bool THookLoader64::Load(HWND hwnd)
+{
+#if 1 // Find already launched hook executer.
+ HWND hwndFound = FindWindow("dchk64", "DCHK64");
+// HWND hwndFound = FindApp("dchk64", "DCHK64", "");
+ if (hwndFound){
+ DBW("x64:Found %08X already launched exe", hwndFound);
+ hwndTarget = hwndFound;
+ hwnd64 = hwndTarget;
+ return true;
+ }
+#endif
+#if 1
+ char param[280];
+ wsprintf(param, "%s %08X", StrDCHK64EXE, hwndRecv);
+ hProc = __WinExec(param, SW_HIDE, 0); // Launch dchk64.exe
+ if (!hProc){
+ DBW("Launch failed: %s", param);
+ return false;
+ }
+ LoadPending = true;
+ //WaitForInputIdle(hProc, 3000);
+#endif
+ return true;
+}
+void THookLoader64::Unload()
+{
+ if (!hProc)
+ return;
+ Uninit();
+ TerminateProcess(hProc, 0);
+ CloseHandle(hProc);
+ hProc = NULL;
+ LoadPending = false;
+}
+bool THookLoader64::Init(HWND hwnd)
+{
+ DBW("x64:Init hwndTarget=%08X", hwndTarget);
+ if (!hwndTarget){
+ DBW("Init failed");
+ return false;
+ }
+ DBW("x64:Init");
+ HDCInitParam p = {hwnd};
+ return Send(HDC_Init, &p, sizeof(p)) ? true : false;
+}
+void THookLoader64::Uninit( )
+{
+ if (!hwndTarget)
+ return ;
+ Send(HDC_Uninit, 0);
+ LoadPending = false;
+}
+int THookLoader64::Config( int clickonly, int keyaction, int keyflag )
+{
+ if (!hwndTarget)
+ return false;
+ HDCConfigParam p = {clickonly, keyaction, keyflag };
+ return Send(HDC_Config, &p, sizeof(p));
+}
+int THookLoader64::Config2( struct TDCHConfig *cfg )
+{
+ if (!hwndTarget)
+ return false;
+ return Send(HDC_Config2, cfg, sizeof(*cfg));
+}
+int THookLoader64::Capture()
+{
+ if (!hwndTarget)
+ return false;
+ return Send(HDC_Capture, 0);
+}
+int THookLoader64::CaptureAsync()
+{
+ if (!hwndTarget)
+ return false;
+ return Send(HDC_CaptureAsync, 0);
+}
+int THookLoader64::CaptureAsyncWait()
+{
+ if (!hwndTarget)
+ return false;
+ return Send(HDC_CaptureAsyncWait, 0);
+}
+int THookLoader64::Debug()
+{
+ if (!hwndTarget)
+ return false;
+ return Send(HDC_Debug, 0);
+}
+
+int THookLoader64::Send(int msg, void *data, int len)
+{
+ COPYDATASTRUCT cds;
+ memset(&cds, 0, sizeof(cds));
+ cds.dwData = msg;
+ cds.lpData = data;
+ cds.cbData = len;
+ return (int)SendMessage(hwndTarget, WM_COPYDATA, 0, (LPARAM)&cds);
+}
+
--- /dev/null
+#ifndef __HookLoader_h
+#define __HookLoader_h
+
+#include "../DCHook/DCHook.h"
+#include "HookDll.h"
+
+class THookLoader : public THookDllI {
+public:
+ THookLoader(const char *dllname);
+ ~THookLoader();
+ virtual bool Load(HWND hwnd);
+ virtual void Unload();
+ virtual bool IsLoaded()
+ { return hDll!=NULL; }
+
+ virtual bool Init(HWND hwnd);
+ virtual void Uninit();
+ virtual int Config( int clickonly, int keyaction, int keyflag )
+ { return DCHConfig(clickonly, keyaction, keyflag); }
+ virtual int Config2( struct TDCHConfig *cfg )
+ { return DCHConfig2(cfg); }
+ virtual int Capture();
+ virtual int CaptureAsync();
+ virtual int CaptureAsyncWait();
+ virtual int Debug()
+#ifdef _DEBUG
+ { return DCDebug(); }
+#else
+ { return 0; }
+#endif
+protected:
+ HANDLE hThread;
+ DWORD dwThreadId;
+ bool ThreadEnd;
+ void OpenThread();
+ static DWORD WINAPI cbWaitCaptureThread(LPVOID This);
+ void WaitCaptureThread();
+
+protected:
+ const char *DllName;
+ HINSTANCE hDll;
+ FNDCHInit DCHInit;
+ FNDCHUninit DCHUninit;
+ FNDCHConfig DCHConfig;
+ FNDCHConfig2 DCHConfig2;
+ FNDCHCapture DCHCapture;
+ FNDCHWaitForCaptureResult DCHWaitForCaptureResult;
+#ifdef _DEBUG
+ FNDebug DCDebug;
+ #define COMPSIZE 16
+ char share[ COMPSIZE ];
+#endif
+};
+
+class THookLoader64 : public THookDllI {
+public:
+ THookLoader64(HWND hwnd_recv);
+ virtual ~THookLoader64();
+ virtual bool Load(HWND hwnd);
+ virtual void Unload();
+ virtual bool IsLoaded()
+ { return hProc!=NULL; }
+
+ virtual bool Init(HWND hwnd);
+ virtual void Uninit() ;
+ virtual int Config( int clickonly, int keyaction, int keyflag );
+ virtual int Config2( struct TDCHConfig *cfg );
+ virtual int Capture();
+ virtual int CaptureAsync();
+ virtual int CaptureAsyncWait();
+ virtual int Debug();
+ void SetTarget(HWND hwnd)
+ { hwndTarget = hwnd; }
+ bool WaitFor() const
+ {
+ return WaitForInputIdle(hProc, 500)==0;
+ }
+ bool IsPending() const { return LoadPending; }
+ void Notify64() { LoadPending = false; }
+
+protected:
+ int Send(int msg, void *data=NULL, int len=0);
+
+ HWND hwndRecv; // receive window handle (=main window handle)
+ HWND hwndTarget; // main window handle of pdhk64.exe
+ HANDLE hProc;
+ bool LoadPending;
+};
+
+#endif
+
--- /dev/null
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "MODINotifyDlg.h"
+#include "Util.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+// \8eQ\8dl\81Fhttps://msdn.microsoft.com/ja-jp/library/5a4x27ek(v=vs.110).aspx
+#define URL_DNF_INSTALL "https://www.microsoft.com/ja-JP/download/details.aspx?id=40773"
+#define URL_MODI_INSTALL "http://support.microsoft.com/kb/982760"
+
+TMODINotifyDialog *MODINotifyDialog;
+//---------------------------------------------------------------------------
+__fastcall TMODINotifyDialog::TMODINotifyDialog(TComponent* Owner)
+ : TForm(Owner)
+{
+ LinkClicked = false;
+ modiInstalled = false;
+ amodiRunable = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TMODINotifyDialog::FormCreate(TObject *Sender)
+{
+ MoveCenter(Handle, NULL);
+ reMsgId = GetDlgCtrlID(reMsg->Handle);
+ //SetWindowLong(Handle, GWL_USERDATA, (LONG)reMsg->Handle);
+ SendMessage(reMsg->Handle, EM_AUTOURLDETECT, (WPARAM)TRUE, 0 ); // RichEdit 2.0 only
+ DWORD emask = SendMessage(reMsg->Handle, EM_GETEVENTMASK, 0, 0);
+ SendMessage(reMsg->Handle, EM_SETEVENTMASK, 0, emask | ENM_LINK);
+
+ modiInstalled = MODIInstalled();
+ amodiRunable = AMODIRunable();
+
+ SetMessage();
+}
+//---------------------------------------------------------------------------
+void TMODINotifyDialog::SetMessage()
+{
+ if (modiInstalled && !amodiRunable){
+ reMsg->Lines->Add(
+"\81y\8fd\97v\81z \95¶\8e\9a\94F\8e¯\82ð\8eg\97p\82·\82é\82É\82Í .NET Framework 4.5.1 \88È\8fã\82ª\95K\97v\82Å\82·\n"
+"\n"
+URL_DNF_INSTALL"\n"
+"\n"
+"\83\8a\83\93\83N\90æ\82©\82ç\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\n"
+"\n"
+"\81¦\83\8a\83\93\83N\90æ\82ª\8c©\82Â\82©\82ç\82È\82¢\8fê\8d\87\82Í\".NET Framework \83C\83\93\83X\83g\81[\83\8b\"\82Å\8c\9f\8dõ\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+"\81¦\95¶\8e\9a\94F\8e¯\82ð\8eg\97p\82·\82é\82Æ\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\83A\83v\83\8a\82ª\91\9d\82¦\82Ü\82·\81B\n"
+ );
+ } else {
+ reMsg->Lines->Add(
+"\81y\8fd\97v\81z MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81I\81I\n"
+"\n"
+"MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\83A\83v\83\8a\82ª\91\9d\82¦\82Ü\82·\81B\n"
+"\n"
+URL_MODI_INSTALL"\n"
+"\n"
+"\83\8a\83\93\83N\90æ\82É\82 \82é\82¢\82¸\82ê\82©\82Ì\95û\96@\82Å\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B\n"
+"\81¦\92Ê\8fí\82Í\81u\95û\96@\82Q\81v\n"
+"\81¦MODI\82Í\"Microsoft Office Document Imaging\"\82Ì\97ª\82Å\82·\n"
+"\81¦\8fã\8bL\83\8a\83\93\83N\82ª\8aJ\82¯\82È\82¢\8fê\8d\87\82Í \"MODI\" \"\83C\83\93\83X\83g\81[\83\8b\" \82È\82Ç\82Å\8c\9f\8dõ\82µ\82Ä\82Ý\82Ä\82\82¾\82³\82¢\n"
+ );
+ }
+}
+void __fastcall TMODINotifyDialog::tmInstallCheckTimer(TObject *Sender)
+{
+ bool _modiInstalled = MODIInstalled();
+ bool _amodiRunable = AMODIRunable();
+ if (_modiInstalled && _amodiRunable){
+ // ready to go
+ Close();
+ } else {
+ if (modiInstalled!=_modiInstalled || amodiRunable!=_amodiRunable){
+ modiInstalled = _modiInstalled;
+ amodiRunable = _amodiRunable;
+ SetMessage();
+ }
+ }
+}
+//---------------------------------------------------------------------------
+void TMODINotifyDialog::EvNotify( TMessage &msg )
+{
+ if (msg.WParam==reMsgId){
+ NMHDR *nmhdr = (NMHDR*)msg.LParam;
+ if (nmhdr->code==EN_LINK){
+ ENLINK *enlink = (ENLINK*)nmhdr;
+ if (enlink->msg == WM_LBUTTONDOWN){
+ bool dnf = modiInstalled && !amodiRunable;
+ HINSTANCE hInst = ShellExecute(Handle, NULL, dnf ? URL_DNF_INSTALL : URL_MODI_INSTALL, NULL, NULL, SW_SHOWNORMAL);
+ if ((int)hInst>32){
+ LinkClicked = true;
+ }
+ }
+ }
+ }
+}
+
+
--- /dev/null
+object MODINotifyDialog: TMODINotifyDialog
+ Left = 199
+ Top = 120
+ BorderStyle = bsDialog
+ Caption = 'DokoPop!'
+ ClientHeight = 263
+ ClientWidth = 486
+ Color = clBtnFace
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 12
+ object reMsg: TRichEdit
+ Left = 14
+ Top = 12
+ Width = 458
+ Height = 213
+ TabStop = False
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ReadOnly = True
+ TabOrder = 0
+ end
+ object btnClose: TButton
+ Left = 206
+ Top = 233
+ Width = 75
+ Height = 25
+ Anchors = [akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 2
+ TabOrder = 1
+ end
+ object tmInstallCheck: TTimer
+ OnTimer = tmInstallCheckTimer
+ Left = 328
+ Top = 232
+ end
+end
--- /dev/null
+//---------------------------------------------------------------------------
+
+#ifndef MODINotifyDlgH
+#define MODINotifyDlgH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TMODINotifyDialog : public TForm
+{
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TRichEdit *reMsg;
+ TButton *btnClose;
+ TTimer *tmInstallCheck;
+ void __fastcall FormCreate(TObject *Sender);
+ void __fastcall tmInstallCheckTimer(TObject *Sender);
+private: // \83\86\81[\83U\81[\90é\8c¾
+ BEGIN_MESSAGE_MAP
+ VCL_MESSAGE_HANDLER(WM_NOTIFY, TMessage, EvNotify);
+ END_MESSAGE_MAP( TForm )
+ void EvNotify( TMessage &msg );
+ int reMsgId;
+ bool modiInstalled;
+ bool amodiRunable;
+public: // \83\86\81[\83U\81[\90é\8c¾
+ __fastcall TMODINotifyDialog(TComponent* Owner);
+ void SetMessage();
+ bool LinkClicked;
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TMODINotifyDialog *MODINotifyDialog;
+//---------------------------------------------------------------------------
+#endif
--- /dev/null
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "Notify.h"
+namespace popenable {
+#include "popenable.h" // generated by bmp2rgn
+}
+namespace popdisable {
+#include "popdisable.h" // generated by bmp2rgn
+}
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TNotifyForm *NotifyForm;
+//---------------------------------------------------------------------------
+__fastcall TNotifyForm::TNotifyForm(TComponent* Owner)
+ : TForm(Owner)
+{
+ hRgn = NULL;
+}
+//---------------------------------------------------------------------------
+void __fastcall TNotifyForm::FormShow(TObject *Sender)
+{
+ Setup();
+ if (hRgn)
+ DeleteObject(hRgn);
+ if (enable){
+ hRgn = ExtCreateRegion (0,
+ sizeof(popenable::bmp2rgn_rgnBytes),
+ &popenable::bmp2rgn_rgnData);
+ } else {
+ hRgn = ExtCreateRegion (0,
+ sizeof(popdisable::bmp2rgn_rgnBytes),
+ &popdisable::bmp2rgn_rgnData);
+ }
+ SetWindowRgn( Handle, hRgn, TRUE );
+}
+//---------------------------------------------------------------------------
+void TNotifyForm::Setup()
+{
+ EnableBmp->Visible = enable;
+ DisableBmp->Visible = !enable;
+ TImage *bmp = enable ? EnableBmp : DisableBmp;
+ Width = bmp->Width;
+ Height = bmp->Height;
+ bmp->Top = 0;
+ bmp->Left = 0;
+// ReleaseCapture();
+ SetCapture( Handle ); // capture\82Å\82«\82È\82¢\81B\82È\82º\81H
+}
+void __fastcall TNotifyForm::FormMouseMove(TObject *Sender,
+ TShiftState Shift, int X, int Y)
+{
+ ReleaseCapture( );
+ Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TNotifyForm::FormDestroy(TObject *Sender)
+{
+ DeleteObject( hRgn );
+}
+//---------------------------------------------------------------------------
+
+
--- /dev/null
+object NotifyForm: TNotifyForm
+ Left = 913
+ Top = 701
+ BorderStyle = bsNone
+ ClientHeight = 50
+ ClientWidth = 240
+ Color = cl3DLight
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ OldCreateOrder = False
+ OnDestroy = FormDestroy
+ OnMouseMove = FormMouseMove
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 12
+ object EnableBmp: TImage
+ Left = 0
+ Top = 0
+ Width = 241
+ Height = 25
+ Picture.Data = {
+ 07544269746D617056490000424D56490000000000003600000028000000F000
+ 00001A000000010018000000000020490000C30E0000C30E0000000000000000
+ 0000FDFBFDFDFBFDFDFBFDC9EC7BC9EC7BB0DE3BA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ ACDE30C9EC7BC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDC3E86CA7DF25A3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DACDE30C9EC7BFDFBFDFD
+ FBFDFDFBFDC9EC7BA7DF25A3E11DA3E11DA3E11D96BC43779140697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+ 697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+ 3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+ 7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C869B39
+ A4DD21A3E11DA3E11DA7DF25C9EC7BFDFBFDC9EC7BA7DF25A3E11DA3E11DA3CD
+ 479DC7419DC7418F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F727272595959697E3C869B39A3E11DA3E11DADDE32C9
+ EC7BC2E766A3E11DA3E11DB1DB56AAD44FC0C0C0CFCFCFCFCFCFDADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADBDBDBDCDCDCDDDDDDDDDD
+ DDDDDDDDDBDBDBDADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADACFCFCFC0C0C0A2A2A2
+ 818181697E3C869B39A3E11DA3E11DC9EC7BA7DF25A3E11DA7DF25BCE463E6E6
+ E6EDEBEDF5F3F5FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFD
+ FEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFCFDFEFCFEFEFDFEFEFEFEFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDF5F3F5E6E6E6C0C0C0818181779140A4DD21A3E11DB0
+ DF3AA3E11DA3E11DBFE45EFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFEFFFFFEFFFEFEFEFEFDFEFEFCFEFEFC
+ FEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FEFFFFFEFFFEFEFEFEFDFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFEFEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFDFEFEFEFE
+ FFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFEFCFEFEFCFEFEFCFEFEFC
+ FEFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFC
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFE
+ FEFDFEFEFDFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFCFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ E6E6E6B4B4B48181818CAE44A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+ FFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFEFCFEFF
+ FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFDFEFEFDFEFEFD
+ FEFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+ FFFEFFFFFEFFFEFEFEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFEFFFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFEFCFEFEFDFEFFFEFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFEFCFEFEFDFEFCFC
+ FCFBFBFBFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFA
+ FAFAFCFCFCFEFEFEFCFCFCFDFCFDFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF5F3F5CFCFCF8F8F8F8CAE44A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFEFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFEFFFEFEFEFEFEFE
+ FEFEFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFE
+ FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFEFFFEFDFEFEFCFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDDADADAB4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+ FDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999DDDDDDFFFFFFFFFFFFFFFFFF
+ FFFFFF888888FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE555555888888FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE44
+ 4444888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ 777777888888EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEE
+ EE555555888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF444444BBBBBB333333666666DDDDDDFFFFFFFFFFFFDDDDDD666666DDDDDD
+ FFFFFF555555888888FFFFFFFFFFFF888888888888FFFFFFFFFFFF9999998888
+ 88FFFFFFFFFFFFFFFFFFFFFFFF99999911111100000000000000000000000088
+ 8888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFF
+ FF999999000000888888FFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFBBBBBB33
+ 3333CCCCCCFFFFFF888888444444888888FFFFFFFFFFFF444444444444222222
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD
+ DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFEEEEEE666666444444777777EEEEEEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFF
+ FFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFFEEEEEEBBBBBB
+ 999999888888999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFD
+ FEFEFCFEFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDE6E6E6B4B4B496BC43A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFDFBFDFEFCFEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF444444000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF999999222222333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAA111111666666FFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB666666111111BBBBBBFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999222222333333DDDDDDFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBEEEEEE8888882222
+ 22CCCCCC999999111111777777DDDDDDFFFFFFBBBBBB333333666666FFFFFF88
+ 8888888888EEEEEE333333222222999999FFFFFFFFFFFFFFFFFFFFFFFF111111
+ CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFF
+ DDDDDD333333444444EEEEEEDDDDDD888888111111CCCCCCCCCCCCBBBBBB0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFDDDDDDAAAAAA
+ 888888888888999999FFFFFFFFFFFFFFFFFFFFFFFF9999991111117777778888
+ 88333333111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF666666888888EEEEEE66
+ 6666777777FFFFFFEEEEEE888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF999999
+ 111111777777888888333333111111AAAAAAFFFFFFFFFFFFFFFFFFBBBBBB2222
+ 22FFFFFFFFFFFF999999111111444444777777888888999999FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFD
+ FDFBFDE6E6E6B4B4B49DC741A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+ FDFDFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFCCCCCCFFFFFF444444BBBBBBFFFFFFFFFFFFFFFFFF
+ FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE6666661111
+ 11DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFCCCCCC000000AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFEEEEEE666666111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEDD
+ DDDD444444BBBBBBFFFFFFCCCCCCBBBBBB222222333333EEEEEECCCCCCFFFFFF
+ FFFFFFEEEEEEFFFFFF888888CCCCCC888888888888BBBBBB777777EEEEEEEEEE
+ EEFFFFFFFFFFFFFFFFFFFFFFFF222222888888FFFFFF777777CCCCCCFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888882222224444444444
+ 44444444222222888888FFFFFFFFFFFFFFFFFFFFFFFF66666633333333333399
+ 9999999999222222EEEEEEFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFEEEEEE444444222222666666888888888888999999FFFFFFFFFFFFFF
+ FFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA111111AAAAAAFFFFFF
+ FFFFFFFFFFFF666666888888EEEEEEAAAAAA222222666666111111666666CCCC
+ CCFFFFFFFFFFFFFFFFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA11
+ 1111AAAAAAFFFFFFFFFFFFFFFFFF222222CCCCCCFFFFFFEEEEEEFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFDE6E6E6B4B4B496BC43A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB1111119999
+ 99444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333FFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666555555FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB111111EE
+ EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333
+ FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA444444444444BBBBBBFFFFFF1111114444
+ 44111111333333444444444444FFFFFFFFFFFF99999922222200000000000022
+ 2222222222444444444444333333888888FFFFFFFFFFFFFFFFFFFFFFFFCCCCCC
+ 333333888888333333BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFEEEEEE77
+ 7777EEEEEE888888666666BBBBBBBBBBBBBBBBBB666666888888FFFFFFFFFFFF
+ FFFFFFFFFFFFEEEEEE111111444444FFFFFFFFFFFF444444999999FFFFFF0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFEEEEEE888888FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFFEEEEEE66666644444433
+ 3333222222999999EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFF7777
+ 77888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFDFDFBFD
+ FBF9FBE6E6E6B4B4B49DC741A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFC
+ FDFBFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFCCCCCC111111222222888888BBBBBBBBBBBBBBBBBB
+ BBBBBB000000FFFFFFFFFFFFFFFFFFEEEEEEDDDDDDFFFFFFFFFFFFFFFFFFEEEE
+ EE222222888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFF888888222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+ DDDDDDFFFFFFFFFFFFFFFFFF555555999999FFFFFFFFFFFFFFFFFFEEEEEEDDDD
+ DDFFFFFFFFFFFFFFFFFFEEEEEE222222888888FFFFFFFFFFFFFFFFFFFFFFFF44
+ 4444111111666666AAAAAA444444FFFFFF444444BBBBBBFFFFFF444444FFFFFF
+ FFFFFFFFFFFFFFFFFFCCCCCC333333222222666666DDDDDD333333888888FFFF
+ FFFFFFFFFFFFFFEEEEEE666666DDDDDDFFFFFF888888111111444444999999EE
+ EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFEEEEEE5555553333337777772222224444444444
+ 44444444222222888888FFFFFFFFFFFFFFFFFFFFFFFF555555888888222222EE
+ EEEEFFFFFF999999555555FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFEEEEEEFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5E6E6E6B4B4B496BC43A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFDFCFDFDFCFDFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC
+ CC000000333333444444444444444444444444444444FFFFFFFFFFFFFFFFFFAA
+ AAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999222222FFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFDDDDDD000000DDDDDD999999888888FFFFFF88888855
+ 5555FFFFFFFFFFFFFFFFFFAAAAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999
+ 222222FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA000000444444DDDDDD1111114444
+ 44111111333333444444444444FFFFFFFFFFFFBBBBBBEEEEEE333333222222CC
+ CCCC888888333333DDDDDDEEEEEECCCCCCFFFFFFFFFFFFFFFFFF888888111111
+ 888888BBBBBB222222888888666666111111666666FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF888888000000666666BBBBBBBBBBBBBBBBBB666666888888FFFFFFFFFFFF
+ DDDDDD333333CCCCCCFFFFFF999999AAAAAA999999BBBBBB444444FFFFFF0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44444400000044444433
+ 3333111111444444444444777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF000000FFFFFFFFFFFF222222222222555555888888BBBBBBFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+ F5F3F5E6E6E6B4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFEFC
+ FEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888333333FFFFFFFFFFFFFFFF
+ FFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999777777
+ FFFFFF222222999999FFFFFFBBBBBB333333FFFFFFFFFFFFFFFFFFFFFFFF8888
+ 88333333FFFFFFFFFFFFFFFFFFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFF
+ FFFF111111BBBBBBEEEEEEDDDDDDBBBBBB333333888888CCCCCCFFFFFFFFFFFF
+ FFFFFF000000FFFFFFFFFFFFCCCCCC111111CCCCCCCCCCCCFFFFFFBBBBBB4444
+ 44FFFFFFFFFFFFFFFFFFFFFFFF999999000000777777888888FFFFFFFFFFFFFF
+ FFFFDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666660000000000000000
+ 00000000000000888888FFFFFFFFFFFFFFFFFF999999111111CCCCCCCCCCCC11
+ 1111888888888888333333BBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB333333BBBBBBBBBBBBCCCCCCFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333CCCCCCFFFFFFFFFFFFCCCCCC
+ AAAAAA888888CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFDFCFDF6F4F6F5F3F5DADADAB4B4B49DC741A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFEFCFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEBBBBBBBBBB
+ BBAAAAAA111111BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFFF
+ FFFFFFFFFF444444555555888888888888888888222222888888FFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE999999FFFFFFFFFFFFDDDDDDCC
+ CCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444555555888888888888888888
+ 222222888888FFFFFFFFFFFFCCCCCC4444441111113333331111113333337777
+ 77888888888888555555222222CCCCCCFFFFFF44444444444444444444444422
+ 2222222222444444444444444444777777FFFFFFFFFFFFFFFFFFBBBBBBBBBBBB
+ 666666777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFEEEEEE111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFAAAAAACCCCCCCCCCCC999999CCCCCC3333331111114444444444
+ 44FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888555555FFFFFFFFFFFF666666888888888888
+ 888888888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBBBBBBB88
+ 8888333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666662222
+ 22000000222222444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+ F5F3F5E6E6E6B4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFC
+ FDFCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFCCCCCC444444444444444444111111333333444444444444
+ 444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB0000008888888888
+ 88888888777777EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFBBBBBB000000888888888888888888777777EEEEEEFFFFFFFFFFFFEEEEEEBB
+ BBBB333333888888DDDDDD777777333333EEEEEE999999222222BBBBBBFFFFFF
+ FFFFFFBBBBBB888888888888888888444444444444888888888888888888BBBB
+ BBFFFFFFFFFFFFFFFFFF44444444444444444400000022222200000033333399
+ 9999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000
+ 00000000000000000000000000BBBBBBBBBBBB00000000000000000000000000
+ 0000444444BBBBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD
+ DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB4444
+ 44FFFFFFFFFFFF999999888888888888888888888888DDDDDDFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFBBBBBB8888887777774444443333331111114444444444441111118888
+ 88FFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888BBBBBBCCCCCCFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5DADADAB9B9B99DC741A3E11DA3
+ E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFAF8FAFEFEFEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFF888888777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFDDDDDD888888DDDDDDFFFFFFFFFFFFCCCCCC444444FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFF8888
+ 88333333666666EEEEEEFFFFFFFFFFFFFFFFFFBBBBBB88888888888888888844
+ 4444444444888888888888888888BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFF555555999999FFFFFFEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888666666BBBBBBBBBBBBFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFF888888666666FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFFBBBBBB444444FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFDDDDDD555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
+ BBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF999999555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F6F7F5F3F5
+ F5F3F5E6E6E6C0C0C0A3CD47A3E11DA3E11DA3E11DA3E11DBFE45EFDFBFDFDFB
+ FDF7F6F7FCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC999999FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDEEEEEEFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFDDDDDDEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF999999DDDDDDFFFFFFFFFFFFFFFFFF666666EEEEEEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999999999FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAAAAAAAAFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+ 444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777BBBBBBFF
+ FFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFAF8FAF6F4F6F5F3F5F5F3F5E6E6E6B1DB56A8D34DA3E11DA3
+ E11DA7DF25A3E11DADDE32C9EC7BFDFBFDFBF9FBF8F6F8FCFBFCFFFEFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAF8FAF6F4F6F5F3F5F5F3F5
+ F5F3F5EDEBEDB1DB56A3E11DA3E11DB0DF3ABBE255A3E11DA3E11DC9EC7BC9EC
+ 7BFDFBFDFBF9FBF7F6F7FAF9FAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+ FFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFCFDFCFBFCFC
+ FBFCFCFBFCFDFCFDFDFCFDFDFCFDFDFCFDFCFCFCFCFBFCFCFBFCFBFAFBFBFAFB
+ FAF9FAF9F8F9F9F8F9F9F7F9F9F7F9F9F8F9FAF8FAFAF9FAFAFAFAFBFAFBFBFA
+ FBFBFAFBFCFBFCFCFCFCFDFCFDFDFDFDFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFF
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFFFE
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFDFDFDFDFDFDFDFDFDFEFDFE
+ FEFDFEFDFDFDFDFCFDFCFBFCFBFAFBFBFAFBFCFBFCFDFCFDFDFDFDFCFCFCFAF9
+ FAF7F6F7F6F4F6F5F3F5F5F3F5F5F3F5F5F3F5C2E86FB1DF41A3E11DA3E11DC9
+ EC7BC9EC7BA4E01FA3E11DA3E11DC6EA72C9EC7BFDFBFDFDFBFDFDFBFDFDFCFD
+ FEFCFEFEFDFEFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFD
+ FCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFD
+ FDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFCFDFDFCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFDFDFC
+ FDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFCFE
+ FEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFDFEFEFDFEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFDFBFDFDFBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFEFD
+ FEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFE
+ FCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFD
+ FDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFC
+ FDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ C7EB78BCE258A3E11DA3E11DACDE30C9EC7BFDFBFDC3E86CA4E01FA3E11DA3E1
+ 1DB0DE3BC3E86CC9EC7BC9EC7BC8EC7BC9EC7BC9EC7BC9ED7BC9EC7CC9EC7CC9
+ EC7CC9EC7BC9EC7BC9EC7BC9EC7CC9EC7BC9EC7CC9EC7BC8EC7AC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC8EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC8EC7AC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC8EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+ EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+ C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+ 7BC9EC7BC9EC7BC9EC7BC9EC7BC2E766A7DF25A3E11DA3E11DA7DF25C9EC7BFD
+ FBFDFDFBFDFDFBFDC3E86CA4E01FA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA9DF2AC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDC9EC7BB9E2
+ 50A7DF25A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+ E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+ A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+ 1DA3E11DA3E11DA3E11DA3E11DA3E11DA7DF25C2E766C9EC7BFDFBFDFDFBFDFD
+ FBFD}
+ Visible = False
+ end
+ object DisableBmp: TImage
+ Left = 0
+ Top = 24
+ Width = 241
+ Height = 25
+ Picture.Data = {
+ 07544269746D617056490000424D56490000000000003600000028000000F000
+ 00001A000000010018000000000020490000C30E0000C30E0000000000000000
+ 0000FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF1CFCDEAAEA4E9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DEAAEA4
+ EFC5C2FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFBF3F3EBBAB6E89B
+ 96E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE2928DE38E8AE38E8AE38E8AE9958DEAA39EEFC5C2FDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDEBBAB6E9958DE9958DCD8F898181815959594C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C6A5654
+ C2837DE2928DE9958DEBBAB6FDFBFDFDFBFDFDFBFDEBBAB6E9958DE9958DA2A2
+ A28F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+ 8F8F8F8F8F8F8F8F8F8F7272725959594C4C4C6A5654E38E8AE9958DF0CCC3FD
+ FBFDFBF1EFE39592E9958DCFCFCFB9B9B9C0C0C0CFCFCFCFCFCFDADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADBDBDBDCDCDCDDDDDDDDDD
+ DDDDDDDDDBDBDBDADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+ DADADADADADADADADADADADADADADADADADADADADADADACFCFCFC0C0C0A2A2A2
+ 8181814C4C4C6A5654E9958DEAA39EFDFBFDEBBAB6E9958DEBBAB6EDEBEDE6E6
+ E6EDEBEDF5F3F5FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFD
+ FEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFCFDFEFCFEFEFDFEFEFEFEFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDF5F3F5E6E6E6C0C0C0818181595959C2837DE9958DF3
+ D4CBEAA39EE9958DFBEBE9FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFEFFFFFEFFFEFEFEFEFDFEFEFCFEFEFC
+ FEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FEFFFFFEFFFEFEFEFEFDFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFEFEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFDFEFEFEFE
+ FFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFEFCFEFEFCFEFEFCFEFEFC
+ FEFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFC
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFE
+ FEFDFEFEFDFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFCFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ E6E6E6B4B4B4818181727272E9958DEBAFABE9958DE9958DFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+ FFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFEFCFEFF
+ FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFDFEFEFDFEFEFD
+ FEFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+ FFFEFFFFFEFFFEFEFEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFEFFFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFEFCFEFEFDFEFFFEFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFEFCFEFEFDFEFCFC
+ FCFBFBFBFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFA
+ FAFAFCFCFCFEFEFEFCFCFCFDFCFDFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF5F3F5CFCFCF8F8F8F727272E9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFEFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFEFFFEFEFEFEFEFE
+ FEFEFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFE
+ FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFEFFFEFDFEFEFCFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDDADADAB4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999DDDDDDFFFFFFFFFFFFFFFFFF
+ FFFFFF888888FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE555555888888FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE44
+ 4444888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ 777777888888EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEE
+ EE555555888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF444444BBBBBB333333666666DDDDDDFFFFFFFFFFFFDDDDDD666666DDDDDD
+ FFFFFF555555888888FFFFFFFFFFFF888888888888FFFFFFFFFFFF9999998888
+ 88FFFFFFFFFFFFFFFFFFFFFFFF99999911111100000000000000000000000088
+ 8888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777CCCCCCFFFFFF999999999999FFFF
+ FF777777FFFFFFEEEEEE999999FFFFFFDDDDDD888888FFFFFFFFFFFFBBBBBB33
+ 3333CCCCCCFFFFFF888888444444888888FFFFFFFFFFFF444444444444222222
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD
+ DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFEEEEEE666666444444777777EEEEEEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFF
+ FFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFFEEEEEEBBBBBB
+ 999999888888999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFD
+ FEFEFCFEFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDE6E6E6B4B4B4818181E9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF444444000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF999999222222333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAA111111666666FFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB666666111111BBBBBBFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999222222333333DDDDDDFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBEEEEEE8888882222
+ 22CCCCCC999999111111777777DDDDDDFFFFFFBBBBBB333333666666FFFFFF88
+ 8888888888EEEEEE333333222222999999FFFFFFFFFFFFFFFFFFFFFFFF111111
+ CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
+ 8888333333FFFFFF888888888888CCCCCC222222FFFFFF666666555555FFFFFF
+ DDDDDD333333444444EEEEEEDDDDDD888888111111CCCCCCCCCCCCBBBBBB0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFDDDDDDAAAAAA
+ 888888888888999999FFFFFFFFFFFFFFFFFFFFFFFF9999991111117777778888
+ 88333333111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF666666888888EEEEEE66
+ 6666777777FFFFFFEEEEEE888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF999999
+ 111111777777888888333333111111AAAAAAFFFFFFFFFFFFFFFFFFBBBBBB2222
+ 22FFFFFFFFFFFF999999111111444444777777888888999999FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFD
+ FDFBFDE6E6E6B4B4B48F8F8FE9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFB
+ FDFDFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFCCCCCCFFFFFF444444BBBBBBFFFFFFFFFFFFFFFFFF
+ FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE6666661111
+ 11DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFCCCCCC000000AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFEEEEEE666666111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEDD
+ DDDD444444BBBBBBFFFFFFCCCCCCBBBBBB222222333333EEEEEECCCCCCFFFFFF
+ FFFFFFEEEEEEFFFFFF888888CCCCCC888888888888BBBBBB777777EEEEEEEEEE
+ EEFFFFFFFFFFFFFFFFFFFFFFFF222222888888FFFFFF777777CCCCCCFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444AAAAAA444444AAAAAAAAAA
+ AA777777BBBBBB333333EEEEEEFFFFFFFFFFFFFFFFFF66666633333333333399
+ 9999999999222222EEEEEEFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFEEEEEE444444222222666666888888888888999999FFFFFFFFFFFFFF
+ FFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA111111AAAAAAFFFFFF
+ FFFFFFFFFFFF666666888888EEEEEEAAAAAA222222666666111111666666CCCC
+ CCFFFFFFFFFFFFFFFFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA11
+ 1111AAAAAAFFFFFFFFFFFFFFFFFF222222CCCCCCFFFFFFEEEEEEFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFDE6E6E6B4B4B4818181E9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB1111119999
+ 99444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333FFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666555555FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB111111EE
+ EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333
+ FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA444444444444BBBBBBFFFFFF1111114444
+ 44111111333333444444444444FFFFFFFFFFFF99999922222200000000000022
+ 2222222222444444444444333333888888FFFFFFFFFFFFFFFFFFFFFFFFCCCCCC
+ 333333888888333333BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFF44
+ 4444444444444444444444444444444444444444444444444444444444FFFFFF
+ FFFFFFFFFFFFEEEEEE111111444444FFFFFFFFFFFF444444999999FFFFFF0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFEEEEEE888888FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFFEEEEEE66666644444433
+ 3333222222999999EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFF7777
+ 77888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFDFDFBFD
+ FBF9FBE6E6E6B4B4B48F8F8FE9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFC
+ FDFBFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFCCCCCC111111222222888888BBBBBBBBBBBBBBBBBB
+ BBBBBB000000FFFFFFFFFFFFFFFFFFEEEEEEDDDDDDFFFFFFFFFFFFFFFFFFEEEE
+ EE222222888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFF888888222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+ DDDDDDFFFFFFFFFFFFFFFFFF555555999999FFFFFFFFFFFFFFFFFFEEEEEEDDDD
+ DDFFFFFFFFFFFFFFFFFFEEEEEE222222888888FFFFFFFFFFFFFFFFFFFFFFFF44
+ 4444111111666666AAAAAA444444FFFFFF444444BBBBBBFFFFFF444444FFFFFF
+ FFFFFFFFFFFFFFFFFFCCCCCC333333222222666666DDDDDD333333888888FFFF
+ FFFFFFFFFFFFFFEEEEEE666666DDDDDDFFFFFF888888111111444444999999EE
+ EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB8888883333338888883333338888
+ 88333333666666666666BBBBBBFFFFFFFFFFFFFFFFFF555555888888222222EE
+ EEEEFFFFFF999999555555FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFEEEEEEFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5E6E6E6B4B4B4818181E9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFDFCFDFDFCFDFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC
+ CC000000333333444444444444444444444444444444FFFFFFFFFFFFFFFFFFAA
+ AAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999222222FFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFDDDDDD000000DDDDDD999999888888FFFFFF88888855
+ 5555FFFFFFFFFFFFFFFFFFAAAAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999
+ 222222FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA000000444444DDDDDD1111114444
+ 44111111333333444444444444FFFFFFFFFFFFBBBBBBEEEEEE333333222222CC
+ CCCC888888333333DDDDDDEEEEEECCCCCCFFFFFFFFFFFFFFFFFF888888111111
+ 888888BBBBBB222222888888666666111111666666FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFEEEEEEBB
+ BBBB888888333333888888333333888888333333666666666666BBBBBBEEEEEE
+ DDDDDD333333CCCCCCFFFFFF999999AAAAAA999999BBBBBB444444FFFFFF0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44444400000044444433
+ 3333111111444444444444777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF000000FFFFFFFFFFFF222222222222555555888888BBBBBBFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+ F5F3F5E6E6E6B4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFEFC
+ FEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888333333FFFFFFFFFFFFFFFF
+ FFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999777777
+ FFFFFF222222999999FFFFFFBBBBBB333333FFFFFFFFFFFFFFFFFFFFFFFF8888
+ 88333333FFFFFFFFFFFFFFFFFFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFF
+ FFFF111111BBBBBBEEEEEEDDDDDDBBBBBB333333888888CCCCCCFFFFFFFFFFFF
+ FFFFFF000000FFFFFFFFFFFFCCCCCC111111CCCCCCCCCCCCFFFFFFBBBBBB4444
+ 44FFFFFFFFFFFFFFFFFFFFFFFF999999000000777777888888FFFFFFFFFFFFFF
+ FFFFDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFCCCCCC4444443333331111113333331111113333
+ 33111111222222222222444444CCCCCCFFFFFF999999111111CCCCCCCCCCCC11
+ 1111888888888888333333BBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+ 88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB333333BBBBBBBBBBBBCCCCCCFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333CCCCCCFFFFFFFFFFFFCCCCCC
+ AAAAAA888888CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFDFCFDF6F4F6F5F3F5DADADAB4B4B48F8F8FE9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFEFCFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEBBBBBBBBBB
+ BBAAAAAA111111BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFFF
+ FFFFFFFFFF444444555555888888888888888888222222888888FFFFFFFFFFFF
+ FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE999999FFFFFFFFFFFFDDDDDDCC
+ CCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444555555888888888888888888
+ 222222888888FFFFFFFFFFFFCCCCCC4444441111113333331111113333337777
+ 77888888888888555555222222CCCCCCFFFFFF44444444444444444444444422
+ 2222222222444444444444444444777777FFFFFFFFFFFFFFFFFFBBBBBBBBBBBB
+ 666666777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFF66
+ 6666999999444444BBBBBB444444BBBBBB444444888888888888FFFFFFFFFFFF
+ FFFFFFFFFFFFAAAAAACCCCCCCCCCCC999999CCCCCC3333331111114444444444
+ 44FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFF888888555555FFFFFFFFFFFF666666888888888888
+ 888888888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBBBBBBB88
+ 8888333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666662222
+ 22000000222222444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+ F5F3F5E6E6E6B4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFC
+ FDFCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFCCCCCC444444444444444444111111333333444444444444
+ 444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB0000008888888888
+ 88888888777777EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+ FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFBBBBBB000000888888888888888888777777EEEEEEFFFFFFFFFFFFEEEEEEBB
+ BBBB333333888888DDDDDD777777333333EEEEEE999999222222BBBBBBFFFFFF
+ FFFFFFBBBBBB888888888888888888444444444444888888888888888888BBBB
+ BBFFFFFFFFFFFFFFFFFF44444444444444444400000022222200000033333399
+ 9999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+ 888888FFFFFFFFFFFFFFFFFFFFFFFF9999991111111111113333331111113333
+ 33111111222222222222999999FFFFFFBBBBBB00000000000000000000000000
+ 0000444444BBBBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD
+ DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB4444
+ 44FFFFFFFFFFFF999999888888888888888888888888DDDDDDFFFFFFFFFFFFFF
+ FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFBBBBBB8888887777774444443333331111114444444444441111118888
+ 88FFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888BBBBBBCCCCCCFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5DADADAB9B9B98F8F8FE9958DE9
+ 958DE9958DE9958DFDFBFDFDFBFDFDFBFDFAF8FAFEFEFEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFF888888777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFDDDDDD888888DDDDDDFFFFFFFFFFFFCCCCCC444444FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFF8888
+ 88333333666666EEEEEEFFFFFFFFFFFFFFFFFFBBBBBB88888888888888888844
+ 4444444444888888888888888888BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFF555555999999FFFFFFEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFF888888666666BBBBBBBBBBBBFFFFFFFFFFFFFF
+ FFFF777777555555BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDDDFFFFFF
+ FFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFFBBBBBB444444FFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFDDDDDD555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
+ BBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+ BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FF999999555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F6F7F5F3F5
+ F5F3F5E6E6E6C0C0C0A2A2A2E9958DE9958DEAA39EE9958DFBEBE9FDFBFDFDFB
+ FDF7F6F7FCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC999999FFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDEEEEEEFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFDDDDDDEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF999999DDDDDDFFFFFFFFFFFFFFFFFF666666EEEEEEFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999999999FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAAAAAAAAFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+ 444444444444444444FFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777BBBBBBFF
+ FFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFAF8FAF6F4F6F5F3F5F5F3F5E6E6E6CFCFCFB4B4B4E9958DEB
+ AFABEBBAB6E9958DF0CCC3FDFBFDFDFBFDFBF9FBF8F6F8FCFBFCFFFEFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAF8FAF6F4F6F5F3F5F5F3F5
+ F5F3F5EDEBEDCFCFCFE5A39DE9958DF3D4CBF7E6E2E9958DE9958DFDFBFDFDFB
+ FDFDFBFDFBF9FBF7F6F7FAF9FAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+ FFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFCFDFCFBFCFC
+ FBFCFCFBFCFDFCFDFDFCFDFDFCFDFDFCFDFCFCFCFCFBFCFCFBFCFBFAFBFBFAFB
+ FAF9FAF9F8F9F9F8F9F9F7F9F9F7F9F9F8F9FAF8FAFAF9FAFAFAFAFBFAFBFBFA
+ FBFBFAFBFCFBFCFCFCFCFDFCFDFDFDFDFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFF
+ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFFFE
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFDFDFDFDFDFDFDFDFDFEFDFE
+ FEFDFEFDFDFDFDFCFDFCFBFCFBFAFBFBFAFBFCFBFCFDFCFDFDFDFDFCFCFCFAF9
+ FAF7F6F7F6F4F6F5F3F5F5F3F5F5F3F5F5F3F5F5F3F5E9D5D3E9958DEAA39EFD
+ FBFDFDFBFDEAB3AEE9958DEAA39EFDF9F7FDFBFDFDFBFDFDFBFDFDFBFDFDFCFD
+ FEFCFEFEFDFEFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+ FEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFD
+ FCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFD
+ FDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFCFDFDFCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFDFDFC
+ FDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFD
+ FCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFE
+ FEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFDFEFEFDFEFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFEFD
+ FEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFE
+ FCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFD
+ FDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFC
+ FDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FBF9FBF9E5E4E89B96E9958DEFC5C2FDFBFDFDFBFDFBF3F3EAB3AEE9958DE995
+ 8DF1CFCDFBF3F3FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+ FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+ FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+ FDFDFBFDFDFBFDFDFBFDFDFBFDFBF1EFEBBAB6E9958DE9958DEBBAB6FDFBFDFD
+ FBFDFDFBFDFDFBFDFBF3F3EAB3AEE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE39592EEC5BBFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF7E3
+ DEEBBAB6E79E9BE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+ 958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+ E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+ 8DE9958DE9958DE9958DE9958DE79E9BEBBAB6FBF1EFFDFBFDFDFBFDFDFBFDFD
+ FBFD}
+ Visible = False
+ end
+end
--- /dev/null
+//---------------------------------------------------------------------------
+
+#ifndef NotifyH
+#define NotifyH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+//---------------------------------------------------------------------------
+class TNotifyForm : public TForm
+{
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TImage *EnableBmp;
+ TImage *DisableBmp;
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X,
+ int Y);
+ void __fastcall FormDestroy(TObject *Sender);
+private: // \83\86\81[\83U\81[\90é\8c¾
+ HRGN hRgn;
+public: // \83\86\81[\83U\81[\90é\8c¾
+ bool enable;
+ __fastcall TNotifyForm(TComponent* Owner);
+ void Setup();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TNotifyForm *NotifyForm;
+//---------------------------------------------------------------------------
+#endif
+
--- /dev/null
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "OCRTextFrm.h"
+#include "Util.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "TntStdCtrls"
+#pragma link "TntStdCtrls"
+#pragma resource "*.dfm"
+TOCRTextForm *OCRTextForm;
+const char *sOCRText = "OCRText";
+//---------------------------------------------------------------------------
+__fastcall TOCRTextForm::TOCRTextForm(TComponent* Owner)
+ : TForm(Owner)
+{
+ VCL_SIZEABLE();
+}
+//---------------------------------------------------------------------------
+void __fastcall TOCRTextForm::FormShow(TObject *Sender)
+{
+ LoadForm(sOCRText, this, NULL);
+}
+//---------------------------------------------------------------------------
+void __fastcall TOCRTextForm::FormCloseQuery(TObject *Sender,
+ bool &CanClose)
+{
+ SaveForm(sOCRText, this, NULL);
+}
+//---------------------------------------------------------------------------
+void TOCRTextForm::SetText(const wchar_t *text)
+{
+ int wlen = wcslen(text);
+ char *buf = new char[wlen*2+1];
+ if (!buf) return;
+ BOOL defchar = FALSE;
+ WideCharToMultiByte( CP_ACP, 0,
+ text, wlen,
+ buf, wlen*2+1, 0, &defchar );
+ memo->Text = buf;
+ delete[] buf;
+}
+
+
--- /dev/null
+object OCRTextForm: TOCRTextForm
+ Left = 192
+ Top = 133
+ BorderStyle = bsDialog
+ Caption = '\94F\8e¯\83e\83L\83X\83g'
+ ClientHeight = 343
+ ClientWidth = 567
+ Color = clBtnFace
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCloseQuery = FormCloseQuery
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 12
+ object memo: TMemo
+ Left = 0
+ Top = 0
+ Width = 567
+ Height = 343
+ Align = alClient
+ TabOrder = 0
+ end
+end
--- /dev/null
+//---------------------------------------------------------------------------
+
+#ifndef OCRTextFrmH
+#define OCRTextFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+//---------------------------------------------------------------------------
+class TOCRTextForm : public TForm
+{
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TMemo *memo;
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+private: // \83\86\81[\83U\81[\90é\8c¾
+public: // \83\86\81[\83U\81[\90é\8c¾
+ __fastcall TOCRTextForm(TComponent* Owner);
+ void SetText(const wchar_t *text);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TOCRTextForm *OCRTextForm;
+//---------------------------------------------------------------------------
+#endif
+
--- /dev/null
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "PopupConfig.h"
+#include "Util.h"
+#include "prgprof.h"
+#include "../DCHook/DCHook.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TPopupConfigDlg *PopupConfigDlg;
+//---------------------------------------------------------------------------
+__fastcall TPopupConfigDlg::TPopupConfigDlg(TComponent* Owner)
+ : TForm(Owner)
+{
+ MODIAvail = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbGroupOpenClick(TObject *Sender)
+{
+ bool f = cbGroupOpen->Checked;
+ edGroupName->Enabled = f;
+ lbGroupName->Enabled = f;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::FormShow(TObject *Sender)
+{
+#if USE_DDE
+ cbGroupOpenClick( this );
+
+ // Add groups to combo-box //
+ TAppIni ini;
+ if ( !ini.hroot ){
+ return;
+ }
+
+ ini.ReadValues( PFS_GROUP, edGroupName->Items );
+
+ if (!cbGroupOpen->Checked ){
+ int sel = ini.ReadInteger( PFS_COMMON, PFS_GRPSEL, -1 );
+ edGroupName->ItemIndex = sel;
+ }
+#else // !USE_DDE
+ // WM_COPYDATA\82Ì\8fê\8d\87\82Í\81A\8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82Í\82Å\82«\82È\82¢
+ cbGroupOpen->Enabled = false;
+ lbGroupName->Enabled = false;
+ edGroupName->Enabled = false;
+ lb1->Enabled = false;
+ lb2->Enabled = false;
+#endif
+ if (fWow64)
+ cbUse64->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::FormCloseQuery(TObject *Sender,
+ bool &CanClose)
+{
+ if (ModalResult!=mrOk) return;
+
+ if (cbToggleKey->ItemIndex != 0){
+ if (cbToggleKey->ItemIndex-1 == cbPopupKey->ItemIndex){
+ // \93¯\82¶\83L\81[\82Í\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢
+ Application->MessageBox("\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Æ\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF\82Í\93¯\82¶\83L\81[\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82Ü\82¹\82ñ",Caption.c_str(),MB_OK);
+ CanClose = false;
+ return;
+ }
+ }
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbCaptureModeChange(TObject *Sender)
+{
+ bool f = cbCaptureMode->ItemIndex != 2;
+#if 0
+ lbScaling->Enabled = f;
+ lbScaleNormal->Enabled = f;
+ tbScaling->Enabled = f;
+ lbScaleMax->Enabled = f;
+#endif
+ lbAMODIPath->Enabled = f;
+ edAMODIPath->Enabled = f;
+ btnBrowse->Enabled = f;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::btnHelpClick(TObject *Sender)
+{
+ ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::actHelpExecute(TObject *Sender)
+{
+ ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::lbDebugDblClick(TObject *Sender)
+{
+ miShowAMODI->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::miShowAMODIClick(TObject *Sender)
+{
+ ShowAMODI();
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbDPISettingClick(TObject *Sender)
+{
+ bool setting = cbDPISetting->Checked;
+ lbScaling->Enabled = setting;
+ lbScaleNormal->Enabled = setting;
+ tbScaling->Enabled = setting;
+}
+//---------------------------------------------------------------------------
+/*
+Ctrl+\89E\83N\83\8a\83b\83N
+Shift+\89E\83N\83\8a\83b\83N
+Alt+\89E\83N\83\8a\83b\83N
+Ctrl+Shift+\89E\83N\83\8a\83b\83N
+Ctrl+Alt+\89E\83N\83\8a\83b\83N
+Shift+Alt+\89E\83N\83\8a\83b\83N
+Ctrl+\8d¶\83N\83\8a\83b\83N
+Shift+\8d¶\83N\83\8a\83b\83N
+Alt+\8d¶\83N\83\8a\83b\83N
+Ctrl+Shift+\8d¶\83N\83\8a\83b\83N
+Ctrl+Alt+\8d¶\83N\83\8a\83b\83N
+Shift+Alt+\8d¶\83N\83\8a\83b\83N
+\8d¶\83N\83\8a\83b\83N+\89E\83N\83\8a\83b\83N\81¨\8bp\89º
+*/
+int KeyCombTable[] = {
+ KF_CONTROL,
+ KF_SHIFT,
+ KF_MENU,
+ KF_CONTROL + KF_SHIFT,
+ KF_CONTROL + KF_MENU,
+ KF_SHIFT + KF_MENU,
+ KF_CONTROL + KF_LEFTCLICK,
+ KF_SHIFT + KF_LEFTCLICK,
+ KF_MENU + KF_LEFTCLICK,
+ KF_CONTROL + KF_SHIFT + KF_LEFTCLICK,
+ KF_CONTROL + KF_MENU + KF_LEFTCLICK,
+ KF_SHIFT + KF_MENU + KF_LEFTCLICK,
+ KF_MIDCLICK,
+ KF_CONTROL + KF_MIDCLICK,
+ KF_SHIFT + KF_MIDCLICK,
+ KF_MENU + KF_MIDCLICK,
+ KF_CONTROL + KF_SHIFT + KF_MIDCLICK,
+ KF_CONTROL + KF_MENU + KF_MIDCLICK,
+ KF_SHIFT + KF_MENU + KF_MIDCLICK,
+ //KF_LRCLICK,
+ 0
+};
+// key combination -> index
+int KeyCombToIndex( int keycomb )
+{
+ int i;
+ for (i=0;KeyCombTable[i];i++){
+ if (keycomb == KeyCombTable[i])
+ return i;
+ }
+ return -1;
+}
+int IndexToKeyComb( int index )
+{
+ if (index < 0)
+ return 0;
+ return KeyCombTable[index];
+}
+void TPopupConfigDlg::SetPopupKey( int keycomb )
+{
+ cbPopupKey->ItemIndex = KeyCombToIndex( keycomb );
+}
+int TPopupConfigDlg::GetPopupKey( )
+{
+ return IndexToKeyComb( cbPopupKey->ItemIndex );
+}
+void TPopupConfigDlg::SetToggleKey( int keycomb )
+{
+ cbToggleKey->ItemIndex = KeyCombToIndex( keycomb )+1;
+}
+int TPopupConfigDlg::GetToggleKey( )
+{
+ return IndexToKeyComb( cbToggleKey->ItemIndex-1 );
+}
+
+void TPopupConfigDlg::SetDPIDetect(bool dpi_detect)
+{
+ cbDPISetting->Checked = !dpi_detect;
+}
+bool TPopupConfigDlg::GetDPIDetect()
+{
+ return !cbDPISetting->Checked;
+}
+void TPopupConfigDlg::SetScaler(int scale)
+{
+ if (scale<120){
+ tbScaling->Position = 0;
+ } else
+ if (scale<144){
+ tbScaling->Position = 1;
+ } else {
+ tbScaling->Position = 2;
+ }
+}
+int TPopupConfigDlg::GetScaler()
+{
+ switch (tbScaling->Position){
+ default: return 0;
+ case 1: return 120;
+ case 2: return 144;
+ }
+}
+
+void TPopupConfigDlg::SetCaptureMode(int mode)
+{
+ switch (mode){
+ case CM_TEXT | CM_IMAGE: cbCaptureMode->ItemIndex = 0; break;
+ case CM_IMAGE: cbCaptureMode->ItemIndex = 1; break;
+ case CM_TEXT: cbCaptureMode->ItemIndex = 2; break;
+ }
+}
+int TPopupConfigDlg::GetCaptureMode()
+{
+ switch (cbCaptureMode->ItemIndex){
+ default: case 0: return CM_TEXT | CM_IMAGE;
+ case 1: return CM_IMAGE;
+ case 2: return CM_TEXT;
+ }
+}
+
--- /dev/null
+object PopupConfigDlg: TPopupConfigDlg
+ Left = 414
+ Top = 142
+ BorderStyle = bsDialog
+ Caption = '\82Ç\82±\83|\83b\83v\82Ì\90Ý\92è'
+ ClientHeight = 419
+ ClientWidth = 306
+ Color = clBtnFace
+ Font.Charset = SHIFTJIS_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = '\82l\82r \82o\83S\83V\83b\83N'
+ Font.Style = []
+ OldCreateOrder = False
+ PopupMenu = pmDebugMenu
+ Position = poScreenCenter
+ OnCloseQuery = FormCloseQuery
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 12
+ object lb1: TLabel
+ Left = 40
+ Top = 54
+ Width = 240
+ Height = 12
+ Caption = '\8ew\92è\82µ\82È\82¢\8fê\8d\87\82Í\81APDIC\96{\91Ì\82ª\8c»\8dÝ\8aJ\82¢\82Ä\82¢\82é'
+ end
+ object lb2: TLabel
+ Left = 40
+ Top = 70
+ Width = 136
+ Height = 12
+ Caption = '\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·'
+ end
+ object lbGroupName: TLabel
+ Left = 40
+ Top = 91
+ Width = 87
+ Height = 12
+ Caption = '\8e«\8f\91¸ÞÙ°Ìß\96¼(&N)'
+ end
+ object Label1: TLabel
+ Left = 24
+ Top = 120
+ Width = 107
+ Height = 12
+ Caption = '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ(&P)\81F'
+ FocusControl = cbPopupKey
+ end
+ object Label2: TLabel
+ Left = 24
+ Top = 144
+ Width = 122
+ Height = 12
+ Caption = '\89E¸Ø¯¸\8c\9f\8dõON/OFF(&R):'
+ FocusControl = cbToggleKey
+ end
+ object lbAMODIPath: TLabel
+ Left = 27
+ Top = 302
+ Width = 139
+ Height = 12
+ Caption = 'AM&ODI\82Ì\8fê\8f\8a(\8fã\8b\89\8eÒ\8cü\82¯)'
+ Enabled = False
+ FocusControl = edAMODIPath
+ end
+ object lbScaling: TLabel
+ Left = 40
+ Top = 386
+ Width = 53
+ Height = 12
+ Caption = '\8ag\91å\97¦(&M)'
+ Enabled = False
+ FocusControl = tbScaling
+ Visible = False
+ end
+ object lbScaleNormal: TLabel
+ Left = 117
+ Top = 387
+ Width = 24
+ Height = 12
+ Caption = '\95W\8f\80'
+ Enabled = False
+ Visible = False
+ end
+ object lbScaleMax: TLabel
+ Left = 319
+ Top = 366
+ Width = 24
+ Height = 12
+ Caption = '\8dÅ\91å'
+ Visible = False
+ end
+ object lbDebug: TLabel
+ Left = 264
+ Top = 8
+ Width = 20
+ Height = 12
+ Caption = ' '
+ OnDblClick = lbDebugDblClick
+ end
+ object cbGroupOpen: TCheckBox
+ Left = 24
+ Top = 32
+ Width = 249
+ Height = 17
+ Caption = '\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é(&G)'
+ TabOrder = 1
+ OnClick = cbGroupOpenClick
+ end
+ object cbCtrlClose: TCheckBox
+ Left = 24
+ Top = 224
+ Width = 233
+ Height = 17
+ Caption = 'Ctrl\83L\81[\82ð\97£\82µ\82½\82çÎ߯Ìß±¯Ìß\82ð\95Â\82¶\82é(&C)'
+ TabOrder = 6
+ Visible = False
+ end
+ object btnOK: TButton
+ Left = 12
+ Top = 379
+ Width = 75
+ Height = 25
+ Caption = 'OK'
+ Default = True
+ ModalResult = 1
+ TabOrder = 14
+ end
+ object btnCancel: TButton
+ Left = 112
+ Top = 379
+ Width = 75
+ Height = 25
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 15
+ end
+ object edGroupName: TComboBox
+ Left = 136
+ Top = 88
+ Width = 145
+ Height = 20
+ ItemHeight = 12
+ TabOrder = 2
+ end
+ object cbBanner: TCheckBox
+ Left = 24
+ Top = 8
+ Width = 225
+ Height = 17
+ Caption = '\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é(&B)'
+ Checked = True
+ State = cbChecked
+ TabOrder = 0
+ end
+ object Memo1: TMemo
+ Left = 32
+ Top = 168
+ Width = 257
+ Height = 49
+ TabStop = False
+ Alignment = taCenter
+ BorderStyle = bsNone
+ Color = clBtnFace
+ Lines.Strings = (
+ '\81¦"\89E¸Ø¯¸\8c\9f\8dõ"\82Æ\82Í\81A\83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å'
+ '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\8b@\94\\82Å\82·'
+ '\81¦\91g\82Ý\8d\87\82í\82¹\82É\82æ\82Á\82Ä\82Í\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Æ'
+ '\8b£\8d\87\82µ\82Ä\82µ\82Ü\82¤\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B')
+ ReadOnly = True
+ TabOrder = 5
+ end
+ object cbPopupKey: TComboBox
+ Left = 152
+ Top = 115
+ Width = 130
+ Height = 20
+ Style = csDropDownList
+ ItemHeight = 12
+ TabOrder = 3
+ Items.Strings = (
+ 'Ctrl+\89E\83N\83\8a\83b\83N'
+ 'Shift+\89E\83N\83\8a\83b\83N'
+ 'Alt+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+Shift+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+Alt+\89E\83N\83\8a\83b\83N'
+ 'Shift+Alt+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+\8d¶\83N\83\8a\83b\83N'
+ 'Shift+\8d¶\83N\83\8a\83b\83N'
+ 'Alt+\8d¶\83N\83\8a\83b\83N'
+ 'Ctrl+Shift+\8d¶\83N\83\8a\83b\83N'
+ 'Ctrl+Alt+\8d¶\83N\83\8a\83b\83N'
+ 'Shift+Alt+\8d¶\83N\83\8a\83b\83N'
+ '\92\86\83N\83\8a\83b\83N'
+ 'Ctrl+\92\86\83N\83\8a\83b\83N'
+ 'Shift+\92\86\83N\83\8a\83b\83N'
+ 'Alt+\92\86\83N\83\8a\83b\83N'
+ 'Ctrl+Shift+\92\86\83N\83\8a\83b\83N'
+ 'Ctrl+Alt+\92\86\83N\83\8a\83b\83N'
+ 'Shift+Alt+\92\86\83N\83\8a\83b\83N')
+ end
+ object cbToggleKey: TComboBox
+ Left = 152
+ Top = 140
+ Width = 129
+ Height = 20
+ Style = csDropDownList
+ ItemHeight = 12
+ TabOrder = 4
+ Items.Strings = (
+ '\82È\82µ'
+ 'Ctrl+\89E\83N\83\8a\83b\83N'
+ 'Shift+\89E\83N\83\8a\83b\83N'
+ 'Alt+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+Shift+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+Alt+\89E\83N\83\8a\83b\83N'
+ 'Shift+Alt+\89E\83N\83\8a\83b\83N'
+ 'Ctrl+\8d¶\83N\83\8a\83b\83N'
+ 'Shift+\8d¶\83N\83\8a\83b\83N'
+ 'Alt+\8d¶\83N\83\8a\83b\83N'
+ 'Ctrl+Shift+\8d¶\83N\83\8a\83b\83N'
+ 'Ctrl+Alt+\8d¶\83N\83\8a\83b\83N'
+ 'Shift+Alt+\8d¶\83N\83\8a\83b\83N')
+ end
+ object cbIgnoreJ: TCheckBox
+ Left = 24
+ Top = 248
+ Width = 225
+ Height = 17
+ Caption = '\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é(&J)'
+ TabOrder = 7
+ end
+ object edAMODIPath: TEdit
+ Left = 24
+ Top = 317
+ Width = 169
+ Height = 20
+ Enabled = False
+ TabOrder = 9
+ end
+ object btnBrowse: TButton
+ Left = 200
+ Top = 314
+ Width = 68
+ Height = 25
+ Caption = '\8eQ\8fÆ...'
+ Enabled = False
+ TabOrder = 10
+ end
+ object tbScaling: TTrackBar
+ Left = 146
+ Top = 383
+ Width = 121
+ Height = 20
+ Enabled = False
+ Max = 2
+ Orientation = trHorizontal
+ PageSize = 1
+ Frequency = 1
+ Position = 0
+ SelEnd = 0
+ SelStart = 0
+ TabOrder = 13
+ ThumbLength = 8
+ TickMarks = tmBottomRight
+ TickStyle = tsAuto
+ Visible = False
+ end
+ object btnHelp: TButton
+ Left = 212
+ Top = 379
+ Width = 75
+ Height = 25
+ Caption = '&Help'
+ TabOrder = 16
+ OnClick = btnHelpClick
+ end
+ object cbCaptureMode: TComboBox
+ Left = 24
+ Top = 276
+ Width = 193
+ Height = 20
+ Style = csDropDownList
+ ItemHeight = 12
+ TabOrder = 8
+ OnChange = cbCaptureModeChange
+ Items.Strings = (
+ '\95¶\8e\9a\94F\8e¯\81{\95¶\8e\9a\92\8a\8fo'
+ '\95¶\8e\9a\94F\8e¯\82Ì\82Ý'
+ '\95¶\8e\9a\92\8a\8fo\82Ì\82Ý')
+ end
+ object cbUse64: TCheckBox
+ Left = 24
+ Top = 344
+ Width = 193
+ Height = 17
+ Caption = '&64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é'
+ TabOrder = 11
+ Visible = False
+ end
+ object cbDPISetting: TCheckBox
+ Left = 24
+ Top = 362
+ Width = 193
+ Height = 17
+ Caption = '\89ð\91\9c\93x\90Ý\92è\82ð\82·\82é(&D)'
+ TabOrder = 12
+ Visible = False
+ OnClick = cbDPISettingClick
+ end
+ object ActionList1: TActionList
+ Left = 272
+ Top = 272
+ object actHelp: TAction
+ Caption = 'Help'
+ ShortCut = 112
+ OnExecute = actHelpExecute
+ end
+ end
+ object pmDebugMenu: TPopupMenu
+ Left = 264
+ Top = 216
+ object miShowAMODI: TMenuItem
+ Caption = 'Show &AMODI'
+ Visible = False
+ OnClick = miShowAMODIClick
+ end
+ end
+end
--- /dev/null
+//---------------------------------------------------------------------------
+#ifndef PopupConfigH
+#define PopupConfigH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ActnList.hpp>
+#include <Menus.hpp>
+//---------------------------------------------------------------------------
+
+enum eCaptureMode {
+ CM_TEXT = 1, // \95¶\8e\9a\92\8a\8fo
+ CM_IMAGE = 2, // OCR
+};
+
+class TPopupConfigDlg : public TForm
+{
+__published: // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+ TCheckBox *cbGroupOpen;
+ TLabel *lb1;
+ TLabel *lbGroupName;
+ TCheckBox *cbCtrlClose;
+ TButton *btnOK;
+ TButton *btnCancel;
+ TLabel *lb2;
+ TComboBox *edGroupName;
+ TCheckBox *cbBanner;
+ TMemo *Memo1;
+ TLabel *Label1;
+ TComboBox *cbPopupKey;
+ TLabel *Label2;
+ TComboBox *cbToggleKey;
+ TCheckBox *cbIgnoreJ;
+ TLabel *lbAMODIPath;
+ TEdit *edAMODIPath;
+ TButton *btnBrowse;
+ TLabel *lbScaling;
+ TTrackBar *tbScaling;
+ TLabel *lbScaleNormal;
+ TLabel *lbScaleMax;
+ TButton *btnHelp;
+ TActionList *ActionList1;
+ TAction *actHelp;
+ TLabel *lbDebug;
+ TPopupMenu *pmDebugMenu;
+ TMenuItem *miShowAMODI;
+ TComboBox *cbCaptureMode;
+ TCheckBox *cbUse64;
+ TCheckBox *cbDPISetting;
+ void __fastcall cbGroupOpenClick(TObject *Sender);
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+ void __fastcall btnHelpClick(TObject *Sender);
+ void __fastcall actHelpExecute(TObject *Sender);
+ void __fastcall lbDebugDblClick(TObject *Sender);
+ void __fastcall miShowAMODIClick(TObject *Sender);
+ void __fastcall cbCaptureModeChange(TObject *Sender);
+ void __fastcall cbDPISettingClick(TObject *Sender);
+private: // \83\86\81[\83U\81[\90é\8c¾
+ bool MODIAvail;
+public: // \83\86\81[\83U\81[\90é\8c¾
+ __fastcall TPopupConfigDlg(TComponent* Owner);
+ void SetPopupKey( int keycomb );
+ int GetPopupKey( );
+ void SetToggleKey( int keycomb );
+ int GetToggleKey( );
+ void SetDPIDetect(bool dpi_detect);
+ bool GetDPIDetect();
+ void SetScaler(int scale);
+ int GetScaler();
+ void SetMODIAvail(bool avail) { MODIAvail = avail; }
+ void SetCaptureMode(int mode);
+ int GetCaptureMode();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TPopupConfigDlg *PopupConfigDlg;
+//---------------------------------------------------------------------------
+#endif
+
--- /dev/null
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "StringLib.h"
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+
+// pos\82©\82ç\92P\8cê\82ð\90Ø\82è\8fo\82·
+// pos\82Ístr\82©\82ç\82Ì\83I\83t\83Z\83b\83g
+// start,end\82Ístr\82©\82ç\82Ì\83I\83t\83Z\83b\83g\82ð\95Ô\82·
+// prevstart\82Í\81Astart\82Ì\82P\82Â\91O\82Ì\92P\8cê\81A\96³\82¢\8fê\8d\87\82Ístart\82Æ\93¯\82¶\92l
+// fLongest\82ªTRUE\82Ì\8fê\8d\87\82Í\81A\8dÅ\8d\8210\8cê\82Ü\82Åget\82·\82é(.)\82ð\8fI\82í\82è\82Æ\82Ý\82È\82·
+// about : \82¢\82¢\89Á\8c¸\82È\82Æ\82±\82ë\82ð\83N\83\8a\83b\83N\82µ\82Ä\82à\92P\8cê\82³\82¦\82 \82ê\82Î\95K\82¸get\82·\82é
+// alnum : \89p\90\94\8e\9a\88È\8aO\82Í\96³\8e\8b
+
+BOOL GetWord( const tchar *str, int pos, int &start, int &end, int &prevstart, bool fLongest, int wordcount, bool about, bool alnum )
+{
+ if ( !about )
+ if ( !IsWordChar( *(str+pos) ) )
+ return FALSE;
+// while ( *(str+pos) == ' ' || *(str+pos) == '\t' ){
+// pos++;
+// }
+
+ // \89ü\8ds\82Ì\8fê\8d\87\82Í\96³\82µ
+ if ( str[pos] == '\r' || str[pos] == '\n' ){
+ return false;
+ }
+
+ // pos\82ª\95¶\8e\9a\97ñ\82Ì\8fI\92[\81A\82 \82é\82¢\82Í\95¶\8e\9a\97ñ\82Ì\8fI\92[\82©\82ç\82P\82Â\91O\82Ì\89ü\8ds\82Å\82 \82é\8fê\8d\87\82Í\82¾\82ß //
+ if ( !str[pos] || (!str[pos+1] && ((tuchar)str[pos] < ' ')) )
+ return false;
+
+ const tchar *orgp = str;
+ const tchar *p = orgp;
+rescan:
+ // \92P\8cê\82Ì\90æ\93ª\82ð\92T\82· //
+ const tchar *wordtop = NULL;
+ while ( *p ){
+ if ( alnum ){
+ // \89p\90\94\8e\9a\82Ì\82Ý
+ if ( isalphanum(*p) ){
+ // \92P\8cê\82Ì\8en\82Ü\82è
+ wordtop = p;
+ break;
+ }
+ p = NEXT_CHAR(p);
+ } else {
+ // \95¶\8e\9a\8eí\82ð\8bæ\95Ê\82µ\82È\82¢
+ if ( IsWordChar( *p ) )
+ {
+ wordtop = p;
+ break;
+ }
+ p++;
+ }
+ }
+ if ( !wordtop )
+ wordtop = p;
+ const tchar *wordtail = NULL;
+ const tchar *wordprev = NULL;
+ BOOL fSpc = FALSE;
+ // pos\82É\82 \82é\92P\8cê\82Ìstart\82Æend\82ð\8b\81\82ß\82é
+ while ( *p ){
+ if ( !IsWordChar( *p ) || (alnum && !isalphanum(*p)) ){
+ // \94ñ\92P\8cê\95¶\8e\9a
+ if ( orgp + pos < p ){
+ // \92P\8cê\82Ì\8fI\82í\82è
+ wordtail = p;
+ break;
+ } else {
+ if ( alnum ){
+ if ( _ismbblead(*p) ){
+ // \93ú\96{\8cê\82Ì\8fê\8d\87\82Í\81A\92P\8f\83\82È\94ñ\92P\8cê\95¶\8e\9a\82Æ\82Í\82Ý\82È\82³\82¸\81A
+ // \8dÅ\8f\89\82©\82çscan\82ð\82â\82è\92¼\82·
+ goto rescan;
+ }
+ }
+ }
+ fSpc = TRUE;
+ } else {
+ // \92P\8cê\95¶\8e\9a
+ if ( fSpc ){
+ wordprev = wordtop;
+ wordtop = p;
+ fSpc = FALSE;
+ }
+ }
+ if ( alnum ){
+ p = NEXT_CHAR( p );
+ } else {
+ p++;
+ }
+ }
+
+ // wordtop\82ªpos\82æ\82è\8cã\82ë
+ if ( (unsigned)wordtop - (about ? 3 : 0) > (unsigned)(orgp + pos) ){
+ // \92P\8cê\82Ì\8bæ\90Ø\82è\82¾\82Á\82½\81A\92P\8cê\82Ì\8dÅ\8f\89\82ªpos\82æ\82è\8cã\82ë\82É\82 \82Á\82½
+ // about = true\82Ì\8fê\8d\87\82Í\81A\82R\95¶\8e\9a\95ª\82Ù\82Ç\82¢\82¢\82©\82°\82ñ\8d·\82ð\91«\82µ\82Ä\82¨\82
+ return FALSE;
+ }
+
+ if ( fLongest ){
+// int wordcount = 10; // 10\8cê\82Ü\82Å
+ while ( *p && *p != '.' ){
+ if ( !IsWordChar( *p ) || (alnum && !isalphanum(*p)) ){
+ if ( !fSpc ){
+ if ( --wordcount == 0 )
+ break;
+ fSpc = TRUE;
+ }
+ } else {
+ fSpc = FALSE;
+ }
+ if ( alnum ){
+ p = NEXT_CHAR( p );
+ } else {
+ p++;
+ }
+ }
+ wordtail = p;
+ }
+
+ if ( !wordtail )
+ wordtail = p;
+ start = STR_DIFF( wordtop, orgp );
+ end = STR_DIFF( wordtail, orgp );
+ if ( start == end )
+ return false;
+ if ( wordprev ){
+ prevstart = STR_DIFF( wordprev, orgp );
+ } else {
+ prevstart = start;
+ }
+ return TRUE;
+}
+#if 0
+bool mbGetWord( const tchar *str, int pos, int &start, int &end, bool fLongest, int wordcount )
+{
+ ushort c;
+ const tchar *sp = str + pos;
+ LD_CHAR( c, sp );
+ if ( !mbIsWordChar( c ) )
+ return false;
+
+ const tchar *orgp = str;
+ const tchar *p = orgp;
+ const tchar *wordtop = p;
+ const tchar *wordtail = NULL;
+ BOOL fSpc = FALSE;
+ while ( 1 ){
+ sp = p;
+ LD_CHAR( c, p );
+ if ( (tuchar)c == 0x00 )
+ break;
+ if ( !mbIsWordChar( c ) ){
+ if ( orgp + pos < sp ){
+ wordtail = sp;
+ break;
+ }
+ fSpc = TRUE;
+ } else {
+ if ( fSpc ){
+ wordtop = sp;
+ fSpc = FALSE;
+ }
+ }
+ }
+ p = sp;
+ if ( wordtop > orgp + pos ){
+ // \92P\8cê\82Ì\8bæ\90Ø\82è\82¾\82Á\82½
+ return false;
+ }
+
+ if ( fLongest ){
+// int wordcount = 10; // 10\8cê\82Ü\82Å
+ while ( 1 ){
+ sp = p;
+ LD_CHAR( c, p );
+ if ( (tuchar)c == 0x00 )
+ break;
+ if ( c == '.' )
+ break;
+ if ( !mbIsWordChar( c ) ){
+ if ( !fSpc ){
+ if ( --wordcount == 0 )
+ break;
+ fSpc = TRUE;
+ }
+ } else {
+ fSpc = FALSE;
+ }
+ }
+ wordtail = sp;
+ }
+
+ if ( !wordtail )
+ wordtail = sp;
+ start = STR_DIFF( wordtop, orgp );
+ end = STR_DIFF( wordtail, orgp );
+ return TRUE;
+}
+bool mbIsWordChar( unsigned short c )
+{
+ if ( c < 0x100 ){
+ // \94¼\8ap\95¶\8e\9a
+ if ( isalphanum( c ) || c == '-' || c == '\'' ||
+ (c >= 0x86 && c <= 0xBF ) )
+ return true;
+ else
+ return false;
+ }
+ // \91S\8ap\95¶\8e\9a
+ if (
+ // \89p\90\94\8e\9a\81A\83J\83^\83J\83i\81A\82Ð\82ç\82ª\82È\81A\83M\83\8a\83V\83\83\81A\83\8d\83V\83A
+ (c >= 0x824f && c <= 0x8491) ||
+ // \8a¿\8e\9a
+ (c >= 0x889F) ||
+ // \83A\83|\83X\83g\83\8d\83t\83B
+ (c == CODE_APOSTROPHE)
+ )
+ return true;
+ else
+ return false;
+}
+#endif
+//\89p\90\94\8e\9a\82Ì\94»\95Ê
+int isalphanum( tuchar c )
+{
+ if ( c >= _t('A') && c <= _t('Z') ){
+ return 1;
+ }
+ if ( c >= _t('a') && c <= _t('z') ){
+ return 1;
+ }
+ if ( c >= _t('0') && c <= _t('9') ){
+ return 1;
+ }
+ return 0;
+}
+
--- /dev/null
+//---------------------------------------------------------------------------
+#ifndef StringLibH
+#define StringLibH
+//---------------------------------------------------------------------------
+
+#include <mbctype.h>
+
+// Constants //
+#define CODE_APOSTROPHE 0x9188 // \81f
+
+// typedefs and macros //
+#ifdef USE_UNICODE
+typedef wchar_t tuchar;
+typedef wchar_t tchar;
+#define LD_CHAR(c,p) c = *p++;
+#define ST_CHAR(c,p) *p++ = c;
+#define MOV_CHAR(p,q) *p++ = *q++;
+#define IS_ENDCHAR(c) (!(c))
+#define NEXT_CHAR(p) CharNextW(p)
+#undef _tcslen
+#define _tcslen wcslen
+#define _t(x) L##x
+#define mustr __mustr
+#include "mustr.h"
+#else
+typedef unsigned char tuchar;
+typedef char tchar;
+#define LD_CHAR(c, p) {c = (unsigned char)*(*(unsigned char**)&p)++; if(_ismbblead(c)) c = (unsigned short)(((unsigned short)c << 8) + (unsigned char)*(*(unsigned char**)&p)++);}
+#define ST_CHAR(c, p) {if ((unsigned short)c > 0x100) *(*(unsigned char**)&p)++ = (unsigned char)(c >> 8); *(*(unsigned char**)&p)++ = (unsigned char)c;}
+#define MOV_CHAR(p, q) { unsigned char c = *(*(unsigned char**)&q)++ = *(*(unsigned char**)&p)++; if ( _ismbblead( c ) ) *(*(unsigned char**)&q)++ = *(*(unsigned char**)&p)++; }
+#define IS_ENDCHAR(c) (!((unsigned char)(c)))
+#define NEXT_CHAR(p) CharNextA(p)
+#define _tcslen strlen
+#define _t(x) x
+#define mustr(s) (s)
+#endif
+
+typedef unsigned int uint;
+typedef unsigned short ushort;
+
+#define STR_DIFF( p1, p2 ) ( (uint)( (tchar*)(p1) - (tchar*)(p2) ) )
+
+// prototypes //
+int isalphanum( tuchar c );
+bool mbIsWordChar( unsigned short c );
+BOOL GetWord( const tchar *str, int pos, int &start, int &end, int &prevstart, bool fLongest, int wordcount, bool about, bool alnum );
+bool mbGetWord( const tchar *str, int pos, int &start, int &end, bool fLongest, int wordcount );
+
+// inlines //
+inline bool IsWordChar( tuchar c )
+{
+#ifdef _UNICODE
+ WORD ct;
+ GetStringTypeW(CT_CTYPE1,&c,1,&ct);
+ return (ct & (C1_ALPHA|C1_DIGIT)) || c=='-' || c==CODE_JPROLONG || c=='\'' || c=='_';
+#else
+ return isalphanum( c ) || c == '-' || c == '\'' || c >= 0xc0;
+#endif
+}
+#if 0
+inline bool IsNotWordChar( tuchar c )
+{
+#ifdef USE_UNICODE
+ WORD ct;
+ GetStringTypeW(CT_CTYPE1,&c,1,&ct);
+ return (ct & (C1_SPACE|C1_PUNCT|C1_CNTRL|C1_BLANK)) ? true : false;
+#else
+ return !IsWordChar(c);
+#endif
+}
+#endif
+
+#endif
+
\ No newline at end of file
--- /dev/null
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+#include "prgconfig.h"
+#include "Util.h"
+#include "prgprof.h"
+
+//---------------------------------------------------------------------------
+const char *AppName = "DokoPop";
+const char *StrVersion = "Ver.2.0.23";
+int VersionValue = 0x020017; // xxyyzz -> xx.yy.zz x=major y=minor(0-255) z=release(0-255)
+
+#pragma package(smart_init)
+
+#ifdef USE_UNICODE
+const char APPNAME[] = {"DokoPop/Unicode"};
+#else
+const char APPNAME[] = {"DokoPop"};
+#endif
+
+const char *AMODI_EXE_PATH = "amodi.exe";
+//const char *AMODI_EXE_PATH = "\\src\\amodi\\amodi\\bin\\Debug\\amodi.exe";
+
+const char *EXMODIST_EXE_PATH = "ExMODIst.exe";
+
+bool WindowsNT = false;
+bool fWow64 = false;
+
+HWND hwndMain = NULL;
+
+HKEY OpenKey( HKEY hkey, const char *keyname )
+{
+ HKEY newkey;
+ if ( RegOpenKeyEx( hkey, keyname, 0, KEY_ALL_ACCESS, &newkey ) == ERROR_SUCCESS ){
+ return newkey;
+ }
+ return NULL;
+}
+
+HKEY CreateKey( HKEY hkey, const char *keyname )
+{
+ HKEY newkey;
+ DWORD result;
+ if ( RegCreateKeyEx( hkey, keyname, 0, (LPTSTR)keyname, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, &result ) == ERROR_SUCCESS ){
+ return newkey;
+ }
+ return NULL;
+}
+DWORD GetValueLength( HKEY hkey, const char *name )
+{
+ DWORD len = 0;
+ if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, NULL, &len ) == ERROR_SUCCESS ){
+ return len;
+ }
+ return 0L;
+}
+#if 0
+DWORD ReadInteger( HKEY hkey, const char *name, DWORD val )
+{
+ DWORD len = sizeof(DWORD);
+ DWORD v;
+ if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, (LPBYTE)&v, &len ) == ERROR_SUCCESS ){
+ return v;
+ }
+ return val;
+}
+AnsiString ReadString( HKEY hkey, const char *name, const char *def )
+{
+ DWORD len = GetValueLength( hkey, name );
+ if ( len ){
+ char *buf = new char[ len ];
+ if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, (LPBYTE)buf, &len ) == ERROR_SUCCESS ){
+ AnsiString s = buf;
+ delete buf;
+ return s;
+ }
+ }
+ return def;
+}
+#endif
+TMyIni::TMyIni( HKEY root, const char *soft, bool can_create )
+{
+ hroot = can_create ? CreateKey( root, soft ) : OpenKey( root, soft );
+}
+TMyIni::~TMyIni()
+{
+ if ( hroot ){
+ RegCloseKey( hroot );
+ }
+}
+void TMyIni::WriteInteger( const char *section, const char *key, int val )
+{
+ HKEY hkey = CreateKey( hroot, section );
+ if ( hkey ){
+ RegSetValueEx( hkey, (LPCTSTR)key, 0, REG_DWORD, (LPBYTE)&val, sizeof(DWORD) );
+ RegCloseKey( hkey );
+ }
+}
+int TMyIni::ReadInteger( const char *section, const char *key, int val )
+{
+ HKEY hkey = OpenKey( hroot, section );
+ if ( hkey ){
+ DWORD len = sizeof(DWORD);
+ DWORD v;
+ if ( RegQueryValueEx( hkey, (LPTSTR)key, 0, NULL, (LPBYTE)&v, &len ) == ERROR_SUCCESS ){
+ return v;
+ }
+ }
+ return val;
+}
+void TMyIni::WriteString( const char *section, const char *key, const char *str )
+{
+ HKEY hkey = NULL;
+ if ( section )
+ hkey = CreateKey( hroot, section );
+ if ( !section || hkey ){
+ RegSetValueEx( hkey, (LPCTSTR)key, 0, REG_SZ, (LPBYTE)str, lstrlen(str)+1 );
+ RegCloseKey( hkey );
+ }
+}
+AnsiString TMyIni::ReadString( const char *section, const char *key, const char *str )
+{
+ HKEY hkey = NULL;
+ if ( section )
+ hkey = OpenKey( hroot, section );
+ if ( !section || hkey ){
+ DWORD len = GetValueLength( hkey, key );
+ if ( len ){
+ char *buf = new char[ len ];
+ if ( RegQueryValueEx( hkey, (LPTSTR)key, 0, NULL, (LPBYTE)buf, &len ) == ERROR_SUCCESS ){
+ AnsiString s = buf;
+ delete[] buf;
+ return s;
+ }
+ delete[] buf;
+ }
+ }
+ return str;
+}
+
+#define NAMEBUFFSIZE 512
+BOOL QueryInfoKey( HKEY hkey, DWORD *maxvalue, DWORD *maxdata );
+BOOL EnumValue( HKEY hkey, DWORD index, AnsiString &name, void *pbuffer=NULL, DWORD *maxlen=NULL, DWORD *type=NULL );
+
+void TMyIni::ReadValues( const char *section, TStrings *strs )
+{
+ strs->Clear();
+
+ HKEY hkey = OpenKey( hroot, section );
+ if ( hkey ){
+ DWORD maxvaluename;
+ DWORD maxvaluedata;
+ if ( !QueryInfoKey( hkey, &maxvaluename, &maxvaluedata ) ){
+ // \93®\82©\82È\82¢\81I\81I\81I
+ maxvaluename = 128;
+ maxvaluedata = 4096; // \93K\93\96\81I\81I
+ }
+
+ AnsiString _entry;
+ char *buf = new char[ maxvaluedata + 1 ];
+ for ( int i=0;;i++ ){
+ DWORD maxlen = maxvaluedata + 1;
+ if ( !EnumValue( hkey, i, _entry, buf, &maxlen ) )
+ break;
+ strs->Add( _entry );
+ }
+ delete[] buf;
+ }
+}
+
+//
+// TAppIni class
+//
+TAppIni::TAppIni()
+ :super(HKEY_CURRENT_USER, REG_PDICEXE, false)
+{
+#ifdef USE_UNICODE
+ if (!hroot){
+ super::super(HKEY_CURRENT_USER, REG_PDICEXE, false);
+ }
+#endif
+}
+
+const char *sLeft = "Left";
+const char *sTop = "Top";
+const char *sWidth = "Width";
+const char *sHeight = "Height";
+
+void LoadForm( const char *section, TForm *form, HWND hwnd )
+{
+ RECT rc;
+ if ( hwnd ){
+ GetWindowRect( hwnd, &rc );
+ } else {
+ rc.left = rc.top = 0;
+ }
+ form->Left = Ini->ReadInteger(section, sLeft, form->Left) + rc.left;
+ form->Top = Ini->ReadInteger(section, sTop, form->Top ) + rc.top;
+ RECT rcScr;
+ GetScreenSize(form->Handle?form->Handle:hwnd, &rcScr);
+ int sx = rcScr.right - rcScr.left;
+ int sy = rcScr.bottom - rcScr.top;
+
+ switch ( form->BorderStyle ){
+ case bsSizeable:
+ case bsToolWindow:
+ case bsSizeToolWin:
+ form->Width = Ini->ReadInteger( section, sWidth, form->Width );
+ form->Height = Ini->ReadInteger( section, sHeight, form->Height );
+ break;
+ }
+ // \89æ\96Ê\82Ì\8aO\82©\82Ç\82¤\82©\81H
+ if (form->Left+form->Width >= sx){
+ // \89E\92[
+ form->Left = sx - form->Width;
+ }
+ if (form->Left < rcScr.left){
+ // \8d¶\92[
+ form->Left = rcScr.left;
+ }
+ if (form->Top+form->Height >= sy){
+ // \89º\92[
+ form->Top = sy - form->Height;
+ }
+ if (form->Top < rcScr.top){
+ // \8fã\92[
+ form->Top = rcScr.top;
+ }
+}
+void SaveForm( const char *section, TForm *form, HWND hwnd )
+{
+ RECT rc;
+ if ( hwnd ){
+ GetWindowRect( hwnd, &rc );
+ } else {
+ rc.left = rc.top = 0;
+ }
+ Ini->WriteInteger( section, sLeft, form->Left - rc.left );
+ Ini->WriteInteger( section, sTop, form->Top - rc.top );
+ switch ( form->BorderStyle ){
+ case bsSizeable:
+ case bsToolWindow:
+ case bsSizeToolWin:
+ Ini->WriteInteger( section, sWidth, form->Width );
+ Ini->WriteInteger( section, sHeight, form->Height );
+ break;
+ }
+}
+
+BOOL QueryInfoKey( HKEY hkey, DWORD *maxvalue, DWORD *maxdata )
+{
+ char *classname = new char[ 512 ]; // \82±\82ñ\82È\82à\82ñ\82Å\82¢\82¢\82©\82È\82\9f\81H
+ DWORD classnamesize = 512;
+ DWORD SubKeys;
+ DWORD MaxSubKey;
+ DWORD MaxClass;
+ DWORD Values;
+ DWORD MaxValueName;
+ DWORD MaxValueData;
+ DWORD SecurityDescriptor;
+ FILETIME LastWriteTime;
+ if ( ::RegQueryInfoKey( hkey, classname, &classnamesize,
+ NULL,
+ &SubKeys,
+ &MaxSubKey,
+ &MaxClass,
+ &Values,
+ &MaxValueName,
+ &MaxValueData,
+ &SecurityDescriptor,
+ &LastWriteTime
+ ) != ERROR_SUCCESS ){
+ delete[] classname;
+ return FALSE;
+ }
+ if ( maxvalue )
+ *maxvalue = MaxValueName;
+ if ( maxdata )
+ *maxdata = MaxValueData;
+ delete[] classname;
+ return TRUE;
+}
+BOOL EnumValue( HKEY hkey, DWORD index, AnsiString &name, void *pbuffer, DWORD *maxlen, DWORD *type )
+{
+ char *buffer = new char[ NAMEBUFFSIZE ];
+ DWORD buflen = NAMEBUFFSIZE;
+ if ( RegEnumValue( hkey, index, buffer, &buflen, 0, type, (LPBYTE)pbuffer, maxlen ) == ERROR_SUCCESS ){
+ name = buffer;
+ delete[] buffer;
+ return TRUE;
+ }
+ delete[] buffer;
+ return FALSE;
+}
+bool CheckPassword( const char *str )
+{
+ AnsiString s;
+ if ( str ){
+ s = str;
+ } else {
+ s = Ini->ReadString( "Main", "PW", "" );
+ }
+ return s == "123";
+}
+void CheckWOW64()
+{
+ typedef BOOL WINAPI (*FNIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
+
+ FNIsWow64Process _IsWow64Process = (FNIsWow64Process)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
+ if (_IsWow64Process){
+ BOOL flag = FALSE;
+ if (_IsWow64Process(GetCurrentProcess(), &flag)){
+ fWow64 = flag;
+ }
+ }
+}
+void MoveToTop( HWND hwnd )
+{
+ if ( IsIconic( hwnd ) )
+ ShowWindow( hwnd, SW_RESTORE );
+
+ // Undocumented way
+
+ HMODULE hUser32 = GetModuleHandle("user32");
+ if ( hUser32 ){
+ typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
+ PROCSWITCHTOTHISWINDOW SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, TEXT("SwitchToThisWindow"));
+ if ( SwitchToThisWindow ){
+ SwitchToThisWindow( hwnd, true );
+ FreeLibrary( hUser32 );
+ return;
+ }
+ }
+
+ FreeLibrary( hUser32 );
+
+ DWORD locktimeout;
+ /*BOOL changed = */ SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &locktimeout, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE );
+ SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, NULL, SPIF_UPDATEINIFILE);
+ SetForegroundWindow(hwnd);
+ SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, locktimeout, NULL, SPIF_UPDATEINIFILE);
+}
+// window(hwnd)\82ðhwndParent\82Ìcenter\82Ö\88Ú\93®
+// screen\82Ì\8aO\82Ö\8fo\82é\8fê\8d\87\82Í\92²\90®\82·\82é
+void MoveCenter( HWND hwnd, HWND hwndParent )
+{
+ RECT rc;
+ RECT rd;
+ if (!hwndParent){
+ hwndParent = hwndMain; // parent\82ª\82È\82¯\82ê\82Îmain window
+ }
+ if (hwndParent){
+#ifndef WINCE
+ if ( IsIconic(hwndParent) ){
+ GetScreenSize(hwndParent, &rc);
+ } else
+#endif
+ {
+ ::GetWindowRect( hwndParent, &rc );
+ }
+ } else {
+ GetScreenSize(hwnd, &rc);
+ }
+ RECT rcScr;
+ GetScreenSize(hwnd, &rcScr);
+ ::GetWindowRect( hwnd, &rd );
+ int width = rd.right - rd.left;
+ int height = rd.bottom - rd.top;
+ int left = rc.left + ( ( rc.right - rc.left ) - width )/2;
+ int top = rc.top + ( ( rc.bottom - rc.top ) - height )/2;
+ if ( left < rcScr.left ){
+ left = rcScr.left;
+ }
+ if ( top < rcScr.top ){
+ top = rcScr.top;
+ }
+ if ( left + width > rcScr.right ){
+ left = rcScr.right - (rd.right - rd.left);
+ }
+ if ( top + height > rcScr.bottom ){
+ top = rcScr.bottom - (rd.bottom - rd.top);
+ }
+ ::SetWindowPos( hwnd, (HWND)NULL, left & ~7, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
+}
+void GetScreenSize(HWND hwndBase, RECT *rcWork, RECT *rcScreen)
+{
+#if 0
+ if (!PdicMain){
+ __assert(false);
+ MLFXPC_CMN_ASSERT(false);
+ if (rcScreen){
+ SetRect(rcScreen, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
+ }
+ if (rcWork){
+ SystemParametersInfo(SPI_GETWORKAREA, 0, rcWork, 0);
+ }
+ return;
+ }
+#endif
+ //__assert(hwndMain!=NULL);
+ HMONITOR hMonitor = MonitorFromWindow(hwndBase ? hwndBase : (hwndMain ? hwndMain : GetActiveWindow()), MONITOR_DEFAULTTONEAREST);
+ //__assert(hMonitor!=NULL);
+ MONITORINFO mi;
+ memset(&mi, 0, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ GetMonitorInfo(hMonitor, &mi);
+ if (rcScreen){
+ *rcScreen = mi.rcMonitor;
+ }
+ if (rcWork){
+ *rcWork = mi.rcWork;
+ }
+}
+bool _WinExec( const char *cmd, int show, int waittime, const char *dir)
+{
+ STARTUPINFO sui;
+ memset( &sui, 0, sizeof(STARTUPINFO) );
+ sui.cb = sizeof(STARTUPINFO);
+ sui.dwFlags = STARTF_USESHOWWINDOW;
+ sui.wShowWindow = (WORD)show;
+ sui.lpTitle = (LPTSTR)"";
+ PROCESS_INFORMATION pi;
+ if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+ return false;
+ bool ret = true;
+ if ( waittime ){
+ int r = WaitForInputIdle( pi.hProcess, waittime );
+ ret = r==0;
+ }
+ CloseHandle( pi.hProcess );
+ return ret;
+}
+static const char *MyWinTitle = "<Processing...>";
+HANDLE WinExecEx( const char *cmd, int show, const char *dir, const char *title )
+{
+ STARTUPINFO sui;
+ memset( &sui, 0, sizeof(STARTUPINFO) );
+ sui.cb = sizeof(STARTUPINFO);
+ sui.dwFlags = STARTF_USESHOWWINDOW;
+ sui.wShowWindow = (WORD)show;
+ sui.lpTitle = (LPTSTR)(title ? title : MyWinTitle);
+ PROCESS_INFORMATION pi;
+ if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+ return NULL;
+ return pi.hProcess;
+}
+bool LaunchPdic()
+{
+ TAppIni *ini = new TAppIni;
+ if ( !ini->hroot ){
+ delete ini;
+ return false;
+ }
+
+ AnsiString s = ini->ReadString( PFS_COMMON, PFS_PATH, "" );
+ delete ini;
+ if ( s.Length() == 0 )
+ return false;
+ s += "\\";
+ s += NAME_PDICEXE;
+
+ return _WinExec( s.c_str(), SW_SHOWNOACTIVATE|SW_MINIMIZE, 500 );
+}
+bool MODIInstalled()
+{
+ HANDLE h = WinExecEx(EXMODIST_EXE_PATH, SW_HIDE);
+ if (!h){
+ dbw("ExMODist exec error: %d", GetLastError());
+ return false;
+ }
+ WaitForSingleObject(h, INFINITE);
+ DWORD exitCode = 0;
+ BOOL r = GetExitCodeProcess(h, &exitCode);
+ CloseHandle(h);
+ if (r){
+ return exitCode ? true : false;
+ }
+ return false;
+}
+bool AMODIRunable()
+{
+ return MODIInstalled() && GetDNFVersion()>=451;
+}
+bool LaunchAMODI()
+{
+ if (!AMODIRunable()) return false;
+
+ int show =
+#ifdef _DEBUG
+ SW_SHOWNOACTIVATE|SW_MINIMIZE;
+#else
+ SW_HIDE;
+#endif
+ if (!_WinExec( AMODI_EXE_PATH, show, 500))
+ return false;
+
+ HWND hwnd = NULL;
+ for (int i=0;i<30;i++){
+ hwnd = FindAMODI();
+ if (hwnd)
+ break;
+ Sleep(10);
+ }
+ return hwnd!=NULL;
+}
+void TerminateAMODI()
+{
+ HWND hwnd = FindAMODI();
+ if (hwnd){
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ }
+}
+void ShowAMODI()
+{
+ HWND hwnd = FindAMODI();
+ if (hwnd){
+ ShowWindow(hwnd, SW_SHOW);
+ ShowWindow(hwnd, SW_RESTORE);
+ }
+}
+static HWND hwndFind;
+static const char *findClass = NULL;
+static const char *findWindow = NULL;
+static const char *findAppName = NULL;
+static BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
+{
+ char buf[80];
+
+ if (findClass){
+ if ( !GetClassName( hwnd, buf, sizeof(buf)-1 ) ) return TRUE;
+ //DBW("class: %s", buf);
+ if (strcmp( buf, findClass )) return TRUE;
+ }
+ if (findWindow){
+ if (GetWindowText(hwnd, buf, sizeof(buf))<0){
+ return TRUE;
+ }
+ //DBW("wnd: %s", buf);
+ if (strcmp(buf, findWindow)){ return TRUE; }
+ }
+
+ if (findAppName){
+ COPYDATASTRUCT cd;
+ cd.dwData = WMCD_EXISTCHECK;
+ cd.lpData = (void*)findAppName;
+ cd.cbData = strlen(findAppName)+1;
+ if ( SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM)&cd ) ){
+ goto jfound;
+ }
+ } else {
+jfound:
+ hwndFind = hwnd;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+HWND FindApp(const char *clsname, const char *wndname, const char *appname)
+{
+ hwndFind = NULL;
+ findClass = clsname;
+ findWindow = wndname;
+ findAppName = appname;
+ EnumWindows( (FARPROC)EnumWindowsProc, 0 );
+ return hwndFind;
+}
+HWND FindPrev()
+{
+ return FindApp("TDCHookMainForm", NULL, APPNAME);
+}
+int CheckVersion(HWND hwnd)
+{
+ int ver = SendMessage(hwnd, WM_GET_VERSION, 0, 0);
+ if (ver==0){ return -1; } // older than ver.2.0
+ return ver - VersionValue;
+}
+HWND FindAMODI()
+{
+ static const char APPNAME_AMODI[] = "Auto MODI";
+ return FindApp(NULL, APPNAME_AMODI, APPNAME_AMODI);
+}
+static HWND hwndFound;
+static BOOL CALLBACK EnumWindowsProcPS( HWND hwnd, LPARAM lParam )
+{
+ char clsname[80];
+ if ( !GetClassName( hwnd, clsname, sizeof(clsname)-1 ) ) return TRUE;
+ if ( strcmp( clsname, "PSPOPUPWIN" )
+ && strcmp( clsname, "PSMENU" ) ) return TRUE;
+
+ hwndFound = hwnd;
+
+ return FALSE;
+}
+// PDIC\82Ìpopup window\82ð\92T\82·
+HWND FindPopupWindow( )
+{
+ hwndFound = NULL;
+ EnumWindows( (WNDENUMPROC)EnumWindowsProcPS, 0 );
+ return hwndFound;
+}
+
+void ShowManual(HWND hwnd)
+{
+ AnsiString dir = ExtractFileDir( Application->ExeName );
+ ShellExecute( hwnd, "open", NAME_DKPPTXT, NULL, dir.c_str(), SW_SHOW );
+}
+
+void ShowLatestVersion()
+{
+#if __PROTO
+ const char *url = "http://pdic.la.coocan.jp/unicode/dev.html";
+#else
+ const char *url = "http://dokopop.osdn.jp/";
+#endif
+ ShellExecute( NULL, _T("open"), url, NULL, NULL, SW_SHOW );
+}
+
+// \8eQ\8dl
+// https://msdn.microsoft.com/ja-jp/library/hh925568(v=vs.110).aspx#net_d
+// http://www.atmarkit.co.jp/ait/articles/1210/26/news086.html
+unsigned GetDNFVersion()
+{
+ HKEY dnfKey;
+ if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP", 0, KEY_READ, &dnfKey ) == ERROR_SUCCESS ){
+ int version = 0;
+ HKEY verKey;
+ if ( RegOpenKeyEx( dnfKey, "v4.0", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+ version = 400;
+ RegCloseKey(verKey);
+ if ( RegOpenKeyEx( dnfKey, "v4", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+ HKEY fullKey;
+ if ( RegOpenKeyEx( verKey, "Full", 0, KEY_READ, &fullKey ) == ERROR_SUCCESS ){
+ DWORD dwType = REG_DWORD;
+ DWORD dwByte = 4;
+ DWORD dwValue = 0;
+ if ( RegQueryValueEx( fullKey, "Release", NULL, &dwType, (BYTE*)&dwValue, &dwByte) == ERROR_SUCCESS){
+#if 0
+ if (dwValue >= 394254){
+ version = 461;
+ } else
+ if (dwValue >= 393295){
+ version = 460;
+ } else
+ if (dwValue >= 379893){
+ version = 452;
+ } else
+#endif
+ if (dwValue >= 378675){
+ version = 451;
+ } else
+ if (dwValue >= 378389){
+ version = 450;
+ }
+ }
+ RegCloseKey( fullKey );
+ }
+ RegCloseKey( verKey );
+ }
+ } else
+ if ( RegOpenKeyEx( dnfKey, "v3.5", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+ version = 350;
+ RegCloseKey(verKey);
+ }
+ RegCloseKey(dnfKey);
+ return version;
+ }
+ return 0;
+}
+
+static HWND hWin = NULL;
+static const char *clsname = "TDbgMsgForm";
+static const char *winname = "Debug Messenger";
+void dbw( const char *format, ... )
+{
+ if ( !hWin ){
+ hWin = FindWindowA( clsname, winname );
+ if ( !hWin ) return;
+ }
+ va_list ap;
+ va_start( ap, format );
+ char buf[ 2048 ];
+ wvsprintf( buf, format, ap );
+ COPYDATASTRUCT cds;
+ cds.dwData = 1; // Indicate String
+ cds.cbData = strlen(buf);
+ cds.lpData = buf;
+ SendMessage( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+ va_end( ap );
+}
+
--- /dev/null
+//---------------------------------------------------------------------------
+#ifndef UtilH
+#define UtilH
+//---------------------------------------------------------------------------
+
+/*------------------------------------------*/
+/* Configuration */
+/*------------------------------------------*/
+#define USE_DDE 1 // Popup Search\82Í\81ADDE\82Å\8ds\82¤,
+ // otherwise uses WM_COPYDATA message.
+
+#ifdef USE_UNICODE
+#define DDE_SERVICE_NAME "PDICU"
+//#define REG_PDICEXE_OLD "Software\\ReliefOffice\\PDICU"
+#define REG_PDICEXE "Software\\ReliefOffice\\PDIC2"
+#define APPREGNAME "DokoPopU"
+#define NAME_PDICEXE "PDICU.EXE"
+#define NAME_DKPPTXT "DKPU.TXT"
+#define NAME_DKPPHKDLL "DKPUHK.DLL"
+#define NAME_BMPFILE "DKPU.BMP"
+#define FMTS "%ws"
+#else
+#define DDE_SERVICE_NAME "PDICW"
+#define REG_PDICEXE "Software\\ReliefOffice\\PDICW32"
+#define APPREGNAME "DokoPop"
+#define NAME_PDICEXE "PDICW32.EXE"
+#define NAME_DKPPTXT "DKPP.TXT"
+#define NAME_DKPPHKDLL "DKPPHK.DLL"
+#define NAME_BMPFILE "DKPP.BMP"
+#define FMTS "%s"
+#endif
+extern const char APPNAME[];
+
+/*------------------------------------------*/
+/* Type Definitions */
+/*------------------------------------------*/
+
+#define WMCD_EXISTCHECK 0x4000
+
+#define WM_GET_VERSION (WM_APP+0x300)
+
+#define foreach(obj, it, type) \
+ for (type::iterator it=(obj).begin();it!=(obj).end();it++)
+
+#ifdef __VCL0_H__
+
+#define VCL_SIZEABLE() do {BorderStyle = bsSizeable;} while(0) //TODO: VCL Bug
+
+class TMyIni {
+public:
+ HKEY hroot;
+public:
+ TMyIni( HKEY root, const char *soft, bool can_create );
+ ~TMyIni();
+ void WriteInteger( const char *section, const char *key, int val );
+ int ReadInteger( const char *section, const char *key, int val );
+ void WriteString( const char *section, const char *key, const char *str );
+ AnsiString ReadString( const char *section, const char *key, const char *str );
+ void ReadValues( const char *section, TStrings *strs );
+};
+
+class TAppIni : public TMyIni {
+typedef TMyIni super;
+public:
+ TAppIni();
+};
+
+void LoadForm( const char *section, TForm *form, HWND hwnd );
+void SaveForm( const char *section, TForm *form, HWND hwnd );
+#endif
+
+/*------------------------------------------*/
+/* Prototypes */
+/*------------------------------------------*/
+bool LaunchPdic();
+bool MODIInstalled();
+bool AMODIRunable();
+bool LaunchAMODI();
+void TerminateAMODI();
+void ShowAMODI();
+
+bool CheckPassword( const char *str );
+void CheckWOW64();
+void MoveToTop( HWND hwnd );
+void MoveCenter( HWND hwnd, HWND hwndParent );
+void GetScreenSize(HWND hwndBase, RECT *rcWork, RECT *rcScreen=NULL);
+bool _WinExec( const char *cmd, int show, int waittime, const char *dir=NULL);
+HANDLE WinExecEx( const char *cmd, int show, const char *dir=NULL, const char *title=NULL );
+HWND FindApp(const char *clsname, const char *wndname, const char *appname);
+HWND FindPrev();
+int CheckVersion(HWND hwnd);
+HWND FindAMODI();
+HWND FindPopupWindow( );
+
+void ShowManual( HWND hwnd );
+void ShowLatestVersion();
+
+unsigned GetDNFVersion(); // get .NET Framework version
+
+void dbw( const char *format, ... );
+
+#ifdef _DEBUG
+#define DBW dbw
+#else
+#define DBW (void)
+#endif
+
+/*------------------------------------------*/
+/* Global Variables */
+/*------------------------------------------*/
+extern const char *AppName;
+extern const char *StrVersion;
+extern int VersionValue;
+extern bool WindowsNT;
+extern bool fWow64;
+
+#endif
+
--- /dev/null
+copy \src\DCHook\DCHook\Win32\Release\DCHook.dll DKPUHK.DLL
+copy \src\DCHook\DCHook\x64\Release\DCHook.dll DKPUHK64.DLL
+copy ..\DCHook64\dchk64\x64\Release\dchk64.exe DKPUHK64.exe
--- /dev/null
+2 ICON "dkpps.ico"
+
--- /dev/null
+#include <windows.h>
+#pragma hdrstop
+#include "mustr.h"
+
+__mustr::__mustr( const char *str )
+{
+ constructor(str, str ? strlen(str) : 0);
+}
+__mustr::__mustr( const wchar_t *str )
+{
+ constructor(str, str ? wcslen(str) : 0);
+}
+void __mustr::constructor(const char *str, int len)
+{
+ buffer = (void*)str;
+ length = len;
+ type = 1;
+ newbuffer = NULL;
+}
+void __mustr::constructor(const wchar_t *str, int len)
+{
+ buffer = (void*)str;
+ length = len;
+ type = 2;
+ newbuffer = NULL;
+}
+__mustr::~__mustr()
+{
+ if ( newbuffer ) delete[] newbuffer;
+}
+__mustr::operator char *()
+{
+ if ( type == 1 ) return (char*)buffer;
+ if ( newbuffer ) return (char*)newbuffer;
+
+ // Unicode to Ansi
+
+ newbuffer = new char[ length*2 + 1 ];
+ int size = WideCharToMultiByte( CP_ACP, 0, (wchar_t*)buffer, length, newbuffer, length*2, NULL, NULL );
+ newbuffer[size] = '\0';
+ return (char*)newbuffer;
+}
+__mustr::operator wchar_t *()
+{
+ if ( type == 2 ) return (wchar_t*)buffer;
+ if ( newbuffer ) return (wchar_t*)newbuffer;
+
+ // Ansi to Unicode
+
+ *(wchar_t**)&newbuffer = new wchar_t[ length*2 + 1 ];
+ int size = MultiByteToWideChar( CP_ACP, 0, (char*)buffer, length, (wchar_t*)newbuffer, length*2 );
+ ((wchar_t*)newbuffer)[size] = '\0';
+ return (wchar_t*)newbuffer;
+}
--- /dev/null
+#ifndef __MUSTR_H
+#define __MUSTR_H
+
+// \94Ä\97p UNICODE <-> ANSI conversion class
+
+class __mustr {
+protected:
+ void *buffer;
+ char *newbuffer;
+ int length;
+ int type;
+public:
+ __mustr( const char *str );
+ __mustr( const char *str, int len )
+ { constructor(str, len); }
+ __mustr( const wchar_t *str );
+protected:
+ void constructor(const char *str, int len);
+ void constructor(const wchar_t *str, int len);
+public:
+ ~__mustr();
+ operator char *();
+ operator unsigned char *()
+ { return (unsigned char*)(char*)(*this); }
+ operator wchar_t *();
+ char *str()
+ { return (char*)(*this); }
+ wchar_t *wstr()
+ { return (wchar_t*)(*this); }
+};
+
+#endif // __MUSTR_H
--- /dev/null
+/* This file was Generated by bmp2rgn */
+char bmp2rgn_rgnBytes[240] =
+{
+ 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0d, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xec, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0xed, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0xef, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+ 0xef, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0xef, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
+ 0xee, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0xee, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+ 0xed, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0xeb, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0xe9, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00
+
+};
+
+#if defined (__cplusplus)
+RGNDATA& bmp2rgn_rgnData = *reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
+#endif
+RGNDATA* bmp2rgn_rgnDataPtr = reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
--- /dev/null
+/* This file was Generated by bmp2rgn */
+char bmp2rgn_rgnBytes[144] =
+{
+ 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xed, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xee, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0xef, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+ 0xef, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0xee, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0xed, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00
+
+};
+
+#if defined (__cplusplus)
+RGNDATA& bmp2rgn_rgnData = *reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
+#endif
+RGNDATA* bmp2rgn_rgnDataPtr = reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
--- /dev/null
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "prgconfig.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
--- /dev/null
+//---------------------------------------------------------------------------
+
+#ifndef prgconfigH
+#define prgconfigH
+//---------------------------------------------------------------------------
+
+#define __PROTO 1 // \8e\8e\8dì\94Å
+
+#endif
--- /dev/null
+#pragma hdrstop
+#define DEFINE_PFS
+#include "prgprof.h"
+
+#pragma package(smart_init)
+
+TMyIni *Ini;
+
+
+
--- /dev/null
+//---------------------------------------------------------------------------
+
+#ifndef prgprofH
+#define prgprofH
+//---------------------------------------------------------------------------
+
+#ifdef DEFINE_PFS
+#define DEF_PFS(name, str) extern const char PFS_##name[]; const char PFS_##name[] = str
+#else
+#define DEF_PFS(name, str) extern const char PFS_##name[]
+#endif
+
+DEF_PFS(MAIN, "Main");
+DEF_PFS(CONFIG, "Config");
+DEF_PFS(PDIC, "PDIC");
+DEF_PFS(COMMON, "Common");
+DEF_PFS(GRPSEL, "grpsel");
+DEF_PFS(GROUP, "Group");
+DEF_PFS(GROUPOPEN, "GroupOpen");
+DEF_PFS(GROUPNAME, "GroupName");
+DEF_PFS(POPUPKEY, "PopupKey");
+DEF_PFS(TOGGLEKEY, "ToggleKey");
+DEF_PFS(CTRLCLOSE, "CtrlClose");
+DEF_PFS(IGNOREJ, "IgnoreJ");
+DEF_PFS(PATH, "Path");
+DEF_PFS(BANNER, "Banner");
+DEF_PFS(INCSRCH, "IncSrch");
+DEF_PFS(CAPTURE_MODE, "CaptureMode2");
+DEF_PFS(AMODIPATH, "AMODIPath");
+DEF_PFS(DPI_DETECT, "DPIDetect");
+DEF_PFS(SCALE, "Scale");
+DEF_PFS(USE64, "Use64");
+
+extern class TMyIni *Ini;
+
+#endif
+
--- /dev/null
+==========================================================================
+ \82Ç\82±\83|\83b\83v\81I Ver.1.11
+==========================================================================
+\8fÐ\89î ---------------------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary for Win32(\88È\89ºPDIC)\82Æ
+\81@\98A\8cg\82µ\82Ä\81A\83}\83E\83X\82Ì\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+
+\93®\8dì\8am\94FOS --------------------------------------------------------------
+
+\81@Windows98/Me
+\81@WindowsNT4.0/2000/XP
+
+\96â\91è\93_ --------------------------------------------------------------------
+
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+\8f\80\94õ --------------------------------------------------------------------
+
+\81@DKPP111.EXE\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC for Win32(\82Å\82«\82ê\82ÎVer.4.50\88È\8d~)\82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+ NT4.0\82Å\82Í\81APSAPI.DLL \82ª\95K\97v\82Å\82·\81B
+ http://homepage3.nifty.com/TaN/psapi.exe
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\8cã\81A\89ð\93\80\81A\83V\83X\83e\83\80\83f\83B\83\8c\83N\83g\83\8a(C:\WINNT\System32\82È\82Ç)
+ \82Ö\83R\83s\81[\82µ\82Ä\82\82¾\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------------------
+
+\81@DKPP.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+ \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+ \82Å\82«\82Ü\82¹\82ñ\81B
+
+ \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83N \82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+ \82½\82ß\81A\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+ \81i\81u\82Í\82¶\82ß\82É\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82\82é\81j
+ \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+ \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+ \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+ \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+ \91I\82ñ\82Å\82\82¾\82³\82¢\81B
+ Alt + \89E\83N\83\8a\83b\83N \82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83N \82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82¶\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦ - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93 - version\95\\8e¦
+\81@\8fI\97¹ - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ----------------------------------------------------------------------
+
+ \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+ \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+ \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82\82é\83E\83B\83\93\83h\83E\82Ì
+ \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+ \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+ DKPP.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPP.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+ \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+ \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+ \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+ PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+ \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+
+ \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+ \82µ\82Ü\82·\81B
+
+ \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+ \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+ \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82¶\82é
+ Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+ \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+ \83E\83B\83\93\83h\83E\82ð\95Â\82¶\82Ü\82·\81B
+ \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82\82¾\82³\82¢\81j
+
+ \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+ \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95¶\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+ \8d¬\8dÝ\95¶\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82\82È\82è\82Ü\82·\81B
+ \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+ \8aÜ\82Þ\95¶\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+\82»\82Ì\91¼ --------------------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://homepage3.nifty.com/TaN/prog-tips.html
+\81@\82É\82 \82è\82Ü\82·\81B(dchook-x.xx.lzh)
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC for Win32\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83C\83\93\83X\83g\81[\83\89\82É\82¿\82\82í\82³\82ñ(RXQ01346@nifty.ne.jp)\82ÌMakeSet\82ð\8eg\97p\82µ\82Ä\82¢\82Ü\82·\81B
+
+\97\9a\97ð ----------------------------------------------------------------------
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+ \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95¶\8fÍ\82Å\82à\90³\82µ\82\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+ \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+---------------------------------------------------------------------------
--- /dev/null
+========================================================================
+\81y\83\ \83t \83g\96¼\81z \82Ç\82±\83|\83b\83v\81I Ver.1.11
+\81y\93o \98^ \96¼\81z\81@DKPP111.EXE
+\81y\83o\83C\83g \90\94\81z <FILESIZE:DKPP111.EXE> Bytes
+\81y\8c\9f\8dõ \83L\81[\81z\81@1:DOKOPOP 2:PDIC 3:$WIN32 4:#APP 5:#EDU
+\81y\92\98\8dì\8c \8eÒ\81z\81@\82È\82µ
+\81y\8cf \8dÚ \8eÒ\81z\81@TaN(SGM00353)
+\81y\91Î\89\9e \8b@\8eí\81z\81@MS-Windows 98/Me/NT4.0/2000/XP
+\81y\93®\8dì \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,NT4,0,Win98,2000
+\81y\8cf \8dÚ \93ú\81z\81@2002.12.09
+\81y\8dì\90¬ \95û\96@\81z\81@DKPP111.EXE \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ \8fð\8c\8f\81z \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81I \82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81I \82Í PDIC for Win32\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC for Win32\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC for Win32\82Ì\93ü\8eè\90æ(\95K\90{)\81F
+ http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+ http://homepage3.nifty.com/TaN/prog-tips.html dchook-1.11.lzh
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81yDKPP111.EXE\81z\82Å\82·\81B
--- /dev/null
+=============================================
+ \82Ç\82±\83|\83b\83v\81I/Unicode Ver.2.023
+=============================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81APersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@Windows7/8/8.1/10
+
+ \81¦Windows2000/XP\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\95¶\8e\9a\94F\8e¯\82ð\97\98\97p\82µ\82½\82¢\8fê\8d\87\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B\81i\81¨\95¶\8e\9a\94F\8e¯\82Ì\8fê\8f\8a)
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@DKPU2023.exe\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.5.7.21\88È\8d~ \82ª\95K\97v\82Å\82·\81B
+ http://pdic.la.coocan.jp/
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+ \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+ \82Å\82«\82Ü\82¹\82ñ\81B
+
+ \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83N \82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+ \82½\82ß\81A\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+ \81i\81u\82Í\82¶\82ß\82É\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82\82é\81j
+ \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+ \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+ \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+ \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+ \91I\82ñ\82Å\82\82¾\82³\82¢\81B
+ Alt + \89E\83N\83\8a\83b\83N \82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83N \82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82¶\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦ - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93 - version\95\\8e¦
+\81@\8fI\97¹ - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+ \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+ \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+ \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82\82é\83E\83B\83\93\83h\83E\82Ì
+ \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+ \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+ DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+ \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+ \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+ \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+ PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+ \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è\82µ\82Ü\82·\81B
+
+ \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+ \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+ \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+ \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95¶\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+ \8d¬\8dÝ\95¶\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82\82È\82è\82Ü\82·\81B
+ \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+ \8aÜ\82Þ\95¶\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+ \81¡\94F\8e¯\83\82\81[\83h\82Ì\90Ý\92è
+ \81E\95¶\8e\9a\94F\8e¯\81{\95¶\8e\9a\92\8a\8fo
+ \81E\95¶\8e\9a\94F\8e¯\82Ì\82Ý
+ \81E\95¶\8e\9a\92\8a\8fo\82Ì\82Ý
+ \92Ê\8fí\88ê\94Ô\8fã\82Ì\90Ý\92è\82ª\82¢\82¢\82Æ\8ev\82¢\82Ü\82·\82ª\81A\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\81A\83A\83v\83\8a\82ª\97\8e\82¿\82é\81A\82È\82Ç\82Ì\8fê\8d\87\82Í
+ \90Ý\92è\82ð\95Ï\8dX\82·\82é\82Æ\82¤\82Ü\82\82¢\82\82æ\82¤\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+ \81¦DokoPop! Ver.1\82Í\81u\95¶\8e\9a\92\8a\8fo\82Ì\82Ý\81v\82Æ\93¯\82¶\93®\8dì\82ð\82µ\82Ü\82·
+
+ \81¡\95¶\8e\9a\94F\8e¯\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+ MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+ \8fê\8f\8a\82Æ\82µ\82Ä\81A
+ \amodi
+ \82ð\8ew\92è\82µ\82Ü\82·\81B
+ \97á\81F
+ \\server\temp\amodi
+ \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+ \81¡64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é
+ 64bitWindows\82Å\82¤\82Ü\82\83q\83b\83g\82µ\82È\82¢\8fê\8d\87\82É\82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\93®\8dì\82·\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95¶\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95¶\96@\82ð\95×\8b\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://pdic.la.coocan.jp/unicode/langproc.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://pdic.la.coocan.jp/unicode/
+
+\97\9a\97ð ---------------------------------------------------------
+
+
+>> Ver.2.00 <<
+ \81E\95¶\8e\9a\94F\8e¯\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+ \81E\83}\83E\83X\82Ì\92\86\89\9b\83{\83^\83\93\82Ö\82Ì\91Î\89\9e
+
+>> Ver.1.23 <<
+ \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+ \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+ \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+ \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+ \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+ \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+ \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+ - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+ - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+ PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+ \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82¶\82½\82ß\81j
+ * \95¶\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+ \81y\8c´\88ö\81z
+ \81@\8eæ\93¾\82µ\82½\95¶\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+ \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95¶\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95¶\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+--------------------------------------------------------------
--- /dev/null
+========================================================================
+\81y\83\ \83t \83g\96¼\81z \82Ç\82±\83|\83b\83v\81I Ver.2.023
+\81y\93o \98^ \96¼\81z\81@DKPU2023.exe
+\81y\83o\83C\83g \90\94\81z <FILESIZE:DKPU2023.exe> Bytes
+\81y\8c\9f\8dõ \83L\81[\81z\81@1:DOKOPOP 2:PDIC 3:$WIN32 4:#APP 5:#EDU
+\81y\92\98\8dì\8c \8eÒ\81z\81@\82È\82µ
+\81y\8cf \8dÚ \8eÒ\81z\81@DokoPop Project
+\81y\91Î\89\9e \8b@\8eí\81z\81@MS-Windows Vista/7/8/8.1/10
+\81y\93®\8dì \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,7/8/8.1/10
+\81y\8cf \8dÚ \93ú\81z\81@2016.10.06
+\81y\8dì\90¬ \95û\96@\81z\81@DKPU2023.exe \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ \8fð\8c\8f\81z \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81I \82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81I \82Í PDIC/Unicode\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC/Unicode\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC/Unicode \82Ì\93ü\8eè\90æ(\95K\90{)\81F
+ http://pdic.la.coocan.jp/
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+ http://dokopop.sourceforge.jp/
+
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81yDKPU2023.exe\81z\82Å\82·\81B
--- /dev/null
+ http://grabacr.net/archives/1132
+\81¡BUG
+\81Eamodi\82Ì.NET Framework version\82Í\81H
+\81ESetWindowsHookEx\96â\91è
+ - 32bit/64bit\97¼\95ûload\81¨32bit\82ÍOK\81A64bit\82Írun on load context
+ - 32bit\82Ì\82Ýload\81¨32bit\82ÍOK\81A64bit\82Í\96³\94½\89\9e
+ - 64bit\82Ì\82Ýload\81¨64bit\82ÍOK\81A32bit\82Írun on load context
+ - 64bit\82ð\90æ\82Élaunch\81A32bit\82ð\82 \82Æ\82©\82çload\81¨32bit\82ÍOK\81A64bit\82Írun on load context
+ - 64bit/32bit\82ðload\81A\82»\82Ì\8cã64bit\82Ì\82Ýinit/config\81A\82»\82Ì\82 \82Æ32bit\82Ì\82ÝInit\82Ì\82Ý\81¨32bit Init\82ð\8eÀ\8ds\82·\82é\82Ü\82Å\82Í64bit\82ÍOK\81A32bit\82ÌInit\82ð\8ds\82¤\82Æ64bit\82Írun on load context
+ - 64bit\82ð\88Ù\82È\82é\83f\83B\83\8c\83N\83g\83\8a\82Å\8eÀ\8ds\81¨\95Ï\82í\82ç\82¸
+[\88ê\94Ê\93®\8dì]
+\81E[B] Edge@Win10@VMware@PWS300\82Å\95¶\8e\9a\94F\8e¯\82Å\82«\82Ä\82¢\82é\82Ì\82É\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8e\9e\82ª\82 \82é\81¨FAQ
+ \81¨\88Ê\92u\82ð\8cÅ\92è\81A\83t\83H\81[\83J\83X\88Ú\93®
+\81E[B] \83\8d\83O\83C\83\93\82Ìstartup\82Åamodi\82ª\97á\8aO\82Å\97\8e\82¿\82é\81BFileNotFound\82Å\8aÄ\8e\8b\97p\83t\83H\83\8b\83_\81[\82ª\8c©\82Â\82©\82ç\82È\82¢\81H
+\81E[C] Windows shutdown\82ÅExMODI\82ª\97á\8aO\81H
+\81E[B] .NET\82ð4.0\82©\82ç3.5\82É\82Å\82«\82È\82¢\82©\81H
+\81E[B?] main prg\82Ìmain thread\82ªblocking\8fó\91Ô\82É\82È\82é\82Æ\82È\82ºUI\91S\91Ì\82ª\8e~\82Ü\82é\81H
+ \81¨\8e~\82Ü\82Á\82Ä\82¢\82é\82Æ\82±\82ë\82Í\8f\82È\82\82Æ\82àHook\8aÖ\90\94\93à\82Å\82Í\82È\82¢\82ç\82µ\82¢(return\82Ü\82Å\82Ì\8e\9e\8aÔ\82ª\82P\95b\88È\93à\82¾\82Á\82½\81j
+\81E[B] \82Ü\82¾\94{\97¦\8f\88\97\9d\82ª\82¤\82Ü\82\93\82©\82È\82¢
+ - Firefox\81¨\8ag\91å\82È\82µ\82ÅOK
+ - IE\81¨\8ag\91å\8f\88\97\9d\95K\97v
+\81E[C] click\82É\82æ\82éCaptureImage\82Ímain\82©\82ç\82Ì\8cÄ\82Ñ\8fo\82µ\82É\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+ \81¨\82Ç\82Ì\82Ý\82¿wait\82·\82é\82Ì\82¾\82©\82ç\81A\96â\91è\82È\82¯\82ê\82Î\82±\82Ì\82Ü\82Ü\82Å\82¢\82¢\82©\82à\81H
+\81E[C] Capture API\82ª64/32bit\97¼\95û\82Å\8cÄ\82Î\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Í\82Ü\82¸\82¢\82Ì\82Å\82Í\81H\92P\82È\82é\96³\91Ê\81H
+ \81¨\82¹\82ß\82Äbit\90\94\82ð\94»\92f\82µ\82Ä\82©\82ç\82Å\82 \82ê\82Î\81E\81E\81E
+\81E[B?] MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82È\82¢\8fó\8bµ\82ÅDokoPop!\82ð\8bN\93®\81A\82»\82Ì\8cãMODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\82ªamodi\82ª\95¡\90\94\8bN\93®\82µ\82ÄOCR\82ª\93®\8dì\82µ\82È\82¢\8fó\91Ô\82ª\82 \82Á\82½
+ \81¨amodi.exe\82ª\8fI\97¹\82µ\82È\82¢\8fð\8c\8f\82ª\82 \82é\81H
+ \81¨MODI uninstall/install\82ð\82â\82Á\82Ä\82Ý\82½\82ª\8dÄ\8c»\82¹\82¸\81BOS install\8cã\8f\89\89ñ\82¾\82¯\81H
+\81E[C][Win10] SharePoint Designer\82ðWindows10\82É\83C\83\93\83X\83g\81[\83\8b\82·\82é\82Æ\82«\81A.NET\82Ì\83C\83\93\83X\83g\81[\83\8b\82ð\91£\82·\82ª\81A\83G\83\89\81[\82Æ\82È\82è\82Å\82«\82È\82¢\81B\81¨\82»\82à\82»\82à.NET\82Í\93ü\82Á\82Ä\82¢\82é\82Ì\82Å\83C\83\93\83X\83g\81[\83\8b\95s\97v\81Binstaller\82Ì\83o\83O\81H
+\81E[B] \8f]\97\88\95û\8e®\82Ì\95¶\8e\9a\97ñ\92\8a\8fo\82ª\93®\8dì\82µ\82È\82\82È\82Á\82½\81H
+ \81¨DKPUHK64.dll\82ðload\82µ\82½\82½\82ß\81BDKPUHK64\82ðhook\82³\82¹\82é\82Æ32bit\83A\83v\83\8a\8fã\82Åhook\82ª\90³\82µ\82\93®\8dì\82µ\82È\82¢\81i\8fÚ\8d×\82Ì\93®\8dì\82Í\95s\96¾\81j
+ \81¨\82È\82º32bit\83A\83v\83\8a\82Å64bit DLL\82ªhook\82³\82ê\82é\82Ì\82©\81H
+ \82Ü\82Æ\82ß\82é\82Æ\81A
+ - 64bitDLL\82ð\8eg\97p\82·\82é\82Æ\81E\81E\81E32bit\83A\83v\83\8a\8fã\82Å\93®\8dì\82µ\82È\82\82È\82é\81i64bit\83A\83v\83\8a\82ÍOK)
+ - 64bitDLL\82ð\8aO\82·\82Æ\81E\81E\81E\81E\81E32bit\83A\83v\83\8a\82Í\93®\8dì\81A64bit\83A\83v\83\8a\82ÍNG
+\81@ - 64bit DLL\82ðload\82·\82é\82Æ\81A32bit\83A\83v\83\8a\8fã\82É\83}\83E\83X\82ð\88Ú\93®\82µ\82Ä\82àDLL attach\82³\82ê\82È\82¢\81B(32/64bit\97¼\95û)
+ - 64bit DLL\82ðload\82µ\81A32bit\83A\83v\83\8a\8fã\82Åmouse\91\80\8dì\82·\82é\82Æ\81A64bit/32bit\97¼\95û\82ÌDLL\82Ì\8f\88\97\9d\82ª\91\96\82é\81B\82 \82è\82¦\82È\82¢\82¾\82ë\82¤\81H\81H
+ \81ªattach\82³\82ê\82Ä\82¢\82È\82¢\82Ì\82É\82È\82º\94½\89\9e\82Å\82«\82é\81H\81H
+ \81¨64bit DLL\82ÍDKPUHK64.exe\82Å\91\96\82è\81A32bit DLL\82ÍDCHookTest.exe\82Å\91\96\82Á\82Ä\82¢\82é\81I\81I\82È\82º\81H
+ \81¨DKPUHK64.exe\82ð\95Ê\83v\83\8d\83Z\83X\82©\82ç\8bN\93®\82µ\82Ä\82à\8dÄ\8c»\82·\82é\81BDLL\82ÌInit()\8cÄ\82Ñ\8fo\82µ\82ð\82µ\82È\82¯\82ê\82Î\8dÄ\8c»\82µ\82È\82¢\81B
+ SetWindowsHookEx()\82Ì\8eg\97p\82É\96â\91è\82ª\82 \82é\82ç\82µ\82¢\81B
+ \81¨\95Ê\83A\83v\83\8a\82È\82Ì\82É\82È\82º\89e\8b¿\82·\82é\82Ì\82©\81HDLL\82Ì\89½\82©\82ª\82Ô\82Â\82©\82Á\82Ä\82¢\82é\81H
+ http://resources.infosecinstitute.com/using-setwindowshookex-for-dll-injection-on-windows/
+ \82ð\8fn\93Ç\82·\82é\82Æ\89½\82©\83q\83\93\83g\82ª\82 \82é\81H
+ \81¨64bit\82Ì\82ÝInit\82ð\8ds\82¤\82Æ64bit\83A\83v\83\8a\8fã\82Å\90³\8fí\93®\8dì\82µ\81A32bit\83A\83v\83\8a\8fã\82Å\82ÍDKPUHK64.exe\82Ì\83v\83\8d\83Z\83X\8fã\82Å\93®\82
+ - ProcessExplorer\82Å\8am\94F\82·\82é\82Æ\81A64bit\83A\83v\83\8a(\83\81\83\82\92 )\82Ìload\82³\82ê\82Ä\82¢\82éDLL\82ÉDKPUHK64.DLL\82ª\82¢\82È\82¢
+ \81¨dchk64.exe\82Ì\82Ý\82ð\92¼\90Ú\8eÀ\8ds\82µ\82½\8fê\8d\87\82Í\96â\91è\82È\82¢\81H\81H(DKPUHK64.DLL\82ª\83\81\83\82\92 \82Éhook\82µ\82Ä\82¢\82½)
+ \81¨32bit\91¤\82ÌInit()\82ð\82µ\82È\82¢\82Æ\82Ç\82¤\82È\82é\81H
+ \81¨bingo!! DKPUHK64.DLL\82ªload\82³\82ê\82½
+ - [\8dÏ] 64bit DLL\82ÌUninit()\82ª\8cÄ\82Î\82ê\82È\82¢
+ \81¨32bit DLL\82ªUninit()\82³\82ê\82½\82Æ\82«\82ÉDKPUHK64.exe\82ª\8fI\97¹\82µ\82Ä\82¢\82é\81H\81H
+ \81¨Unload\82Ì\82 \82Æ\82ÉUninit\82ª\8cÄ\82Î\82ê\82Ä\82¢\82½\81¨Uninit->Unload\82É\82µ\82½
+\81E[B] \83\81\83\82\92 \82Å\95¶\8e\9a\89»\82¯
+ \81¨meta file\82Ì\8dÄ\90¶\82Å EMR_EXTTEXTOUTW\82Ì\83e\83L\83X\83g\82ª\89»\82¯\89»\82¯
+ \81¨64bit DLL\82ð\96³\8cø\82É\82µ\82½\82ç\82»\82Ì\96â\91è\82Í\94\90¶\82µ\82È\82\82È\82Á\82½\82ª\81A\95Ê\96â\91è\82ª\94\90¶
+\81E[C] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ð\97L\8cø\82É\82µ\82½\92¼\8cã\81AOCR Error\82ª\94\90¶\82·\82é
+ \81¨Reboot()\82µ\82È\82¢\82æ\82¤\82É\82·\82é\82Æ\81A\82»\82Ì\8cã\82Í\90³\8fí\82É\93®\8dì\82·\82é\81B
+ \81¨\82Æ\82è\82 \82¦\82¸Reboot()\82ð\82Í\82¸\82µ\82½\81i\95K\97v\90«\82ª\8d¡\82Ì\82Æ\82±\82ë\96³\82\82È\82Á\82½\82Ì\82Å\81j
+\81E[C] Chrome\82Å\8dÀ\95W\82ª\82¸\82ê\82é@VAIO Pro11
+ \81¨\90Ø\82è\94²\82«\82Í\91Î\8fÛwindow\82Ì\82Ý\82É\8cÀ\92è\82µ\81Aclick point\82à100,100\8cÅ\92è\82É\82¹\82¸\81A\91Î\8fÛwindow\82Åclip\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+ \81¨\82»\82ê\82Í\91Î\89\9e\8dÏ\82Ý\81B\82µ\82©\82µ\96â\91è\82Íwindow8\82Ì\8ag\91å\8b@\94\\82¾\82Á\82½\81B
+ http://grabacr.net/archives/1132
+ GetDpiForMonitor, CDPI class\82 \82½\82è\82ª\8aÌ\82©\81H
+ \81¨GetDeviceCaps(LOGPIXELSx)\82ð\8eg\97p\82·\82ê\82Î\82¢\82¢\82¾\82¯\81H
+ \81¨\8eæ\93¾\95û\96@\82ª\8c©\82Â\82©\82ç\82¸\81B\83\86\81[\83U\81[\93ü\97Í\82Å\82Æ\82è\82 \82¦\82¸\91Î\8f\88
+ \81¨ResolutionScale\82¾\82Á\82½\82ª\82¤\82Ü\82\93®\82©\82È\82¢\81H
+\81E[C] AMODI\82Ìtemporary folder\82ðlock\82µ\82Ä\82¢\82é\82ÆAMODI\82ª\8bN\93®\82Å\82«\82È\82¢\81i\8bN\93®\82µ\82Ä\82à\89½\82à\8c¾\82í\82¸\82É\8fI\97¹\81j
+\81E[?] XP\82Ìdpi scaling\82Í\96â\91è\82È\82©\82Á\82½\81H
+[\88À\92è\90«]
+\81E[B] inc.srch\82ð\97L\8cø\82É\82µ\82Ä\82¢\82é\82ÆDKPUHK64.exe\82Å\97\8e\82¿\82½\81B\81¨MouseMove\82Ì\82Æ\82±\82ë\82ðcomment out
+\81E[B] inc.srch\81{Ctrl+\89E\83N\83\8a\83b\83N\82Å\8c\83\82µ\82\82â\82Á\82Ä\82¢\82é\82ÆAMODI\82Å\97\8e\82¿\82é
+ - inc.srch\82ð\97L\8cø\82É\82µ\82Ä\81A\83^\83X\83N\83g\83\8c\83C\82Ìdp\82Å\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ð\8fo\82µ\81A\90à\96¾\8f\91\82ð\95\\8e¦\82É\83J\81[\83\\83\8b\82ð\8d\87\82í\82¹\82é\82ÆAMODI\82Å\97\8e\82¿\82é@win7
+\81E[B] FileSync\82Å\8c\9f\8dõ\82·\82é\82ÆFileSync\82ªassertion failure\82ð\8bN\82±\82µ\81APDHKU64.exe\82ª\97\8e\82¿\82é
+ - SyncExecFrm.cpp TSyncExecFrame::lbLogDrawItem 627
+ - XP(xw8400)\82Å\82Í\96â\91è\82È\82µ
+\81E[A?] \8c\9f\8dõ\93®\8dì\82µ\82È\82\82È\82é\82Æ\82«\82ª\82 \82é\81H@win7
+ \81¨OS\8dÄ\8bN\93®\82È\82Ç\82Å\8dÄ\8c»\82µ\82È\82\82È\82Á\82½\81H
+\81E[B?] amodi\82ð\8eg\97p\82·\82é\82Æoffice\82Ìinstall\82ª\8en\82Ü\82é\81H@win7
+ \81¨OS\8dÄ\8bN\93®\82È\82Ç\82Å\8dÄ\8c»\82µ\82È\82\82È\82Á\82½\81H
+\81E[Q] DokoPop!\82ªPDIC\82ð\8bN\93®\82·\82é\82Æ\91O\89ñ\82Æ\88Ù\82È\82épath\82É\82 \82éPDIC\82ª\8bN\93®\82µ\82Ä\82µ\82Ü\82¤@vaio\81¨portable\94Å\82¾\82©\82ç\81BFAQ\82É\82 \82Á\82½\82Ù\82¤\82ª\82¢\82¢
+\81E[C] \83]\83\93\83rDKPUHK64.exe\82Ì\8f\88\97\9d
+\81E[C] pdhk64.exe\82ª\8e\80\82ñ\82¾\8e\9e\82Ì\91Î\8dô
+\81E[?] win8\82Ålog off\8e\9e\82Épdhk64.exe\82ª\97\8e\82¿\82é\81H
+\81E[?] stand-by\95\9c\8bA\8cãAMODI\82ª\97\8e\82¿\82é\81H@XP
+\81y\8dÏ\81z
+\81E[B][amodi] \83t\83@\83C\83\8b\8dí\8f\9c\8e\9e\82Ì\97á\8aO\8f\88\97\9d\92Ç\89Á
+\81E[B] WinXP\82Åinc.srch\82ª\82Ü\82Á\82½\82\93®\82©\82È\82¢\81H
+ \81¨WinXP\82Å\82Í\81Aevent/thread\82ÍDLL\92P\88Ê\82Å\82Í\82È\82\81ADLL instance\92P\88Ê\82Å\90¶\90¬\82·\82é\95K\97v\82ª\82 \82Á\82½
+\81E[B] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ª\95p\94É\82É\94\90¶\82·\82é\82½\82ß\8fd\82\82È\82é\81¨\8c\9f\8dõ\82Ì\95p\93x\82ð\89º\82°\82é\95K\97v\82ª\82 \82é
+ \81¨\83J\81[\83\\83\8b\82ª\92â\8e~\82µ\82Ä\82©\82ç0.3\95b\8cã\81A\82È\82Ç
+ \81¨0.1\95b\8cã\82É\82È\82é\82æ\82¤\82É\82µ\82Ä\82 \82é\82Ì\82É\8fd\82¢\81B64bit\83A\83v\83\8a(IE\82È\82Ç)\8fã\82Å\8fd\82\82È\82é\82æ\82¤\82¾\81B
+ \81¨OCR Error\82ª\94\90¶\82·\82é\82Æ\83t\83@\83C\83\8b\8f\91\82«\8d\9e\82Ý\91Ò\82¿\82Ì\82R\95b\82Åwait\82³\82ê\82Ä\82¢\82½\81B
+ \81¨\96{\97\88\82»\82±\82Åwait\82µ\82Ä\82à\83X\83g\83b\83v\82·\82é\82Ì\82Í\82¨\82©\82µ\82¢\81Bwait\82Í\95Êthread\82Å\8ds\82¤\82æ\82¤\82É\82·\82é
+ \81¨\95Êthread\82Å\8eÀ\8ds\82·\82é\82æ\82¤\82É\82µ\82½\81¨OK
+\81E[B] \83\81\83\82\92 \82ÅOCR\82ª\93®\8dì\82µ\82È\82¢
+ \81¨GetDIBits()\82Å\83\81\83\82\83\8a\95s\91«\83G\83\89\81[\82ª\94\90¶\82µ\82Ä\82¢\82é
+ \81¨MODI\82Ìinstall\82ª\81u\83}\83C\83R\83\93\83s\83\85\81[\83^\82©\82ç\8eÀ\8ds\81v\82É\82È\82Á\82Ä\82¢\82½\81i\96{\93\96\82Í\81u\83}\83C\83R\83\93\83s\83\85\81[\83^\82©\82ç\82·\82×\82Ä\8eÀ\8ds\81v\81j
+
+\81¡DPI awareness
+http://ascii.jp/elem/000/000/905/905248/ - \82í\82©\82è\82â\82·\82¢\90à\96¾(\93ú\96{\8cê)
+http://www.telerik.com/blogs/winforms-scaling-at-large-dpi-settings-is-it-even-possible- - \8aÈ\92P\82È\8aT\97v\90à\96¾
+http://kynosarges.org/WindowsDpi.html - \82±\82¿\82ç\82Ì\82Ù\82¤\82ª\82¢\82¢\90à\96¾\81H
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn469266%28v=vs.85%29.aspx - HighDPI \91Î\89\9e\88ê\97\97\82È\82Ç\97l\81X\82È\8fî\95ñ
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd464659%28v=vs.85%29.aspx - High DPI\91Î\89\9e\83v\83\8d\83O\83\89\83~\83\93\83O(8.1\97p\82µ\82©\8f\91\82¢\82Ä\82¢\82È\82¢\81H)
+Windows8.1\82Å\82Í 96dpi(100%), 120dpi(125%), 144dpi(150%), 192dpi(200%)\82Ì\8el\82Â\82 \82é
+\81E\8am\94F\8e\96\8d\80
+ - WinXP\82Å\82àDPI\82ð\95Ï\8dX\82·\82é\82ÆDokoPop!\82Í\90³\82µ\82\93®\8dì\82µ\82È\82©\82Á\82½\82Ì\82Å\82Í\81H
+\81E\8e\8e\82µ\82É\82â\82Á\82Ä\82Ý\82é\82±\82Æ - manifest\82ðDPI aware\82É\95Ï\82¦\82Ä\82Ý\82é
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+ <asmv3:application>
+ <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+ <dpiAware>true</dpiAware>
+ </asmv3:windowsSettings>
+ </asmv3:application>
+</assembly>
+\81E\82â\82é\82±\82Æ
+ - manifest\82ÅDPI awareness\82ð\8ew\92è(or SetProcessDpiAwareness API) - DokoPop!\82Ímonitor\82²\82Æ\82É\82·\82é\95K\97v\82ª\82 \82é(\82½\82¾\82µ8.1\88È\8d~)
+ - GetDpiForMonitor() \82ÅDPI\8eæ\93¾ (8.1\88È\8d~\82Ì\82Ý)
+ - WM_DPICHANGED\82ðhandling\82·\82é
+ \81ª\82±\82Ì\95û\96@\82¾\82Æ8.1\88È\8d~\82µ\82©\91Î\89\9e\82Å\82«\82È\82¢\82Ì\82Å\82Í\81H
+\81E\82â\82é\82±\82Æ\81E\82»\82Ì\82Q
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn469266%28v=vs.85%29.aspx#appendix_a_setting_high_DPI_in_windows
+\82±\82ê\82æ\82è\81A
+ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+MONITORINFOEX LogicalMonitorInfo;
+LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);
+GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+(PhysicalDesktopWidth, PhisicalMonitorWidth) = QueryDisplayConfig()\82ÌDISPLAYCONFIG_MODE_INFO\82ÌpModeInfoArray[i].sourceMode.width
+
+(\8eQ\8dl)Windows8\82É\82Í\81A
+PhysicalToLogicalPoint/LogicalToPhysicalPoint\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82é\82»\82¤\82È\81B
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn384112%28v=vs.85%29.aspx
+
+PhysicalToLogicalPointForPerMonitorDPI function/LogicalToPhysicalPointForPerMonitorDPI - \82±\82ê\82ÍDPI-awareness levelo\82Ì\89e\8b¿\82ð\8eó\82¯\82È\82¢ (Win8.1\88È\8d~)
+GetDpiForMonitor - (Win8.1\88È\8d~)
+
+\81HPhysical Desktop Width/Physical Monitor Width
+> To get the physical desktop width and physical monitor width, call QueryDisplayConfig. For each DISPLAYCONFIG_MODE_INFO in the returned pModeInfoArray, check the pModeInfoArray[i].sourceMode.width (and height and position) to reconstruct the bounding rect of all the monitors.
+\82Æ\82 \82é\82ª\81A\82Ç\82Ì\82æ\82¤\82É\8eæ\93¾\82·\82ê\82Î\82¢\82¢\82Ì\82¾\81H
+source\82ªdesktop\82Åtarget\82ªmonittor\81H
+
+\88È\8fã\82ª\90³\82µ\82¢\82Æ\82·\82é\82Æ\81AScaleFactor\82Í\81A
+ScaleFactor = (1280/1280) / (1920/1920) = 1 \82Æ\82È\82Á\82Ä\82µ\82Ü\82¤\81H\81H\81\97VAIO
+
+\81¡TODO
+\81E[B] x64\82Í\95Ê\83f\83B\83\8c\83N\83g\83\8a\82É\82·\82é\82Æ\8f]\97\88\83t\83b\83N\82ª\93®\82\82æ\82¤\82É\82È\82é\82Ì\82Å\82Í\81H
+ \81¨\82È\82³\82»\82¤
+\81E[B-] MODI\83C\83\93\83X\83g\81[\83\8b\82Í\90ê\97p\89æ\96Ê\82É\82·\82é(URL\83W\83\83\83\93\83v)
+ - \8dÅ\8f\89\82Ì\89æ\96Ê\82Í\90ê\97pDLG\82É\82·\82é
+ \81¨\88ê\92U\8e©\95ª\82ÌHP(source forge?)\82É\94ò\82ñ\82Å\82©\82çredirect?
+\81E[B] \8fí\82É\94F\8e¯\82ð\8ds\82¤AMODI\82ð\82à\82¤\88ê\82Â\97p\88Ó\82µ\82Ä\81A\83|\83b\83v\83A\83b\83v\82·\82é\82Ü\82Å\82Ì\8e\9e\8aÔ\82ð\92Z\8fk\82µ\82Ä\82Ý\82Ä\82Í\82Ç\82¤\82©\81H
+ - \8f\82µ\82µ\82©\88Ú\93®\82µ\82Ä\82¢\82È\82¢\8fê\8d\87\81A\94F\8e¯\82µ\82½\8dÀ\95W\82Ì\83I\83t\83Z\83b\83g\82ð\8cv\8eZ\82·\82é\82Æ\82©\81H
+\81E[B] MODI\83C\83\93\83X\83g\81[\83\8b\8cã\81ADokoPop!\8dÄ\8bN\93®\96³\82µ\82É\82Å\82«\82È\82¢\82©\81H
+ \81¨AMODI.exe\82ð\8eÀ\8ds\82·\82é\95K\97v\82ª\82 \82é\82½\82ß\81A\8f\88\97\9d\82Æ\82µ\82Ä\82Í\8c\8b\8d\\8fd\82¢
+ \81¨Wizard\8c`\8e®\82É\82·\82é\95K\97v\82ª\82 \82é\82Ì\82Å\82Í\81H
+\81EWizard\8c`\8e®\82Ì\8c\9f\93¢
+ - AMODI.exe\8eÀ\8ds\83G\83\89\81[\81¨MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82È\82¢\82Æ\89¼\92è\82·\82é
+ - \83C\83\93\83X\83g\81[\83\8b\89Â\94Û\82Ì\96â\82¢\8d\87\82í\82¹
+ - Web\83y\81[\83W\82ð\95\\8e¦\82µ\82Ä\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82¤\81©\8e©\91O\82ÌHP\82ð\97p\88Ó\82·\82é
+ - \83C\83\93\83X\83g\81[\83\8b\82Ì\88ê\94Ô\8dÅ\8cã\82ÉDokoPop!\82Ì\91\80\8dì(\8dÄ\8bN\93®\81H\81j\82ð\91£\82·
+\81E[B] Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\95Â\82¶\82é\82ð\8aO\82·\82ª\93®\82©\82È\82¢
+\81E[B] aero/metro\97L\8cø\8e\9e\82Ì\93®\8dì\83e\83X\83g
+\81E[B] PDIC\96{\91Ì\82Ì\8bN\93®\8am\94F\82Í\82Ç\82¤\82·\82é\81H
+\81E[B] VUP\8b@\94\
+\81E[B] Q&A\82Ì\97p\88Ó
+\81E[C] VUP\92Ê\92m\8b@\94\
+\81E[C] amodi OCR\93®\8dì\92\86\82ð\82Ç\82±\82©\82Å\8fo\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+\81E[C] \82à\82¤\8f\82µclickable area\82ð\8dL\82\82Å\82«\82È\82¢\82©\81Hpdf\82Å\82Í\83q\83b\83g\82³\82¹\82é\82Ì\82ª\93ï\82µ\82¢\81¨MARGIN_UNDER_CLICK\82Å\92²\90®
+\81E[C] metro\8fã\81AWin8/PDF Viewer\8fã\82È\82Çwin8\93Æ\8e©\83A\83v\83\8a\82Å\82Ì\93®\8dì\83e\83X\83g
+\81E[B] biggest\82ª\83q\83b\83g\82µ\82È\82¢
+\81E[C] \93ñ\8fd\8bN\93®\93®\8dì\83e\83X\83g
+\81E[C] installer
+ - version\8e©\93®\95t\82¯\91Ö\82¦\8b@\94\
+\81E[B?] popup\8c\9f\8dõ\8e\9e\82àmulti thread\82É\82·\82é
+ - \82»\82ê\82æ\82è\81A\97D\90æ\8f\87\88Ê\82Ì\8d\82\82¢\82à\82Ì\82©\82ç\97D\90æ\93I\82É\95\\8e¦\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82©\82à\82µ\82ê\82È\82¢
+ - \82Ç\82±\82Å\8e\9e\8aÔ\82ª\82©\82©\82Á\82Ä\82¢\82é\82Ì\82©\82à\82¤\8f\82µ\8fÚ\82µ\82\92²\82×\82é
+\81E[C] AMODI\88Ù\8fí\8fI\97¹\91Î\8dô
+ - DLL\82à\88ê\8f\8f\82É\8e\80\96S\82·\82é\82½\82ß\81A\8dÄ\8bN\93®\82µ\82©\82È\82¢\81H\81¨\90Ý\92è\82ª\8c³\82É\96ß\82é\82à\82Ì\82ª\82 \82é\82½\82ß\82æ\82ë\82µ\82\82È\82¢
+\81E[C?] PDIC\8fã\82Å\82Íinc.srch\82ª\93®\8dì\82µ\82È\82¢\82æ\82¤\82É\82·\82é\81¨\96â\91è\82È\82¢\81H
+\81E[C] button down\82ðtrigger\82É\82µ\82Ä\82¢\82é\82ª\81Abutton up\82ðtrigger\82É\82µ\82Äup cancel\82·\82é\82Ì\82ð\8e~\82ß\82Ä\82Ý\82Ä\82Í\81H
+ [\95¶\8c¾]
+ MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\82ÆDokoPop!\82Å\8c\9f\8dõ\82Å\82«\82é\83A\83v\83\8a\82ð\91\9d\82â\82·\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+ (URL)\82ð\8eQ\8dl\82É\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ \81¦\83\8a\83\93\83N\90æ\82Ì\83y\81[\83W\82ª\90³\82µ\82\95\\8e¦\82³\82ê\82È\82¢\8fê\8d\87\82Í\81A"MODI OCR \83C\83\93\83X\83g\81[\83\8b"\82Å\83l\83b\83g\8c\9f\8dõ\82µ\82Ä\92²\82×\82Ä\82Ý\82Ä\82\82¾\82³\82¢\81B
+ \81¦Win2K\82Å\82Í\82»\82Ì\82Ü\82Ü\82Å\82Í\8eg\97p\82Å\82«\82Ü\82¹\82ñ\81B
+\81E[C] AMODI\82Ì\8fI\97¹\91Î\8dô
+ - DokoPop!\8dÄ\8bN\93®\82Å\82¢\82¢\82©\81H
+ - \8dÅ\92á\82Å\82à\8cx\8d\90\82ð\8fo\82µ\82½\95û\82ª\81H
+\81E[C] \83l\83b\83g\83\8f\81[\83N\83\82\81[\83h - AMODI\82ðserver\8fã\82É\92u\82
+ - Windows\8b¤\97L\82Å\82¢\82¢\81H - \82±\82Ì\8dÛ\81A\83t\83@\83C\83\8b\8ew\92è\82ª\95K\97v
+ - TCP/IP\82Í\8d\82\91¬\82¾\82¯\82Ç\81A\96Ê\93|\82¾\82µ\82È\81B\81B
+ reponse\82ª\88«\82¯\82ê\82ÎTCP/IP\82ð\8dl\82¦\82é
+
+\81¡BUG\8a®\97¹
+\81E[B] MODI install - \83^\83C\83~\83\93\83O\82ª\88«\82¢\82Æ\81A
+ MODI\83C\83\93\83X\83g\81[\83\8b\92\86\82ÉMODI\94F\8e¯\81¨\8dÄ\8bN\93®\81¨MODI\8cë\94F\81iinstall\82³\82ê\82Ä\82¢\82È\82¢\81j\81¨\8dÄ\82Ñ\83C\83\93\83X\83g\81[\83\8b\82µ\82ëDialog
+ \81¨interval\82ð\92u\82¢\82Ächeck\82·\82é\82æ\82¤\82É\82µ\82½
+\81E[B] MODI\83C\83\93\83X\83g\81[\83\8bDIALOG\82ð\95Â\82¶\82é\82Æ\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82é
+ \81¨FormCreate\92\86\82Édialog\82ð\95\\8e¦\82³\82¹\82½\82½\82ß\81¨IdleProc\82Ö
+\81E[A] \8f]\97\88\82Ìdokopop\82ª\93®\82©\82È\82\82È\82Á\82½@vaio
+ \81¨USE_VXD\91Î\89\9e\82É\82æ\82èWindowsNT flag\82ªfalse\82É\82È\82Á\82Ä\82µ\82Ü\82Á\82½\82½\82ß\81AGetTextFromPoint()\82ª\8eÀ\8e¿\89½\82à\8eÀ\8ds\82¹\82¸-1\82ð\95Ô\82µ\82Ä\82¢\82½\82½\82ß\81B
+\81E[B?] \8f\89\8aú\89»\8e\9e\82É64\91¤\82ÌConfig2\82ª\8cÄ\82Î\82ê\82È\82¢\81H
+ \81¨pdhk64\82ª\8f\89\8aú\89»\8a®\97¹\82·\82é\91O\82ÉConfig\82µ\82Ä\82¢\82½
+\81EPDF\82Å\94÷\96\82É\8fã\89º\88Ê\92u\82ª\82¸\82ê\82é\82Æ\82«\82ª\82 \82é\81¨\94F\8e¯\91Î\8fÛ\95¶\8e\9a\97ñ\82Ì\90æ\93ª\82É\97]\8cv\82È\8bó\8ds\82ª\93ü\82é\8fê\8d\87\82ª\82 \82Á\82½\82½\82ß
+\81E[C] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`ON\82Å\97\8e\82¿\82é
+ - Config2()\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82¢\82é\82¾\82¯\82Ì\82Í\82¸\82¾\82ª\81Ahook/unhook\82ª\8cÄ\82Î\82ê\82Ä\82¢\82é
+ \81¨Config2()\82©\82çTHookLoader::Capture\82Ü\82Å\82Ì\8aÔ\82É\8cÄ\82Î\82ê\82Ä\82¢\82é
+ \81¨config\92¼\8cã\82Émouse move message\82ªcallback\82³\82ê\81A\82·\82®\82Écapture\82·\82é\82©\82ç\82¢\82¯\82È\82¢\82Ì\82©\81H
+ \81¨\82¢\82â\81AhDll->Capture()\8e©\91Ì\82ª\95s\88À\92è\82¾\82Á\82½\81B\82Æ\82¢\82¤\82±\82Æ\82Í\90ö\8dÝ\93I\82É\82 \82Á\82½\96â\91è\81H(AMODI=OFF)
+ \81¨DBW\82ðOFF\82É\82µ\82½\82ç\89ð\8c\88\81i\82Å\82Í\89½\82ª\96{\93\96\82Ì\8c´\88ö\81H\81j
+\81E[B] VS2010\82Ì\83G\83f\83B\83^\81[\82Å\90³\8fí\82É\93®\82©\82È\82¢
+ \81¨click point\82ª100pixel\82\82ç\82¢\89E\82É\82¸\82ê\82Ä\82¢\82é\81H\8fã\89º\95û\8cü\82à
+ \81¨amodi\91¤\82Í\96â\91è\82È\82µ\81Bcaptured image\82Æcursor\8dÀ\95W\82ª\82¸\82ê\82Ä\82¢\82é\81H
+ - capture page\82ð\82µ\82Ä\82à\82¸\82ê\82Ä\82¢\82é\81B
+ \81¨\82í\82©\82Á\82½\81Bmouse cursor\82ÍGetWindowRect()\82É\82æ\82éwindow\91S\91Ì\82È\82Ì\82É\91Î\82µ\81A
+ \89æ\91\9c\82ÍGetWindowDC()+BitBlt(hdc)\82Å\82â\82Á\82Ä\82¢\82é\82½\82ß\81Ahdc\82ª\91Î\8fÛ\82É\82È\82Á\82Ä\82µ\82Ü\82¤\81B
+ \81¨screen\8dÀ\95W\8cn\82Åpoint\82ð\88µ\82¢\81A\89æ\91\9c\82ÍGetWindowRect()\82Ì\97Ì\88æ\82ðBitBlt\82·\82é\82±\82Æ\82Å\91Î\89\9e
+\81E[B][inc.srch] \83}\83E\83X\89º\82Ì\83A\83v\83\8a\82ª\97\8e\82¿\82é(task manager@7 task manager,explorer@XP)
+ \81¨SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+ \82Å\97\8e\82¿\82Ä\82¢\82½\82Ì\82Å\81ARETRYMETA\82ð0\82É\82µ\82½\81¨\82Ü\82¾\97\8e\82¿\82é
+ \81¨MouseProc\82ÆDoCapture\82ð\95ª\97£\82·\82ê\82Î\88À\92è\82·\82é\82ñ\82¶\82á\82È\82©\82ë\82¤\82©\81H
+ \81¨\8c\8b\98_\81F\95ª\97£\82µ\82Ä\81ADBW\82Í\95s\88À\92è\82É\82µ\81ADCHookTest.exe\82Ìbreakpoint\82à\95s\88À\92è\97v\88ö
+\81E[A] Chrome\82ÅCtrl+\89E\83N\83\8a\83b\83N\82·\82é\82Æhit window\82ª\8fo\82é\92¼\91O\82ÉChrome\82ª\97\8e\82¿\82é
+ \81¨CaptureText\82ª\88«\82¢\82æ\82¤\82¾
+ \81¨ExtTextOutX()\82Ì\8f\91\82«\8a·\82¦(METAEXTTEXTOUT)\8e©\91Ì\82ª\8c´\88ö(\91ã\91Ö\8aÖ\90\94\82Ì\96â\91è\82Å\82Í\82È\82¢\81j
+ \81¨\8d¡\82Ü\82Å\82È\82º\93®\82¢\82Ä\82¢\82½\81H
+ - SetWriteProtect()\82Åprotect\89ð\8f\9c\82µ\82½\82Ì\82ª\88«\82¢\82æ\82¤\82¾
+ - \82»\82ê\82æ\82è\81AhProcess\82ªerror\82ð\8bN\82±\82µNULL\82¾\82Á\82½
+ \81¨\82±\82ê\82Å\97\8e\82¿\82é\82±\82Æ\82Í\89ð\8fÁ\82Å\82«\82½\82ª\81AhProcess\82ªNULL\82Ì\96â\91è\82ª\82 \82é
+\81E[CB] OpenProcess\82Åerror
+ \81¨EnablePrivilege()\82ð\92Ç\89Á\82·\82é\82±\82Æ\82ÅOK
+\81E[B] inc.srch\82Ì\93®\8dì\82ª\8fd\82¢
+ - ExecOCR-2\82Ì\8cã\82ª\82Ù\82Ú\92â\8e~\8fó\91Ô
+ \81¨MODI OCR Error\82ª\94\90¶\82µ\82½\82Æ\82«\82É1.4sec\82Ù\82Ç\8e~\82Ü\82é
+ \81¨\94\92\82Ì\89æ\91\9c\82ª\82Å\82«\82Ä\82¢\82é
+ \81¨\8e\9e\81XGetDIBits()\82Å\8e¸\94s(error code\95s\96¾)\81B
+ \81¨\89æ\91\9c\83R\83s\81[\82Ì\83G\83\89\81[\83`\83F\83b\83N\82ð\82µ\82Á\82©\82è\82â\82Á\82½\82çMODI OCR Error\82Í\8bN\82«\82Ä\82¢\82È\82¢
+
+\81¡FAQ
+\81E\8aÇ\97\9d\8eÒ\8c \8cÀ\82Ì\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81@\81¨\8aÇ\97\9d\8eÒ\8c \8cÀ\82ÅDoioPop!\82ð\8bN\93®\82·\82ê\82Î\89Â\94\
+ \81¨MODI\82ð\8eg\97p\82·\82ê\82Î\89Â\94\\81H
+
+\81¡Note
+\81EDCHook.dll\82ðVisualC++ 2010\82Å\83r\83\8b\83h\82·\82é\82Æ\81AWindows2000\82Å\93®\8dì\82µ\82È\82\82È\82Á\82Ä\82µ\82Ü\82¤\81I\81I
+ \81iLoadLibrary\82Å\83G\83\89\81[\81j
+ \81¨DCHook/DCHook.6.0.sln\82ðVisualStudio2008\82Å\8aJ\82«\81A\83r\83\8b\83h\82·\82é
+\81E64bit\83A\83v\83\8a\8fã\81¨32bitDLL\82Ì\82Ý\82ª\94½\89\9e
+ 32bit\83A\83v\83\8a\8fã\81¨32bit/64bit\97¼\95û\82ÌDLL\82ª\94½\89\9e
+
+\81¡MODI
+WindowsXP\88È\8d~\91Î\89\9e(?)
+- MDI to TIFF File Converter
+ \81¨\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä\82Ý\82½\82ªbuild\82Å\82«\82¸(C:\Program Files (x86)\modiconv\82Émdivwctl.dll\82Æ\82¢\82¤\83t\83@\83C\83\8b\82Í\8c©\82Â\82©\82ç\82È\82©\82Á\82½\81j
+- SharePoint Designer 2007\82ð\83C\83\93\83X\83g\81[\83\8b
+ http://www.microsoft.com/ja-jp/download/details.aspx?id=21581
+ "C:\Program Files (x86)\Common Files\Microsoft Shared\MODI\12.0"
+ \82É
+ MDIVWCTL.DLL
+ \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82Å\82«\82é\82Ì\82Å\81A\82±\82ê\82ðC#\82Ì\83v\83\8d\83W\83F\83N\83g\82Ì\8eQ\8fÆ\83p\83X\82É\8ew\92è\82·\82é
+ \81¦MODI/11.0\82Å\82Íamodi\82ªbuild\82Å\82«\82È\82¢(MODI\82ª\8c©\82Â\82©\82ç\82È\82¢error)@XP/VS2010
+- SharePoint Designer\82È\82ñ\82Ä\8eg\82í\82È\82¢\81A\82Ù\82©\82Ì\95û\96@\82Í\82È\82¢\82©\81H
+ http://support.microsoft.com/kb/982760/ja-jp
+ \82½\82¾\82µ\81A\93®\8dì\96¢\8am\94F\81¨\83\8a\83\93\83N\90Ø\82ê2014.11.11
+
+\81¡BUILD
+\81EDCHook64 - VisualC++ 2010\82Å\8dì\90¬
+\81E2016.9.22
+ DCHook.vcproj\82Éx64\97p\82ÌConfiguration\82ð\92Ç\89Á\81AVS3008\82Åx64\82ð\83r\83\8b\83h\82Å\82«\82é\82æ\82¤\82É\82µ\82½\81B
+ DCHook\VS2003, DCHook\VS2008, DCHook\VS2015\82Æ\82¢\82¤\83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82µ\82½\82ª\82¢\82¸\82ê\82à\90³\8fí\82É\82¢\82©\82È\82¢\81B
+ VS2008\82É\82Â\82¢\82Ä\82Í.vcproj\83t\83@\83C\83\8b\82ðDCHook\DCHook.vcproj\83t\83@\83C\83\8b\82Æ\94ä\8ar\82µ\82Ä\90Ý\92è\82·\82ê\82Î\82¤\82Ü\82\93®\82\82æ\82¤\82É\82È\82é\82Æ\8ev\82¤
+ \8c»\8e\9e\93_\82Ì\83v\83\8d\83W\83F\83N\83g
+ DCHook.6.0.sln, DCHook.vcproj\82ðVS2008\82Å\83r\83\8b\83h\82·\82é
+ \81¦DCHook.sln\82ÍVS2010\97p
+
--- /dev/null
+USEUNIT("main.cpp");\r
+//---------------------------------------------------------------------------\r
+This file is used by the project manager only and should be treated like the project file\r
+
+\rmain
\ No newline at end of file
--- /dev/null
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value=".\obj\ExMODIst.exe"/>
+ <OBJFILES value="main.obj"/>
+ <RESFILES value=""/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES)"/>
+ <LIBFILES value=""/>
+ <LIBRARIES value=""/>
+ <SPARELIBS value=""/>
+ <PACKAGES value="Vcl50.bpi Vclx50.bpi bcbsmp50.bpi Qrpt50.bpi Vcldb50.bpi Vclbde50.bpi
+ ibsmp50.bpi vcldbx50.bpi TeeUI50.bpi TeeDB50.bpi Tee50.bpi TeeQR50.bpi
+ VCLIB50.bpi bcbie50.bpi vclie50.bpi Inetdb50.bpi Inet50.bpi NMFast50.bpi
+ dclocx50.bpi bcb2kaxserver50.bpi TNTLIBR.bpi dclusr50.bpi"/>
+ <PATHCPP value=".;"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+ <RELEASELIBPATH value="$(BCB)\lib\release"/>
+ <LINKER value="tlink32"/>
+ <USERDEFINES value=""/>
+ <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
+ <MAINSOURCE value="ExMODIst.bpf"/>
+ <INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl"/>
+ <LIBPATH value="$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+ <WARNINGS value="-w-par"/>
+ </MACROS>
+ <OPTIONS>
+ <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -f- -X- -a8 -5 -b- -k- -vi -tWC
+ -tWM -c"/>
+ <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+ <RFLAGS value=""/>
+ <AFLAGS value="/mx /w2 /zn"/>
+ <LFLAGS value="-D"" -ap -Tpe -x -Gn"/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+ <ALLRES value="$(RESFILES)"/>
+ <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=1
+Item0=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[HistoryLists\hlFinalOutputDir]
+Count=2
+Item0=.\obj\
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+ </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
--- /dev/null
+// ExMODIst.cpp : \83R\83\93\83\\81[\83\8b \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83G\83\93\83g\83\8a \83|\83C\83\93\83g\82ð\92è\8b`\82µ\82Ü\82·\81B
+//
+
+#include "stdafx.h"
+#include "ExMODIst.h"
+#include "MDIVWCTL.tlh"
+
+using namespace modi;
+
+bool IsMODIAvailable();
+
+using namespace std;
+
+int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
+{
+ if (IsMODIAvailable()){
+ return 1;
+ }
+ return 0;
+}
+
+bool IsMODIAvailable()
+{
+ bool bRet= true;
+
+ HRESULT hr;
+ modi::IDocument *IDobj = NULL;
+
+ hr = CoInitialize(0);
+ if ( SUCCEEDED(hr))
+ {
+ hr = CoCreateInstance(CLSID_Document,NULL,CLSCTX_ALL,IID_IDocument,(void**) &IDobj);
+
+ if ( SUCCEEDED(hr) )
+ {
+ IDobj->Release();
+ } else {
+ bRet= false;
+ }
+
+ } else {
+ bRet= false;
+ }
+
+ return bRet;
+}
--- /dev/null
+#pragma once
+
+#include "resource.h"
--- /dev/null
+//Microsoft Visual C++ \82Å\90¶\90¬\82³\82ê\82½\83\8a\83\\81[\83X \83X\83N\83\8a\83v\83g\82Å\82·\81B
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 2 \83\8a\83\\81[\83X\82©\82ç\90¶\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+#include "afxres.h"
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+LANGUAGE 17, 1
+#pragma code_page(932)
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// \83X\83g\83\8a\83\93\83O \83e\81[\83u\83\8b
+//
+
+STRINGTABLE
+BEGIN
+ IDS_APP_TITLE "ExMODIst"
+END
+
+#endif
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 3 \83\8a\83\\81[\83X\82©\82ç\90¶\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+#ifndef _AFXDLL
+#include "l.JPN\\afxres.rc"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // APSTUDIO_INVOKED \82Å\82È\82¢\8fê\8d\87
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ExMODIst", "ExMODIst.vcxproj", "{1061424B-BA88-4553-AFB9-5A89717E44D7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1061424B-BA88-4553-AFB9-5A89717E44D7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1061424B-BA88-4553-AFB9-5A89717E44D7}.Debug|Win32.Build.0 = Debug|Win32
+ {1061424B-BA88-4553-AFB9-5A89717E44D7}.Release|Win32.ActiveCfg = Release|Win32
+ {1061424B-BA88-4553-AFB9-5A89717E44D7}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ExMODIst"
+ ProjectGUID="{1061424B-BA88-4553-AFB9-5A89717E44D7}"
+ RootNamespace="ExMODIst"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="2"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ 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|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="2"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\ExMODIst.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="\83w\83b\83_\81[ \83t\83@\83C\83\8b"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\ExMODIst.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.h"
+ >
+ </File>
+ <File
+ RelativePath=".\targetver.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="\83\8a\83\\81[\83X \83t\83@\83C\83\8b"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\ExMODIst.rc"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath=".\ReadMe.txt"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{1061424B-BA88-4553-AFB9-5A89717E44D7}</ProjectGuid>
+ <RootNamespace>ExMODIst</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="ExMODIst.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="ExMODIst.h" />
+ <ClInclude Include="Resource.h" />
+ <ClInclude Include="stdafx.h" />
+ <ClInclude Include="targetver.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="ExMODIst.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="ソース ファイル">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="ヘッダー ファイル">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="リソース ファイル">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="ExMODIst.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>ソース ファイル</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="ExMODIst.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="Resource.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="stdafx.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ <ClInclude Include="targetver.h">
+ <Filter>ヘッダー ファイル</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="ExMODIst.rc">
+ <Filter>リソース ファイル</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+Visual Studio 2008でビルドする必要あり。(だったと思う)
+でないと、アプリ起動時にMODIが入っていないとエラーになる(だったと思う)
--- /dev/null
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by ExMODIst.rc
+//
+
+#define IDS_APP_TITLE 103
+
+// \90V\82µ\82¢\83I\83u\83W\83F\83N\83g\82Ì\8e\9f\82Ì\8aù\92è\92l
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
--- /dev/null
+//---------------------------------------------------------------------------
+#include <windows.h>
+#include <oleidl.h>
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+
+const GUID CLSID_Document =
+ {0x40942a6c,0x1520,0x4132,{0xbd,0xf8,0xbd,0xc1,0xf7,0x1f,0x54,0x7b}};
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+ const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+
+MIDL_DEFINE_GUID(IID, IID_IDocument,0xD4073843,0xA58A,0x469A,0xA8,0xE2,0xCF,0xF3,0xFF,0x77,0xEE,0x4E);
+
+#define _Inout_
+#define _In_
+#define _Out_
+#define _Deref_out_opt_
+
+struct __POSITION {};
+typedef __POSITION* POSITION;
+
+typedef /* [v1_enum] */
+enum WTS_ALPHATYPE
+ { WTSAT_UNKNOWN = 0,
+ WTSAT_RGB = 1,
+ WTSAT_ARGB = 2
+ } WTS_ALPHATYPE;
+
+class IFilterChunkValue;
+
+interface IDocument
+{
+protected:
+ IDocument() : m_refCount(0)
+ {
+ }
+
+public:
+ virtual ~IDocument()
+ {
+ }
+
+ virtual LONG AddRef()
+ {
+ return InterlockedIncrement((long*)&m_refCount);
+ }
+
+ virtual LONG Release()
+ {
+ //__assert__(m_refCount > 0);
+ if (InterlockedDecrement((long*)&m_refCount) == 0)
+ {
+ delete this;
+ return 0;
+ }
+
+ return m_refCount;
+ }
+
+ virtual HRESULT LoadFromStream(
+ _Inout_ IStream* pStream,
+ _In_ DWORD grfMode) = 0;
+ virtual void InitializeSearchContent() = 0;
+ virtual void BeginReadChunks() = 0;
+
+ virtual BOOL GetThumbnail(
+ _In_ UINT cx,
+ _Out_ HBITMAP* phbmp,
+ _Out_ WTS_ALPHATYPE* pdwAlpha) = 0;
+
+ virtual void ClearChunkList() = 0;
+ virtual BOOL SetChunkValue(
+ _In_ IFilterChunkValue* value) = 0;
+ virtual BOOL ReadNextChunkValue(
+ _Deref_out_opt_ IFilterChunkValue** value) = 0;
+ virtual void RemoveChunk(
+ _In_ REFCLSID guid,
+ _In_ DWORD pid) = 0;
+ virtual POSITION FindChunk(
+ _In_ REFCLSID guid,
+ _In_ DWORD pid) = 0;
+
+ virtual LPVOID GetContainer() const = 0;
+
+protected:
+ volatile LONG m_refCount;
+};
+
+#pragma argsused
+bool MODIAvail();
+int main(int argc, char* argv[])
+{
+ if (MODIAvail())
+ return 1;
+ return 0;
+}
+
+bool MODIAvail()
+{
+ bool exist = false;
+ HRESULT hr = CoInitialize(0);
+ if (SUCCEEDED(hr)){
+ IDocument *IDobj = NULL;
+ hr = ::CoCreateInstance(CLSID_Document, NULL, CLSCTX_ALL, IID_IDocument, (void**)&IDobj);
+ if (SUCCEEDED(hr)){
+#if 0
+ hr = IDobj->Create(AsciiToBSTR("H:\\temp\\nishikawat\\amodi\\2014-12-02-151156.bmp"));
+ if (SUCCEEDED(hr){
+
+ }
+#endif
+ exist = true;
+ IDobj->Release(); //TODO: stack\82ð\89ó\82µ\82Ä\82µ\82Ü\82¤
+ }
+ }
+ CoUninitialize();
+
+ return exist;
+}
+
+
--- /dev/null
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h ExMODIst.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83X \83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
--- /dev/null
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
--- /dev/null
+#pragma once
+
+// \88È\89º\82Ì\83}\83N\83\8d\82Í\81A\8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\92è\8b`\82µ\82Ü\82·\81B\8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82Æ\82Í\81A
+// \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\8eÀ\8ds\82·\82é\82½\82ß\82É\95K\97v\82È\8b@\94\\82ð\94õ\82¦\82½\8dÅ\82à\8cÃ\82¢\83o\81[\83W\83\87\83\93\82Ì Windows \82â Internet Explorer \82È\82Ç
+// \82ð\82¢\82¢\82Ü\82·\81B\82±\82ê\82ç\82Ì\83}\83N\83\8d\82Í\81A\8ew\92è\82µ\82½\83o\81[\83W\83\87\83\93\82Æ\81A\82»\82ê\88È\91O\82Ì\83o\81[\83W\83\87\83\93\82Ì\83v\83\89\83b\83g\83t\83H\81[\83\80\8fã\82Å\97\98\97p\82Å\82«\82é\82·\82×\82Ä\82Ì\8b@\94\\82ð\97L\8cø\82É\82·\82é\82±\82Æ\82É\82æ\82Á\82Ä
+// \93®\8dì\82µ\82Ü\82·\81B
+
+// \89º\82Å\8ew\92è\82³\82ê\82½\92è\8b`\82Ì\91O\82É\91Î\8fÛ\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8ew\92è\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\8fê\8d\87\81A\88È\89º\82Ì\92è\8b`\82ð\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+// \88Ù\82È\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82É\91Î\89\9e\82·\82é\92l\82É\8aÖ\82·\82é\8dÅ\90V\8fî\95ñ\82É\82Â\82¢\82Ä\82Í\81AMSDN \82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
+#ifndef WINVER // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows Vista \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define WINVER 0x0600 // \82±\82ê\82ð Windows \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_WINNT // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows Vista \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_WINNT 0x0600 // \82±\82ê\82ð Windows \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_WINDOWS // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows 98 \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_WINDOWS 0x0410 // \82±\82ê\82ð Windows Me \82Ü\82½\82Í\82»\82ê\88È\8d~\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_IE // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Internet Explorer 7.0 \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_IE 0x0700 // \82±\82ê\82ð IE \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82\82¾\82³\82¢\81B
+#endif
--- /dev/null
+USEUNIT("main.cpp");\r
+//---------------------------------------------------------------------------\r
+This file is used by the project manager only and should be treated like the project file\r
+
+\rmain
\ No newline at end of file
--- /dev/null
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value=".\obj\ExMODIst.exe"/>
+ <OBJFILES value="main.obj"/>
+ <RESFILES value=""/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES)"/>
+ <LIBFILES value=""/>
+ <LIBRARIES value=""/>
+ <SPARELIBS value=""/>
+ <PACKAGES value="Vcl50.bpi Vclx50.bpi bcbsmp50.bpi Qrpt50.bpi Vcldb50.bpi Vclbde50.bpi
+ ibsmp50.bpi vcldbx50.bpi TeeUI50.bpi TeeDB50.bpi Tee50.bpi TeeQR50.bpi
+ VCLIB50.bpi bcbie50.bpi vclie50.bpi Inetdb50.bpi Inet50.bpi NMFast50.bpi
+ dclocx50.bpi bcb2kaxserver50.bpi TNTLIBR.bpi dclusr50.bpi"/>
+ <PATHCPP value=".;"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+ <RELEASELIBPATH value="$(BCB)\lib\release"/>
+ <LINKER value="tlink32"/>
+ <USERDEFINES value=""/>
+ <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
+ <MAINSOURCE value="ExMODIst.bpf"/>
+ <INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl"/>
+ <LIBPATH value="$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+ <WARNINGS value="-w-par"/>
+ </MACROS>
+ <OPTIONS>
+ <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -f- -X- -a8 -5 -b- -k- -vi -tWC
+ -tWM -c"/>
+ <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+ <RFLAGS value=""/>
+ <AFLAGS value="/mx /w2 /zn"/>
+ <LFLAGS value="-D"" -ap -Tpe -x -Gn"/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+ <ALLRES value="$(RESFILES)"/>
+ <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=1
+Item0=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[HistoryLists\hlFinalOutputDir]
+Count=2
+Item0=.\obj\
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+ </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
--- /dev/null
+//---------------------------------------------------------------------------
+#include <windows.h>
+#pragma hdrstop
+#include "MDIVWCTL.tlh"
+
+//---------------------------------------------------------------------------
+#pragma argsused
+bool MODIAvail();
+int main(int argc, char* argv[])
+{
+ if (MODIAvail())
+ return 1;
+ return 0;
+}
+
+bool MODIAvail()
+{
+ bool exist = false;
+ HRESULT hr = CoInitialize(0);
+ if (SUCCEEDED(hr)){
+ IDocument *IDobj = NULL;
+ hr = ::CoCreateInstance(CLSID_Document, NULL, CLSCTX_ALL, IID_IDocument, (void**)&IDobj);
+ if (SUCCEEDED(hr)){
+#if 0
+ hr = IDobj->Create(AsciiToBSTR("H:\\temp\\nishikawat\\amodi\\2014-12-02-151156.bmp"));
+ if (SUCCEEDED(hr){
+
+ }
+#endif
+ exist = true;
+ IDobj->Release();
+ }
+ }
+ CoUninitialize();
+
+ return exist;
+}
+
+
--- /dev/null
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo ./dchook/dchook.dll\82ð\8f\80\94õ
+echo ./dchooktest/dchooktest.exe\82ð\8f\80\94õ
+echo ./vxd/hk95d.vxd\82ð\8f\80\94õ
+pause
+set TZ=JST-9
+
+copy .\dchook\dchook.dll .\DKPPHK.DLL /y
+copy .\VxD\hk95d.vxd .\HK95D.VXD /y
+copy .\dchooktest\dchooktest.exe .\DKPP.EXE /y
+
+touch -d12/09/02 -t01:11:00 -c DKPP.EXE DKPPHK.DLL HK95D.VXD README.TXT
+
+del dchook-1.11.lzh > nul
+
+lha32 a dchook-1.11.lzh /x README.TXT
+lha32 a dchook-1.11.lzh /x ./dchook/dchook.mak ./dchook/dchook.cpp ./dchook/dchook.h ./dchook/dchook.rc ./dchook/dchook.def
+lha32 a dchook-1.11.lzh /x ./dchooktest/dchooktest.bpr ./dchooktest/dchooktest.mak
+lha32 a dchook-1.11.lzh /x ./dchooktest/*.h ./dchooktest/*.cpp ./dchooktest/dchooktest.rc ./dchooktest/*.dfm ./dchooktest/dkpp.bmp ./dchooktest/popenable.bmp ./dchooktest/popdisable.bmp ./dchooktest/popenable.h ./dchooktest/popdisable.h ./dchooktest/icon.rc
+lha32 a dchook-1.11.lzh /x ./vxd/makefile ./vxd/hk95d.def ./vxd/*.h ./vxd/*.asm ./vxd/*.c
+
+perl -S chgini.pl dchook.ind Exe Name DKPP111.EXE
+perl -S chgini.pl dchook.ind Date Year 2002
+perl -S chgini.pl dchook.ind Date Month 12
+perl -S chgini.pl dchook.ind Date Day 09
+perl -S chgini.pl dchook.ind Date Hour 01
+perl -S chgini.pl dchook.ind Date Minute 11
+perl -S chgini.pl dchook.ind Date Second 00
+perl -S chgini.pl dchook.ind Back 8 "|Doko Pop! Ver.1.11"
+perl -S chgini.pl dchook.ind Back 12 "|Doko Pop! Ver.1.11"
+
+rem IND\82Ì\8eÀ\8ds
+k:\wbin\makeset\makeset .\dchook.ind
+
+rem lha32 a DKPP111.EXE DKPP.TXT DKPP.EXE DKPPHK.DLL HK95D.VXD
+ren DKPP111.EXE DKPP111.EXE
+touch -d12/09/02 -t01:11:00 -c DKPP111.EXE
+
+echo/
+echo \95Û\91¶\97p\88³\8fk\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+rem pause
+
+dir dchook-1.11.lzh
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPPu.TXT
+del DKPPu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+copy dchook-1.11.lzh S:\Web\NIFTY\
+copy dchook-1.11.lzh S:\down\MySoft
+del S:\Web\NIFTY\dchook-1.10.lzh
+copy DKPP111.EXE S:\Web\NIFTY\
+copy DKPP111.EXE S:\down\MySoft
+del S:\Web\NIFTY\DKPP110.EXE
+
+copy S:\Web\NIFTY\pdic-download.var vars.dat
+perl -S repvars.pl S:\Web\NIFTY\pdic-download0.html > S:\Web\NIFTY\pdic-download.html
+copy vars.dat S:\Web\NIFTY\pdic-download.var
+
+rem echo [del] >> S:\Web\NIFTY\ftp.ctl
+rem echo dchook-1.10.lzh >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPP110.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo [include] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPP111.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo dchook-1.11.lzh >> S:\Web\NIFTY\ftp.ctl
+
+
--- /dev/null
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo \81¡\8am\94F\8e\96\8d\80
+echo \81E./dchooktest/dchooktest.exe\82ð\8f\80\94õ(USE_UNICODE defined)
+echo \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\81F.bpr\82ÆUtil.cpp(StrVersion, VersionValue)\82Ì\97¼\95û\82ª\95K\97v
+echo \81ERelease Build?
+echo \81EVisualStudio2008\82Åbuild\82µ\82½\82©\81H for W2K
+pause
+set TZ=JST-9
+
+echo/
+echo Copy the binary to the ind directory.
+echo/
+pause
+
+make copy_bin
+
+rem touch -d10/06/16 -t02:00:00 -c ind\DKPU.EXE ind\DKPUHK.DLL
+
+rem dkpu.iss\82Ì\8dX\90V
+perl change_iss.pl ind\dkpu.iss Setup AppVerName "DokoPop! 2.023" > ind\dkpu.iss.new
+del ind\dkpu.iss.old
+ren ind\dkpu.iss dkpu.iss.old
+ren ind\dkpu.iss.new dkpu.iss
+
+rem Installer \82Ì\8eÀ\8ds
+make buildis
+
+echo/
+echo Press Enter key after installer made.
+echo/
+pause
+
+copy ind\Output\setup.EXE DKPU2023.exe
+dir DKPU2023.exe
+
+rem lha32 a DKPU2023.exe DKPU.TXT DKPU.EXE DKPUHK.DLL
+ren DKPU2023.exe DKPU2023.exe
+rem touch -d10/06/16 -t02:00:00 -c DKPU2023.exe
+
+echo/
+echo \83\\81[\83X\83t\83@\83C\83\8b\82ðzip\82µ\82Ü\82·
+echo/
+pause
+
+make zip_src
+copy src.zip src-2.023.zip
+rem copy src-2.023.zip zip
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPUu.TXT
+del DKPUu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+rem copy DKPU2023.exe S:\Web\NIFTY\
+rem del S:\Web\NIFTY\DKPU2022.EXE
+copy DKPU2023.exe S:\web\sakura-pdic\cgi-bin\download\files\
+del S:\web\sakura-pdic\cgi-bin\download\files\DKPU2022.EXE
+
+rem echo [del] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPU2022.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo [include] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPU2023.exe >> S:\Web\NIFTY\ftp.ctl
+
--- /dev/null
+#!make
+
+CPI=cp -i -p -u
+
+all:
+
+copy_release:
+ copy DCHook\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+# copy DCHook\Win32\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+# copy DCHook\x64\Release\DCHook.dll DCHookTest\DKPUHK64.DLL
+# copy DCHook64\dchk64\x64\Release\dchk64.exe DCHooktest\DKPUHK64.exe
+
+copy_bin:
+ echo DKPUHK.DLL(DCHOOK.DLL)\82ÍVS2008\82Å\8dì\90¬\82µ\82½\82©\81H
+ pause
+# $(CPI) DCHook\Win32\Release\DCHook.dll ind\DKPUHK.dll
+# $(CPI) DCHook\x64\Release\DCHook.dll ind\DKPUHK64.dll
+# $(CPI) bin\DKPUHK.DLL ind\DKPUHK.dll
+# $(CPI) DCHook64\dchk64\x64\Release\dchk64.exe ind\DKPUHK64.exe
+ $(CPI) DCHookTest\DKPUHK.dll ind\DKPUHK.dll
+ $(CPI) DCHookTest\DKPUHK64.DLL ind\DKPUHK64.dll
+ $(CPI) DCHookTest\DKPUHK64.exe ind\DKPUHK64.exe
+ $(CPI) bin\amodi.exe ind\amodi.exe
+ $(CPI) bin\Interop.MODI.dll ind\Interop.MODI.dll
+ $(CPI) bin\ExMODIst.exe ind\ExMODIst.exe
+ $(CPI) DCHookTest\DCHookTest.exe ind\DKPu.exe
+ $(CPI) DKPU.TXT ind\DKPu.txt
+
+buildis:
+ cd ind
+ start dkpu.iss
+
+zip_src:
+ zip -r src . -i *.h *.c *.cpp *.cs *.dfm *.bpr *.bpf *.bpg *.rc *.ico *.bmp *.png *.txr *.ctt *.bat *.ind *.iss *.tpl *.manifest *.txt *.sln *.vcproj *.vcxproj *.user
+ zip -r src-amodi \src\amodi -i *.h *.c *.cpp *.cs *.dfm *.bpr *.bpf *.bpg *.rc *.ico *.bmp *.png *.txr *.ctt *.bat *.ind *.iss *.tpl *.manifest *.txt *.sln *.vcproj *.vcxproj *.user
+
+deploy:
+ mktplu
+ mku
--- /dev/null
+==========================================================================
+ DCHook sample program
+==========================================================================
+Introduction -------------------------------------------------------------
+
+DCHook\82Í\81AWindows\82É\82¨\82¢\82Ä\94C\88Ó\82ÌWindow\82Ì\94C\88Ó\82Ì\8dÀ\95W\88Ê\92u\82©\82ç
+\82»\82±\82É\95`\89æ\82³\82ê\82Ä\82¢\82é\83e\83L\83X\83g\82ð\8fE\82Á\82Ä\82\82é\83v\83\8d\83O\83\89\83\80\82Å\82·\81B
+\82¿\82å\82Á\82Æ\82â\82Á\82Ä\82Ý\82½\82ç\8aÈ\92P\82É\93®\82¢\82½\82Ì\82Å\81A\8cö\8aJ\82·\82é\82±\82Æ\82É\82µ\82Ü\82µ\82½\81B
+
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ì\89\9e\97p\82Æ\82µ\82Ä\82Í\81A
+\81E\94C\88Ó\82Ì\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\81E\91S\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ðgrep\82·\82é
+\81E\83J\81[\83\\83\8b\88Ê\92u\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\82Æ\82¢\82Á\82½\88ê\95\97\95Ï\82í\82Á\82½\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82É\82Í\8eQ\8dl\82Æ\82µ\82Ä\81ADokoPop\82Æ\82¢\82¤\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82ð
+\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+install ------------------------------------------------------------------
+
+\88³\8fk\83t\83@\83C\83\8b\82ð\93K\93\96\82È\82Æ\82±\82ë\82É\89ð\93\80\82µ\82Ä\82\82¾\82³\82¢\81B
+\83f\83B\83\8c\83N\83g\83\8a\95t\82«\82Å\89ð\93\80\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\93Y\95t\83t\83@\83C\83\8b -------------------------------------------------------------
+
+target\82É\82È\82é\82à\82Ì\81F
+
+dchook.dll (NT/2K\94Å or 9x\94Å)
+hk95d.vxd (9x\90ê\97p)
+dchooktest.exe (NT/2K\82Æ9x8\8b¤\97p)
+
+\95K\97v\82È\8aJ\94\8aÂ\8b« -----------------------------------------------------------
+C++ Builder 5
+Visual C++ 6.0
+Windows Device Driver Kit (DDK) for Windows 98
+
+\8dì\90¬\95û\96@ -----------------------------------------------------------------
+
+--------------------------------
+dchook.dll
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+Visual C++
+
+\8dì\90¬\95û\96@\81F
+nmake -fdchook.mak
+
+--------------------------------
+hk95d.vxd
+--------------------------------
+\95K\97v\82È\8aÂ\8b«
+Visual C++, DDK for Win98
+
+\95Ï\8dX\89Ó\8f\8a\81F
+makefile
+INC32\82ðDDK\82Ìroot path\82É(e:\98ddk\82È\82Ç)
+
+\8dì\90¬\95û\96@\81F
+nmake
+\81¦\82±\82Ì\8eÀ\8ds\91O\82ÉVisual-C++\82¨\82æ\82ÑDDK\82Ì\8aÂ\8b«\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+\81@\83o\83b\83`\83t\83@\83C\83\8b\82Å\8aÂ\8b«\90Ý\92è\82·\82é\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A
+\81@\8dì\90¬\91O\82É\83o\83b\83`\83t\83@\83C\83\8b\82ð\8eÀ\8ds\82µ\82Ä\82\82¾\82³\82¢\81B
+\81@\81ivcvars32.bat\81Asetenv.bat e:\98ddk \82Æ\82¢\82Á\82½\8a´\82¶\82Å
+\81@\81¨\8fÚ\82µ\82\82ÍVisual-C++\81ADDK\82É\95t\91®\82Ì\90à\96¾\8f\91\82ð\8eQ\8fÆ\81j
+
+--------------------------------
+dchooktest.exe
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+C++ Builder 5
+
+\95Ï\8dX\89Ó\8f\8a\81F
+\93Á\82É\82È\82µ
+\81¦DEBUG\82ðdefine\82·\82é\82Æ\81ADEBUG\97p\82Ì\93®\8dì\82É\82È\82è\82Ü\82·\81B
+
+\8dì\90¬\95û\96@\81F
+dchooktest.bpr\82ðC++Builder\82Å\8aJ\82¢\82Ä\82\82¾\82³\82¢\81B
+C++Builder4\82Å\82à\82Å\82«\82é\82©\82à\81A\82Æ\8ev\82Á\82Ä C++Builder4\88È\91O\97p\82É
+dchooktest.mak\82à\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B\91½\8f\82Ì\95Ï\8dX\82Å\8eg\82¦\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\82 \82Æ\82Í\81A\83\81\83j\83\85\81[\82©\82ç Project | \8dÄ\8d\\92z \82Å\8dì\90¬\82µ\82Ü\82·\81B
+
+\8eÀ\8ds\81F
+dchooktest.exe\82ð\8eÀ\8ds\82µ\82Ü\82·\81B
+
+\81\9a\92\8d\88Ó\93_\81F
+DCHookTest.exe\82ªLoad\82·\82éDLL\82Í\81A
+DKPPHK.DLL -> DCHOOK.DLL
+\82Ì\8f\87\94Ô\82Å\90æ\82É\8c©\82Â\82©\82Á\82½\95û\82ðload\82·\82é\8ed\97l\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B
+DEBUG\82ðdefine\82µ\82½\82Æ\82«\82Í\81ADCHOOK.DLL\82Ì\82Ý\82ðload\82µ\82æ\82¤\82Æ\82µ\82Ü\82·\81B
+
+\83v\83\8d\83O\83\89\83\80\90à\96¾ -----------------------------------------------------------
+
+\88ê\94Ô\96ï\89î\82È\82à\82Ì\82Í\81Adchook.cpp\82Å\82µ\82å\82¤\81B
+\8e\8e\8ds\8dö\8cë\82µ\82È\82ª\82ç\82à\92Z\8e\9e\8aÔ\82Å\88ê\8bC\82É\8f\91\82«\8fã\82°\82½\82à\82Ì\82Å\82·\82Ì\82Å\81A
+\82©\82È\82è\89\98\82\82È\82Á\82Ä\82¢\82Ü\82·\81B
+#define\82É\82æ\82éswitch\82É\82Í\81A\90F\82ñ\82È\91g\82Ý\8d\87\82í\82¹\82ª\82 \82è\82Ü\82·\82ª\81A
+\8c»\8fó\88È\8aO\82Ì\90Ý\92è\82É\82·\82é\82Æ\90³\8fí\82É\93®\8dì\82µ\82È\82©\82Á\82½\82è\81A
+compile\82³\82¦\82à\82Å\82«\82È\82¢\82Í\82¸\82Å\82·\81B\82¾\82Á\82½\82ç\81A\90®\97\9d\82µ\82È\82³\82¢\81I
+\82Æ\8c¾\82í\82ê\82»\82¤\82Å\82·\82ª\81A\8d¡\8cã\95K\97v\82Æ\82È\82é\82Æ\82±\82ë\82ª\82 \82é\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\81A
+\82»\82Ì\82Ü\82Ü\82É\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+\93®\8dì\8c´\97\9d\82Æ\82µ\82Ä\82Í\81A\83e\83L\83X\83g\82ð\8eæ\93¾\82µ\82½\82¢window\82É\91Î\82µ\82Ä
+\8dÄ\95`\89æ\96½\97ß\82ð\91\97\82è\81A\8dÄ\95`\89æ\92\86\82Ì\83e\83L\83X\83g\95`\89æ\8aÖ\90\94\82Ì\93à\97e\82ð
+\89¡\8eæ\82è\82·\82é\82±\82Æ\82Å\8fE\82Á\82Ä\82«\82Ü\82·\81B
+
+\8dÅ\8f\89\8dì\82è\8en\82ß\82½\8d \82Í\81AWindows\82©\82çDC\82ð\93n\82µ\82Ä\82¢\82é\8aÖ\90\94\82ðhook\82µ\81A
+DC\82ðmetafile\82Å\8dÄ\90¶\82·\82ê\82Î\8aÈ\92P\82¶\82á\82È\82¢\82©\81H\82Æ\8ev\82Á\82Ä\82â\82Á\82Ä\82Ý\82Ü\82µ\82½\81B
+\82»\82¤\82µ\82½\82ç\82 \82Á\82¯\82È\82\93®\82¢\82½\82Ì\82Å\82·\82ª\81A\95Ê\82Ìapplication\82Å\82â\82Á\82Ä\82Ý\82é\82Æ
+\82¤\82Ü\82\93®\82©\82È\82¢\82±\82Æ\82ª\82 \82è\82Ü\82µ\82½\81B
+\8c´\88ö\82Í\81ACreateCompatibleBitmap\82Åbitmap\82ð\8dì\90¬\82µ\81A\82»\82±\82Ö\88ê\92U\95`\89æ
+\82µ\82Ä\82©\82ç\81ABitBlt\82Åwindow\82É\93\\82è\95t\82¯\82éapplication\82ª\82 \82Á\82½\82©\82ç\82Å\82·\81B
+\82»\82¤\82È\82é\82Æ\81ADC\82¾\82¯\82Å\82Í\83e\83L\83X\83g\95`\89æ\8fî\95ñ\82ª\93¾\82ç\82ê\82Ü\82¹\82ñ\82Ì\82Å\81A
+\95K\97v\82Ètext\95`\89æ\8aÖ\90\94\82ðhook\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+(\82Ù\82©\82É\82àBeginPaint()\82Å\93n\82³\82ê\82éDC\82Å\82Í\82È\82\81AGetDC()\82Å
+\93¾\82½DC\82É\91Î\82µ\82Ä\95`\89æ\82µ\82Ä\82¢\82éapplicaton\82É\91Î\82µ\82Ä\82à\82¤\82Ü\82\82¢\82«\82Ü\82¹\82ñ\82Å\82µ\82½)
+
+\82±\82Ì\91O\82É\82±\82Ìhook\82Ì\95û\96@\82Å\82·\82ª\81ANT\82Æ9x\82Å\82Í\88Ù\82È\82è\82Ü\82·\81B
+NT\82Í\8aeapplication\82ª\93Æ\97§\82Ìmemory\8bó\8aÔ\82Å\82 \82è\81Auser32.dll,gdi32.dll\82à
+application\96\88\82Ìmemory\8bó\8aÔ\82É\91¶\8dÝ\82µ\82Ä\82¢\82é\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81A
+\82¢\82«\82È\82è\8b¤\97Lmemory\82Ö\8ds\82Á\82Ä\82µ\82Ü\82Á\82Ä\82¢\82é\82Ì\82Å\81A\8aÈ\92P\82É\82Íhook\82Å\82«\82Ü\82¹\82ñ\81B
+
+API\82Ìhook\95û\96@\82Í\81A\83A\83X\83L\81[\82©\82ç\8fo\94Å\82³\82ê\82Ä\82¢\82é\81uAdvanced Windows\81v
+\82ð\8eQ\8dl\82É\82µ\82Ü\82µ\82½\81B
+http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/pdichomepage-22
+\82±\82±\82ÉAPI\83t\83b\83N\82Ì\90à\96¾\82ª\8fÚ\8d×\82É\8bL\8fq\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82µ\82©\82µ\81A\82±\82Ì\95û\96@\82ð\92m\82é\82Ü\82Å\82Í Hook\90æ\82Ì\83A\83h\83\8c\83X\82ð\92¼\90Ú\8f\91\82«\8a·\82¦\82é\82Æ\82¢\82¤
+\8aë\8c¯\82È\95û\96@\82ð\82â\82Á\82Ä\82¢\82Ü\82µ\82½\81B\82Â\82Ü\82è Advanced Windows\82É\8bL\8fq\82³\82ê\82Ä\82¢\82é
+\82P\94Ô\96Ú\82Ì\95û\96@\82Å\82·\82Ë\81BNT\8cn\82ÌOS\82È\82ç\82Ù\82Ú\96â\91è\82È\82\93®\8dì\82·\82é\82Ì\82Å\82·\82ª\81A
+9x\8cn\82Í\97á\8aO\82ª\82Ç\82¤\82µ\82Ä\82à\94\90¶\82µ\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+\82Æ\82¢\82¤\82±\82Æ\82Å\81A\82±\82Ì\96{\82Ì\82Q\94Ô\96Ú\82Ì\95û\96@\82Å\88À\92è\82µ\82Ä\93®\8dì\82·\82é\82æ\82¤\82É
+\82È\82è\82Ü\82µ\82½\81B\82µ\82©\82µ\81A\82±\82Ì\96{\82Ì\82Ü\82Ü\82Å\82ÍDokoPop!\82Å\8cø\97¦\82æ\82
+\93®\8dì\82µ\82Ä\82\82ê\82È\82¢\82Ì\82Å\81A\82©\82È\82è\8f\91\82«\8a·\82¦\82Ä\82 \82è\82Ü\82·\81B
+\81i\82Æ\82¢\82¤\82±\82Æ\82Å\92\98\8dì\8c \95\\8e¦\82à\8fÈ\97ª\82µ\82½\82è\82µ\82Ä\81E\81E\81E\81j
+\8f\91\82«\8a·\82¦\82½\81A\82Æ\82¢\82¤\82æ\82è\81A\8d¡\82Ü\82Å\8e©\95ª\82ª\8f\91\82¢\82½APIHOOK\8d\\91¢\91Ì\82ð
+\95Ï\8dX\82µ\82½\81A\82Æ\82¢\82¤\82Ù\82¤\82ª\90³\82µ\82¢\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+API\83t\83b\83N\82Ì\89ð\90à\82Í\82±\82Ì\96{\82É\8f÷\82è\82Ü\82·\81B
+
+\82Å\82·\82ª\81A\82¹\82Á\82©\82\82P\94Ô\96Ú\82Ì\8aë\8c¯\82È\95û\96@\82Å\82¢\82\82Â\82©\93¾\82½\8fî\95ñ\82ª\82 \82é\82Ì\82Å\81A
+\8b\8c\83o\81[\83W\83\87\83\93\82Å\8eg\97p\82µ\82Ä\82¢\82½\83t\83b\83N\95û\96@\82Ì\8fî\95ñ\82ð\8f\91\82¢\82Ä\82¨\82«\82Ü\82·\81B
+---------- \8cÃ\82¢\98b ----------
+\82¿\82È\82Ý\82É\81ANT\82Å\82ÍUSER32.DLL,GDI32.DLL\82ÌGetProcAddress()\82Í
+application\82É\82æ\82Á\82Ä\88Ù\82È\82è\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Å\82Í\93¯\82¶\82Å\82·\81B
+\90æ\82Ù\82Ç\82à\82¿\82ç\82Á\82Æ\8f\91\82¢\82½\82æ\82¤\82É\81ANT\82Ìapplication\82Í\8cÂ\95Ê\82Ìmemory\8bó\8aÔ\82Å
+USER32.DLL,GDI32.DLL\82à\88Ù\82È\82é\8bó\8aÔ\82É\91¶\8dÝ\82µ\82Ä\82¢\82é\82©\82ç\82Å\82·\81B
+\82Æ\82±\82ë\82ª9x\82Í\8b¤\97L\82µ\82Ä\82¢\82Ä\81A\82µ\82©\82àjump\82µ\82½\82ç\82·\82®\82Ékernel mode\82É
+\93ü\82Á\82Ä\82¢\82é\82æ\82¤\82Å\82·\81B(NT\82Í\82 \82é\92ö\93xuser mode\82Å\82â\82Á\82Ä\82¢\82é\8a´\82¶\81j
+
+\82³\82ç\82É\82»\82Ì\90æ\82Í\82Ç\82¤\82È\82Á\82Ä\82¢\82é\82©\82Æ\82¢\82¤\82Æ\81E\81E\81E\82Æ\82¢\82¤\98b\82Í
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ìscope\8aO\82È\82Ì\82Å\82Ü\82½\82Ì\8b@\89ï\82É\8f÷\82é\82Æ\82µ\82Ä\81A
+\82±\82±\82Å9x\82É\91Î\82µ\82Ä\82¿\82å\82Á\82Æ\8c\99\82È\97\\8a´\82ª\82æ\82¬\82è\82Ü\82·\81B
+NT\82Ì\8fê\8d\87\81Aentry point\82ð\8f\91\82«\8a·\82¦\82Ä\82à\82»\82Ìapplication\8cÅ\97L\82Ì
+entry point\82Å\82 \82é\82½\82ß\81A\82»\82Ì\8aÔ\82Étask switching\82ª\94\90¶\82µ\82Ä\82à
+\96â\91è\82È\82¢\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81Aentry point\82ð\8f\91\82«\8a·\82¦\82½\92¼\8cã\82É
+task switching\82ª\94\90¶\82µ\82½\82ç\81A(\97\88\82Ä\97~\82µ\82\82È\82¢)\82Ù\82©\82Ìapplication\82ª
+\82»\82Ìhook\82ð\93`\82Á\82Ä\82â\82Á\82Ä\82\82é\81E\81E\81E\8dÅ\88«entry point\8f\91\82«\8a·\82¦\92\86\82É
+switching\82ª\94\90¶\82·\82é\82Æ\81E\81E\81E\82¿\82å\82Á\82Æ\95|\82¢\82Å\82·\81B
+\82Å\82à\81A\8eÀ\8dÛ\82Í\82»\82Ì\82æ\82¤\82È\83P\81[\83X\82Í\8bN\82±\82è\82É\82\82\81A\8eÀ\8dÛ\82»\82¤\82¢\82¤
+\96â\91è\82Í\94\90¶\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Å\82·\82ª\81A\88ê\89\9e\83v\83\8d\83O\83\89\83\80\82Å\82Í
+\82»\82Ì\82½\82ß\82Ì\91Î\8dô\82ð\82µ\82Ä\82 \82è\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82Ì\97\9d\8bü\82à\8f\91\82¢\82½\95û\82ª\82¢\82¢\82Ì\82Å\82·\82ª\81E\81E\81E\8fÈ\97ª\81j
+
+entry point\82Ì\8f\91\82«\8a·\82¦\82Å\82·\82ª\81ANT\82Ì\8fê\8d\87\82Í
+\92Ê\8fí\82Ìapplication\82Æ\93¯\82¶\82Å\82·\82Ì\82Å\81AWriteProcessMemory\8aÖ\90\94\82Å
+code\97Ì\88æ\82ð\8f\91\82«\8d\9e\82Ý\82ª\82Å\82«\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Í
+\8b¤\97Lmemory\82Å\82 \82è\81A\82»\82±\82Íwrite protect\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82±\82Ìprotection\82ð\89ð\8f\9c\82·\82é\82É\82Í\92Ê\8fí\82ÌWindows API\82É\82Í
+\96³\82¢\82æ\82¤\82È\82Ì\82Å\81i\82 \82Á\82½\82ç\8b³\82¦\82Ä\97~\82µ\82¢\81j\81A\82í\82´\82í\82´
+memory\82ð\8f\91\82«\8a·\82¦\82é\82¾\82¯\82Ì\82½\82ß\82ÌVxD\82ð\8dì\82è\82Ü\82µ\82½\81B
+VxD\82È\82çkernel mode\82È\82Ì\82Å\82È\82ñ\82Å\82à\82Å\82«\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82ª\90æ\82Ù\82Ç\82Ìtask switching\82Ì\98b\82Æ\97\8d\82ñ\82Å\82¢\82Ü\82·\82ª)
+
+VxD\82Ídynamic loading\82Å\8dì\82Á\82Ä\82 \82è\82Ü\82·\81B
+\82±\82ÌVxD\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82Í\81ACreateFile()\8aÖ\90\94\82Å
+VxD\82ðload\82µ\82Ä\82¢\82Ü\82·\82ª\81A\93ñ\93xCreateFile()\82Í\82Å\82«\82È\82¢\82Æ\82±\82ë\82Å\82·\81B
+\8f]\82Á\82Ä\81A\88ê\94Ô\8dÅ\8f\89\82Ì\8f\89\8aú\89»\82Ì\82Æ\82«\82¾\82¯\81ACreateFile()\82ð\8ds\82¢\81A
+\82 \82Æ\82Í\82¸\82Á\82ÆVxD\82ð\8fí\92\93\82³\82¹\82½\82Ü\82Ü\82É\82µ\82Ä\82¨\82\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88ê\89\9eAPI Hook\82Ì\98b\82Í\82±\82Ì\82\82ç\82¢\82É\82µ\82Ä\82¨\82«\82Ü\82·\81B
+API Hook\82ð\82·\82éapplication\82Í\82Ù\82©\82É\82à\82 \82è\82Ü\82·\82ª\81A
+\82»\82¤\82¢\82¤application\82Í\82±\82ê\82Æ\93¯\82¶\95û\96@\82ð\8eg\97p\82µ\82Ä\82¢\82é\82Ì\82Å\82µ\82å\82¤\82©\81H
+MSDN\82É\82àapimon(\82¾\82Á\82½\82©\82È\81H)\82Æ\82¢\82¤tool\82ª\95t\91®\82µ\82Ä\82¢\82Ü\82·\82ª\81A
+\82Ç\82¤\82È\82ñ\82Å\82µ\82å\82¤\81H
+---------- \88È\8fã\81A\8cÃ\82¢\98b ----------
+
+\98b\82Í\82¸\82Á\82Æ\91O\82É\96ß\82Á\82Ä\81ABitBlt\91Î\8dô\82Ì\98b\82Å\82·\81B
+\82±\82ÌBitBlt\82Å\95`\89æ\82·\82é\95û\96@\82ð\92²\82×\82Ä\82Ý\82é\82Æ\81Awindow\91S\91Ì\82Å\82Í\82È\82\81A
+banding\82É\82æ\82Á\82Ä\81Awindow\82ð\95¡\90\94\82Ìbitmap\82É\95ª\8a\84\82µ\82ÄBitBlt\82µ\82Ä\82¢\82é
+\82æ\82¤\82Å\82·\81B\8f]\82Á\82Ä\81ABitBlt API\82àhook\82µ\82Ä\82â\82è\81Abitmap\82Ötext\82ð
+\95`\89æ\82µ\82½\82Æ\82«\82Ì\8dÀ\95W\82Æ\81ABitBlt\82µ\82½\82Æ\82«\82Ìdestination point\82Ì
+offset\82ð\8dl\97¶\82µ\82Ätext\8dÀ\95W\82ð\8cv\8eZ\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88È\8fã\81Atext\82ðget\82Å\82«\82½\82ç\81A\8ew\92è\8dÀ\95W(sample\82Å\82Ímouse\82Ìcursor\88Ê\92u)\82É
+text\82ª\82 \82é\82©\82Ç\82¤\82©\81A\82Æ\82¢\82¤\94»\92è\82ð\8ds\82¢\82Ü\82·\81B
+hit\82µ\82½\8fê\8d\87\82Í\81A\82»\82Ìtext\91S\91Ì\82Æ\81Atext\8fã\82Ìbyte offset\82ð
+WM_COPYDATA message\82Å\8f\89\8aú\89»\82Ì\8e\9e\82É\93o\98^\82µ\82Ä\82 \82é window\82ÖSendMessage()
+\82µ\82Ü\82·\81B(WM_COPYDATA\82ÍSendMessage\82Å\82È\82¢\82Æ\82¢\82¯\82È\82¢)
+
+\82»\82µ\82Ä\81ADCHookTest.exe\82ª\82»\82Ìmessage\82ð\8eó\82¯\8eæ\82è\81ADCHookTest.exe\82ª
+text\82ð\82Ù\82©\82Ìapplication(PDIC)\82ÖDDE\82Å\93n\82µ\82Ä\82¢\82Ü\82·\81B
+
+DCHookTest.exe\82ª\82â\82Á\82Ä\82¢\82é\82±\82Æ\82Í\82»\82ê\82ª\82Ù\82Æ\82ñ\82Ç\82Å\81A
+dchook.dll\82É\82\82ç\82×\82ê\82Îê¡\82©\82É\8ay\82È\8ed\8e\96\82È\82Ì\82Å\82·\81B
+
+DLL\82Å\82Í\8fí\8e¯\82Å\82·\82ª\81Adata\82Í\8aî\96{\93I\82Éprocess\8cÅ\97L\82Ì\92l\82ð\8e\9d\82¿\82Ü\82·\81B
+\82±\82±\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82ª\81AWindowsHook\82Ìhook dll\82Í\81A
+WindowsHook\82Å\83Z\83b\83g\82µ\82½\8cã\81Aforeground application\82É
+\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\8f\89\82ß\82Äattach\82³\82ê\82Ü\82·\81B
+(\82Â\82Ü\82è\81AWindowsHook\82µ\82½\8e\9e\93_\82Å\82ÍHook\82µ\82½process\82É\82µ\82©
+attach\82³\82ê\82Ä\82¢\82È\82¢)
+\82µ\82©\82à\81Aattach\82µ\82½\82Æ\82«\82É\82Í\81A\95Ê\82Ìapplication\82Ìprocess\8bó\8aÔ\82É
+\8b\8f\82Ü\82·\82Ì\82Å\81AWM_COPYDATA\82Ì\91\97\82è\90æ\82Ì\8fî\95ñ\82ª\82Ç\82±\82É\82à\82 \82è\82Ü\82¹\82ñ\81B
+\83t\83@\83C\83\8b/registry\82É\95Û\91¶\82µ\82Ä\93Ç\82Ý\8d\9e\82Þ\81A\82È\82ñ\82Ä\82¢\82¤\95û\96@\82à\82 \82è
+\82Ü\82·\82ª\81Adchook.def\82Åshared\82É\82æ\82Á\82Ä\81Adll\8aÔ\82Å\8b¤\97L\82·\82é
+data segment\82ð\8dì\90¬\82·\82é\95û\96@\82ª\82 \82è\82Ü\82·\81B
+\82±\82±\82ÉWM_COPYDATA\91\97\82è\90æ\82Ìhandle\82ð\95Û\91¶\82µ\82Ä\82¨\82¯\82Î\81A\82±\82Ì\82æ\82¤\82È
+\96â\91è\82Í\89ð\8c\88\82Å\82«\82Ü\82·\81B
+
+\82»\82ê\82Æ\82à\82¤\88ê\82Â\82â\82Á\82Ä\82Ý\82Ä\82í\82©\82Á\82½\82Ì\82Å\82·\82ª\81A9x\82Å\82Í
+Unhook\82ð\82·\82é\82Æ\81A\82·\82®\82É\82·\82×\82Ädetach\82³\82ê\82é\82Ì\82Å\82·\82ª\81A
+NT\82Å\82Í\81A\82±\82ê\82Ü\82½foreground\82É\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\82µ\82©
+detach\82µ\82Ä\82\82ê\82Ü\82¹\82ñ\81B\82»\82±\82Å\81Adchook\82Å\82Í\8b\90§\93I\82É
+detach\82³\82¹\82é\82½\82ß\82Émessage\82ðbroadcast\82³\82¹\82Ä\82¢\82Ü\82·\81B
+\8eÀ\8dÛ\82Í\82»\82±\82Ü\82Å\82â\82é\95K\97v\90«\82Í\82È\82¢\82Ì\82Å\82·\82ª\81A\8aJ\94\8e\9e\82É
+memory\82ð\89ð\95ú\82³\82¹\82é\82½\82ß\82É\90F\82ñ\82Èapplication\82É\90Ø\82è\91Ö\82¦\82é\82Ì\82ª
+\8c\99\82¾\82Á\82½\82Ì\82Å\81E\81E\81EBroadcastMessage\88È\8aO\82É\97Ç\82¢\95û\96@\82ª\82 \82é\82Ì\82©\82È\81H
+
+\83v\83\8d\83O\83\89\83\80\89ð\90à -----------------------------------------------------------
+
+DBW()
+
+\83f\83o\83b\83O\97p\82Ì\8aÖ\90\94\82Å\82·\81B\90Ù\8dì\82Ìdbgmsg.exe\82Ö\95¶\8e\9a\97ñ\82ð\8fo\97Í\82µ\82Ü\82·\82ª\81A
+\82Ù\82©\82Ìdebug string\82ð\95â\91«\82·\82édebug string monitor\82Å\8eg\82¦\82é\82æ\82¤\82É
+DBW()\82ð\8f\91\82«\8a·\82¦\82½\82Ù\82¤\82ª\97Ç\82¢\82Å\82µ\82å\82¤\81B(OutputDebugString()\82È\82Ç)
+
+popenable.h, popdisable.h
+\82±\82ê\82ç\82Í\81u\89E\83N\83\8a\83b\83N\8c\9f\8dõ\82ð\97L\8cø\82É\82µ\82Ü\82µ\82½\81v\82Æ\82¢\82¤\83\81\83b\83Z\81[\83W\83E\83B\83\93\83h\83E\82Ì
+\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Å\82·\81B\81i\8aÛ\82Ý\82Ì\82 \82é\83E\83B\83\93\83h\83E\81j
+\82±\82Ì\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Í\81Abmp2rgn\82Æ\82¢\82¤\83c\81[\83\8b\82Åpopenable.bmp, popdisable.bmp
+\82ð\95Ï\8a·\82µ\82½\82à\82Ì\82Å\82·\81Bbmp2rgn\82Í\83t\83\8a\81[\83E\83F\83A\82Å\82·\81B
+
+\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80 -------------------------------------------------------
+
+sample program\82Æ\82µ\82Ä\81Amouse cursor\88Ê\92u\82Ìtext\82ð\92\8a\8fo\82µ\81A
+\90Ù\8eÒ\8dì\82Ì\89p\98a\8e«\8f\91\8c\9f\8dõ\83v\83\8d\83O\83\89\83\80 Personal Dictionary for Win32(PDIC)\82Ö
+DDE\82ð\8co\97R\82µ\82Ä\81A\8c\9f\8dõ\8c\8b\89Ê\82ðpopup\82³\82¹\82é \81u\82Ç\82±\83|\83b\83v\81I\81v\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82è\82Ü\82·\81B
+
+http://homepage3.nifty.com/TaN/pdic-download.html
+\82ÉDokoPop!\82Æ\82¢\82¤\96¼\91O\82Å\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B
+
+\8d¡\8cã\82Ì\89Û\91è ---------------------------------------------------------------
+
+\81E\95¡\90\94\8ds\8c\9f\8fo
+\81@\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Å\82Í\82P\8ds\95ª\82µ\82©\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ\82ª\81A
+\81@\95`\89æ\8aJ\8en\88Ê\92u\82ð\92Ç\90Õ\82·\82é\82±\82Æ\82É\82æ\82è\81A\91O\8cã\82Ì\8ds\82à\92\8a\8fo\89Â\94\\82É\82È\82é\82Æ
+\81@\8ev\82¢\82Ü\82·\81B
+
+\92\98\8dì\8c ------------------------------------------------------------------
+
+\8dÄ\94z\95z\81A\93]\8dÚ\81A\95¡\90»\81A\89ü\95Ï\81A\94Ì\94\84\93\99\82Í\82·\82×\82Ä\8e©\97R\82Å\82·\81B\88ê\90Ø\82Ì\90§\8cÀ\82ð\90Ý\82¯\82Ü\82¹\82ñ\81B
+\82½\82¾\82µ\81A\88È\89º\82Ì\82±\82Æ\82Í\82²\97¯\88Ó\82\82¾\82³\82¢\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82Á\82Ä\90¶\82¶\82é\88ê\90Ø\82Ì\91¹\8aQ\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\8aÖ\82µ\82Ä\95M\8eÒ\82Í\82¢\82©\82È\82é\8b`\96±\82à\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\8dÄ\94z\95z\82³\82ê\82½\82à\82Ì\82É\8aÖ\82µ\82Ä\82Í\88ê\90Ø\8aÖ\92m\82µ\82Ü\82¹\82ñ\81B
+
+\97\9a\97ð --------------------------------------------------------------------
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+ \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95¶\8fÍ\82Å\82à\90³\82µ\82\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+ \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
--- /dev/null
+//// HK95c.c
+// --------------------------------------------
+// Dynamically loadable VxD for DCHOOK
+// --------------------------------------------
+#define WIN32_LEAN_AND_MEAN // Excludes un-needed parts of windows.h
+#include <windows.h>
+#include <vmm.h>
+#include <vwin32.h>
+#include <debug.h>
+#include "hk95d.h"
+
+// -------------------------------------
+// Externs defined in assembly module
+// -------------------------------------
+// These defined in assembly for the VMM.INC or VPICD.INC file inclusion
+// ------------------------
+// PRAGMA for this DATA
+// ------------------------
+// Establish segment
+#pragma data_seg ( "_LDATA","_LCODE")
+
+// ------------------------------------
+// Data structures MUST be INITIALIZED
+// ------------------------------------
+// ------------------------
+// PRAGMAS for this CODE
+// ------------------------
+// Establish segment
+#pragma code_seg ( "_LTEXT", "_LCODE" )
+//No stack checking for routines in this module
+#pragma check_stack(off)
+
+// ---------------------------------------
+// Set Good Return code for DIOC requests
+// ---------------------------------------
+void _declspec(naked)GoodReturnDIOC(void)
+{
+ // Clear eax and carry flag for GOOD return
+ _asm xor eax,eax
+ _asm clc
+ _asm ret;
+}
+
+// ---------------------------------------
+// Set Bad Return code for DIOC requests
+// ---------------------------------------
+void _declspec(naked) BadReturnDIOC(void)
+{
+ // NOTE: 50 is a FCN NOT SUPPORTED code -- ok to use
+ // SET carry flag for BAD return
+ _asm mov eax,50
+ _asm stc
+ _asm ret;
+}
+
+
+// ------------------------------
+// Routine for DCHOOK Device UNINIT
+// ------------------------------
+void CHK95_Device_UNInit()
+{
+ // Set GOOD return code
+ GoodReturnDIOC();
+ return;
+}
+// ------------------------------
+// Routine for DCHOOK Device INIT
+// ------------------------------
+
+void CHK95_Device_Init()
+{
+ GoodReturnDIOC();
+}
+DWORD VXDINLINE
+PageModPerm( DWORD Page, DWORD nPages, DWORD Flags1, DWORD Flags2 )
+{
+ DWORD dw;
+
+ _asm push [Flags2]
+ _asm push [Flags1]
+ _asm push [nPages]
+ _asm push [Page]
+ VMMCall( _PageModifyPermissions );
+ _asm add esp, 10h
+ _asm mov [dw], eax
+
+ return(dw);
+}
+
+// --------------------------------
+// Routine for DCHOOK Device IO ctrl
+// --------------------------------
+void CHK95_Device_IOctrl(PDIOCPARAMETERS ptr)
+{
+ int i;
+ unsigned int addr;
+ unsigned int page;
+ int npage;
+ unsigned char *p;
+ unsigned char *q;
+ DWORD oldpermission;
+ // Field the DEV IO requests from VMM
+ switch(ptr->dwIoControlCode)
+ {
+ case DIOC_WRITEABLE_MEMORY: // The address to be changed must be already committed.
+ if ( ptr->lpvInBuffer ){
+ // Does it need a PC_STATIC?
+
+ long r = 0;
+
+ // I don't know exact parameters. But it works well, so I don't care about it....
+
+ r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
+ if ( ptr->lpvOutBuffer ){
+ *((DWORD*)ptr->lpvOutBuffer) = r;
+ }
+ }
+ break;
+ case DIOC_NONWRITEABLE_MEMORY: // The address to be changed must be already committed.
+ {
+ long r = 0;
+
+ r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, ~PC_WRITEABLE, PC_USER | PC_STATIC );
+ if ( ptr->lpvOutBuffer ){
+ *((DWORD*)ptr->lpvOutBuffer) = r;
+ }
+ }
+ break;
+ case DIOC_CHANGE_MEMORY:
+ addr = (DWORD)ptr->lpvOutBuffer;
+ page = addr >> 12; // 4KB
+ npage = ((addr + ptr->cbInBuffer) >> 12) - page + 1;
+ oldpermission = PageModPerm( page, npage, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
+ _asm pushfd
+ _asm cli
+ if ( oldpermission == (DWORD)-1 ){
+ _asm popfd
+ BadReturnDIOC();
+ return;
+ }
+ p = (unsigned char*)addr;
+ q = (unsigned char*)ptr->lpvInBuffer;
+ for ( i=0;i<ptr->cbInBuffer;i++ ){
+ *p++ = *q++;
+ }
+ PageModPerm( page, npage, oldpermission, oldpermission );
+ _asm popfd
+ break;
+#if 0
+ case DIOC_DEBUG:
+ *(DWORD*)ptr->lpvOutBuffer = (DWORD)CHK95_Device_IOctrl;
+ break;
+#endif
+ //The below DIOC_GETVERSION is a part of the dynamic load protocol
+ //It MUST return a GOOD code (all codes here use GoodReturnDIOC()
+// case(DIOC_GETVERSION):
+// case(DIOC_CLOSEHANDLE):
+// default:
+// break;
+ }
+ GoodReturnDIOC();
+ return;
+}
+
--- /dev/null
+;;HK95d.asm
+name HK95D
+.386p
+;; ------------------------------------------------
+;; ------------------------------------------------
+;; HK95d.asm -- Assembly module, MAIN module for
+;; Dynamically loadable VxD for DCHOOK
+;; ------------------------------------------------
+;; ------------------------------------------------
+
+;; -----------------------------------
+;; INCLUDE files needed by this module
+;; -----------------------------------
+
+include <inc\win98\vmm.inc>
+include <inc\win98\vwin32.inc>
+include <inc\win98\vpicd.inc>
+
+;; ------------------------------------
+;; C routines/data used by this module
+;; ------------------------------------
+extrn _CHK95_Device_Init:near
+extrn _CHK95_Device_UNInit:near
+extrn _CHK95_Device_IOctrl:near
+
+;; -------------------------------------
+;; Routines/data called from this module
+;; -------------------------------------
+; public
+
+ ; ==================================================================================
+;; Misc HK95-specific Equates
+;; ----------------------------------------------------------------------------------
+HK95_MajoREV equ 1 ;MAJOR revision level
+HK95_MinoREV equ 0 ;decimal number of revision
+HK95_DeviceID equ Undefined_Device_ID ;no need for MS device number assignment
+; ==================================================================================
+
+;; ---------------------------------------------
+;; Virtual Device Declaration (Required)
+;; (Declares this code as virtual device driver)
+;; Also creates the Device Data Block
+;; ---------------------------------------------
+
+Declare_Virtual_Device HK95D,HK95_MajoREV,HK95_MinoREV,HK95_Control,HK95_DeviceID,Undefined_Init_Order
+
+VxD_LOCKED_CODE_SEG
+;; --------------------------------------------
+;; Control Dispatch Table & Proc (Required)
+;; Used to dispatch supported messages sent by
+;; VMM -- clears carry for unsupported mssgs.
+;; --------------------------------------------
+;; Only 3 VMM messages are recognized and processed
+;; by this routine -- all DIOC interface messages
+;; translate to W32_DeviceIoControl mssgs from the VMM.
+;; "Control_Dispatch" precedes MSSG NUMBER, PROCEDURE
+
+BeginProc HK95_Control
+ Control_Dispatch Sys_Dynamic_Device_Exit, HK95_Device_UNInit
+ Control_Dispatch Sys_Dynamic_Device_Init, HK95_Device_Init
+ Control_Dispatch W32_DeviceIoControl, HK95_Device_IOctrl
+ xor eax,eax ;;return 0 (required in some instances)
+ clc ;;clear carry flg for GOOD indicator
+ ret
+EndProc HK95_Control
+
+;; -------------------------------------------------------------
+;; NOTE: "BeginProc & EndProc" are needed in conjunction with
+;; the above dispatch table -- below routines facilitate C fcns
+;; -------------------------------------------------------------
+
+;; =======================================================================
+;; Routines below are VXD interface (load, unload, process) ROUTINES
+;; =======================================================================
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; SYS_DYNAMIC_DEVICE_INIT message
+;; --------------------------------------------
+BeginProc HK95_Device_Init
+ call _CHK95_Device_Init
+ ret
+EndProc HK95_Device_Init
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; SYS_DYNAMIC_DEVICE_EXIT message
+;; --------------------------------------------
+
+BeginProc HK95_Device_UNInit
+ call _CHK95_Device_UNInit
+ ret
+EndProc HK95_Device_UNInit
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; W32_DEVICEIOCONTROL messages -- These are
+;; VxD requests from the application.
+;; At entry, esi points to the DIOC interface
+;; structure passed by the application
+;; --------------------------------------------
+
+BeginProc HK95_Device_IOctrl
+ push esi
+ call _CHK95_Device_IOctrl
+ pop esi
+ ret
+EndProc HK95_Device_IOctrl
+
+;; ======================================================
+;; Routines below are miscellaneous assembly interfaces
+;; ======================================================
+
+VxD_LOCKED_CODE_ENDS
+
+VxD_LOCKED_DATA_SEG
+VxD_LOCKED_DATA_ENDS
+
+ END
+
--- /dev/null
+VXD HK95D.VXD DYNAMIC
+DESCRIPTION 'Hk 95 Vxd'
+SEGMENTS
+ _LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _ITEXT CLASS 'ICODE' DISCARDABLE
+ _IDATA CLASS 'ICODE' DISCARDABLE
+ _PTEXT CLASS 'PCODE' NONDISCARDABLE
+ _PDATA CLASS 'PDATA' NONDISCARDABLE SHARED
+ _STEXT CLASS 'SCODE' RESIDENT
+ _SDATA CLASS 'SCODE' RESIDENT
+ _DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
+ _RCODE CLASS 'RCODE'
+EXPORTS
+ HK95D_DDB @1
--- /dev/null
+//hk95d.h
+
+#define DIOC_CHANGE_MEMORY 20
+#define DIOC_QUERY_MEMORY 21
+#define DIOC_WRITEABLE_MEMORY 22
+#define DIOC_NONWRITEABLE_MEMORY 23
+#define DIOC_SET_HOOK 25
+#define DIOC_RESTORE_HOOK 26
+#define DIOC_HOOK_START 30
+#define DIOC_HOOK_END 31
+#define DIOC_LAST_STATUS 32
+#define DIOC_DEBUG 33
--- /dev/null
+BUILD_TYPE=base
+# !INCLUDE $(BASEDIR)\inc\master.mk
+
+# OUTDIR = obj\i386\\
+
+# sample make file for building vxd virtual device for Windows
+
+NAME = HK95D
+
+# Definitions for the debug level
+
+!ifdef DEBUG
+DDEBUG =-DDEBLEVEL=1 -DDEBUG
+!else
+DDEBUG =-DDEBLEVEL=0
+!endif
+
+# Definitions for MASM 6 Assembler
+
+INC32 = k:\98ddk
+ASM = ml
+AFLAGS = -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 -I$(INC32) $(DDEBUG)
+ASMENV = ML
+LFLAGS = /VXD /NOD
+
+CFLAGS = -DWIN32 -Di386 -D_X86_ -I$(BASEDIR)\inc
+
+# MASM 6 only inference rules
+
+.asm{$(OUTDIR)}.obj:
+ set $(ASMENV)=$(AFLAGS)
+ $(ASM) -Fo$*.obj $<
+
+.c{$(OUDIR)}.obj:
+ $(CC) -c $(CFLAGS) -Fo$*.obj $*.c
+
+all : $(OUTDIR)$(NAME).VXD
+
+OBJS = $(OUTDIR)hk95d.obj $(OUTDIR)hk95c.obj
+
+$(OUTDIR)vxdstub.exe: $(OUTDIR)vxdstub.obj
+!ifndef PASS0ONLY
+ @echo link -OUT:$@
+ $(LINK16) $(OUTDIR)vxdstub.obj;
+!endif
+
+$(OUTDIR)hk95d.obj: hk95d.asm
+
+$(OUTDIR)$(NAME).vxd: $(NAME).def $(OBJS)
+!ifndef PASS0ONLY
+ @echo link -OUT:$@
+ link @<<$(OUTDIR)$(NAME).lnk
+$(LFLAGS)
+-ignore:4078 -ignore:4039
+/OUT:$(OUTDIR)$(NAME).vxd
+/MAP:$(TOUDIR)$(NAME).map
+/DEF:$(NAME).def
+$(OBJS)
+<<
+ mapsym -s -o $(OUTDIR)R$(NAME).sym $(OUTDIR)$(NAME).map
+!endif
+
+clean:
+ -@if exist $(OUTDIR)*.obj del $(OUTDIR)*.obj
+ -@if exist $(OUTDIR)*.vxd del $(OUTDIR)*.vxd
+ -@if exist $(OUTDIR)*.exp del $(OUTDIR)*.exp
+ -@if exist $(OUTDIR)*.lib del $(OUTDIR)*.lib
+ -@if exist $(OUTDIR)*.map del $(OUTDIR)*.map
+ -@if exist $(OUTDIR)*.sym del $(OUTDIR)*.sym
+ -@if exist *.bak del *.bak
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "amodi", "amodi\amodi.csproj", "{211FD925-C172-418B-A746-83DBCE9D339F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x86 = Debug|x86
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {211FD925-C172-418B-A746-83DBCE9D339F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {211FD925-C172-418B-A746-83DBCE9D339F}.Release|x86.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+namespace amodi
+{
+ partial class AutoMODIMainForm
+ {
+ /// <summary>
+ /// 必要なデザイナー変数です。
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// 使用中のリソースをすべてクリーンアップします。
+ /// </summary>
+ /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows フォーム デザイナーで生成されたコード
+
+ /// <summary>
+ /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
+ /// コード エディターで変更しないでください。
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.tbText = new System.Windows.Forms.TextBox();
+ this.btnDoOCR = new System.Windows.Forms.Button();
+ this.tbFileName = new System.Windows.Forms.TextBox();
+ this.lbFileName = new System.Windows.Forms.Label();
+ this.lbStatus = new System.Windows.Forms.Label();
+ this.tbInfo = new System.Windows.Forms.TextBox();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.miCapturePage = new System.Windows.Forms.ToolStripMenuItem();
+ this.miUseDefLang = new System.Windows.Forms.ToolStripMenuItem();
+ this.miDebugMode = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+ this.miExit = new System.Windows.Forms.ToolStripMenuItem();
+ this.lbPoint = new System.Windows.Forms.Label();
+ this.contextMenuStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // tbText
+ //
+ this.tbText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbText.Location = new System.Drawing.Point(15, 117);
+ this.tbText.Multiline = true;
+ this.tbText.Name = "tbText";
+ this.tbText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.tbText.Size = new System.Drawing.Size(265, 199);
+ this.tbText.TabIndex = 7;
+ //
+ // btnDoOCR
+ //
+ this.btnDoOCR.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnDoOCR.Location = new System.Drawing.Point(87, 54);
+ this.btnDoOCR.Name = "btnDoOCR";
+ this.btnDoOCR.Size = new System.Drawing.Size(98, 28);
+ this.btnDoOCR.TabIndex = 6;
+ this.btnDoOCR.Text = "Do OCR";
+ this.btnDoOCR.UseVisualStyleBackColor = true;
+ this.btnDoOCR.Click += new System.EventHandler(this.btnDoOCR_Click);
+ //
+ // tbFileName
+ //
+ this.tbFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbFileName.Location = new System.Drawing.Point(12, 29);
+ this.tbFileName.Name = "tbFileName";
+ this.tbFileName.Size = new System.Drawing.Size(267, 19);
+ this.tbFileName.TabIndex = 5;
+ //
+ // lbFileName
+ //
+ this.lbFileName.AutoSize = true;
+ this.lbFileName.Location = new System.Drawing.Point(13, 9);
+ this.lbFileName.Name = "lbFileName";
+ this.lbFileName.Size = new System.Drawing.Size(53, 12);
+ this.lbFileName.TabIndex = 4;
+ this.lbFileName.Text = "&Filename:";
+ //
+ // lbStatus
+ //
+ this.lbStatus.AutoSize = true;
+ this.lbStatus.Location = new System.Drawing.Point(22, 94);
+ this.lbStatus.Name = "lbStatus";
+ this.lbStatus.Size = new System.Drawing.Size(38, 12);
+ this.lbStatus.TabIndex = 8;
+ this.lbStatus.Text = "Status";
+ //
+ // tbInfo
+ //
+ this.tbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbInfo.Location = new System.Drawing.Point(16, 322);
+ this.tbInfo.Multiline = true;
+ this.tbInfo.Name = "tbInfo";
+ this.tbInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.tbInfo.Size = new System.Drawing.Size(262, 51);
+ this.tbInfo.TabIndex = 9;
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.miCapturePage,
+ this.miUseDefLang,
+ this.miDebugMode,
+ this.toolStripMenuItem1,
+ this.miExit});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(296, 98);
+ //
+ // miCapturePage
+ //
+ this.miCapturePage.Name = "miCapturePage";
+ this.miCapturePage.Size = new System.Drawing.Size(295, 22);
+ this.miCapturePage.Text = "Capture &Page";
+ this.miCapturePage.Click += new System.EventHandler(this.miCapturePage_Click);
+ //
+ // miUseDefLang
+ //
+ this.miUseDefLang.Name = "miUseDefLang";
+ this.miUseDefLang.Size = new System.Drawing.Size(295, 22);
+ this.miUseDefLang.Text = "Use Default Language (Experimental)";
+ this.miUseDefLang.Click += new System.EventHandler(this.miUseDefLang_Click);
+ //
+ // miDebugMode
+ //
+ this.miDebugMode.Name = "miDebugMode";
+ this.miDebugMode.Size = new System.Drawing.Size(295, 22);
+ this.miDebugMode.Text = "&Debug Mode";
+ this.miDebugMode.Click += new System.EventHandler(this.miDebugMode_Click);
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(292, 6);
+ //
+ // miExit
+ //
+ this.miExit.Name = "miExit";
+ this.miExit.ShortcutKeyDisplayString = "Ctrl+W";
+ this.miExit.Size = new System.Drawing.Size(295, 22);
+ this.miExit.Text = "E&xit";
+ this.miExit.Click += new System.EventHandler(this.miExit_Click);
+ //
+ // lbPoint
+ //
+ this.lbPoint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.lbPoint.AutoSize = true;
+ this.lbPoint.Location = new System.Drawing.Point(205, 66);
+ this.lbPoint.Name = "lbPoint";
+ this.lbPoint.Size = new System.Drawing.Size(31, 12);
+ this.lbPoint.TabIndex = 10;
+ this.lbPoint.Text = "Point";
+ //
+ // AutoMODIMainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(292, 384);
+ this.ContextMenuStrip = this.contextMenuStrip1;
+ this.Controls.Add(this.lbPoint);
+ this.Controls.Add(this.tbInfo);
+ this.Controls.Add(this.lbStatus);
+ this.Controls.Add(this.tbText);
+ this.Controls.Add(this.btnDoOCR);
+ this.Controls.Add(this.tbFileName);
+ this.Controls.Add(this.lbFileName);
+ this.Name = "AutoMODIMainForm";
+ this.Text = "Auto MODI";
+ this.Activated += new System.EventHandler(this.AutoMODIMainForm_Activated);
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox tbText;
+ private System.Windows.Forms.Button btnDoOCR;
+ private System.Windows.Forms.TextBox tbFileName;
+ private System.Windows.Forms.Label lbFileName;
+ private System.Windows.Forms.Label lbStatus;
+ private System.Windows.Forms.TextBox tbInfo;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem miExit;
+ private System.Windows.Forms.ToolStripMenuItem miCapturePage;
+ private System.Windows.Forms.ToolStripMenuItem miDebugMode;
+ private System.Windows.Forms.ToolStripMenuItem miUseDefLang;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+ private System.Windows.Forms.Label lbPoint;
+ }
+}
+
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace amodi
+{
+ public partial class AutoMODIMainForm : Form
+ {
+
+ const int MARGIN_UNDER_CLICK = 2; // 次の行までの空白
+
+ const int WM_COPYDATA = 0x4A;
+ const int WM_APP = 0x8000;
+ const int WM_AMODI = (WM_APP + 0x400);
+ const int WM_EXEC_OCR = (WM_APP + 0x410);
+
+ // WM_COPYDATA command
+ const int WMCD_EXISTCHECK = 0x4000;
+ const int WMCD_SETPOINT = 0x4001;
+ const int WMCD_RESTORE_WINDOW = 0x4002;
+
+
+ //[StructLayout(LayoutKind.Sequential)]
+ private struct COPYDATASTRUCT
+ {
+ public IntPtr dwData;
+ public int cbData;
+ public IntPtr lpData;
+ }
+
+ public struct COPYDATASTRUCT_send {
+ public Int32 dwData; //送信する32ビット値
+ public Int32 cbData; //lpDataのバイト数
+ public string lpData; //送信するデータへのポインタ(0も可能)
+ }
+
+ [DllImport("user32.dll", SetLastError = true)]
+ private static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
+ [DllImport("user32.dll", SetLastError = true)]
+ private static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, ref COPYDATASTRUCT_send lparam);
+ [DllImport("User32.dll", EntryPoint = "FindWindow")]
+ public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
+
+ MODI.Document md;
+ System.IO.FileSystemWatcher fsw;
+ Queue<string> FileNameQue;
+
+ // parser output //
+ int CurLoc; // mouse cursor position in text.
+
+ public AutoMODIMainForm()
+ {
+ InitializeComponent();
+ md = new MODI.Document();
+ FileNameQue = new Queue<string>();
+
+#if true
+ string exepath = System.IO.Path.GetTempPath();
+ exepath += "amodi\\";
+
+ try
+ {
+ System.IO.Directory.Delete(exepath);
+ } catch { }
+ System.IO.Directory.CreateDirectory(exepath);
+#else
+ string exepath = Application.StartupPath;
+ lbFileName.Text = "Watching... - " + exepath;
+#endif
+ fsw = new System.IO.FileSystemWatcher();
+ fsw.Path = exepath;
+ fsw.IncludeSubdirectories = false;
+ fsw.SynchronizingObject = this;
+ fsw.Changed += new System.IO.FileSystemEventHandler(watcher_Changed);
+ fsw.EnableRaisingEvents = true;
+ }
+ void Cleanup()
+ {
+ fsw.EnableRaisingEvents = false;
+ fsw.Dispose();
+ fsw= null;
+ }
+
+ private void btnDoOCR_Click(object sender, EventArgs e)
+ {
+ DoOCR(tbFileName.Text);
+ }
+
+ private bool DoingOCR = false;
+ bool DoOCR(string filename)
+ {
+ if (DoingOCR) return false;
+ DoingOCR = true;
+
+ bool capture_page = miCapturePage.Checked;
+
+ ParseFileName(filename);
+
+ lbStatus.Text = "Recognizing... " + filename;
+ tbText.Text = "";
+ tbInfo.Text = "";
+ for (int i = 0; i < 10; i++){
+ try {
+ md.Create(filename);
+ } catch {
+ tbInfo.AppendText("MODI Create failure: " + filename + "\r\n");
+ DBW("MODI Create file failure: " + filename);
+ System.Threading.Thread.Sleep(30);
+ continue;
+ }
+ break;
+ }
+ DBW("DoOCR:OCR");
+ try {
+ if (miUseDefLang.Checked){
+ md.OCR(MODI.MiLANGUAGES.miLANG_SYSDEFAULT, true, true);
+ } else {
+ md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
+ }
+ } catch {
+ DBW("MODI OCR Error: " + filename);
+ md.Close();
+ DBW("DoOCR:Closed");
+ lbStatus.Text = "OCR Error: " + filename;
+ DoingOCR = false;
+ return false;
+ }
+ DBW("DoOCR:Completed");
+ const int UnderGap = MARGIN_UNDER_CLICK; // 単語のある領域より少し下のpointでも検索対象と認識する空白部分(Y方向)
+ int last_x = 0;
+ int lineno = 0;
+ CurLoc = 0;
+ lbPoint.Text = "" + CursorPoint.X + "," + CursorPoint.Y;
+ tbInfo.AppendText("Page:" + md.Images.Count + " pt:" + CursorPoint.X + "," + CursorPoint.Y + "\r\n");
+ for (int i = 0; i < md.Images.Count; i++)
+ {
+ MODI.Image image = (MODI.Image)md.Images[i];
+ MODI.Layout layout = image.Layout;
+ bool outok = capture_page;
+ string prevWord = "";
+ for (int j = 0; j < layout.Words.Count; j++)
+ {
+ MODI.Word word = (MODI.Word)layout.Words[j];
+ bool cr = false;
+ bool curLocSet = false;
+
+ for (int k = 0; k < word.Rects.Count; k++)
+ {
+ MODI.MiRect rc = (MODI.MiRect)word.Rects[k];
+ int h = rc.Bottom - rc.Top;
+ int w = rc.Right - rc.Left;
+
+ //bool incursor;
+ //tbText.AppendText(word.Text + " (" + rc.Left + "," + rc.Top+ ")\r\n");
+ if (CursorPoint.Y >= rc.Top && CursorPoint.Y <= rc.Bottom+UnderGap){
+ //incursor = true;
+ if (!outok)
+ {
+ if (CursorPoint.X < rc.Left) {
+ // cursorを飛び越えた
+ outok = true;
+ curLocSet = true;
+ if (prevWord.Length != 0) {
+ tbText.AppendText(prevWord + " ");
+ CurLoc = prevWord.Length + 1;
+ }
+ } else
+ if (CursorPoint.X >= rc.Left && CursorPoint.X <= rc.Right){
+ outok = true;
+ curLocSet = true;
+ if (prevWord.Length != 0) {
+ tbText.AppendText(prevWord + " ");
+ CurLoc = prevWord.Length + 1;
+ }
+ } else {
+ prevWord = word.Text;
+ }
+ }
+ } else {
+ //incursor = false;
+ }
+
+ if (outok){
+ tbInfo.AppendText(word.Text + " (" + w + "x" + h + ":" + rc.Left + "," + rc.Top + ")\r\n");
+ }
+
+ if (last_x > rc.Left){
+ if (tbText.Text!="")
+ cr = true;
+ lineno++;
+ }
+ last_x = rc.Left;
+ }
+
+ if (outok){
+ if (cr){
+ tbText.AppendText("\r\n");
+ if (curLocSet)
+ CurLoc += 2; // CR+LF
+ }
+
+ tbText.AppendText(word.Text + " ");
+ }
+ }
+ }
+ md.Close(false);
+ lbStatus.Text = "Done. " + filename;
+ DoingOCR = false;
+ return true;
+ }
+ private void ParseFileName(string filename)
+ {
+ Regex r = new Regex(@"\((?<x>\d+),(?<y>\d+)\)");
+ Match m = r.Match(filename);
+ if (m.Success)
+ {
+ CursorPoint.X = int.Parse(m.Groups["x"].Value);
+ CursorPoint.Y = int.Parse(m.Groups["y"].Value);
+ }
+ }
+
+ //イベントハンドラ
+ private void watcher_Changed(System.Object source,
+ System.IO.FileSystemEventArgs e)
+ {
+ switch (e.ChangeType)
+ {
+ case System.IO.WatcherChangeTypes.Changed:
+ string ext = System.IO.Path.GetExtension(e.FullPath);
+ if (ext==".gif" || ext==".jpg" || ext==".png" || ext==".tif" || ext==".bmp" || ext==".dib")
+ {
+ PostOCR(e.FullPath);
+ }
+ break;
+// case System.IO.WatcherChangeTypes.Created:
+ //break;
+// case System.IO.WatcherChangeTypes.Deleted:
+ // break;
+ }
+ }
+
+ private void PostOCR(string filename)
+ {
+ FileNameQue.Enqueue(filename);
+ PostMessage(this.Handle, WM_EXEC_OCR, IntPtr.Zero, IntPtr.Zero);
+ }
+
+ private void ExecOCR(string filename)
+ {
+ if (DoOCR(filename)) {
+ string textname = filename + ".txt";
+ for (int i = 0; i < 10; i++) {
+ try {
+ StreamWriter writer = new StreamWriter(textname, false, System.Text.Encoding.GetEncoding("utf-16"));
+ writer.WriteLine(CurLoc.ToString());
+ writer.Write(tbText.Text);
+ writer.Close();
+ } catch {
+ tbInfo.AppendText("Write Error:" + textname + "\r\n");
+ System.Threading.Thread.Sleep(30);
+ continue;
+ }
+ break;
+ }
+ }
+ if (!miDebugMode.Checked) {
+ try {
+ System.IO.File.Delete(filename);
+ }
+ catch
+ {
+ // 連続して.bmpファイルが作られているため
+ tbInfo.AppendText("Delete Error:" + filename + "\r\n");
+ }
+ }
+ }
+
+ private void miExit_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ enum AMODI_CMD
+ {
+ QUERY = 0,
+ PAGE_CAPTURE = 1,
+ };
+ struct POINT
+ {
+ public int x;
+ public int y;
+ };
+ Point CursorPoint;
+ unsafe static Point int2point(IntPtr param)
+ {
+ POINT pt = (POINT)Marshal.PtrToStructure((IntPtr)param, typeof(POINT));
+ Point p = new Point();
+ p.X = pt.x;
+ p.Y = pt.y;
+ return p;
+ }
+ // interface for external app
+ protected override void WndProc(ref Message m)
+ {
+ if (m.Msg == WM_AMODI)
+ {
+ switch ((AMODI_CMD)m.WParam)
+ {
+ case AMODI_CMD.QUERY:
+ m.Result = (IntPtr)m.LParam;
+ return;
+ case AMODI_CMD.PAGE_CAPTURE:
+ m.Result = (IntPtr)(miCapturePage.Checked ? 1 : 0);
+ return;
+ default:
+ break;
+ }
+ } else
+ if (m.Msg == WM_EXEC_OCR) {
+ string filename = "";
+ while (FileNameQue.Count()!=0) {
+ filename = FileNameQue.Dequeue();
+ }
+ if (filename != "") {
+ ExecOCR(filename);
+ }
+ } else
+ if (m.Msg == WM_COPYDATA)
+ {
+ COPYDATASTRUCT cds = new COPYDATASTRUCT();
+ cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
+ if (cds.dwData == (IntPtr)WMCD_EXISTCHECK)
+ {
+ m.Result = (IntPtr)1;
+ return;
+ } else
+ if (cds.dwData == (IntPtr)WMCD_SETPOINT){
+ CursorPoint = int2point(cds.lpData);
+ Console.WriteLine("Cursor:" + CursorPoint.X + "," + CursorPoint.Y);
+ return;
+ } else
+ if (cds.dwData == (IntPtr)WMCD_RESTORE_WINDOW)
+ {
+ this.Show();
+ }
+#if false // 参考
+ if (cds.cbData > 0)
+ {
+ byte[] data = new byte[cds.cbData];
+ Marshal.Copy(cds.lpData, data, 0, cds.cbData);
+ //あとは data に COPYDATA の内容が入ってるので適宜処理
+ }
+ m.Result = (IntPtr)1;
+#endif
+ }
+ base.WndProc(ref m);
+ }
+
+ private void miCapturePage_Click(object sender, EventArgs e)
+ {
+ miCapturePage.Checked = !miCapturePage.Checked;
+ }
+
+ private void AutoMODIMainForm_Activated(object sender, EventArgs e)
+ {
+ //this.Hide();
+ }
+
+ private void miDebugMode_Click(object sender, EventArgs e)
+ {
+ miDebugMode.Checked = !miDebugMode.Checked;
+ }
+
+ private void miUseDefLang_Click(object sender, EventArgs e)
+ {
+ miUseDefLang.Checked = !miUseDefLang.Checked;
+ }
+
+ static int hWin = 0;
+ void DBW( string msg )
+ {
+ if ( hWin==0 ){
+ hWin = FindWindow( "TDbgMsgForm", "Debug Messenger" );
+ if ( hWin==0 ) return;
+ }
+ byte[] bytearray = System.Text.Encoding.Default.GetBytes(msg);
+ int len = bytearray.Length;
+ COPYDATASTRUCT_send cds;
+ cds.dwData = 1; // Indicate String
+ cds.cbData = len + 1;
+ cds.lpData = msg;
+ SendMessage( (IntPtr)hWin, WM_COPYDATA, IntPtr.Zero, ref cds );
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root>
\ No newline at end of file
--- /dev/null
+using System;
+using System.Collections.Generic;
+//using System.Linq;
+using System.Windows.Forms;
+using System.Threading;
+using System.Reflection;
+
+namespace amodi
+{
+ static class Program
+ {
+ /// <summary>
+ /// アプリケーションのメイン エントリ ポイントです。
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ Assembly asm = Assembly.GetEntryAssembly();
+ string path = asm.Location;
+ path = path.Replace('\\', '_');
+ Mutex mutex = new Mutex(false, path);
+ if (mutex.WaitOne(0, false) == false){
+ // すでに起動している
+ return;
+ }
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new AutoMODIMainForm());
+
+ mutex.ReleaseMutex();
+ }
+ }
+}
+
--- /dev/null
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
+// アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更してください。
+[assembly: AssemblyTitle("amodi")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("DokoPop Project")]
+[assembly: AssemblyProduct("amodi")]
+[assembly: AssemblyCopyright("Copyright © DokoPop Project")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから
+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
+[assembly: Guid("c033b27f-f82d-417e-b219-5878fc8c0169")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
+// 既定値にすることができます:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null
+//------------------------------------------------------------------------------
+// <auto-generated>
+// このコードはツールによって生成されました。
+// ランタイム バージョン:4.0.30319.18449
+//
+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+// コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace amodi.Properties {
+ using System;
+
+
+ /// <summary>
+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
+ /// </summary>
+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
+ // または Visual Studio のようなツールを使用して自動生成されました。
+ // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
+ // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("amodi.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
--- /dev/null
+//------------------------------------------------------------------------------
+// <auto-generated>
+// このコードはツールによって生成されました。
+// ランタイム バージョン:4.0.30319.18449
+//
+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+// コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace amodi.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
--- /dev/null
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{211FD925-C172-418B-A746-83DBCE9D339F}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>amodi</RootNamespace>
+ <AssemblyName>amodi</AssemblyName>
+ <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+ <TargetFrameworkProfile>
+ </TargetFrameworkProfile>
+ <FileAlignment>512</FileAlignment>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup>
+ <StartupObject>
+ </StartupObject>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="MainForm.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="MainForm.Designer.cs">
+ <DependentUpon>MainForm.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="MainForm.resx">
+ <DependentUpon>MainForm.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="app.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <COMReference Include="MODI">
+ <Guid>{A5EDEDF4-2BBC-45F3-822B-E60C278A1A79}</Guid>
+ <VersionMajor>12</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>tlbimp</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>True</EmbedInteropTypes>
+ </COMReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/></startup></configuration>
--- /dev/null
+\81¡Tips
+\81EMODI\82Ì\83v\83\8d\83W\83F\83N\83g\82Ö\82Ì\92Ç\89Á\95û\96@
+ VS2013\82Ì\8fê\8d\87\81F
+ - \83\\83\8a\83\85\81[\83V\83\87\83\93\83G\83N\83X\83v\83\8d\81[\83\89\81[\82É\81u\8eQ\8fÆ\90Ý\92è\81v\82Ì\8d\80\96Ú\82ª\82 \82é
+ - \82»\82±\82ð\91I\91ð\81¨\8eQ\8fÆ\82Ì\92Ç\89Á
+ - \8d¶\91¤\82Ì\83y\83C\83\93\82æ\82è\81A\81uCOM - \83^\83C\83v\83\89\83C\83u\83\89\83\8a\81v\82ð\91I\91ð
+ - \88ê\97\97\82Ì\92\86\82É\81uMicrosoft Office Document Imaging 12.0 Type Libray\81v\82ª\82 \82é\82Ì\82Å\82»\82ê\82ð\91I\91ð\82µ\82ÄOK
+
+\81E(MODI.Image)md.Images[i] \82Ì\82Æ\82±\82ë\82Åcompile error\82ª\8fo\82é\82Æ\82«
+ - \8dª\96{\93I\82È\89ð\8c\88\82Å\82Í\82È\82¢\82ª\81Aamodi.csproj \82Ì\92\86\82Ì\8e\9f\82Ì\8d\80\96Ú\82ð\95Ï\8dX\81E\8dí\8f\9c\82·\82é
+ - "x86"\82ð\82·\82×\82Ä"AnyCPU"\82É
+ - TargetFrameworkVersion\82ðv4.0\82©\82çv4.5\82É\95Ï\8dX
+ - <Prefer32Bit>false</Prefer32Bit>\82ð\8dí\8f\9c
+ - <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\82ð\8dí\8f\9c
+ \82±\82ê\82Åcompile error\82Íthrough\82·\82é\82æ\82¤\82¾
+
--- /dev/null
+#!perl
+# Change the string in the .iss file.
+
+sub usage
+{
+print << "EOT";
+Usage:
+ change_iss.pl [input filename] [section name] [key name] [substituted value]
+EOT
+}
+
+$u_input = $ARGV[0];
+$u_section = $ARGV[1];
+$u_key = $ARGV[2];
+$u_value = $ARGV[3];
+
+if (!$u_value){
+ usage();
+ exit(1);
+}
+
+open F,$u_input or die "open error $u_input";
+
+while (<F>){
+ if (length>0){
+ if (/^\[(.+)\]/){
+ # Section start
+ $section = $1;
+ $key = '';
+ } else {
+ if (/^(.+?)=/){
+ # Found a key.
+ $key = $1;
+ if ($u_section =~ /^$section$/i){
+ # found the same section
+ if ($u_key =~ /^$key$/i){
+ $_ = "$key=$u_value\n";
+ }
+ }
+ }
+ }
+ }
+ print $_;
+}
+
+
--- /dev/null
+copy DCHook\Win32\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+copy DCHook\x64\Release\DCHook.dll DCHookTest\DKPUHK64.DLL
+copy DCHook64\dchk64\x64\Release\dchk64.exe DCHookTest\DKPUHK64.exe
--- /dev/null
+[Finish]
+Disp=0
+Comp=1148
+[Jump]
+Check=0
+Date=0
+Del=0
+Dir=0
+Div=0
+Exe=0
+Ext=0
+File=0
+Go=0
+Go2=0
+Menu=0
+Pack=0
+Title=0
+Upl=0
+Reg=0
+Ask=0
+News=0
+Error=0
+Back=0
+Uninstall=0
+[Setup]
+NoUninstall=0
+OnlyUninstall=0
+[Exe]
+Name=DKPP111.exe
+IconName=DKPP.EXE
+Icon=0
+#No1=#1
+#No2=#3
+[Title]
+Setup=DokoPop!
+Company=DokoPopProject
+Soft=DKPP
+[Del]
+Auto=0
+Checked=1
+ShowError=1
+0=
+Force=1
+Reboot=1
+[Dir]
+Root=%programs%\DokoPop
+1=
+[DirRemove]
+1=
+[File0]
+Name=D:\SRC\DCHook\DKPP.EXE
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File1]
+Name=D:\SRC\DCHook\DKPP.TXT
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File2]
+Name=D:\SRC\DCHook\DKPPHK.DLL
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File3]
+Name=D:\SRC\DCHook\HK95D.VXD
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File4]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File5]
+Name=
+[CopyFile]
+DefaultNo=0
+Reboot=1
+Question=0
+[Pack]
+Copy=0
+Del=0
+[Menu]
+Name=DokoPop!
+[Check]
+Desktop=0
+Startup=2
+Menu=2
+Ext=0
+Send=0
+[Go]
+Readmename=DKPP.TXT
+Readmeno=1
+Desktop=0
+Startup=1
+Menu=1
+Auto=0
+Agree=0
+[Go2]
+Make0=
+Erase0=
+[Menu0]
+Name=DokoPop!
+Path=DKPP.EXE
+Arg=
+Icon=DKPP.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Menu1]
+Name=DokoPop! \90à\96¾\8f\91
+Path=DKPP.TXT
+Arg=DKPP.TXT
+Icon=DKPP.TXT
+Work=
+Short=
+IconNo=0
+Show=0
+Init=1
+[Menu2]
+Name=
+[Send0]
+Name=
+[Desktop]
+Name=
+[Startup]
+Name=DokoPop!
+Path=DKPP.EXE
+Arg=
+Icon=DKPP.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Ext0]
+Ext=
+[Date]
+Year=2002
+Month=12
+Day=9
+Hour=1
+Minute=11
+Second=0
+Comp=1
+Exe=1
+[Upl]
+Check=IBM PC/AT\8cÝ\8a·\8b@,NT4.0,Win98
+Env=MS-Windows 98/NT4.0
+Key=DKPP,PDIC,$WIN32,#APP,#UTL
+Kind=\83t\83\8a\81[\83E\83F\83A
+Make=
+Man=TaN(SGM00353)
+Title=DokoPop!
+Trans=\93]\8dÚ\8e©\97R
+Gal=0
+Win=0
+[Intr]
+Count=0
+[Hist]
+Count=0
+[Div]
+New=DKPPC
+Go=0
+Top=0
+Delete=0
+Num=1457664
+TopNum=1457664
+[Reg]
+Make0=
+Erase0=
+[Back]
+Do=0
+0=fill,0,0,0
+1=mode,bottom
+2=rect,0,0,%100,%80
+3=gradation,0,0,0,0,0,255
+4=mode,bottom
+5=rect,%1,%1
+6=font,0,0,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+7=height,%10
+8=|Doko Pop! Ver.1.11
+9=rect,%2,%2
+10=font,255,255,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+11=height,%10
+12=|Doko Pop! Ver.1.11
+13=/-----
+14=
+[Readme]
+0=page,install
+1=mode,fill
+2=fill,64,192,192
+3=mode,right
+4=rect,5,0
+5=font,255,255,255,-36,0,0,0,400,0,0,0,0,3,2,1,34,Arial
+6=|Welcome to
+7=font,255,255,255,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+8=|Doko Pop!
+9=rect,7,2
+10=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+11=|Welcome to
+12=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+13=|DokoPop!
+14=font,0,0,0,-12,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+15=mode,bottom
+16=rect,7,70
+17=|
+18=|\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82Í
+19=|
+20=|\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92Ç\89Á\82Æ\8dí\8f\9c\81v\82©\82ç
+21=|
+22=|\81uDokoPop!\81v\82ð\91I\91ð\81\95\8eÀ\8ds\82µ\82Ä\82\82¾\82³\82¢\81D
+23=/-----
+No=24
--- /dev/null
+#!perl -S mktpl.pl dchook.tpl
+------------------------------------------------------------------------
+ DCHOOK Document Template
+------------------------------------------------------------------------
+%NEWMAJOR=1
+%NEWMINOR=11
+%POST=
+%OLDMAJOR=1
+%OLDMINOR=10
+%OLDPOST=
+
+%DATE_Y=02 \8cö\8aJ\93ú
+%DATE_M=12
+%DATE_D=09
+
+%TIME_H=01
+%TIME_M=11
+%TIME_S=00
+
+%DATE_YY=20%DATE_Y%
+%VERSION = %NEWMAJOR%.%NEWMINOR%%POST%
+%VER=%NEWMAJOR%%NEWMINOR%
+%OLDVERSION=%OLDMAJOR%.%OLDMINOR%%OLDPOST%
+%OLDVER=%OLDMAJOR%%OLDMINOR%
+%DATE=%DATE_YY%.%DATE_M%.%DATE_D%
+
+%ARC=dchook-%VERSION%.lzh
+%DKPPARC=DKPP%VER%.EXE
+
+%HTML=S:\Web\NIFTY\
+%MYSOFT=S:\down\MySoft
+
+#\88È\89º\82ÍMK.BAT\97p
+%FDATE=%DATE_M%/%DATE_D%/%DATE_Y%
+%FTIME=%TIME_H%:%TIME_M%:%TIME_S%
+%PDNEW=%VER%
+%PDOLD=%OLDVER%
+
+%VARFILE=%HTML%pdic-download.var
+%IND=dchook.ind
+%CHGINI=perl -S chgini.pl
+
+%KEY1=DOKOPOP
+%KEY2=PDIC
+%KEY3=$WIN32
+%KEY4=#APP
+%KEY5=#EDU
+
+****************** UPDATE \93à\97e **************************************
+<*UPDATE.TXT
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+##EOF
+******************** DokoPop! \82Ì\95Ï\8dX\97\9a\97ð ****************************
+##<*HISTORY.TXT
+##>UPDATE.TXT
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+ \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95¶\8fÍ\82Å\82à\90³\82µ\82\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94\90¶\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+ \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82¶\82è\82Ì\95¶\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+##EOF
+****************** \8e©\8cÈ\8fÐ\89î ******************************************
+##<*PROB.TXT
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+##EOF
+
+##<*INTRO.TXT
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81I \82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81I \82Í PDIC for Win32\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC for Win32\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC for Win32\82Ì\93ü\8eè\90æ(\95K\90{)\81F
+ http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+ http://homepage3.nifty.com/TaN/prog-tips.html %ARC%
+##EOF
+
+##<DKPPu.TXT
+========================================================================
+\81y\83\ \83t \83g\96¼\81z \82Ç\82±\83|\83b\83v\81I Ver.%VERSION%
+\81y\93o \98^ \96¼\81z\81@%DKPPARC%
+\81y\83o\83C\83g \90\94\81z <FILESIZE:%DKPPARC%> Bytes
+\81y\8c\9f\8dõ \83L\81[\81z\81@1:%KEY1% 2:%KEY2% 3:%KEY3% 4:%KEY4% 5:%KEY5%
+\81y\92\98\8dì\8c \8eÒ\81z\81@\82È\82µ
+\81y\8cf \8dÚ \8eÒ\81z\81@TaN(SGM00353)
+\81y\91Î\89\9e \8b@\8eí\81z\81@MS-Windows 98/Me/NT4.0/2000/XP
+\81y\93®\8dì \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,NT4,0,Win98,2000
+\81y\8cf \8dÚ \93ú\81z\81@%DATE%
+\81y\8dì\90¬ \95û\96@\81z\81@%DKPPARC% \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ \8fð\8c\8f\81z \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+##>INTRO.TXT
+
+##>UPDATE.TXT
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+##>PROB.TXT
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81y%DKPPARC%\81z\82Å\82·\81B
+##EOF
+
+<README.TXT
+==========================================================================
+ DCHook sample program
+==========================================================================
+Introduction -------------------------------------------------------------
+
+DCHook\82Í\81AWindows\82É\82¨\82¢\82Ä\94C\88Ó\82ÌWindow\82Ì\94C\88Ó\82Ì\8dÀ\95W\88Ê\92u\82©\82ç
+\82»\82±\82É\95`\89æ\82³\82ê\82Ä\82¢\82é\83e\83L\83X\83g\82ð\8fE\82Á\82Ä\82\82é\83v\83\8d\83O\83\89\83\80\82Å\82·\81B
+\82¿\82å\82Á\82Æ\82â\82Á\82Ä\82Ý\82½\82ç\8aÈ\92P\82É\93®\82¢\82½\82Ì\82Å\81A\8cö\8aJ\82·\82é\82±\82Æ\82É\82µ\82Ü\82µ\82½\81B
+
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ì\89\9e\97p\82Æ\82µ\82Ä\82Í\81A
+\81E\94C\88Ó\82Ì\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\81E\91S\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ðgrep\82·\82é
+\81E\83J\81[\83\\83\8b\88Ê\92u\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\82Æ\82¢\82Á\82½\88ê\95\97\95Ï\82í\82Á\82½\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82É\82Í\8eQ\8dl\82Æ\82µ\82Ä\81ADokoPop\82Æ\82¢\82¤\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82ð
+\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+install ------------------------------------------------------------------
+
+\88³\8fk\83t\83@\83C\83\8b\82ð\93K\93\96\82È\82Æ\82±\82ë\82É\89ð\93\80\82µ\82Ä\82\82¾\82³\82¢\81B
+\83f\83B\83\8c\83N\83g\83\8a\95t\82«\82Å\89ð\93\80\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\93Y\95t\83t\83@\83C\83\8b -------------------------------------------------------------
+
+target\82É\82È\82é\82à\82Ì\81F
+
+dchook.dll (NT/2K\94Å or 9x\94Å)
+hk95d.vxd (9x\90ê\97p)
+dchooktest.exe (NT/2K\82Æ9x8\8b¤\97p)
+
+\95K\97v\82È\8aJ\94\8aÂ\8b« -----------------------------------------------------------
+C++ Builder 5
+Visual C++ 6.0
+Windows Device Driver Kit (DDK) for Windows 98
+
+\8dì\90¬\95û\96@ -----------------------------------------------------------------
+
+--------------------------------
+dchook.dll
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+Visual C++
+
+\8dì\90¬\95û\96@\81F
+nmake -fdchook.mak
+
+--------------------------------
+hk95d.vxd
+--------------------------------
+\95K\97v\82È\8aÂ\8b«
+Visual C++, DDK for Win98
+
+\95Ï\8dX\89Ó\8f\8a\81F
+makefile
+INC32\82ðDDK\82Ìroot path\82É(e:\98ddk\82È\82Ç)
+
+\8dì\90¬\95û\96@\81F
+nmake
+\81¦\82±\82Ì\8eÀ\8ds\91O\82ÉVisual-C++\82¨\82æ\82ÑDDK\82Ì\8aÂ\8b«\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+\81@\83o\83b\83`\83t\83@\83C\83\8b\82Å\8aÂ\8b«\90Ý\92è\82·\82é\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A
+\81@\8dì\90¬\91O\82É\83o\83b\83`\83t\83@\83C\83\8b\82ð\8eÀ\8ds\82µ\82Ä\82\82¾\82³\82¢\81B
+\81@\81ivcvars32.bat\81Asetenv.bat e:\98ddk \82Æ\82¢\82Á\82½\8a´\82¶\82Å
+\81@\81¨\8fÚ\82µ\82\82ÍVisual-C++\81ADDK\82É\95t\91®\82Ì\90à\96¾\8f\91\82ð\8eQ\8fÆ\81j
+
+--------------------------------
+dchooktest.exe
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+C++ Builder 5
+
+\95Ï\8dX\89Ó\8f\8a\81F
+\93Á\82É\82È\82µ
+\81¦DEBUG\82ðdefine\82·\82é\82Æ\81ADEBUG\97p\82Ì\93®\8dì\82É\82È\82è\82Ü\82·\81B
+
+\8dì\90¬\95û\96@\81F
+dchooktest.bpr\82ðC++Builder\82Å\8aJ\82¢\82Ä\82\82¾\82³\82¢\81B
+C++Builder4\82Å\82à\82Å\82«\82é\82©\82à\81A\82Æ\8ev\82Á\82Ä C++Builder4\88È\91O\97p\82É
+dchooktest.mak\82à\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B\91½\8f\82Ì\95Ï\8dX\82Å\8eg\82¦\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\82 \82Æ\82Í\81A\83\81\83j\83\85\81[\82©\82ç Project | \8dÄ\8d\\92z \82Å\8dì\90¬\82µ\82Ü\82·\81B
+
+\8eÀ\8ds\81F
+dchooktest.exe\82ð\8eÀ\8ds\82µ\82Ü\82·\81B
+
+\81\9a\92\8d\88Ó\93_\81F
+DCHookTest.exe\82ªLoad\82·\82éDLL\82Í\81A
+DKPPHK.DLL -> DCHOOK.DLL
+\82Ì\8f\87\94Ô\82Å\90æ\82É\8c©\82Â\82©\82Á\82½\95û\82ðload\82·\82é\8ed\97l\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B
+DEBUG\82ðdefine\82µ\82½\82Æ\82«\82Í\81ADCHOOK.DLL\82Ì\82Ý\82ðload\82µ\82æ\82¤\82Æ\82µ\82Ü\82·\81B
+
+\83v\83\8d\83O\83\89\83\80\90à\96¾ -----------------------------------------------------------
+
+\88ê\94Ô\96ï\89î\82È\82à\82Ì\82Í\81Adchook.cpp\82Å\82µ\82å\82¤\81B
+\8e\8e\8ds\8dö\8cë\82µ\82È\82ª\82ç\82à\92Z\8e\9e\8aÔ\82Å\88ê\8bC\82É\8f\91\82«\8fã\82°\82½\82à\82Ì\82Å\82·\82Ì\82Å\81A
+\82©\82È\82è\89\98\82\82È\82Á\82Ä\82¢\82Ü\82·\81B
+#define\82É\82æ\82éswitch\82É\82Í\81A\90F\82ñ\82È\91g\82Ý\8d\87\82í\82¹\82ª\82 \82è\82Ü\82·\82ª\81A
+\8c»\8fó\88È\8aO\82Ì\90Ý\92è\82É\82·\82é\82Æ\90³\8fí\82É\93®\8dì\82µ\82È\82©\82Á\82½\82è\81A
+compile\82³\82¦\82à\82Å\82«\82È\82¢\82Í\82¸\82Å\82·\81B\82¾\82Á\82½\82ç\81A\90®\97\9d\82µ\82È\82³\82¢\81I
+\82Æ\8c¾\82í\82ê\82»\82¤\82Å\82·\82ª\81A\8d¡\8cã\95K\97v\82Æ\82È\82é\82Æ\82±\82ë\82ª\82 \82é\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\81A
+\82»\82Ì\82Ü\82Ü\82É\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+\93®\8dì\8c´\97\9d\82Æ\82µ\82Ä\82Í\81A\83e\83L\83X\83g\82ð\8eæ\93¾\82µ\82½\82¢window\82É\91Î\82µ\82Ä
+\8dÄ\95`\89æ\96½\97ß\82ð\91\97\82è\81A\8dÄ\95`\89æ\92\86\82Ì\83e\83L\83X\83g\95`\89æ\8aÖ\90\94\82Ì\93à\97e\82ð
+\89¡\8eæ\82è\82·\82é\82±\82Æ\82Å\8fE\82Á\82Ä\82«\82Ü\82·\81B
+
+\8dÅ\8f\89\8dì\82è\8en\82ß\82½\8d \82Í\81AWindows\82©\82çDC\82ð\93n\82µ\82Ä\82¢\82é\8aÖ\90\94\82ðhook\82µ\81A
+DC\82ðmetafile\82Å\8dÄ\90¶\82·\82ê\82Î\8aÈ\92P\82¶\82á\82È\82¢\82©\81H\82Æ\8ev\82Á\82Ä\82â\82Á\82Ä\82Ý\82Ü\82µ\82½\81B
+\82»\82¤\82µ\82½\82ç\82 \82Á\82¯\82È\82\93®\82¢\82½\82Ì\82Å\82·\82ª\81A\95Ê\82Ìapplication\82Å\82â\82Á\82Ä\82Ý\82é\82Æ
+\82¤\82Ü\82\93®\82©\82È\82¢\82±\82Æ\82ª\82 \82è\82Ü\82µ\82½\81B
+\8c´\88ö\82Í\81ACreateCompatibleBitmap\82Åbitmap\82ð\8dì\90¬\82µ\81A\82»\82±\82Ö\88ê\92U\95`\89æ
+\82µ\82Ä\82©\82ç\81ABitBlt\82Åwindow\82É\93\\82è\95t\82¯\82éapplication\82ª\82 \82Á\82½\82©\82ç\82Å\82·\81B
+\82»\82¤\82È\82é\82Æ\81ADC\82¾\82¯\82Å\82Í\83e\83L\83X\83g\95`\89æ\8fî\95ñ\82ª\93¾\82ç\82ê\82Ü\82¹\82ñ\82Ì\82Å\81A
+\95K\97v\82Ètext\95`\89æ\8aÖ\90\94\82ðhook\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+(\82Ù\82©\82É\82àBeginPaint()\82Å\93n\82³\82ê\82éDC\82Å\82Í\82È\82\81AGetDC()\82Å
+\93¾\82½DC\82É\91Î\82µ\82Ä\95`\89æ\82µ\82Ä\82¢\82éapplicaton\82É\91Î\82µ\82Ä\82à\82¤\82Ü\82\82¢\82«\82Ü\82¹\82ñ\82Å\82µ\82½)
+
+\82±\82Ì\91O\82É\82±\82Ìhook\82Ì\95û\96@\82Å\82·\82ª\81ANT\82Æ9x\82Å\82Í\88Ù\82È\82è\82Ü\82·\81B
+NT\82Í\8aeapplication\82ª\93Æ\97§\82Ìmemory\8bó\8aÔ\82Å\82 \82è\81Auser32.dll,gdi32.dll\82à
+application\96\88\82Ìmemory\8bó\8aÔ\82É\91¶\8dÝ\82µ\82Ä\82¢\82é\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81A
+\82¢\82«\82È\82è\8b¤\97Lmemory\82Ö\8ds\82Á\82Ä\82µ\82Ü\82Á\82Ä\82¢\82é\82Ì\82Å\81A\8aÈ\92P\82É\82Íhook\82Å\82«\82Ü\82¹\82ñ\81B
+
+API\82Ìhook\95û\96@\82Í\81A\83A\83X\83L\81[\82©\82ç\8fo\94Å\82³\82ê\82Ä\82¢\82é\81uAdvanced Windows\81v
+\82ð\8eQ\8dl\82É\82µ\82Ü\82µ\82½\81B
+http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/pdichomepage-22
+\82±\82±\82ÉAPI\83t\83b\83N\82Ì\90à\96¾\82ª\8fÚ\8d×\82É\8bL\8fq\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82µ\82©\82µ\81A\82±\82Ì\95û\96@\82ð\92m\82é\82Ü\82Å\82Í Hook\90æ\82Ì\83A\83h\83\8c\83X\82ð\92¼\90Ú\8f\91\82«\8a·\82¦\82é\82Æ\82¢\82¤
+\8aë\8c¯\82È\95û\96@\82ð\82â\82Á\82Ä\82¢\82Ü\82µ\82½\81B\82Â\82Ü\82è Advanced Windows\82É\8bL\8fq\82³\82ê\82Ä\82¢\82é
+\82P\94Ô\96Ú\82Ì\95û\96@\82Å\82·\82Ë\81BNT\8cn\82ÌOS\82È\82ç\82Ù\82Ú\96â\91è\82È\82\93®\8dì\82·\82é\82Ì\82Å\82·\82ª\81A
+9x\8cn\82Í\97á\8aO\82ª\82Ç\82¤\82µ\82Ä\82à\94\90¶\82µ\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+\82Æ\82¢\82¤\82±\82Æ\82Å\81A\82±\82Ì\96{\82Ì\82Q\94Ô\96Ú\82Ì\95û\96@\82Å\88À\92è\82µ\82Ä\93®\8dì\82·\82é\82æ\82¤\82É
+\82È\82è\82Ü\82µ\82½\81B\82µ\82©\82µ\81A\82±\82Ì\96{\82Ì\82Ü\82Ü\82Å\82ÍDokoPop!\82Å\8cø\97¦\82æ\82
+\93®\8dì\82µ\82Ä\82\82ê\82È\82¢\82Ì\82Å\81A\82©\82È\82è\8f\91\82«\8a·\82¦\82Ä\82 \82è\82Ü\82·\81B
+\81i\82Æ\82¢\82¤\82±\82Æ\82Å\92\98\8dì\8c \95\\8e¦\82à\8fÈ\97ª\82µ\82½\82è\82µ\82Ä\81E\81E\81E\81j
+\8f\91\82«\8a·\82¦\82½\81A\82Æ\82¢\82¤\82æ\82è\81A\8d¡\82Ü\82Å\8e©\95ª\82ª\8f\91\82¢\82½APIHOOK\8d\\91¢\91Ì\82ð
+\95Ï\8dX\82µ\82½\81A\82Æ\82¢\82¤\82Ù\82¤\82ª\90³\82µ\82¢\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+API\83t\83b\83N\82Ì\89ð\90à\82Í\82±\82Ì\96{\82É\8f÷\82è\82Ü\82·\81B
+
+\82Å\82·\82ª\81A\82¹\82Á\82©\82\82P\94Ô\96Ú\82Ì\8aë\8c¯\82È\95û\96@\82Å\82¢\82\82Â\82©\93¾\82½\8fî\95ñ\82ª\82 \82é\82Ì\82Å\81A
+\8b\8c\83o\81[\83W\83\87\83\93\82Å\8eg\97p\82µ\82Ä\82¢\82½\83t\83b\83N\95û\96@\82Ì\8fî\95ñ\82ð\8f\91\82¢\82Ä\82¨\82«\82Ü\82·\81B
+---------- \8cÃ\82¢\98b ----------
+\82¿\82È\82Ý\82É\81ANT\82Å\82ÍUSER32.DLL,GDI32.DLL\82ÌGetProcAddress()\82Í
+application\82É\82æ\82Á\82Ä\88Ù\82È\82è\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Å\82Í\93¯\82¶\82Å\82·\81B
+\90æ\82Ù\82Ç\82à\82¿\82ç\82Á\82Æ\8f\91\82¢\82½\82æ\82¤\82É\81ANT\82Ìapplication\82Í\8cÂ\95Ê\82Ìmemory\8bó\8aÔ\82Å
+USER32.DLL,GDI32.DLL\82à\88Ù\82È\82é\8bó\8aÔ\82É\91¶\8dÝ\82µ\82Ä\82¢\82é\82©\82ç\82Å\82·\81B
+\82Æ\82±\82ë\82ª9x\82Í\8b¤\97L\82µ\82Ä\82¢\82Ä\81A\82µ\82©\82àjump\82µ\82½\82ç\82·\82®\82Ékernel mode\82É
+\93ü\82Á\82Ä\82¢\82é\82æ\82¤\82Å\82·\81B(NT\82Í\82 \82é\92ö\93xuser mode\82Å\82â\82Á\82Ä\82¢\82é\8a´\82¶\81j
+
+\82³\82ç\82É\82»\82Ì\90æ\82Í\82Ç\82¤\82È\82Á\82Ä\82¢\82é\82©\82Æ\82¢\82¤\82Æ\81E\81E\81E\82Æ\82¢\82¤\98b\82Í
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ìscope\8aO\82È\82Ì\82Å\82Ü\82½\82Ì\8b@\89ï\82É\8f÷\82é\82Æ\82µ\82Ä\81A
+\82±\82±\82Å9x\82É\91Î\82µ\82Ä\82¿\82å\82Á\82Æ\8c\99\82È\97\\8a´\82ª\82æ\82¬\82è\82Ü\82·\81B
+NT\82Ì\8fê\8d\87\81Aentry point\82ð\8f\91\82«\8a·\82¦\82Ä\82à\82»\82Ìapplication\8cÅ\97L\82Ì
+entry point\82Å\82 \82é\82½\82ß\81A\82»\82Ì\8aÔ\82Étask switching\82ª\94\90¶\82µ\82Ä\82à
+\96â\91è\82È\82¢\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81Aentry point\82ð\8f\91\82«\8a·\82¦\82½\92¼\8cã\82É
+task switching\82ª\94\90¶\82µ\82½\82ç\81A(\97\88\82Ä\97~\82µ\82\82È\82¢)\82Ù\82©\82Ìapplication\82ª
+\82»\82Ìhook\82ð\93`\82Á\82Ä\82â\82Á\82Ä\82\82é\81E\81E\81E\8dÅ\88«entry point\8f\91\82«\8a·\82¦\92\86\82É
+switching\82ª\94\90¶\82·\82é\82Æ\81E\81E\81E\82¿\82å\82Á\82Æ\95|\82¢\82Å\82·\81B
+\82Å\82à\81A\8eÀ\8dÛ\82Í\82»\82Ì\82æ\82¤\82È\83P\81[\83X\82Í\8bN\82±\82è\82É\82\82\81A\8eÀ\8dÛ\82»\82¤\82¢\82¤
+\96â\91è\82Í\94\90¶\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Å\82·\82ª\81A\88ê\89\9e\83v\83\8d\83O\83\89\83\80\82Å\82Í
+\82»\82Ì\82½\82ß\82Ì\91Î\8dô\82ð\82µ\82Ä\82 \82è\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82Ì\97\9d\8bü\82à\8f\91\82¢\82½\95û\82ª\82¢\82¢\82Ì\82Å\82·\82ª\81E\81E\81E\8fÈ\97ª\81j
+
+entry point\82Ì\8f\91\82«\8a·\82¦\82Å\82·\82ª\81ANT\82Ì\8fê\8d\87\82Í
+\92Ê\8fí\82Ìapplication\82Æ\93¯\82¶\82Å\82·\82Ì\82Å\81AWriteProcessMemory\8aÖ\90\94\82Å
+code\97Ì\88æ\82ð\8f\91\82«\8d\9e\82Ý\82ª\82Å\82«\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Í
+\8b¤\97Lmemory\82Å\82 \82è\81A\82»\82±\82Íwrite protect\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82±\82Ìprotection\82ð\89ð\8f\9c\82·\82é\82É\82Í\92Ê\8fí\82ÌWindows API\82É\82Í
+\96³\82¢\82æ\82¤\82È\82Ì\82Å\81i\82 \82Á\82½\82ç\8b³\82¦\82Ä\97~\82µ\82¢\81j\81A\82í\82´\82í\82´
+memory\82ð\8f\91\82«\8a·\82¦\82é\82¾\82¯\82Ì\82½\82ß\82ÌVxD\82ð\8dì\82è\82Ü\82µ\82½\81B
+VxD\82È\82çkernel mode\82È\82Ì\82Å\82È\82ñ\82Å\82à\82Å\82«\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82ª\90æ\82Ù\82Ç\82Ìtask switching\82Ì\98b\82Æ\97\8d\82ñ\82Å\82¢\82Ü\82·\82ª)
+
+VxD\82Ídynamic loading\82Å\8dì\82Á\82Ä\82 \82è\82Ü\82·\81B
+\82±\82ÌVxD\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82Í\81ACreateFile()\8aÖ\90\94\82Å
+VxD\82ðload\82µ\82Ä\82¢\82Ü\82·\82ª\81A\93ñ\93xCreateFile()\82Í\82Å\82«\82È\82¢\82Æ\82±\82ë\82Å\82·\81B
+\8f]\82Á\82Ä\81A\88ê\94Ô\8dÅ\8f\89\82Ì\8f\89\8aú\89»\82Ì\82Æ\82«\82¾\82¯\81ACreateFile()\82ð\8ds\82¢\81A
+\82 \82Æ\82Í\82¸\82Á\82ÆVxD\82ð\8fí\92\93\82³\82¹\82½\82Ü\82Ü\82É\82µ\82Ä\82¨\82\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88ê\89\9eAPI Hook\82Ì\98b\82Í\82±\82Ì\82\82ç\82¢\82É\82µ\82Ä\82¨\82«\82Ü\82·\81B
+API Hook\82ð\82·\82éapplication\82Í\82Ù\82©\82É\82à\82 \82è\82Ü\82·\82ª\81A
+\82»\82¤\82¢\82¤application\82Í\82±\82ê\82Æ\93¯\82¶\95û\96@\82ð\8eg\97p\82µ\82Ä\82¢\82é\82Ì\82Å\82µ\82å\82¤\82©\81H
+MSDN\82É\82àapimon(\82¾\82Á\82½\82©\82È\81H)\82Æ\82¢\82¤tool\82ª\95t\91®\82µ\82Ä\82¢\82Ü\82·\82ª\81A
+\82Ç\82¤\82È\82ñ\82Å\82µ\82å\82¤\81H
+---------- \88È\8fã\81A\8cÃ\82¢\98b ----------
+
+\98b\82Í\82¸\82Á\82Æ\91O\82É\96ß\82Á\82Ä\81ABitBlt\91Î\8dô\82Ì\98b\82Å\82·\81B
+\82±\82ÌBitBlt\82Å\95`\89æ\82·\82é\95û\96@\82ð\92²\82×\82Ä\82Ý\82é\82Æ\81Awindow\91S\91Ì\82Å\82Í\82È\82\81A
+banding\82É\82æ\82Á\82Ä\81Awindow\82ð\95¡\90\94\82Ìbitmap\82É\95ª\8a\84\82µ\82ÄBitBlt\82µ\82Ä\82¢\82é
+\82æ\82¤\82Å\82·\81B\8f]\82Á\82Ä\81ABitBlt API\82àhook\82µ\82Ä\82â\82è\81Abitmap\82Ötext\82ð
+\95`\89æ\82µ\82½\82Æ\82«\82Ì\8dÀ\95W\82Æ\81ABitBlt\82µ\82½\82Æ\82«\82Ìdestination point\82Ì
+offset\82ð\8dl\97¶\82µ\82Ätext\8dÀ\95W\82ð\8cv\8eZ\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88È\8fã\81Atext\82ðget\82Å\82«\82½\82ç\81A\8ew\92è\8dÀ\95W(sample\82Å\82Ímouse\82Ìcursor\88Ê\92u)\82É
+text\82ª\82 \82é\82©\82Ç\82¤\82©\81A\82Æ\82¢\82¤\94»\92è\82ð\8ds\82¢\82Ü\82·\81B
+hit\82µ\82½\8fê\8d\87\82Í\81A\82»\82Ìtext\91S\91Ì\82Æ\81Atext\8fã\82Ìbyte offset\82ð
+WM_COPYDATA message\82Å\8f\89\8aú\89»\82Ì\8e\9e\82É\93o\98^\82µ\82Ä\82 \82é window\82ÖSendMessage()
+\82µ\82Ü\82·\81B(WM_COPYDATA\82ÍSendMessage\82Å\82È\82¢\82Æ\82¢\82¯\82È\82¢)
+
+\82»\82µ\82Ä\81ADCHookTest.exe\82ª\82»\82Ìmessage\82ð\8eó\82¯\8eæ\82è\81ADCHookTest.exe\82ª
+text\82ð\82Ù\82©\82Ìapplication(PDIC)\82ÖDDE\82Å\93n\82µ\82Ä\82¢\82Ü\82·\81B
+
+DCHookTest.exe\82ª\82â\82Á\82Ä\82¢\82é\82±\82Æ\82Í\82»\82ê\82ª\82Ù\82Æ\82ñ\82Ç\82Å\81A
+dchook.dll\82É\82\82ç\82×\82ê\82Îê¡\82©\82É\8ay\82È\8ed\8e\96\82È\82Ì\82Å\82·\81B
+
+DLL\82Å\82Í\8fí\8e¯\82Å\82·\82ª\81Adata\82Í\8aî\96{\93I\82Éprocess\8cÅ\97L\82Ì\92l\82ð\8e\9d\82¿\82Ü\82·\81B
+\82±\82±\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82ª\81AWindowsHook\82Ìhook dll\82Í\81A
+WindowsHook\82Å\83Z\83b\83g\82µ\82½\8cã\81Aforeground application\82É
+\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\8f\89\82ß\82Äattach\82³\82ê\82Ü\82·\81B
+(\82Â\82Ü\82è\81AWindowsHook\82µ\82½\8e\9e\93_\82Å\82ÍHook\82µ\82½process\82É\82µ\82©
+attach\82³\82ê\82Ä\82¢\82È\82¢)
+\82µ\82©\82à\81Aattach\82µ\82½\82Æ\82«\82É\82Í\81A\95Ê\82Ìapplication\82Ìprocess\8bó\8aÔ\82É
+\8b\8f\82Ü\82·\82Ì\82Å\81AWM_COPYDATA\82Ì\91\97\82è\90æ\82Ì\8fî\95ñ\82ª\82Ç\82±\82É\82à\82 \82è\82Ü\82¹\82ñ\81B
+\83t\83@\83C\83\8b/registry\82É\95Û\91¶\82µ\82Ä\93Ç\82Ý\8d\9e\82Þ\81A\82È\82ñ\82Ä\82¢\82¤\95û\96@\82à\82 \82è
+\82Ü\82·\82ª\81Adchook.def\82Åshared\82É\82æ\82Á\82Ä\81Adll\8aÔ\82Å\8b¤\97L\82·\82é
+data segment\82ð\8dì\90¬\82·\82é\95û\96@\82ª\82 \82è\82Ü\82·\81B
+\82±\82±\82ÉWM_COPYDATA\91\97\82è\90æ\82Ìhandle\82ð\95Û\91¶\82µ\82Ä\82¨\82¯\82Î\81A\82±\82Ì\82æ\82¤\82È
+\96â\91è\82Í\89ð\8c\88\82Å\82«\82Ü\82·\81B
+
+\82»\82ê\82Æ\82à\82¤\88ê\82Â\82â\82Á\82Ä\82Ý\82Ä\82í\82©\82Á\82½\82Ì\82Å\82·\82ª\81A9x\82Å\82Í
+Unhook\82ð\82·\82é\82Æ\81A\82·\82®\82É\82·\82×\82Ädetach\82³\82ê\82é\82Ì\82Å\82·\82ª\81A
+NT\82Å\82Í\81A\82±\82ê\82Ü\82½foreground\82É\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\82µ\82©
+detach\82µ\82Ä\82\82ê\82Ü\82¹\82ñ\81B\82»\82±\82Å\81Adchook\82Å\82Í\8b\90§\93I\82É
+detach\82³\82¹\82é\82½\82ß\82Émessage\82ðbroadcast\82³\82¹\82Ä\82¢\82Ü\82·\81B
+\8eÀ\8dÛ\82Í\82»\82±\82Ü\82Å\82â\82é\95K\97v\90«\82Í\82È\82¢\82Ì\82Å\82·\82ª\81A\8aJ\94\8e\9e\82É
+memory\82ð\89ð\95ú\82³\82¹\82é\82½\82ß\82É\90F\82ñ\82Èapplication\82É\90Ø\82è\91Ö\82¦\82é\82Ì\82ª
+\8c\99\82¾\82Á\82½\82Ì\82Å\81E\81E\81EBroadcastMessage\88È\8aO\82É\97Ç\82¢\95û\96@\82ª\82 \82é\82Ì\82©\82È\81H
+
+\83v\83\8d\83O\83\89\83\80\89ð\90à -----------------------------------------------------------
+
+DBW()
+
+\83f\83o\83b\83O\97p\82Ì\8aÖ\90\94\82Å\82·\81B\90Ù\8dì\82Ìdbgmsg.exe\82Ö\95¶\8e\9a\97ñ\82ð\8fo\97Í\82µ\82Ü\82·\82ª\81A
+\82Ù\82©\82Ìdebug string\82ð\95â\91«\82·\82édebug string monitor\82Å\8eg\82¦\82é\82æ\82¤\82É
+DBW()\82ð\8f\91\82«\8a·\82¦\82½\82Ù\82¤\82ª\97Ç\82¢\82Å\82µ\82å\82¤\81B(OutputDebugString()\82È\82Ç)
+
+popenable.h, popdisable.h
+\82±\82ê\82ç\82Í\81u\89E\83N\83\8a\83b\83N\8c\9f\8dõ\82ð\97L\8cø\82É\82µ\82Ü\82µ\82½\81v\82Æ\82¢\82¤\83\81\83b\83Z\81[\83W\83E\83B\83\93\83h\83E\82Ì
+\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Å\82·\81B\81i\8aÛ\82Ý\82Ì\82 \82é\83E\83B\83\93\83h\83E\81j
+\82±\82Ì\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Í\81Abmp2rgn\82Æ\82¢\82¤\83c\81[\83\8b\82Åpopenable.bmp, popdisable.bmp
+\82ð\95Ï\8a·\82µ\82½\82à\82Ì\82Å\82·\81Bbmp2rgn\82Í\83t\83\8a\81[\83E\83F\83A\82Å\82·\81B
+
+\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80 -------------------------------------------------------
+
+sample program\82Æ\82µ\82Ä\81Amouse cursor\88Ê\92u\82Ìtext\82ð\92\8a\8fo\82µ\81A
+\90Ù\8eÒ\8dì\82Ì\89p\98a\8e«\8f\91\8c\9f\8dõ\83v\83\8d\83O\83\89\83\80 Personal Dictionary for Win32(PDIC)\82Ö
+DDE\82ð\8co\97R\82µ\82Ä\81A\8c\9f\8dõ\8c\8b\89Ê\82ðpopup\82³\82¹\82é \81u\82Ç\82±\83|\83b\83v\81I\81v\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82è\82Ü\82·\81B
+
+http://homepage3.nifty.com/TaN/pdic-download.html
+\82ÉDokoPop!\82Æ\82¢\82¤\96¼\91O\82Å\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B
+
+\8d¡\8cã\82Ì\89Û\91è ---------------------------------------------------------------
+
+\81E\95¡\90\94\8ds\8c\9f\8fo
+\81@\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Å\82Í\82P\8ds\95ª\82µ\82©\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ\82ª\81A
+\81@\95`\89æ\8aJ\8en\88Ê\92u\82ð\92Ç\90Õ\82·\82é\82±\82Æ\82É\82æ\82è\81A\91O\8cã\82Ì\8ds\82à\92\8a\8fo\89Â\94\\82É\82È\82é\82Æ
+\81@\8ev\82¢\82Ü\82·\81B
+
+\92\98\8dì\8c ------------------------------------------------------------------
+
+\8dÄ\94z\95z\81A\93]\8dÚ\81A\95¡\90»\81A\89ü\95Ï\81A\94Ì\94\84\93\99\82Í\82·\82×\82Ä\8e©\97R\82Å\82·\81B\88ê\90Ø\82Ì\90§\8cÀ\82ð\90Ý\82¯\82Ü\82¹\82ñ\81B
+\82½\82¾\82µ\81A\88È\89º\82Ì\82±\82Æ\82Í\82²\97¯\88Ó\82\82¾\82³\82¢\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82Á\82Ä\90¶\82¶\82é\88ê\90Ø\82Ì\91¹\8aQ\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\8aÖ\82µ\82Ä\95M\8eÒ\82Í\82¢\82©\82È\82é\8b`\96±\82à\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\8dÄ\94z\95z\82³\82ê\82½\82à\82Ì\82É\8aÖ\82µ\82Ä\82Í\88ê\90Ø\8aÖ\92m\82µ\82Ü\82¹\82ñ\81B
+
+\97\9a\97ð --------------------------------------------------------------------
+
+##>HISTORY.TXT
+
+##EOF
+
+<DKPP.TXT
+==========================================================================
+ \82Ç\82±\83|\83b\83v\81I Ver.%VERSION%
+==========================================================================
+\8fÐ\89î ---------------------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary for Win32(\88È\89ºPDIC)\82Æ
+\81@\98A\8cg\82µ\82Ä\81A\83}\83E\83X\82Ì\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+
+\93®\8dì\8am\94FOS --------------------------------------------------------------
+
+\81@Windows98/Me
+\81@WindowsNT4.0/2000/XP
+
+\96â\91è\93_ --------------------------------------------------------------------
+
+##>PROB.TXT
+
+\8f\80\94õ --------------------------------------------------------------------
+
+\81@%DKPPARC%\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC for Win32(\82Å\82«\82ê\82ÎVer.4.50\88È\8d~)\82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+ NT4.0\82Å\82Í\81APSAPI.DLL \82ª\95K\97v\82Å\82·\81B
+ http://homepage3.nifty.com/TaN/psapi.exe
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\8cã\81A\89ð\93\80\81A\83V\83X\83e\83\80\83f\83B\83\8c\83N\83g\83\8a(C:\WINNT\System32\82È\82Ç)
+ \82Ö\83R\83s\81[\82µ\82Ä\82\82¾\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------------------
+
+\81@DKPP.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+ \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+ \82Å\82«\82Ü\82¹\82ñ\81B
+
+ \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83N \82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+ \82½\82ß\81A\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+ \81i\81u\82Í\82¶\82ß\82É\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82\82é\81j
+ \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+ \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+ \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+ \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+ \91I\82ñ\82Å\82\82¾\82³\82¢\81B
+ Alt + \89E\83N\83\8a\83b\83N \82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83N \82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82¶\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦ - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93 - version\95\\8e¦
+\81@\8fI\97¹ - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ----------------------------------------------------------------------
+
+ \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+ \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+ \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82\82é\83E\83B\83\93\83h\83E\82Ì
+ \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+ \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+ DKPP.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPP.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+ \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+ \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+ \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+ PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+ \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+
+ \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+ \82µ\82Ü\82·\81B
+
+ \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+ \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+ \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82¶\82é
+ Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+ \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+ \83E\83B\83\93\83h\83E\82ð\95Â\82¶\82Ü\82·\81B
+ \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82\82¾\82³\82¢\81j
+
+ \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+ \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95¶\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+ \8d¬\8dÝ\95¶\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82\82È\82è\82Ü\82·\81B
+ \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+ \8aÜ\82Þ\95¶\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+\82»\82Ì\91¼ --------------------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://homepage3.nifty.com/TaN/prog-tips.html
+\81@\82É\82 \82è\82Ü\82·\81B(dchook-x.xx.lzh)
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC for Win32\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83C\83\93\83X\83g\81[\83\89\82É\82¿\82\82í\82³\82ñ(RXQ01346@nifty.ne.jp)\82ÌMakeSet\82ð\8eg\97p\82µ\82Ä\82¢\82Ü\82·\81B
+
+\97\9a\97ð ----------------------------------------------------------------------
+
+##>HISTORY.TXT
+
+---------------------------------------------------------------------------
+##EOF
+
+****************** \83p\83b\83P\81[\83W\8dì\90¬\97p.BAT\83t\83@\83C\83\8b *******************************
+<MK.BAT
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo ./dchook/dchook.dll\82ð\8f\80\94õ
+echo ./dchooktest/dchooktest.exe\82ð\8f\80\94õ
+echo ./vxd/hk95d.vxd\82ð\8f\80\94õ
+pause
+set TZ=JST-9
+
+copy .\dchook\dchook.dll .\DKPPHK.DLL /y
+copy .\VxD\hk95d.vxd .\HK95D.VXD /y
+copy .\dchooktest\dchooktest.exe .\DKPP.EXE /y
+
+touch -d%FDATE% -t%FTIME% -c DKPP.EXE DKPPHK.DLL HK95D.VXD README.TXT
+
+del %ARC% > nul
+
+lha32 a %ARC% /x README.TXT
+lha32 a %ARC% /x ./dchook/dchook.mak ./dchook/dchook.cpp ./dchook/dchook.h ./dchook/dchook.rc ./dchook/dchook.def
+lha32 a %ARC% /x ./dchooktest/dchooktest.bpr ./dchooktest/dchooktest.mak
+lha32 a %ARC% /x ./dchooktest/*.h ./dchooktest/*.cpp ./dchooktest/dchooktest.rc ./dchooktest/*.dfm ./dchooktest/dkpp.bmp ./dchooktest/popenable.bmp ./dchooktest/popdisable.bmp ./dchooktest/popenable.h ./dchooktest/popdisable.h ./dchooktest/icon.rc
+lha32 a %ARC% /x ./vxd/makefile ./vxd/hk95d.def ./vxd/*.h ./vxd/*.asm ./vxd/*.c
+
+%CHGINI% %IND% Exe Name %DKPPARC%
+%CHGINI% %IND% Date Year %DATE_YY%
+%CHGINI% %IND% Date Month %DATE_M%
+%CHGINI% %IND% Date Day %DATE_D%
+%CHGINI% %IND% Date Hour %TIME_H%
+%CHGINI% %IND% Date Minute %TIME_M%
+%CHGINI% %IND% Date Second %TIME_S%
+%CHGINI% %IND% Back 8 "|Doko Pop! Ver.%VERSION%"
+%CHGINI% %IND% Back 12 "|Doko Pop! Ver.%VERSION%"
+
+rem IND\82Ì\8eÀ\8ds
+k:\wbin\makeset\makeset .\%IND%
+
+rem lha32 a %DKPPARC% DKPP.TXT DKPP.EXE DKPPHK.DLL HK95D.VXD
+ren %DKPPARC% %DKPPARC%
+touch -d%FDATE% -t%FTIME% -c %DKPPARC%
+
+echo/
+echo \95Û\91¶\97p\88³\8fk\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+rem pause
+
+dir %ARC%
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPPu.TXT
+del DKPPu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+copy %ARC% %HTML%
+copy %ARC% %MYSOFT%
+del %HTML%dchook-%OLDVERSION%.lzh
+copy %DKPPARC% %HTML%
+copy %DKPPARC% %MYSOFT%
+del %HTML%DKPP%OLDVER%.EXE
+
+copy %VARFILE% vars.dat
+perl -S repvars.pl %HTML%pdic-download0.html > %HTML%pdic-download.html
+copy vars.dat %VARFILE%
+
+rem echo [del] >> %HTML%ftp.ctl
+rem echo dchook-%OLDVERSION%.lzh >> %HTML%ftp.ctl
+rem echo DKPP%OLDVER%.EXE >> %HTML%ftp.ctl
+rem echo [include] >> %HTML%ftp.ctl
+rem echo %DKPPARC% >> %HTML%ftp.ctl
+rem echo %ARC% >> %HTML%ftp.ctl
+
+
+##EOF
+
+<<@%VARFILE%,DP_
+
+\1a
\ No newline at end of file
--- /dev/null
+[Finish]
+Disp=0
+Comp=1148
+[Jump]
+Check=0
+Date=0
+Del=0
+Dir=0
+Div=0
+Exe=0
+Ext=0
+File=0
+Go=0
+Go2=0
+Menu=0
+Pack=0
+Title=0
+Upl=0
+Reg=0
+Ask=0
+News=0
+Error=0
+Back=0
+Uninstall=0
+[Setup]
+NoUninstall=0
+OnlyUninstall=0
+[Exe]
+Name=DKPU114.exe
+IconName=DKPU.EXE
+Icon=0
+#No1=#1
+#No2=#3
+[Title]
+Setup=DokoPop!/Unicode
+Company=DokoPopProject
+Soft=DKPU
+[Del]
+Auto=0
+Checked=1
+ShowError=1
+0=
+Force=1
+Reboot=1
+[Dir]
+Root=%programs%\DokoPopU
+1=
+[DirRemove]
+1=
+[File0]
+Name=D:\SRC\DCHook\DKPU.EXE
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File1]
+Name=D:\SRC\DCHook\DKPU.TXT
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File2]
+Name=D:\SRC\DCHook\DKPUHK.DLL
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File3]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File4]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File5]
+Name=
+[CopyFile]
+DefaultNo=0
+Reboot=1
+Question=0
+[Pack]
+Copy=0
+Del=0
+[Menu]
+Name=DokoPop!(Unicode)
+[Check]
+Desktop=0
+Startup=2
+Menu=2
+Ext=0
+Send=0
+[Go]
+Readmename=DKPU.TXT
+Readmeno=1
+Desktop=0
+Startup=1
+Menu=1
+Auto=0
+Agree=0
+[Go2]
+Make0=
+Erase0=
+[Menu0]
+Name=DokoPop!(Unicode)
+Path=DKPU.EXE
+Arg=
+Icon=DKPU.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Menu1]
+Name=DokoPop!(Unicode) \90à\96¾\8f\91
+Path=DKPU.TXT
+Arg=DKPU.TXT
+Icon=DKPU.TXT
+Work=
+Short=
+IconNo=0
+Show=0
+Init=1
+[Menu2]
+Name=
+[Send0]
+Name=
+[Desktop]
+Name=
+[Startup]
+Name=DokoPop!(Unicode)
+Path=DKPU.EXE
+Arg=
+Icon=DKPU.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Ext0]
+Ext=
+[Date]
+Year=2004
+Month=10
+Day=2
+Hour=1
+Minute=14
+Second=0
+Comp=1
+Exe=1
+[Upl]
+Check=IBM PC/AT\8cÝ\8a·\8b@,NT4.0,Win98
+Env=MS-Windows 98/NT4.0
+Key=DKPU,PDIC,$WIN32,#APP,#UTL
+Kind=\83t\83\8a\81[\83E\83F\83A
+Make=
+Man=TaN(SGM00353)
+Title=DokoPop!/Unicode
+Trans=\93]\8dÚ\8e©\97R
+Gal=0
+Win=0
+[Intr]
+Count=0
+[Hist]
+Count=0
+[Div]
+New=DKPPC
+Go=0
+Top=0
+Delete=0
+Num=1457664
+TopNum=1457664
+[Reg]
+Make0=
+Erase0=
+[Back]
+Do=0
+0=fill,0,0,0
+1=mode,bottom
+2=rect,0,0,%100,%80
+3=gradation,0,0,0,0,0,255
+4=mode,bottom
+5=rect,%1,%1
+6=font,0,0,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+7=height,%10
+8=|Doko Pop! Ver.1.14
+9=rect,%2,%2
+10=font,255,255,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+11=height,%10
+12=|Doko Pop! Ver.1.14
+13=/-----
+14=
+[Readme]
+0=page,install
+1=mode,fill
+2=fill,64,192,192
+3=mode,right
+4=rect,5,0
+5=font,255,255,255,-36,0,0,0,400,0,0,0,0,3,2,1,34,Arial
+6=|Welcome to
+7=font,255,255,255,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+8=|Doko Pop!
+9=rect,7,2
+10=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+11=|Welcome to
+12=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+13=|DokoPop!/Unicode
+14=font,0,0,0,-12,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82r \82o\83S\83V\83b\83N
+15=mode,bottom
+16=rect,7,70
+17=|
+18=|\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82Í
+19=|
+20=|\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92Ç\89Á\82Æ\8dí\8f\9c\81v\82©\82ç
+21=|
+22=|\81uDokoPop!\81v\82ð\91I\91ð\81\95\8eÀ\8ds\82µ\82Ä\82\82¾\82³\82¢\81D
+23=/-----
+No=24
--- /dev/null
+#!perl -S mktpl.pl dchooku.tpl
+------------------------------------------------------------------------
+ DCHOOK/Unicode Document Template
+------------------------------------------------------------------------
+%NEWMAJOR=2
+%NEWMINOR=0
+%NEWRELEASE=23
+%POST=
+%OLDMAJOR=2
+%OLDMINOR=0
+%OLDRELEASE=22
+%OLDPOST=
+
+%DATE_Y=16 \8cö\8aJ\93ú
+%DATE_M=10
+%DATE_D=06
+
+%TIME_H=02
+%TIME_M=00
+%TIME_S=00
+
+%DATE_YY=20%DATE_Y%
+%VERSION = %NEWMAJOR%.%NEWMINOR%%NEWRELEASE%%POST%
+%VER=%NEWMAJOR%%NEWMINOR%%NEWRELEASE%
+%OLDVERSION=%OLDMAJOR%.%OLDMINOR%%OLDRELEASE%%OLDPOST%
+%OLDVER=%OLDMAJOR%%OLDMINOR%%OLDRELEASE%
+%DATE=%DATE_YY%.%DATE_M%.%DATE_D%
+
+%INSTALLER=DKPU%VER%.exe
+
+%HTML=S:\Web\NIFTY\
+%SAKURA=S:\web\sakura-pdic\cgi-bin\download\files\
+
+#\88È\89º\82ÍMKU.BAT\97p
+%FDATE=%DATE_M%/%DATE_D%/%DATE_Y%
+%FTIME=%TIME_H%:%TIME_M%:%TIME_S%
+%PDNEW=%VER%
+%PDOLD=%OLDVER%
+
+%VARFILE=%HTML%pdic-unicode.var
+%IND=dchooku.ind
+%CHGINI=perl -S chgini.pl
+
+%KEY1=DOKOPOP
+%KEY2=PDIC
+%KEY3=$WIN32
+%KEY4=#APP
+%KEY5=#EDU
+
+****************** UPDATE \93à\97e **************************************
+<*UPDATE.TXT
+##EOF
+******************** DokoPop! \82Ì\95Ï\8dX\97\9a\97ð ****************************
+##<*HISTORY.TXT
+##>UPDATE.TXT
+
+>> Ver.2.00 <<
+ \81E\95¶\8e\9a\94F\8e¯\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+ \81E\83}\83E\83X\82Ì\92\86\89\9b\83{\83^\83\93\82Ö\82Ì\91Î\89\9e
+
+>> Ver.1.23 <<
+ \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+ \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+ \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+ \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+ \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+ \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+ \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+ - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+ - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+ PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+ \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82¶\82½\82ß\81j
+ * \95¶\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+ \81y\8c´\88ö\81z
+ \81@\8eæ\93¾\82µ\82½\95¶\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+ \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95¶\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95¶\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+##EOF
+****************** \8e©\8cÈ\8fÐ\89î ******************************************
+##<*PROB.TXT
+##EOF
+
+##<*INTRO.TXT
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81I \82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81I \82Í PDIC/Unicode\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC/Unicode\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC/Unicode \82Ì\93ü\8eè\90æ(\95K\90{)\81F
+ http://pdic.la.coocan.jp/
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+ http://dokopop.sourceforge.jp/
+##EOF
+
+##<DKPUu.TXT
+========================================================================
+\81y\83\ \83t \83g\96¼\81z \82Ç\82±\83|\83b\83v\81I Ver.%VERSION%
+\81y\93o \98^ \96¼\81z\81@%INSTALLER%
+\81y\83o\83C\83g \90\94\81z <FILESIZE:%INSTALLER%> Bytes
+\81y\8c\9f\8dõ \83L\81[\81z\81@1:%KEY1% 2:%KEY2% 3:%KEY3% 4:%KEY4% 5:%KEY5%
+\81y\92\98\8dì\8c \8eÒ\81z\81@\82È\82µ
+\81y\8cf \8dÚ \8eÒ\81z\81@DokoPop Project
+\81y\91Î\89\9e \8b@\8eí\81z\81@MS-Windows Vista/7/8/8.1/10
+\81y\93®\8dì \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,7/8/8.1/10
+\81y\8cf \8dÚ \93ú\81z\81@%DATE%
+\81y\8dì\90¬ \95û\96@\81z\81@%INSTALLER% \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ \8fð\8c\8f\81z \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+##>INTRO.TXT
+
+##>UPDATE.TXT
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+##>PROB.TXT
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81y%INSTALLER%\81z\82Å\82·\81B
+##EOF
+
+<DKPU.TXT
+=============================================
+ \82Ç\82±\83|\83b\83v\81I/Unicode Ver.%VERSION%
+=============================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81APersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@Windows7/8/8.1/10
+
+ \81¦Windows2000/XP\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\95¶\8e\9a\94F\8e¯\82ð\97\98\97p\82µ\82½\82¢\8fê\8d\87\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B\81i\81¨\95¶\8e\9a\94F\8e¯\82Ì\8fê\8f\8a)
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@%INSTALLER%\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.5.7.21\88È\8d~ \82ª\95K\97v\82Å\82·\81B
+ http://pdic.la.coocan.jp/
+ \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82\82¾\82³\82¢\81B
+ (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+ \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+ \82Å\82«\82Ü\82¹\82ñ\81B
+
+ \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83N \82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+ \82½\82ß\81A\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+ \81i\81u\82Í\82¶\82ß\82É\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82\82é\81j
+ \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+ \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+ \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82\82¾\82³\82¢\81B
+ DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+ \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+ \91I\82ñ\82Å\82\82¾\82³\82¢\81B
+ Alt + \89E\83N\83\8a\83b\83N \82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83N \82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82¶\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦ - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93 - version\95\\8e¦
+\81@\8fI\97¹ - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+ \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+ \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+ \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82\82é\83E\83B\83\93\83h\83E\82Ì
+ \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+ \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+ DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+ \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+ \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+ \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+ \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+ PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+ \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è\82µ\82Ü\82·\81B
+
+ \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+ \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+ \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+ \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95¶\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+ \8d¬\8dÝ\95¶\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82\82È\82è\82Ü\82·\81B
+ \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+ \8aÜ\82Þ\95¶\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+ \81¡\94F\8e¯\83\82\81[\83h\82Ì\90Ý\92è
+ \81E\95¶\8e\9a\94F\8e¯\81{\95¶\8e\9a\92\8a\8fo
+ \81E\95¶\8e\9a\94F\8e¯\82Ì\82Ý
+ \81E\95¶\8e\9a\92\8a\8fo\82Ì\82Ý
+ \92Ê\8fí\88ê\94Ô\8fã\82Ì\90Ý\92è\82ª\82¢\82¢\82Æ\8ev\82¢\82Ü\82·\82ª\81A\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\81A\83A\83v\83\8a\82ª\97\8e\82¿\82é\81A\82È\82Ç\82Ì\8fê\8d\87\82Í
+ \90Ý\92è\82ð\95Ï\8dX\82·\82é\82Æ\82¤\82Ü\82\82¢\82\82æ\82¤\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+ \81¦DokoPop! Ver.1\82Í\81u\95¶\8e\9a\92\8a\8fo\82Ì\82Ý\81v\82Æ\93¯\82¶\93®\8dì\82ð\82µ\82Ü\82·
+
+ \81¡\95¶\8e\9a\94F\8e¯\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+ MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+ \8fê\8f\8a\82Æ\82µ\82Ä\81A
+ %TEMP%\amodi
+ \82ð\8ew\92è\82µ\82Ü\82·\81B
+ \97á\81F
+ \\server\temp\amodi
+ \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+ \81¡64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é
+ 64bitWindows\82Å\82¤\82Ü\82\83q\83b\83g\82µ\82È\82¢\8fê\8d\87\82É\82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\93®\8dì\82·\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95¶\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95¶\96@\82ð\95×\8b\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://pdic.la.coocan.jp/unicode/langproc.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://pdic.la.coocan.jp/unicode/
+
+\97\9a\97ð ---------------------------------------------------------
+
+##>HISTORY.TXT
+
+--------------------------------------------------------------
+##EOF
+
+****************** \83p\83b\83P\81[\83W\8dì\90¬\97p.BAT\83t\83@\83C\83\8b *******************************
+<MKU.BAT
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo \81¡\8am\94F\8e\96\8d\80
+echo \81E./dchooktest/dchooktest.exe\82ð\8f\80\94õ(USE_UNICODE defined)
+echo \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\81F.bpr\82ÆUtil.cpp(StrVersion, VersionValue)\82Ì\97¼\95û\82ª\95K\97v
+echo \81ERelease Build?
+echo \81EVisualStudio2008\82Åbuild\82µ\82½\82©\81H for W2K
+pause
+set TZ=JST-9
+
+echo/
+echo Copy the binary to the ind directory.
+echo/
+pause
+
+make copy_bin
+
+rem touch -d%FDATE% -t%FTIME% -c ind\DKPU.EXE ind\DKPUHK.DLL
+
+rem dkpu.iss\82Ì\8dX\90V
+perl change_iss.pl ind\dkpu.iss Setup AppVerName "DokoPop! %VERSION%" > ind\dkpu.iss.new
+del ind\dkpu.iss.old
+ren ind\dkpu.iss dkpu.iss.old
+ren ind\dkpu.iss.new dkpu.iss
+
+rem Installer \82Ì\8eÀ\8ds
+make buildis
+
+echo/
+echo Press Enter key after installer made.
+echo/
+pause
+
+copy ind\Output\setup.EXE %INSTALLER%
+dir %INSTALLER%
+
+rem lha32 a %INSTALLER% DKPU.TXT DKPU.EXE DKPUHK.DLL
+ren %INSTALLER% %INSTALLER%
+rem touch -d%FDATE% -t%FTIME% -c %INSTALLER%
+
+echo/
+echo \83\\81[\83X\83t\83@\83C\83\8b\82ðzip\82µ\82Ü\82·
+echo/
+pause
+
+make zip_src
+copy src.zip src-%VERSION%.zip
+rem copy src-%VERSION%.zip zip
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPUu.TXT
+del DKPUu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+rem copy %INSTALLER% %HTML%
+rem del %HTML%DKPU%OLDVER%.EXE
+copy %INSTALLER% %SAKURA%
+del %SAKURA%DKPU%OLDVER%.EXE
+
+rem echo [del] >> %HTML%ftp.ctl
+rem echo DKPU%OLDVER%.EXE >> %HTML%ftp.ctl
+rem echo [include] >> %HTML%ftp.ctl
+rem echo %INSTALLER% >> %HTML%ftp.ctl
+
+##EOF
+
+<<@%VARFILE%,DU_
+
--- /dev/null
+@echo off
+Perl -S mktpl.pl dchook.tpl
--- /dev/null
+@echo off
+Perl -S mktpl.pl dchooku.tpl