---
# System prepended metadata

title: コード丸揚げ専用

---

# コード丸揚げ専用

;半角全角キーを英語オンリーにする

#Requires AutoHotkey v2.0
;;; IME.ahk NYSL <http://www.kmonos.net/nysl/>
;;; AutoHotokeyを流行らせるアップローダ <http://lukewarm.s101.xrea.com/up/> の 089.zip [Shift&Space + IME.ahk] (2008/09/21 20:18)

;;; Index of /_pub/eamat/MyScript の IME20091203.zip (IME.ahk)
;;; http://www6.atwiki.jp/eamat/pub/MyScript/

;;; IME20121110.zip (本家,A32/U32/U64 同梱)
;; http://www6.atwiki.jp/_pub/eamat/MyScript/Lib/IME20121110.zip

;; AutoHotkey_L (unicode binaries) に準拠した
;; レジストリから使用中のimeの情報を取得できるようにした
;; 推測変換(atok)や予想入力(msime)中は変換候補窓が出ていないものとして取り扱うようにした

/*****************************************************************************
  IME制御用 関数群 (IME.ahk)

    グローバル変数 : なし
    各関数の依存性 : なし(必要関数だけ切出してコピペでも使えます)

    AutoHotkey:     v 2.0
    Language:       Japanease
    Platform:       NT系
    Author:         v 1.1 eamat.      http://www6.atwiki.jp/eamat/
    				v 2.0 Ken'ichiro Ayaki 
*****************************************************************************
履歴
    2008.07.11 v1.0.47以降の 関数ライブラリスクリプト対応用にファイル名を変更
    2008.12.10 コメント修正
    2009.07.03 IME_GetConverting() 追加 
               Last Found Windowが有効にならない問題修正、他。
    2009.12.03
      ・IME 状態チェック GUIThreadInfo 利用版 入れ込み
       （IEや秀丸8βでもIME状態が取れるように）
        http://blechmusik.xrea.jp/resources/keyboard_layout/DvorakJ/inc/IME.ahk
      ・Google日本語入力β 向け調整
        入力モード 及び 変換モードは取れないっぽい
        IME_GET/SET() と IME_GetConverting()は有効

    2012.11.10 x64 & Unicode対応
      実行環境を AHK_L U64に (本家およびA32,U32版との互換性は維持したつもり)
      ・LongPtr対策：ポインタサイズをA_PtrSizeで見るようにした

                ;==================================
                ;  GUIThreadInfo 
                ;=================================
                ; 構造体 GUITreadInfo
                ;typedef struct tagGUITHREADINFO {(x86) (x64)
                ;   DWORD   cbSize;                 0    0
                ;   DWORD   flags;                  4    4   ※
                ;   HWND    hwndActive;             8    8
                ;   HWND    hwndFocus;             12    16  ※
                ;   HWND    hwndCapture;           16    24
                ;   HWND    hwndMenuOwner;         20    32
                ;   HWND    hwndMoveSize;          24    40
                ;   HWND    hwndCaret;             28    48
                ;   RECT    rcCaret;               32    56
                ;} GUITHREADINFO, *PGUITHREADINFO;

      ・WinTitleパラメータが実質無意味化していたのを修正
        対象がアクティブウィンドウの時のみ GetGUIThreadInfoを使い
        そうでないときはControlハンドルを使用
        一応バックグラウンドのIME情報も取れるように戻した
        (取得ハンドルをWindowからControlに変えたことでブラウザ以外の大半の
        アプリではバックグラウンドでも正しく値が取れるようになった。
        ※ブラウザ系でもアクティブ窓のみでの使用なら問題ないと思う、たぶん)

    2023.07.09
      実行環境を Autohotkey v2.0 とする。
      ファイル名を IMEv2.ahk に変更。
*/
;-----------------------------------------------------------
; IMEの状態の取得
;   WinTitle="A"    対象Window
;   戻り値          1:ON / 0:OFF
;-----------------------------------------------------------
IME_GET(WinTitle:="A")  {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("DWORD", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
    }
    return DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "UInt", 0x0283  ;Message : WM_IME_CONTROL
          ,  "Int", 0x0005  ;wParam  : IMC_GETOPENSTATUS
          ,  "Int", 0)      ;lParam  : 0
}

;-----------------------------------------------------------
; IMEの状態をセット
;   SetSts          1:ON / 0:OFF
;   WinTitle="A"    対象Window
;   戻り値          0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle:="A")    {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint",stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
    }
    return DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "UInt", 0x0283  ;Message : WM_IME_CONTROL
          ,  "Int", 0x006   ;wParam  : IMC_SETOPENSTATUS
          ,  "Int", SetSts) ;lParam  : 0 or 1
}


;===========================================================================
; IME 入力モード 取得 / セット
;
;    0000xxxx    かな入力
;    0001xxxx    ローマ字入力
;    xxxx0xxx    半角
;    xxxx1xxx    全角
;    xxxxx000    英数
;    xxxxx001    ひらがな
;    xxxxx011    ｶﾅ/カナ
;
;     0 (0x00  0000 0000) かな    半英数
;     3 (0x03  0000 0011)         半ｶﾅ
;     8 (0x08  0000 1000)         全英数
;     9 (0x09  0000 1001)         ひらがな
;    11 (0x0B  0000 1011)         全カタカナ
;    16 (0x10  0001 0000) ローマ字半英数
;    19 (0x13  0001 0011)         半ｶﾅ
;    24 (0x18  0001 1000)         全英数
;    25 (0x19  0001 1001)         ひらがな
;    27 (0x1B  0001 1011)         全カタカナ

;  1025 中国語？

