OSDN Git Service

Add a solution file and project files for Microsoft Visual Studio 10.0.
[xkeymacs/xkeymacs.git] / xkeymacs / profile.h
1 // Profile.h: interface of the CProfile class\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #if !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)\r
6 #define AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_\r
7 \r
8 #if _MSC_VER > 1000\r
9 #pragma once\r
10 #endif // _MSC_VER > 1000\r
11 \r
12 #include <winperf.h>   // for Windows NT\r
13 #include "resource.h"\r
14 \r
15 #define PROCESS_SIZE        MAX_PATH\r
16 \r
17 //\r
18 // Function pointer types for accessing Toolhelp32 functions dynamically.\r
19 // By dynamically accessing these functions, we can do so only on Windows\r
20 // 95 and still run on Windows NT, which does not have these functions.\r
21 //\r
22 #include <tlhelp32.h>  // for Windows 95\r
23 typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);\r
24 typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);\r
25 \r
26 typedef struct _TASK_LIST {\r
27     DWORD dwProcessId;\r
28     CHAR ProcessName[PROCESS_SIZE];\r
29 } TASK_LIST, *PTASK_LIST;\r
30 \r
31 enum { MAX_TASKS = 256 };\r
32 \r
33 enum KEY_TYPE { NORMAL_KEY, PUSHED_KEY, DROPPABLE_KEY, ORIGINAL_KEY, REMAPPED_KEY, REMAPPED_PUSHED_KEY };\r
34 enum HKEY_TYPE { CURRENT_USER, LOCAL_MACHINE, MAX_HKEY_TYPE }; // USERS, CLASSES_ROOT, CURRENT_CONFIG, \r
35 \r
36 typedef struct ScanCode\r
37 {\r
38         BYTE nScanCode;\r
39         BYTE nPrefixedScanCode; // 0x00, 0xE0 or 0xE1   cf. Keyboard Scan Code Specification -- 16\r
40 } ScanCode_t;\r
41 \r
42 typedef struct ScanCodeMapping\r
43 {\r
44         ScanCode_t current;\r
45         ScanCode_t original;\r
46 } ScanCodeMapping_t;\r
47 \r
48 class CKey;\r
49 \r
50 typedef struct KeyboardLayout\r
51 {\r
52         ScanCode_t scancode;\r
53         int nBaseControlID;\r
54         int nCurrentControlID;\r
55         int nToolTipID;\r
56         CKey *pBaseKey;\r
57         CKey *pCurrentKey;\r
58 } KeyboardLayout_t;\r
59 \r
60 static KeyboardLayout_t KeyboardLayouts[] = {\r
61         {{0x01, 0x00}, IDC_ESC,                         IDC_ESC_,                       IDS_ESC},\r
62         {{0x02, 0x00}, IDC_1,                           IDC_1_,                         IDS_1},\r
63         {{0x03, 0x00}, IDC_2,                           IDC_2_,                         IDS_2},\r
64         {{0x04, 0x00}, IDC_3,                           IDC_3_,                         IDS_3},\r
65         {{0x05, 0x00}, IDC_4,                           IDC_4_,                         IDS_4},\r
66         {{0x06, 0x00}, IDC_5,                           IDC_5_,                         IDS_5},\r
67         {{0x07, 0x00}, IDC_6,                           IDC_6_,                         IDS_6},\r
68         {{0x08, 0x00}, IDC_7,                           IDC_7_,                         IDS_7},\r
69         {{0x09, 0x00}, IDC_8,                           IDC_8_,                         IDS_8},\r
70         {{0x0a, 0x00}, IDC_9,                           IDC_9_,                         IDS_9},\r
71         {{0x0b, 0x00}, IDC_0,                           IDC_0_,                         IDS_0_},\r
72         {{0x0c, 0x00}, IDC_MINUS,                       IDC_MINUS_,                     IDS_MINUS},\r
73         {{0x0d, 0x00}, IDC_EQUAL,                       IDC_EQUAL_,                     IDS_EQUAL},             // =            /// ^\r
74         {{0x0e, 0x00}, IDC_BACKSPACE,           IDC_BACKSPACE_,         IDS_BACKSPACE},\r
75         {{0x0f, 0x00}, IDC_TAB,                         IDC_TAB_,                       IDS_TAB},\r
76         {{0x10, 0x00}, IDC_Q,                           IDC_Q_,                         IDS_Q},\r
77         {{0x11, 0x00}, IDC_W,                           IDC_W_,                         IDS_W},\r
78         {{0x12, 0x00}, IDC_E,                           IDC_E_,                         IDS_E},\r
79         {{0x13, 0x00}, IDC_R,                           IDC_R_,                         IDS_R},\r
80         {{0x14, 0x00}, IDC_T,                           IDC_T_,                         IDS_T},\r
81         {{0x15, 0x00}, IDC_Y,                           IDC_Y_,                         IDS_Y},\r
82         {{0x16, 0x00}, IDC_U,                           IDC_U_,                         IDS_U},\r
83         {{0x17, 0x00}, IDC_I,                           IDC_I_,                         IDS_I},\r
84         {{0x18, 0x00}, IDC_O,                           IDC_O_,                         IDS_O},\r
85         {{0x19, 0x00}, IDC_P,                           IDC_P_,                         IDS_P},\r
86         {{0x1a, 0x00}, IDC_SQUARE_BRA,          IDC_SQUARE_BRA_,        IDS_SQUARE_BRA},        // 101/104: [, 106/109: @\r
87         {{0x1b, 0x00}, IDC_SQUARE_CKET,         IDC_SQUARE_CKET_,       IDS_SQUARE_CKET},       // 101/104: ], 106/109: [\r
88         {{0x1c, 0x00}, IDC_ENTER,                       IDC_ENTER_,                     IDS_ENTER},\r
89         {{0x1c, 0xe0}, IDC_NUMPADENTER,         IDC_NUMPADENTER_,       IDS_NUMPADENTER},\r
90         {{0x1d, 0x00}, IDC_LEFT_CTRL,           IDC_LEFT_CTRL_,         IDS_LEFT_CTRL},\r
91         {{0x1d, 0xe0}, IDC_RIGHT_CTRL,          IDC_RIGHT_CTRL_,        IDS_RIGHT_CTRL},\r
92         {{0x1d, 0xe1}, IDC_PAUSE,                       IDC_PAUSE_,                     IDS_PAUSE},\r
93         {{0x1e, 0x00}, IDC_A,                           IDC_A_,                         IDS_A},\r
94         {{0x1f, 0x00}, IDC_S,                           IDC_S_,                         IDS_S},\r
95         {{0x20, 0x00}, IDC_D,                           IDC_D_,                         IDS_D},\r
96         {{0x21, 0x00}, IDC_F,                           IDC_F_,                         IDS_F},\r
97         {{0x22, 0x00}, IDC_G,                           IDC_G_,                         IDS_G},\r
98         {{0x23, 0x00}, IDC_H,                           IDC_H_,                         IDS_H},\r
99         {{0x24, 0x00}, IDC_J,                           IDC_J_,                         IDS_J},\r
100         {{0x25, 0x00}, IDC_K,                           IDC_K_,                         IDS_K},\r
101         {{0x26, 0x00}, IDC_L,                           IDC_L_,                         IDS_L},\r
102         {{0x27, 0x00}, IDC_SEMICOLON,           IDC_SEMICOLON_,         IDS_SEMICOLON},\r
103         {{0x28, 0x00}, IDC_QUOTE,                       IDC_QUOTE_,                     IDS_QUOTE},             // 101/104: ', 106/109: :\r
104         {{0x29, 0x00}, IDC_BACK_QUOTE,          IDC_BACK_QUOTE_,        IDS_BACK_QUOTE},        // 101/104: `, 106/109: hankaku/zenkaku\r
105         {{0x2a, 0x00}, IDC_LEFT_SHIFT,          IDC_LEFT_SHIFT_,        IDS_LEFT_SHIFT},\r
106         {{0x2b, 0x00}, IDC_BACKSLASH,           IDC_BACKSLASH_,         IDS_BACKSLASH}, // 101/104: \, 106/109: ]\r
107         {{0x2c, 0x00}, IDC_Z,                           IDC_Z_,                         IDS_Z},\r
108         {{0x2d, 0x00}, IDC_X,                           IDC_X_,                         IDS_X},\r
109         {{0x2e, 0x00}, IDC_C,                           IDC_C_,                         IDS_C},\r
110         {{0x2f, 0x00}, IDC_V,                           IDC_V_,                         IDS_V},\r
111         {{0x30, 0x00}, IDC_B,                           IDC_B_,                         IDS_B},\r
112         {{0x31, 0x00}, IDC_N,                           IDC_N_,                         IDS_N},\r
113         {{0x32, 0x00}, IDC_M,                           IDC_M_,                         IDS_M},\r
114         {{0x33, 0x00}, IDC_COMMA,                       IDC_COMMA_,                     IDS_COMMA},\r
115         {{0x34, 0x00}, IDC_PERIOD,                      IDC_PERIOD_,            IDS_PERIOD},\r
116         {{0x35, 0x00}, IDC_SLASH,                       IDC_SLASH_,                     IDS_SLASH},\r
117         {{0x35, 0xe0}, IDC_DIVIDE,                      IDC_DIVIDE_,            IDS_DIVIDE},\r
118         {{0x36, 0x00}, IDC_RIGHT_SHIFT,         IDC_RIGHT_SHIFT_,       IDS_RIGHT_SHIFT},\r
119         {{0x37, 0x00}, IDC_MULTIPLY,            IDC_MULTIPLY_,          IDS_MULTIPLY},\r
120         {{0x37, 0xe0}, IDC_PRINT_SCREEN,        IDC_PRINT_SCREEN_,      IDS_PRINT_SCREEN},\r
121         {{0x38, 0x00}, IDC_LEFT_ALT,            IDC_LEFT_ALT_,          IDS_LEFT_ALT},\r
122         {{0x38, 0xe0}, IDC_RIGHT_ALT,           IDC_RIGHT_ALT_,         IDS_RIGHT_ALT},\r
123         {{0x39, 0x00}, IDC_SPACE,                       IDC_SPACE_,                     IDS_SPACE},\r
124         {{0x3a, 0x00}, IDC_CAPS_LOCK,           IDC_CAPS_LOCK_,         IDS_CAPS_LOCK},\r
125         {{0x3b, 0x00}, IDC_F1,                          IDC_F1_,                        IDS_F1},\r
126         {{0x3c, 0x00}, IDC_F2,                          IDC_F2_,                        IDS_F2},\r
127         {{0x3d, 0x00}, IDC_F3,                          IDC_F3_,                        IDS_F3},\r
128         {{0x3e, 0x00}, IDC_F4,                          IDC_F4_,                        IDS_F4},\r
129         {{0x3f, 0x00}, IDC_F5,                          IDC_F5_,                        IDS_F5},\r
130         {{0x40, 0x00}, IDC_F6,                          IDC_F6_,                        IDS_F6},\r
131         {{0x41, 0x00}, IDC_F7,                          IDC_F7_,                        IDS_F7},\r
132         {{0x42, 0x00}, IDC_F8,                          IDC_F8_,                        IDS_F8},\r
133         {{0x43, 0x00}, IDC_F9,                          IDC_F9_,                        IDS_F9},\r
134         {{0x44, 0x00}, IDC_F10,                         IDC_F10_,                       IDS_F10},\r
135         {{0x45, 0xe0}, IDC_NUM_LOCK,            IDC_NUM_LOCK_,          IDS_NUM_LOCK},\r
136         {{0x46, 0x00}, IDC_SCROLL_LOCK,         IDC_SCROLL_LOCK_,       IDS_SCROLL_LOCK},\r
137         {{0x47, 0x00}, IDC_NUMPAD7,                     IDC_NUMPAD7_,           IDS_NUMPAD7},\r
138         {{0x47, 0xe0}, IDC_HOME,                        IDC_HOME_,                      IDS_HOME},\r
139         {{0x48, 0x00}, IDC_NUMPAD8,                     IDC_NUMPAD8_,           IDS_NUMPAD8},\r
140         {{0x48, 0xe0}, IDC_UP,                          IDC_UP_,                        IDS_UP},\r
141         {{0x49, 0x00}, IDC_NUMPAD9,                     IDC_NUMPAD9_,           IDS_NUMPAD9},\r
142         {{0x49, 0xe0}, IDC_PAGE_UP,                     IDC_PAGE_UP_,           IDS_PAGE_UP},\r
143         {{0x4a, 0x00}, IDC_SUBTRACT,            IDC_SUBTRACT_,          IDS_SUBTRACT},\r
144         {{0x4b, 0x00}, IDC_NUMPAD4,                     IDC_NUMPAD4_,           IDS_NUMPAD4},\r
145         {{0x4b, 0xe0}, IDC_LEFT,                        IDC_LEFT_,                      IDS_LEFT},\r
146         {{0x4c, 0x00}, IDC_NUMPAD5,                     IDC_NUMPAD5_,           IDS_NUMPAD5},\r
147         {{0x4d, 0x00}, IDC_NUMPAD6,                     IDC_NUMPAD6_,           IDS_NUMPAD6},\r
148         {{0x4d, 0xe0}, IDC_RIGHT,                       IDC_RIGHT_,                     IDS_RIGHT},\r
149         {{0x4e, 0x00}, IDC_ADD,                         IDC_ADD_,                       IDS_ADD},\r
150         {{0x4f, 0x00}, IDC_NUMPAD1,                     IDC_NUMPAD1_,           IDS_NUMPAD1},\r
151         {{0x4f, 0xe0}, IDC_END,                         IDC_END_,                       IDS_END},\r
152         {{0x50, 0x00}, IDC_NUMPAD2,                     IDC_NUMPAD2_,           IDS_NUMPAD2},\r
153         {{0x50, 0xe0}, IDC_DOWN,                        IDC_DOWN_,                      IDS_DOWN},\r
154         {{0x51, 0x00}, IDC_NUMPAD3,                     IDC_NUMPAD3_,           IDS_NUMPAD3},\r
155         {{0x51, 0xe0}, IDC_PAGE_DOWN,           IDC_PAGE_DOWN_,         IDS_PAGE_DOWN},\r
156         {{0x52, 0x00}, IDC_NUMPAD0,                     IDC_NUMPAD0_,           IDS_NUMPAD0},\r
157         {{0x52, 0xe0}, IDC_INSERT,                      IDC_INSERT_,            IDS_INSERT},\r
158         {{0x53, 0x00}, IDC_NUMPADDELETE,        IDC_NUMPADDELETE_,      IDS_NUMPADDELETE},\r
159         {{0x53, 0xe0}, IDC_DELETE,                      IDC_DELETE_,            IDS_DELETE},\r
160         {{0x57, 0x00}, IDC_F11,                         IDC_F11_,                       IDS_F11},\r
161         {{0x58, 0x00}, IDC_F12,                         IDC_F12_,                       IDS_F12},\r
162         {{0x5b, 0xe0}, IDC_LEFT_WINDOWS,        IDC_LEFT_WINDOWS_,      IDS_LEFT_WINDOWS},\r
163         {{0x5c, 0xe0}, IDC_RIGHT_WINDOWS,       IDC_RIGHT_WINDOWS_,     IDS_RIGHT_WINDOWS},\r
164         {{0x5d, 0xe0}, IDC_APPLICATION,         IDC_APPLICATION_,       IDS_APPLICATION},\r
165         {{0x5e, 0xe0}, IDC_ACPI_POWER,          IDC_ACPI_POWER_,        IDS_ACPI_POWER},\r
166         {{0x5f, 0xe0}, IDC_ACPI_SLEEP,          IDC_ACPI_SLEEP_,        IDS_ACPI_SLEEP},\r
167         {{0x63, 0xe0}, IDC_ACPI_WAKE,           IDC_ACPI_WAKE_,         IDS_ACPI_WAKE},\r
168         {{0x70, 0x00}, IDC_KANA,                        IDC_KANA_,                      IDS_KANA},\r
169         {{0x73, 0x00}, IDC_BACKSLASH2,          IDC_BACKSLASH2_,        IDS_BACKSLASH2},        // \  ,./\ \r
170         {{0x79, 0x00}, IDC_CONVERT,                     IDC_CONVERT_,           IDS_CONVERT},\r
171         {{0x7b, 0x00}, IDC_NONCONVERT,          IDC_NONCONVERT_,        IDS_NONCONVERT},\r
172         {{0x7d, 0x00}, IDC_BACKSLASH1,          IDC_BACKSLASH1_,        IDS_BACKSLASH1},        // \  -^\ \r
173 };\r
174 \r
175 class CProfile\r
176 {\r
177 public:\r
178         static int GetKeyboardSpeed(void);\r
179         static int LostKeyWarning(HKEY_TYPE hkeyType);\r
180         static CString GetWindowText(int nApplicationID);\r
181         static void SetWindowText(int nApplicationID, CString szWindowText);\r
182         static void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);\r
183         static BOOL GetEnableCUA(int nApplicationID);\r
184         static void ImportProperties();\r
185         static void ExportProperties();\r
186         static KeyboardLayout_t* GetKeyboardLayouts(int nKey);\r
187         static int GetToolTipID(int nToolTipID);\r
188         static void SetNoCursor();\r
189         static void SetNormalCursor();\r
190         static void SetDraggingCursor();\r
191         static void SetScanCodeMap(HKEY_TYPE hkeyType, ScanCodeMapping_t ScanCodeMappeing);\r
192         static int GetCurrentControlID(ScanCode_t scancode);\r
193         static int GetBaseControlID(ScanCode_t scancode);\r
194         static BOOL GetScanCodeMap(HKEY_TYPE hkeyType, ScanCode_t original, ScanCode_t *current);\r
195         static void RestartComputer();\r
196         static BOOL IsVistaOrLater();\r
197         static BOOL IsNT();\r
198         static BOOL Is9x();\r
199         static void SaveScanCodeMap(HKEY_TYPE hkeyType);\r
200         static void LoadScanCodeMap(HKEY_TYPE hkeyType);\r
201         static BOOL Is106Keyboard();\r
202         static BOOL IsDialog(CString sz);\r
203         static BOOL GetUseDialogSetting(int nApplicationID);\r
204         static void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);\r
205         static int GetApplicationIndex(CString szApplicationName);\r
206         static void CopyData(CString szDestinationApplication, CString szSourceApplication);\r
207         static void ReadKeyBind(int *pnCommandType, int *pnKey, LPCTSTR szKeyBind);\r
208         static LPCTSTR Key2String(int nKey);\r
209         static LPCTSTR CommandType2String(int nCommandType);\r
210         static int GetCurrentApplicationID(CComboBox *cApplicationList, CString szCurrentApplication);\r
211         static int GetKillRingMax(int nApplicationID);\r
212         static void SetKillRingMax(int nApplicationID, int nKillRingMax);\r
213         static int GetCommandID(int nApplicationID, int nCommandType, int nKey);\r
214         static void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);\r
215         static void UpdateApplicationTitle(CComboBox *cApplicationList, CString szCurrentApplication, int nApplicationID, BOOL bSaveAndValidate);\r
216         static void GetApplicationTitle(CComboBox *cApplicationList, CString &rList, int nIndex = -1);\r
217         static BOOL IsDefault(CString sz);\r
218         static int GetApplicationIndex(CString szApplicationName, BOOL bSaveAndValidate, int *nSettingStyle);\r
219         static TASK_LIST m_TaskList[MAX_TASKS];\r
220         static DWORD m_dwTasks;\r
221         static void InitApplicationList(CComboBox *cApplicationList);\r
222         static int GetSavedSettingCount();\r
223         static void ClearData(CString szCurrentApplication);\r
224         static void InitDllData();\r
225         static void SaveRegistryData();\r
226         static void LoadRegistryData();\r
227         CProfile();\r
228         virtual ~CProfile();\r
229 \r
230 private:\r
231         static void SaveKeyBind(CString szApplicationName, CString szCommandName, int nCommandType, int nKey);\r
232         static BOOL DiableTokenPrivileges();\r
233         static BOOL AdjustTokenPrivileges(LPCTSTR lpName);\r
234         static void SaveCommand(CString szApplicationName, int nCommandID);\r
235         static void SaveKeyBind(CString szApplicationName, int nCommandID, int nCommandType, int nKey);\r
236         static void AddKeyBind2C_(CString szApplicationName, BYTE bVk);\r
237         static void LevelUp();\r
238         static BOOL ChangedKeyboardLayout(HKEY_TYPE hkeyType);\r
239         static BYTE PrefixedScanCodeID2Code(int nPrefixedScanCodeID);\r
240         static DWORD GetScanCodeLength(HKEY_TYPE hkeyType);\r
241         static int PrefixedScanCode2ID(BYTE nPrefixedScanCode);\r
242         static ScanCode_t m_CurrentScanCodeMap[MAX_HKEY_TYPE][4][256];\r
243         static ScanCode_t m_ScanCodeMap[MAX_HKEY_TYPE][4][256];\r
244         static int GetControlID(ScanCode_t scancode, BOOL bBase);\r
245         static void Item2AppName(CString *sz);\r
246         static int IsNotSameString(CComboBox *pApplication, CString szListItem);\r
247         static int CountSeparator(CString szMainString, CString szSeparator);\r
248         static void GetNthString(CString *szAppName, CString szWindowName, CString szSeparator, int n);\r
249         static void GetAppName(CString *szAppName, LPCTSTR pWindowName);\r
250         static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);\r
251         static BOOL IsTheString(CString sz, UINT nID);\r
252         static PPERF_DATA_BLOCK GetPerformanceData(CString szProcessName);\r
253         static BOOL GetProcessInfo(CString *szProcessName, DWORD *dwProcessId);\r
254         static LPBYTE GetCounters();\r
255         static void SetDllData();\r
256         static CXkeymacsData m_XkeymacsData[MAX_APP];\r
257         static void DeleteAllRegistryData();\r
258         static DWORD GetTaskListNT(PTASK_LIST pTask, DWORD dwNumTasks);\r
259         static DWORD GetTaskList(PTASK_LIST pTask, DWORD dwNumTasks);\r
260         static BOOL IsCommandType(int nCommandType, LPCTSTR szKeyBind);\r
261         static int KeyBind2Key(LPCTSTR szKey);\r
262         static int KeyBind2CommandType(LPCTSTR szKeyBind);\r
263         static CString WriteKeyBind(int nCommandType, int nKey);\r
264         static void UpdateRegistryData(BOOL bSaveAndValidate);\r
265 };\r
266 \r
267 typedef struct CommandTypeName\r
268 {\r
269         int nCommandType;\r
270         LPCTSTR szCommandTypeName;\r
271 } CommandTypeName_t;\r
272 \r
273 static const CommandTypeName_t CommandTypes[] = {\r
274         {NONE,                                                  _T("")},\r
275         {SHIFT,                                                 _T("Shift+")},\r
276         {CONTROL,                                               _T("Ctrl+")},\r
277         {CONTROL+SHIFT,                                 _T("Ctrl+Shift+")},\r
278         {META,                                                  _T("Meta+")},\r
279         {META+SHIFT,                                    _T("Meta+Shift+")},\r
280         {CONTROL+META,                                  _T("Ctrl+Meta+")},\r
281         {CONTROL+META+SHIFT,                    _T("Ctrl+Meta+Shift+")},\r
282         {CONTROLX+NONE,                                 _T("Ctrl+X ")},\r
283         {CONTROLX+SHIFT,                                _T("Ctrl+X Shift+")},\r
284         {CONTROLX+CONTROL,                              _T("Ctrl+X Ctrl+")},\r
285         {CONTROLX+CONTROL+SHIFT,                _T("Ctrl+X Ctrl+Shift+")},\r
286         {CONTROLX+META,                                 _T("Ctrl+X Meta+")},\r
287         {CONTROLX+META+SHIFT,                   _T("Ctrl+X Meta+Shift+")},\r
288         {CONTROLX+CONTROL+META,                 _T("Ctrl+X Ctrl+Meta+")},\r
289         {CONTROLX+CONTROL+META+SHIFT,   _T("Ctrl+X Ctrl+Meta+Shift+")},\r
290 };\r
291 \r
292 \r
293 #endif // !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)\r