;===========================================================================
; IME 入力モード (どの IMEでも共通っぽい)
;   DEC  HEX    BIN
;     0 (0x00  0000 0000) かな    半英数
;     3 (0x03  0000 0011)         半ｶﾅ
;     8 (0x08  0000 1000)         全英数
;     9 (0x09  0000 1001)         ひらがな
;    11 (0x0B  0000 1011)         全カタカナ
;    16 (0x10  0001 0000) ローマ字半英数
;    19 (0x13  0001 0011)         半ｶﾅ
;    24 (0x18  0001 1000)         全英数
;    25 (0x19  0001 1001)         ひらがな
;    27 (0x1B  0001 1011)         全カタカナ

;  ※ 地域と言語のオプション - [詳細] - 詳細設定
;     - 詳細なテキストサービスのサポートをプログラムのすべてに拡張する
;    が ONになってると値が取れない模様 
;    (Google日本語入力βはここをONにしないと駄目なので値が取れないっぽい)

;-------------------------------------------------------
; IME 入力モード取得
;   WinTitle="A"    対象Window
;   戻り値          入力モード
;--------------------------------------------------------
IME_GetConvMode(WinTitle:="A")   {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16	; DWORD*2+HWND*6+RECT
        stGTI := Buffer(cbSize,0)
        NumPut("UInt", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint",stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
    }
    return DllCall("SendMessage"
          , "Uint", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "Uint", 0x0283  ;Message : WM_IME_CONTROL
          ,  "Int", 0x001   ;wParam  : IMC_GETCONVERSIONMODE
          ,  "Int", 0)      ;lParam  : 0
}

;-------------------------------------------------------
; IME 入力モードセット
;   ConvMode        入力モード
;   WinTitle="A"    対象Window
;   戻り値          0:成功 / 0以外:失敗
;--------------------------------------------------------
IME_SetConvMode(ConvMode,WinTitle:="A")   {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Ptr",stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
    }
    return DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "UInt", 0x0283      ;Message : WM_IME_CONTROL
          ,  "Int", 0x002       ;wParam  : IMC_SETCONVERSIONMODE
          ,  "Int", ConvMode)   ;lParam  : CONVERSIONMODE
}



;===========================================================================
; IME 変換モード (ATOKはver.16で調査、バージョンで多少違うかも)

;   MS-IME  0:無変換 / 1:人名/地名                    / 8:一般    /16:話し言葉
;   ATOK系  0:固定   / 1:複合語              / 4:自動 / 8:連文節
;   WXG              / 1:複合語  / 2:無変換  / 4:自動 / 8:連文節
;   SKK系            / 1:ノーマル (他のモードは存在しない？)
;   Googleβ                                          / 8:ノーマル
;------------------------------------------------------------------
; IME 変換モード取得
;   WinTitle="A"    対象Window
;   戻り値 MS-IME  0:無変換 1:人名/地名               8:一般    16:話し言葉
;          ATOK系  0:固定   1:複合語           4:自動 8:連文節
;          WXG4             1:複合語  2:無変換 4:自動 8:連文節
;------------------------------------------------------------------
IME_GetSentenceMode(WinTitle:="A")   {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"UInt") : hwnd
    }
    return DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "UInt", 0x0283  ;Message : WM_IME_CONTROL
          ,  "Int", 0x003   ;wParam  : IMC_GETSENTENCEMODE
          ,  "Int", 0)      ;lParam  : 0
}


;----------------------------------------------------------------
; IME 変換モードセット
;   SentenceMode
;       MS-IME  0:無変換 1:人名/地名               8:一般    16:話し言葉
;       ATOK系  0:固定   1:複合語           4:自動 8:連文節
;       WXG              1:複合語  2:無変換 4:自動 8:連文節
;   WinTitle="A"    対象Window
;   戻り値          0:成功 / 0以外:失敗
;-----------------------------------------------------------------
IME_SetSentenceMode(SentenceMode,WinTitle:="A")  {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        ;VarSetStrCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16)
        cbSize:=4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"UInt") : hwnd
    }
    return DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
          , "UInt", 0x0283          ;Message : WM_IME_CONTROL
          ,  "Int", 0x004           ;wParam  : IMC_SETSENTENCEMODE
          ,  "Int", SentenceMode)   ;lParam  : SentenceMode
}


;;; software / AutoHotkey スレッド part8
;;; http://p2.chbox.jp/read.php?url=http%3A//pc12.2ch.net/test/read.cgi/software/1243005818/787

;;; IMEの変換状態を見る
;;; http://sites.google.com/site/agkh6mze/scripts#TOC-IME-

;;; software / AutoHotkey スレッド part9
;;; http://p2.chbox.jp/read.php?url=http%3A//pc12.2ch.net/test/read.cgi/software/1253888736/400


;---------------------------------------------------------------------------
;  IMEの種類を選ぶかもしれない関数

;==========================================================================
;  IME 文字入力の状態を返す
;  (パクリ元 : http://sites.google.com/site/agkh6mze/scripts#TOC-IME- )
;    標準対応IME : ATOK系 / MS-IME2002 2007 / WXG / SKKIME
;    その他のIMEは 入力窓/変換窓を追加指定することで対応可能
;
;       WinTitle="A"   対象Window
;       ConvCls=""     入力窓のクラス名 (正規表現表記)
;       CandCls=""     候補窓のクラス名 (正規表現表記)
;       戻り値      1 : 文字入力中 or 変換中
;                   2 : 変換候補窓が出ている
;                   0 : その他の状態
;
;   ※ MS-Office系で 入力窓のクラス名 を正しく取得するにはIMEのシームレス表示を
;      OFFにする必要がある
;      オプション-編集と日本語入力-編集中の文字列を文書に挿入モードで入力する
;      のチェックを外す
;==========================================================================
IME_GetConverting(WinTitle:="A",ConvCls:="",CandCls:="") {

    ;IME毎の 入力窓/候補窓Class一覧 ("|" 区切りで適当に足してけばOK)
    ConvCls .= (ConvCls ? "|" : "")                 ;--- 入力窓 ---
            .  "ATOK\d+CompStr"                     ; ATOK系
            .  "|imejpstcnv\d+"                     ; MS-IME系
            .  "|WXGIMEConv"                        ; WXG
            .  "|SKKIME\d+\.*\d+UCompStr"           ; SKKIME Unicode
            .  "|MSCTFIME Composition"              ; SKKIME for Windows Vista, Google日本語入力

    CandCls .= (CandCls ? "|" : "")                 ;--- 候補窓 ---
            .  "ATOK\d+Cand"                        ; ATOK系
            .  "|imejpstCandList\d+|imejpstcand\d+" ; MS-IME 2002(8.1)XP付属
            .  "|mscandui\d+\.candidate"            ; MS Office IME-200
            .  "|WXGIMECand"                        ; WXG
            .  "|SKKIME\d+\.*\d+UCand"              ; SKKIME Unicode
            
    CandGCls := "GoogleJapaneseInputCandidateWindow" ;Google日本語入力

    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr,0)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Ptr",stGTI.Ptr)
                 ? NumGet(stGTI.Ptr,8+PtrSize,"UInt") : hwnd
    }
    ret := 0
    pid := 0
    if (hwnd) {
	    pid := WinGetPID("ahk_id " . hwnd)	;WinGet, pid, PID,% "ahk_id " hwnd
    }
   	tmm := A_TitleMatchMode
   	SetTitleMatchMode "RegEx"
   	ret := WinExist("ahk_class " . CandCls . " ahk_pid " pid) ? 2
        :  WinExist("ahk_class " . CandGCls                 ) ? 2
        :  WinExist("ahk_class " . ConvCls . " ahk_pid " pid) ? 1
        :  0
    ;; 推測変換(atok)や予想入力(msime)中は候補窓が出ていないものとして取り扱う
    if (2 == ret) {
    	if (WinExist("ahk_class " . CandCls . " ahk_pid " pid))
    	{
	        ;; atok だと仮定して再度ウィンドウを検出する
			WinGetPos(&X, &Y, &Width, &Height, "ahk_class " . CandCls . " ahk_pid " pid)
		} else 
		if (WinExist("ahk_class " . CandGCls                 ))
		{
	        ;; Google IME だと仮定して再度ウィンドウを検出する
            WinGetPos(&X, &Y, &Width, &Height,"ahk_class " . CandGCls)
		}
        X1 := X
        Y1 := Y
        X2 := X + Width
        Y2 := Y + Height

        CoordMode "Pixel", "Screen"
        ;; ATOK については 推測変換中か否かを確実に検出できる
        ;; MS-IME は変換候補窓の表示中のみを検出できる
        ;; Google IME も変換候補窓の表示中のみを検出できる
        ;; そこで変換候補窓が表示されていないと仮定して処理を進めてみる
        ret := 1
        not_auto_cand_list := [0xFFE1C4  ; ATOK
                             , 0xF6E8CB  ; MS-IME
                             , 0xFFEAD1] ; Google IME
        for index, ColorID in not_auto_cand_list {
            elevel := PixelSearch(&OutputVarX, &OutputVarY, X1, Y1, X2, Y2, ColorID)
            ;;  the color was not found
            if (0 == elevel) {
            	ret := 2
            	break
            }
        }
        CoordMode "Pixel", "Window"
    }
	SetTitleMatchMode tmm
    return ret
}
;-----------------------------------------------------------
; 使用中のキーボード配列の取得
;-----------------------------------------------------------
Get_Keyboard_Layout(WinTitle:="A")  {
    hwnd := WinExist(WinTitle)
    if  (WinActive(WinTitle))   {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        cbSize := 4+4+(PtrSize*6)+16
        stGTI := Buffer(cbSize,0)
        NumPut("Uint", cbSize, stGTI.Ptr)   ;   DWORD   cbSize;
        hwnd := DllCall("GetGUIThreadInfo", "UInt",0, "Ptr",stGTI)
                 ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
    }

    ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hwnd, "UInt", 0 )
    InputLocaleID := DllCall("GetKeyboardLayout", "UInt", ThreadID)
    return InputLocaleID
}

Get_languege_id(hKL) {
    return Format("0x{:X}", mod(hKL, 0x10000))
}


Get_primary_language_identifier(local_identifier){
    return Format("0x{:X}", mod(local_identifier, 0x100))
}

Get_sublanguage_identifier(local_identifier){
    return Format("0x{:X}", Floor(local_identifier / 0x100))
}



Get_languege_name() {
    locale_id := Get_languege_id(Get_Keyboard_Layout())
    ;; ロケール ID (LCID) の一覧
    ;; http://msdn.microsoft.com/ja-jp/library/ie/cc392381.aspx
    
    ;; Language Identifier Constants and Strings
    ;; http://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx
    
    ;; [AHK 1.1.02.00 U32] Error: Expression too long
    ;; http://www.autohotkey.com/forum/topic75335.html

    return    (locale_id = "0x436") ? "af"
            ;; : (locale_id = "0x041C") ? "sq"
            ;; : (locale_id = "0x3801") ? "ar-ae"
            ;; : (locale_id = "0x3C01") ? "ar-bh"
            ;; : (locale_id = "0x1401") ? "ar-dz"
            ;; : (locale_id = "0x0C01") ? "ar-eg"
            ;; : (locale_id = "0x0801") ? "ar-iq"
            ;; : (locale_id = "0x2C01") ? "ar-jo"
            ;; : (locale_id = "0x3401") ? "ar-kw"
            ;; : (locale_id = "0x3001") ? "ar-lb"
            ;; : (locale_id = "0x1001") ? "ar-ly"
            ;; : (locale_id = "0x1801") ? "ar-ma"
            ;; : (locale_id = "0x2001") ? "ar-om"
            ;; : (locale_id = "0x4001") ? "ar-qa"
            ;; : (locale_id = "0x0401") ? "ar-sa"
            ;; : (locale_id = "0x2801") ? "ar-sy"
            ;; : (locale_id = "0x1C01") ? "ar-tn"
            ;; : (locale_id = "0x2401") ? "ar-ye"
            ;; : (locale_id = "0x042D") ? "eu"
            ;; : (locale_id = "0x0423") ? "be"
            ;; : (locale_id = "0x0402") ? "bg"
            ;; : (locale_id = "0x0403") ? "ca"
            : (locale_id = "0x804") ? "zh-cn"
            : (locale_id = "0xC04") ? "zh-hk"
            : (locale_id = "0x1004") ? "zh-sg"
            : (locale_id = "0x404") ? "zh-tw"
            ;; : (locale_id = "0x041A") ? "hr"
            ;; : (locale_id = "0x0405") ? "cs"
            ;; : (locale_id = "0x0406") ? "da"
            ;; : (locale_id = "0x0413") ? "nl"
            ;; : (locale_id = "0x0813") ? "nl-be"
            ;; : (locale_id = "0x0C09") ? "en-au"
            ;; : (locale_id = "0x2809") ? "en-bz"
            ;; : (locale_id = "0x1009") ? "en-ca"
            ;; : (locale_id = "0x1809") ? "en-ie"
            ;; : (locale_id = "0x2009") ? "en-jm"
            ;; : (locale_id = "0x1409") ? "en-nz"
            ;; : (locale_id = "0x1C09") ? "en-za"
            ;; : (locale_id = "0x2C09") ? "en-tt"
            ;; : (locale_id = "0x0809") ? "en-gb"
            ;; : (locale_id = "0x0409") ? "en-us"
            ;; : (locale_id = "0x0425") ? "et"
            ;; : (locale_id = "0x0429") ? "fa"
            ;; : (locale_id = "0x040B") ? "fi"
            ;; : (locale_id = "0x0438") ? "fo"
            ;; : (locale_id = "0x040C") ? "fr"
            ;; : (locale_id = "0x080C") ? "fr-be"
            ;; : (locale_id = "0x0C0C") ? "fr-ca"
            ;; : (locale_id = "0x140C") ? "fr-lu"
            ;; : (locale_id = "0x100C") ? "fr-ch"
            ;; : (locale_id = "0x043C") ? "gd"
            ;; : (locale_id = "0x0407") ? "de"
            ;; : (locale_id = "0x0C07") ? "de-at"
            ;; : (locale_id = "0x1407") ? "de-li"
            ;; : (locale_id = "0x1007") ? "de-lu"
            ;; : (locale_id = "0x0807") ? "de-ch"
            ;; : (locale_id = "0x0408") ? "el"
            ;; : (locale_id = "0x040D") ? "he"
            ;; : (locale_id = "0x0439") ? "hi"
            ;; : (locale_id = "0x040E") ? "hu"
            ;; : (locale_id = "0x040F") ? "is"
            ;; : (locale_id = "0x0421") ? "in"
            ;; : (locale_id = "0x0410") ? "it"
            ;; : (locale_id = "0x0810") ? "it-ch"
            : (locale_id = "0x411") ? "ja"
            ;; : (locale_id = "0x0412") ? "ko"
            ;; : (locale_id = "0x0426") ? "lv"
            ;; : (locale_id = "0x0427") ? "lt"
            ;; : (locale_id = "0x042F") ? "mk"
            ;; : (locale_id = "0x043E") ? "ms"
            ;; : (locale_id = "0x043A") ? "mt"
            ;; : (locale_id = "0x0414") ? "no"
            ;; : (locale_id = "0x0415") ? "pl"
            ;; : (locale_id = "0x0816") ? "pt"
            ;; : (locale_id = "0x0416") ? "pt-br"
            ;; : (locale_id = "0x0417") ? "rm"
            ;; : (locale_id = "0x0418") ? "ro"
            ;; : (locale_id = "0x0818") ? "ro-mo"
            ;; : (locale_id = "0x0419") ? "ru"
            ;; : (locale_id = "0x0819") ? "ru-mo"
            ;; : (locale_id = "0x0C1A") ? "sr"
            ;; : (locale_id = "0x0432") ? "tn"
            ;; : (locale_id = "0x0424") ? "sl"
            ;; : (locale_id = "0x041B") ? "sk"
            ;; : (locale_id = "0x042E") ? "sb"
            ;; : (locale_id = "0x040A") ? "es"
            ;; : (locale_id = "0x2C0A") ? "es-ar"
            ;; : (locale_id = "0x400A") ? "es-bo"
            ;; : (locale_id = "0x340A") ? "es-cl"
            ;; : (locale_id = "0x240A") ? "es-co"
            ;; : (locale_id = "0x140A") ? "es-cr"
            ;; : (locale_id = "0x1C0A") ? "es-do"
            ;; : (locale_id = "0x300A") ? "es-ec"
            ;; : (locale_id = "0x100A") ? "es-gt"
            ;; : (locale_id = "0x480A") ? "es-hn"
            ;; : (locale_id = "0x080A") ? "es-mx"
            ;; : (locale_id = "0x4C0A") ? "es-ni"
            ;; : (locale_id = "0x180A") ? "es-pa"
            ;; : (locale_id = "0x280A") ? "es-pe"
            ;; : (locale_id = "0x500A") ? "es-pr"
            ;; : (locale_id = "0x3C0A") ? "es-py"
            ;; : (locale_id = "0x440A") ? "es-sv"
            ;; : (locale_id = "0x380A") ? "es-uy"
            ;; : (locale_id = "0x200A") ? "es-ve"
            ;; : (locale_id = "0x0430") ? "sx"
            ;; : (locale_id = "0x041D") ? "sv"
            ;; : (locale_id = "0x081D") ? "sv-fi"
            ;; : (locale_id = "0x041E") ? "th"
            ;; : (locale_id = "0x041F") ? "tr"
            ;; : (locale_id = "0x0431") ? "ts"
            ;; : (locale_id = "0x0422") ? "uk"
            ;; : (locale_id = "0x0420") ? "ur"
            ;; : (locale_id = "0x042A") ? "vi"
            ;; : (locale_id = "0x0434") ? "xh"
            ;; : (locale_id = "0x043D") ? "ji"
            ;; : (locale_id = "0x0435") ? "zu"
            : (locale_id = "-0xF3FC") ? "zh-yue" ; http://cpime.hk/ 広東語ピンインIME
            : "unknown"
}


Get_ime_file(){
    ;; ImmGetIMEFileName 関数
    ;; http://msdn.microsoft.com/ja-jp/library/cc448001.aspx
    SubKey := Get_reg_Keyboard_Layouts()
    ime_file_name := RegRead("HKEY_LOCAL_MACHINE" . SubKey, "Ime File")
    return ime_file_name
}

Get_Layout_Text(){
    SubKey := Get_reg_Keyboard_Layouts()
    layout_text := RegRead("HKEY_LOCAL_MACHINE" . SubKey, "Layout Text")
    return layout_text
}

Get_reg_Keyboard_Layouts(){
    hKL := RegExReplace(Get_Keyboard_Layout(), "0x", "")
    return "System\CurrentControlSet\control\keyboard layouts\" . hKL ;"
}

;	IME 状態のセット
sc029::IME_SET(0)

N3q8ryccAAQNW9wcwBkAAAAAAAB6AAAAAAAAAAhiNMrinBY+vAONxfp46NrT55jMMhItzr1k5fJH
OvNljxzaj+riy9gsCHwU/V7Zdk1CexEVgnhyTgFcbUGuCRjnQVphGl2IaZqMaE2CTQx2G/B/gLtn
QNH0FjZmS29lZ9MLn66O8FsO8ytK7Zrt1Eu80j4uCzDuH7AX6dN0c8BBjQztX9lU1wG4CTWsj5L0
aXqwzAmqZlycG12iOu+Md/QrJS4LQfoWkRMpIpICAxDTHS0TCLJHbGYfyDnxZY8DPPeMS+Ce2Qj5
QoyIGKiUmK85vjfDrQRT0XIVa4lITYhpoLjQ1wTTivfEC5J6+vgTN79wsVztLP2zc2jCOYGEC/J+
zfHq/aXLuN2lIi9lIz+jbApWOX9fFGlOuYxPsL++MTZ547xOpqKF2tKhnf0NB7T+PyS7cLNkJkfP
hipGUH0Y3lBDiXoEylTXQ7jUBkQGA03MC46rasfUZTqCaTEEktwbEisGVqMo0Bvn4981cEeAGPBk
Bf91CYwteV3hI7AbMq47PVX/w18oqNumWfyh32U6DMASkMmYYhXqvBGagQO+VkM/BssZEUavMP5x
yJNo8Xm4h8HeehJIzGiIdh5tgqP/mMXmazrgbUFXMrNjMkIUPvqgRj3UWSEuIsJvLDBNRyZjZk5U
BTSTZgnNkHBp93oqc0UqCT3EkoRxy0uPjN+KSe2VDRny+oGHTOO3AeB6Fp3vJ9iTSRJ8VksvdMe4
b1Fvd/z+c/qzR7wRoD09jqTmhcQFkECh4Lq3IwgzFlqQyPeCUNEbylXi924Zfb/HBslyWP/dd29e
BFgEMYc5dvcafhVOHnA/62qx7rMA3Klwslpl3rui4/rehhtWHlp8f6gzaEUXrdZGsrrDYsq9jRcO
kHm1uqR/FRHinXY2VcRuHG/kPYFcoxV3HMd7HWzPtHcqaQacE+sh9JpT2vHpcTaMhQDGwOcskGbs
SmOhGednf21GudaSazWhmUeJCau4SYUEz5vrczTnW/K1qkjspUzEjTbUnpPVVqI/sW8QNGB/KUpx
1thTXy8kFBpzMQzYYGST6GPcmf1hTN2eeIDAJlYQHhT+NOZWAsTV2eSt8+NzXQG3Lm82Bj7EIdWT
dWBKZqr2U5Incif18g8Yy4wKhdwZNL+qxOHjoi76dtxpmkEb0w2SBZuS23zDwTuyNkjdR9UUhiI5
DJRy3eGCZs1Rvrv02Feriw/X6JCDx2kcoElle4UHjHH5NnNKMrY39Ah3910oVHOn/aUyVFelD6ut
LnzVwsoJK05VXYuCNs6OFK3xDmU6/5SNnG1PER5blmw/hSsJcNa7Dadj5G+UUQq2VUmpi2K+JGrB
XHRcflo4cSfQDUi8Lgb7LWcYonBbcd7tt8GhxtvisLwAiTat2Lh8pZ5sHe803xpnY2OgJs/oREEf
XX6WkMJWdG1c/a3iYOtuQDHpbMgPjfnM5MM4Bff4A7vi8Yg3py9jbv39fUC88iJ0JmhI9petGw7f
skSOkZd65divDuqbLsha1wup4nxgT32qs3VTuxzeJHycmb3UYwQmGaUDQPTts9ZLaLIVx1hrlTKq
ro79jceifOnHVgad1a2Uiq6M0oQNryrKu1PNhD+9m/sPJhtCvVOp59zTUUBONXujnbTNJWE09yvI
F7Yq2gFefLHBnrreCBM+JXrQGuOj5bsnd/0x7gwE7kNFM1sBCw/Q8tDHpsEjKWwHWLE5kChZUuAI
guBC0sDKkikNQ38w1nFdRx9t6dp1uYNcPPPf409WpzFgUrKtuxCxEB2FQ/PVnmgq92WAvOt0Ad62
DzTCoA95OTfrUtNScNL67h0FKKHG8JXyFGgWIIigaGuv05bJgdzaegXnaOUAGxOHtgM/QUuY3ss8
vHfA0Mn3aF4sM6xt28dsde3OW2/ULHIcB5nYusFnRC14A+m8Q5FCYHbfIwoCxXunZt3spTbsBc3x
nSfHtMqpCz5BYIokCcTpJvIb0kzhUwebBTHXSEs3w8LGJwWgRJbO7Y+TmPsUrlLgvUiWqN0TCXj2
+e4KIhmhtowttUAGzntkYc4G/6fLif3pEupBFlVqBsr2CR8cLL+o4ejq5CrJnO0Ozfz8IlHsslXc
lHfxQsdXf36F1tRtqSwTUWJPtQfYpXcLLRxIaaqurd/C/uVQ9gOQ1STnuqwRn7MAOGVJLWEFDMDx
2WLLhpEvr+cLYCzNNA6yWV1oO693iNKSlun3Lc4Ql6XqYyc6q/cqEZHCTn6IRGaen+/ykwIosspk
wA6O4C5KO0FbYGE6xg4GGbWorAA8PRJJDvccPxhGORrCswscwL0sphEmWQ6eDplccruVS3UIjJLs
4EHD8B1r4tp7mLUqYtn2VgTndHrM9W/H1+1ZrF2L1xdNsZFqHwrAj4E4pXKlNZCT0RxnzGm0KEqa
BhcYPD5C7B7vulkNZSa/jd8hhaFgPOohkhaVbk6Y/gaP9Mx1npStMzI2EyLuV61aK038v8GEyEQn
LfAPBdlsmVv0UN4R4MfvJgsXQZew/rStDYw3y+w0yopX8naYtRGf+81yxJan40gvA4Gn5bh+mbm1
DICtCHf18xTkgVMiDPFRXPbG4VPv82AjRrWbk6pPSXXcngs6yPwmdhr0JNo8UHdCVWm1vqPtOxEQ
UFpo5oZLKEY999wTl7bcKPwRpc776iLFXTBg2m0hVG2q35ekiAXw7Oz+NuGyD+nZdCyL6/XMVsL4
sExSxq5DfImM/kV9248L2UtTZw6iahXW3qOO3B0uuexc2HjMJ75msDaqEVJcCZ2xUi8tbRCJPM+3
BohRptkbvRN+XyGJ/Rx7dhyLw2f264vGvjqialVMePAEyFcxQ4WC3nSi5x8RCBnlogOI+4yPAiTK
9lec1dzK4O7DCif4zY0lMaejb+YEzoLKE2BWeaFaJW1PwWj1BfWx0uPBK+wemPL3d3UKKXQW1Zfm
/QYvVlTdfzxLVNwP5x+Tc+bLzjLUgwjZkp6wYonWZmx+5FiQ+nM76RbBz8Ep8ye23/L0bLIKjhq6
M/MKB93ea0rb88csHXLqqjuItJXzmUvYUUbY691dQoVPG1fXoHGQxAqQn9+Aq9Iz8t7h/YBw7WQk
2BgFTj4JmDCJXa7v3l3lwoTtw6eXWiEOIBOSJ6kedYI+vd4vJ9If4kRXOYgOZ1bo3/J1JW3KEb8I
y2wKJrq1VJp0FTObGbn282Wqa+g3mwMUrFCymRRn0fp8p5eHnRZWnYjW06iTBCZaWGiaYvjnarRA
qXhT9cxlhxSXh8rG61L6DRWMEN8JlxsYoGn0+IxccJaLOaWQq+ex0mCgimMcblwnLTQsdk5Gd1fc
Tgp33pcQpHA2INrBBt91WY1j9jRgrqaj7mq3ObbV7aLo3ndoRex+8MpQtnmm8izMFDZ0TlSRqoVE
PgkA3fVt7XmUKvivQa1F9BIuOXOEeZnYzR/sE+xFQFecaw04ODZO//epRFDi9tdwKLvhc9Iaw6hL
MkS/ugVKdqBh1II4nU3J3npynq0e3DlhdMOvHTfSXXJczPJmoj9f9gIjhERYeqLX+wc5g3mRaAY5
R+6aaSc7C7ya4R3FlS37GvkiLTKgId7FcbG50iljUo0rjTaBEW4UsVm3BrwmWgnELOw2D8be/W4v
E4WlYeKwj6ORoz531zwX8U6PAd5lBi71+10akCLWlxQ0Eb0LbZHOoCgA0XybVXTAfnE6nZPquNy1
mxBLc6h65u2GJk9c75dLCnN1kKeeyDsy4oNEl9HB6JGCubi7GbRgTLxrtj/8fJlVQ+DH7ll4guC3
ifGrdfYSGKPB+KS+NsnWp+fLmIhqItb1uo7uAvOTlroXmGqca+MvSv6KwYD9gj6zTX5h7RF65XEz
3ZmWkBxoFPB5cJUKKYAL0xp5Ea/jSurrwNrgYVF6L+E2xVC+R8KAD4FH7YHVMhmMP0rwhr9DVNup
GqfFNuIgzPOKe0eSXXJ7x9fgSsyhR1YH5oncmWYYqSlj5C2yJSVDN8YGM85b3/HSqYsS+wVU35y5
XVtFdyV01RvM5EktqWB8RQ66uoWpBzH9/qmKnhnuAt2xip4Ao8VhoOhFLUuS6rAdemTMgQrtjnCI
OnhbvzQkxmgc7FHsIe3/IayBGLQPLcK6rBexvttqJLzMGXK5rYj5ksQAlEcE37bgyOYqf9KHfAgl
8HMnhGRV+1KKWx2PCmWhMpX44SkNZ3+gI4HALbz3j4PuD/MOoCP3ToDz9089EtCpJoWbwlDwnfM/
57cQYoGpIALG21pgqFYXna+T7fneMF7/wDbf4H3xQyUwo6pcM6b0+5Kp3N8V6rUxXwntypz7J4oe
oDshhudxv3L+jQET0q04Hv/rO4OoQo00MX4q5D15vBEMMtiZbt+fWTGMvTS/1NzzPQWSn3/rmzTf
aotjQOmRC84AcVzFdEmRUN2H34gpls9MfKLS/O3CHgmgK8AJD9+PMyvbbzpzMcG2yLPusrSk4BMr
GHgVkyIgqHe5/6ryAJT623q31UMJWVysurn4R6VJXhmzpf6IRx4X9OA5ioInKATftUgvQyjEit/e
VXbE29qZqL7+Fb/lkxMk400ONg2frBdXCUmj10FefHNnTS3zAmjKTrYc9MFy3BMf0WAYvR/82zHo
ltxaX2ROmajaRk+8qY8K2ysGFSxn6IU/YhyEaJ3y5e3+beGRZx0d9E8njN2yV4lUlRZfIAlcnTIP
jgvJcvGpKtimunMMSPuJTYwUVGoeerM35Eg1abJInA71Q93TmJe6ttTsr4r0UwWuZlCnlaMx/87T
EcRK49wwxMn9P49u4zwTjqUGfVKeK8vkf7WXHUVlp67xLYL9bRcJD+8qqXypMuDfNnmWU2ms3bN/
hjO+Z6EL5UNNIuGfLGflQ0W7B0dGNfV69nK/a+mdNP5/moQCQ4G5Nj0/KJT5yZmwLi41C5dlZ8Hy
16k9TqNdekVihm/z99CVvY+QF+G1hUSgZCoZyxGA1btbv0oiKW/kCFnxmBeqnGWHN5yXvzurd0QU
1OO6H/gp1rZP2swtsdMZMjr3k4JQa+vLnKXBUITYm8jFtGhZSD/FNzfNqcIWQYWGzvwM/ery0Iis
3Aj9JfBxWFMI2LT++qDOgFhkoM1/U51l2kFZKjt7jP3wPXhA0+SjYtFc3siBJu55QoaJT4ubGZMI
Ab1EivvHhM5DBZXvTtii3nlkYXJX7I+IpPj5lt7PKUqDutFIfgDeF2Mt/5/1FO5IDnHCUz4y0g9r
7UQEbzjfppndjz65P43bEz7oZVtgPcON1TjRKFYb3xk3rp5dCWXvatVoUlZGrbKtYb17cXd4jrND
h5CBdIN2F6a0cqa1qITF3fL9AqVpboNJXotL4GqgWMsmCXU36dsLsgJ+IrKvMsUJEXcGCUygzDAc
hf7Qr8okUaWPcXLlRB+CclRpV+rWzmFAhABXRwupKu761UH9qFT7hvbUDNOfzAifV0eTD3Ko/sNa
IRaOIFKZNuAANU2dkIPSPKvyHSQ5N451E6TvxUX9bb0Ljs8rHMI9on91tBOCfDOsYyuMgcKnssZa
Y+7eHfX6kLO/NZJYH30nI4sxFRRexXIvNye3kdKWQ7RdE1bTJZhP4QQaweKlb/pF2+m0X5PfI/MU
EZVUQAxFZZ71I0mh3iZStbZdgRkTvZgCDKBEeuK1bq5MDbFx6/DPxvaQiXPuGfYXL8EXr3wd5AHY
SNadHgY4SBBPV8kDvgdWuPQdb4kn8SsrynTcp2Mmd0i5VNQyaI0MpmQFwN+k2+U2DzGuXZ6rXoha
qthc5nh9sLSFWm5ExmdoOwFj2FQnpU1cpVi3fM41UxLwLtT5KvwxZQS/0AEX8AxDrD79/2V0ybQA
tzEWCeCC9YAiOyMKbyETeFKMq8E8S09MlzrhGtMwp9YXuJAxNYp476zMRPhpptpXU5lt6QCoTBE8
bQBk9en0QrPELqv4hRX3lWFOkyhUWdltubrWn4bb2ZSuDRn4AUJzm6XoUJ2TiHsi+IfUp4P8HZ+D
7YjI0xzfbRpY5kr3jhly93UlvzX3vX8n/fN/oPqugWV6s0T2+xlc5V0a7XEEV+uTMoCxwghPA9kb
d5P4dyFHBS2md0XYsuPf3XooHvOAy39z8YcMkX/FizLDb/Fij6UqqulUgoYsa5k//PeK8ly6x7xa
Phy+Nh35urTZLpVOCp9MMZh4xftCQimwlJtQZYcmvuMWepQEYibMdzDTavQqPnMBimZLH63K8IW5
8iZswf9mmb4C+HB6L6/D/c7G4KfRYQrJ1lHXPtwejonn+nA+N4qBCU+RRWp/Zbpx6ujugxXSn1d0
B8Ey04W2HpX9pDL3qJb7nXAea6frun+7q9Ubjgq6RdY3W/2oRRtRbxjsXjHsAClZloiWX0iepbC3
Kuy7yAo7OmpxQP17y0Kj/GMeeJEe2ZP6OnvM4N3Ajk7h+wknzMwFlUbvPT9Tm36QkBWirbJJm4E6
TkU5TRAUQEdzVFB1UwK8Cz3wnQ2oqdgo/4VgFm+Al95crEkFPejBK+5aXPpSi2dvbs0yrp5zwMUK
IOF28G2f1Q1UM6EBjwZxopLyEW17bIZzhQmPRSvAjgzFVedUTuXgfJwS72G1pQX4d1wxcGzS6fUC
mPm6eYcsmpaxKseRW5/JWtGq2eeLiNVSMr2LNKAAUPdO8weJiOYx5oMTpkYHxmjIM6Js+lnfY6NO
PENyjqMJUmQ7t0GeQ9Z+YN079XQnVW/M7+v84+cHOP+q3xdF2IB0XMiJXw5+ZiviWqH+JFvlRi0+
ZGWR4k8pnam4bDkD3h0TB3U4QyYEAbLdv+IUAQ8997jXwLYnGtOJ4Pz35gUNZTIdulpHBFtjBGYC
gMUK8pnHjdhe7mhPp/xfyOTWtg787FGEJ0ns2xgRVjAtZ354KCG6TPaB5VqXPaEuTWasIh1oQUIO
3Cl+zMifSnuRSoEMIjaVdKQPQAeXjWfNnPMfN067dhlgKfTLYqcBMnbFLFdiBDYg9a4UdTQYShR0
Ij0pHYNgagJSxBgJEflCgadN8h7SfAeg0sRwfBaG8b/Wc16qs9pBG8RVxb0cXP3ZMHagJeWM0M8x
Unr7l9W8lC7TBCOat1fzGyqi26C1pAibcslffwVgh/SKElNpru6TF8sd3FVjFpd8BMutR1P2RtLF
U8LYK1o4kYMSmWS59m6z1Etz9bgCYaotNFA6GviYmRj2PWmCybYh6IdmgvJGNk2rgvysSg+Y3M52
jBkpKhjJaCHqBt41igGg+iOPlmHrcfTp450LaxYpqccLw7p1Daj8AI9A5S+7+ksSYWlafWj0thHA
igyGXAHQDIRWtXuFd91a1C6IIbG28jvTeyYeA6trBJpyKtkVaACDE3cFIytSUiWaRwvv6hdul7La
unOlM0SlN012MNeG/bAB5ZjqCAt0tBLW/YFNxc+Wgd/y3+Q2Mtgk+XKQfgtWRLjWvjVjbkvONpZb
BBTZvOrYXn8rz4pgs34SaNrmlzfcwxirxTL9SkeQC9kIgEACX3Bs9Y+ipLbu8/91VrdUpn0C6oq3
Z3SorZb2fs5IHfGGarFritLY3zy7gU5hxr91dUT7zBtojl+wJ6WGzveeTT+WhemsKo+Gv1mqI1zA
Wuz51SS/lcgKOTiQHM4QNdWve1d6P6cLjfhEW6fTWw1Nj/cv5EKVqM2Uaeo8JIhWQtLQsoJucw8Q
cEfEohPtyi6+qSjbKvDdaobkos7nYfOSVheGGZhkp8LHNrE7DoSeFeQwnUnjWETwQrrZwfAiLtPG
uVYfaLB7szRDhp4BDMusDb1zj5PWQdPIb4AHRUbWE1KDLVtO4fg+fnNQS6qVdE4SBGXFsoNG3ctr
XuytYuOHzHcoeKbNm+rJKRpfkRBCePOvlJxKSP66ANmwx3fGmBmDJhlldAZdQa06+j9iJxTl5OJt
gCrPHn8VpijHQl55MTz+iaboVuNb4+ZlnT3ucdPRUHkMFqMfs+XTIsEpX5xcIpDGnGmHrjPY1P49
aKmxE/bVPZpsOfoM1xqJjs5EWTxWaHPC0UEeR99O2S3nKipC1imkmzPATqr1SbLZXt8BCuNjf2e4
jb9EDrZ/uKa9hrpc1zeCE91qMbkqvGAuFfVFmIm9aLnkot1DJHyUT2hPg+cglBUn7wkIGZtS5E3V
7sbnZj9w/w5LavrxIHhvR/9qdh3qrMAU0nV5JckMae+f3mqLBGIr/I/6OOjrejcf6DdD7lpQ0KKb
t1ZxDGUr0LJv+pSBC/r3KXUPIA3tackDyXuEVFpZYkpfrO0HAmzp3FZP0eBgHWm662N4fHL0wz/2
aE+J00bzRoj0jawKfwZj4/ZBfH4Lrg1a+49+9zp622I4DPkrqmJZ225vNyGoT9nrC9MPNQM/zSu+
1ABPb/WXh8hjC+Lu9Pe82fx+H0pQiWzK/gayl+Qm7X2D3pfAqsxk+tLE/aFqS7Hpx2mF9Btlc33n
bgH+0ZFR4ohuyKJWmkBB8tQtSRRf7vSsZ7GPpbE9sz3ugZtdiXLjisN8QIB0LgKxA9tXNaffB9D+
Zk6SiECOKmugdp5OCDOlJSt6DxsNQecjPTu3VVRaAgsasYnCtH6ZLIAGtQCKN/vw4CENpuTI328N
tRi/FAHyKHattzQScXku4I2fuZlD/J/ekWLQ/CSg1MbJxCoLf3XP9yzydz+7g3iHPRyjeV2YBd1a
5if+KnmgG2zmXWIR7Zs88fpB2J3Jvp/eebFXsbuZGb/OTuuPFn1rAuuRcTSNlPglggxiB80oNUjh
YqTNygnFRpYLjvoSup3LWX/wwKGXQW7bUvcqb5gHMbwA56puHfIhn+H65qF2BEdX+Vu/605m/Q+u
36ocSbcNvPdAe60mAQQGAAEJmcAABwsBAAIkBvEHARJTD2YrDSb0E6Om7RUK0qenwRYhIQEFAQAM
mbXA/0oACAoBTGFGbAAABQEZDQAAAAAAAAAAAAAAAAAREwB0a/JTYwByAC4AdAB4AHQAAAAZABQK
AQDEKx8jkefaARUGAQAgAAAAAAA=
