OSDN Git Service

First imported to cvs
authornaru <bottle@mikage.to>
Sun, 9 Jun 2002 19:39:24 +0000 (19:39 +0000)
committernaru <bottle@mikage.to>
Sun, 9 Jun 2002 19:39:24 +0000 (19:39 +0000)
26 files changed:
bottleclient/BRegExp.pas [new file with mode: 0755]
bottleclient/BottleDef.pas [new file with mode: 0755]
bottleclient/ChannelListForm.dfm [new file with mode: 0755]
bottleclient/ChannelListForm.pas [new file with mode: 0755]
bottleclient/ConstEditor.dfm [new file with mode: 0755]
bottleclient/ConstEditor.pas [new file with mode: 0755]
bottleclient/ConstList.pas [new file with mode: 0755]
bottleclient/ConstText.dfm [new file with mode: 0755]
bottleclient/ConstText.pas [new file with mode: 0755]
bottleclient/HeadValue.pas [new file with mode: 0755]
bottleclient/LogForm.dfm [new file with mode: 0755]
bottleclient/LogForm.pas [new file with mode: 0755]
bottleclient/Logs.pas [new file with mode: 0755]
bottleclient/MainForm.dfm [new file with mode: 0755]
bottleclient/MainForm.pas [new file with mode: 0755]
bottleclient/MessageBox.dfm [new file with mode: 0755]
bottleclient/MessageBox.pas [new file with mode: 0755]
bottleclient/SendConfirm.dfm [new file with mode: 0755]
bottleclient/SendConfirm.pas [new file with mode: 0755]
bottleclient/SettingForm.dfm [new file with mode: 0755]
bottleclient/SettingForm.pas [new file with mode: 0755]
bottleclient/SstpBottle.cfg [new file with mode: 0755]
bottleclient/SstpBottle.dof [new file with mode: 0755]
bottleclient/SstpBottle.dpr [new file with mode: 0755]
bottleclient/SstpBottle.res [new file with mode: 0755]
bottleclient/SstpBottle.todo [new file with mode: 0755]

diff --git a/bottleclient/BRegExp.pas b/bottleclient/BRegExp.pas
new file mode 100755 (executable)
index 0000000..8e9ae3d
--- /dev/null
@@ -0,0 +1,280 @@
+unit BRegExp;
+
+//=====================================================================
+// BRegExp.pas : Borland Delphi \97p BREGEXP.DLL \97\98\97p\83\86\83j\83b\83g
+//               1998/10/11\94Å      osamu@big.or.jp
+//
+// BREGEXP.DLL \82Í\81Ahttp://www.hi-ho.or.jp/~babaq/ \82É\82Ä\8cö\8aJ\82³\82ê\82Ä\82¢\82é
+// Perl5\8cÝ\8a·\82Ì\90³\8bK\95\\8c»\83G\83\93\83W\83\93 BREGEXP.DLL \82ð Borland Delphi \82©\82ç\97\98\97p
+// \82·\82é\82½\82ß\82Ì\83\86\83j\83b\83g\83t\83@\83C\83\8b\82Å\82·\81BDelphi 3 \82Å\8dì\90¬\82µ\82Ü\82µ\82½\82ª\81A32bit
+// \94Å\82Ì Delphi \82¨\82æ\82Ñ C++ Builder \82Å\93®\8dì\89Â\94\\82Æ\8ev\82¢\82Ü\82·\81B
+//
+// BREGEXP.DLL \82Ì\97\98\97p\8fð\8c\8f\82È\82Ç\82Í\81A\93¯\83z\81[\83\80\83y\81[\83W\82ð\82²\8eQ\8fÆ\89º\82³\82¢\81B\97L\97p\82È
+// \83\89\83C\83u\83\89\83\8a\82ð\96³\8f\9e\82Å\92ñ\8b\9f\89º\82³\82Á\82Ä\82¢\82é babaq \82³\82ñ\82É\8a´\8eÓ\82·\82é\82Æ\82Æ\82à\82É\81A
+// \8d¡\8cã\82Ì\82²\8a\88\96ô\82ð\8aú\91Ò\82µ\82Ä\82¢\82Ü\82·\81B
+//
+// \96{\83\86\83j\83b\83g\82Ì\92\98\8dì\8c \82É\82Â\82¢\82Ä\82Í\81A\82Æ\82â\82©\82­\8c¾\82¤\82Â\82à\82è\82Í\82 \82è\82Ü\82¹\82ñ\81B\8dD\82«\82È
+// \82æ\82¤\82É\82¨\8eg\82¢\89º\82³\82¢\81B\82½\82¾\82µ\81A\97\98\97p\82É\93\96\82½\82Á\82Ä\82Í\82²\8e©\95ª\82Ì\90Ó\94C\82Ì\89º\82É\82¨\8aè
+// \82¢\82µ\82Ü\82·\81B\96{\83\86\83j\83b\83g\82É\8aÖ\82µ\82Ä osamu@big.or.jp \82Í\89½\82ç\90Ó\94C\82ð\95\89\82¤\82±\82Æ\82Í
+// \96³\82¢\82à\82Ì\82Æ\82µ\82Ü\82·\81B
+//
+// \96{\83\86\83j\83b\83g\82Í\81A DLL \82Æ\82Æ\82à\82É\94z\95z\82³\82ê\82Ä\82¢\82é\83w\83b\83_\83t\83@\83C\83\8b\8by\82Ñ\81A\8fã\8bL\83z\81[\83\80
+// \83y\81[\83W\82Å\8ds\82í\82ê\82½\83\86\81[\83U\83T\83|\81[\83g\82Ì\83\8d\83O\83t\83@\83C\83\8b\82ð\82à\82Æ\82É\8dì\90¬\82³\82ê\82Ü\82µ\82½\81B
+// \82¨\8bC\82Ã\82«\82Ì\93_\82È\82Ç\82 \82è\82Ü\82µ\82½\82ç\81Aosamu@big.or.jp \82Ü\82Å\93d\8eq\83\81\81[\83\8b\82É\82Ä
+// \82¨\92m\82ç\82¹\89º\82³\82ê\82Î\81A\8bC\95ª\8e\9f\91æ\82Å\82Í\82È\82ñ\82ç\82©\82Ì\91Î\8f\88\82ð\82·\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B(^_^;
+//
+// \8eg\97p\95û\96@\82É\82Â\82¢\82Ä\82Í\95t\91®\82Ì\83w\83\8b\83v\83t\83@\83C\83\8b\82ð\82²\97\97\89º\82³\82¢\81B
+//
+// [\97\9a\97ð]
+//  98.10.3     \8f\89\8aú\83o\81[\83W\83\87\83\93
+//  98.10.11    \83o\83O\83t\83B\83b\83N\83X (TBRegExpRec.splitp \82ð ^PChar -> PPChar)
+//
+//=====================================================================
+
+interface
+
+uses SysUtils;
+
+//=====================================================================
+// \96{\89Æ BREGEXP.H \82Æ\81A\83T\83|\81[\83g\83z\81[\83\80\83y\81[\83W\82Ì\83h\83L\83\85\83\81\83\93\83g\82æ\82è
+// BREGEXP.DLL \82Æ\92¼\8c\8b\82µ\82½\90é\8c¾
+//=====================================================================
+
+type
+PPChar=^PChar;
+TBRegExpRec=record
+    outp: PChar;        // \92u\8a·\82¦\8c\8b\89Ê\90æ\93ª\83|\83C\83\93\83^
+    outendp: PChar;     // \92u\8a·\82¦\8c\8b\89Ê\96\96\94ö\83|\83C\83\93\83^
+    splitctr: Integer;  // split \8c\8b\89Ê\83J\83E\83\93\83^
+    splitp: PPChar;     // split \8c\8b\89Ê\83|\83C\83\93\83^\83|\83C\83\93\83^
+    rsv1: Integer;      // \97\\96ñ\8dÏ\82Ý
+    parap: PChar;       // \83R\83}\83\93\83h\95\8e\9a\97ñ\90æ\93ª\83|\83C\83\93\83^ ('s/xxxxx/yy/gi')
+    paraendp: PChar;    // \83R\83}\83\93\83h\95\8e\9a\97ñ\96\96\94ö\83|\83C\83\93\83^
+    transtblp: PChar;   // tr \83e\81[\83u\83\8b\82Ö\82Ì\83|\83C\83\93\83^
+    startp: PPChar;     // \83}\83b\83`\82µ\82½\95\8e\9a\97ñ\82Ö\82Ì\90æ\93ª\83|\83C\83\93\83^
+    endp: PPChar;       // \83}\83b\83`\82µ\82½\95\8e\9a\97ñ\82Ö\82Ì\96\96\94ö\83|\83C\83\93\83^
+end;
+pTBRegExpRec=^TBRegExpRec;
+
+function BMatch(str, target, targetendp: PChar;
+                var rxp: pTBRegExpRec; msg: PChar): Boolean; cdecl;
+    external 'bregexp.dll';
+function BSubst(str, target, targetendp: PChar;
+                var rxp: pTBRegExpRec; msg: PChar): Boolean; cdecl;
+    external 'bregexp.dll';
+function BTrans(str, target, targetendp: PChar;
+                var rxp: pTBRegExpRec; msg: PChar): Boolean; cdecl;
+    external 'bregexp.dll';
+function BSplit(str, target, targetendp: PChar; limit: Integer;
+                var rxp: pTBRegExpRec; msg: PChar): Boolean; cdecl;
+    external 'bregexp.dll';
+procedure BRegFree(rx: pTBRegExpRec); cdecl;
+    external 'bregexp.dll' name 'BRegfree';
+function BRegExpVersion: PChar; cdecl;
+    external 'bregexp.dll' name 'BRegexpVersion';
+
+//=====================================================================
+// TBRegExp : BREGEXP.DLL \82Ì\8b@\94\\82ð\83J\83v\83Z\83\8b\89»\82·\82é\83I\83u\83W\83F\83N\83g
+//=====================================================================
+
+type
+EBRegExpError=class(Exception) end;
+TBRegExpMode=(brxNone, brxMatch, brxSplit);
+TBRegExp=class(TObject)
+  private
+    Mode: TBRegExpMode;
+    pBRegExp: PTBRegExpRec;
+    function GetSplitCount: Integer;
+    function GetSplitStrings(index: Integer): string;
+    function GetMatchStrings(index:Integer): string;
+    function GetMatchCount: Integer;
+    function GetCount: Integer;
+    function GetStrings(index: Integer): string;
+  public
+    destructor Destroy; override;
+  public
+    function Match(const Command, TargetString: string): Boolean;
+    function Subst(const Command: string;var TargetString: string): Boolean;
+    function Split(const Command, TargetString: string; Limit: Integer): Boolean;
+    function Trans(const Command: string;var TargetString: string): Boolean;
+    property Count: Integer read GetCount;
+    property Strings[index: Integer]: string read GetStrings; default;
+end;
+
+//=====================================================================
+
+implementation
+
+//=====================================================================
+
+destructor TBRegExp.Destroy;
+begin
+    if pBRegExp<>nil then
+        BRegFree(pBRegExp);
+    inherited Destroy;
+end;
+
+//=====================================================================
+
+function TBRegExp.Match(const Command, TargetString: string): Boolean;
+var ErrorString: string;
+begin
+    SetLength(ErrorString,256);
+    Mode:=brxNone;
+    Result:=BMatch(
+        PChar(Command),
+        PChar(TargetString),
+        PChar(TargetString)+Length(TargetString),
+        pBRegExp,
+        PChar(ErrorString));
+    SetLength(ErrorString,StrLen(PChar(ErrorString)));
+    if ErrorString<>'' then
+        raise EBRegExpError.Create(ErrorString);
+    Mode:=brxMatch;
+end;
+
+//=====================================================================
+
+function TBRegExp.Subst(const Command: string;
+                        var TargetString: string): Boolean;
+var ErrorString: string;
+begin
+    SetLength(ErrorString,256);
+    Mode:=brxNone;
+    Result:=BSubst(
+        PChar(Command),
+        PChar(TargetString),
+        PChar(TargetString)+Length(TargetString),
+        pBRegExp,
+        PChar(ErrorString));
+    SetLength(ErrorString,StrLen(PChar(ErrorString)));
+    if ErrorString<>'' then
+        raise EBRegExpError.Create(ErrorString);
+    if Result then TargetString:=pBRegExp^.outp;
+end;
+
+//=====================================================================
+
+function TBRegExp.Trans(const Command: string;
+                        var TargetString: string): Boolean;
+var ErrorString: string;
+begin
+    SetLength(ErrorString,256);
+    Mode:=brxNone;
+    Result:=BTrans(
+        PChar(Command),
+        PChar(TargetString),
+        PChar(TargetString)+Length(TargetString),
+        pBRegExp,
+        PChar(ErrorString));
+    SetLength(ErrorString,StrLen(PChar(ErrorString)));
+    if ErrorString<>'' then
+        raise EBRegExpError.Create(ErrorString);
+    if Result then TargetString:=pBRegExp^.outp;
+end;
+
+//=====================================================================
+
+function TBRegExp.Split(const Command, TargetString: string;
+                        Limit: Integer): Boolean;
+var ErrorString: string;
+begin
+    SetLength(ErrorString,256);
+    Mode:=brxNone;
+    Result:=BSplit(
+        PChar(Command),
+        PChar(TargetString),
+        PChar(TargetString)+Length(TargetString),
+        Limit,
+        pBRegExp,
+        PChar(ErrorString));
+    SetLength(ErrorString,StrLen(PChar(ErrorString)));
+    if ErrorString<>'' then
+        raise EBRegExpError.Create(ErrorString);
+    Mode:=brxSplit;
+end;
+
+//=====================================================================
+
+function TBRegExp.GetCount: Integer;
+begin
+    Result:=0;
+    case Mode of
+    brxNone:
+        raise EBRegExpError.Create('no count now');
+    brxMatch:
+        Result:=GetMatchCount;
+    brxSplit:
+        Result:=GetSplitCount;
+    end;
+end;
+
+function TBRegExp.GetMatchCount: Integer;
+var sp,ep: PPChar;
+begin
+    Result:=0;
+    sp:=pBRegExp^.startp;
+    ep:=pBRegExp^.endp;
+    while Integer(sp^)<Integer(ep^) do begin
+        Inc(sp);
+        Inc(ep);
+        Inc(Result);
+    end;
+end;
+
+function TBRegExp.GetSplitCount: Integer;
+begin
+    Result:=pBRegExp^.splitctr;
+end;
+
+//=====================================================================
+
+function TBRegExp.GetStrings(index: Integer): string;
+begin
+    Result:='';
+    case Mode of
+    brxNone:
+        raise EBRegExpError.Create('no strings now');
+    brxMatch:
+        Result:=GetMatchStrings(index);
+    brxSplit:
+        Result:=GetSplitStrings(index);
+    end;
+end;
+
+function TBRegExp.GetMatchStrings(index:Integer):string;
+var sp,ep: PPChar;
+begin
+    Result:='';
+    sp:=pBRegExp^.startp;
+    ep:=pBRegExp^.endp;
+    while index>0 do begin
+        if Integer(sp^)>=Integer(ep^) then
+            raise EBRegExpError.Create('index out of range');
+        Inc(sp);
+        Inc(ep);
+        Dec(index);
+    end;
+    SetLength(Result,Integer(ep^)-Integer(sp^));
+    Move(sp^^,PChar(Result)^,Integer(ep^)-Integer(sp^));
+end;
+
+function TBRegExp.GetSplitStrings(index:Integer): string;
+var p: PPChar;
+    sp,ep: PChar;
+begin
+    if (index<0) or (index>=GetSplitCount) then
+        raise EBRegExpError.Create('index out of range');
+    p:=pBRegExp^.splitp;
+    Inc(p,index*2);
+    sp:=p^;
+    Inc(p);
+    ep:=p^;
+    SetLength(Result,Integer(ep)-Integer(sp));
+    Move(sp^,PChar(Result)^,Integer(ep)-Integer(sp));
+end;
+
+//=====================================================================
+
+end.
+
diff --git a/bottleclient/BottleDef.pas b/bottleclient/BottleDef.pas
new file mode 100755 (executable)
index 0000000..4723782
--- /dev/null
@@ -0,0 +1,883 @@
+unit BottleDef;
+
+(*
+  \83A\83v\83\8a\83P\81[\83V\83\87\83\93\91S\91Ì\82Å\8eg\82¤\82³\82Ü\82´\82Ü\82È\83f\81[\83^\82ð\92è\8b`
+*)
+
+interface
+
+uses Windows, IniFiles, BRegExp, Graphics, SysUtils, Forms, Dialogs, Classes,
+  ComCtrls, Contnrs;
+
+type
+  TReturnKeyFunction = (kfYenN, kfReturn, kfYenNReturn, kfConstText);
+  TSoundArrived = (saFalse, saTrue, saParent);
+
+  //SSTP Bottle\82Ì\83`\83\83\83\93\83l\83\8b\82²\82Æ\82Ì\90Ý\92è
+  TChannelPrefs = class(TObject)
+  private
+    FSoundArrived: TSoundArrived;
+    FUseChannelPrefs: boolean;
+    FChannelName: String;
+    FSoundFile: String;
+    FIgnoreIfGhost: boolean;
+    FTargetGhost: String;
+    FCanAutoAdd: boolean;
+    FWarnPost: boolean;
+    procedure SetChannelName(const Value: String);
+    procedure SetSoundArrived(const Value: TSoundArrived);
+    procedure SetSoundFile(const Value: String);
+    procedure SetUseChannelPrefs(const Value: boolean);
+    procedure SetIgnoreIfGhost(const Value: boolean);
+    procedure SetTargetGhost(const Value: String);
+    procedure SetCanAutoAdd(const Value: boolean);
+    procedure SetWarnPost(const Value: boolean);
+  public
+    //\83`\83\83\83\93\83l\83\8b\96¼(\91å\8e\96)
+    property ChannelName: String read FChannelName write SetChannelName;
+    //\82±\82Ì\90Ý\92è\82ð\8eg\82¤\82©\82Ç\82¤\82©
+    property UseChannelPrefs: boolean read FUseChannelPrefs write SetUseChannelPrefs;
+    //\93\9e\92\85\8e\9e\82É\89¹\82ð\96Â\82ç\82·
+    property SoundArrived: TSoundArrived read FSoundArrived write SetSoundArrived;
+    //\89¹\90º\83t\83@\83C\83\8b
+    property SoundFile: String read FSoundFile write SetSoundFile;
+    //\91\97\90M\90æ\83S\81[\83X\83g(\8bó\95\8e\9a\97ñ\82È\82ç\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)
+    property TargetGhost: String read FTargetGhost write SetTargetGhost;
+    //IfGhost\82ð\96³\8e\8b
+    property IgnoreIfGhost: boolean read FIgnoreIfGhost write SetIgnoreIfGhost;
+    //\83`\83\83\83\93\83l\83\8b\82Ì\8e©\93®\93o\98^\82Ì\91Î\8fÛ\82É\82·\82é
+    property CanAutoAdd: boolean read FCanAutoAdd write SetCanAutoAdd;
+    //\83`\83\83\83\93\83l\83\8b\93\8a\8de\82Ì\8dÛ\82É\83`\83\83\83\93\83l\83\8b\82ð\8am\94F\82·\82é
+    property WarnPost: boolean read FWarnPost write SetWarnPost;
+    //\95Û\91\81E\93Ç\82Ý\8d\9e\82Ý
+    procedure Save(AnIni: TIniFile; Default: boolean = false);
+    procedure Load(AnIni: TIniFile; ChannelName: String; Default: boolean = false);
+  end;
+
+  //SSTP Bottle\82Ì\90Ý\92è
+  TBottlePrefs = class(TObject)
+  private
+    FIni: TIniFile;
+    FChannelList: TList;
+    FDefChannelPref: TChannelPrefs;
+    //
+    FColorScript: boolean;
+    FIgnoreTimeCritical: boolean;
+    FStayOnTop: boolean;
+    FShowConstBar: boolean;
+    FNoConfirm: boolean;
+    FDblClkInsert: boolean;
+    FShowToolBar: boolean;
+    FColorTimeLagValue: integer;
+    FDefaultScript: String;
+    FTalkColorH: TColor;
+    FMetaWordColor: TColor;
+    FTalkColorU: TColor;
+    FMarkErrorColor: TColor;
+    FMarkUpColor: TColor;
+    FAutoStart: boolean;
+    FCgiName: string;
+    FHomePage: string;
+    FWhenCtrlReturn: TReturnKeyFunction;
+    FWhenShiftReturn: TReturnKeyFunction;
+    FWhenReturn: TReturnKeyFunction;
+    FColorSpeed: integer;
+    FNoTranslate: boolean;
+    FNoDescript: boolean;
+    FBgColor: TColor;
+    FServerPort: integer;
+    FSilentWhenHidden: boolean;
+    FLUID: String;
+    FSenderWindowPosition: TRect;
+    FUsePort: boolean;
+    FTabPosition: TTabPosition;
+    FLogWindowPosition: TRect;
+    FNoTransUrl: boolean;
+    FIgnoreFrequentYenS: boolean;
+    FWaitScriptEnd: integer;
+    FNoSendGhostList: boolean;
+    FCgiNameGhost: String;
+    FGLogPage: String;
+    FVotePage: String;
+    FLogWindowDividerPos: integer;
+    FHelpPage: String;
+    FUseHttpProxy: boolean;
+    FProxyPort: integer;
+    FProxyAddress: String;
+    FConfirmOnExit: boolean;
+    procedure SetColorScript(const Value: boolean);
+    procedure SetColorTimeLagValue(const Value: integer);
+    procedure SetDblClkInsert(const Value: boolean);
+    procedure SetDefaultScript(const Value: String);
+    procedure SetIgnoreTimeCritical(const Value: boolean);
+    procedure SetMarkErrorColor(const Value: TColor);
+    procedure SetMarkUpColor(const Value: TColor);
+    procedure SetMetaWordColor(const Value: TColor);
+    procedure SetNoConfirm(const Value: boolean);
+    procedure SetShowConstBar(const Value: boolean);
+    procedure SetShowToolBar(const Value: boolean);
+    procedure SetStayOnTop(const Value: boolean);
+    procedure SetTalkColorH(const Value: TColor);
+    procedure SetTalkColorU(const Value: TColor);
+    procedure SetAutoStart(const Value: boolean);
+    procedure SetWhenCtrlReturn(const Value: TReturnKeyFunction);
+    procedure SetWhenReturn(const Value: TReturnKeyFunction);
+    procedure SetWhenShiftReturn(const Value: TReturnKeyFunction);
+    procedure SetColorSpeed(const Value: integer);
+    procedure SetNoTranslate(const Value: boolean);
+    procedure SetNoDescript(const Value: boolean);
+    procedure SetBgColor(const Value: TColor);
+    procedure SetServerPort(const Value: integer);
+    procedure SetSilentWhenHidden(const Value: boolean);
+    function GetChannelPref(ChannelName: String): TChannelPrefs;
+    function GetDefChannelPref: TChannelPrefs;
+    function GetChannelPrefIndex(Index: integer): TChannelPrefs;
+    function GetChannelPrefCount: integer;
+    procedure SetLUID(const Value: String);
+    procedure SetSenderWindowPosition(const Value: TRect);
+    procedure SetUsePort(const Value: boolean);
+    procedure SetTabPosition(const Value: TTabPosition);
+    procedure SetLogWindowPosition(const Value: TRect);
+    procedure SetIgnoreFrequentYenS(const Value: boolean);
+    procedure SetNoTransUrl(const Value: boolean);
+    procedure SetWaitScriptEnd(const Value: integer);
+    procedure SetNoSendGhostList(const Value: boolean);
+    procedure SetLogWindowDividerPos(const Value: integer);
+    procedure SetProxyAddress(const Value: String);
+    procedure SetProxyPort(const Value: integer);
+    procedure SetUseHttpProxy(const Value: boolean);
+    procedure SetConfirmOnExit(const Value: boolean);
+  protected
+    procedure ClearList; virtual;
+  public
+    property NoSendGhostList: boolean read FNoSendGhostList write SetNoSendGhostList;
+    property ConfirmOnExit: boolean read FConfirmOnExit write SetConfirmOnExit;
+    property AutoStart: boolean read FAutoStart write SetAutoStart;
+    property TabPosition: TTabPosition read FTabPosition write SetTabPosition;
+    property NoTranslate: boolean read FNoTranslate write SetNoTranslate;
+    property NoDescript: boolean read FNoDescript write SetNoDescript;
+    property NoTransUrl: boolean read FNoTransUrl write SetNoTransUrl;
+    property IgnoreFrequentYenS: boolean read FIgnoreFrequentYenS write SetIgnoreFrequentYenS;
+    property WaitScriptEnd: integer read FWaitScriptEnd write SetWaitScriptEnd;
+    property StayOnTop: boolean read FStayOnTop write SetStayOnTop;
+    property ColorScript: boolean read FColorScript write SetColorScript;
+    property IgnoreTimeCritical: boolean read FIgnoreTimeCritical write SetIgnoreTimeCritical;
+    property TalkColorH: TColor read FTalkColorH write SetTalkColorH;
+    property TalkColorU: TColor read FTalkColorU write SetTalkColorU;
+    property MarkUpColor: TColor read FMarkUpColor write SetMarkUpColor;
+    property MetaWordColor: TColor read FMetaWordColor write SetMetaWordColor;
+    property MarkErrorColor: TColor read FMarkErrorColor write SetMarkErrorColor;
+    property BgColor: TColor read FBgColor write SetBgColor;
+    property DefaultScript: String read FDefaultScript write SetDefaultScript;
+    property DblClkInsert: boolean read FDblClkInsert write SetDblClkInsert;
+    property ShowToolBar: boolean read FShowToolBar write SetShowToolBar;
+    property ShowConstBar: boolean read FShowConstBar write SetShowConstBar;
+    property NoConfirm: boolean read FNoConfirm write SetNoConfirm;
+    property ColorTimeLagValue: integer read FColorTimeLagValue write SetColorTimeLagValue;
+    property ColorSpeed: integer read FColorSpeed write SetColorSpeed;
+    property HomePage: string read FHomePage;
+    property WhenReturn: TReturnKeyFunction read FWhenReturn write SetWhenReturn;
+    property WhenShiftReturn: TReturnKeyFunction read FWhenShiftReturn write SetWhenShiftReturn;
+    property WhenCtrlReturn: TReturnKeyFunction read FWhenCtrlReturn write SetWhenCtrlReturn;
+    property ServerPort: integer read FServerPort write SetServerPort;
+    property UsePort: boolean read FUsePort write SetUsePort;
+    property SilentWhenHidden: boolean read FSilentWhenHidden write SetSilentWhenHidden;
+    //URL\8aÖ\8cW
+    property CgiName: string read FCgiName;
+    property CgiNameGhost: String read FCgiNameGhost;
+    property GLogPage: String read FGLogPage;
+    property VotePage: String read FVotePage;
+    property HelpPage: String read FHelpPage;
+
+    //\83`\83\83\83\93\83l\83\8b\8aÖ\8cW
+    property DefChannelPref: TChannelPrefs read GetDefChannelPref;
+    property ChannelPrefIndex[Index: integer]: TChannelPrefs read GetChannelPrefIndex;
+    property ChannelPrefCount: integer read GetChannelPrefCount;
+    property ChannelPref[ChannelName: String]: TChannelPrefs read GetChannelPref;
+    property LUID: String read FLUID write SetLUID;
+    procedure DeleteChannelPref(ChannelName: String);
+    function CreateChannelPref(ChannelName: String): TChannelPrefs;
+    //\83E\83B\83\93\83h\83E\88Ê\92u
+    property SenderWindowPosition: TRect read FSenderWindowPosition write SetSenderWindowPosition;
+    property LogWindowPosition: TRect read FLogWindowPosition write SetLogWindowPosition;
+    property LogWindowDividerPos: integer read FLogWindowDividerPos write SetLogWindowDividerPos;
+    //\83v\83\8d\83L\83V\8aÖ\8cW
+    property UseHttpProxy: boolean read FUseHttpProxy write SetUseHttpProxy;
+    property ProxyAddress: String read FProxyAddress write SetProxyAddress;
+    property ProxyPort: integer read FProxyPort write SetProxyPort;
+    //
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  TChannelListItem = class(TObject)
+  private
+    FMembers: integer;
+    FGhost: String;
+    FInfo: String;
+    FName: String;
+    FNoPost: boolean;
+    FWarnPost: boolean;
+    procedure SetGhost(const Value: String);
+    procedure SetInfo(const Value: String);
+    procedure SetMembers(const Value: integer);
+    procedure SetName(const Value: String);
+    procedure SetNoPost(const Value: boolean);
+    procedure SetWarnPost(const Value: boolean);
+  public
+    property Name: String read FName write SetName;
+    property Info: String read FInfo write SetInfo;
+    property Ghost: String read FGhost write SetGhost;
+    property Members: integer read FMembers write SetMembers;
+    property NoPost: boolean read FNoPost write SetNoPost;
+    property WarnPost: boolean read FWarnPost write SetWarnPost;
+  end;
+
+  TChannelList = class(TList)
+  private
+    function GetChannel(Name: String): TChannelListItem;
+    function GetChannelItem(Index: integer): TChannelListItem;
+  public
+    procedure Clear; override;
+    property Channel[Name: String]: TChannelListItem read GetChannel;
+    property ChannelItem[Index: integer]: TChannelListItem read GetChannelItem;
+  end;
+
+  TID2Ghost = class(TStringList)
+  private
+  public
+    procedure AddIdGhost(const ID: integer; const Ghost, Channel, MID: String);
+    procedure GetIdGhost(const ID: integer; var Ghost: String; var Channel: String; var MID: String);
+    procedure DeleteIdGhost(const ID: integer);
+  end;
+
+
+  TScriptTransOption = (
+    toIgnoreTimeCritical,
+    toConvertURL,
+    toNoChoice,
+    toIgnoreFrequentYenS,
+    toWaitScriptEnd
+  );
+
+  TScriptTransOptions = set of TScriptTransOption;
+
+var
+  RegExp: TBRegExp;
+  Pref: TBottlePrefs;
+const
+  DefaultCGI      = 'http://bottle.mikage.to/bottle2.cgi';
+  DefaultCGIGhost = 'http://bottle.mikage.to/glog/bottleglog.cgi';
+  DefaultHomePage = 'http://bottle.mikage.to/';
+  DefaultGLogPage = 'http://bottle.mikage.to/glog/glogview.cgi';
+  DefaultVotePage = 'http://bottle.mikage.to/viewvotes.cgi';
+  DefaultHelpPage = 'http://bottle.mikage.to/clihelp/';
+  VersionString = 'SSTP Bottle Client ver 2.10';
+  SentLogFile     = 'sent.log';
+
+implementation
+
+{ TBottlePrefs }
+
+procedure TBottlePrefs.ClearList;
+var i: integer;
+begin
+  for i := FChannelList.Count-1 downto 0 do begin
+    TChannelPrefs(FChannelList[i]).Free;
+  end;
+  FChannelList.Clear;
+end;
+
+constructor TBottlePrefs.Create;
+var Sections: TStringList;
+    i: integer;
+    ChPref: TChannelPrefs;
+    ARect, Dum: TRect;
+begin
+  try
+    FIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
+    FChannelList := TList.Create;
+    FDefChannelPref := TChannelPrefs.Create;
+    FDefChannelPref.Load(FIni, '\83f\83t\83H\83\8b\83g', true);
+    FDefChannelPref.UseChannelPrefs := true;
+    //
+    NoSendGhostList := FIni.ReadBool('System', 'NoSendGhostList', false);
+    ConfirmOnExit := FIni.ReadBool('System', 'ConfirmOnExit', false);
+    AutoStart := FIni.ReadBool('System', 'AutoStart', false);
+    TabPosition := TTabPosition(FIni.ReadInteger('System', 'TabPosition', 1));
+    NoTranslate := FIni.ReadBool('System', 'NoTranslate', true);
+    NoDescript := FIni.ReadBool('System', 'NoDescript', false);
+    NoTransUrl := FIni.ReadBool('System', 'NoTransUrl', false);
+    IgnoreFrequentYenS := FIni.ReadBool('System', 'IgnoreFrequentYenS', false);
+    WaitScriptEnd := FIni.ReadInteger('System', 'WaitScriptEnd', 0);
+    StayOnTop := FIni.ReadBool('System', 'StayOnTop', false);
+    ShowConstBar := FIni.ReadBool('System', 'ShowConstBar', true);
+    ShowToolBar := FIni.ReadBool('System', 'ShowToolBar', true);
+    NoConfirm := FIni.ReadBool('System', 'NoConfirm', false);
+    IgnoreTimeCritical := FIni.ReadBool('System', 'IgnoreTimeCritical', false);
+    ColorScript := FIni.ReadBool('System', 'ColorScript', true);
+    DefaultScript := FIni.ReadString('System', 'DefaultScript', '\t\h\s[0]|\e');
+    RegExp.Subst('s/\t/\r\n/kg', FDefaultScript);
+    //
+    ColorTimeLagValue := FIni.ReadInteger('System', 'ColorTimeLagValue', 0);
+    ColorSpeed := FIni.ReadInteger('System', 'ColorSpeed', 5);
+    try
+      TalkColorH := StringToColor(FIni.ReadString('System', 'TalkColorH', 'clBlack'));
+      TalkColorU := StringToColor(FIni.ReadString('System', 'TalkColorU', 'clMaroon'));
+      MarkUpColor := StringToColor(FIni.ReadString('System', 'MarkUpColor', 'clGreen'));
+      MetaWordColor := StringToColor(FIni.ReadString('System', 'MetaWordColor', 'clBlue'));
+      MarkErrorColor := StringToColor(FIni.ReadString('System', 'MarkErrorColor', 'clRed'));
+      BgColor := StringToColor(FIni.ReadString('System', 'BgColor', 'clWhite'));
+    except
+      on EConvertError do begin
+        ShowMessage('\83J\83\89\81[\82Ì\90Ý\92è\93Ç\82Ý\8d\9e\82Ý\83G\83\89\81[\82Å\82·\81B');
+        TalkColorH := clBlack;
+        TalkColorU := clMaroon;
+        MarkUpColor := clGreen;
+        MetaWordColor := clBlue;
+        FMarkErrorColor := clRed;
+      end;
+    end;
+    WhenReturn      := TReturnKeyFunction(FIni.ReadInteger('System', 'WhenReturn', 0));
+    WhenShiftReturn := TReturnKeyFunction(FIni.ReadInteger('System', 'WhenShiftReturn', 0));
+    WhenCtrlReturn  := TReturnKeyFunction(FIni.ReadInteger('System', 'WhenCtrlReturn', 0));
+    //\83\\83P\83b\83g\82ð\83{\83g\83\8b\94z\91\97\82ÌSSTP\92Ê\90M\82É\8eg\97p\82·\82é\8fê\8d\87\82Ì\90Ý\92è
+    ServerPort      := FIni.ReadInteger('System', 'ServerPort', 11000);
+    UsePort         := FIni.ReadBool('System', 'UsePort', false);
+
+    SilentWhenHidden:= FIni.ReadBool('System', 'SilentWhenHidden', true);
+
+    FCgiName  := FIni.ReadString('System', 'CgiName', DefaultCGI);
+    FHomePage := FIni.ReadString('System', 'HomePage', DefaultHomePage);
+    FGLogPage := FIni.ReadString('System', 'GLogPage', DefaultGLogPage);
+    FVotePage := FIni.ReadString('System', 'VotePage', DefaultVotePage);
+    FHelpPage := FIni.ReadString('System', 'HelpPage', DefaultHelpPage);
+    FCgiNameGhost := FIni.ReadString('System', 'GHOST', DefaultCGIGhost);
+    FLUID     := FIni.ReadString('System', 'LUID', '');
+    //
+    Sections := nil;
+    try
+      Sections := TStringList.Create;
+      FIni.ReadSections(Sections);
+      for i := 0 to Sections.Count-1 do begin
+        if Pos('CH_', Sections[i]) = 1 then begin
+          ChPref := TChannelPrefs.Create;
+          ChPref.Load(Fini, Copy(Sections[i], 4, High(integer)));
+          FChannelList.Add(ChPref);
+        end;
+      end;
+    finally
+      Sections.Free;
+    end;
+    ARect.Top    := FIni.ReadInteger('System', 'SenderWindowPositionTop', 100);
+    ARect.Left   := FIni.ReadInteger('System', 'SenderWindowPositionLeft', 100);
+    ARect.Bottom := FIni.ReadInteger('System', 'SenderWindowPositionBottom', 500);
+    ARect.Right  := FIni.ReadInteger('System', 'SenderWindowPositionRight', 500);
+    if not IntersectRect(Dum, Rect(0, 0, Screen.Width, Screen.Height), ARect) then
+      ARect := Rect(100, 100, 500, 500);
+    SenderWindowPosition := ARect;
+    ARect.Top    := FIni.ReadInteger('System', 'LogWindowPositionTop', 200);
+    ARect.Left   := FIni.ReadInteger('System', 'LogWindowPositionLeft', 200);
+    ARect.Bottom := FIni.ReadInteger('System', 'LogWindowPositionBottom', 600);
+    ARect.Right  := FIni.ReadInteger('System', 'LogWindowPositionRight', 400);
+    LogWindowDividerPos := FIni.ReadInteger('System', 'LogWindowDividerPos', 150);
+    if not IntersectRect(Dum, Rect(0, 0, Screen.Width, Screen.Height), ARect) then begin
+      ARect := Rect(200, 200, 600, 400);
+      LogWindowDividerPos := 150;
+    end;
+    LogWindowPosition := ARect;
+    //
+    UseHttpProxy := FIni.ReadBool('System', 'UseHttpProxy', false);
+    ProxyAddress := FIni.ReadString('System', 'ProxyAddress', '');
+    ProxyPort    := FIni.ReadInteger('System', 'ProxyPort', 0);
+  except
+    ShowMessage('INI\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý\83G\83\89\81[');
+    Application.Terminate;
+  end;
+end;
+
+function TBottlePrefs.CreateChannelPref(ChannelName: String): TChannelPrefs;
+begin
+  if ChannelPref[ChannelName] <> nil then begin
+    //\82·\82Å\82É\82 \82é\83`\83\83\83\93\83l\83\8b\96¼\82¾\82Á\82½\8fê\8d\87
+    Result := ChannelPref[ChannelName];
+    Exit;
+  end;
+  try
+    Result := TChannelPrefs.Create;
+    Result.SoundArrived := saParent;
+    Result.ChannelName := ChannelName;
+    FChannelList.Add(Result);
+  except
+    Result := nil;
+  end;
+end;
+
+procedure TBottlePrefs.DeleteChannelPref(ChannelName: String);
+var i: integer;
+begin
+  for i := FChannelList.Count-1 downto 0 do begin
+    if TChannelPrefs(FChannelList[i]).ChannelName = ChannelName then begin
+      TChannelPrefs(FChannelList[i]).Free;
+      FChannelList.Delete(i);
+      FIni.EraseSection('CH_' + ChannelName);
+    end;
+  end;
+end;
+
+destructor TBottlePrefs.Destroy;
+var i: integer;
+begin
+  inherited;
+  FIni.WriteBool('System', 'NoSendGhostList', NoSendGhostList);
+  FIni.WriteBool('System', 'ConfirmOnExit', ConfirmOnExit);
+  FIni.WriteBool('System', 'AutoStart', AutoStart);
+  FIni.WriteInteger('System', 'TabPosition', Ord(TabPosition)); 
+  FIni.WriteBool('System', 'NoTranslate', NoTranslate);
+  FIni.WriteBool('System', 'NoDescript', NoDescript);
+  FIni.WriteBool('System', 'NoTransUrl', NoTransUrl);
+  FIni.WriteBool('System', 'IgnoreFrequentYenS', IgnoreFrequentYenS);
+  FIni.WriteInteger('System', 'WaitScriptEnd', WaitScriptEnd);
+  FIni.WriteBool('System', 'StayOnTop', StayOnTop);
+  FIni.WriteBool('System', 'NoConfirm', NoConfirm);
+  FIni.WriteBool('System', 'ColorScript', ColorScript);
+  FIni.WriteBool('System', 'IgnoreTimeCritical', IgnoreTimeCritical);
+  FIni.WriteString('System', 'TalkColorH',     ColorToString(TalkColorH));
+  FIni.WriteString('System', 'TalkColorU',     ColorToString(TalkColorU));
+  FIni.WriteString('System', 'MarkUpColor',    ColorToString(MarkUpColor));
+  FIni.WriteString('System', 'MetaWordColor',  ColorToString(MetaWordColor));
+  FIni.WriteString('System', 'MarkErrorColor', ColorToString(MarkErrorColor));
+  FIni.WriteString('System', 'BgColor', ColorToString(BgColor));
+  FIni.WriteBool('System', 'ShowToolBar', ShowToolBar);
+  FIni.WriteBool('System', 'ShowConstBar', ShowConstBar);
+  RegExp.Subst('s/\r\n/\t/kg', FDefaultScript);
+  FIni.WriteString('System', 'DefaultScript', DefaultScript);
+  FIni.WriteInteger('System', 'ColorTimeLagValue', ColorTimeLagValue);
+  FIni.WriteInteger('System', 'ColorSpeed', ColorSpeed);
+  FIni.WriteInteger('System', 'WhenReturn', Ord(WhenReturn));
+  FIni.WriteInteger('System', 'WhenShiftReturn', Ord(WhenShiftReturn));
+  FIni.WriteInteger('System', 'WhenCtrlReturn', Ord(WhenCtrlReturn));
+  FIni.WriteInteger('System', 'ServerPort', ServerPort);
+  FIni.WriteBool('System', 'UsePort', UsePort);
+  FIni.WriteBool('System', 'SilentWhenHidden', SilentWhenHidden);
+  FIni.WriteString('System', 'LUID', LUID);
+  //
+  DefChannelPref.Save(FIni, true);
+  for i := 0 to FChannelList.Count-1 do begin
+    ChannelPrefIndex[i].Save(FIni);
+  end;
+  FIni.WriteInteger('System', 'SenderWindowPositionLeft', SenderWindowPosition.Left);
+  FIni.WriteInteger('System', 'SenderWindowPositionTop', SenderWindowPosition.Top);
+  FIni.WriteInteger('System', 'SenderWindowPositionRight', SenderWindowPosition.Right);
+  FIni.WriteInteger('System', 'SenderWindowPositionBottom', SenderWindowPosition.Bottom);
+  FIni.WriteInteger('System', 'LogWindowPositionLeft', LogWindowPosition.Left);
+  FIni.WriteInteger('System', 'LogWindowPositionTop', LogWindowPosition.Top);
+  FIni.WriteInteger('System', 'LogWindowPositionRight', LogWindowPosition.Right);
+  FIni.WriteInteger('System', 'LogWindowPositionBottom', LogWindowPosition.Bottom);
+  FIni.WriteInteger('System', 'LogWindowDividerPos', LogWindowDividerPos);
+  //
+  FIni.WriteBool('System', 'UseHttpProxy', UseHttpProxy);
+  FIni.WriteString('System', 'ProxyAddress', ProxyAddress);
+  FIni.WriteInteger('System', 'ProxyPort', ProxyPort);
+  FIni.Free;
+  ClearList;
+  FDefChannelPref.Free;
+  FChannelList.Free;
+end;
+
+function TBottlePrefs.GetChannelPref(ChannelName: String): TChannelPrefs;
+var i: integer;
+begin
+  Result := nil;
+  for i := 0 to FChannelList.Count-1 do begin
+    if TChannelPrefs(FChannelList[i]).ChannelName = ChannelName then begin
+      Result := TChannelPrefs(FChannelList[i]);
+      Exit;
+    end;
+  end;
+end;
+
+function TBottlePrefs.GetChannelPrefCount: integer;
+begin
+  Result := FChannelList.Count;
+end;
+
+function TBottlePrefs.GetChannelPrefIndex(Index: integer): TChannelPrefs;
+begin
+  Result := TChannelPrefs(FChannelList[Index]);
+end;
+
+function TBottlePrefs.GetDefChannelPref: TChannelPrefs;
+begin
+  Result := FDefChannelPref;
+end;
+
+procedure TBottlePrefs.SetAutoStart(const Value: boolean);
+begin
+  FAutoStart := Value;
+end;
+
+procedure TBottlePrefs.SetBgColor(const Value: TColor);
+begin
+  FBgColor := Value;
+end;
+
+procedure TBottlePrefs.SetColorScript(const Value: boolean);
+begin
+  FColorScript := Value;
+end;
+
+procedure TBottlePrefs.SetColorSpeed(const Value: integer);
+begin
+  FColorSpeed := Value;
+  if Value < 1 then FColorSpeed := 1;
+end;
+
+procedure TBottlePrefs.SetColorTimeLagValue(const Value: integer);
+begin
+  FColorTimeLagValue := Value;
+  if Value < 0 then FColorTimeLagValue := 0;
+end;
+
+procedure TBottlePrefs.SetConfirmOnExit(const Value: boolean);
+begin
+  FConfirmOnExit := Value;
+end;
+
+procedure TBottlePrefs.SetDblClkInsert(const Value: boolean);
+begin
+  FDblClkInsert := Value;
+end;
+
+procedure TBottlePrefs.SetDefaultScript(const Value: String);
+begin
+  FDefaultScript := Value;
+end;
+
+procedure TBottlePrefs.SetIgnoreFrequentYenS(const Value: boolean);
+begin
+  FIgnoreFrequentYenS := Value;
+end;
+
+procedure TBottlePrefs.SetIgnoreTimeCritical(const Value: boolean);
+begin
+  FIgnoreTimeCritical := Value;
+end;
+
+procedure TBottlePrefs.SetLogWindowDividerPos(const Value: integer);
+begin
+  FLogWindowDividerPos := Value;
+end;
+
+procedure TBottlePrefs.SetLogWindowPosition(const Value: TRect);
+begin
+  FLogWindowPosition := Value;
+end;
+
+procedure TBottlePrefs.SetLUID(const Value: String);
+begin
+  FLUID := Value;
+end;
+
+procedure TBottlePrefs.SetMarkErrorColor(const Value: TColor);
+begin
+  FMarkErrorColor := Value;
+end;
+
+procedure TBottlePrefs.SetMarkUpColor(const Value: TColor);
+begin
+  FMarkUpColor := Value;
+end;
+
+procedure TBottlePrefs.SetMetaWordColor(const Value: TColor);
+begin
+  FMetaWordColor := Value;
+end;
+
+procedure TBottlePrefs.SetNoConfirm(const Value: boolean);
+begin
+  FNoConfirm := Value;
+end;
+
+procedure TBottlePrefs.SetNoDescript(const Value: boolean);
+begin
+  FNoDescript := Value;
+end;
+
+procedure TBottlePrefs.SetNoSendGhostList(const Value: boolean);
+begin
+  FNoSendGhostList := Value;
+end;
+
+procedure TBottlePrefs.SetNoTranslate(const Value: boolean);
+begin
+  FNoTranslate := Value;
+end;
+
+procedure TBottlePrefs.SetNoTransUrl(const Value: boolean);
+begin
+  FNoTransUrl := Value;
+end;
+
+procedure TBottlePrefs.SetProxyAddress(const Value: String);
+begin
+  FProxyAddress := Value;
+end;
+
+procedure TBottlePrefs.SetProxyPort(const Value: integer);
+begin
+  FProxyPort := Value;
+end;
+
+procedure TBottlePrefs.SetSenderWindowPosition(const Value: TRect);
+begin
+  FSenderWindowPosition := Value;
+end;
+
+procedure TBottlePrefs.SetServerPort(const Value: integer);
+begin
+  if Value > 0 then FServerPort := Value;
+end;
+
+procedure TBottlePrefs.SetShowConstBar(const Value: boolean);
+begin
+  FShowConstBar := Value;
+end;
+
+procedure TBottlePrefs.SetShowToolBar(const Value: boolean);
+begin
+  FShowToolBar := Value;
+end;
+
+procedure TBottlePrefs.SetSilentWhenHidden(const Value: boolean);
+begin
+  FSilentWhenHidden := Value;
+end;
+
+procedure TBottlePrefs.SetStayOnTop(const Value: boolean);
+begin
+  FStayOnTop := Value;
+end;
+
+procedure TBottlePrefs.SetTabPosition(const Value: TTabPosition);
+begin
+  FTabPosition := Value;
+end;
+
+procedure TBottlePrefs.SetTalkColorH(const Value: TColor);
+begin
+  FTalkColorH := Value;
+end;
+
+procedure TBottlePrefs.SetTalkColorU(const Value: TColor);
+begin
+  FTalkColorU := Value;
+end;
+
+procedure TBottlePrefs.SetUseHttpProxy(const Value: boolean);
+begin
+  FUseHttpProxy := Value;
+end;
+
+procedure TBottlePrefs.SetUsePort(const Value: boolean);
+begin
+  FUsePort := Value;
+end;
+
+procedure TBottlePrefs.SetWaitScriptEnd(const Value: integer);
+begin
+  if Value > 0 then FWaitScriptEnd := Value;
+end;
+
+procedure TBottlePrefs.SetWhenCtrlReturn(const Value: TReturnKeyFunction);
+begin
+  FWhenCtrlReturn := Value;
+end;
+
+procedure TBottlePrefs.SetWhenReturn(const Value: TReturnKeyFunction);
+begin
+  FWhenReturn := Value;
+end;
+
+procedure TBottlePrefs.SetWhenShiftReturn(const Value: TReturnKeyFunction);
+begin
+  FWhenShiftReturn := Value;
+end;
+
+{ TChannnelPrefs }
+
+procedure TChannelPrefs.Load(AnIni: TIniFile; ChannelName: String;
+  Default: boolean = false);
+var S: String;
+begin
+  if not Default then S := 'CH_' + ChannelName else S := ChannelName;
+  Self.ChannelName := ChannelName;
+  UseChannelPrefs := AnIni.ReadBool(S, 'UseChannelPrefs', false);
+  SoundArrived := TSoundArrived(AnIni.ReadInteger(S, 'SoundArrived', 0));
+  SoundFile := AnIni.ReadString(S, 'SoundFile', '');
+  TargetGhost := AnIni.ReadString(S, 'TargetGhost', '');
+  IgnoreIfGhost := AnIni.ReadBool(S, 'IgnoreIfGhost', false);
+  CanAutoAdd := AnIni.ReadBool(S, 'CanAutoAdd', false);
+  WarnPost := AnIni.ReadBool(S, 'WarnPost', false);
+end;
+
+procedure TChannelPrefs.Save(AnIni: TIniFile; Default: boolean = false);
+var S: String;
+begin
+  if not Default then S := 'CH_' + ChannelName else S := ChannelName;
+  AnIni.WriteBool(S, 'UseChannelPrefs', UseChannelPrefs);
+  AnIni.WriteInteger(S, 'SoundArrived', Ord(SoundArrived));
+  AnIni.WriteString(s, 'SoundFile', SoundFile);
+  AnIni.WriteString(S, 'TargetGhost', TargetGhost);
+  AnIni.WriteBool(S, 'IgnoreIfGhost', IgnoreIfGhost);
+  AnIni.WriteBool(S, 'CanAutoAdd', CanAutoAdd);
+  AnIni.WriteBool(S, 'WarnPost', WarnPost);
+end;
+
+procedure TChannelPrefs.SetCanAutoAdd(const Value: boolean);
+begin
+  FCanAutoAdd := Value;
+end;
+
+procedure TChannelPrefs.SetChannelName(const Value: String);
+begin
+  FChannelName := Value;
+end;
+
+procedure TChannelPrefs.SetIgnoreIfGhost(const Value: boolean);
+begin
+  FIgnoreIfGhost := Value;
+end;
+
+procedure TChannelPrefs.SetSoundArrived(const Value: TSoundArrived);
+begin
+  FSoundArrived := Value;
+end;
+
+procedure TChannelPrefs.SetSoundFile(const Value: String);
+begin
+  FSoundFile := Value;
+end;
+
+procedure TChannelPrefs.SetTargetGhost(const Value: String);
+begin
+  FTargetGhost := Value;
+end;
+
+procedure TChannelPrefs.SetUseChannelPrefs(const Value: boolean);
+begin
+  FUseChannelPrefs := Value;
+end;
+
+{ TChannelListItem }
+
+procedure TChannelListItem.SetGhost(const Value: String);
+begin
+  FGhost := Value;
+end;
+
+procedure TChannelListItem.SetInfo(const Value: String);
+begin
+  FInfo := Value;
+end;
+
+procedure TChannelListItem.SetMembers(const Value: integer);
+begin
+  FMembers := Value;
+end;
+
+procedure TChannelListItem.SetName(const Value: String);
+begin
+  FName := Value;
+end;
+
+procedure TChannelListItem.SetNoPost(const Value: boolean);
+begin
+  FNoPost := Value;
+end;
+
+procedure TChannelListItem.SetWarnPost(const Value: boolean);
+begin
+  FWarnPost := Value;
+end;
+
+{ TChannelList }
+
+procedure TChannelList.Clear;
+var i: integer;
+begin
+  for i := Self.Count-1 downto 0 do begin
+    TChannelListItem(Self[i]).Free;
+  end;
+  inherited;
+end;
+
+function TChannelList.GetChannel(Name: String): TChannelListItem;
+var i: integer;
+begin
+  Result := nil;
+  for i := 0 to Count-1 do
+    if TChannelListItem(Self[i]).Name = Name then begin
+      Result := TChannelListItem(Self[i]);
+      Exit;
+    end;
+end;
+
+function TChannelList.GetChannelItem(Index: integer): TChannelListItem;
+begin
+  Result := TChannelListItem(Self[Index]);
+end;
+
+{ TID2Ghost }
+
+procedure TID2Ghost.AddIdGhost(const ID: integer; const Ghost, Channel, MID: String);
+begin
+  AddObject(Ghost+#1+Channel+#1+MID, pointer(ID));
+end;
+
+procedure TID2Ghost.DeleteIdGhost(const ID: integer);
+var i: integer;
+begin
+  for i := Count-1 downto 0 do
+    if integer(Objects[i]) = ID then Delete(i);
+end;
+
+procedure TID2Ghost.GetIdGhost(const ID: integer; var Ghost: String;
+ var Channel: String; var MID: String);
+var i: integer;
+    s: String;
+begin
+  for i := Count-1 downto 0 do
+    if integer(Objects[i]) = ID then begin
+      s := Self[i];
+      Ghost := Copy(s, 1, Pos(#1, s)-1);
+      System.Delete(s, 1, Pos(#1, s));
+      Channel := Copy(s, 1, Pos(#1, s)-1);
+      System.Delete(s, 1, Pos(#1, s));
+      MID := s;
+      Exit;
+    end;
+end;
+
+procedure TChannelPrefs.SetWarnPost(const Value: boolean);
+begin
+  FWarnPost := Value;
+end;
+
+
+initialization
+
+try
+  RegExp := TBRegExp.Create;
+except
+  ShowMessage('RegExp\8aJ\8en\83G\83\89\81[');
+  Application.Terminate;
+end;
+Pref := TBottlePrefs.Create;
+
+finalization
+
+Pref.Free;
+RegExp.Free;
+
+end.
diff --git a/bottleclient/ChannelListForm.dfm b/bottleclient/ChannelListForm.dfm
new file mode 100755 (executable)
index 0000000..352de96
--- /dev/null
@@ -0,0 +1,120 @@
+object frmChannelList: TfrmChannelList
+  Left = 245
+  Top = 323
+  Width = 499
+  Height = 307
+  BorderIcons = [biSystemMenu]
+  Caption = '\83`\83\83\83\93\83l\83\8b\91I\91ð'
+  Color = clBtnFace
+  Constraints.MinHeight = 300
+  Constraints.MinWidth = 300
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poDesktopCenter
+  Scaled = False
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 12
+  object lvwChannels: TListView
+    Left = 0
+    Top = 25
+    Width = 491
+    Height = 214
+    Align = alClient
+    Checkboxes = True
+    Columns = <
+      item
+        Caption = '\83`\83\83\83\93\83l\83\8b\96¼'
+        Width = 100
+      end
+      item
+        Caption = '\90l\90\94'
+      end
+      item
+        Caption = '\90à\96¾'
+        Width = 200
+      end
+      item
+        Caption = '\83S\81[\83X\83g'
+        Width = 80
+      end
+      item
+        Caption = '\8eí\97Þ'
+      end>
+    HideSelection = False
+    ReadOnly = True
+    RowSelect = True
+    TabOrder = 0
+    ViewStyle = vsReport
+    OnColumnClick = lvwChannelsColumnClick
+    OnCompare = lvwChannelsCompare
+  end
+  object pnlTop: TPanel
+    Left = 0
+    Top = 0
+    Width = 491
+    Height = 25
+    Align = alTop
+    Alignment = taLeftJustify
+    BevelOuter = bvNone
+    Caption = '\8eQ\89Á\82·\82é\83`\83\83\83\93\83l\83\8b\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢'
+    TabOrder = 1
+  end
+  object pnlBottom: TPanel
+    Left = 0
+    Top = 239
+    Width = 491
+    Height = 41
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 2
+    object btnOk: TButton
+      Left = 406
+      Top = 8
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Caption = '&OK'
+      Default = True
+      ModalResult = 1
+      TabOrder = 0
+      OnClick = btnOkClick
+    end
+    object btnSelectAll: TButton
+      Left = 7
+      Top = 8
+      Width = 90
+      Height = 25
+      Anchors = [akLeft, akBottom]
+      Caption = '\82·\82×\82Ä\91I\91ð(&A)'
+      TabOrder = 1
+      OnClick = btnSelectAllClick
+    end
+    object btnCancel: TButton
+      Left = 326
+      Top = 8
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Cancel = True
+      Caption = '\83L\83\83\83\93\83Z\83\8b(&C)'
+      ModalResult = 2
+      TabOrder = 2
+    end
+    object btnSelectNone: TButton
+      Left = 103
+      Top = 8
+      Width = 90
+      Height = 25
+      Anchors = [akLeft, akBottom]
+      Caption = '\82·\82×\82Ä\89ð\8f\9c(&D)'
+      TabOrder = 3
+      OnClick = btnSelectNoneClick
+    end
+  end
+end
diff --git a/bottleclient/ChannelListForm.pas b/bottleclient/ChannelListForm.pas
new file mode 100755 (executable)
index 0000000..297d36a
--- /dev/null
@@ -0,0 +1,128 @@
+unit ChannelListForm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  StdCtrls, ExtCtrls, ComCtrls, BottleDef;
+
+type
+  TfrmChannelList = class(TForm)
+    lvwChannels: TListView;
+    pnlTop: TPanel;
+    pnlBottom: TPanel;
+    btnOk: TButton;
+    btnSelectAll: TButton;
+    btnCancel: TButton;
+    btnSelectNone: TButton;
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure btnOkClick(Sender: TObject);
+    procedure btnSelectAllClick(Sender: TObject);
+    procedure btnSelectNoneClick(Sender: TObject);
+    procedure lvwChannelsColumnClick(Sender: TObject; Column: TListColumn);
+    procedure lvwChannelsCompare(Sender: TObject; Item1, Item2: TListItem;
+      Data: Integer; var Compare: Integer);
+  private
+    { Private \90é\8c¾ }
+    FTempJoinList: TStringList;
+    SortColumn: integer;  //\97ñ\83N\83\8a\83b\83N\83\\81[\83g\97p
+    SortDesc: boolean;    //\97ñ\83N\83\8a\83b\83N\83\\81[\83g\97p
+  public
+    { Public \90é\8c¾ }
+    function Execute(List: TChannelList; Join: TStringList): boolean;
+    property JoinList: TStringList read FTempJoinList;
+  end;
+
+var
+  frmChannelList: TfrmChannelList;
+
+implementation
+
+{$R *.DFM}
+
+{ TfrmChannelList }
+
+function TfrmChannelList.Execute(List: TChannelList; Join: TStringList): boolean;
+var i: integer;
+    Item: TListItem;
+begin
+  lvwChannels.Items.Clear;
+  for i := 0 to List.Count-1 do begin
+    Item := lvwChannels.Items.Add;
+    Item.Caption := List.ChannelItem[i].Name;
+    Item.SubItems.Add(IntToStr(List.ChannelItem[i].Members));
+    Item.SubItems.Add(List.ChannelItem[i].Info);
+    Item.SubItems.Add(List.ChannelItem[i].Ghost);
+    if List.ChannelItem[i].NoPost then
+      Item.SubItems.Add('\8eó\90M\90ê\97p')
+    else
+      Item.SubItems.Add('\92Ê\8fí');
+    if Join.IndexOf(Item.Caption) >= 0 then Item.Checked := true; 
+  end;
+  Result := (ShowModal = mrOk);
+end;
+
+procedure TfrmChannelList.FormCreate(Sender: TObject);
+begin
+  FTempJoinList := TStringList.Create;
+end;
+
+procedure TfrmChannelList.FormDestroy(Sender: TObject);
+begin
+  FTempJoinList.Free;
+end;
+
+procedure TfrmChannelList.btnOkClick(Sender: TObject);
+var i: integer;
+begin
+  FTempJoinList.Clear;
+  for i := 0 to lvwChannels.Items.Count-1 do begin
+    if lvwChannels.Items[i].Checked then
+      FTempJoinList.Add(lvwChannels.Items[i].Caption);
+  end;
+end;
+
+procedure TfrmChannelList.btnSelectAllClick(Sender: TObject);
+var i: integer;
+begin
+  for i := 0 to lvwChannels.Items.Count-1 do begin
+    lvwChannels.Items[i].Checked := true;
+  end;
+end;
+
+procedure TfrmChannelList.btnSelectNoneClick(Sender: TObject);
+var i: integer;
+begin
+  for i := 0 to lvwChannels.Items.Count-1 do begin
+    lvwChannels.Items[i].Checked := false;
+  end;
+end;
+
+procedure TfrmChannelList.lvwChannelsColumnClick(Sender: TObject;
+  Column: TListColumn);
+begin
+  if SortColumn = Column.Index then
+    SortDesc := not SortDesc
+  else begin
+    SortColumn := Column.Index;
+    SortDesc := false;
+  end;
+  lvwChannels.AlphaSort;
+end;
+
+procedure TfrmChannelList.lvwChannelsCompare(Sender: TObject; Item1,
+  Item2: TListItem; Data: Integer; var Compare: Integer);
+var
+  ix: Integer;
+begin
+  if SortColumn = 0 then
+    Compare := CompareText(Item1.Caption,Item2.Caption)
+  else begin
+   ix := SortColumn - 1;
+   Compare := AnsiCompareStr(Item1.SubItems[ix],Item2.SubItems[ix]);
+  end;
+  if SortDesc then Compare := -Compare; //\8f¸\8f\87
+end;
+
+end.
diff --git a/bottleclient/ConstEditor.dfm b/bottleclient/ConstEditor.dfm
new file mode 100755 (executable)
index 0000000..992db85
--- /dev/null
@@ -0,0 +1,478 @@
+object frmConstEditor: TfrmConstEditor
+  Left = 315
+  Top = 201
+  Width = 279
+  Height = 388
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSizeToolWin
+  Caption = '\92è\8c^\8bå\83p\83\8c\83b\83g'
+  Color = clBtnFace
+  Constraints.MinHeight = 100
+  Constraints.MinWidth = 100
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  ShowHint = True
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 12
+  object tvwConst: TTreeView
+    Left = 0
+    Top = 22
+    Width = 271
+    Height = 320
+    Align = alClient
+    HideSelection = False
+    Images = imgIcon
+    Indent = 19
+    PopupMenu = PopUpMenu
+    RightClickSelect = True
+    RowSelect = True
+    ShowRoot = False
+    TabOrder = 0
+    OnChange = tvwConstChange
+    OnDblClick = tvwConstDblClick
+    OnEdited = tvwConstEdited
+  end
+  object StatusBar: TStatusBar
+    Left = 0
+    Top = 342
+    Width = 271
+    Height = 19
+    Panels = <>
+    SimplePanel = True
+  end
+  object ToolBar1: TToolBar
+    Left = 0
+    Top = 0
+    Width = 271
+    Height = 22
+    AutoSize = True
+    Caption = 'ToolBar1'
+    EdgeBorders = []
+    Flat = True
+    Images = imgIcon
+    TabOrder = 2
+    object tbtnNewGroup: TToolButton
+      Left = 0
+      Top = 0
+      Action = actNewGroup
+    end
+    object tbtnAddConst: TToolButton
+      Left = 23
+      Top = 0
+      Action = actNewConst
+    end
+    object tbtnEditConst: TToolButton
+      Left = 46
+      Top = 0
+      Action = actEditConst
+    end
+    object tbtnDelete: TToolButton
+      Left = 69
+      Top = 0
+      Action = actDelete
+    end
+    object btbnUp: TToolButton
+      Left = 92
+      Top = 0
+      Action = actMoveUp
+    end
+    object tbtnDown: TToolButton
+      Left = 115
+      Top = 0
+      Action = actMoveDown
+    end
+    object tbtnInsert: TToolButton
+      Left = 138
+      Top = 0
+      Action = actInsert
+    end
+    object tbtnSeparator: TToolButton
+      Left = 161
+      Top = 0
+      Width = 8
+      Caption = 'tbtnSeparator'
+      ImageIndex = 8
+      Style = tbsSeparator
+    end
+    object tbtnDblClkInsert: TToolButton
+      Left = 169
+      Top = 0
+      Hint = '\83_\83u\83\8b\83N\83\8a\83b\83N\8e\9e\82Ì\93®\8dì\81c\92è\8c^\8bå\91}\93ü/\92è\8c^\8bå\95Ò\8fW'
+      Caption = '\83_\83u\83\8b\83N\83\8a\83b\83N\8e\9e\82É\91}\93ü'
+      ImageIndex = 6
+      Style = tbsCheck
+      OnClick = tbtnDblClkInsertClick
+    end
+  end
+  object imgIcon: TImageList
+    Left = 224
+    Top = 64
+    Bitmap = {
+      494C010109000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000004000000001001000000000000020
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D8B3D8B3D8B3D8B3D8B3D8B3D
+      8B3D8B3D8B3D8B3D8B3D8B3D8B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596FE07F0000E07F0000E07F
+      0000E07F0000E07F0000E07F8B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596F0000E07F0000E07F0000
+      E07F0000E07F0000E07F00008B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596FE07F0000E07F0000E07F
+      0000E07F0000E07F0000E07F8B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596F0000E07F0000E07F0000
+      E07F0000E07F0000E07F00008B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596FE07F0000E07F0000E07F
+      0000E07F0000E07F0000E07F8B3D000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596F0000E07F0000E07F0000
+      E07F0000E07F00008B3D596F8B3D596F00000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596FE07F0000E07F0000E07F
+      0000E07F0000596F8B3DE07F596F8B3DE07F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D596F596F596F596F596F596F
+      596F596F596F8B3D596F596F8B3DE07F00000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008B3D0000E07F0000E07F0000E07F
+      00008B3D8B3D8B3D596FE07F596F8B3D8B3D0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000008B3D0000E07F0000E07F0000
+      8B3D596FE07F8B3DE07F596FE07F596F596F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000008B3D8B3D8B3D8B3D8B3D
+      8B3D00008B3D596F8B3DE07F8B3DE07F00000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00008B3D596F00008B3D596F00008B3DE07F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E07F000000008B3DE07F000000008B3D0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001000104200000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001000100010420000000000000000000000000000000000000000
+      0000080000000000080000000040000000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001000100010001042000000000000000000000000000000000000
+      0000080000000000080000000040004000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001000100010001000104200000000000000000000000000000000
+      0000080008000800080000000040004000400000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000FF7FFF7FFF7FFF7FFF7FFF7F
+      FF7FFF7FFF7F1000100010001000100000000000000000000000000000000000
+      0000080000000000080000000040004000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000000000
+      1002000000000000000000000000000000000000FF7F00000000000000000000
+      0000000000001000100010001000000000000000000000000000000000000000
+      0000000008000800000000000040000000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000001002
+      1002100200000000000000000000000000000000FF7FFF7F000000000000FF7F
+      0000000000001000100010000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000010021002
+      1002100210020000000000000000000000000000FF7F00001042104210420000
+      1042104210421000100000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000100210021002
+      1002100210021002000000000000000000000000FF7FFF7FFF7F1042FF7FFF7F
+      FF7F104210421000FF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000104218631042
+      1863104218631042186300000000000000000000000000000000000000001002
+      1002100200000000000000000000000000000000FF7F00000000104210421042
+      1042104210420000FF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000104210421042
+      1042104210421042104200000000000000000000000000000000000000001002
+      1002100200000000000000000000000000000000FF7FFF7FFF7FFF7F1042FF7F
+      104210420000FF7FFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000001002
+      1002100200000000000000000000000000000000FF7F0000000000001042FF7F
+      1042104200000000FF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000018631863186318631863
+      1863186318631863186318631863000000000000000000000000000000001002
+      1002100200000000000000000000000000000000FF7FFF7FFF7FFF7FFF7F1042
+      10420000FF7FFF7FFF7F000000000000000000000000007C000000000000007C
+      0000000000000000000000000000000000000000000010421042104210421042
+      1042104210421042104210421863000000000000000000000000000000000000
+      0000000000000000000000000000000000000000FF7F00000000000000001042
+      1042000000000000FF7F00000000000000000000007C0000007C0000007C0000
+      007C0000007C0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000FF7FFF7FFF7FFF7FFF7FFF7F
+      FF7FFF7FFF7FFF7FFF7F0000000000000000007C000000000000007C00000000
+      0000007C007C0000000000000000000000000000000000000000000000001042
+      1042104210420000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      007C007C007C0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000010421042104210421042
+      1042104210421042104210420000000000000000000010421042104210421042
+      1042104210421042104210420000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000104210421042104210421042
+      1042104210421042104210421042104200000000000010420000000000000000
+      0000000000000000000010420000000000000000000010420000000000000000
+      0000000000000000000010420000000000000000000000000000000000000000
+      00000000000000000000000000000000000000001042FF7FE07F0000E07F0000
+      E07F0000E07F0000E07F0000E07F1042000000000000104200001F001F001F00
+      00001F001F001F000000104200000000000000000000104200001F001F001F00
+      00001F001F001F00000010420000000000000000000000000000000000001002
+      10021002000000000000000000000000000000001042FF7F0000E07F0000E07F
+      0000E07F0000E07F0000E07F0000104200000000000010420000000000000000
+      0000000000000000000010420000000000000000000010420000000000000000
+      0000000000000000000010420000000000000000000000000000000000001002
+      10021002000000000000000000000000000000001042FF7FE07F0000E07F0000
+      E07F0000E07F0000E07F0000E07F1042000000000000104200001F0000001F00
+      1F0000001F001F000000104200000000000000000000104200001F0000001F00
+      1F0000001F001F00000010420000000000000000000000000000000000001002
+      10021002000000000000000000000000000000001042FF7F0000E07F0000E07F
+      0000E07F0000E07F0000E07F0000104200000000000010420000000000000000
+      0000000000000000000010420000000000000000000010420000000000000000
+      0000000000000000000000000000000000000000000000000000000000001002
+      10021002000000000000000000000000000000001042FF7FE07F0000E07F0000
+      E07F0000E07F0000E07F0000E07F1042000000000000104200001F001F001F00
+      00001F0000001F000000104200000000000000000000104200001F001F001F00
+      00001F0000000000007C007C0000000000000000000000000000100210021002
+      10021002100210020000000000000000000000001042FF7F0000E07F0000E07F
+      0000E07F0000E07F0000E07F0000104200000000000010420000000000000000
+      0000000000000000000010420000000000000000000010420000000000000000
+      0000000000000000007C007C0000000000000000000000000000000010021002
+      10021002100200000000000000000000000000001042FF7FE07F0000E07F0000
+      E07F0000E07F0000E07F0000E07F1042000000000000104200001F0000001F00
+      1F001F00000000001042104200000000000000000000104200001F0000001F00
+      1F000000007C007C007C007C007C007C00000000000000000000000000001002
+      10021002000000000000000000000000000000001042FF7FFF7FFF7FFF7FFF7F
+      FF7FFF7FFF7FFF7FFF7FFF7FFF7F104200000000000010420000000000000000
+      0000000000001042104210420000000000000000000010420000000000000000
+      00000000007C007C007C007C007C007C00000000000000000000000000000000
+      10020000000000000000000000000000000000001042E07F0000E07F0000E07F
+      0000E07F104210421042104210421042000000000000104200001F001F000000
+      1F001F00000010420000104200000000000000000000104200001F001F000000
+      1F00000000000000007C007C0000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000001042E07F0000E07F0000
+      E07F104200000000000000000000000000000000000010420000000000000000
+      0000000000001042104200000000000000000000000010420000000000000000
+      0000000000000000007C007C0000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000001042104210421042
+      1042000000000000000000000000000000000000000010421042104210421042
+      1042104210421042000000000000000000000000000010421042104210421042
+      1042104210420000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000400000000100010000000000000200000000000000000000
+      000000000000000000000000FFFFFF0000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000080010000000000000001000000000000
+      15510000000000002AA900000000000015510000000000002AA9000000000000
+      15510000000000002AA100000000000015400000000000000001000000000000
+      5500000000000000AA00000000000000C081000000000000FF24000000000000
+      FF66000000000000FFFF000000000000FFFFFFCFFFFFF00FFFFFFFC71F6BE007
+      FFFFFFC3EF69E007FFFF0001EF08E007FEFF00018369E007FC7F3FC37D9BE007
+      F83F1DC77DFFE007F01F22077DFFE007E00F000745FFE007C007302755FFE007
+      F83F004755FFC003F83F386783FF8001F83F0087DDFF8001F83F3CE7AABFC003
+      FFFF0007773FF81FFFFF0007FE3FFC3FFFFFFFFFFFFFFFFFFFFFE003E003FFFF
+      C000C003C003FFFF8000DFF3DFF3F83F8AA8D113D113F83F9554DFF3DFF3F83F
+      8AA8D493D493F83F9554DFF3DFC3C0078AA8D153D143E00F9554DFF3DF00F01F
+      8AA8D463D400F83F8000DFC3DF00FC7F9501D257D200FEFFCA7FDFCFDFC3FFFF
+      E0FFC01FC003FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
+      000000000000}
+  end
+  object ActionList1: TActionList
+    Images = imgIcon
+    Left = 192
+    Top = 64
+    object actNewGroup: TAction
+      Caption = '\90V\8bK\83O\83\8b\81[\83v'
+      Hint = '\90V\8bK\83O\83\8b\81[\83v'
+      ImageIndex = 8
+      ShortCut = 16429
+      OnExecute = actNewGroupExecute
+    end
+    object actNewConst: TAction
+      Caption = '\92è\8c^\8bå\92Ç\89Á'
+      Hint = '\92è\8c^\8bå\92Ç\89Á'
+      ImageIndex = 2
+      ShortCut = 45
+      OnExecute = actAddExecute
+    end
+    object actEditConst: TAction
+      Caption = '\92è\8c^\8bå\95Ò\8fW'
+      Hint = '\92è\8c^\8bå\95Ò\8fW'
+      ImageIndex = 1
+      OnExecute = actEditConstExecute
+    end
+    object actDelete: TAction
+      Caption = '\8dí\8f\9c'
+      Hint = '\8dí\8f\9c'
+      ImageIndex = 7
+      ShortCut = 46
+      OnExecute = actDeleteExecute
+    end
+    object actMoveUp: TAction
+      Caption = '\8fã\82Ö'
+      Hint = '\8fã\82Ö\88Ú\93®'
+      ImageIndex = 3
+      ShortCut = 16422
+      OnExecute = actMoveUpExecute
+    end
+    object actMoveDown: TAction
+      Caption = '\89º\82Ö'
+      Hint = '\89º\82Ö\88Ú\93®'
+      ImageIndex = 4
+      ShortCut = 16424
+      OnExecute = actMoveDownExecute
+    end
+    object actInsert: TAction
+      Caption = '\91}\93ü'
+      ImageIndex = 5
+      ShortCut = 13
+      OnExecute = actInsertExecute
+    end
+  end
+  object PopUpMenu: TPopupMenu
+    Images = imgIcon
+    OnPopup = PopUpMenuPopup
+    Left = 160
+    Top = 64
+    object mnInsert: TMenuItem
+      Action = actInsert
+    end
+    object N5: TMenuItem
+      Caption = '-'
+    end
+    object mnNewGroup: TMenuItem
+      Action = actNewGroup
+    end
+    object mnAddConst: TMenuItem
+      Action = actNewConst
+    end
+    object mnEditConst: TMenuItem
+      Action = actEditConst
+    end
+    object mnDelete: TMenuItem
+      Action = actDelete
+    end
+    object mnUp: TMenuItem
+      Action = actMoveUp
+    end
+    object mnDown: TMenuItem
+      Action = actMoveDown
+    end
+  end
+end
diff --git a/bottleclient/ConstEditor.pas b/bottleclient/ConstEditor.pas
new file mode 100755 (executable)
index 0000000..5c2fe51
--- /dev/null
@@ -0,0 +1,370 @@
+unit ConstEditor;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  StdCtrls, Buttons, ImgList, ComCtrls, ConstList, Menus, BottleDef,
+  ActnList, ToolWin, ExtCtrls;
+
+type
+  TfrmConstEditor = class(TForm)
+    tvwConst: TTreeView;
+    imgIcon: TImageList;
+    StatusBar: TStatusBar;
+    ToolBar1: TToolBar;
+    tbtnEditConst: TToolButton;
+    tbtnNewGroup: TToolButton;
+    tbtnAddConst: TToolButton;
+    tbtnDelete: TToolButton;
+    btbnUp: TToolButton;
+    tbtnDown: TToolButton;
+    ActionList1: TActionList;
+    actNewGroup: TAction;
+    actNewConst: TAction;
+    actEditConst: TAction;
+    actDelete: TAction;
+    actMoveUp: TAction;
+    actMoveDown: TAction;
+    PopUpMenu: TPopupMenu;
+    mnNewGroup: TMenuItem;
+    mnAddConst: TMenuItem;
+    mnEditConst: TMenuItem;
+    mnDelete: TMenuItem;
+    mnUp: TMenuItem;
+    mnDown: TMenuItem;
+    tbtnInsert: TToolButton;
+    actInsert: TAction;
+    mnInsert: TMenuItem;
+    N5: TMenuItem;
+    tbtnSeparator: TToolButton;
+    tbtnDblClkInsert: TToolButton;
+    procedure actEditConstExecute(Sender: TObject);
+    procedure actDeleteExecute(Sender: TObject);
+    procedure tvwConstEdited(Sender: TObject; Node: TTreeNode;
+      var S: String);
+    procedure actAddExecute(Sender: TObject);
+    procedure actNewGroupExecute(Sender: TObject);
+    procedure actMoveUpExecute(Sender: TObject);
+    procedure actMoveDownExecute(Sender: TObject);
+    procedure tvwConstChange(Sender: TObject; Node: TTreeNode);
+    procedure FormCreate(Sender: TObject);
+    procedure Notify;
+    procedure actInsertExecute(Sender: TObject);
+    procedure tbtnDblClkInsertClick(Sender: TObject);
+    procedure tvwConstDblClick(Sender: TObject);
+    procedure PopUpMenuPopup(Sender: TObject);
+  private
+    { Private \90é\8c¾ }
+    FOrigCaption: String;
+  public
+    { Public \90é\8c¾ }
+    procedure Execute;
+    procedure BuildMenu(Root: TMenuItem; Event: TNotifyEvent);
+    procedure LoadFromFile(const FileName: String);
+    procedure SaveToFile(const FileName: String);
+    function GetTextById(Id: integer): String;
+  end;
+
+  TCanvasSpeedButton = class(TSpeedButton)
+  protected
+    property Canvas;
+  end;
+
+var
+  frmConstEditor: TfrmConstEditor;
+
+implementation
+
+uses ConstText, MainForm;
+
+{$R *.DFM}
+
+{ TfrmConstEditor }
+
+
+
+procedure TfrmConstEditor.Execute;
+begin
+  Show;
+end;
+
+procedure TfrmConstEditor.actEditConstExecute(Sender: TObject);
+var Node: TTreeNode;
+begin
+  if tvwConst.Selected <> nil then begin
+    Node := tvwConst.Selected;
+    if Node.Level <> 0 then begin
+      frmConstText.Target := TConstText(Node.Data);
+      if frmConstText.Execute then
+        Node.Text := TConstText(Node.Data).Caption;
+    end;
+  end;
+  Notify;
+end;
+
+procedure TfrmConstEditor.actDeleteExecute(Sender: TObject);
+var Node: TTreeNode;
+    i: integer;
+begin
+  if tvwConst.Selected = nil then Exit;
+  Node := tvwConst.Selected;
+  if Node.Level = 0 then begin
+    if Node.HasChildren then begin
+      if MessageDlg(Node.Text + '\82É\91®\82·\82é' + IntToStr(Node.Count) + '\8cÂ\82Ì\92è\8c^\8bå\82ð\8dí\8f\9c\82µ\82Ü\82·\82©?',
+                    mtConfirmation, mbOkCancel, 0) = mrCancel then Exit;
+      for i := Node.Count-1 to 0 do begin
+        TConstText(Node.Item[i]).Free;
+      end;
+    end;
+  end;
+  TConstText(Node.Data).Free;
+  tvwConst.Items.Delete(Node);
+  Notify;
+end;
+
+procedure TfrmConstEditor.tvwConstEdited(Sender: TObject; Node: TTreeNode;
+  var S: String);
+begin
+  TConstText(Node.Data).Caption := S;
+  Notify;
+end;
+
+procedure TfrmConstEditor.actAddExecute(Sender: TObject);
+var Node, NewNode: TTreeNode;
+begin
+  Node := tvwConst.Selected;
+  if Node.Level <> 0 then Node := Node.Parent;
+  frmConstText.Target := nil;
+  if frmConstText.Execute then begin
+    NewNode := tvwConst.Items.AddChildFirst(Node, frmConstText.Target.Caption);
+    NewNode.ImageIndex := 1;
+    NewNode.SelectedIndex := 1;
+    NewNode.Data := frmConstText.Target;
+  end;
+  Notify;
+end;
+
+procedure TfrmConstEditor.actNewGroupExecute(Sender: TObject);
+var NewParent: TConstText;
+    NewNode: TTreeNode;
+begin
+  NewParent := TConstText.Create;
+  NewParent.Caption := '\90V\82µ\82¢\83O\83\8b\81[\83v';
+  NewParent.IsParent := true;
+  NewNode := tvwConst.Items.Add(nil, '\90V\82µ\82¢\83O\83\8b\81[\83v');
+  NewNode.Data := NewParent;
+  Notify;
+end;
+
+procedure TfrmConstEditor.actMoveUpExecute(Sender: TObject);
+var Node, DestNode: TTreeNode;
+begin
+  Node := tvwConst.Selected;
+  if Node.getPrevSibling <> nil then begin
+    DestNode := Node.getPrevSibling;
+    Node.MoveTo(DestNode, naInsert);
+  end else if Node.Level = 1 then begin
+    //\91O\82Ì\83O\83\8b\81[\83v\82Ì\96\96\94ö\82É\88Ú\93®\82·\82é
+    if Node.Parent.getPrevSibling = nil then Exit;
+    DestNode := Node.Parent.getPrevSibling;
+    Node.MoveTo(DestNode, naAddChild);
+  end;
+  Notify;
+end;
+
+procedure TfrmConstEditor.BuildMenu(Root: TMenuItem; Event: TNotifyEvent);
+var i: integer;
+    Menu1, Menu2: TMenuItem;
+    Text: TConstText;
+begin
+  Menu1 := nil;
+  for i := Root.Count-1 downto 0 do begin
+    if Root.Items[i].Tag >= 0 then begin
+      Root.Items[i].Free;
+    end;
+  end;
+  for i := 0 to tvwConst.Items.Count-1 do begin
+    Text := TConstText(tvwConst.Items[i].Data);
+    if Text.IsParent then begin
+      if Menu1 <> nil then
+        if Menu1.Count = 0 then Menu1.Enabled := false;
+      Menu1 := TMenuItem.Create(Root);
+      Menu1.Caption := Text.Caption;
+      Menu1.Hint    := Text.Caption;
+      Menu1.AutoHotkeys := maManual;
+      Menu1.Tag := i;
+      Root.Add(Menu1);
+    end else begin
+      if Menu1 = nil then Continue;
+      Menu2 := TMenuItem.Create(Root);
+      Menu2.Caption := Text.Caption;
+      Menu2.Hint := Text.ConstText;
+      if Text.ShortCut <> 0 then Menu2.Hint := Menu2.Hint
+        + ' (' + ShortCutToText(Text.ShortCut) + ')';
+      Menu2.ShortCut := Text.ShortCut;
+      Menu2.OnClick := Event;
+      Menu2.AutoHotkeys := maManual;
+      Menu2.Tag := i;
+      Menu1.Add(Menu2);
+    end;
+  end;
+  if Menu1 <> nil then
+    if Menu1.Count = 0 then Menu1.Enabled := false;
+end;
+
+procedure TfrmConstEditor.LoadFromFile(const FileName: String);
+var Str: TStringList;
+    cap, txt, sht: String;
+    i: integer;
+    Text: TConstText;
+    ParentNode, NewNode: TTreeNode;
+begin
+  Str := TStringList.Create;
+  ParentNode := nil;
+  try
+    Str.LoadFromFile(FileName);
+    for i := 0 to Str.Count-1 do begin
+      Text := TConstText.Create;
+      if Str[i][1] = #9 then begin
+        if ParentNode = nil then Continue;
+        if RegExp.Match('m/^\t\t/', Str[i]) then begin
+          if RegExp.Match('m/^\t\t(.+)\t(.+)$/', Str[i]) then begin
+            sht := '';
+            cap := RegExp[1];
+            txt := RegExp[2];
+          end;
+        end else begin
+          if RegExp.Match('m/^\t(.+)\t(.+)\t(.+)$/', Str[i]) then begin
+            sht := RegExp[1];
+            cap := RegExp[2];
+            txt := RegExp[3];
+          end;
+        end;
+        Text.ShortCut := TextToShortCut(sht);
+        Text.Caption := cap;
+        Text.ConstText := txt;
+        NewNode := tvwConst.Items.AddChild(ParentNode, cap);
+        NewNode.ImageIndex := 1;
+        NewNode.SelectedIndex := 1;
+        NewNode.Data := Text;
+      end else begin
+        Text := TConstText.Create;
+        Text.IsParent := true;
+        Text.Caption := Str[i];
+        ParentNode := tvwConst.Items.Add(nil, Str[i]);
+        ParentNode.Data := Text;
+      end;
+    end;
+  finally
+    Str.Free;
+  end;
+
+end;
+
+procedure TfrmConstEditor.SaveToFile(const FileName: String);
+var i: integer;
+    Str: TStringList;
+    S: String;
+    Text: TConstText;
+begin
+  Str := TStringList.Create;
+  try
+    for i := 0 to tvwConst.Items.Count-1 do begin
+      Text := TConstText(tvwConst.Items[i].Data);
+      if Text.IsParent then begin
+        S := Text.Caption;
+      end else begin
+        S := #9 + ShortCutToText(Text.ShortCut) + #9 +
+             Text.Caption + #9 + Text.ConstText;
+      end;
+      Str.Add(S);
+    end;
+    Str.SaveToFile(FileName);
+  finally
+    Str.Free;
+  end;
+end;
+
+
+function TfrmConstEditor.GetTextById(Id: integer): String;
+begin
+  Result := TConstText(tvwConst.Items[id].Data).ConstText;
+end;
+
+procedure TfrmConstEditor.actMoveDownExecute(Sender: TObject);
+var Node, DestNode, NextNode: TTreeNode;
+begin
+  Node := tvwConst.Selected;
+  if Node.getNextSibling <> nil then begin
+    NextNode := Node.getNextSibling;
+    NextNode.MoveTo(Node, naInsert);
+  end else if Node.Level = 1 then begin
+    //\8e\9f\82Ì\83O\83\8b\81[\83v\82Ì\90æ\93ª\82É\88Ú\93®\82·\82é
+    if Node.Parent.getNextSibling = nil then Exit;
+    DestNode := Node.Parent.getNextSibling;
+    Node.MoveTo(DestNode, naAddChildFirst);
+  end;
+  Notify;
+end;
+
+procedure TfrmConstEditor.tvwConstChange(Sender: TObject; Node: TTreeNode);
+begin
+   if Node.Level = 0 then begin
+     StatusBar.SimpleText := IntToStr(Node.Count) + '\8cÂ\82Ì\8d\80\96Ú';
+     actInsert.Enabled := false;
+     actEditConst.Enabled := false;
+   end else begin
+     StatusBar.SimpleText := TConstText(Node.Data).ConstText + '  (' +
+       ShortCutToText(TConstText(Node.Data).ShortCut) + ')';
+     actInsert.Enabled := true;
+     actEditConst.Enabled := true;
+   end;
+end;
+
+procedure TfrmConstEditor.FormCreate(Sender: TObject);
+begin
+  if Application.Terminated then Exit;
+  //\83\81\83j\83\85\81[\8dì\90¬
+  LoadFromFile(ExtractFilePath(Application.ExeName) + 'constlist.txt');
+  Notify;
+  FOrigCaption := Caption;
+  tbtnDblClkInsert.Down := Pref.DblClkInsert;
+  tbtnDblClkInsertClick(Sender);
+end;
+
+procedure TfrmConstEditor.Notify;
+begin
+  frmSender.Notified;
+end;
+
+procedure TfrmConstEditor.actInsertExecute(Sender: TObject);
+begin
+  if tvwConst.Selected.Level = 1 then begin
+    frmSender.memScript.SelText := TConstText(tvwConst.Selected.Data).ConstText;
+  end;
+end;
+
+procedure TfrmConstEditor.tbtnDblClkInsertClick(Sender: TObject);
+begin
+  if tbtnDblClkInsert.Down then begin
+    Caption := FOrigCaption + ' - \83_\83u\83\8b\83N\83\8a\83b\83N\82Å\91}\93ü';
+  end else begin
+    Caption := FOrigCaption + ' - Enter\83L\81[\82Å\91}\93ü';
+  end;
+end;
+
+procedure TfrmConstEditor.tvwConstDblClick(Sender: TObject);
+begin
+  if tbtnDblClkInsert.Down then
+    actInsert.Execute
+  else
+    actEditConst.Execute;
+end;
+
+procedure TfrmConstEditor.PopUpMenuPopup(Sender: TObject);
+begin
+  tvwConst.Selected.Selected := true;
+end;
+
+end.
diff --git a/bottleclient/ConstList.pas b/bottleclient/ConstList.pas
new file mode 100755 (executable)
index 0000000..aaeec18
--- /dev/null
@@ -0,0 +1,55 @@
+unit ConstList;
+
+interface
+
+uses Classes, Menus, BottleDef, SysUtils;
+
+type
+  TConstText = class(TObject)
+  private
+    FConstText: String;
+    FCaption: String;
+    FShortCut: TShortCut;
+    FIsParent: boolean;
+    procedure SetCaption(const Value: String);
+    procedure SetConstText(const Value: String);
+    procedure SetShortCut(const Value: TShortCut);
+  public
+    property Caption: String read FCaption write SetCaption;
+    property ConstText: String read FConstText write SetConstText;
+    property ShortCut: TShortCut read FShortCut write SetShortCut;
+    property IsParent: boolean read FIsParent write FIsParent;
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+implementation
+
+{ TConstText }
+
+constructor TConstText.Create;
+begin
+  //None
+end;
+
+destructor TConstText.Destroy;
+begin
+  inherited;
+end;
+
+procedure TConstText.SetCaption(const Value: String);
+begin
+  FCaption := Value;
+end;
+
+procedure TConstText.SetConstText(const Value: String);
+begin
+  FConstText := Value;
+end;
+
+procedure TConstText.SetShortCut(const Value: TShortCut);
+begin
+  FShortCut := Value;
+end;
+
+end.
diff --git a/bottleclient/ConstText.dfm b/bottleclient/ConstText.dfm
new file mode 100755 (executable)
index 0000000..6fc1f74
--- /dev/null
@@ -0,0 +1,86 @@
+object frmConstText: TfrmConstText
+  Left = 231
+  Top = 452
+  BorderStyle = bsDialog
+  Caption = '\92è\8c^\8bå\82Ì\95Ò\8fW'
+  ClientHeight = 144
+  ClientWidth = 419
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poDesktopCenter
+  OnCreate = FormCreate
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object Label1: TLabel
+    Left = 8
+    Top = 20
+    Width = 39
+    Height = 12
+    Caption = '\83^\83C\83g\83\8b'
+  end
+  object Label2: TLabel
+    Left = 8
+    Top = 52
+    Width = 36
+    Height = 12
+    Caption = '\92è\8c^\8bå'
+  end
+  object Label3: TLabel
+    Left = 8
+    Top = 84
+    Width = 66
+    Height = 12
+    Caption = '\83V\83\87\81[\83g\83J\83b\83g'
+  end
+  object btnCancel: TButton
+    Left = 240
+    Top = 112
+    Width = 91
+    Height = 25
+    Cancel = True
+    Caption = '\83L\83\83\83\93\83Z\83\8b(&C)'
+    ModalResult = 2
+    TabOrder = 4
+  end
+  object btnOk: TButton
+    Left = 336
+    Top = 112
+    Width = 75
+    Height = 25
+    Caption = '&OK'
+    Default = True
+    TabOrder = 3
+    OnClick = btnOkClick
+  end
+  object cbxShortCut: TComboBox
+    Left = 80
+    Top = 80
+    Width = 209
+    Height = 20
+    ItemHeight = 12
+    TabOrder = 2
+    Text = 'cbxShortCut'
+  end
+  object edtCaption: TEdit
+    Left = 80
+    Top = 16
+    Width = 209
+    Height = 20
+    TabOrder = 0
+    Text = 'edtCaption'
+  end
+  object edtConst: TEdit
+    Left = 80
+    Top = 48
+    Width = 329
+    Height = 20
+    TabOrder = 1
+    Text = 'edtConst'
+  end
+end
diff --git a/bottleclient/ConstText.pas b/bottleclient/ConstText.pas
new file mode 100755 (executable)
index 0000000..89ac276
--- /dev/null
@@ -0,0 +1,108 @@
+unit ConstText;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  StdCtrls, ConstList, Menus;
+
+type
+  TfrmConstText = class(TForm)
+    btnCancel: TButton;
+    btnOk: TButton;
+    cbxShortCut: TComboBox;
+    edtCaption: TEdit;
+    edtConst: TEdit;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    procedure btnOkClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+  private
+    { Private \90é\8c¾ }
+  public
+    { Public \90é\8c¾ }
+    Target: TConstText;
+    function Execute: boolean;
+  end;
+
+var
+  frmConstText: TfrmConstText;
+
+implementation
+
+{$R *.DFM}
+
+{ TfrmConstText }
+
+function TfrmConstText.Execute: boolean;
+begin
+  if Target = nil then begin
+    edtCaption.Text := '\96³\91è';
+    edtConst.Text := '';
+    cbxShortCut.Text := '';
+  end else begin
+    edtCaption.Text := Target.Caption;
+    edtConst.Text := Target.ConstText;
+    cbxShortCut.Text := ShortCutToText(Target.ShortCut);
+  end;
+  if ShowModal = mrOk then begin
+    if Target = nil then Target := TConstText.Create;
+    Target.Caption := edtCaption.Text;
+    Target.ConstText := edtConst.Text;
+    try
+      Target.ShortCut := TextToShortCut(cbxShortCut.Text);
+    except
+      on EConvertError do Target.ShortCut := 0;
+    end;
+    Result := true;
+  end else begin
+    Result := false;
+  end;
+end;
+
+procedure TfrmConstText.btnOkClick(Sender: TObject);
+begin
+  if edtCaption.Text = '' then begin
+    ShowMessage('\83^\83C\83g\83\8b\97\93\82ª\8bó\82Å\82·\81B');
+    Exit;
+  end;
+  if edtCaption.Text = '' then begin
+    ShowMessage('\92è\8c^\8bå\97\93\82ª\8bó\82Å\82·\81B');
+    Exit;
+  end;
+  if (cbxShortCut.Text <> '') and (TextToShortCut(cbxShortCut.Text) = 0) then begin
+      ShowMessage('\83V\83\87\81[\83g\83J\83b\83g\82É\8bL\93ü\82³\82ê\82½\95\8e\9a\82ª\96³\8cø\82Å\82·\81B');
+      Exit;
+  end;
+  ModalResult := mrOk;
+end;
+
+procedure TfrmConstText.FormCreate(Sender: TObject);
+var c: char;
+    i: integer;
+begin
+  for c := 'A' to 'Z' do begin
+    cbxShortCut.Items.Add('Ctrl+' + c);
+  end;
+  for c := 'A' to 'Z' do begin
+    cbxShortCut.Items.Add('Shift+Ctrl+' + c);
+  end;
+  for c := 'A' to 'Z' do begin
+    cbxShortCut.Items.Add('Alt+Ctrl+' + c);
+  end;
+  for i := 1 to 12 do begin
+    cbxShortCut.Items.Add('F' + IntToStr(i));
+  end;
+  for i := 1 to 12 do begin
+    cbxShortCut.Items.Add('Shift+F' + IntToStr(i));
+  end;
+end;
+
+procedure TfrmConstText.FormShow(Sender: TObject);
+begin
+  edtCaption.SetFocus;
+end;
+
+end.
diff --git a/bottleclient/HeadValue.pas b/bottleclient/HeadValue.pas
new file mode 100755 (executable)
index 0000000..98f6489
--- /dev/null
@@ -0,0 +1,130 @@
+unit HeadValue;
+
+(*
+Content-type: text/html
+Content-length: 1024
+
+\8fã\82Ì\82æ\82¤\82È\95\8fÍ\82ð\93K\90Ø\82É\95ª\89ð\82µ\82Ä\88µ\82¢\82â\82·\82­\82·\82é\81B
+ *)
+
+interface
+uses Classes, SysUtils;
+
+type
+  EHeadValueError = class(Exception);
+
+  THeadValue = class(TObject)
+  private
+    FStrList: TStringList;
+    function GetCount: integer;
+    function GetData(Key: String): String;
+    function GetValueAt(Index: integer): String;
+    function GetKeyAt(Index: integer): String;
+    function GetIntData(Key: String): integer;
+  public
+    constructor Create(const Str: String); overload;
+    constructor Create; overload;
+    destructor Destroy; override;
+    procedure Initialize(const Str: String);
+    function ToStr: String;
+    property Count: integer read GetCount;
+    property KeyAt[Index: integer]: String read GetKeyAt;
+    property ValueAt[Index: integer]: String read GetValueAt;
+    property Data[Key: String]: String read GetData; default;
+    property IntData[Key: String]: integer read GetIntData;
+  end;
+
+implementation
+
+{ THeadValue }
+
+constructor THeadValue.Create(const Str: String);
+begin
+  Create;
+  Initialize(Str);
+end;
+
+constructor THeadValue.Create;
+begin
+  FStrList := TStringList.Create;
+end;
+
+destructor THeadValue.Destroy;
+begin
+  inherited;
+  FStrList.Free;
+end;
+
+function THeadValue.GetCount: integer;
+begin
+  Result := FStrList.Count div 2;
+end;
+
+function THeadValue.GetData(Key: String): String;
+var i: integer;
+begin
+  for i := 0 to Count-1 do
+    if KeyAt[i] = Key then begin
+      Result := ValueAt[i];
+      Exit;
+    end;
+end;
+
+function THeadValue.GetIntData(Key: String): integer;
+begin
+  Result := StrToIntDef(GetData(Key), -1);
+end;
+
+function THeadValue.GetKeyAt(Index: integer): String;
+begin
+  Result := FStrList[Index * 2];
+end;
+
+function THeadValue.GetValueAt(Index: integer): String;
+begin
+  Result := FStrList[Index * 2 +1];
+end;
+
+procedure THeadValue.Initialize(const Str: String);
+var Tmp: TStringList;
+    i, j: integer;
+    Key, Value, S: String;
+begin
+  Tmp := nil;
+  FStrList.Clear;
+  try
+    Tmp := TStringList.Create;
+    Tmp.Text := Str;
+    for i := 0 to Tmp.Count-1 do begin
+      S := Tmp[i];
+      Key := ''; Value := '';
+      j := Pos(':', S);
+      if j > 0 then begin
+        Key := Copy(S, 1, j-1);
+        if Length(S) > j then Inc(j);
+        while (S[j] in [' ']) and (j <= Length(S)) do begin
+          Inc(j);
+        end;
+        Value := Copy(S, j, High(integer));
+      end;
+      if (Key <> '') and (Value <> '') then begin
+        FStrList.Add(Key);
+        FStrList.Add(Value);
+      end;
+    end;
+  finally
+    Tmp.Free;
+  end;
+end;
+
+function THeadValue.ToStr: String;
+var i, max: integer;
+begin
+  max := FStrList.Count div 2 - 1;
+  for i := 0 to max do begin
+    Result := Result + Format('%s: %s', [FStrList[i*2], FStrList[i*2+1]]);
+    if i <> max then Result := Result + #13#10;
+  end;
+end;
+
+end.
diff --git a/bottleclient/LogForm.dfm b/bottleclient/LogForm.dfm
new file mode 100755 (executable)
index 0000000..2c7ad02
--- /dev/null
@@ -0,0 +1,231 @@
+object frmLog: TfrmLog
+  Left = 457
+  Top = 602
+  Width = 494
+  Height = 480
+  Caption = '\83\8d\83O - \83_\83u\83\8b\83N\83\8a\83b\83N\82Å\8dÄ\90¶'
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  ShowHint = True
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 12
+  object ToolBar: TToolBar
+    Left = 0
+    Top = 0
+    Width = 482
+    Height = 22
+    AutoSize = True
+    Caption = 'ToolBar'
+    EdgeBorders = []
+    Flat = True
+    Images = frmSender.imgIcon
+    TabOrder = 0
+    object tbtnClear: TToolButton
+      Left = 0
+      Top = 0
+      Hint = '\83\8d\83O\8fÁ\8b\8e|\82·\82×\82Ä\82Ì\95\\8e¦\82³\82ê\82Ä\82¢\82é\83\8d\83O\82ð\8fÁ\8b\8e\82µ\82Ü\82·'
+      Caption = '\83\8d\83O\8fÁ\8b\8e'
+      ImageIndex = 21
+      OnClick = tbtnClearClick
+    end
+    object tbtnSaveLog: TToolButton
+      Left = 23
+      Top = 0
+      Hint = '\83\8d\83O\83t\83@\83C\83\8b\95Û\91¶'
+      Caption = '\95Û\91¶'
+      DropdownMenu = PopupMenuSaveLog
+      Enabled = False
+      ImageIndex = 27
+      Style = tbsDropDown
+      OnClick = mnSaveLogClick
+    end
+    object ToolButton1: TToolButton
+      Left = 57
+      Top = 0
+      Width = 8
+      Caption = 'ToolButton1'
+      ImageIndex = 29
+      Style = tbsSeparator
+    end
+    object tbtnVoteMessage: TToolButton
+      Left = 65
+      Top = 0
+      Action = frmSender.actVoteMessage
+    end
+    object tbtnAgreeMessage: TToolButton
+      Left = 88
+      Top = 0
+      Action = frmSender.actAgreeMessage
+    end
+  end
+  object pnlUpper: TPanel
+    Left = 0
+    Top = 22
+    Width = 482
+    Height = 427
+    Align = alClient
+    BevelOuter = bvNone
+    TabOrder = 1
+    object StatusBar: TStatusBar
+      Left = 0
+      Top = 408
+      Width = 482
+      Height = 19
+      Panels = <
+        item
+          Width = 50
+        end>
+      SimplePanel = False
+    end
+    object pnlPanel: TPanel
+      Left = 0
+      Top = 0
+      Width = 482
+      Height = 408
+      Align = alClient
+      BevelOuter = bvNone
+      TabOrder = 1
+      object Splitter: TSplitter
+        Left = 0
+        Top = 310
+        Width = 482
+        Height = 3
+        Cursor = crVSplit
+        Align = alBottom
+        ResizeStyle = rsUpdate
+      end
+      object lvwLog: TListView
+        Left = 0
+        Top = 0
+        Width = 482
+        Height = 310
+        Align = alClient
+        Columns = <
+          item
+            Caption = '\93ú\95t'
+            Width = 120
+          end
+          item
+            Caption = '\83`\83\83\83\93\83l\83\8b'
+            Width = 100
+          end
+          item
+            Alignment = taRightJustify
+            Caption = '\93\8a\95['
+            Width = 40
+          end
+          item
+            Alignment = taRightJustify
+            Caption = '\93¯\88Ó'
+            Width = 40
+          end
+          item
+            Caption = '\83X\83N\83\8a\83v\83g'
+            Width = 400
+          end>
+        HideSelection = False
+        OwnerData = True
+        ReadOnly = True
+        RowSelect = True
+        PopupMenu = PopupMenuListView
+        SmallImages = frmSender.imgIcon
+        TabOrder = 0
+        ViewStyle = vsReport
+        OnChange = lvwLogChange
+        OnClick = lvwLogClick
+        OnColumnClick = lvwLogColumnClick
+        OnData = lvwLogData
+        OnDblClick = lvwLogDblClick
+        OnKeyPress = lvwLogKeyPress
+      end
+      object edtScript: TRichEdit
+        Left = 0
+        Top = 313
+        Width = 482
+        Height = 95
+        Align = alBottom
+        Font.Charset = SHIFTJIS_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = '\82l\82\83S\83V\83b\83N'
+        Font.Style = []
+        HideScrollBars = False
+        ParentFont = False
+        PopupMenu = PopupMenuPreview
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 1
+      end
+    end
+  end
+  object SsParser: TSsParser
+    Left = 440
+    Top = 54
+  end
+  object PopupMenuPreview: TPopupMenu
+    Left = 408
+    Top = 54
+    object mnPopCopy: TMenuItem
+      Action = frmSender.actEditCopy
+    end
+  end
+  object PopupMenuListView: TPopupMenu
+    Images = frmSender.imgIcon
+    OnPopup = PopupMenuListViewPopup
+    Left = 376
+    Top = 56
+    object mnPopUpCopyScript: TMenuItem
+      Caption = '\82±\82ÌBottle\83X\83N\83\8a\83v\83g\82ð\83R\83s\81['
+      Enabled = False
+      OnClick = mnPopUpCopyScriptClick
+    end
+    object mnPopUpVoteMessage: TMenuItem
+      Action = frmSender.actVoteMessage
+    end
+    object mnPopUpAgreeMessage: TMenuItem
+      Action = frmSender.actAgreeMessage
+    end
+    object mnJumpURL: TMenuItem
+      Caption = '&URL\83W\83\83\83\93\83v'
+      Enabled = False
+    end
+  end
+  object SaveDialog: TSaveDialog
+    DefaultExt = 'txt'
+    Filter = 
+      '\83\8d\83O\83t\83@\83C\83\8b (*.log)|*.log|\83e\83L\83X\83g\83t\83@\83C\83\8b (*.txt)|*.txt|XML\83t' +
+      '\83@\83C\83\8b (*.xml)|*.xml|\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)|*.*'
+    Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
+    Title = '\83\8d\83O\83t\83@\83C\83\8b\82Ì\95Û\91¶'
+    Left = 344
+    Top = 56
+  end
+  object PopupMenuSaveLog: TPopupMenu
+    Left = 304
+    Top = 56
+    object mnSaveLog: TMenuItem
+      Caption = 'sstp.log\8c`\8e®(&S)'
+      Default = True
+      OnClick = mnSaveLogClick
+    end
+    object mnSaveLogChannel: TMenuItem
+      Caption = 'sstp.log\8c`\8e®(\83`\83\83\83\93\83l\83\8b\95t)(&C)'
+      OnClick = mnSaveLogChannelClick
+    end
+    object mnSaveLogScript: TMenuItem
+      Caption = '\83X\83N\83\8a\83v\83g\82Ì\82Ý(&N)'
+      OnClick = mnSaveLogScriptClick
+    end
+    object mnSaveLogXML: TMenuItem
+      Caption = '&XML\8c`\8e®'
+      OnClick = mnSaveLogXMLClick
+    end
+  end
+end
diff --git a/bottleclient/LogForm.pas b/bottleclient/LogForm.pas
new file mode 100755 (executable)
index 0000000..632daf1
--- /dev/null
@@ -0,0 +1,577 @@
+unit LogForm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  ComCtrls, ToolWin, StdCtrls, ExtCtrls, SsParser, BottleDef, Menus, FastSstp,
+  Clipbrd, Logs, ShellAPI;
+
+type
+  TSaveLogType = (stLog, stLogWithChannels, stText, stXML);
+
+  TfrmLog = class(TForm)
+    ToolBar: TToolBar;
+    tbtnClear: TToolButton;
+    pnlUpper: TPanel;
+    SsParser: TSsParser;
+    StatusBar: TStatusBar;
+    tbtnSaveLog: TToolButton;
+    PopupMenuPreview: TPopupMenu;
+    mnPopCopy: TMenuItem;
+    tbtnVoteMessage: TToolButton;
+    PopupMenuListView: TPopupMenu;
+    mnPopUpVoteMessage: TMenuItem;
+    SaveDialog: TSaveDialog;
+    pnlPanel: TPanel;
+    lvwLog: TListView;
+    Splitter: TSplitter;
+    edtScript: TRichEdit;
+    mnPopUpCopyScript: TMenuItem;
+    PopupMenuSaveLog: TPopupMenu;
+    mnSaveLog: TMenuItem;
+    mnSaveLogChannel: TMenuItem;
+    mnSaveLogScript: TMenuItem;
+    mnSaveLogXML: TMenuItem;
+    ToolButton1: TToolButton;
+    mnJumpURL: TMenuItem;
+    mnPopUpAgreeMessage: TMenuItem;
+    tbtnAgreeMessage: TToolButton;
+    procedure tbtnClearClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure lvwLogChange(Sender: TObject; Item: TListItem;
+      Change: TItemChange);
+    procedure lvwLogDblClick(Sender: TObject);
+    procedure lvwLogKeyPress(Sender: TObject; var Key: Char);
+    procedure FormDestroy(Sender: TObject);
+    procedure lvwLogClick(Sender: TObject);
+    procedure mnSaveLogClick(Sender: TObject);
+    procedure lvwLogColumnClick(Sender: TObject; Column: TListColumn);
+    procedure mnPopUpCopyScriptClick(Sender: TObject);
+    procedure mnSaveLogChannelClick(Sender: TObject);
+    procedure mnSaveLogScriptClick(Sender: TObject);
+    procedure mnSaveLogXMLClick(Sender: TObject);
+    procedure lvwLogData(Sender: TObject; Item: TListItem);
+    procedure PopupMenuListViewPopup(Sender: TObject);
+  private
+    { Private \90é\8c¾ }
+    SortColumn: integer;  //\97ñ\83N\83\8a\83b\83N\83\\81[\83g\97p
+    SortDesc: boolean;    //\97ñ\83N\83\8a\83b\83N\83\\81[\83g\97p
+    procedure UpdateScriptColor(const Script: String);
+    procedure UpdateScriptNoColor(const Script: String);
+    procedure DoSaveLog(SaveType: TSaveLogType; Ext: String;
+      Filter: integer);
+    procedure mnURLClick(Sender: TObject);
+    procedure ExtractURLs(Script: String; Result: TStrings);
+  protected
+    procedure CreateParams(var Params: TCreateParams); override;
+  public
+    { Public \90é\8c¾ }
+    procedure AddScriptLog(const Script, Channel, MID, Ghost: String);
+    procedure AddSystemLog(const MessageString: String);
+    procedure SetBottleStatusToPlaying(const MID: String);
+    procedure SetBottleStatusToOpened(const MID: String);
+    procedure UpdateWindow;
+  end;
+
+
+var
+  frmLog: TfrmLog;
+
+const
+  IconBottle    = 17;
+  IconOpened    = 30;
+  IconPlaying   = 31;
+  IconSystemLog = 26;
+  SubChannel    = 0;
+  SubVotes      = 1;
+  SubAgrees     = 2;
+  SubScript     = 3;
+
+implementation
+
+uses MainForm;
+
+{$R *.DFM}
+
+{ TfrmLog }
+
+procedure TfrmLog.AddScriptLog(const Script, Channel, MID, Ghost: String);
+var LogItem: TLogItem;
+    Sel: integer;
+begin
+  if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
+  LogItem := TLogItem.Create(ltBottle, MID, Channel, Script, Ghost, Now());
+  BottleLog.Insert(0, LogItem);
+  lvwLog.Items.Count := BottleLog.Count;
+  UpdateWindow;
+  if Sel >= 0 then begin
+    lvwLog.Selected := lvwLog.Items[Sel + 1];
+    lvwLog.Selected.Focused := true;
+  end;
+end;
+
+procedure TfrmLog.AddSystemLog(const MessageString: String);
+var LogItem: TLogItem;
+    Sel: integer;
+begin
+  if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
+  LogItem := TLogItem.Create(ltSystemLog, '', '', MessageString, '', Now());
+  BottleLog.Insert(0, LogItem);
+  lvwLog.Items.Count := BottleLog.Count;
+  UpdateWindow;
+  if Sel >= 0 then begin
+    lvwLog.Selected := lvwLog.Items[Sel + 1];
+    lvwLog.Selected.Focused := true;
+  end;
+end;
+
+procedure TfrmLog.tbtnClearClick(Sender: TObject);
+begin
+  BottleLog.Clear;
+  lvwLog.Items.Count := 0;
+  lvwLog.Invalidate;
+  lvwLogChange(Self, nil, ctState);
+end;
+
+procedure TfrmLog.FormCreate(Sender: TObject);
+begin
+  SsParser.TagPattern.Assign(frmSender.SsParser.TagPattern);
+  SsParser.MetaPattern.Assign(frmSender.SsParser.MetaPattern);
+
+  with Pref.LogWindowPosition do begin
+    Self.Left   := Left;
+    Self.Top    := Top;
+    Self.Width  := Right - Left + 1;
+    Self.Height := Bottom - Top + 1;
+  end;
+  edtScript.Height := Pref.LogWindowDividerPos;
+end;
+
+procedure TfrmLog.FormDestroy(Sender: TObject);
+begin
+  with Pref.LogWindowPosition do begin
+    Left   := Self.Left;
+    Top    := Self.Top;
+    Right  := Self.Left + Self.Width - 1;
+    Bottom := Self.Top + Self.Height - 1;
+  end;
+  Pref.LogWindowDividerPos := edtScript.Height;
+end;
+
+procedure TfrmLog.lvwLogChange(Sender: TObject; Item: TListItem;
+  Change: TItemChange);
+var Script: String;
+    Log: TLogItem;
+begin
+  StatusBar.Panels[0].Text := IntToStr(lvwLog.Items.Count) + '\8c\8f';
+  if Change = ctState then begin
+    Script := '';
+    if lvwLog.Selected <> nil then begin
+      Log := BottleLog.Bottles[Item.Index];
+      if Log.LogType = ltBottle then begin
+        Script := Log.Script;
+        frmSender.actVoteMessage.Enabled := true;
+        frmSender.actAgreeMessage.Enabled := true;
+        mnPopUpCopyScript.Enabled := true;
+      end else begin
+        frmSender.actVoteMessage.Enabled := false;
+        frmSender.actAgreeMessage.Enabled := false;
+        mnPopUpCopyScript.Enabled := false;
+      end
+    end else begin
+      frmSender.actVoteMessage.Enabled := false;
+      frmSender.actAgreeMessage.Enabled := false;
+      mnPopUpCopyScript.Enabled := false;
+    end;
+    frmSender.DoTrans(Script, [toConvertURL]);
+    if Pref.ColorScript then begin
+      UpdateScriptColor(Script);
+    end else begin
+      UpdateScriptNoColor(Script);
+    end;
+  end;
+  tbtnSaveLog.Enabled := lvwLog.Items.Count > 0;
+end;
+
+procedure TfrmLog.lvwLogDblClick(Sender: TObject);
+var Script: String;
+    Opt: TScriptTransOptions;
+    SOpt: TSstpSendOptions;
+    Ghost: String;
+    Log: TLogItem;
+begin
+  if lvwLog.Selected = nil then Exit;
+  //Log := TLogItem(lvwLog.Selected.Data);
+  Log := BottleLog.Bottles[lvwLog.Selected.Index];
+  if Log = nil then Exit;
+  if Log.LogType <> ltBottle then Exit;
+  Script := Log.Script;
+  Opt := [toConvertURL, toWaitScriptEnd];
+  if Pref.NoTransUrl then Opt := Opt + [toNoChoice];
+  if Pref.IgnoreFrequentYenS then Opt := Opt + [toIgnoreFrequentYenS];
+  frmSender.DoTrans(Script, Opt);
+
+  Ghost := frmSender.GetChannelPrefs(Log.Channel).TargetGhost;
+  if Ghost = '' then //\83`\83\83\83\93\83l\83\8b\8ew\92è\83S\81[\83X\83g
+    if frmSender.ChannelList.Channel[Log.Channel] <> nil then
+      Ghost := frmSender.ChannelList.Channel[Log.Channel].Ghost;
+  //\96Ú\95W\83S\81[\83X\83g\8c\88\92è
+  if Log.Ghost <> '' then Ghost := Log.Ghost;
+  if frmSender.GetChannelPrefs(Log.Channel).IgnoreIfGhost then
+    Ghost := frmSender.GetChannelPrefs(Log.Channel).TargetGhost;
+  //\83^\81[\83Q\83b\83g\83S\81[\83X\83g\8am\92è
+  Ghost := frmSender.SetHWndToFavoriteGhost(Ghost);
+  frmSender.FastSstp.SstpSender := 'SSTP Bottle -\81y\83\8d\83O\8dÄ\90\81z';
+  if Pref.NoTranslate then SOpt := [soNoTranslate] else SOpt := [];
+  frmSender.FastSstp.SstpSEND(Script, SOpt, frmSender.GhostNameToSetName(Ghost));
+end;
+
+procedure TfrmLog.UpdateScriptColor(const Script: String);
+var i: integer;
+    UnyuTalking, Talked: boolean;
+begin
+  SsParser.LeaveEscape := false;
+  SsParser.InputString := Script;
+  SsParser.LeaveEscape := true;
+  UnyuTalking := false;
+  Talked := false; //'\h\u\h\u'\82Ì\82æ\82¤\82È\83X\83N\83\8a\83v\83g\82Å\8bó\82«\8ds\82ð\8dì\82ç\82È\82¢\82½\82ß\82Ì\91[\92u
+  edtScript.Text := '';
+  edtScript.Color := Pref.BgColor;
+  for i := 0 to SsParser.Count-1 do begin
+    if (SsParser[i] = '\u') and not UnyuTalking then begin
+      UnyuTalking := true;
+      if Talked then begin
+        edtScript.SelText := #13#10;
+        Talked := false;
+      end;
+    end;
+    if (SsParser[i] = '\h') and UnyuTalking then begin
+      UnyuTalking := false;
+      if Talked then begin
+        edtScript.SelText := #13#10;
+        Talked := false;
+      end;
+    end;
+    if SsParser.MarkUpType[i] = mtStr then begin
+      if UnyuTalking then
+        edtScript.SelAttributes.Color := Pref.TalkColorU
+      else
+        edtScript.SelAttributes.Color := Pref.TalkColorH;
+      edtScript.SelText := SsParser[i];
+      Talked := true;
+    end;
+    if SsParser.MarkUpType[i] = mtMeta then begin
+      edtScript.SelAttributes.Color := Pref.MetaWordColor;
+      edtScript.SelText := SsParser[i];
+      Talked := true;
+    end;
+  end;
+end;
+
+procedure TfrmLog.UpdateScriptNoColor(const Script: String);
+var Scr: String;
+    i: integer;
+    UnyuTalking, Talked, LastUnyuTalked: boolean;
+begin
+  SsParser.LeaveEscape := false;
+  SsParser.InputString := Script;
+  SsParser.LeaveEscape := true;
+  edtScript.Text := '';
+  edtScript.Color := clWindow;
+  edtScript.DefAttributes.Color := clWindowText;
+  edtScript.SelAttributes.Color := clWindowText;
+  Talked := false;
+  UnyuTalking := false;
+  LastUnyuTalked := false;
+  for i := 0 to SsParser.Count-1 do begin
+    if (SsParser[i] = '\u') and not UnyuTalking then begin
+      UnyuTalking := true;
+    end;
+    if (SsParser[i] = '\h') and UnyuTalking then begin
+      UnyuTalking := false;
+    end;
+    if SsParser.MarkUpType[i] in [mtStr, mtMeta] then begin
+      if not Talked then begin
+        if UnyuTalking then Scr := '\82¤:' else Scr := '\82³:';
+      end;
+      if Talked and (UnyuTalking <> LastUnyuTalked) then begin
+        Scr := Scr + #13#10;
+        if UnyuTalking then Scr := Scr + '\82¤:' else Scr := Scr + '\82³:';
+      end;
+      Scr := Scr + SsParser[i];
+      Talked := true;
+      LastUnyuTalked := UnyuTalking;
+    end;
+  end;
+  edtScript.Text := Scr;
+end;
+
+procedure TfrmLog.lvwLogKeyPress(Sender: TObject; var Key: Char);
+begin
+  if Key = #13 then lvwLogDblClick(Sender);
+end;
+
+procedure TfrmLog.CreateParams(var Params: TCreateParams);
+begin
+  inherited;
+  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
+end;
+
+procedure TfrmLog.lvwLogClick(Sender: TObject);
+begin
+  with lvwLog do
+    Selected := Selected;
+end;
+
+procedure TfrmLog.mnSaveLogClick(Sender: TObject);
+begin
+  DoSaveLog(stLog, 'log', 1);
+end;
+
+procedure TfrmLog.lvwLogColumnClick(Sender: TObject; Column: TListColumn);
+var SortType: TBottleLogSortType;
+begin
+  if SortColumn = Column.Index then
+    SortDesc := not SortDesc
+  else begin
+    SortColumn := Column.Index;
+    SortDesc := false;
+  end;
+  case SortColumn-1 of
+    -1: SortType := stLogTime;
+    subChannel: SortType := stChannel;
+    subVotes:   SortType := stVote;
+    subAgrees:  SortType := stAgree;
+    subScript:  SortType := stScript;
+  else SortType := stLogTime;
+  end;
+  BottleLog.SortBottles(SortType, SortDesc);
+  lvwLog.Invalidate;
+end;
+
+
+procedure TfrmLog.mnPopUpCopyScriptClick(Sender: TObject);
+var
+  Log: TLogItem;
+  Clip: TClipBoard;
+begin
+  Log := BottleLog.Bottles[frmLog.lvwLog.Selected.Index];
+  if Log = nil then Exit;
+  Clip := ClipBoard();
+  Clip.SetTextBuf(PChar(Log.Script));
+end;
+
+procedure TfrmLog.SetBottleStatusToOpened(const MID: String);
+begin
+  if BottleLog.Bottle(MID) <> nil then begin
+    BottleLog.Bottle(MID).State := lsOpened;
+    lvwLog.Invalidate;
+  end;
+end;
+
+procedure TfrmLog.SetBottleStatusToPlaying(const MID: String);
+begin
+  if BottleLog.Bottle(MID) <> nil then begin
+    BottleLog.Bottle(MID).State := lsPlaying;
+    lvwLog.Invalidate;
+  end;
+end;
+
+procedure TfrmLog.DoSaveLog(SaveType: TSaveLogType; Ext: String; Filter: integer);
+var i: integer;
+    Log: TStringList;
+    LogItem: TLogItem;
+    Date: String;
+    TmpScript: String;
+const
+  DayStr: array[1..7] of String = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
+begin
+  SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
+  SaveDialog.DefaultExt := Ext;
+  SaveDialog.FilterIndex := Filter;
+  if SaveDialog.Execute then begin
+    Log := nil;
+    try
+      Log := TStringList.Create;
+      case SaveType of
+        stLog, stLogWithChannels: begin
+          for i := 0 to BottleLog.Count -1 do begin
+            LogItem := BottleLog.Bottles[i];
+            if LogItem = nil then Continue;
+            if LogItem.LogType <> ltBottle then Continue;
+            Date := FormatDateTime('yyyy/mm/dd hh:nn:ss ', LogItem.LogTime);
+            Date := Date + '(' + DayStr[DayOfWeek(LogItem.LogTime)] + ')';
+            if SaveType = stLogWithChannels then
+              Date := Date + ',' + LogItem.Channel +',SEND,' + LogItem.Script
+            else
+              Date := Date + ',0.0.0.0,SEND,' + LogItem.Script;
+            Log.Add(Date);
+          end;
+        end;
+        stText: begin
+          for i := 0 to BottleLog.Count -1 do begin
+            LogItem := BottleLog.Bottles[i];
+            if LogItem = nil then Continue;
+            if LogItem.LogType <> ltBottle then Continue;
+            Log.Add(LogItem.Script);
+          end;
+        end;
+        stXML: begin
+          Log.Add('<?xml version=''1.0'' encoding=''Shift_JIS''?>');
+          Log.Add('<bottlelog>');
+          for i := 0 to BottleLog.Count -1 do begin
+            LogItem := BottleLog.Bottles[i];
+            if LogItem = nil then Continue;
+            if LogItem.LogType <> ltBottle then Continue;
+            Date := FormatDateTime('yyyy/mm/dd hh:nn:ss', LogItem.LogTime);
+            Log.Add(Format('<message mid=''%s''>', [LogItem.MID]));
+            Log.Add('<date>' + Date + '</date>');
+            Log.Add('<channel>' + LogItem.Channel + '</channel>');
+            //
+            TmpScript := LogItem.Script;
+            TmpScript := StringReplace(TmpScript, '<', '&lt;', [rfReplaceAll]);
+            TmpScript := StringReplace(TmpScript, '>', '&gt;', [rfReplaceAll]);
+            Log.Add('<script>' + TmpScript + '</script>');
+            //
+            if LogItem.Ghost = '' then
+              Log.Add('<ghost />')
+            else begin
+              TmpScript := LogItem.Ghost;
+              TmpScript := StringReplace(TmpScript, '<', '&lt;', [rfReplaceAll]);
+              TmpScript := StringReplace(TmpScript, '>', '&gt;', [rfReplaceAll]);
+              Log.Add(Format('<ghost>%s</ghost>', [TmpScript]));
+            end;
+            Log.Add('</message>');
+          end;
+          Log.Add('</bottlelog>');
+        end;
+      end;
+      Log.SaveToFile(SaveDialog.FileName);
+    finally
+      Log.Free;
+    end;
+  end;
+end;
+
+procedure TfrmLog.mnSaveLogChannelClick(Sender: TObject);
+begin
+  DoSaveLog(stLogWithChannels, 'log', 1);
+end;
+
+procedure TfrmLog.mnSaveLogScriptClick(Sender: TObject);
+begin
+  DoSaveLog(stText, 'txt', 2);
+end;
+
+procedure TfrmLog.mnSaveLogXMLClick(Sender: TObject);
+begin
+  DoSaveLog(stXML, 'xml', 3);
+end;
+
+procedure TfrmLog.lvwLogData(Sender: TObject; Item: TListItem);
+var i: integer;
+    Log: TLogItem;
+begin
+  i := Item.Index;
+  Log := BottleLog.Bottles[i];
+  with Item do begin
+    Caption := FormatDateTime('yy/mm/dd hh:nn:ss', Log.LogTime);
+    SubItems.Clear;
+    if Log.Ghost <> '' then
+      SubItems.Add(Log.Channel + '/' + Log.Ghost)
+    else
+      SubItems.Add(Log.Channel);
+    SubItems.Add(IntToStr(Log.Votes));
+    SubItems.Add(IntToStr(Log.Agrees));
+    SubItems.Add(Log.Script);
+
+    if Log.LogType = ltBottle then begin
+      case Log.State of
+        lsUnopened: ImageIndex := IconBottle;
+        lsPlaying:  ImageIndex := IconPlaying;
+        lsOpened:   ImageIndex := IconOpened;
+      end;
+    end else
+      ImageIndex := IconSystemLog;
+  end;
+end;
+
+procedure TfrmLog.UpdateWindow;
+begin
+  lvwLog.Items.Count := BottleLog.Count;
+  lvwLog.Invalidate;
+  lvwLogChange(Self, lvwLog.Selected, ctState);
+end;
+
+procedure TfrmLog.PopupMenuListViewPopup(Sender: TObject);
+var Log: TLogItem;
+    Child: TMenuItem;
+    Urls: TStringList;
+    i: integer;
+begin
+  for i := 0 to mnJumpURL.Count-1 do begin
+    mnJumpURL.Items[i].Free;
+  end;
+  mnJumpURL.Enabled := false;
+  if lvwLog.Selected = nil then Exit;
+  Log := BottleLog.Bottles[lvwLog.Selected.Index];
+  if Log = nil then Exit;
+  Urls := nil;
+  try
+    Urls := TStringList.Create;
+    ExtractURLs(Log.Script, Urls);
+    for i := 0 to Urls.Count-1 do begin
+      Child := TMenuItem.Create(Self);
+      with Child do begin
+        Caption := Format('(&%d) %s', [i+1, Urls[i]]);
+        OnClick := mnURLClick;
+        AutoHotkeys := maManual;
+        mnJumpURL.Add(Child);
+      end;
+    end;
+    mnJumpURL.Enabled := Urls.Count > 0;
+  finally
+    Urls.Free;
+  end;
+end;
+
+procedure TfrmLog.mnURLClick(Sender: TObject);
+var URL: String;
+begin
+  URL := (Sender as TMenuItem).Caption;
+  RegExp.Subst('s/^\(&?\d\) //', URL);
+  ShellExecute(Handle, 'open', PChar(URL), nil, nil, SW_SHOW);
+end;
+
+procedure TfrmLog.ExtractURLs(Script: String; Result: TStrings);
+var i, u, j: integer;
+    s: String;
+begin
+  Result.Clear;
+  SsParser.LeaveEscape := false;
+  SsParser.InputString := Script;
+  SsParser.LeaveEscape := true;
+  for i := 0 to SsParser.Count-1 do begin
+    if (SsParser.Match(SsParser[i], '\URL%b') > 0) then begin
+      for u := 7 downto 1 do begin
+        if (SsParser.Match(SsParser[i],
+            '\URL%b'+StringReplace(StringOfChar('-', u*2),
+            '-', '%b', [rfReplaceAll]))) > 0 then begin
+          for j := 1 to u do begin
+            s := SsParser.GetParam(SsParser[i], j*2);
+            if Pos('http://', s) > 0 then Result.Add(s);
+          end;
+          Break;
+        end;
+      end;
+      if SsParser.Match(SsParser[i], '\URL%b%b') = 0 then begin //\8aÈ\88Õ\94ÅURL\95Ï\8a·
+        //\8aÈ\88Õ\8c`\8e®\URL\83^\83O\95Ï\8a·
+        s := SsParser.GetParam(SsParser[i], 1);
+        if Pos('http://', s) > 0 then Result.Add(s);
+      end;
+    end;
+  end;
+end;
+
+end.
diff --git a/bottleclient/Logs.pas b/bottleclient/Logs.pas
new file mode 100755 (executable)
index 0000000..168da3a
--- /dev/null
@@ -0,0 +1,192 @@
+unit Logs;
+
+interface
+
+uses
+  Contnrs, Classes, SysUtils, Dialogs, Forms;
+
+type
+
+  TLogType = (ltBottle, ltSystemLog);
+  TLogState = (lsUnopened, lsPlaying, lsOpened);
+  TLogItem = class(TObject)
+  private
+    FScript: String;
+    FChannel: String;
+    FMID: String;
+    FLogTime: TDateTime;
+    FLogType: TLogType;
+    FGhost: String;
+    FVotes: Integer;
+    FAgreements: Integer;
+    FState: TLogState;
+    procedure SetChannel(const Value: String);
+    procedure SetLogType(const Value: TLogType);
+    procedure SetMID(const Value: String);
+    procedure SetScript(const Value: String);
+    procedure SetLogTime(const Value: TDateTime);
+    procedure SetGhost(const Value: String);
+    procedure SetVotes(const Value: Integer);
+    procedure SetAgreements(const Value: Integer);
+    procedure SetState(const Value: TLogState);
+  public
+    constructor Create(LogType: TLogType; const MID, Channel, Script,
+      Ghost: String; LogTime: TDateTime);
+    property LogType: TLogType read FLogType write SetLogType;
+    property MID: String read FMID write SetMID;
+    property Channel: String read FChannel write SetChannel;
+    property LogTime: TDateTime read FLogTime write SetLogTime;
+    property Script: String read FScript write SetScript;
+    property Ghost: String read FGhost write SetGhost;
+    property Votes: Integer read FVotes write SetVotes;
+    property Agrees: Integer read FAgreements write SetAgreements;
+    property State: TLogState read FState write SetState;
+  end;
+
+  TBottleLogSortType = (stLogTime, stChannel, stScript, stVote, stAgree);
+  TBottleLogList = class(TObjectList)
+  private
+    function GetBottles(Index: integer): TLogItem;
+  public
+    procedure SortBottles(LogSortType: TBottleLogSortType; Desc: boolean);
+    function Bottle(MID: String): TLogItem;
+    property Bottles[Index: integer]: TLogItem read GetBottles;
+  end;
+
+var
+  BottleLog: TBottleLogList;
+  ASortType: TBottleLogSortType; //LogCompare\8aÖ\90\94\82©\82ç\8c©\82¦\82é\82æ\82¤\82É\88ê\8e\9e\91Þ\94ð\97p
+  ASortDesc: boolean;
+
+function LogCompare(Item1, Item2: Pointer): integer;
+
+
+////////////////////////////////////////////////////////////////////////////////
+implementation
+
+function LogCompare(Item1, Item2: Pointer): Integer;
+var
+  Log1, Log2: TLogItem;
+begin
+  Log1 := TLogItem(Item1);
+  Log2 := TLogItem(Item2);
+  Result := 0;
+  case ASortType of
+    stLogTime: begin
+      if Log1.LogTime = Log2.LogTime then Result := 0
+      else if Log1.LogTime < Log2.LogTime then Result := 1 else Result := -1;
+    end;
+    stChannel: begin
+      Result := AnsiCompareStr(Log1.Channel, Log2.Channel);
+    end;
+    stScript: begin
+      Result := AnsiCompareStr(Log1.Script, Log2.Script);
+    end;
+    stVote: begin
+      Result := Log2.Votes - Log1.Votes;
+    end;
+    stAgree: begin
+      Result := Log2.Agrees - Log1.Agrees;
+    end;
+  end;
+  if ASortDesc then Result := -Result; //\8f¸\8f\87
+end;
+
+{ TLogItem }
+
+constructor TLogItem.Create(LogType: TLogType; const MID, Channel, Script,
+  Ghost: String; LogTime: TDateTime);
+begin
+  Self.LogType := LogType;
+  Self.MID := MID;
+  Self.Script := Script;
+  Self.Channel := Channel;
+  Self.Ghost := Ghost;
+  Self.LogTime := LogTime;
+  Self.State := lsUnopened;
+end;
+
+procedure TLogItem.SetChannel(const Value: String);
+begin
+  FChannel := Value;
+end;
+
+procedure TLogItem.SetLogType(const Value: TLogType);
+begin
+  FLogType := Value;
+end;
+
+procedure TLogItem.SetMID(const Value: String);
+begin
+  FMID := Value;
+end;
+
+procedure TLogItem.SetScript(const Value: String);
+begin
+  FScript := Value;
+end;
+
+procedure TLogItem.SetLogTime(const Value: TDateTime);
+begin
+  FLogTime := Value;
+end;
+
+procedure TLogItem.SetAgreements(const Value: Integer);
+begin
+  FAgreements := Value;
+end;
+
+procedure TLogItem.SetVotes(const Value: Integer);
+begin
+  FVotes := Value;
+end;
+
+procedure TLogItem.SetGhost(const Value: String);
+begin
+  FGhost := Value;
+end;
+
+
+procedure TLogItem.SetState(const Value: TLogState);
+begin
+  FState := Value;
+end;
+
+{ TBottleLogList }
+
+function TBottleLogList.Bottle(MID: String): TLogItem;
+var i: integer;
+begin
+  Result := nil;
+  for i := 0 to Count-1 do
+    if (Items[i] as TLogItem).MID = MID then begin
+      Result := Items[i] as TLogItem;
+      exit;
+    end;
+end;
+
+function TBottleLogList.GetBottles(Index: integer): TLogItem;
+begin
+  Result := Items[Index] as TLogItem;
+end;
+
+procedure TBottleLogList.SortBottles(LogSortType: TBottleLogSortType; Desc: boolean);
+begin
+  ASortType := LogSortType;
+  ASortDesc := Desc;
+  Self.Sort(LogCompare);
+end;
+
+initialization
+  try
+    BottleLog := TBottleLogList.Create;
+    BottleLog.OwnsObjects := true;
+  except
+    ShowMessage('BottleLog\8f\89\8aú\89»\8e¸\94s');
+    Application.Terminate;
+  end;
+
+finalization
+  BottleLog.Free;
+
+end.
diff --git a/bottleclient/MainForm.dfm b/bottleclient/MainForm.dfm
new file mode 100755 (executable)
index 0000000..62a054d
--- /dev/null
@@ -0,0 +1,1995 @@
+object frmSender: TfrmSender
+  Left = 207
+  Top = 798
+  Width = 525
+  Height = 311
+  Caption = 'SSTP Bottle Client'
+  Color = clBtnFace
+  Constraints.MinHeight = 200
+  Constraints.MinWidth = 100
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  Menu = MainMenu
+  OldCreateOrder = False
+  Scaled = False
+  ShowHint = True
+  OnActivate = FormActivate
+  OnClose = FormClose
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object StatusBar: TStatusBar
+    Left = 0
+    Top = 242
+    Width = 513
+    Height = 19
+    Panels = <
+      item
+        Alignment = taCenter
+        Width = 45
+      end
+      item
+        Alignment = taCenter
+        Width = 70
+      end
+      item
+        Alignment = taCenter
+        Width = 40
+      end
+      item
+        Alignment = taCenter
+        Width = 40
+      end
+      item
+        Width = 50
+      end>
+    SimplePanel = False
+  end
+  object ToolBar: TToolBar
+    Left = 0
+    Top = 0
+    Width = 513
+    Height = 24
+    AutoSize = True
+    Flat = True
+    Images = imgIcon
+    TabOrder = 1
+    object tbtnClear: TToolButton
+      Left = 0
+      Top = 0
+      Action = actClear
+    end
+    object tbtnConfirm: TToolButton
+      Left = 23
+      Top = 0
+      Action = actConfirm
+    end
+    object tbtnSend: TToolButton
+      Left = 46
+      Top = 0
+      Action = actSend
+    end
+    object tbtnSeparator: TToolButton
+      Left = 69
+      Top = 0
+      Width = 8
+      Caption = 'tbtnSeparator'
+      ImageIndex = 8
+      Style = tbsSeparator
+    end
+    object tbtnStart: TToolButton
+      Left = 77
+      Top = 0
+      Action = actStart
+    end
+    object tbtnSleep: TToolButton
+      Left = 100
+      Top = 0
+      Action = actSleep
+    end
+    object tbtnSeparator2: TToolButton
+      Left = 123
+      Top = 0
+      Width = 8
+      Caption = 'tbtnSeparator2'
+      ImageIndex = 3
+      Style = tbsSeparator
+    end
+    object tbtnEditConst: TToolButton
+      Left = 131
+      Top = 0
+      Action = actEditConst
+    end
+    object tbtnInsertConst: TToolButton
+      Left = 154
+      Top = 0
+      Hint = '\92è\8c^\8bå\91}\93ü|\92è\8c^\8bå\82Ì\91}\93ü'
+      Caption = '\92è\8c^\8bå\91}\93ü'
+      DropdownMenu = mnPopupConst
+      ImageIndex = 7
+    end
+    object tbtnSetting: TToolButton
+      Left = 177
+      Top = 0
+      Action = actSetting
+    end
+    object tbtnShowLog: TToolButton
+      Left = 200
+      Top = 0
+      Action = actShowLog
+    end
+    object tbtnSeparator3: TToolButton
+      Left = 223
+      Top = 0
+      Width = 8
+      Caption = 'tbtnSeparator3'
+      ImageIndex = 6
+      Style = tbsSeparator
+    end
+    object tbtnRestoreSurface: TToolButton
+      Left = 231
+      Top = 0
+      Action = actRestoreSurface
+    end
+  end
+  object ConstMenuBar: TMenuBar
+    Left = 0
+    Top = 24
+    Width = 513
+    Height = 22
+    AutoSize = True
+    ButtonWidth = 70
+    Caption = 'ConstMenuBar'
+    Color = clBtnFace
+    EdgeBorders = [ebTop]
+    Flat = True
+    ParentColor = False
+    ShowCaptions = True
+    TabOrder = 2
+    Menu = ConstBarMenu
+  end
+  object MediaPlayer: TMediaPlayer
+    Left = 312
+    Top = 8
+    Width = 29
+    Height = 30
+    Enabled = False
+    VisibleButtons = [btPlay]
+    Visible = False
+    TabOrder = 3
+  end
+  object pnlEditor: TPanel
+    Left = 0
+    Top = 46
+    Width = 513
+    Height = 171
+    Align = alClient
+    BevelOuter = bvNone
+    BorderWidth = 2
+    TabOrder = 4
+    object tabChannel: TTabControl
+      Left = 2
+      Top = 143
+      Width = 509
+      Height = 26
+      Align = alBottom
+      DragCursor = crSizeWE
+      OwnerDraw = True
+      ParentShowHint = False
+      PopupMenu = mnPopUpChannelTab
+      RaggedRight = True
+      ShowHint = False
+      TabOrder = 0
+      TabPosition = tpBottom
+      Visible = False
+      OnChange = tabChannelChange
+      OnContextPopup = tabChannelContextPopup
+      OnDragDrop = tabChannelDragDrop
+      OnDragOver = tabChannelDragOver
+      OnDrawTab = tabChannelDrawTab
+      OnEndDrag = tabChannelEndDrag
+      OnMouseDown = tabChannelMouseDown
+      OnMouseMove = tabChannelMouseMove
+    end
+    object memScript: TRichEdit
+      Left = 2
+      Top = 2
+      Width = 509
+      Height = 141
+      Align = alClient
+      Font.Charset = SHIFTJIS_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -12
+      Font.Name = '\82l\82\83S\83V\83b\83N'
+      Font.Style = []
+      HideScrollBars = False
+      Lines.Strings = (
+        '\t\h\s0')
+      ParentFont = False
+      PopupMenu = mnPopUp
+      ScrollBars = ssVertical
+      TabOrder = 1
+      OnChange = memScriptChange
+      OnKeyDown = memScriptKeyDown
+      OnKeyPress = memScriptKeyPress
+    end
+  end
+  object pnlPanel: TPanel
+    Left = 0
+    Top = 217
+    Width = 513
+    Height = 25
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 5
+    object lblMessage: TLabel
+      Left = 72
+      Top = 9
+      Width = 126
+      Height = 11
+      Anchors = [akLeft, akBottom]
+      Caption = '---------------------'
+      Font.Charset = SHIFTJIS_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+      Font.Style = []
+      ParentFont = False
+      Visible = False
+    end
+    object lblIfGhost: TLabel
+      Left = 253
+      Top = 7
+      Width = 32
+      Height = 12
+      Anchors = [akRight, akBottom]
+      Caption = 'Ghost:'
+    end
+    object cbxTargetGhost: TComboBox
+      Left = 291
+      Top = 3
+      Width = 91
+      Height = 18
+      Hint = 'IfGhost\82ð\8ew\92è\82µ\82Ä\91\97\90M\82µ\82Ü\82·'
+      Style = csOwnerDrawVariable
+      Anchors = [akRight, akBottom]
+      ItemHeight = 12
+      TabOrder = 0
+      OnDrawItem = cbxTargetGhostDrawItem
+      OnDropDown = cbxTargetGhostDropDown
+    end
+    object btnSend: TButton
+      Left = 444
+      Top = 0
+      Width = 67
+      Height = 25
+      Action = actSend
+      Anchors = [akRight, akBottom]
+      Default = True
+      TabOrder = 1
+    end
+    object Button2: TButton
+      Left = 384
+      Top = 0
+      Width = 59
+      Height = 25
+      Action = actConfirm
+      Anchors = [akRight, akBottom]
+      TabOrder = 2
+    end
+    object Button3: TButton
+      Left = 2
+      Top = 0
+      Width = 65
+      Height = 25
+      Action = actClear
+      Anchors = [akLeft, akBottom]
+      TabOrder = 3
+    end
+  end
+  object FastSstp: TFastSstp
+    Host = '127.0.0.1'
+    TimeOut = 40000
+    ReportLevel = 0
+    SstpSender = 'SSTP Bottle Client'
+    Sleep = False
+    SstpMethod = smDirectSstp
+    TargetHWnd = 0
+    OnResendTrying = FastSstpResendTrying
+    OnResendEnd = FastSstpResendEnd
+    OnResendResend = FastSstpResendTrying
+    OnResendCountChange = FastSstpResendCountChange
+    Left = 360
+    Top = 72
+  end
+  object NMHTTP: TNMHTTP
+    Port = 0
+    TimeOut = 20000
+    ReportLevel = 0
+    OnDisconnect = NMHTTPDisconnect
+    OnInvalidHost = NMHTTPInvalidHost
+    Body = 'Default.htm'
+    Header = 'Head.txt'
+    HeaderInfo.LocalProgram = 'BottleClient'
+    HeaderInfo.Referer = 'http://bottle.mikage.to/'
+    InputFileMode = False
+    OutputFileMode = False
+    OnSuccess = NMHTTPSuccess
+    OnFailure = NMHTTPFailure
+    ProxyPort = 0
+    Left = 328
+    Top = 72
+  end
+  object MainMenu: TMainMenu
+    AutoHotkeys = maManual
+    Images = imgIcon
+    Left = 296
+    Top = 72
+    object mnFile: TMenuItem
+      Caption = '\83t\83@\83C\83\8b(&F)'
+      object mnSetting: TMenuItem
+        Action = actSetting
+      end
+      object mnStayOnTop: TMenuItem
+        Caption = '\8fí\82É\8eè\91O\82É\95\\8e¦(&F)'
+        Hint = '\8fí\82É\8eè\91O\82É\95\\8e¦'
+        OnClick = mnStayOnTopClick
+      end
+      object mnExit: TMenuItem
+        Action = actExitClient
+      end
+    end
+    object mnEdit: TMenuItem
+      Caption = '\95Ò\8fW(&E)'
+      object mnCut: TMenuItem
+        Action = actEditCut
+      end
+      object mnCopy: TMenuItem
+        Action = actEditCopy
+      end
+      object mnCopyAll: TMenuItem
+        Action = actCopyAll
+      end
+      object mnCopyAllNoReturn: TMenuItem
+        Action = actCopyAllNoReturn
+      end
+      object mnPaste: TMenuItem
+        Action = actEditPaste
+      end
+      object mnSelectAll: TMenuItem
+        Action = actEditSelectAll
+      end
+    end
+    object mnRegister: TMenuItem
+      Caption = '\93o\98^(&C)'
+      object mnStart: TMenuItem
+        Action = actStart
+      end
+      object mnExitAllChannels: TMenuItem
+        Action = actStop
+      end
+      object mnClearBottles: TMenuItem
+        Action = actClearBottles
+      end
+      object N1: TMenuItem
+        Caption = '-'
+      end
+      object mnSleep: TMenuItem
+        Action = actSleep
+      end
+      object N2: TMenuItem
+        Caption = '-'
+      end
+      object mnPrevChannel: TMenuItem
+        Action = actPrevChannel
+      end
+      object mnNextChannel: TMenuItem
+        Action = actNextChannel
+      end
+    end
+    object mnView: TMenuItem
+      Caption = '\95\\8e¦(&V)'
+      object mnEditConst: TMenuItem
+        Tag = -1
+        Action = actEditConst
+        Caption = '\92è\8c^\8bå\83p\83\8c\83b\83g(&P)'
+      end
+      object mnShowToolBar: TMenuItem
+        Caption = '\83c\81[\83\8b\83o\81[(&T)'
+        Hint = '\83c\81[\83\8b\83o\81[\82ð\95\\8e¦/\94ñ\95\\8e¦'
+        OnClick = mnShowToolBarClick
+      end
+      object mnShowConstBar: TMenuItem
+        Caption = '\92è\8c^\8bå\83o\81[(&C)'
+        Hint = '\92è\8c^\8bå\83o\81[\82ð\95\\8e¦/\94ñ\95\\8e¦'
+        OnClick = mnShowConstBarClick
+      end
+      object N3: TMenuItem
+        Action = actShowLog
+      end
+    end
+    object mnScript: TMenuItem
+      Caption = '\83X\83N\83\8a\83v\83g(&S)'
+      object mnConfirm: TMenuItem
+        Action = actConfirm
+      end
+      object mnSend: TMenuItem
+        Action = actSend
+      end
+      object mnClear: TMenuItem
+        Action = actClear
+      end
+      object N9: TMenuItem
+        Caption = '-'
+      end
+      object mnColorScript: TMenuItem
+        Caption = '\83X\83N\83\8a\83v\83g\82Ì\90F\95ª\82¯\82ð\8ds\82¤(&C)'
+        Checked = True
+        Hint = '\83X\83N\83\8a\83v\83g\82Ì\90F\95ª\82¯\82ð\8ds\82¤'
+        ShortCut = 16468
+        OnClick = mnColorScriptClick
+      end
+      object mnRestoreSurface: TMenuItem
+        Action = actRestoreSurface
+      end
+    end
+    object mnHelp: TMenuItem
+      Caption = '\83w\83\8b\83v(&H)'
+      object mnGoToHelp: TMenuItem
+        Caption = '\83w\83\8b\83v\83y\81[\83W(&H)'
+        ImageIndex = 29
+        OnClick = mnGoToHelpClick
+      end
+      object mnGoToHP: TMenuItem
+        Caption = 'SSTP Bottle\83z\81[\83\80\83y\81[\83W(&B)'
+        OnClick = mnGoToHPClick
+      end
+      object mnGotoVote: TMenuItem
+        Caption = '\93\8a\95[\83\89\83\93\83L\83\93\83O\83y\81[\83W(&R)'
+        OnClick = mnGotoVoteClick
+      end
+      object mnGotoGLog: TMenuItem
+        Caption = '\83S\81[\83X\83g\8d\91\90¨\92²\8d¸\83y\81[\83W(&G)'
+        OnClick = mnGotoGLogClick
+      end
+      object N4: TMenuItem
+        Caption = '-'
+      end
+      object mnGetNewId: TMenuItem
+        Caption = '&LUID\8eæ\93¾'
+        OnClick = mnGetNewIdClick
+      end
+      object mnAbout: TMenuItem
+        Caption = '\83o\81[\83W\83\87\83\93\8fî\95ñ(&A)...'
+        Hint = '\83o\81[\83W\83\87\83\93\8fî\95ñ'
+        ImageIndex = 15
+        OnClick = mnAboutClick
+      end
+    end
+  end
+  object ColorDialog: TColorDialog
+    Ctl3D = True
+    Left = 232
+    Top = 72
+  end
+  object ActionList: TActionList
+    Images = imgIcon
+    Left = 200
+    Top = 72
+    object actEditCopy: TEditCopy
+      Category = '\95Ò\8fW'
+      Caption = '\83R\83s\81[(&C)'
+      Hint = '\83R\83s\81['
+      ImageIndex = 2
+      ShortCut = 16451
+    end
+    object actEditCut: TEditCut
+      Category = '\95Ò\8fW'
+      Caption = '\90Ø\82è\8eæ\82è(&T)'
+      Hint = '\90Ø\82è\8eæ\82è'
+      ImageIndex = 4
+      ShortCut = 16472
+    end
+    object actEditPaste: TEditPaste
+      Category = '\95Ò\8fW'
+      Caption = '\93\\82è\95t\82¯(&P)'
+      Hint = '\93\\82è\95t\82¯'
+      ImageIndex = 3
+      ShortCut = 16470
+    end
+    object actEditSelectAll: TEditSelectAll
+      Category = '\95Ò\8fW'
+      Caption = '\82·\82×\82Ä\82ð\91I\91ð(&A)'
+      Hint = '\82·\82×\82Ä\82ð\91I\91ð'
+      ShortCut = 16449
+    end
+    object actTrans: TAction
+      Caption = '\91\97\90M\8e\9e\8c`\8e®\82É\95Ï\8a·'
+      Hint = '\83X\83N\83\8a\83v\83g\82ð\91\97\90M\8e\9e\8c`\8e®\82É\95Ï\8a·'
+      ImageIndex = 6
+      ShortCut = 16468
+    end
+    object actStart: TAction
+      Caption = '\83`\83\83\83\93\83l\83\8b\8eQ\89Á(&S)'
+      Hint = '\83`\83\83\83\93\83l\83\8b\8eQ\89Á|SSTP Bottle\83T\81[\83o\82É\90Ú\91±\82µ\81A\83`\83\83\83\93\83l\83\8b\82É\8eQ\89Á'
+      ImageIndex = 17
+      ShortCut = 16467
+      OnExecute = actStartClick
+    end
+    object actStop: TAction
+      Caption = '\82·\82×\82Ä\82Ì\83`\83\83\83\93\83l\83\8b\82©\82ç\92E\91Þ(&E)'
+      Hint = '\83`\83\83\83\93\83l\83\8b\91S\92E\91Þ|\82·\82×\82Ä\82Ì\83`\83\83\83\93\83l\83\8b\82©\82ç\92E\91Þ'
+      ImageIndex = 18
+      ShortCut = 16453
+      OnExecute = actStopExecute
+    end
+    object actSend: TAction
+      Caption = '\91\97\90M(&S)'
+      Hint = '\91\97\90M|Bottle\82Ì\91\97\90M'
+      ImageIndex = 10
+      ShortCut = 120
+      OnExecute = actSendExecute
+    end
+    object actConfirm: TAction
+      Caption = '\8am\94F(&L)'
+      Hint = '\8am\94F|\83\8d\81[\83J\83\8b\82ÉSSTP\82ð\94­\8ds\82µ\82Ä\95\82Ì\8am\94F'
+      ImageIndex = 13
+      ShortCut = 16460
+      OnExecute = actConfirmExecute
+    end
+    object actClear: TAction
+      Caption = '\83N\83\8a\83A(&C)'
+      Hint = '\83N\83\8a\83A|\90V\82µ\82¢\83\81\83b\83Z\81[\83W\82ð\8dì\90¬'
+      ImageIndex = 0
+      OnExecute = actClearExecute
+    end
+    object actEditConst: TAction
+      Caption = '\92è\8c^\8bå\83p\83\8c\83b\83g\95\\8e¦(&E)'
+      Hint = '\92è\8c^\8bå\83p\83\8c\83b\83g\95\\8e¦|\92è\8c^\8bå\83p\83\8c\83b\83g\82ð\95\\8e¦'
+      ImageIndex = 11
+      OnExecute = actEditConstExecute
+    end
+    object actCopyAll: TAction
+      Caption = '\82·\82×\82Ä\82ð\83R\83s\81[(&B)'
+      Hint = '\95Ò\8fW\92\86\82Ì\91S\82Ä\82Ì\83X\83N\83\8a\83v\83g\82ð\83N\83\8a\83b\83v\83{\81[\83h\82É\83R\83s\81['
+      OnExecute = actCopyAllExecute
+    end
+    object actCopyAllNoReturn: TAction
+      Caption = '\82·\82×\82Ä\82ð\89ü\8ds\82ð\8f\9c\82¢\82Ä\83R\83s\81[(&R)'
+      Hint = '\89ü\8ds\82ð\8eæ\82è\8f\9c\82¢\82Ä1\8ds\82Å\83N\83\8a\83b\83v\83{\81[\83h\82É\83R\83s\81['
+      OnExecute = actCopyAllNoReturnExecute
+    end
+    object actSetting: TAction
+      Caption = '\90Ý\92è(&S)...'
+      Hint = '\90Ý\92è|\8ae\8eí\90Ý\92è\83_\83C\83A\83\8d\83O\82ð\95\\8e¦'
+      ImageIndex = 5
+      OnExecute = actSettingExecute
+    end
+    object actRestoreSurface: TAction
+      Caption = '\83T\81[\83t\83B\83X\95\9c\8bA(&R)'
+      Hint = 
+        '\83T\81[\83t\83B\83X\95\9c\8bA|2\90l\82Ì\83T\81[\83t\83B\83X\82ð\83f\83t\83H\83\8b\83g\82É\95\9c\8bA\82·\82éSSTP\83\8a\83N\83G\83X' +
+        '\83g\82ð\91\97\90M'
+      ImageIndex = 16
+      ShortCut = 121
+      OnExecute = actRestoreSurfaceExecute
+    end
+    object actExitClient: TAction
+      Caption = 'Client\8fI\97¹(&X)'
+      Hint = 'SSTP Bottle Client\82Ì\8fI\97¹'
+      ImageIndex = 14
+      OnExecute = actExitClientExecute
+    end
+    object actClearBottles: TAction
+      Caption = '\96¢\94z\91\97Bottle\8dí\8f\9c(&D)'
+      Hint = '\82Ü\82¾\94z\91\97\82³\82ê\82Ä\82¢\82È\82¢Bottle\82ª\82 \82ê\82Î\81A\82»\82ê\82ð\91S\95\94\8fÁ\8b\8e\82µ\82Ü\82·\81B'
+      ImageIndex = 21
+      OnExecute = actClearBottlesExecute
+    end
+    object actPrevChannel: TAction
+      Caption = '\91O\82Ì\83`\83\83\83\93\83l\83\8b(&P)'
+      Hint = '\91O\82Ì\83`\83\83\83\93\83l\83\8b\82É\88Ú\93®'
+      ImageIndex = 23
+      ShortCut = 16422
+      OnExecute = actPrevChannelExecute
+    end
+    object actNextChannel: TAction
+      Caption = '\8e\9f\82Ì\83`\83\83\83\93\83l\83\8b(&N)'
+      Hint = '\8e\9f\82Ì\83`\83\83\83\93\83l\83\8b\82É\88Ú\93®'
+      ImageIndex = 24
+      ShortCut = 16424
+      OnExecute = actNextChannelExecute
+    end
+    object actShowLog: TAction
+      Caption = '\83\8d\83O\89æ\96Ê\95\\8e¦(&L)'
+      Hint = '\83\8d\83O\95\\8e¦|Bottle\83\8d\83O\83E\83B\83\93\83h\83E\82ð\95\\8e¦\82µ\82Ü\82·'
+      ImageIndex = 25
+      OnExecute = actShowLogExecute
+    end
+    object actSleep: TAction
+      Caption = '\94z\91\97\83X\83\8a\81[\83v(&L)'
+      Hint = '\94z\91\97\83X\83\8a\81[\83v|\8eó\90M\82µ\82½\83{\83g\83\8b\82Ì\94z\91\97\82ð\83X\83\8a\81[\83v\82µ\82Ü\82·'
+      ImageIndex = 19
+      ShortCut = 16465
+      OnExecute = actSleepExecute
+    end
+    object actVoteMessage: TAction
+      Caption = '\82±\82ÌBottle\82É\93\8a\95['
+      Enabled = False
+      Hint = '\82±\82ÌBottle\82É\93\8a\95[\82·\82é'
+      ImageIndex = 28
+      OnExecute = actVoteMessageExecute
+    end
+    object actAgreeMessage: TAction
+      Caption = '\82±\82ÌBottle\82É\93¯\88Ó'
+      Enabled = False
+      Hint = '\82±\82ÌBottle\82É\93¯\88Ó\82·\82é'
+      ImageIndex = 32
+      OnExecute = actAgreeMessageExecute
+    end
+  end
+  object mnPopUp: TPopupMenu
+    Images = imgIcon
+    Left = 168
+    Top = 72
+    object mnPopConst: TMenuItem
+      Tag = -1
+      Caption = '\92è\8c^\8bå\91}\93ü'
+      Hint = '\92è\8c^\8bå\91}\93ü'
+      ImageIndex = 7
+    end
+    object N6: TMenuItem
+      Tag = -1
+      Caption = '-'
+    end
+    object mnPopCut: TMenuItem
+      Tag = -1
+      Action = actEditCut
+    end
+    object mnPopCopy: TMenuItem
+      Tag = -1
+      Action = actEditCopy
+    end
+    object mnPopCopyAll: TMenuItem
+      Action = actCopyAll
+    end
+    object mnPopCopyAllNoReturn: TMenuItem
+      Action = actCopyAllNoReturn
+    end
+    object mnPopPaste: TMenuItem
+      Tag = -1
+      Action = actEditPaste
+    end
+    object mnPopSelectAll: TMenuItem
+      Tag = -1
+      Action = actEditSelectAll
+    end
+  end
+  object TaskTray: TTaskTray
+    PopupMenuR = mnPopUpTaskTray
+    IconID = 1
+    OnDblClick = TaskTrayDblClick
+    Left = 136
+    Top = 72
+  end
+  object ApplicationEvents: TApplicationEvents
+    OnHint = ApplicationEventsHint
+    OnMinimize = ApplicationEventsMinimize
+    OnRestore = ApplicationEventsRestore
+    Left = 72
+    Top = 72
+  end
+  object mnPopUpTaskTray: TPopupMenu
+    Images = imgIcon
+    Left = 104
+    Top = 72
+    object mnTaskExit: TMenuItem
+      Action = actExitClient
+    end
+    object N8: TMenuItem
+      Caption = '-'
+    end
+    object mnTaskRestoreSurface: TMenuItem
+      Action = actRestoreSurface
+    end
+    object mnTaskSleep: TMenuItem
+      Action = actSleep
+    end
+    object mnTaskStart: TMenuItem
+      Action = actStart
+    end
+    object mnTaskEnd: TMenuItem
+      Action = actStop
+    end
+    object mnTaskNewMessage: TMenuItem
+      Caption = '\90V\8bK\83\81\83b\83Z\81[\83W\82ð\8f\91\82­(&N)'
+      Hint = '\8c³\82Ì\83T\83C\83Y\82É\96ß\82µ\82½\82 \82Æ\83N\83\8a\83A'
+      ShortCut = 16462
+      OnClick = mnTaskNewMessageClick
+    end
+    object mnTaskRestore: TMenuItem
+      Caption = '\8c³\82Ì\83T\83C\83Y\82É\96ß\82·(&R)'
+      Default = True
+      Hint = '\83\81\83C\83\93\83E\83B\83\93\83h\83E\82ð\95\\8e¦'
+      OnClick = mnTaskRestoreClick
+    end
+  end
+  object imgIcon: TImageList
+    Left = 8
+    Top = 72
+    Bitmap = {
+      494C010121002200040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000009000000001002000000000000090
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      FF000000FF000000FF000000FF000000FF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000000000000000000000000000FF008080800000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000FCFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000FCFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000FCFF0000FCFF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000808080000000000000FCFF00000000000000000000000000000000000000
+      000000FCFF000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000000000FC
+      FF0000FCFF000000000000FCFF0000FCFF000000000000000000000000000000
+      000000FCFF000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000FCFF00808080000000000000FCFF000000000000000000000000000000
+      000000FCFF000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000FCFF000000000000FCFF0000FCFF000000000000000000C0C0
+      C00000FCFF000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000FCFF0000FCFF0000FCFF00C0C0C000C0C0C00000FC
+      FF0000FCFF0000FCFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000FCFF0000FCFF0000FCFF0000FCFF0000FC
+      FF0000FCFF0000FCFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000FCFF0000FCFF0000FCFF0000FC
+      FF0000FCFF0000FCFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000FCFF0000FCFF0000FC
+      FF0000FCFF0000FCFF0000FCFF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000008000000080000000
+      8000000080000000800000008000000080000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000080000000
+      8000000080000000FF0000008000800080000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000008484
+      84008484840084848400C6C6C600C6C6C6000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000840084008400840084848400000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000084848400FFFF0000FFFF0000FFFF000084840000FFFF0000848400008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      000084848400FFFF0000FFFF0000FFFF000084840000FFFF0000848400008484
+      840084840000000000000000000000000000000000000000000084848400C6C6
+      C600000000000000000000000000848484008484840000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000008400840084008400FFFFFF00FFFFFF0000000000848484000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000FF000000FF00000000
+      000000000000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FFFFFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008400
+      840084008400FFFFFF00FFFFFF00000000000000000000000000000000008484
+      8400000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000FF000000FF000000FF
+      000000FF00000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FFFFFF0000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000848484008400840084008400FFFF
+      FF00FFFFFF000000000000000000840084008400840000000000000000000000
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000FF000000FF000000FF
+      000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FFFFFF00FFFFFF00000000000000000000000000000000000000
+      0000000000000000000000000000000000008484840084008400FFFFFF000000
+      0000000000008400840084008400840084008400840084008400000000000000
+      0000000000008484840000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000C6C6C600FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000FF000000FF000000FF
+      000000FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      00008484840000000000FFFFFF00000000000000000000000000000000000000
+      0000FFFFFF000000000000000000000000008484840000000000000000008400
+      840084008400840084000084840000FFFF008400840084008400840084000000
+      0000000000000000000084848400000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000FF000000FF000000FF
+      000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF00008484
+      000084848400000000000000000000000000000000000000000000000000FFFF
+      FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000
+      0000FFFFFF000000000000000000000000008484840084008400840084008400
+      8400840084008400840084008400008484008400840084008400840084008400
+      8400000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000FF000000FF000000FF
+      000000FF00000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000FFFFFF008484840000000000FFFFFF000000000000000000000000000000
+      0000FFFFFF000000000000000000000000000000000084008400FFFFFF008400
+      84008400840084008400840084008400840000FFFF0000FFFF00840084008400
+      8400840084000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000FF000000FF00000000
+      000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FFFFFF0000000000FFFFFF00FFFFFF000000000000000000C6C6
+      C600FFFFFF00000000000000000000000000000000000000000084008400FFFF
+      FF0084008400840084008400840084008400840084000084840000FFFF0000FF
+      FF00840084008400840000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      00000000000000000000FFFFFF00FFFFFF00FFFFFF00C6C6C600C6C6C600FFFF
+      FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000008400
+      8400FFFFFF00840084008400840084008400008484008400840000FFFF0000FF
+      FF00840084008400840084008400000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000
+      000084008400FFFFFF00840084008400840000FFFF0000FFFF0000FFFF008400
+      8400840084008400840000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000
+      00000000000084008400FFFFFF00840084008400840084008400840084008400
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
+      0000000000000000000084008400FFFFFF008400840084008400000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000008400000084000000
+      8400000084000000840000008400000084000000000000000000000000000000
+      0000000000000000000000000000840084008400840000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000084000000
+      8400000084000000FF0000008400840084000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000848400008484000084
+      8400008484000084840000848400008484000084840000848400008484000084
+      8400008484000084840000848400000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000FFFF008400000000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0084000000840000008400000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      00000000000000000000FFFFFF0000000000FFFFFF0000000000000000000000
+      0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000FFFF008400000000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000000000000848400000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF0000000000FFFF000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000FFFF008400000000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400008484000084840000848400008484000084840000848400008484000084
+      8400008484000084840000000000000000000000000000000000000000000000
+      0000000000008484000084840000848400008484000084840000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF
+      FF000000000000FFFF0000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0084000000840000008400000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000084
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000008484000084840000000000000000000000000000000000000000000000
+      0000848400008484000084840000848400008484000084840000848400000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF00FFFFFF00FFFFFF000000000000000000FFFFFF000000000000000000FFFF
+      FF00000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0084000000840000008400000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF000000000000000000FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF
+      FF0000000000FFFFFF0000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF00840000008400000084000000840000008400000000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF00FFFFFF00FFFFFF000000000000000000FFFFFF000000000000000000FFFF
+      FF00000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF00840000008400000084000000840000008400000000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000FF0000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF00840000008400000084000000840000008400000000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000FFFF
+      FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF00840000008400000084000000840000008400000000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF00840000008400000084000000840000008400000000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000008484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0084000000840000008400000000FFFF0000FFFF0000FF
+      FF0000FFFF0000FFFF0000848400000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000FF000000FF0084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000008400000084000084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF0084840000FFFF0000848400008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C6C6C6008484
+      8400C6C6C6008484840000000000000000000000000000000000008400000084
+      0000FF00000000FF0000008400000084000084840000FFFF0000848400008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000FF00000000000000
+      00000000FF000000FF0000000000000000000000FF0084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C6C6C6008484
+      8400C6C6C600848484000000000000000000000000000084000000FF0000FF00
+      0000FF000000FF00000000FF000000FF00000084000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF00FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C6C6C6008484
+      8400C6C6C6008484840000000000000000000000000000840000FF000000FF00
+      0000FF000000FF000000FF00000000FF000000840000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000084000000FF0000FF000000FF00
+      000000FF0000FF000000FF00000000FF000000FF000000840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      0000000000000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000084000000FF0000FF00000000FF
+      000000FF000000FF0000FF000000FF00000000FF000000840000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      000000000000000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF00FFFFFF00FFFFFF008484
+      00008484840000000000000000000000000000000000FFFF0000FFFF0000FFFF
+      0000FFFF0000FFFF0000000000000000000000000000C6C6C60084848400C6C6
+      C60084848400C6C6C6008484840000000000000000000084000000FF000000FF
+      000000FF000000FF000000FF0000FF00000000840000FFFFFF00FFFFFF008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      000000000000000000000000000000000000000000000000FF00000000000000
+      00000000FF000000FF0000000000000000000000FF00FFFFFF00FFFF0000FFFF
+      00008484840000000000000000000000000000000000FFFF0000000000000000
+      0000FFFF0000FFFF000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000084000000FF000000FF
+      000000FF000000FF000000FF000000FF000000840000FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF00FFFFFF00FFFF0000FFFF00008484
+      00008484840000000000000000000000000000000000FFFF0000000000000000
+      000000000000FFFF000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000008400000084
+      000000FF000000FF00000084000000840000FFFFFF00FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000848400008484000084840000848400008484000084840000848400000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      84000000FF000000FF00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      00008484840000000000000000000000000000000000FFFF0000FFFF00000000
+      000000000000FFFF000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      84000084000000840000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000008484000084840000848400008484000084840000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF00000000FF000000FF000000FF000000FF000000FF000000FF008484
+      00008484840000000000000000000000000000000000FFFF0000FFFF0000FFFF
+      0000FFFF0000FFFF000000000000000000000000000000000000000000000000
+      FF000000FF000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400008484000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF00000000FF000000FF000000FF000000FF000000FF000000FF00FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF0000000000000000000000000000000000000000008484
+      8400FFFF0000840000008400000084000000840000008400000084000000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000848400000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000FF000000FF00
+      0000FF000000000000000000000000000000000000000000FF000000FF000000
+      FF000000FF000000FF000000FF00000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      FF000000FF000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF00000000000000000000000000000000000000000000000000FF000000FF00
+      0000FF0000000000000000000000000000000000FF000000FF000000FF000000
+      FF000000FF000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF000000FF0000000000000000000000000000000000FF000000FF00
+      0000FF0000000000000000000000000000000000FF000000FF000000FF000000
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      00000000FF000000FF0084848400848484008484840084848400848484008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      84008484000000000000000000000000000000000000FFFF0000FFFF0000FFFF
+      0000FFFF0000FFFF0000FFFF0000FFFF000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000000000
+      000084848400FFFF0000FFFF0000FFFF000084840000FFFF0000848400008484
+      84008484000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF0084840000FFFF0000848400008484
+      8400848400000000000000000000000000000000000000000000000000000000
+      000084848400FFFF0000FFFF0000FFFF000084840000FFFF0000848400008484
+      84008484000000000000000000000000000000000000FFFF0000FFFF00000000
+      8400FFFF00000000840000008400FFFF000000000000C6C6C600000084000000
+      840000008400C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      000084848400000000000000000000000000000000000000FF00000000000000
+      00000000FF000000FF0000000000000000000000FF0084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000FFFF00000000
+      8400FFFF0000000084000000840000000000C6C6C600C6C6C60000008400C6C6
+      C60000008400C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF0000FFFF0000FFFF
+      000084848400000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF00FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000FFFF00000000
+      8400FFFF0000000084000000840000000000C6C6C600C6C6C600000084000000
+      840000008400C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF00008484
+      0000848484000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000FFFF0000FFFF
+      0000FFFF0000FFFF0000FFFF000000000000C6C6C600C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFF0000FFFF
+      000084848400000000000000000000000000000000000000000000000000FFFF
+      0000FFFF0000FFFF0000000000000000000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008484
+      000084848400000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF00FFFFFF00FFFFFF008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF0000FFFF
+      000084848400000000000000000000000000000000000000FF00000000000000
+      00000000FF000000FF0000000000000000000000FF00FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C6C6C600C6C6
+      C600C6C6C6000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFFFF00FFFFFF00FFFF0000FFFF00008484
+      00008484840000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF00FFFFFF00FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFFFF00FFFFFF00FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      84000000FF000000FF00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000084000000000000000000
+      0000840000008400000000000000000000000000000000000000C6C6C600C6C6
+      C600C6C6C6000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF00000000FF000000FF000000FF000000FF000000FF000000FF008484
+      0000848484000000000000000000000000008400000084000000840000000000
+      00000000000000000000840000000000000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000008484
+      8400FFFF0000840000008400000084000000840000008400000084000000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000840000008400000084000000840000008400000084000000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF00000000FF000000FF000000FF000000FF000000FF000000FF00FFFF
+      0000848484000000000000000000000000000000000084000000000000000000
+      00008400000084000000840000000000000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000008400000084000000840000000000
+      00008400000000000000000000000000000000000000C6C6C600C6C6C600C6C6
+      C600C6C6C600C6C6C60000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000084000000000000000000
+      0000000000008400000084000000000000000000000000000000C6C6C600C6C6
+      C600C6C6C6000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF00000000000000000000000000000000008400000000000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000008400000084000000840000008400000084000000840000000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF000000FF0000000000000000000000000000000000008400000000
+      0000000000000000000000000000008400000084000000840000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000840000000000000000000000840000008400000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFF000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000848484008484840000000000000000000000
+      0000000000000000000000000000000000000084000000840000008400000084
+      0000008400000000000000000000000000000000000000840000008400000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FF000000FF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFF000000000000848400000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008484840084848400000000000000
+      0000000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000840000008400000084000000840000000000000000
+      000000000000000000000000000000000000000000000000FF000000FF000000
+      FF000000FF000000FF000000FF000000FF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFF000000000000848400008484
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000FFFF0000FFFF000000000084848400848484000000
+      0000000000000000000000000000000000000084000000840000008400000084
+      0000008400000000000000840000008400000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FF000000FF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      00000000000000FFFF0000FFFF0000FFFF0000FFFF0000000000848484008484
+      8400000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000840000008400000000000000000000008400000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      00000000000000FFFF0000FFFF00000000008484840000000000000000000000
+      0000000000000000000000000000000000000000000000840000000000000084
+      0000000000000000000000000000008400000084000000840000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000CED6DE008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      0000000000008484840000FFFF0000FFFF000000000000000000000000000000
+      0000000000000000000000000000000000000084000000000000000000000000
+      0000008400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000FFFF0000FFFF008484840084848400848484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      000000000000000000008484840000FFFF0000FFFF0000000000848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008400
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      00000000000000000000848484000000000000FFFF0000FFFF00000000008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000000000
+      0000840000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE0000000000FFFF000000000000848400008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000FFFF0000FFFF0000FFFF0000FFFF00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE00CED6DE0000000000FFFF0000000000008484
+      0000848400000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000FFFF0000FFFF0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000000000
+      0000840000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE00CED6DE00CED6DE0000000000FFFF00000000
+      0000848400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000084848400848484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000000000
+      0000840000000000000000000000000000000000000000000000000000000000
+      0000000000008484840000000000000000000000000000000000000000000000
+      0000000000000000000084848400000000000000000000000000000000000000
+      0000CED6DE00CED6DE00CED6DE00CED6DE00CED6DE00CED6DE0000000000FFFF
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000848484008484840084848400848484008484
+      8400848484008484840000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000FFFF0000FFFF00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000000000008400000000000000840000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000000000008400000000000000840000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF000084840000FFFF000084840000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000FF000000FF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000084000000840000008400000084
+      0000008400000000000000840000000000000084000000000000008400000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF0000FFFF0000FFFF
+      000084848400000000000000000000000000000000000000FF000000FF000000
+      FF000000FF000000FF000000FF000000FF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000840000000000000084000000000000008400000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000FF000000FF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000084000000840000008400000084
+      0000008400000000000000840000000000000084000000000000008400000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFFFF00FFFFFF00FFFFFF00C6C6C600FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000FF0000000000840000008400000084000000840000008400
+      0000840000000000000000000000000000000000000000000000008400000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008484
+      0000848484000000000000000000000000000000000000000000000000008484
+      84000000FF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      00000000000000000000FF000000FF000000FF00000000000000000000000000
+      0000000000000000000000000000000000000000000000840000000000000084
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFFFF00C6C6C600FFFFFF00FFFFFF00FFFF0000FFFF
+      00008484840000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF00FFFFFF00FFFFFF00FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      00000000000084000000FF000000FF000000FF00000000840000008400000084
+      000000840000FF00000084000000000000000084000000000000000000000000
+      0000008400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFFFF00FFFFFF00FFFF0000FFFF00008484
+      000084848400000000000000000000000000000000000000FF000000FF000000
+      00000000FF000000FF00000000000000FF000000FF00FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FF000000FF000000FF000000FF00000000840000008400000084
+      00000084000084840000FF000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      000084848400000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF00FFFF0000FFFF0000FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FF000000FF000000000000000084000000840000008400000084
+      000000840000FF000000FF000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00008484
+      0000848484000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF00FFFF00008484
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FF00000000000000008400000084000000840000008400008400
+      0000848400008400000000840000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400FFFF0000008484000084840000848400008484000084840000008400FFFF
+      0000848484000000000000000000000000000000FF000000FF000000FF000000
+      00000000000000000000000000000000FF000000FF000000FF0000008400FFFF
+      0000848484000000000000000000000000000000000000000000000000000000
+      000000000000FF000000C6C6C600000000000000000084000000008400000084
+      0000FF0000000084000000840000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484008484840084848400848484008484840084848400848484008484
+      840000000000000000000000000000000000000000000000FF00000000000000
+      0000000000000000000000000000000000000000FF0084848400848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FF000000FFFFFF00C6C6C600FF000000FF000000FF00
+      0000FF0000000084000000840000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000848400008484000084840000848400000084000000
+      000000000000000000000000000000000000000000000000FF000000FF000000
+      00000000FF000000FF00000000000000FF000000FF0000848400000084000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FFFFFF00C6C6C600FFFFFF0000000000008400000084
+      0000008400000084000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000084840000848400008484000084840000848400000084000000
+      00000000000000000000000000000000000000000000000000000000FF000000
+      FF000000FF000000FF000000FF000000FF000084840000848400000084000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000084840000C6C6C600000000000000
+      0000008400000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000FF000000FF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000840000008400000084000000840000008400000084000000840000008400
+      0000840000008400000084000000840000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000840000008400000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000008400
+      0000848484000000000000000000000000000000000000000000000000008400
+      0000000000000000000084000000000000000000000084000000840000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000084848400FFFFFF000000
+      0000840000008400000084000000840000008400000000000000000000000000
+      0000840000008400000084000000840000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000008400
+      0000840000008484840000000000000000000000000000000000000000008400
+      0000000000000000000084000000000000008400000000000000000000008400
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000084848400FFFF
+      FF00000000000000000084000000840000000000000000000000000000000000
+      0000000000008400000084000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000840000008400
+      0000840000008400000084848400000000000000000000000000000000008400
+      0000000000000000000084000000000000008400000000000000000000008400
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000FFFF00FFFFFF00FFFFFF00FFFFFF0000FF
+      FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000008484
+      8400FFFFFF000000000000000000840000008400000000000000000000000000
+      00000000000084000000840000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00840000008400
+      0000840000008400000084000000000000000000000000000000000000000000
+      0000840000008400000084000000000000008400000000000000000000008400
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFFFF00FFFFFF0000FFFF00FFFFFF00FFFF
+      FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000
+      000084848400FFFFFF0000000000000000008400000084000000840000008400
+      00008400000084000000840000000000000000000000FFFFFF00000000000000
+      0000000000000000000000000000000000000000000000000000840000008400
+      0000840000008400000000000000000000000000000000000000000000000000
+      0000000000000000000084000000000000008400000084000000840000000000
+      000000000000000000000000000000000000000000000000000000000000FFFF
+      FF0000000000000000000000000000FFFF00FFFFFF0000000000FFFFFF0000FF
+      FF000000000000000000FFFFFF00000000000000000000000000000000000000
+      00000000000084848400FFFFFF00000000000000000084000000840000000000
+      00000000000084000000840000000000000000000000FFFFFF00FFFFFF000000
+      00000000000000000000FFFFFF00000000000000000000000000840000008400
+      0000840000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000000000008400000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FFFFFF000000
+      0000FFFFFF000000000000000000FFFFFF000000000000FFFF0000000000FFFF
+      FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000
+      0000000000000000000084848400FFFFFF000000000000000000840000008400
+      00000000000084000000840000000000000000000000FFFFFF00000000008484
+      8400848484008484840000000000848484008484840084848400840000008400
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+      FF0000000000FFFFFF000000000000FFFF00FFFFFF00FFFFFF00FFFFFF000000
+      0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
+      000000000000000000000000000084848400FFFFFF0000000000000000008400
+      00008400000084000000840000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF0084848400FFFFFF00FFFFFF00FFFFFF00848484008484840084000000FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FFFFFF000000
+      0000FFFFFF000000000000000000FFFFFF00FFFFFF0000FFFF00FFFFFF00FFFF
+      FF00FFFFFF0000FFFF00FFFFFF00000000000000000084848400000000008484
+      84000000000000000000000000000000000084848400FFFFFF00000000000000
+      00008400000084000000840000000000000000000000FFFFFF00000000000000
+      000084848400848484008484840084848400848484008484840000000000FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000FFFF
+      FF0000000000FFFFFF000000000000FFFF00FFFFFF0000000000FFFFFF0000FF
+      FF000000000000000000FFFFFF00000000008484840000000000000000000000
+      0000848484000000000000000000000000000000000084848400FFFFFF000000
+      00000000000084000000840000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF0084848400FFFFFF00848484008484840000000000FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000FFFFFF000000000000000000FFFFFF000000000000FFFF0000000000FFFF
+      FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000084848400FFFF
+      FF000000000000000000000000000000000000000000FFFFFF00000000000000
+      00000000000084848400FFFFFF0084848400848484000000000000000000FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000FFFF00FFFFFF00FFFFFF00FFFFFF000000
+      0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      84000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00848484008484840000000000FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFFFF00FFFFFF0000FFFF00FFFFFF00FFFF
+      FF00FFFFFF0000FFFF00FFFFFF00000000000000000084848400000000008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      000000000000000000008484840084848400000000000000000000000000FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000840000008400000084000000840000008400
+      0000840000008400000084000000840000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000840000008400000084000000840000008400
+      0000840000008400000084000000000000000000000000000000000000000000
+      0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00840000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000000000000000000084848400008484008484
+      8400008484008484840084000000FFFFFF008400000084000000840000008400
+      00008400000084000000FFFFFF00840000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000FFFFFF000000000000000000000000000000
+      000000000000FFFFFF0084000000000000000000000000848400848484000084
+      8400848484000084840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00840000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000000000000000000084840000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000000000000000000084848400008484008484
+      8400008484008484840084000000FFFFFF00840000008400000084000000FFFF
+      FF00840000008400000084000000840000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400000000000084840000848400000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000FFFFFF000000000000000000000000000000
+      000000000000FFFFFF0084000000000000000000000000848400848484000084
+      8400848484000084840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF0084000000FFFFFF0084000000000000000000000000000000000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000848400008484
+      0000848400008484000084840000848400008484000000000000848400008484
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000000000000000000084848400008484008484
+      8400008484008484840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF008400000084000000000000000000000000000000FFFFFF00000000000000
+      000084848400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00000000000000000000000000000000000000000000000000848400008484
+      0000848400008484000084840000848400008484000084840000000000008484
+      00008484000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000FFFFFF000000000000000000FFFFFF008400
+      0000840000008400000084000000000000000000000000848400848484000084
+      8400848484000084840084000000840000008400000084000000840000008400
+      0000840000000000000000000000000000000000000084848400FFFFFF008484
+      840084848400FFFFFF00FFFFFF0084848400FFFFFF00FFFFFF00000000000000
+      0000000000000000000000000000000000000000000000000000848400008484
+      0000848400008484000084840000848400008484000000000000848400008484
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF008400
+      0000FFFFFF008400000000000000000000000000000084848400008484008484
+      8400008484008484840000848400848484000084840084848400008484008484
+      84000084840000000000000000000000000000000000000000008484840000FF
+      FF0084848400FFFFFF0084848400FFFFFF00FFFFFF00FFFFFF0000000000FFFF
+      FF00848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000848400000000000084840000848400000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF008400
+      0000840000000000000000000000000000000000000000848400848484000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      84008484840000000000000000000000000000000000FFFFFF00FFFFFF008484
+      8400FFFFFF0000FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084840000000000000000000084840000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      0000FFFFFF000000000084000000840000008400000084000000840000008400
+      0000000000000000000000000000000000000000000084848400848484000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400008484000000000000000000000000000000000000000000848484008484
+      840000FFFF00FFFFFF00FFFFFF00848484008484840084848400848484000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF0000000000FFFFFF00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000848400848484000084
+      84000000000000FFFF00000000000000000000FFFF0000000000848484000084
+      84008484840000000000000000000000000000000000000000008484840000FF
+      FF008484840000FFFF0084848400FFFFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000FFFF0000FFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000084848400FFFFFF000000
+      000084848400FFFFFF0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FFFFFF00000000000000
+      000084848400FFFFFF00000000000000000084848400FFFFFF00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000900000000100010000000000800400000000000000000000
+      000000000000000000000000FFFFFF00E0FF000000000000807F000000000000
+      807F000000000000C1FF000000000000F1FF000000000000F0E7000000000000
+      C0E3000000000000C063000000000000E063000000000000F001000000000000
+      F801000000000000FC01000000000000FE01000000000000FF00000000000000
+      FF80000000000000FFC0000000000000E0FFFE3FF0077007807FF81FF0071007
+      807FE04FE0070007C1FF8067E0070007F1FF0033E0070007F0E70019E0070007
+      C0E3000CE0070007C0630005E0070007E0638001E0070007F001C001E0070007
+      F801E000E0076007FC01F000E007E007FE01F803F00FF00FFF00FC0FF00FF00F
+      FF80FE3FFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001C001
+      FFFF000180018031FFFF000180018031FEFF000180018031FC7F000180018001
+      F83F000180018001F01F000180018001E00F000180018FF1C007000180018FF1
+      F83F000180018FF1F83F000180018FF1F83F010180018FF1F83FC38780018FF5
+      FFFFFFFF80018001FFFFFFFFFFFFFFFFF007FFC3F007FFFFC007FF81C007FFFF
+      8007FF818007FFFF8007FF818007F83F0007FF810007F83F000783810007F83F
+      800701008007F83F800731818007C007C00739E7C007E00FE00719FFE007F01F
+      E00701E7E007F83FE0077DC3E007FC7FF00F4581F00FFEFFF00F83E7F00FFFFF
+      F00FC707F81FFFFFC003C70FF81FFFFF8001F007F007F0070001F007C007F007
+      0001E0078007E0078001E0078007E0078001E0070007E0078001E0070007E007
+      C101E0078007E007E301E0078007E007FF83E007C007E007FFC7E007E007E007
+      B383E007E007E0071D01E007E007E007B101F00FF00FF00F1701F00FF00FF00F
+      B983F81FF81FF00F5FC7F81FF81FC003DE3FF3FFFE3FFFFFDD9FE10FFE1FFE7F
+      079F00F7FE0FFC3FDC3F007B0000F81F04FF0080E003F00FDCDFF1FEE003F05F
+      AE3FF006E003F83F77C7FBF9E003F81FFF39FA08E003FC0FFF6DFA08E003FC0F
+      FED6FA08E003F81FFEFEFA08E003FC3FFED6FBF8E003FE1FFF55F800E003FF0F
+      FF39FC00E003FE1FFFC7FE00FFFFFF3FFFFFFFFFF3FFDEBFF00FF00FF1FFDEBF
+      E007E00700FF055FE007E007007FDD5FE007E0070007055FE007E007F003DFFF
+      E007E007F005AFFFE007C007F80177C7E0078007F800FF39E0078007F900FF7D
+      E0070007FA00FEFEE0070007F980FEE2F00F800FFC01FEEEF81F801FFC41FF6D
+      F81FC01FFF33FF39FFFFF3FFFFFFFFC7FFFFFFFFF000FFCFF3FF001FFFFFFFC7
+      ED9F7FDF9070FFC3ED6F3C00CCF90001ED6F5C00E6790001F16F6C00F3013FC3
+      FD1F4000F9991DC7FC7F1400FCC92207FEFF280076610007FC7F940027313027
+      FD7FC80007990047F93FE400AFCF3867FBBFF000AFEF0087FBBFFC008FFF3CE7
+      FBBFFC00DFFF0007FFFFFFFFFFFF0007F003FFFFFFFFFFFFF7FBFFFFFFFFFC00
+      F00BFFFFFC018000F00BFB7FFC010000F00BF93FFC010000F00BF81F00010000
+      F00B800F00010001F00B800700010003B00B8003000100038003800700030003
+      C027800F00070003802FF81F000F0FC3C01FF93F00FF0003C0FFFB7F01FF8007
+      93FFFFFF03FFF87FB33FFFFFFFFFFFFF}
+  end
+  object mnPopupConst: TPopupMenu
+    Images = imgIcon
+    Left = 40
+    Top = 74
+  end
+  object ConstBarMenu: TMainMenu
+    AutoHotkeys = maManual
+    Left = 264
+    Top = 72
+  end
+  object LabelTimer: TTimer
+    Enabled = False
+    Interval = 5000
+    OnTimer = LabelTimerTimer
+    Left = 80
+    Top = 199
+  end
+  object SsParser: TSsParser
+    Left = 424
+    Top = 72
+  end
+  object Slpp20: TSlpp20
+    Host = 'bottle.mikage.to'
+    TimeOut = 60000
+    ReportLevel = 0
+    OnDisconnect = Slpp20Disconnect
+    OnConnect = Slpp20Connect
+    OnConnectionFailed = Slpp20ConnectionFailed
+    OnSlppEvent = Slpp20SlppEvent
+    DebugMode = False
+    Left = 392
+    Top = 72
+  end
+  object mnPopUpChannelTab: TPopupMenu
+    Left = 8
+    Top = 110
+    object mnLeaveThisChannel: TMenuItem
+      Caption = '\82±\82Ì\83`\83\83\83\93\83l\83\8b\82©\82ç\94²\82¯\82é'
+      OnClick = mnLeaveThisChannelClick
+    end
+    object mnCanAutoAdd: TMenuItem
+      Caption = '\82±\82Ì\83`\83\83\83\93\83l\83\8b\82Í\8e©\93®\89Á\93ü\82Ì\91Î\8fÛ'
+      OnClick = mnCanAutoAddClick
+    end
+    object mnWarnPost: TMenuItem
+      Caption = '\82±\82Ì\83`\83\83\83\93\83l\83\8b\82É\93\8a\8de\82·\82é\82Æ\82«\8am\94F\82·\82é'
+      OnClick = mnWarnPostClick
+    end
+  end
+  object NMHTTPGhost: TNMHTTP
+    Port = 0
+    TimeOut = 20000
+    ReportLevel = 0
+    Body = 'Default.htm'
+    Header = 'Head.txt'
+    HeaderInfo.LocalProgram = 'BottleClient'
+    HeaderInfo.Referer = 'http://bottle.mikage.to/'
+    InputFileMode = False
+    OutputFileMode = True
+    ProxyPort = 0
+    Left = 328
+    Top = 106
+  end
+  object NMURL: TNMURL
+    Left = 328
+    Top = 136
+  end
+  object SakuraSeeker: TSakuraSeeker
+    OnDetectResultChanged = SakuraSeekerDetectResultChanged
+    FileMappingTarget.Strings = (
+      'Sakura')
+    Left = 456
+    Top = 72
+  end
+end
diff --git a/bottleclient/MainForm.pas b/bottleclient/MainForm.pas
new file mode 100755 (executable)
index 0000000..e052b03
--- /dev/null
@@ -0,0 +1,1993 @@
+unit MainForm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  Menus, NMHttp, StdCtrls, ComCtrls, Psock, FastSstp, BRegExp, BottleDef,
+  IniFiles, ExtCtrls, ShellAPI, StdActns, ActnList, ConstList,
+  ConstEditor, AppEvnts, TaskTray, ImgList, ToolWin, Buttons, MenuBar,
+  RichEdit, Clipbrd, ColorCBX, SsParser, MPlayer, SakuraSeeker,
+  Slpp20, HeadValue, OleCtrls, SHDocVw, SakuraAPI, NMURL, Logs;
+
+type
+  TfrmSender = class(TForm)
+    FastSstp: TFastSstp;
+    NMHTTP: TNMHTTP;
+    MainMenu: TMainMenu;
+    mnFile: TMenuItem;
+    mnExit: TMenuItem;
+    mnRegister: TMenuItem;
+    mnStart: TMenuItem;
+    mnScript: TMenuItem;
+    StatusBar: TStatusBar;
+    mnHelp: TMenuItem;
+    mnAbout: TMenuItem;
+    mnEditConst: TMenuItem;
+    ColorDialog: TColorDialog;
+    ActionList: TActionList;
+    actEditCopy: TEditCopy;
+    actEditCut: TEditCut;
+    actEditPaste: TEditPaste;
+    actEditSelectAll: TEditSelectAll;
+    mnPopUp: TPopupMenu;
+    mnPopPaste: TMenuItem;
+    mnPopCut: TMenuItem;
+    mnPopCopy: TMenuItem;
+    mnPopSelectAll: TMenuItem;
+    actTrans: TAction;
+    N6: TMenuItem;
+    mnPopConst: TMenuItem;
+    mnEdit: TMenuItem;
+    mnPaste: TMenuItem;
+    mnCopy: TMenuItem;
+    mnCut: TMenuItem;
+    mnSelectAll: TMenuItem;
+    TaskTray: TTaskTray;
+    ApplicationEvents: TApplicationEvents;
+    mnPopUpTaskTray: TPopupMenu;
+    mnTaskStart: TMenuItem;
+    mnTaskEnd: TMenuItem;
+    mnTaskRestore: TMenuItem;
+    mnTaskNewMessage: TMenuItem;
+    actStart: TAction;
+    actStop: TAction;
+    N8: TMenuItem;
+    mnTaskExit: TMenuItem;
+    actSend: TAction;
+    actConfirm: TAction;
+    actClear: TAction;
+    mnSend: TMenuItem;
+    mnConfirm: TMenuItem;
+    mnClear: TMenuItem;
+    N9: TMenuItem;
+    imgIcon: TImageList;
+    mnPopupConst: TPopupMenu;
+    actEditConst: TAction;
+    mnView: TMenuItem;
+    mnShowToolBar: TMenuItem;
+    mnShowConstBar: TMenuItem;
+    ConstBarMenu: TMainMenu;
+    ToolBar: TToolBar;
+    tbtnClear: TToolButton;
+    tbtnConfirm: TToolButton;
+    tbtnSend: TToolButton;
+    tbtnSeparator: TToolButton;
+    tbtnStart: TToolButton;
+    tbtnSeparator2: TToolButton;
+    tbtnInsertConst: TToolButton;
+    ConstMenuBar: TMenuBar;
+    mnGoToHP: TMenuItem;
+    LabelTimer: TTimer;
+    mnColorScript: TMenuItem;
+    mnRestoreSurface: TMenuItem;
+    mnCopyAll: TMenuItem;
+    actCopyAll: TAction;
+    actCopyAllNoReturn: TAction;
+    mnCopyAllNoReturn: TMenuItem;
+    mnPopCopyAll: TMenuItem;
+    mnPopCopyAllNoReturn: TMenuItem;
+    actSetting: TAction;
+    tbtnSetting: TToolButton;
+    mnStayOnTop: TMenuItem;
+    mnSetting: TMenuItem;
+    actRestoreSurface: TAction;
+    tbtnSeparator3: TToolButton;
+    tbtnRestoreSurface: TToolButton;
+    mnTaskRestoreSurface: TMenuItem;
+    actExitClient: TAction;
+    SsParser: TSsParser;
+    tbtnEditConst: TToolButton;
+    actClearBottles: TAction;
+    mnClearBottles: TMenuItem;
+    MediaPlayer: TMediaPlayer;
+    SakuraSeeker: TSakuraSeeker;
+    Slpp20: TSlpp20;
+    mnGetNewId: TMenuItem;
+    actNextChannel: TAction;
+    actPrevChannel: TAction;
+    N2: TMenuItem;
+    mnNextChannel: TMenuItem;
+    mnPrevChannel: TMenuItem;
+    actShowLog: TAction;
+    N3: TMenuItem;
+    tbtnShowLog: TToolButton;
+    tbtnSleep: TToolButton;
+    actSleep: TAction;
+    N1: TMenuItem;
+    mnSleep: TMenuItem;
+    mnTaskSleep: TMenuItem;
+    pnlEditor: TPanel;
+    tabChannel: TTabControl;
+    memScript: TRichEdit;
+    pnlPanel: TPanel;
+    lblMessage: TLabel;
+    cbxTargetGhost: TComboBox;
+    actVoteMessage: TAction;
+    mnPopUpChannelTab: TPopupMenu;
+    mnLeaveThisChannel: TMenuItem;
+    mnCanAutoAdd: TMenuItem;
+    NMHTTPGhost: TNMHTTP;
+    NMURL: TNMURL;
+    N4: TMenuItem;
+    mnGotoVote: TMenuItem;
+    mnGotoGLog: TMenuItem;
+    mnGoToHelp: TMenuItem;
+    btnSend: TButton;
+    Button2: TButton;
+    Button3: TButton;
+    mnWarnPost: TMenuItem;
+    mnExitAllChannels: TMenuItem;
+    actAgreeMessage: TAction;
+    procedure actConfirmExecute(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure actSendExecute(Sender: TObject);
+    procedure NMHTTPFailure(Cmd: CmdType);
+    procedure NMHTTPSuccess(Cmd: CmdType);
+    procedure actStartClick(Sender: TObject);
+    procedure actStopExecute(Sender: TObject);
+    procedure NMHTTPInvalidHost(var Handled: Boolean);
+    procedure FormShow(Sender: TObject);
+    procedure mnAboutClick(Sender: TObject);
+    procedure actExitClientExecute(Sender: TObject);
+    procedure actClearExecute(Sender: TObject);
+    procedure memScriptChange(Sender: TObject);
+    procedure mnStayOnTopClick(Sender: TObject);
+    procedure mnColorScriptClick(Sender: TObject);
+    procedure actEditConstExecute(Sender: TObject);
+    procedure mnTaskBarClick(Sender: TObject);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure ApplicationEventsMinimize(Sender: TObject);
+    procedure ApplicationEventsRestore(Sender: TObject);
+    procedure mnTaskRestoreClick(Sender: TObject);
+    procedure TaskTrayDblClick(Seft: TObject; Button: TMouseButton);
+    procedure FormActivate(Sender: TObject);
+    procedure mnTaskNewMessageClick(Sender: TObject);
+    procedure NMHTTPDisconnect(Sender: TObject);
+    procedure ApplicationEventsHint(Sender: TObject);
+    procedure memScriptKeyDown(Sender: TObject; var Key: Word;
+      Shift: TShiftState);
+    procedure mnShowToolBarClick(Sender: TObject);
+    procedure mnShowConstBarClick(Sender: TObject);
+    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
+    procedure mnGoToHPClick(Sender: TObject);
+    procedure LabelTimerTimer(Sender: TObject);
+    procedure actRestoreSurfaceExecute(Sender: TObject);
+    procedure actCopyAllExecute(Sender: TObject);
+    procedure actCopyAllNoReturnExecute(Sender: TObject);
+    procedure Slpp20SlppEvent(EventType: TSlppEventType;
+      const Param: String);
+    procedure FastSstpResendCountChange(Sender: TObject);
+    procedure actSettingExecute(Sender: TObject);
+    procedure memScriptKeyPress(Sender: TObject; var Key: Char);
+    procedure Slpp20Disconnect(Sender: TObject);
+    procedure actClearBottlesExecute(Sender: TObject);
+    procedure SakuraSeekerDetectResultChanged(Sender: TObject);
+    procedure mnGetNewIdClick(Sender: TObject);
+    procedure tabChannelChange(Sender: TObject);
+    procedure actPrevChannelExecute(Sender: TObject);
+    procedure actNextChannelExecute(Sender: TObject);
+    procedure cbxTargetGhostDropDown(Sender: TObject);
+    procedure FastSstpResendTrying(Sender: TObject; ID: Integer;
+      const Script: String);
+    procedure FastSstpResendEnd(Sender: TObject; ID: Integer;
+      const Script: String);
+    procedure actShowLogExecute(Sender: TObject);
+    procedure Slpp20Connect(Sender: TObject);
+    procedure actSleepExecute(Sender: TObject);
+    procedure Slpp20ConnectionFailed(Sender: TObject);
+    procedure tabChannelDrawTab(Control: TCustomTabControl;
+      TabIndex: Integer; const Rect: TRect; Active: Boolean);
+    procedure Button1Click(Sender: TObject);
+    procedure actVoteMessageExecute(Sender: TObject);
+    procedure tabChannelContextPopup(Sender: TObject; MousePos: TPoint;
+      var Handled: Boolean);
+    procedure mnLeaveThisChannelClick(Sender: TObject);
+    procedure mnCanAutoAddClick(Sender: TObject);
+    procedure mnGotoVoteClick(Sender: TObject);
+    procedure mnGotoGLogClick(Sender: TObject);
+    procedure tabChannelMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure mnGoToHelpClick(Sender: TObject);
+    procedure tabChannelMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure tabChannelDragOver(Sender, Source: TObject; X, Y: Integer;
+      State: TDragState; var Accept: Boolean);
+    procedure tabChannelDragDrop(Sender, Source: TObject; X, Y: Integer);
+    procedure tabChannelEndDrag(Sender, Target: TObject; X, Y: Integer);
+    procedure cbxTargetGhostDrawItem(Control: TWinControl; Index: Integer;
+      Rect: TRect; State: TOwnerDrawState);
+    procedure mnWarnPostClick(Sender: TObject);
+    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+    procedure actAgreeMessageExecute(Sender: TObject);
+  private
+    FSleeping: boolean;
+    FStatusText: String;
+    FConnecting: boolean;
+    FAdded: boolean;
+    FBooted: boolean; //\8f\89\89ñ\8bN\93®\92Ê\90M\97p
+    FBooted2:boolean; //\8bN\93®\8e\9e\83`\83\83\83\93\83l\83\8b\93o\98^\97p
+    FOriginalCaption: String;
+    FAutoAddAfterGetChannel: boolean;
+    //\83X\83N\83\8a\83v\83g\90F\95ª\82¯\97p\82Ì\95Ï\90\94
+    FRequireColoring: boolean;
+    FUnyuTalking: boolean;
+    FLastSurfaceH: integer;
+    FLastSurfaceU: integer;
+    FColoringPos: integer;     //\90F\95ª\82¯\8dÏ\82Ý\82Ì\83X\83N\83\8a\83v\83g\82Ì\83o\83C\83g\90\94
+    FColoredElements: integer; //\90F\95ª\82¯\8dÏ\82Ý\82Ì\83G\83\8c\83\81\83\93\83g\82Ì\90\94
+    FcolorTimeLag: Int64; //\95Ï\8a·\8aJ\8en\82Ü\82Å\82Ì\83J\83E\83\93\83^
+    //
+    FMutex: THandle; //Mutex\83I\83u\83W\83F\83N\83g\81c\93ñ\8fd\8bN\93®\96h\8e~\97p
+    //
+    FChannelList: TChannelList; //\83`\83\83\83\93\83l\83\8b\83\8a\83X\83g\82ð\95Û\8e\9d\82·\82é
+    FJoinChannels: TStringList; //\8c»\8dÝ\93o\98^\82µ\82Ä\82¢\82é\83`\83\83\83\93\83l\83\8b
+    FNowChannel: String;        //\8c»\8dÝ\82Ì\83`\83\83\83\93\83l\83\8b
+    //
+    FDragTabIndex: integer; //\83^\83u\83h\83\89\83b\83O\83h\83\8d\83b\83v\8aÖ\98A
+    FDragTabDest: integer;  //\83h\83\8d\83b\83v\82·\82é\88Ê\92u(\82·\82®\89E\82É\82­\82é\83^\83u\82Ì\83C\83\93\83f\83b\83N\83X)
+    //
+    FCueGhost: TID2Ghost;
+    procedure SetStatusText(const Value: String);
+    procedure SetSleeping(const Value: boolean);
+    function T2C: TColor;
+    procedure ColorAgain;
+    procedure YenETrans;
+    procedure SetConnecting(const Value: boolean);
+    procedure SetAdded(const Value: boolean);
+    procedure mnConstClick(Sender: TObject);
+    property Connecting: boolean read FConnecting write SetConnecting;
+    property Added: boolean read FAdded write SetAdded;
+    property Sleeping: boolean read FSleeping write SetSleeping;
+    property StatusText: String read FStatusText write SetStatusText;
+    function GetScriptText: String;
+    procedure ChangeTaskIcon;
+    procedure ShowHintLabel(const Mes: String; Col: TColor = clBlue);
+    procedure UpdateLayout;
+    procedure ScriptColorChange(From, Length: integer; Col: TColor);
+    procedure DispatchBottle(EventType: TSlppEventType; Dat: THeadValue);
+    procedure InitFastSstp;
+    //\83`\83\83\83\93\83l\83\8b\8aÖ\8cW
+    procedure UpdateChannelInfo(Dat: THeadValue);
+    procedure UpdateJoinChannelList(Dat: THeadValue);
+    procedure NoLuidError;
+  public
+    function GetChannelPrefs(const ChannelName: String): TChannelPrefs;
+    function DoTrans(var Script: String;
+      Options: TScriptTransOptions): String;
+    procedure BeginConnect;
+    procedure EndConnect;
+    procedure Notified;
+    property ChannelList: TChannelList read FChannelList;
+    function SetHWndToFavoriteGhost(const Ghost: String): String;
+    function GhostNameToSetName(const Ghost: String): String;
+    procedure PostCommand(const Command: array of String); overload;
+    procedure PostCommand(Command: TStrings); overload;
+    procedure PostSetChannel(Channels: TStrings);
+  end;
+
+
+var
+  frmSender: TfrmSender;
+
+const
+  PanelConnecting = 0;  //\81u\90Ú\91±\92\86\81v\95\\8e¦\97p
+  PanelBytes      = 1;  //\81\9b\81\9b\83o\83C\83g
+  PanelCount      = 2;  //Local Proxy\81A\8c»\8dÝ\81\9b\8c\8f\91Ò\82¿
+  PanelMembers    = 3;
+  PanelStatus     = 4;  //\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81c\82È\82Ç
+
+  IconConnected    = 17;
+  IconDisconnected = 18;
+  IconSleep        = 19;
+  IconSleepDisconnected = 20;
+
+  WarningColor = clRed;
+
+  SendButtonLongHint = 'Bottle\82Ì\91\97\90M';
+
+implementation
+
+uses TaskBar, SendConfirm, SettingForm, ChannelListForm, LogForm,
+  MessageBox;
+
+{$R *.DFM}
+
+procedure TfrmSender.actConfirmExecute(Sender: TObject);
+var Res: TSstpResult;
+    Script, Ghost, Err: String;
+    Opt: TScriptTransOptions;
+begin
+  YenETrans;
+  Script := GetScriptText;
+  if Pref.IgnoreTimeCritical then Opt := [toIgnoreTimeCritical] else Opt := [];
+  if Pref.NoTransUrl then Opt := Opt + [toNoChoice];
+  Err := DoTrans(Script, Opt + [toConvertURL]);
+  if Err <> '' then begin
+    ShowMessage(Err);
+    Exit;
+  end;
+  if cbxTargetGhost.ItemIndex > 0 then begin
+    Ghost := cbxTargetGhost.Text
+  end else begin
+    if FNowChannel <> '' then
+      Ghost := FChannelList.Channel[FNowChannel].Ghost;
+  end;
+  Ghost := SetHWndToFavoriteGhost(Ghost);
+  FastSstp.SstpSender := 'SSTP Bottle -\81y\8am\94F\81z';
+  
+  Res := FastSstp.SstpSEND(Script, [soNoTranslate], GhostNameToSetName(Ghost));
+  if Res <> srOk then begin
+    ShowHintLabel('\91\97\90M\8e¸\94s:' + FastSstp.RecvLog, WarningColor);
+  end else ShowHintLabel('');
+end;
+
+procedure TfrmSender.FormCreate(Sender: TObject);
+begin
+  FOriginalCaption := Self.Caption;
+
+  FMutex := OpenMutex(MUTEX_ALL_ACCESS, false, 'SSTPBottleClient2');
+  if FMutex <> 0 then begin
+    Beep;
+    ShowMessage('SSTP Bottle Client\82Í\93ñ\8fd\8bN\93®\82Å\82«\82Ü\82¹\82ñ');
+    CloseHandle(FMutex);
+    Application.Terminate;
+    Application.ProcessMessages; //WM_QUIT\82ð\97¬\82·
+    Exit;
+  end;
+  FMutex := CreateMutex(nil, false, 'SSTPBottleClient2');
+
+  UpdateLayout;
+  mnShowToolBar.Checked := Pref.ShowToolBar;
+  mnShowConstBar.Checked := Pref.ShowConstBar;
+  if Pref.StayOnTop then begin
+    FormStyle := fsStayOnTop;
+    mnStayOnTop.Checked := true;
+  end else begin
+    FormStyle := fsNormal;
+    mnStayOnTop.Checked := false;
+  end;
+  mnColorScript.Checked := Pref.ColorScript;
+  InitFastSstp;
+
+  mnGoToHP.Hint := Pref.HomePage;
+  mnGotoGlog.Hint := Pref.GLogPage;
+  mnGotoVote.Hint := Pref.VotePage;
+  mnGotoHelp.Hint := Pref.HelpPage;
+
+
+  mnGetNewId.Enabled := (Pref.LUID = '');
+
+  try
+    SsParser.TagPattern.LoadFromFile(ExtractFilePath(Application.Exename) + 'tagpat.txt');
+    SsParser.MetaPattern.LoadFromFile(ExtractFilePath(Application.ExeName) + 'metapat.txt');
+  except
+    ShowMessage('tagpat.txt, metapat.txt\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B');
+    Application.Terminate;
+  end;
+
+  with Pref.SenderWindowPosition do begin
+    Self.Left   := Left;
+    Self.Top    := Top;
+    Self.Width  := Right - Left + 1;
+    Self.Height := Bottom - Top + 1;
+  end;
+
+  //SSTP\91\97\90M\83\81\83\\83b\83h\82Ì\8c\88\92è
+  with FastSstp do
+    if Pref.UsePort then SstpMethod := smTcpIp else SstpMethod := smDirectSstp;
+
+  //\83`\83\83\83\93\83l\83\8b\83\8a\83X\83g
+  FChannelList := TChannelList.Create;
+  FJoinChannels := TStringList.Create;
+  FCueGhost := TID2Ghost.Create;
+
+  actClearExecute(Sender);
+  ApplicationEvents.OnIdle := ApplicationEventsIdle;
+  ChangeTaskIcon;
+  UpdateJoinChannelList(nil);
+end;
+
+procedure TfrmSender.FormDestroy(Sender: TObject);
+begin
+  with Pref.SenderWindowPosition do begin
+    Left   := Self.Left;
+    Top    := Self.Top;
+    Right  := Self.Left + Self.Width - 1;
+    Bottom := Self.Top + Self.Height - 1;
+  end;
+
+  ReleaseMutex(FMutex);
+
+  if FChannelList <> nil then begin
+    FChannelList.Clear;
+    FChannelList.Free;
+  end;
+  if FJoinChannels <> nil then FJoinChannels.Free;
+  if FCueGhost <> nil then FCueGhost.Free;
+end;
+
+
+procedure TfrmSender.SetConnecting(const Value: boolean);
+begin
+  FConnecting := Value;
+  if Value then begin
+    StatusBar.Panels[PanelConnecting].Text := '\92Ê\90M\92\86';
+    actStart.Enabled := false;
+    actStop.Enabled := false;
+    actSend.Enabled := false;
+    mnGetNewId.Enabled := false;
+    Screen.Cursor := crHourGlass;
+  end else begin
+    StatusBar.Panels[PanelConnecting].Text := '';
+    actStart.Enabled := true;
+    actStop.Enabled := true;
+    actSend.Enabled := true;
+    mnGetNewId.Enabled := Pref.LUID = '';
+    Screen.Cursor := crDefault;
+  end;
+end;
+
+procedure TfrmSender.actSendExecute(Sender: TObject);
+var Talk: String;
+    Command: TStringList;
+    Err: String;
+    F: TextFile;
+begin
+  if Pref.LUID = '' then begin
+    NoLuidError;
+    Exit;
+  end;
+  if tabChannel.TabIndex < 0 then begin
+    ShowMessage('\83`\83\83\83\93\83l\83\8b\82É\8eQ\89Á\82µ\82Ä\82¢\82Ü\82¹\82ñ');
+    Exit;
+  end;
+  if FChannelList.Channel[FNowChannel].NoPost then begin
+    Beep;
+    ShowMessage(FNowChannel + ' \82Í\8eó\90M\90ê\97p\82Å\82·');
+    Exit;
+  end;
+  if not Pref.NoConfirm then begin
+    Application.CreateForm(TfrmConfirmSend, frmConfirmSend);
+    if frmConfirmSend.ShowModal = mrCancel then Exit;
+    if frmConfirmSend.cbxDontAlertAnyMore.Checked then Pref.NoConfirm := true;
+    frmConfirmSend.Release;
+  end;
+  if Pref.ChannelPref[FNowChannel].WarnPost then begin
+    if MessageDlg('''' + FNowChannel + '''\83`\83\83\83\93\83l\83\8b\82É\93\8a\8de\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82Ü\82·\81B',
+      mtConfirmation, mbOkCancel, 0) = mrCancel then
+    Exit;
+  end;
+  YenETrans;
+  Talk := GetScriptText;
+  Err := DoTrans(Talk, []);
+  if Err <> '' then begin
+    ShowMessage(Err);
+    Exit;
+  end;
+  Command := nil;
+  try
+    Command := TStringList.Create;
+    with Command do begin
+      Add('Command: sendBroadcast');
+      Add('Channel: ' + FNowChannel);
+      Add('LUID: ' + Pref.LUID);
+      Add('Agent: ' + VersionString);
+      if cbxTargetGhost.ItemIndex > 0 then Add('Ghost: ' + cbxTargetGhost.Text);
+      Add('Talk: ' + Talk);
+    end;
+    PostCommand(Command);
+  finally
+    Command.Free;
+  end;
+  //\91\97\90M\83\8d\83O\95Û\91
+  AssignFile(F, ExtractFilePath(Application.ExeName) + SentLogFile);
+  if FileExists(ExtractFilePath(Application.ExeName) + SentLogFile) then
+    Append(F)
+  else
+    Rewrite(F);
+  WriteLn(F, Talk);
+  Flush(F);
+  CloseFile(F);
+end;
+
+procedure TfrmSender.BeginConnect;
+begin
+  if Pref.LUID = '' then begin
+    NoLuidError;
+    Exit;
+  end;
+  Slpp20.LUID := Pref.LUID;
+  try
+    if Slpp20.Connected then Slpp20.Disconnect;
+    if Pref.UseHttpProxy then begin
+      Slpp20.Host := Pref.ProxyAddress;
+      Slpp20.Port := Pref.ProxyPort;
+      Slpp20.ProxyMode := true;
+      NMHTTPGhost.Proxy := Pref.ProxyAddress;
+      NMHTTPGhost.ProxyPort := Pref.ProxyPort;
+    end else begin
+      Slpp20.Host := 'bottle.mikage.to';
+      Slpp20.Port := 9871;
+      Slpp20.ProxyMode := false;
+      NMHTTPGhost.Proxy := '';
+    end;
+    Slpp20.Connect;
+  except
+    on ESockError do begin
+      Added := false;
+      Beep;
+      ShowMessage('SSTP Bottle\83T\81[\83o\82É\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B'#13#10 +
+                  '\83l\83b\83g\83\8f\81[\83N\82É\8cq\82ª\82Á\82Ä\82¢\82é\82©\8am\94F\82µ\82Ä\82­\82¾\82³\82¢\81B'#13#10 +
+                  '\82 \82é\82¢\82Í\83T\81[\83o\82ª\83_\83E\83\93\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B');
+    end;
+  end;
+end;
+
+procedure TfrmSender.EndConnect;
+begin
+  Slpp20.Disconnect;
+end;
+
+procedure TfrmSender.SetAdded(const Value: boolean);
+begin
+  if FAdded = Value then Exit;
+  FAdded := Value;
+  if Value then begin
+    StatusText := 'SSTP Bottle \83T\81[\83o\82É\90Ú\91±\82³\82ê\82Ä\82¢\82Ü\82·';
+    ChangeTaskIcon;
+    ShowHintLabel('SSTP Bottle\83T\81[\83o\82ª\8c©\82Â\82©\82è\82Ü\82µ\82½');
+  end else begin
+    StatusText := '\83T\81[\83o\82Æ\82Ì\90Ú\91±\82ª\90Ø\82ê\82Ä\82¢\82Ü\82·!';
+    ChangeTaskIcon;
+    ShowHintLabel('SSTP Bottle\83T\81[\83o\82©\82ç\90Ø\92f\82³\82ê\82Ü\82µ\82½!', WarningColor);
+  end;
+end;
+
+procedure TfrmSender.NMHTTPFailure(Cmd: CmdType);
+begin
+  Beep;
+  ShowHintLabel('SSTP Bottle\83T\81[\83o\82Æ\82Ì\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½', WarningColor);
+  ShowMessage(NMHTTP.Header);
+  Connecting := false;
+end;
+
+procedure TfrmSender.NMHTTPSuccess(Cmd: CmdType);
+var Str, ResStr, Command: String;
+    HeadValue: THeadValue;
+    i: integer;
+    SetChannel: TStringList;
+begin
+  Connecting := false;
+  Str := NMHTTP.Body;
+  HeadValue := nil;
+  try
+    try
+      HeadValue := THeadValue.Create(Str);
+    except
+      ShowMessage('SSTP Bottle\83T\81[\83o\82ª\89ð\90Í\82Å\82«\82È\82¢\83G\83\89\81[\82ð\95Ô\82µ\82Ü\82µ\82½\81B');
+      Exit;
+    end;
+    Command := HeadValue['Command'];
+    ResStr  := HeadValue['Result'];
+    if ResStr = 'Err' then begin
+      if HeadValue['ExtraMessage'] <> '' then begin
+        Beep;
+        ShowMessage('SSTP Bottle\83T\81[\83o\82ª\8e\9f\82Ì\83G\83\89\81[\82ð\95Ô\82µ\82Ü\82µ\82½:'#13#10 +
+                     HeadValue['ExtraMessage']);
+      end else begin
+        Beep;
+        ShowMessage('SSTP Bottle\83T\81[\83o\82ª\89½\82ç\82©\82Ì\83G\83\89\81[\82ð\95Ô\82µ\82Ü\82µ\82½\81B');
+      end;
+    end;
+    if (Command = 'sendBroadcast') and (ResStr = 'OK') then begin
+      ShowHintLabel(HeadValue['Channel'] + ' \82Ì ' + HeadValue['SentNum'] +
+                    '\90l\82É\91\97\90M\82µ\82Ü\82µ\82½');
+    end else if (Command = 'sendBroadcast') and (ResStr <> 'OK') then begin
+      ShowHintLabel('\83\81\83b\83Z\81[\83W\82ð\91\97\90M\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½', WarningColor);
+    end;
+    if (Command = 'getNewId') then begin
+      if ResStr = 'OK' then begin
+        Pref.LUID := HeadValue['NewID'];
+        ShowHintLabel('LUID\8eæ\93¾\8a®\97¹\81B');
+        mnGetNewId.Enabled := false;
+        BeginConnect;
+      end else begin
+        ShowHintLabel('LUID\8eæ\93¾\82É\8e¸\94s\82µ\82Ü\82µ\82½');
+      end;
+    end;
+    if (Command = 'voteMessage') then begin
+      if ResStr = 'OK' then begin
+        ShowHintLabel('\83\81\83b\83Z\81[\83W\82É\93\8a\95[/\93¯\88Ó\82µ\82Ü\82µ\82½\81B\95[\90\94: ' + HeadValue['Votes']);
+      end;
+    end;
+    if (Command = 'getChannels') and (ResStr = 'OK') then begin
+      UpdateChannelInfo(HeadValue);
+      SetChannel := nil;
+      try
+        if FAutoAddAfterGetChannel then begin
+          SetChannel := TStringList.Create;
+          for i := 0 to Pref.ChannelPrefCount-1 do begin
+            if Pref.ChannelPrefIndex[i].CanAutoAdd then
+              SetChannel.Add(Pref.ChannelPrefIndex[i].ChannelName);
+          end;
+        end else begin
+          if frmChannelList.Execute(FChannelList, FJoinChannels) then begin
+            SetChannel := TStringList.Create;
+            SetChannel.Assign(frmChannelList.JoinList);
+          end;
+        end;
+        if SetChannel <> nil then begin
+          NMHTTP.Disconnect;
+          PostSetChannel(SetChannel);
+        end;
+      finally
+        if SetChannel <> nil then FreeAndNil(SetChannel);
+      end;
+    end;
+    if (Command = 'setChannels') then begin
+      if ResStr <> 'OK' then begin
+        Beep;
+        ShowMessage('\83`\83\83\83\93\83l\83\8b\90Ý\92è\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\82à\82¤\88ê\93x\93o\98^\82µ\82È\82¨\82µ\82Ä\82­\82¾\82³\82¢');
+        ShowHintLabel('\83`\83\83\83\93\83l\83\8b\90Ý\92è\82É\8e¸\94s\82µ\82Ü\82µ\82½', WarningColor);
+      end;
+    end;
+    if HeadValue['ExtraTip'] <> '' then ShowHintLabel(HeadValue['ExtraTip']);
+  finally
+    HeadValue.Free;
+  end;
+end;
+
+procedure TfrmSender.actStartClick(Sender: TObject);
+begin
+  {BeginConnect;}
+  if Pref.LUID = '' then begin
+    NoLuidError;
+    Exit;
+  end;
+  if not Slpp20.Connected then begin
+    BeginConnect;
+  end;
+  FAutoAddAfterGetChannel := false;
+  PostCommand(['Command: getChannels']);
+end;
+
+procedure TfrmSender.actStopExecute(Sender: TObject);
+begin
+  PostSetChannel(nil);
+end;
+
+procedure TfrmSender.NMHTTPInvalidHost(var Handled: Boolean);
+begin
+  ShowHintLabel(Pref.CgiName + '\82ª\82Ý\82Â\82©\82è\82Ü\82¹\82ñ', WarningColor);
+  Connecting := false;
+end;
+
+procedure TfrmSender.FormShow(Sender: TObject);
+begin
+  if FBooted or Application.Terminated then Exit;
+  //LUID\82ª\8eæ\93¾\82³\82ê\82Ä\82¢\82ê\82Î\91\81\91¬\93o\98^\81B\82»\82¤\82Å\82È\82¯\82ê\82ÎLUID\8eæ\93¾\81B
+  if Pref.LUID <> '' then BeginConnect
+  else mnGetNewIdClick(Self);
+  FBooted := true;
+  SakuraSeekerDetectResultChanged(Self);
+end;
+
+procedure TfrmSender.mnAboutClick(Sender: TObject);
+begin
+  ShowMessage(VersionString);
+end;
+
+procedure TfrmSender.actExitClientExecute(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TfrmSender.actClearExecute(Sender: TObject);
+var TmpScript: String;
+    Pos: Integer;
+begin
+  TmpScript := Pref.DefaultScript;
+  if RegExp.Match('m/^((.|\s)*)\|/', TmpScript) then begin
+    Pos := length(RegExp[1]);
+  end else Pos := 0;
+  RegExp.Subst('s/\|//', TmpScript);
+
+  memScript.Lines.Text := TmpScript;
+  memScript.Text := TmpScript;
+
+  if Visible then memScript.SetFocus;
+  memScript.SelStart := Pos;
+  ColorAgain;
+end;
+
+procedure TfrmSender.memScriptChange(Sender: TObject);
+begin
+  StatusBar.Panels[PanelBytes].Text := IntToStr(length(memScript.Text)) + '\83o\83C\83g';
+end;
+
+procedure TfrmSender.mnStayOnTopClick(Sender: TObject);
+begin
+  Pref.StayOnTop := not Pref.StayOnTop;
+  mnStayOnTop.Checked := Pref.StayOnTop;
+  if Pref.StayOnTop then begin
+    FormStyle := fsStayOnTop;
+  end else begin
+    FormStyle := fsNormal;
+  end;
+  Show;
+end;
+
+function TfrmSender.GetScriptText: String;
+begin
+  with memScript do begin
+    Result := Text;
+  end;
+end;
+
+procedure TfrmSender.mnColorScriptClick(Sender: TObject);
+begin
+  mnColorScript.Checked := not mnColorScript.Checked;
+  Pref.ColorScript := mnColorScript.Checked;
+  ColorAgain;
+end;
+
+procedure TfrmSender.mnConstClick(Sender: TObject);
+var i: integer;
+begin
+  i := (Sender as TMenuItem).Tag;
+  memScript.SelText := frmConstEditor.GetTextById(i);
+end;
+
+procedure TfrmSender.actEditConstExecute(Sender: TObject);
+begin
+  frmConstEditor.Execute;
+end;
+
+procedure TfrmSender.mnTaskBarClick(Sender: TObject);
+begin
+  Application.Minimize;
+  WindowState := wsNormal;
+end;
+
+procedure TfrmSender.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+  EndConnect;
+  frmConstEditor.SaveToFile(ExtractFilePath(Application.ExeName) + 'constlist.txt');
+end;
+
+procedure TfrmSender.ApplicationEventsMinimize(Sender: TObject);
+begin
+  Visible := false;
+  Application.ShowMainForm := false;
+  ShowWindow(Application.Handle, SW_HIDE);
+end;
+
+procedure TfrmSender.ApplicationEventsRestore(Sender: TObject);
+begin
+  Application.ShowMainForm := true;
+  Visible := true;
+end;
+
+procedure TfrmSender.mnTaskRestoreClick(Sender: TObject);
+begin
+  Application.Restore;
+end;
+
+procedure TfrmSender.TaskTrayDblClick(Seft: TObject; Button: TMouseButton);
+begin
+  Application.Restore;
+end;
+
+procedure TfrmSender.FormActivate(Sender: TObject);
+begin
+  memScript.SetFocus;
+end;
+
+procedure TfrmSender.mnTaskNewMessageClick(Sender: TObject);
+begin
+  Application.Restore;
+  actClearExecute(Sender);
+end;
+
+procedure TfrmSender.ChangeTaskIcon;
+var Ico: TIcon;
+    IcoNum: integer;
+begin
+  if Added then begin
+    if Sleeping then IcoNum := IconSleep else IcoNum := IconConnected;
+  end else begin
+    if Sleeping then IcoNum := IconSleepDisconnected
+    else IcoNum := IconDisconnected;
+  end;
+  Ico := TIcon.Create;
+  try
+    imgIcon.GetIcon(IcoNum, Ico);
+    TaskTray.Icon := Ico;
+    TaskTray.Registered := true;
+  finally
+    Ico.Free;
+  end;
+end;
+
+procedure TfrmSender.SetStatusText(const Value: String);
+begin
+  FStatusText := Value;
+  StatusBar.Panels[PanelStatus].Text := Value;
+end;
+
+procedure TfrmSender.NMHTTPDisconnect(Sender: TObject);
+begin
+  Connecting := false;
+end;
+
+procedure TfrmSender.ApplicationEventsHint(Sender: TObject);
+begin
+  if Length(Application.Hint) > 0 then begin
+    StatusBar.Panels[PanelStatus].Text := GetLongHint(Application.Hint);
+    Application.HintColor := clInfoBk;
+    if (Application.Hint = SendButtonLongHint)
+    and (FNowChannel <> '') then begin
+      //\91\97\90M\83{\83^\83\93\82Ì\8fê\8d\87\82Í\91¬\8dU\8fo\82·
+      Application.HintColor := clYellow;
+      Application.ActivateHint(Mouse.CursorPos);
+    end;
+  end else
+    StatusBar.Panels[PanelStatus].Text := FStatusText;
+end;
+
+procedure TfrmSender.Notified;
+begin
+  frmConstEditor.BuildMenu(mnPopConst, mnConstClick);
+  frmConstEditor.BuildMenu(mnPopUpConst.Items, mnConstClick);
+  frmConstEditor.BuildMenu(ConstBarMenu.Items, mnConstClick);
+  ConstMenuBar.Menu := nil;
+  ConstMenuBar.AutoSize := false;
+  ConstMenuBar.Width := 1000;
+  ConstMenuBar.Menu := ConstBarMenu;
+  ConstMenuBar.AutoSize := true;
+end;
+
+procedure TfrmSender.memScriptKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+var Pos: TPoint;
+    Func: TReturnKeyFunction;
+begin
+  if (Key = VK_RETURN) then begin
+    if (ssShift in Shift) then
+      Func := Pref.WhenShiftReturn
+    else if (ssCtrl in Shift) then
+      Func := Pref.WhenCtrlReturn
+    else
+      Func := Pref.WhenReturn;
+    case Func of
+      kfConstText: begin
+        with tbtnInsertConst do
+          Pos := tbtnInsertConst.ClientToScreen(Point(0, Height));
+        mnPopUpConst.Popup(Pos.X, Pos.Y);
+      end;
+      kfYenN: begin
+        memScript.SelText := '\n';
+        Key := 0;
+      end;
+      kfYenNReturn: begin
+        memScript.SelText := '\n'#13#10;
+      end;
+      kfReturn: begin
+        memScript.SelText := #13#10
+      end;
+    end;
+  end;
+end;
+
+procedure TfrmSender.mnShowToolBarClick(Sender: TObject);
+begin
+  mnShowToolBar.Checked := not mnShowToolBar.Checked;
+  Pref.ShowToolBar := mnShowToolBar.Checked;
+  UpdateLayout;
+end;
+
+procedure TfrmSender.mnShowConstBarClick(Sender: TObject);
+begin
+  mnShowConstBar.Checked := not mnShowConstBar.Checked;
+  Pref.ShowConstBar := mnShowConstBar.Checked;
+  UpdateLayout;
+end;
+
+procedure TfrmSender.UpdateLayout;
+begin
+  ToolBar.Visible := Pref.ShowToolBar;
+  ConstMenuBar.Visible := Pref.ShowConstBar;
+  ToolBar.Top := 0;
+  //
+  with tabChannel do begin
+    TabPosition := Pref.TabPosition;
+    case Pref.TabPosition of
+      tpTop:    Align  := alTop;
+      tpBottom: Align := alBottom;
+    end;
+  end;
+end;
+
+function TfrmSender.T2C: TColor;
+begin
+  if FUnyuTalking then Result := Pref.TalkColorU else Result := Pref.TalkColorH;
+end;
+
+
+procedure TfrmSender.ApplicationEventsIdle(Sender: TObject;
+  var Done: Boolean);
+var St, Le: integer;
+    Col: TColor;
+    i: integer; //\83_\83~\81[\83J\83E\83\93\83^
+begin
+  if not Pref.ColorScript then Exit;
+  if memScript.Modified and mnColorScript.Checked then begin
+    FColorTimeLag := GetTickCount;
+    memScript.Modified := false;
+  end;
+  if (FcolorTimeLag <> 0) and
+     (FColorTimeLag + Pref.ColorTimeLagValue < GetTickCount) then begin
+    ColorAgain;
+    FColorTimeLag := 0;
+  end;
+  if not FRequireColoring then Exit;
+  memScript.Lines.BeginUpdate;
+  St := memScript.SelStart;
+  Le := memScript.SelLength;
+  for i := 1 to Pref.ColorSpeed do begin
+    if FColoredElements >= SsParser.Count then Break;
+    if SsParser[FColoredElements] = '\u' then FUnyuTalking := true;
+    if SsParser[FColoredElements] = '\h' then FUnyuTalking := false;
+    case SsParser.MarkUpType[FColoredElements] of
+      mtTag:    Col := Pref.MarkUpColor;
+      mtTagErr: Col := Pref.MarkErrorColor;
+      mtMeta:   Col := Pref.MetaWordColor;
+      mtStr:    Col := T2C;
+      else Col := T2C;
+    end;
+    ScriptColorChange(FColoringPos, Length(SsParser[FColoredElements]), Col);
+    Inc(FColoringPos, Length(SsParser[FColoredElements]));
+    Inc(FColoredElements);
+  end;
+  memScript.SelStart := St;
+  memScript.SelLength := Le;
+  memScript.Lines.EndUpdate;
+  memScript.Modified := false;
+  if FColoredElements >= SsParser.Count then FRequireColoring := false;
+end;
+
+
+procedure TfrmSender.ColorAgain;
+var St, Le: integer;
+begin
+  if Pref.ColorScript then begin
+    FColoringPos := 0;
+    FColoredElements := 0;
+    FUnyuTalking := false;
+    FLastSurfaceH := 0;
+    FLastSurfaceU := 10;
+    FRequireColoring := true;
+    SsParser.InputString := memScript.Text;
+    memScript.Modified := false;
+    memScript.Color := Pref.BgColor;
+  end else begin
+    with memScript do begin
+      St := SelStart;
+      Le := SelLength;
+      SelStart := 0;
+      SelLength := Length(Lines.Text);
+      SelAttributes.Color := clWindowText;
+      SelStart := St;
+      SelLength := Le;
+      FColoringPos := 0;
+      FRequireColoring := false;
+      Color := clWindow;
+    end;
+  end;
+end;
+
+
+function TfrmSender.DoTrans(var Script: String;
+  Options: TScriptTransOptions): String;
+var Orig, UrlCancel: String;
+    Url, UrlName: array[0..6] of String;
+    i, j, u, UrlCount: integer;
+    LastSurfaceH, LastSurfaceU: integer;
+    UnyuTalking: boolean;
+const
+    OkSurfaceH: set of byte = [0..9, 20..29];
+    OkSurfaceU: set of byte = [10..19];
+begin
+  UrlCount := 0;
+  LastSurfaceH := 0;
+  LastSurfaceU := 10;
+  UnyuTalking := false;
+  Orig := SsParser.InputString;
+  SsParser.InputString := Script;
+  Script := '';
+  for i := 0 to SsParser.Count-1 do begin
+    if SsParser[i] = '\t' then begin
+      if not(toIgnoreTimeCritical in Options) then
+        Script := Script + '\t';
+    end else if SsParser[i] = '\e' then begin
+      Continue;
+    end else if (SsParser.Match(SsParser[i], '\URL%b') > 0) then begin
+      if toConvertURL in Options then begin
+        UrlCount := 0; //\91O\82ÌURL\83^\83O\82Ì\89e\8b¿\82ð\96³\8e\8b\81B
+        for u := 7 downto 1 do begin
+          if (SsParser.Match(SsParser[i],
+              '\URL%b'+StringReplace(StringOfChar('-', u*2),
+              '-', '%b', [rfReplaceAll]))) > 0 then begin
+            for j := 1 to u do begin
+              Url[UrlCount] := SsParser.GetParam(SsParser[i], UrlCount*2+2);
+              UrlName[UrlCount] := SsParser.GetParam(SsParser[i], UrlCount*2+3);
+              if UrlName[UrlCount] = '' then UrlName[UrlCount] := Url[UrlCount];
+              if Pos('http://', Url[UrlCount]) > 0 then Inc(UrlCount);
+            end;
+          end;
+          if UrlCount > 0 then UrlCancel := SsParser.GetParam(SsParser[i], 1);
+          if UrlCancel = '' then UrlCancel := '\8ds\82©\82È\82¢\81@\81@\81@\81@';
+        end;
+        if SsParser.Match(SsParser[i], '\URL%b%b') = 0 then begin //\8aÈ\88Õ\94ÅURL\95Ï\8a·
+          //\8aÈ\88Õ\8c`\8e®\URL\83^\83O\95Ï\8a·
+          Url[0] := SsParser.GetParam(SsParser[i], 1);
+          UrlName[0] := '\8ds\82­\81@\81@\81@\81@\81@\81@';
+          UrlCancel  := '\8ds\82©\82È\82¢\81@\81@\81@\81@';
+          if Pos('http://', Url[0]) > 0 then begin
+            UrlCount := 1;
+            Script := Script + '\_q' + Url[0] + '\_q';
+          end;
+        end;
+      end else Script := Script + SsParser[i];
+    end else begin
+      if SsParser[i] = '\h' then begin
+        UnyuTalking := false;
+      end else if SsParser[i] = '\u' then begin
+        UnyuTalking := true;
+      end else if SsParser.Match(SsParser[i], '\s%b') > 0 then begin
+        if UnyuTalking then begin
+          LastSurfaceU := StrToIntDef(SsParser.GetParam(SsParser[i], 1),
+                                      LastSurfaceU);
+        end else begin
+          LastSurfaceH := StrToIntDef(SsParser.GetParam(SsParser[i], 1),
+                                      LastSurfaceH);
+        end;
+      end else if SsParser.Match(SsParser[i], '\s%d') > 0 then begin
+        if UnyuTalking then begin
+          LastSurfaceU := StrToIntDef(SsParser[i][3], LastSurfaceU);
+        end else begin
+          LastSurfaceH := StrToIntDef(SsParser[i][3], LastSurfaceH);
+        end;
+      end;
+      Script := Script + SsParser[i];
+    end;
+  end;
+  if UrlCount > 0 then begin
+    Script := Script + '\h\n';
+    if not (toNoChoice in Options) then begin
+      for i := 0 to UrlCount-1 do begin
+        Script := Script + Format('\q%d[%s][%s]',
+                    [i, SsParser.EscapeParam(Url[i]), UrlName[i]]);
+      end;
+      Script := Script + Format('\q%d[#cancel][%s]', [UrlCount, UrlCancel]);
+      //Script := Script + '\z'; //\8dÅ\90Vphase\82Å\82Í\8dí\8f\9c
+    end else begin
+      Script := Script + '\h';
+      for i := 0 to UrlCount-1 do begin
+        Script := Script + Format('\n{%s}(%s)', [UrlName[i], Url[i]]);
+        Script := Script + Format('\n{%s}', [UrlCancel]);
+      end;
+    end;
+  end;
+  if toWaitScriptEnd in Options then begin
+    i := Pref.WaitScriptEnd;
+    while i > 0 do begin
+      if i > 9 then begin
+        Script := Script + '\w9';
+        Dec(i, 9);
+      end else begin
+        Script := Script + '\w' + IntToStr(i);
+        i := 0;
+      end;
+    end;
+  end;
+  Script := Script + '\e';
+  RegExp.Subst('s/\r\n//gk', Script);
+
+  //\83T\81[\83t\83B\83X\8dr\82ê\91Î\8dô
+  if not(LastSurfaceH in OkSurfaceH) or not(LastSurfaceU in OkSurfaceU) then begin
+      Result := '\96{\91Ì\91¤\82©\82¤\82É\82ã\82¤\91¤\82Ì\83T\81[\83t\83B\83X\82ª\8dr\82ê\82Ä\82¢\82Ü\82·\81B';
+  end;
+  //\83^\83O\83`\83F\83b\83N\8aÖ\98A
+  for i := 0 to SsParser.Count-1 do begin
+    if SsParser.MarkUpType[i] = mtTagErr then begin
+      Result := '"' + SsParser[i] + '"'#13#10 +
+                '\82Í\81ASSTP Bottle\82Å\94F\82ß\82ç\82ê\82È\82¢\82©\81A\94F\8e¯\82Å\82«\82È\82¢\83^\83O\82Å\82·\81B';
+    end;
+  end;
+
+  SsParser.InputString := Orig;
+end;
+
+procedure TfrmSender.mnGoToHPClick(Sender: TObject);
+begin
+  ShellExecute(Handle, 'open', PChar(Pref.HomePage), nil, nil, SW_SHOW);
+end;
+
+procedure TfrmSender.ShowHintLabel(const Mes: String; Col: TColor);
+begin
+  lblMessage.Caption := Mes;
+  lblMessage.Font.Color := Col;
+  lblMessage.Visible := true;
+  LabelTimer.Enabled := false;
+  LabelTimer.Enabled := true;
+end;
+
+procedure TfrmSender.LabelTimerTimer(Sender: TObject);
+begin
+  LabelTimer.Enabled := false;
+  lblmessage.Visible := false;
+end;
+
+procedure TfrmSender.ScriptColorChange(From, Length: integer; Col: TColor);
+//var Fmt: TCharFormat;
+begin
+  memScript.SelStart := From;
+  memScript.SelLength := Length;
+  memScript.SelAttributes.Color := Col;
+end;
+
+procedure TfrmSender.actRestoreSurfaceExecute(Sender: TObject);
+var i: integer;
+begin
+  SakuraSeeker.BeginDetect;
+  for i := 0 to SakuraSeeker.Count-1 do begin
+    FastSstp.TargetHWnd := SakuraSeeker[i].HWnd;
+    FastSstp.SstpSEND('\h\s[0]\u\s[10]', [], SakuraSeeker[i].SetName);
+  end;
+end;
+
+procedure TfrmSender.actCopyAllExecute(Sender: TObject);
+var Str: String;
+    Clip: TClipBoard;
+begin
+  Str := memScript.Text;
+  Clip := ClipBoard();
+  Clip.SetTextBuf(PChar(Str));
+end;
+
+procedure TfrmSender.actCopyAllNoReturnExecute(Sender: TObject);
+var Str: String;
+    Clip: TClipBoard;
+begin
+  Str := memScript.Text;
+  RegExp.Subst('s/\r\n//gk', Str);
+  Clip := ClipBoard();
+  Clip.SetTextBuf(PChar(Str));
+end;
+
+procedure TfrmSender.Slpp20SlppEvent(EventType: TSlppEventType;
+  const Param: String);
+var HeadValue: THeadValue;
+begin
+  HeadValue := nil;
+  try
+    HeadValue := THeadValue.Create(Param);
+    case EventType of
+      etScript, etForceBroadcast, etUnicast: begin
+        //\83\81\83b\83Z\81[\83W\8eó\90M
+        HeadValue := THeadValue.Create(Param);
+        DispatchBottle(EventType, HeadValue);
+      end;
+      etMemberCount: begin
+        StatusBar.Panels[PanelMembers].Text := HeadValue['Num'] + '\90l'
+      end;
+      etChannelCount: begin
+        try
+          FChannelList.Channel[HeadValue['Channel']].Members := StrToInt(HeadValue['Num']);
+        except
+        end;
+      end;
+      etConnectOk: begin
+        ShowHintLabel('SSTP Bottle\83T\81[\83o\82Æ\92Ê\90M\8am\97§\81B');
+        //\83`\83\83\83\93\83l\83\8b\8e©\93®\93o\98^
+        if not FBooted2 and Pref.AutoStart then begin
+          FAutoAddAfterGetChannel := true;
+          if not Connecting then
+            PostCommand(['Command: getChannels']);
+        end;
+        FBooted2 := true;
+      end;
+      etChannelList: begin
+        UpdateJoinChannelList(HeadValue);
+      end;
+      etCloseChannel: begin
+        with FJoinChannels do
+          if IndexOf(HeadValue['Channel']) >= 0 then
+            Delete(IndexOf(HeadValue['Channel']));
+        with tabChannel do
+          if Tabs.IndexOf(HeadValue['Channel']) >= 0 then
+            Tabs.Delete(Tabs.IndexOf(HeadValue['Channel']));
+        ShowHintLabel(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½',
+                      WarningColor);
+        frmLog.AddSystemLog(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
+        frmMessageBox.ShowMessage(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
+        Pref.DeleteChannelPref(HeadValue['Channel']);
+      end;
+      etForceBroadcastInformation: begin
+        if HeadValue['Type'] = 'Vote' then begin
+          if BottleLog.Bottle(HeadValue['MID']) <> nil then begin
+            BottleLog.Bottle(HeadValue['MID']).Votes := StrToIntDef(HeadValue['Num'], 0);
+            frmLog.UpdateWindow;
+          end;
+        end else if HeadValue['Type'] = 'Agree' then begin
+          if BottleLog.Bottle(HeadValue['MID']) <> nil then begin
+            BottleLog.Bottle(HeadValue['MID']).Agrees := StrToIntDef(HeadValue['Num'], 0);
+            frmLog.UpdateWindow;
+          end;
+        end;
+      end;
+    end;
+  finally
+    HeadValue.Free;
+  end;
+end;
+
+procedure TfrmSender.FastSstpResendCountChange(Sender: TObject);
+begin
+  StatusBar.Panels[PanelCount].Text := IntToStr(FastSstp.CueCount) + '\8c\8f';
+  TaskTray.TipString := 'SSTP Bottle Client (' +
+                        IntToStr(FastSstp.CueCount) + '\8c\8f)';
+  actClearBottles.Enabled := (FastSstp.CueCount > 0);
+end;
+
+procedure TfrmSender.actSettingExecute(Sender: TObject);
+begin
+  Application.CreateForm(TfrmSetting, frmSetting);
+  frmSetting.Execute;
+  frmSetting.Release;
+  frmSetting := nil;
+  //
+  mnColorScript.Checked := Pref.ColorScript;
+  ColorAgain;
+  InitFastSstp;
+  UpdateLayout;
+  tabChannel.Repaint;
+end;
+
+procedure TfrmSender.memScriptKeyPress(Sender: TObject; var Key: Char);
+begin
+  if (Key = #13) or (Key = #10) then Key := Char(0);
+end;
+
+procedure TfrmSender.Slpp20Disconnect(Sender: TObject);
+begin
+  Added := false;
+  UpdateJoinChannelList(nil);
+  frmLog.AddSystemLog('\83T\81[\83o\82©\82ç\90Ø\92f\82³\82ê\82Ü\82µ\82½');
+end;
+
+procedure TfrmSender.SetSleeping(const Value: boolean);
+begin
+  FSleeping := Value;
+  FastSstp.Sleep := Value;
+  ChangeTaskIcon;
+end;
+
+procedure TfrmSender.actClearBottlesExecute(Sender: TObject);
+var Re, i: integer;
+begin
+  Re := MessageDlg(Format('\96¢\94z\91\97\82Ì%d\8c\8f\82ÌBottle\82ð\91S\95\94\83N\83\8a\83A\82µ\82Ü\82·', [FastSstp.CueCount]),
+                   mtWarning, mbOkCancel, 0);
+  if Re = mrOk then begin
+    FastSstp.ClearCue;
+  end;
+  for i := 0 to BottleLog.Count-1 do
+    BottleLog.Bottles[i].State := lsOpened;
+  frmLog.UpdateWindow;
+end;
+
+procedure TfrmSender.SakuraSeekerDetectResultChanged(Sender: TObject);
+var i: integer;
+    GhostList: String;
+    TmpStr: TFileStream;
+begin
+  with cbxTargetGhost do begin
+    Items.BeginUpdate;
+    Items.Clear;
+    Items.Add('(CH\90\84\8f§)');
+    for i := 0 to SakuraSeeker.Count-1 do begin
+      if cbxTargetGhost.Items.IndexOf(SakuraSeeker[i].Name) < 0 then
+        cbxTargetGhost.Items.Add(SakuraSeeker[i].Name);
+    end;
+    Items.EndUpdate;
+    cbxTargetGhost.ItemIndex := 0;
+  end;
+  //\8d\91\90¨\92²\8d¸\82É\8eQ\89Á
+  if FBooted and not Pref.NoSendGhostList and (SakuraSeeker.Count > 0) then begin
+    NMURL.InputString := '\88¤';
+    GhostList := 'CCC=' + NMURL.Encode;
+    GhostList := GhostList + '&LUID=' + Pref.LUID;
+    for i := 0 to SakuraSeeker.Count-1 do begin
+      NMURL.InputString := SakuraSeeker[i].SetName;
+      if SakuraSeeker[i].Name <> '' then
+        GhostList := GhostList + '&GHOST=' + NMURL.Encode;
+    end;
+    TmpStr := nil;
+    try
+      TmpStr := TFileStream.Create(
+        ExtractFilePath(Application.ExeName)+'ghost.tmp',
+        fmCreate or fmShareDenyWrite
+      );
+      for i := 1 to Length(GhostList) do
+        TmpStr.Write(GhostList[i], 1);
+    finally
+      TmpStr.Free;
+    end;
+    NMHTTPGhost.Disconnect;
+    NMHTTPGhost.Post(Pref.CgiNameGhost,
+                     ExtractFilePath(Application.ExeName)+'ghost.tmp');
+  end;
+end;
+
+function TfrmSender.GetChannelPrefs(
+  const ChannelName: String): TChannelPrefs;
+begin
+  Result := Pref.ChannelPref[ChannelName];
+  if Result = nil then Result := Pref.DefChannelPref;
+  if Result.UseChannelPrefs = false then Result := Pref.DefChannelPref;
+end;
+
+procedure TfrmSender.UpdateChannelInfo(Dat: THeadValue);
+var i: integer;
+    Ch: TChannelListItem;
+begin
+  FChannelList.Clear;
+  for i := 1 to Dat.IntData['Count'] do begin
+    Ch := TChannelListItem.Create;
+    Ch.Name    := Dat[Format('CH%d_name', [i])];
+    Ch.Ghost   := Dat[Format('CH%d_ghost', [i])];
+    Ch.Info    := Dat[Format('CH%d_info', [i])];
+    Ch.NoPost  := Dat[Format('CH%d_nopost', [i])] = '1';
+    Ch.Members := Dat.IntData[Format('CH%d_count', [i])];
+    Ch.WarnPost:= Dat[Format('CH%d_warnpost', [i])] = '1';
+    FChannelList.Add(Ch);
+  end;
+  for i := 0 to FChannelList.Count-1 do begin
+    //\8eæ\93¾\82µ\82½\83`\83\83\83\93\83l\83\8b\82Ì\82¤\82¿\90V\8bK\82Ì\82à\82Ì\82ð\83`\83\83\83\93\83l\83\8b\90Ý\92è\83\8a\83X\83g\82Å\8dì\90¬
+    if Pref.ChannelPref[FChannelList.ChannelItem[i].Name] = nil then begin
+      Pref.CreateChannelPref(FChannelList.ChannelItem[i].Name);
+    end;
+  end;
+  for i := Pref.ChannelPrefCount-1 downto 0 do begin
+    //\8eæ\93¾\82µ\82½\83`\83\83\83\93\83l\83\8b\82É\82Í\91\8dÝ\82µ\82È\82¢\83`\83\83\83\93\83l\83\8b\90Ý\92è\82ð\8dí\8f\9c
+    if FChannelList.Channel[Pref.ChannelPrefIndex[i].ChannelName] = nil then
+      Pref.DeleteChannelPref(Pref.ChannelPrefIndex[i].ChannelName);
+  end;
+  UpdateLayout;
+end;
+
+procedure TfrmSender.mnGetNewIdClick(Sender: TObject);
+begin
+  PostCommand(['Command: getNewId', 'Agent: ' + VersionString]);
+end;
+
+procedure TfrmSender.NoLuidError;
+begin
+  Beep;
+  ShowMessage('SSTP Bottle ID\82Ì\8eæ\93¾\82ª\82Ü\82¾\8a®\97¹\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B'#13#10+
+              '\83w\83\8b\83v\83\81\83j\83\85\81[\82Ì[LUID\8eæ\93¾]\82©\82çID\82ð\8eæ\93¾\82µ\82Ä\82­\82¾\82³\82¢\81B'#13#10+
+              '\82±\82Ì\91\80\8dì\82ÍClient\8f\89\89ñ\8bN\93®\8e\9e\82É1\89ñ\82¾\82¯\95K\97v\82Å\82·\81B');
+end;
+
+procedure TfrmSender.tabChannelChange(Sender: TObject);
+begin
+  FNowChannel := tabChannel.Tabs[tabChannel.TabIndex];
+  actSend.Hint := Format('\81u%s\81v\82É\91\97\90M|%s', [FNowChannel, SendButtonLongHint]);
+  tabChannel.Repaint; //\82±\82ê\82ª\82È\82¢\82Æ\90F\82ª\95Ï\82í\82ç\82È\82¢\82±\82Æ\82ª\82 \82é
+end;
+
+procedure TfrmSender.actPrevChannelExecute(Sender: TObject);
+begin
+  with tabChannel do begin
+    if Tabs.Count = 0 then Exit;
+    if TabIndex=0 then TabIndex := Tabs.Count-1
+    else TabIndex := TabIndex-1;
+  end;
+  tabChannelChange(Self);
+end;
+
+procedure TfrmSender.actNextChannelExecute(Sender: TObject);
+begin
+  with tabChannel do begin
+    if Tabs.Count = 0 then Exit;
+    if TabIndex=Tabs.Count-1 then TabIndex := 0
+    else TabIndex := TabIndex+1;
+  end;
+  tabChannelChange(Self);
+end;
+
+procedure TfrmSender.UpdateJoinChannelList(Dat: THeadValue);
+var i: integer;
+    nodat: boolean;
+begin
+  nodat := Dat = nil; //nil\82È\82ç\83`\83\83\83\93\83l\83\8b\91S\89ð\8f\9c
+  if nodat then Dat := THeadValue.Create('');
+  FJoinChannels.Clear;
+  for i := 0 to Dat.Count-1 do
+    if Dat.KeyAt[i] = 'Entry' then begin
+      if RegExp.Match('m/^(.+?) \((\d+?)\)$/', Dat.ValueAt[i]) then
+        FJoinChannels.Add(RegExp[1]);
+    end;
+  with tabChannel do begin
+    OnChange := nil;
+    FJoinChannels.Sort;
+    Tabs.BeginUpdate;
+    Tabs.Clear;
+    for i := 0 to FJoinChannels.Count-1 do begin
+      //\8eó\90M\90ê\97p\83`\83\83\83\93\83l\83\8b\82Í\95\\8e¦\82µ\82È\82¢
+      if not FChannelList.Channel[FJoinChannels[i]].NoPost then
+        Tabs.Add(FJoinChannels[i]);
+    end;
+    Tabs.EndUpdate;
+    TabIndex := 0;
+    for i := 0 to Tabs.Count-1 do
+      if Tabs[i] = FNowChannel then TabIndex := i;
+    if Tabs.Count > 0 then begin
+      FNowChannel := Tabs[TabIndex];
+      actSend.Hint := Format('\81u%s\81v\82É\91\97\90M|%s', [FNowChannel, SendButtonLongHint]);
+    end else begin
+      FNowChannel := '';
+      actSend.Hint := Format('\91\97\90M|%s', [SendButtonLongHint]);
+    end;
+    Visible := Tabs.Count > 0;
+    if Tabs.Count > 1 then begin
+      actNextChannel.Enabled := true;
+      actPrevChannel.Enabled := true;
+    end else begin
+      actNextChannel.Enabled := false;
+      actPrevChannel.Enabled := false;
+    end;
+    OnChange := tabChannelChange;
+  end;
+  if nodat then Dat.Free;
+  if FJoinChannels.Count = 0 then begin
+    Self.Caption := FOriginalCaption + ' - \83`\83\83\83\93\83l\83\8b\82É\8eQ\89Á\82µ\82Ä\82¢\82Ü\82¹\82ñ';
+    actSend.Enabled := false;
+  end else begin
+    Self.Caption := FOriginalCaption;
+    actSend.Enabled := true;
+  end;
+end;
+
+procedure TfrmSender.cbxTargetGhostDropDown(Sender: TObject);
+begin
+  SakuraSeeker.BeginDetect;
+end;
+
+procedure TfrmSender.FastSstpResendTrying(Sender: TObject; ID: Integer;
+  const Script: String);
+var Ghost, Channel, MID: String;
+begin
+  //\83\81\83b\83Z\81[\83WID\82É\89\9e\82\82ÄSender, TargeHWnd\82ð\95Ï\8dX\82·\82é
+  FCueGhost.GetIdGhost(ID, Ghost, Channel, MID);
+  frmLog.SetBottleStatusToPlaying(MID);
+  FastSstp.SstpSender := 'SSTP Bottle / ' + Channel;
+  SetHWndToFavoriteGhost(Ghost);
+end;
+
+procedure TfrmSender.FastSstpResendEnd(Sender: TObject; ID: Integer;
+  const Script: String);
+var Ghost, Channel, MID: String;
+begin
+  FCueGhost.GetIdGhost(ID, Ghost, Channel, MID);
+  frmLog.SetBottleStatusToOpened(MID);
+  FCueGhost.DeleteIdGhost(ID);
+end;
+
+procedure TfrmSender.actShowLogExecute(Sender: TObject);
+begin
+  frmLog.Show;
+  if frmLog.WindowState = wsMinimized then frmLog.WindowState := wsNormal;
+end;
+
+procedure TfrmSender.Slpp20Connect(Sender: TObject);
+begin
+  Added := true;
+end;
+
+procedure TfrmSender.actSleepExecute(Sender: TObject);
+begin
+  if actSleep.Checked then begin
+    actSleep.Checked := false;
+    ShowHintLabel('\83X\83\8a\81[\83v\82ð\89ð\8f\9c\82µ\82Ü\82µ\82½');
+  end else begin
+    actSleep.Checked := true;
+    ShowHintLabel('\83X\83\8a\81[\83v\82ð\90Ý\92è\82µ\82Ü\82µ\82½');
+  end;
+  Sleeping := actSleep.Checked;
+  ChangeTaskIcon;
+end;
+
+
+procedure TfrmSender.DispatchBottle(EventType: TSlppEventType;
+  Dat: THeadValue);
+var Opt: TSstpSendOptions;
+    TransOpt: TScriptTransOptions;
+    Script, Sender, Ghost, Channel, Err: String;
+    CueID: integer;
+    CanPlaySound: boolean;
+    Sound: String;
+begin
+  Opt := [];
+  if Pref.NoTranslate then Opt := Opt + [soNoTranslate];
+  if Pref.NoDescript  then Opt := Opt + [soNoDescript];
+  Channel := Dat['Channel'];
+  case EventType of
+    etScript: Sender := Channel;
+    etForceBroadcast: Sender := '\81y\82¨\92m\82ç\82¹\81z';
+    etUnicast: Sender := Dat['SenderUID'];
+  end;
+  Ghost := GetChannelPrefs(Channel).TargetGhost;
+  if Ghost = '' then //\83`\83\83\83\93\83l\83\8b\8ew\92è\83S\81[\83X\83g
+    if FChannelList.Channel[Channel] <> nil then
+      Ghost := FChannelList.Channel[Channel].Ghost;
+  //\96Ú\95W\83S\81[\83X\83g\8c\88\92è
+  if Dat['IfGhost'] <> '' then begin
+    Ghost := Dat['IfGhost'];
+  end;
+  if GetChannelPrefs(Channel).IgnoreIfGhost then
+    Ghost := GetChannelPrefs(Channel).TargetGhost;
+  //\83X\83N\83\8a\83v\83g\95Ï\8a·
+  Script := Dat['Script'];
+  if Pref.NoTransURL then
+    TransOpt := [toConvertURL, toNoChoice, toWaitScriptEnd]
+  else
+    TransOpt := [toConvertURL, toWaitScriptEnd];
+  if Pref.IgnoreFrequentYenS then TransOpt := TransOpt + [toIgnoreFrequentYenS];
+  Err := DoTrans(Script, TransOpt);
+  if Err <> '' then begin
+    frmLog.AddSystemLog('\96â\91è\82Ì\82 \82é\89Â\94\\90«\82Ì\82 \82é\83X\83N\83\8a\83v\83g\82ª\93Í\82¢\82½\82½\82ß\81A'+
+                  '\94z\91\97\82³\82ê\82Ü\82¹\82ñ\82Å\82µ\82½\81@\81c '+Dat['Script']);
+    Exit;
+  end;
+
+  if Dat['Script'] <> '' then begin
+    CueID := FastSstp.SstpSENDCue(Script, false, Opt, GhostNameToSetName(Ghost));
+    frmLog.AddScriptLog(Dat['Script'], Sender, Dat['MID'], Dat['IfGhost']);
+    if Dat['IfGhost'] <> '' then Sender := Sender + '/' + Dat['IfGhost'];
+    FCueGhost.AddIdGhost(CueID, Ghost, Sender, Dat['MID']);
+  end;
+  if EventType = etScript then begin
+    //\89¹\82ª\8dÄ\90\82Å\82«\82é\82©\82Ç\82¤\82©\82Ì\94»\92è
+    if GetChannelPrefs(Channel).SoundArrived = saParent then
+      CanPlaySound := Pref.DefChannelPref.SoundArrived = saTrue
+    else
+      CanPlaySound := GetChannelPrefs(Channel).SoundArrived = saTrue;
+    if (Application.ShowMainForm = false) and
+       (Pref.SilentWhenHidden) then CanPlaySound := false;
+    Sound := GetChannelPrefs(Channel).SoundFile;
+    //\89¹\82Ì\8dÄ\90
+    if CanPlaySound then begin
+      if MediaPlayer.FileName <> Sound then begin
+        MediaPlayer.FileName := Sound;
+        MediaPlayer.Open;
+      end;
+      MediaPlayer.Play;
+    end;
+  end;
+  if Dat['DialogMessage'] <> '' then begin
+    Beep;
+    frmMessageBox.ShowMessage('SSTP Bottle\83T\81[\83o\82©\82ç\82¨\92m\82ç\82¹'#13#10+Dat['DialogMessage']);
+    frmLog.AddSystemLog(Dat['DialogMessage']);
+  end;
+end;
+
+function TfrmSender.SetHWndToFavoriteGhost(const Ghost: String): String;
+begin
+  //FastSstp.TargetHWnd\82ð\81A\90\84\8f§\82·\82é\83S\81[\83X\83g\82É\90Ý\92è\82·\82é\81B
+  //\82È\82¢\8fê\8d\87\82Í\81A\82Æ\82è\82 \82¦\82¸\8eè\8bß\82È\83S\81[\83X\83g\82É\8cü\82¯\82Ä\91\97\90M\82Å\82«\82é\82æ\82¤\82É\82Í\82·\82é\81B
+  SakuraSeeker.BeginDetect; //\8dÅ\90V\82ÌFMO\8eæ\93¾
+  if SakuraSeeker.ProcessByName[Ghost] <> nil then begin
+    FastSstp.TargetHWnd := SakuraSeeker.ProcessByName[Ghost].HWnd;
+    Result := Ghost;
+  end else if SakuraSeeker.Count > 0 then begin
+    FastSstp.TargetHWnd := SakuraSeeker[0].HWnd;
+    Result := SakuraSeeker[0].Name;
+  end else begin
+    FastSstp.TargetHwnd := 0;
+    Result := '';
+  end;
+end;
+
+procedure TfrmSender.InitFastSstp;
+begin
+  with FastSstp do begin
+    Port := Pref.ServerPort;
+    if Pref.UsePort then SstpMethod := smTcpIp else SstpMethod := smDirectSstp;
+    cbxTargetGhost.Enabled := not Pref.UsePort;
+  end;
+end;
+
+procedure TfrmSender.YenETrans;
+var St, Le, i: integer;
+    Orig, Text: String;
+begin
+  St := memScript.SelStart;
+  Le := memScript.SelLength;
+  Orig := GetScriptText;
+  RegExp.Subst('s/(\r\n)+$//kg', Orig);
+
+  if SsParser.InputString <> Orig then begin
+    //\90F\95ª\82¯\92x\89\84\82Ì\90Ý\92è\82É\82æ\82Á\82Ä\82Í\82±\82Ì2\82Â\82ª\90H\82¢\88á\82¤\89Â\94\\90«\82ª\82 \82é
+    SsParser.InputString := Orig
+  end;
+  for i := 0 to SsParser.Count-1 do begin
+    if SsParser[i] <> '\e' then Text := Text + SsParser[i];
+  end;
+
+  Text := Text + '\e';
+
+  if Orig <> Text then memScript.Lines.Text := Text;
+  SsParser.InputString := Text;
+
+  RegExp.Subst('s/\r\n//kg', Text);
+  memScript.SetFocus;
+  memScript.SelStart := St;
+  memScript.SelLength := Le;
+end;
+
+procedure TfrmSender.Slpp20ConnectionFailed(Sender: TObject);
+begin
+  Slpp20.Disconnect;
+  ShowHintLabel('Bottle\83T\81[\83o\82Æ\82Ì\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½', WarningColor);
+  frmLog.AddSystemLog('\83T\81[\83o\82Æ\82Ì\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½');
+end;
+
+procedure TfrmSender.PostCommand(const Command: array of String);
+var PostStr: String;
+    i: integer;
+begin
+  if NMHTTP.Connected then Exit;
+  Connecting := true;
+  if Pref.UseHttpProxy then begin
+    NMHTTP.Proxy := Pref.ProxyAddress;
+    NMHTTP.ProxyPort := Pref.ProxyPort;
+  end else begin
+    NMHTTP.Proxy := '';
+  end;
+  for i := Low(Command) to High(Command) do begin
+    PostStr := PostStr + Command[i];
+    if i <> High(Command) then PostStr := PostStr + #13#10;
+  end;
+  NMHTTP.Post(Pref.CgiName, PostStr);
+end;
+
+procedure TfrmSender.PostCommand(Command: TStrings);
+begin
+  Connecting := true;
+  if NMHTTP.Connected then Exit;
+  if Pref.UseHttpProxy then begin
+    NMHTTP.Proxy := Pref.ProxyAddress;
+    NMHTTP.ProxyPort := Pref.ProxyPort;
+  end else begin
+    NMHTTP.Proxy := '';
+  end;
+  NMHTTP.Post(Pref.CgiName, Command.Text);
+end;
+
+procedure TfrmSender.tabChannelDrawTab(Control: TCustomTabControl;
+  TabIndex: Integer; const Rect: TRect; Active: Boolean);
+var X, Y: integer;
+begin
+  with tabChannel.Canvas do begin
+    FillRect(Rect);
+    if Active then begin
+      Font.Style := Font.Style + [fsBold];
+      if Pref.ChannelPref[FNowChannel].WarnPost then
+        Font.Color := clRed
+      else
+        Font.Color := clBlue;
+    end else begin
+      Font.Style := Font.Style - [fsBold];
+      Font.Color := clWindowText;
+    end;
+    if Pref.ChannelPref[tabChannel.Tabs[TabIndex]].WarnPost then
+      Font.Style := Font.Style + [fsUnderline]
+    else
+      Font.Style := Font.Style - [fsUnderline];
+    X := (Rect.Left + Rect.Right) div 2;
+    X := X - TextWidth(tabChannel.Tabs[TabIndex]) div 2;
+    if tabChannel.TabPosition = tpTop then
+      Y := Rect.Top + 4
+    else
+      Y := Rect.Bottom - 15;
+    TextOut(X, Y, tabChannel.Tabs[TabIndex]);
+  end;
+end;
+
+procedure TfrmSender.Button1Click(Sender: TObject);
+begin
+  {SetHWndToFavoriteGhost('\88À\8eq');
+  FastSSTP.SstpSEND('hogehoge', [soNoTranslate], SakuraSeeker.ProcessByName['\88À\8eq'].SetName);
+  ShowMessage(FastSstp.SentLog);
+  ShowMessage(FastSSTP.RecvLog);}
+  {Ghost := FastSstp.SstpExGetName;
+  ShowMessage(Ghost);
+  ShowMessage(FastSstp.SentLog);}
+  //FastSstp.SstpSEND('hogehoge', [], Ghost);
+  //ShowMessage(FastSstp.RecvLog);
+  {Str := nil;
+  try
+    Str := TStringList.Create;
+    with Str do begin
+      Add('SEND SSTP/1.4');
+      Add('Sender: \83J\81[\83h\83L\83\83\83v\83^\81[');
+      Add('IfGhost: \82³\82­\82ç,\82¤\82É\82ã\82¤');
+      Add('Script: \h\s0\82³\82­\82ç\82¾\81[\81B\w8\n\n%j');
+      Add('Charset: Shift_JIS');
+      Add('Option: nodescript');
+      Add('HWnd: ' + IntToStr(FastSstp.Handle));
+    end;
+    FastSstp.ConnectSstp(Str);
+    ShowMessage(FastSstp.SentLog);
+    ShowMessage(FastSstp.RecvLog);
+  finally
+    Str.Free;
+  end;}
+end;
+
+procedure TfrmSender.actVoteMessageExecute(Sender: TObject);
+var Log: TLogItem;
+begin
+  Log := BottleLog[frmLog.lvwLog.Selected.Index] as TLogItem;
+  if Log = nil then Exit;
+  if Log.LogType <> ltBottle then Exit;
+  PostCommand([
+    'Command: voteMessage',
+    'VoteType: Vote',
+    'LUID: ' + Pref.LUID,
+    'MID: ' + Log.MID
+  ]);
+end;
+
+
+procedure TfrmSender.actAgreeMessageExecute(Sender: TObject);
+var Log: TLogItem;
+begin
+  Log := BottleLog[frmLog.lvwLog.Selected.Index] as TLogItem;
+  if Log = nil then Exit;
+  if Log.LogType <> ltBottle then Exit;
+  PostCommand([
+    'Command: voteMessage',
+    'VoteType: Agree',
+    'LUID: ' + Pref.LUID,
+    'MID: ' + Log.MID
+  ]);
+end;
+
+
+function TfrmSender.GhostNameToSetName(const Ghost: String): String;
+begin
+  if SakuraSeeker.ProcessByName[Ghost] <> nil then
+    Result := SakuraSeeker.ProcessByName[Ghost].SetName
+  else
+    Result := '';
+end;
+
+procedure TfrmSender.tabChannelContextPopup(Sender: TObject;
+  MousePos: TPoint; var Handled: Boolean);
+var Ch: String;
+begin
+  with tabChannel do begin
+    Tag := IndexOfTabAt(MousePos.X, MousePos.Y);
+    if Tag < 0 then Handled := true;
+    Ch := Tabs[Tag];
+    mnCanAutoAdd.Checked := Pref.ChannelPref[Ch].CanAutoAdd;
+    mnWarnPost.Checked := Pref.ChannelPref[Ch].WarnPost;
+  end;
+end;
+
+procedure TfrmSender.PostSetChannel(Channels: TStrings);
+var PostStr: TStringList;
+    i: integer;
+begin
+  PostStr := nil;
+  try
+    PostStr := TStringList.Create;
+    with PostStr do begin
+      Add('Command: setChannels');
+      Add('Agent: ' + VersionString);
+      Add('LUID: ' + Pref.LUID);
+      if Channels <> nil then
+        for i := 0 to Channels.Count-1 do begin
+          Add(Format('Ch%d: %s'#13#10, [i+1, Channels[i]]));
+        end;
+    end;
+    PostCommand(PostStr);
+  finally
+    PostStr.Free;
+  end;
+end;
+
+procedure TfrmSender.mnLeaveThisChannelClick(Sender: TObject);
+var Ch: String;
+    Chs: TStringList;
+begin
+  with tabChannel do Ch := Tabs[Tag];
+  Chs := nil;
+  try
+    Chs := TStringList.Create;
+    Chs.Assign(FJoinChannels);
+    while Chs.IndexOf(Ch) >= 0 do Chs.Delete(Chs.IndexOf(Ch));
+    PostSetChannel(Chs);
+  finally
+    Chs.Free;
+  end;
+end;
+
+procedure TfrmSender.mnCanAutoAddClick(Sender: TObject);
+var Ch: String;
+begin
+  with tabChannel do begin
+    Ch := Tabs[Tag];
+    Pref.ChannelPref[Ch].CanAutoAdd := not mnCanAutoAdd.Checked;
+  end;
+end;
+
+procedure TfrmSender.mnGotoVoteClick(Sender: TObject);
+begin
+  ShellExecute(Handle, 'open', PChar(Pref.VotePage), nil, nil, SW_SHOW);
+end;
+
+procedure TfrmSender.mnGotoGLogClick(Sender: TObject);
+begin
+  ShellExecute(Handle, 'open', PChar(Pref.GLogPage), nil, nil, SW_SHOW);
+end;
+
+procedure TfrmSender.tabChannelMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+var Index: integer;
+    Ch: String;
+begin
+  with tabChannel do begin
+    Index := IndexOfTabAt(X, Y);
+    Ch := Tabs[Index];
+    Hint := Ch + ': ' + IntToStr(FChannelList.Channel[Ch].Members) + '\90l';
+  end;
+end;
+
+procedure TfrmSender.mnGoToHelpClick(Sender: TObject);
+begin
+  ShellExecute(Handle, 'open', PChar(Pref.HelpPage), nil, nil, SW_SHOW);
+end;
+
+procedure TfrmSender.tabChannelMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var Index: integer;
+begin
+  with tabChannel do begin
+    Index := IndexOfTabAt(X, Y);
+    if Index = -1 then Exit; //\83^\83u\82ª\82È\82¢\82Ì\82Å\83h\83\89\83b\83O\82Å\82«\82È\82¢
+    if Button = mbLeft then begin
+      FDragTabIndex := Index; //\83h\83\89\83b\83O\82·\82é\83^\83u\82Ì\83C\83\93\83f\83b\83N\83X\82ð\95Û\91
+      BeginDrag(False);
+      FDragTabDest := -1;     //\83h\83\89\83b\83O\98g\90ü\95`\89æ\83t\83\89\83O\83N\83\8a\83A\82Ì\82½\82ß
+    end;
+  end;
+end;
+
+procedure TfrmSender.tabChannelDragOver(Sender, Source: TObject; X,
+  Y: Integer; State: TDragState; var Accept: Boolean);
+var TargetRect: TRect;
+    OldDest: integer;
+begin
+  Accept := Source = tabChannel;
+  with tabChannel do begin
+    OldDest := FDragTabDest;
+    FDragTabDest := IndexOfTabAt(X, Y);
+    if FDragTabDest = -1 then begin
+      Accept := false; //\82±\82Ì\8fê\8d\87\82Í\83h\83\8d\83b\83v\82ð\94F\82ß\82È\82¢
+      Exit;
+    end;
+    with Canvas do begin
+      Pen.Mode := pmNot;
+      Pen.Width := 3;
+    end;
+    if (OldDest <> FDragTabDest) and (OldDest >= 0) then begin
+      //\88È\91O\82Ì\98g\90ü\8fÁ\8b\8e
+      TargetRect := TabRect(OldDest);
+      with Canvas do begin
+        Brush.Style := bsClear;
+        Rectangle(TargetRect.Left, TargetRect.Top,
+                  TargetRect.Right, TargetRect.Bottom);
+      end;
+    end;
+    if (OldDest <> FDragTabDest) then begin
+      //\90V\82µ\82¢\98g\90ü\95`\89æ
+      TargetRect := TabRect(FDragTabDest);
+      with Canvas do begin
+        Brush.Style := bsClear;
+        Rectangle(TargetRect.Left, TargetRect.Top,
+                  TargetRect.Right, TargetRect.Bottom);
+      end;
+    end;
+  end;
+end;
+
+procedure TfrmSender.tabChannelDragDrop(Sender, Source: TObject; X,
+  Y: Integer);
+var DestIndex: integer;
+begin
+  with tabChannel do begin
+    DestIndex := IndexOfTabAt(X, Y);
+    Tabs.Move(FDragTabIndex, DestIndex);
+  end;
+end;
+
+procedure TfrmSender.tabChannelEndDrag(Sender, Target: TObject; X,
+  Y: Integer);
+begin
+  //\8b­\90§\93I\82É\83^\83u\82ð\8dÄ\95`\89æ\82³\82¹\82é\81B\98g\90ü\8fÁ\82µ\91Î\8dô
+  tabChannel.Tabs.BeginUpdate;
+  tabChannel.Tabs.EndUpdate;
+end;
+
+procedure TfrmSender.cbxTargetGhostDrawItem(Control: TWinControl;
+  Index: Integer; Rect: TRect; State: TOwnerDrawState);
+begin
+  with cbxTargetGhost do begin
+    if Index > 0 then begin
+      Canvas.Font.Color := clBlue;
+      Canvas.Font.Style := [fsBold];
+    end else begin
+      Canvas.Font.Color := clWindowText;
+      Canvas.Font.Style := [];
+    end;
+    cbxTargetGhost.Canvas.TextRect(Rect, Rect.Left, Rect.Top,
+      cbxTargetGhost.Items[Index]);
+  end;
+end;
+
+procedure TfrmSender.mnWarnPostClick(Sender: TObject);
+var Ch: String;
+begin
+  with tabChannel do begin
+    Ch := Tabs[Tag];
+    Pref.ChannelPref[Ch].WarnPost := not mnWarnPost.Checked;
+    tabChannel.Repaint;
+  end;
+end;
+
+procedure TfrmSender.FormCloseQuery(Sender: TObject;
+  var CanClose: Boolean);
+begin
+  if not Pref.ConfirmOnExit then Exit;
+  if MessageDlg('SSTP Bottle Client\82ð\8fI\97¹\82µ\82Ü\82·', mtConfirmation,
+                mbOkCancel, 0) = mrCancel then CanClose := false;
+end;
+
+
+end.
diff --git a/bottleclient/MessageBox.dfm b/bottleclient/MessageBox.dfm
new file mode 100755 (executable)
index 0000000..827c52a
--- /dev/null
@@ -0,0 +1,199 @@
+object frmMessageBox: TfrmMessageBox
+  Left = 310
+  Top = 465
+  BorderIcons = []
+  BorderStyle = bsDialog
+  Caption = 'SSTP Bottle'
+  ClientHeight = 151
+  ClientWidth = 444
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  FormStyle = fsStayOnTop
+  OldCreateOrder = False
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 12
+  object Image1: TImage
+    Left = 8
+    Top = 16
+    Width = 60
+    Height = 60
+    AutoSize = True
+    Picture.Data = {
+      07544269746D617046120000424D461200000000000036040000280000003C00
+      00003C0000000100080000000000100E00000000000000000000000100000000
+      00009A9A9A00E7E49700EBE9A600C5C5B20079797900739EA400D6D6D200D1D1
+      CB00E5B98800C7C9AA00CECECE00C4C4C300F3F1CB00F5F5EB00D8D8D800EEEB
+      B200199AAC00DDDEBD008A8A8A00E0DC6E00C6C69D00F8F7E4005C9DAA00F7F6
+      E000EEEEDD00FCD9FC00E4E18300DEDA65007575740031AEB5006C6C6B007272
+      6E00BEBFAF00E6DBCE00DDDEB900F6F6EC00D9DAB2009D9D8B00F5E7D300FAFB
+      F70000A4C60000B1C600DFDB6A00407B8500E8E9D100E1E1E100F1D8B700F8F9
+      D900A4A49C00F9FAE100BABBAA0093926E00949492003386920039828C0000B5
+      C600F3F3E600FEFEFD00E2E3C400EDCCA500F5F5F500ACADA500EAEAEA00EEEE
+      EE002596A000DBD88900F0F0E000CACAC50000BAC600F4F3D300A5A37900EBBF
+      9400B1B1B100A7A7A5004E96990008A7BE004CA5AF00E0E1C100DEDFD100D3D4
+      C600F6F5DC0000ACC600ABABAB00FCFCF800DCDECD00ECEDDA00A5A4830018A3
+      AD005A696B00B9B9B900D6D7B6009B9B9400CCCB8A008A8A8400F8F9E400E5E6
+      CA00FEFEFE00A4A59400C8C8BB00F5F4D800FAFAF90091918D00FCFCFB00AEAE
+      AE00FCFDFA0000A9C600C1C1BB0083837B00E1DD7200DDDA7A00E4E4DC004A76
+      7B00DBD66600B4B59F00889B9D00A2A28E00FBFBF300BBBBB000E4E5D40000BD
+      C600F8F8F100FEF4FE00BBBCA200B4B37A00D3D4B0007C7C6E00ECC09600E4C9
+      7A00F7F8E500F2F2F200D5D7B100F9F9EC00E6E7CD00FDFDF500F8EADD00AFB0
+      AA0006B5BF00ADAE9E0080808000DBDBA400E9E9CA00F1D9C200EDF1D200FEEC
+      FE00E4BE7C0091928400F9F9F00013B5C000B6B6B600D9DABA00DBD6AF00F7FB
+      DA0013A5C000F5E2EC0085858100F7F1E600DFC99B00FEFCFE00E7E7C500EDC4
+      9C00898A7E0039A2B500FEFAFE00FDE5FD00BDBDBD005FA4A900D3D5BE00EAEA
+      D400B6B8A800DBDBDB00ACADA800FCCEFC00D7D35F000C9BB900B0B0B000DFDF
+      C20087878400318E9400566E6F00E2DF7A00FAFAEF00E3E07E00E1DE7600F8F8
+      E800FAFAF500BABB9D00DBDCB700DADBB500F1F2E400DFE0BF00FBFCEC00E3E3
+      C700F7F8F000EBECD70080807700F6F7EE00BFBFB700DAD99D007E7F7D00506F
+      7500F0EEBE00C7C8B700288B9D00F4F4E900E9E8C100F1F1ED00E3C29500A7A7
+      8900F9F9F300DFDA7200F4F4E200C4C17900E2C69B00F3F3DD00FCFCF000F7F1
+      DD00E5E5C10097978A00BDBB7D00FEFFFC00CECFB100B0AF8D00D0D1AB009B9A
+      7100DFCDA300ECECE300F0D2B300E1E0A000DEDEAA00F8F7E900DDD46900F8EF
+      E400B0B09B00D4D06600E3D57600E4E8CB0088887C0026B0BA00FAFAF300FBF8
+      F100F9EDF400F7E6F000DDDDD900129BB300EBC99F0069A0A7001E91A700ECEC
+      D800DFDFDE00EFDBE00021A4BC00F5D9D200E5C8800063636300F8F9E800FFFF
+      FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF3F3E3E3F3F813C3C3C64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF0E0E594848341212121EFDFDFDFDFDFD1E04
+      04048A000000A40BA93E3E3F3E813C3939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFF3C0E483412FDFDFDFD1EB09A3430303032202032323232892525255DC2
+      C21FFDFDFDFD1FC60049590B430A2D3F6660FFFFFFFFFFFFFFFFFFFFFF0B8AFD
+      FDC665AAC4076E3838BC421818C1A72C8CCC9E9E9ED8D83ABF4DAFAF1195955A
+      7A7A2591C2FDFD0494AE67679443F881FFFFFFFFFFFFFFFF59FD0006D078C0C3
+      230D38D2D563450CC8C8C8C80F0F0F0202020201010101010101E3E3E3E48B82
+      DE1456FD00485252525252AE0A64FFFFFFFFFFFF8A4927B8D09283E515175063
+      45450C0C0CC8C8C81414DDCF56565656464646DA1A1A1AB5B3B66C2A705C14C2
+      65946752525252AE0B3FFFFFFFFFFFFFFD0627B8EEB483B71517506345450C0C
+      0C0C455BB0303D3DC44F4F4F4F623DB07B1A1AB5B3B66C2A70E914A004946752
+      525252670B3FFFFFFFFFFF0EFD5327B8EEB483B71517506363501780FEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFE547D1A1AB5B3B66C2A70AC14561E94675252526794
+      A966FFFFFFFFFF0B1C5327B8EEB483B715171580FEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFE1C41B5B5B3B66C2A70AC5CCFFDA45959A40BA93CFFFFFFFF
+      FFFFFF48125327B8EEB483B71580FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFE5BDA1AB5B3B66C1370705CB9FD43F83E81FFFFFFFFFFFFFFFFFFFF12
+      495327B874B483B71580FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      C4DFB5B5B3B66C132A1B4182FD0EFFFFFFFFFFFFFFFFFFFFFFFFFF8AAE5327B8
+      74B483B71515FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE767D1AB5
+      B3B66C132A1B4124FD0EFFFFFFFFFFFFFFFFFFFFFFFFFFFD065327B874B483B7
+      1517FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE1C1AB5B3B66C13
+      2A1B6D241F59FFFFFFFFFFFFFFFFFFFFFFFF3CFD065327B874B483B7151780FE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE65D3B5B3B66C132A1B6D24
+      C248FFFFFFFFFFFFFFFFFFFFFFFF0EFD6853272774B483B7151715FEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE3D46B5B3B66C132A1BD124C248FFFF
+      FFFFFFFFFFFFFFFFFFFF0AFD6853272774B483B7151717FEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFE4F33B5B3B66C132A1B1B24C248FFFFFFFFFFFF
+      FFFFFFFFFFFF488A6853272774B483B7151750FEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFE427DB5B3B66C132A1B1B24EC12FFFFFFFFFFFFFFFFFFFF
+      FFFF48126853272774B483B715175080FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEC6B5B3B66C132A1B1B242512FFFFFFFFFFFFFFFFFFFFFFFF1200
+      6853275374B483B715175017FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFE0CB5B3B66C132A1B1B242512FFFFFFFFFFFFFFFFFFFFFFFF12AE68532753
+      74B483B715175050FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0CB5
+      B3B66C132A1B1B8B2512FFFFFFFFFFFFFFFFFFFFFFFF1CAE6853275374B483B7
+      1517506380FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE17B5B3B66C13
+      2A1B1BC52512FFFFFFFFFFFFFFFFFFFFFFFFFD066853275374B483B715175063
+      17FEFEFE5E5E5E5E313131313131315E5E5E5EFEFEFEFEB5B3B66C132A1B1BC5
+      258AFFFFFFFFFFFFFFFFFFFFFFFFFD066853275374B483D7262EE23B2E2F2F2F
+      2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2FFC7FEAD1132A1B1BC573FDFFFF
+      FFFFFFFFFFFFFFFFFF0EFD3E685327EF26E29F47474747473B2F2F2F2F2F2F2F
+      2F2F2F2F2F2F2F2F2F2F2F2F2F2F2FF4080808907FE61B41B9FDFFFFFFFFFFFF
+      FFFFFFFFFF0EFD3968539B9F7E7E7E47474747477E2F2F2F2F3131315EBEBEBE
+      BEBEBEBE31313131313131F40808080808089041B9FDFFFFFFFFFFFFFFFFFFFF
+      FF0AFD396853867E7E7E7E474747474747D685FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFF60E2080808080808089CB9FDFFFFFFFFFFFFFFFFFFFFFF488A39
+      685327E72EF47E474747474747E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF60A28D0808080808089C96B9FDFFFFFFFFFFFFFFFFFFFFFF481239685327B8
+      B8D09B268D3B3B474786FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60A279FB
+      08CED4E096BB2424B9FDFFFFFFFFFFFFFFFFFFFFFF491239685353603939D0C3
+      230DCB38429BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF609D798F9911112222
+      BABB2424B9FDFFFFFFFFFFFFFFFFFFFFFF12AE3968536660393927C3230DCB38
+      38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF609D798FA31911112222BABB2424
+      B9FDFFFFFFFFFFFFFFFFFFFFFF12AE39685339603939D0C3230DCB38380DFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D798FA31919AF112222BABB2424B9FDFFFF
+      FFFFFFFFFFFFFFFFFF12AE39685339603939C0C3230DCB383838FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF9D798FA31919AB21112222BABB2424B9FDFFFFFFFFFFFF
+      FFFFFFFFFFFD0E3968536060393978C3230DCB3838BC39FFFFFFFFFFFFFFFFFF
+      FFFFFFFF9D798FA31919ABAB21112222BABB2424B9FDFFFFFFFFFFFFFFFFFFFF
+      FFFD0E396853606039396678230DCB3838BCB8FFFFFFFFFFFFFFFFFFFFFFFF60
+      79F0F199F9F9212111112222BABB242424FDFFFFFFFFFFFFFFFFFFFFFFFD0E39
+      685360603939393953C3CB3838BC23FFFF68B8B8C00DCBBC1855A7845F5FBFBF
+      3A4D4DBD11112222BABB2424DEFD3EFFFFFFFFFFFFFFFFFFFFFD0E3968536439
+      39393939393927CB38BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD
+      11112222BABB2424251EFFFFFFFFFFFFFFFFFFFFFF1C0081685327B866393939
+      3939392338BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD11112222
+      BABB2425FD0BFFFFFFFFFFFFFFFFFFFFFF2D1E8AF85327B8D0D05339393939CB
+      38BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD11112222BA7CECFD
+      0BFFFFFFFFFFFFFFFFFFFFFFFFFF3E12FD49CDB8D078C0785353C03838BCBC42
+      42181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD111122227A1F1E0EFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFF591E1CF2D078C0C3230DCB3838BCBC4242185555
+      7662C9C9C90303030303BFBF3A4D4DBD111182D9FD343CFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF3E12FD6A78C0C3230DCB3838BCBC424E75341CFDFDFDFD
+      FDFDFDFDFDFDFD1EA0E84DBD115A041E59FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFF59FD6A07AA230DCB3838625B1CFD582BCA1029292929373737
+      3788574036FD91BD11731C3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF481C07FDC40D0765FDFDC735F3695151512929292937373737444444
+      7757FD0911E81EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      3EFD6A00C60D1CC7CA4B2869696951515129292929373737374444447777B273
+      11DCFD2DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF346543
+      FDC4FDAD28282869696910CA356F6F6F2BB1B110578844447777B16B11111F48
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BFD43FDB02B28
+      28ADF636C7FDFD1E9A5B3030D99A6BFDFDFDFD6F2BB12B6B1111D98AFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0AFDAA1EFD2B2BB2FDFD9A
+      496A76556262C9C9C9030303A6033261916BFDFD111171FD3CFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00C6C6B0FD1EB03D434E75309AFDFD
+      FDFDFDFDFDFDFDFDFDFD1F6B617A9509111122FD0BFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF1C30FD070DCB06301CFD1E5D876A43434F4F4F
+      4F4F4F54544FA830C2FDFDA0E85A22EC34FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF2DFD6E07E1AA1CFDC6870643875D1EFDFDFDFDFDFDFDFDFD
+      FDFD1CA030A88965FD1E73611EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF491C6E00FD1E490659C6FDFDC73640104B2929292937374B5757B135
+      6F58FDA88E891EFDFD0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      8A1C1E1C0B0612FDB22BF64B695151515129292929373737444444447777B11E
+      97978E61FD34FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFDFDAEDB
+      00FD6FF62828696969515151512929292937373744444444777757FD9797978E
+      91FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B1E2DDB0BFDCA2828
+      28286969FAA14CF5050505A54C1DED3744444444777788FDA6EB891E1E0BFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF591E0EDB122B282898A1160500
+      000005F54C4C4C050500000072F54CED937777FD1CFD1C483CFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF491E1C1E3516720000054CA198515151
+      51292929293793ED4CA5050000001DFD340AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF3C0B8A2B16A1FA282869696951515151292929
+      29373737444444441D4A4AFD0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF0AFDFD6F6F363535F6101010515129292929575740
+      B1366F58FDFD1E122DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF3C0E484812128AFDFDFDFDFDFDFDFDFDFDFDFD1E1234480B
+      0E3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E0E0E0E0E0E3CFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}
+  end
+  object memMessage: TMemo
+    Left = 72
+    Top = 16
+    Width = 356
+    Height = 98
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    ParentColor = True
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 0
+  end
+  object btnOk: TButton
+    Left = 331
+    Top = 121
+    Width = 99
+    Height = 25
+    Anchors = [akRight, akBottom]
+    Caption = 'Read Next'
+    Default = True
+    TabOrder = 1
+    OnClick = btnOkClick
+  end
+end
diff --git a/bottleclient/MessageBox.pas b/bottleclient/MessageBox.pas
new file mode 100755 (executable)
index 0000000..b96a617
--- /dev/null
@@ -0,0 +1,93 @@
+unit MessageBox;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  StdCtrls, Contnrs, ExtCtrls;
+
+type
+  TfrmMessageBox = class(TForm)
+    memMessage: TMemo;
+    btnOk: TButton;
+    Image1: TImage;
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure btnOkClick(Sender: TObject);
+    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+  private
+    { Private \90é\8c¾ }
+    FMessages: TObjectList;
+    procedure UpdateMessage;
+  public
+    { Public \90é\8c¾ }
+    procedure ShowMessage(const Mes: String); overload;
+    procedure ShowMessage(Mes: TStrings); overload;
+  end;
+
+var
+  frmMessageBox: TfrmMessageBox;
+
+implementation
+
+{$R *.DFM}
+
+procedure TfrmMessageBox.FormCreate(Sender: TObject);
+begin
+  FMessages := TObjectList.Create;
+end;
+
+procedure TfrmMessageBox.FormDestroy(Sender: TObject);
+begin
+  FMessages.Free;
+end;
+
+procedure TfrmMessageBox.ShowMessage(const Mes: String);
+var Str: TStringList;
+begin
+  Str := TStringList.Create;
+  with Str do begin
+    Text := Mes;
+    Self.ShowMessage(Str);
+    Free;
+  end;
+end;
+
+procedure TfrmMessageBox.ShowMessage(Mes: TStrings);
+var Str: TStringList;
+begin
+  Str := TStringList.Create;
+  Str.Assign(Mes);
+  Str.Insert(0, DateTimeToStr(Now));
+  FMessages.Add(Str);
+  UpdateMessage;
+end;
+
+procedure TfrmMessageBox.btnOkClick(Sender: TObject);
+begin
+  FMessages.Delete(0);
+  UpdateMessage;
+end;
+
+procedure TfrmMessageBox.UpdateMessage;
+begin
+  if FMessages.Count > 0 then begin
+    memMessage.Lines.Assign(FMessages[0] as TStrings);
+  end else begin
+    Close;
+    Exit;
+  end;
+  if FMessages.Count <= 1 then //\8dÅ\8cã\82Ì1\82Â\82Ì\83\81\83b\83Z\81[\83W\82Ì\8fê\8d\87
+    btnOk.Caption := '&OK'
+  else
+    btnOk.Caption := Format('>>\8e\9f(%d)', [FMessages.Count-1]);
+  Show;
+end;
+
+procedure TfrmMessageBox.FormCloseQuery(Sender: TObject;
+  var CanClose: Boolean);
+begin
+  CanClose :=  FMessages.Count = 0;
+end;
+
+end.
diff --git a/bottleclient/SendConfirm.dfm b/bottleclient/SendConfirm.dfm
new file mode 100755 (executable)
index 0000000..827d36e
--- /dev/null
@@ -0,0 +1,211 @@
+object frmConfirmSend: TfrmConfirmSend
+  Left = 304
+  Top = 327
+  BorderStyle = bsDialog
+  Caption = '\91\97\90M\8am\94F'
+  ClientHeight = 94
+  ClientWidth = 402
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object Label1: TLabel
+    Left = 80
+    Top = 16
+    Width = 278
+    Height = 12
+    Caption = 'SSTP Bottle\93o\98^\8eÒ\91S\88õ\82É\91\97\90M\82µ\82Ü\82·\81B\82æ\82ë\82µ\82¢\82Å\82·\82©?'
+  end
+  object Image1: TImage
+    Left = 8
+    Top = 8
+    Width = 60
+    Height = 60
+    AutoSize = True
+    Picture.Data = {
+      07544269746D617046120000424D461200000000000036040000280000003C00
+      00003C0000000100080000000000100E00000000000000000000000100000000
+      00009A9A9A00E7E49700EBE9A600C5C5B20079797900739EA400D6D6D200D1D1
+      CB00E5B98800C7C9AA00CECECE00C4C4C300F3F1CB00F5F5EB00D8D8D800EEEB
+      B200199AAC00DDDEBD008A8A8A00E0DC6E00C6C69D00F8F7E4005C9DAA00F7F6
+      E000EEEEDD00FCD9FC00E4E18300DEDA65007575740031AEB5006C6C6B007272
+      6E00BEBFAF00E6DBCE00DDDEB900F6F6EC00D9DAB2009D9D8B00F5E7D300FAFB
+      F70000A4C60000B1C600DFDB6A00407B8500E8E9D100E1E1E100F1D8B700F8F9
+      D900A4A49C00F9FAE100BABBAA0093926E00949492003386920039828C0000B5
+      C600F3F3E600FEFEFD00E2E3C400EDCCA500F5F5F500ACADA500EAEAEA00EEEE
+      EE002596A000DBD88900F0F0E000CACAC50000BAC600F4F3D300A5A37900EBBF
+      9400B1B1B100A7A7A5004E96990008A7BE004CA5AF00E0E1C100DEDFD100D3D4
+      C600F6F5DC0000ACC600ABABAB00FCFCF800DCDECD00ECEDDA00A5A4830018A3
+      AD005A696B00B9B9B900D6D7B6009B9B9400CCCB8A008A8A8400F8F9E400E5E6
+      CA00FEFEFE00A4A59400C8C8BB00F5F4D800FAFAF90091918D00FCFCFB00AEAE
+      AE00FCFDFA0000A9C600C1C1BB0083837B00E1DD7200DDDA7A00E4E4DC004A76
+      7B00DBD66600B4B59F00889B9D00A2A28E00FBFBF300BBBBB000E4E5D40000BD
+      C600F8F8F100FEF4FE00BBBCA200B4B37A00D3D4B0007C7C6E00ECC09600E4C9
+      7A00F7F8E500F2F2F200D5D7B100F9F9EC00E6E7CD00FDFDF500F8EADD00AFB0
+      AA0006B5BF00ADAE9E0080808000DBDBA400E9E9CA00F1D9C200EDF1D200FEEC
+      FE00E4BE7C0091928400F9F9F00013B5C000B6B6B600D9DABA00DBD6AF00F7FB
+      DA0013A5C000F5E2EC0085858100F7F1E600DFC99B00FEFCFE00E7E7C500EDC4
+      9C00898A7E0039A2B500FEFAFE00FDE5FD00BDBDBD005FA4A900D3D5BE00EAEA
+      D400B6B8A800DBDBDB00ACADA800FCCEFC00D7D35F000C9BB900B0B0B000DFDF
+      C20087878400318E9400566E6F00E2DF7A00FAFAEF00E3E07E00E1DE7600F8F8
+      E800FAFAF500BABB9D00DBDCB700DADBB500F1F2E400DFE0BF00FBFCEC00E3E3
+      C700F7F8F000EBECD70080807700F6F7EE00BFBFB700DAD99D007E7F7D00506F
+      7500F0EEBE00C7C8B700288B9D00F4F4E900E9E8C100F1F1ED00E3C29500A7A7
+      8900F9F9F300DFDA7200F4F4E200C4C17900E2C69B00F3F3DD00FCFCF000F7F1
+      DD00E5E5C10097978A00BDBB7D00FEFFFC00CECFB100B0AF8D00D0D1AB009B9A
+      7100DFCDA300ECECE300F0D2B300E1E0A000DEDEAA00F8F7E900DDD46900F8EF
+      E400B0B09B00D4D06600E3D57600E4E8CB0088887C0026B0BA00FAFAF300FBF8
+      F100F9EDF400F7E6F000DDDDD900129BB300EBC99F0069A0A7001E91A700ECEC
+      D800DFDFDE00EFDBE00021A4BC00F5D9D200E5C8800063636300F8F9E800FFFF
+      FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF3F3E3E3F3F813C3C3C64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF0E0E594848341212121EFDFDFDFDFDFD1E04
+      04048A000000A40BA93E3E3F3E813C3939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFF3C0E483412FDFDFDFD1EB09A3430303032202032323232892525255DC2
+      C21FFDFDFDFD1FC60049590B430A2D3F6660FFFFFFFFFFFFFFFFFFFFFF0B8AFD
+      FDC665AAC4076E3838BC421818C1A72C8CCC9E9E9ED8D83ABF4DAFAF1195955A
+      7A7A2591C2FDFD0494AE67679443F881FFFFFFFFFFFFFFFF59FD0006D078C0C3
+      230D38D2D563450CC8C8C8C80F0F0F0202020201010101010101E3E3E3E48B82
+      DE1456FD00485252525252AE0A64FFFFFFFFFFFF8A4927B8D09283E515175063
+      45450C0C0CC8C8C81414DDCF56565656464646DA1A1A1AB5B3B66C2A705C14C2
+      65946752525252AE0B3FFFFFFFFFFFFFFD0627B8EEB483B71517506345450C0C
+      0C0C455BB0303D3DC44F4F4F4F623DB07B1A1AB5B3B66C2A70E914A004946752
+      525252670B3FFFFFFFFFFF0EFD5327B8EEB483B71517506363501780FEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFE547D1A1AB5B3B66C2A70AC14561E94675252526794
+      A966FFFFFFFFFF0B1C5327B8EEB483B715171580FEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFE1C41B5B5B3B66C2A70AC5CCFFDA45959A40BA93CFFFFFFFF
+      FFFFFF48125327B8EEB483B71580FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFE5BDA1AB5B3B66C1370705CB9FD43F83E81FFFFFFFFFFFFFFFFFFFF12
+      495327B874B483B71580FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      C4DFB5B5B3B66C132A1B4182FD0EFFFFFFFFFFFFFFFFFFFFFFFFFF8AAE5327B8
+      74B483B71515FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE767D1AB5
+      B3B66C132A1B4124FD0EFFFFFFFFFFFFFFFFFFFFFFFFFFFD065327B874B483B7
+      1517FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE1C1AB5B3B66C13
+      2A1B6D241F59FFFFFFFFFFFFFFFFFFFFFFFF3CFD065327B874B483B7151780FE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE65D3B5B3B66C132A1B6D24
+      C248FFFFFFFFFFFFFFFFFFFFFFFF0EFD6853272774B483B7151715FEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE3D46B5B3B66C132A1BD124C248FFFF
+      FFFFFFFFFFFFFFFFFFFF0AFD6853272774B483B7151717FEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFE4F33B5B3B66C132A1B1B24C248FFFFFFFFFFFF
+      FFFFFFFFFFFF488A6853272774B483B7151750FEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFE427DB5B3B66C132A1B1B24EC12FFFFFFFFFFFFFFFFFFFF
+      FFFF48126853272774B483B715175080FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEC6B5B3B66C132A1B1B242512FFFFFFFFFFFFFFFFFFFFFFFF1200
+      6853275374B483B715175017FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFE0CB5B3B66C132A1B1B242512FFFFFFFFFFFFFFFFFFFFFFFF12AE68532753
+      74B483B715175050FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0CB5
+      B3B66C132A1B1B8B2512FFFFFFFFFFFFFFFFFFFFFFFF1CAE6853275374B483B7
+      1517506380FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE17B5B3B66C13
+      2A1B1BC52512FFFFFFFFFFFFFFFFFFFFFFFFFD066853275374B483B715175063
+      17FEFEFE5E5E5E5E313131313131315E5E5E5EFEFEFEFEB5B3B66C132A1B1BC5
+      258AFFFFFFFFFFFFFFFFFFFFFFFFFD066853275374B483D7262EE23B2E2F2F2F
+      2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2FFC7FEAD1132A1B1BC573FDFFFF
+      FFFFFFFFFFFFFFFFFF0EFD3E685327EF26E29F47474747473B2F2F2F2F2F2F2F
+      2F2F2F2F2F2F2F2F2F2F2F2F2F2F2FF4080808907FE61B41B9FDFFFFFFFFFFFF
+      FFFFFFFFFF0EFD3968539B9F7E7E7E47474747477E2F2F2F2F3131315EBEBEBE
+      BEBEBEBE31313131313131F40808080808089041B9FDFFFFFFFFFFFFFFFFFFFF
+      FF0AFD396853867E7E7E7E474747474747D685FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFF60E2080808080808089CB9FDFFFFFFFFFFFFFFFFFFFFFF488A39
+      685327E72EF47E474747474747E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF60A28D0808080808089C96B9FDFFFFFFFFFFFFFFFFFFFFFF481239685327B8
+      B8D09B268D3B3B474786FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60A279FB
+      08CED4E096BB2424B9FDFFFFFFFFFFFFFFFFFFFFFF491239685353603939D0C3
+      230DCB38429BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF609D798F9911112222
+      BABB2424B9FDFFFFFFFFFFFFFFFFFFFFFF12AE3968536660393927C3230DCB38
+      38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF609D798FA31911112222BABB2424
+      B9FDFFFFFFFFFFFFFFFFFFFFFF12AE39685339603939D0C3230DCB38380DFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D798FA31919AF112222BABB2424B9FDFFFF
+      FFFFFFFFFFFFFFFFFF12AE39685339603939C0C3230DCB383838FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF9D798FA31919AB21112222BABB2424B9FDFFFFFFFFFFFF
+      FFFFFFFFFFFD0E3968536060393978C3230DCB3838BC39FFFFFFFFFFFFFFFFFF
+      FFFFFFFF9D798FA31919ABAB21112222BABB2424B9FDFFFFFFFFFFFFFFFFFFFF
+      FFFD0E396853606039396678230DCB3838BCB8FFFFFFFFFFFFFFFFFFFFFFFF60
+      79F0F199F9F9212111112222BABB242424FDFFFFFFFFFFFFFFFFFFFFFFFD0E39
+      685360603939393953C3CB3838BC23FFFF68B8B8C00DCBBC1855A7845F5FBFBF
+      3A4D4DBD11112222BABB2424DEFD3EFFFFFFFFFFFFFFFFFFFFFD0E3968536439
+      39393939393927CB38BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD
+      11112222BABB2424251EFFFFFFFFFFFFFFFFFFFFFF1C0081685327B866393939
+      3939392338BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD11112222
+      BABB2425FD0BFFFFFFFFFFFFFFFFFFFFFF2D1E8AF85327B8D0D05339393939CB
+      38BCBC4242181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD11112222BA7CECFD
+      0BFFFFFFFFFFFFFFFFFFFFFFFFFF3E12FD49CDB8D078C0785353C03838BCBC42
+      42181855F7C1A7A72C2C84845F5FBFBF3A4D4DBD111122227A1F1E0EFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFF591E1CF2D078C0C3230DCB3838BCBC4242185555
+      7662C9C9C90303030303BFBF3A4D4DBD111182D9FD343CFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF3E12FD6A78C0C3230DCB3838BCBC424E75341CFDFDFDFD
+      FDFDFDFDFDFDFD1EA0E84DBD115A041E59FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFF59FD6A07AA230DCB3838625B1CFD582BCA1029292929373737
+      3788574036FD91BD11731C3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF481C07FDC40D0765FDFDC735F3695151512929292937373737444444
+      7757FD0911E81EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      3EFD6A00C60D1CC7CA4B2869696951515129292929373737374444447777B273
+      11DCFD2DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF346543
+      FDC4FDAD28282869696910CA356F6F6F2BB1B110578844447777B16B11111F48
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BFD43FDB02B28
+      28ADF636C7FDFD1E9A5B3030D99A6BFDFDFDFD6F2BB12B6B1111D98AFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0AFDAA1EFD2B2BB2FDFD9A
+      496A76556262C9C9C9030303A6033261916BFDFD111171FD3CFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00C6C6B0FD1EB03D434E75309AFDFD
+      FDFDFDFDFDFDFDFDFDFD1F6B617A9509111122FD0BFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF1C30FD070DCB06301CFD1E5D876A43434F4F4F
+      4F4F4F54544FA830C2FDFDA0E85A22EC34FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF2DFD6E07E1AA1CFDC6870643875D1EFDFDFDFDFDFDFDFDFD
+      FDFD1CA030A88965FD1E73611EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF491C6E00FD1E490659C6FDFDC73640104B2929292937374B5757B135
+      6F58FDA88E891EFDFD0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      8A1C1E1C0B0612FDB22BF64B695151515129292929373737444444447777B11E
+      97978E61FD34FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFDFDAEDB
+      00FD6FF62828696969515151512929292937373744444444777757FD9797978E
+      91FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B1E2DDB0BFDCA2828
+      28286969FAA14CF5050505A54C1DED3744444444777788FDA6EB891E1E0BFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF591E0EDB122B282898A1160500
+      000005F54C4C4C050500000072F54CED937777FD1CFD1C483CFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF491E1C1E3516720000054CA198515151
+      51292929293793ED4CA5050000001DFD340AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF3C0B8A2B16A1FA282869696951515151292929
+      29373737444444441D4A4AFD0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF0AFDFD6F6F363535F6101010515129292929575740
+      B1366F58FDFD1E122DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF3C0E484812128AFDFDFDFDFDFDFDFDFDFDFDFD1E1234480B
+      0E3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E0E0E0E0E0E3CFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}
+  end
+  object Button1: TButton
+    Left = 320
+    Top = 63
+    Width = 75
+    Height = 25
+    Anchors = [akRight, akBottom]
+    Caption = '&OK'
+    Default = True
+    ModalResult = 1
+    TabOrder = 0
+  end
+  object Button2: TButton
+    Left = 224
+    Top = 63
+    Width = 83
+    Height = 25
+    Anchors = [akRight, akBottom]
+    Cancel = True
+    Caption = '\83L\83\83\83\93\83Z\83\8b(&C)'
+    ModalResult = 2
+    TabOrder = 1
+  end
+  object cbxDontAlertAnyMore: TCheckBox
+    Left = 8
+    Top = 72
+    Width = 209
+    Height = 17
+    Caption = '\97]\8cv\82È\82¨\90¢\98b\82È\82Ì\82Å\8d¡\8cã\95\\8e¦\82µ\82È\82¢'
+    TabOrder = 2
+  end
+end
diff --git a/bottleclient/SendConfirm.pas b/bottleclient/SendConfirm.pas
new file mode 100755 (executable)
index 0000000..e9d8825
--- /dev/null
@@ -0,0 +1,36 @@
+unit SendConfirm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  StdCtrls, ExtCtrls;
+
+type
+  TfrmConfirmSend = class(TForm)
+    Button1: TButton;
+    Button2: TButton;
+    Label1: TLabel;
+    cbxDontAlertAnyMore: TCheckBox;
+    Image1: TImage;
+    procedure FormShow(Sender: TObject);
+  private
+    { Private \90é\8c¾ }
+  public
+    { Public \90é\8c¾ }
+  end;
+
+var
+  frmConfirmSend: TfrmConfirmSend;
+
+implementation
+
+{$R *.DFM}
+
+procedure TfrmConfirmSend.FormShow(Sender: TObject);
+begin
+  Beep;
+  cbxDontAlertAnyMore.Checked := false;
+end;
+
+end.
diff --git a/bottleclient/SettingForm.dfm b/bottleclient/SettingForm.dfm
new file mode 100755 (executable)
index 0000000..f3d466d
--- /dev/null
@@ -0,0 +1,650 @@
+object frmSetting: TfrmSetting
+  Left = 288
+  Top = 204
+  BorderStyle = bsDialog
+  Caption = '\90Ý\92è'
+  ClientHeight = 348
+  ClientWidth = 371
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  Scaled = False
+  ShowHint = True
+  OnClose = FormClose
+  PixelsPerInch = 96
+  TextHeight = 12
+  object PageControl: TPageControl
+    Left = 8
+    Top = 8
+    Width = 356
+    Height = 306
+    ActivePage = tstChannel
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    TabOrder = 0
+    object tstGeneral: TTabSheet
+      Caption = '\88ê\94Ê'
+      object lblDefaultScript: TLabel
+        Left = 8
+        Top = 16
+        Width = 265
+        Height = 12
+        Caption = '\83N\83\8a\83A\8e\9e\82Ì\8f\89\8aú\83X\83N\83\8a\83v\83g(\8fc\96_"|"\82Ì\88Ê\92u\82É\83J\81[\83\\83\8b)'
+      end
+      object memDefaultScript: TMemo
+        Left = 8
+        Top = 32
+        Width = 329
+        Height = 57
+        Hint = '\83N\83\8a\83A\83{\83^\83\93\82ð\89\9f\82µ\82½\82Æ\82«\82Ì\8f\89\8aú\83X\83N\83\8a\83v\83g\82ð\90Ý\92è'
+        Font.Charset = SHIFTJIS_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = '\82l\82\83S\83V\83b\83N'
+        Font.Style = []
+        ParentFont = False
+        ScrollBars = ssVertical
+        TabOrder = 0
+      end
+      object grpLocalConfirm: TGroupBox
+        Left = 8
+        Top = 96
+        Width = 329
+        Height = 49
+        Caption = '\83\8d\81[\83J\83\8b\8am\94F'
+        TabOrder = 1
+        object cbxIgnoreTimeCritical: TCheckBox
+          Left = 16
+          Top = 20
+          Width = 161
+          Height = 17
+          Hint = '\83\8d\81[\83J\83\8b\8am\94F\8e\9e\82É\t\82ð\91\97\90M\82µ\82È\82¢\82±\82Æ\82Å\91¼\82ÌSSTP\82ª\95\\8e¦\82³\82ê\82â\82·\82­\82·\82é'
+          Caption = '\83\8d\81[\83J\83\8b\8am\94F\8e\9e\82É\t\82ð\96³\8e\8b'
+          Checked = True
+          State = cbChecked
+          TabOrder = 0
+        end
+      end
+      object cbxAutoStart: TCheckBox
+        Left = 16
+        Top = 208
+        Width = 313
+        Height = 17
+        Caption = '\8bN\93®\8e\9e\82É\8e©\93®\93I\82É\81A\8e©\93®\8eQ\89Á\91Î\8fÛ\83`\83\83\83\93\83l\83\8b\82É\89Á\93ü'
+        TabOrder = 2
+      end
+      object rgpTabPosition: TRadioGroup
+        Left = 8
+        Top = 152
+        Width = 329
+        Height = 49
+        Hint = '\83`\83\83\83\93\83l\83\8b\83^\83u\82Ì\88Ê\92u\82ð\95Ï\8dX'
+        Caption = '\83`\83\83\83\93\83l\83\8b\83^\83u\82Ì\88Ê\92u'
+        Columns = 2
+        Items.Strings = (
+          '\8fã'
+          '\89º')
+        TabOrder = 3
+      end
+      object cbxNoSendGhostList: TCheckBox
+        Left = 16
+        Top = 232
+        Width = 281
+        Height = 17
+        Hint = 'SSTP Bottle\8d\91\90¨\92²\8d¸\82Ì\82½\82ß\82Ì\83S\81[\83X\83g\83\8a\83X\83g\82ð\91\97\90M\82µ\82Ü\82¹\82ñ'
+        Caption = '\8d\91\90¨\92²\8d¸\82É\8b¦\97Í\82µ\82È\82¢'
+        TabOrder = 4
+      end
+      object cbxConfirmOnExit: TCheckBox
+        Left = 16
+        Top = 256
+        Width = 281
+        Height = 17
+        Hint = 'Client\82Ì\8fI\97¹\8e\9e\82É\8am\94F\83\81\83b\83Z\81[\83W\82ð\8fo\82µ\82Ü\82·'
+        Caption = '\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\8fI\97¹\8e\9e\82É\8am\94F\82·\82é'
+        TabOrder = 5
+      end
+    end
+    object tstColor: TTabSheet
+      Caption = '\90F\95ª\82¯'
+      ImageIndex = 1
+      object lblColorTimeLag: TLabel
+        Left = 8
+        Top = 184
+        Width = 225
+        Height = 12
+        Caption = '\90F\95ª\82¯\92x\89\84(\89E\82É\82¢\82­\82Ù\82Ç\92x\82ê\82Ä\90F\95ª\82¯\8aJ\8en)'
+      end
+      object lblColorSpeed: TLabel
+        Left = 8
+        Top = 226
+        Width = 285
+        Height = 12
+        Caption = '\90F\95ª\82¯\83X\83s\81[\83h(\91¬\82·\82¬\82é\82Æ\83L\81[\83{\81[\83h\82Ì\94½\89\9e\82ª\93Ý\82è\82Ü\82·)'
+      end
+      object cbxColorScript: TCheckBox
+        Left = 8
+        Top = 16
+        Width = 201
+        Height = 17
+        Hint = '\83`\83F\83b\83N\82ð\89ð\8f\9c\82·\82é\82Æ\91¬\93x\82Í\91¬\93x\82Í\91¬\82­\82È\82é\82ª\8c©\82Ã\82ç\82¢'
+        Caption = '\83X\83N\83\8a\83v\83g\90F\95ª\82¯\82ð\8ds\82¤'
+        TabOrder = 0
+      end
+      object trkColorTimeLag: TTrackBar
+        Left = 16
+        Top = 200
+        Width = 200
+        Height = 25
+        Hint = '\82¿\82ç\82Â\82©\82È\82¢\94Í\88Í\82Å\82Å\82«\82é\82¾\82¯\8f¬\82³\82¢\92l\82ð\91I\82Ô'
+        Max = 1000
+        Orientation = trHorizontal
+        PageSize = 100
+        Frequency = 100
+        Position = 500
+        SelEnd = 0
+        SelStart = 0
+        TabOrder = 1
+        ThumbLength = 15
+        TickMarks = tmBottomRight
+        TickStyle = tsAuto
+      end
+      object trkColorSpeed: TTrackBar
+        Left = 16
+        Top = 240
+        Width = 200
+        Height = 25
+        Hint = '\83p\83t\83H\81[\83}\83\93\83X\82É\89e\8b¿\82ª\82È\82¢\94Í\88Í\82Å\82Å\82«\82é\82¾\82¯\91å\82«\82­\82·\82é'
+        Max = 25
+        Min = 5
+        Orientation = trHorizontal
+        Frequency = 1
+        Position = 10
+        SelEnd = 0
+        SelStart = 0
+        TabOrder = 2
+        ThumbLength = 15
+        TickMarks = tmBottomRight
+        TickStyle = tsAuto
+      end
+      object grpColor: TGroupBox
+        Left = 8
+        Top = 40
+        Width = 337
+        Height = 137
+        Caption = '\90F'
+        TabOrder = 3
+        object Label4: TLabel
+          Left = 176
+          Top = 56
+          Width = 66
+          Height = 12
+          Caption = '\83\81\83^\95\8e\9a\97ñ\90F'
+        end
+        object Label2: TLabel
+          Left = 176
+          Top = 16
+          Width = 79
+          Height = 12
+          Caption = '\82¤\82É\82ã\82¤\83Z\83\8a\83t\90F'
+        end
+        object Label1: TLabel
+          Left = 16
+          Top = 16
+          Width = 66
+          Height = 12
+          Caption = '\96{\91Ì\83Z\83\8a\83t\90F'
+        end
+        object Label3: TLabel
+          Left = 16
+          Top = 56
+          Width = 32
+          Height = 12
+          Caption = '\83^\83O\90F'
+        end
+        object Label5: TLabel
+          Left = 16
+          Top = 96
+          Width = 109
+          Height = 12
+          Caption = '\83}\81[\83N\83A\83b\83v\83G\83\89\81[\90F'
+        end
+        object Label8: TLabel
+          Left = 176
+          Top = 96
+          Width = 36
+          Height = 12
+          Caption = '\94w\8ci\90F'
+        end
+        object colTalkColorU: TColorCBox
+          Left = 175
+          Top = 32
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 0
+          OnColorPick = ColorPick
+        end
+        object colMetaWordColor: TColorCBox
+          Left = 175
+          Top = 72
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 1
+          OnColorPick = ColorPick
+        end
+        object colTalkColorH: TColorCBox
+          Left = 16
+          Top = 32
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 2
+          OnColorPick = ColorPick
+        end
+        object colMarkUpColor: TColorCBox
+          Left = 16
+          Top = 72
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 3
+          OnColorPick = ColorPick
+        end
+        object colMarkErrorColor: TColorCBox
+          Left = 16
+          Top = 109
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 4
+          OnColorPick = ColorPick
+        end
+        object colBgColor: TColorCBox
+          Left = 175
+          Top = 109
+          Width = 150
+          Height = 20
+          ShowUS = False
+          BmpType = bmRectangle
+          BmpWidth = 30
+          TopSpace = 1
+          LeftSpace = 2
+          ItemHeight = 14
+          TabOrder = 5
+          OnColorPick = ColorPick
+        end
+      end
+    end
+    object tstKeys: TTabSheet
+      Caption = '\83L\81['
+      ImageIndex = 3
+      object rgpWhenReturn: TRadioGroup
+        Left = 8
+        Top = 16
+        Width = 329
+        Height = 65
+        Caption = 'Enter\83L\81[\82Å\82Ì\93®\8dì'
+        Columns = 2
+        ItemIndex = 2
+        Items.Strings = (
+          '\n\91}\93ü'
+          '\89ü\8ds\82Ì\82Ý'
+          '\n\91}\93ü+\89ü\8ds'
+          '\92è\8c^\8bå\91}\93ü')
+        TabOrder = 0
+      end
+      object rgpWhenShiftReturn: TRadioGroup
+        Left = 8
+        Top = 88
+        Width = 329
+        Height = 65
+        Caption = 'Shift+Enter\83L\81[\82Å\82Ì\93®\8dì'
+        Columns = 2
+        ItemIndex = 3
+        Items.Strings = (
+          '\n\91}\93ü'
+          '\89ü\8ds\82Ì\82Ý'
+          '\n\91}\93ü+\89ü\8ds'
+          '\92è\8c^\8bå\91}\93ü')
+        TabOrder = 1
+      end
+      object rgpWhenCtrlReturn: TRadioGroup
+        Left = 8
+        Top = 160
+        Width = 329
+        Height = 65
+        Caption = 'Ctrl+Enter\83L\81[\82Å\82Ì\93®\8dì'
+        Columns = 2
+        ItemIndex = 1
+        Items.Strings = (
+          '\n\91}\93ü'
+          '\89ü\8ds\82Ì\82Ý'
+          '\n\91}\93ü+\89ü\8ds'
+          '\92è\8c^\8bå\91}\93ü')
+        TabOrder = 2
+      end
+    end
+    object tstReceive: TTabSheet
+      Caption = '\8eó\90M\8e\9e\82Ì\93®\8dì'
+      ImageIndex = 4
+      object Label9: TLabel
+        Left = 32
+        Top = 238
+        Width = 95
+        Height = 12
+        Caption = 'SSTP\83T\81[\83o\83|\81[\83g'
+      end
+      object lblWaitScriptEnd: TLabel
+        Left = 24
+        Top = 144
+        Width = 158
+        Height = 12
+        Caption = '\83X\83N\83\8a\83v\83g\82Ì\8dÅ\8cã\82É\83E\83F\83C\83g\91}\93ü'
+      end
+      object cbxNoDescript: TCheckBox
+        Left = 24
+        Top = 40
+        Width = 281
+        Height = 17
+        Hint = '\83`\83\83\83\93\83l\83\8b\82Ì\95\\8e¦\82ð\8ds\82í\82È\82¢'
+        Caption = '\8eó\90M\82µ\82½SSTP\82Énodescript\83I\83v\83V\83\87\83\93\82ð\82Â\82¯\82é'
+        TabOrder = 0
+      end
+      object cbxNoTranslate: TCheckBox
+        Left = 24
+        Top = 16
+        Width = 273
+        Height = 17
+        Hint = '\83g\83\89\83\93\83X\83\8c\81[\83^\82ð\92Ê\89ß\82³\82¹\82È\82¢'
+        Caption = '\8eó\90M\82µ\82½SSTP\82Énotranslate\83I\83v\83V\83\87\83\93\82ð\82Â\82¯\82é'
+        TabOrder = 1
+      end
+      object cbxPort: TComboBox
+        Left = 128
+        Top = 232
+        Width = 73
+        Height = 20
+        Hint = 'SSTP\83T\81[\83o\83|\81[\83g\81B9801\82ð\90\84\8f§'
+        Style = csDropDownList
+        Enabled = False
+        ItemHeight = 12
+        TabOrder = 2
+        OnChange = cbxPortChange
+        Items.Strings = (
+          '11000'
+          '9801'
+          '\82»\82Ì\91¼...')
+      end
+      object cbxSilentWhenHidden: TCheckBox
+        Left = 24
+        Top = 64
+        Width = 281
+        Height = 17
+        Hint = '\83A\83C\83R\83\93\89»\8e\9e\82É\89¹\82ð\88ê\90Ø\96Â\82ç\82³\82È\82¢\82æ\82¤\82É\82·\82é'
+        Caption = '\83A\83C\83R\83\93\89»\8e\9e\82É\82ÍBottle\93\9e\92\85\89¹\82ð\96Â\82ç\82³\82È\82¢'
+        TabOrder = 3
+      end
+      object cbxUsePort: TCheckBox
+        Left = 24
+        Top = 208
+        Width = 201
+        Height = 17
+        Hint = '\83\\83P\83b\83g\82ð\8eg\82¤\82ÆIfGhost\82Ì\90U\82è\95ª\82¯\82ª\88ê\90Ø\95s\89Â\94\\82É\82È\82é\82Ì\82Å\92\8d\88Ó'
+        Caption = 'SSTP\91\97\90M\82É\83\\83P\83b\83g\82ð\8eg\82¤(\94ñ\90\84\8f§)'
+        TabOrder = 4
+      end
+      object cbxNoTransUrl: TCheckBox
+        Left = 24
+        Top = 112
+        Width = 305
+        Height = 17
+        Hint = 'URL\83^\83O\82Â\82«\83\81\83b\83Z\81[\83W\82Ì\91I\91ð\8e\88\95\\8e¦\82ð\97}\90§\82·\82é'
+        Caption = 'URL\83^\83O\82Â\82«\83\81\83b\83Z\81[\83W\82ð\91I\91ð\8e\88\82È\82µ\82É\95Ï\8a·'
+        TabOrder = 5
+      end
+      object spnWaitScriptEnd: TSpinEdit
+        Left = 192
+        Top = 138
+        Width = 65
+        Height = 21
+        Hint = '\92P\88Ê\82Í50ms\81B9\82Å\w9\82ð\91}\93ü\82·\82é'
+        MaxValue = 100
+        MinValue = 0
+        TabOrder = 6
+        Value = 0
+      end
+    end
+    object tstChannel: TTabSheet
+      Caption = '\83`\83\83\83\93\83l\83\8b'
+      ImageIndex = 4
+      object tvwChannels: TTreeView
+        Left = 8
+        Top = 8
+        Width = 153
+        Height = 265
+        HideSelection = False
+        Images = frmSender.imgIcon
+        Indent = 19
+        ReadOnly = True
+        ShowRoot = False
+        TabOrder = 0
+        OnChange = tvwChannelsChange
+        OnCompare = tvwChannelsCompare
+      end
+      object rgpUseChannelPrefs: TRadioGroup
+        Left = 168
+        Top = 64
+        Width = 177
+        Height = 65
+        Hint = '\82±\82Ì\83`\83\83\83\93\83l\83\8b\82Å\8cÂ\95Ê\90Ý\92è\82ð\8ds\82¤'
+        Caption = '\83`\83\83\83\93\83l\83\8b\8cÂ\95Ê\90Ý\92è'
+        ItemIndex = 1
+        Items.Strings = (
+          '\8eg\97p\82·\82é'
+          '\8eg\97p\82µ\82È\82¢')
+        TabOrder = 1
+        OnClick = rgpUseChannelPrefsClick
+      end
+      object pnlChannelOpt: TPanel
+        Left = 168
+        Top = 136
+        Width = 177
+        Height = 137
+        BevelOuter = bvNone
+        TabOrder = 2
+        object edtSoundFile: TEllipsesEdit
+          Left = 16
+          Top = 104
+          Width = 161
+          Height = 20
+          Hint = '\89¹\90º\83t\83@\83C\83\8b\96¼'
+          Color = clWhite
+          DeactiveColor = clWindow
+          EditStyle = esAlwaysEllipses
+          TabOrder = 0
+          OnButtonClick = edtSoundFileButtonClick
+          OnChange = edtSoundFileChange
+        end
+        object cbxSoundArrived: TCheckBox
+          Left = 0
+          Top = 88
+          Width = 177
+          Height = 17
+          Hint = 
+            'Bottle\93\9e\92\85\8e\9e\82É\82¨\92m\82ç\82¹\89¹\82ð\96Â\82ç\82·\81B\8aD\90F\95\\8e¦\82Í\81u\83f\83t\83H\83\8b\83g\90Ý\92è\82É\8f]' +
+            '\82¤\81v'
+          AllowGrayed = True
+          Caption = '\8eó\90M\8e\9e\82É\89¹\82ð\96Â\82ç\82·'
+          TabOrder = 1
+          OnClick = cbxSoundArrivedClick
+        end
+        object rgpTargetGhost: TGroupBox
+          Left = 0
+          Top = 8
+          Width = 177
+          Height = 65
+          Caption = '\91\97\90M\90æ\83S\81[\83X\83g'
+          TabOrder = 2
+          object cbxIgnoreIfGhost: TCheckBox
+            Left = 8
+            Top = 40
+            Width = 145
+            Height = 17
+            Hint = 
+              'IfGhost\82Â\82«\82Å\91\97\82ç\82ê\82Ä\82«\82½\83S\81[\83X\83g\82à\81A\8fã\8bL\82Ì\91\97\90M\90æ\83S\81[\83X\83g\82É\8b­\90§' +
+              '\93I\82É\91\97\90M'
+            Caption = 'IfGhost\82Ì\8ew\92è\82ð\96³\8e\8b'
+            TabOrder = 0
+            OnClick = cbxIgnoreIfGhostClick
+          end
+          object cbxTargetGhost: TComboBox
+            Left = 8
+            Top = 16
+            Width = 161
+            Height = 20
+            Hint = '\91\97\90M\90æ\82Ì\83S\81[\83X\83g\82ð\8ew\92è'
+            ItemHeight = 12
+            TabOrder = 1
+            OnChange = cbxTargetGhostChange
+          end
+        end
+      end
+      object cbxCanAutoAdd: TCheckBox
+        Left = 168
+        Top = 8
+        Width = 177
+        Height = 17
+        Hint = '\8bN\93®\8e\9e\82É\82±\82Ì\83`\83\83\83\93\83l\83\8b\82É\8e©\93®\8eQ\89Á\82·\82é'
+        Caption = '\8e©\93®\8eQ\89Á\82Ì\91Î\8fÛ'
+        TabOrder = 3
+        OnClick = cbxCanAutoAddClick
+      end
+      object cbxWarnPost: TCheckBox
+        Left = 168
+        Top = 32
+        Width = 177
+        Height = 17
+        Caption = '\93\8a\8de\91O\82É\8am\94F\82·\82é'
+        TabOrder = 4
+        OnClick = cbxWarnPostClick
+      end
+    end
+    object TabSheet1: TTabSheet
+      Caption = 'Proxy'
+      ImageIndex = 5
+      object Label6: TLabel
+        Left = 8
+        Top = 24
+        Width = 263
+        Height = 12
+        Caption = '\81¦\95Ï\8dX\82Í\8e\9f\89ñ\8bN\93®\8e\9e/\8e\9f\89ñ\8dÄ\90Ú\91±\8e\9e\82©\82ç\97L\8cø\82Å\82·\81B'
+        Font.Charset = SHIFTJIS_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+        Font.Style = []
+        ParentFont = False
+      end
+      object grpProxy: TGroupBox
+        Left = 16
+        Top = 80
+        Width = 321
+        Height = 97
+        Caption = 'HTTP Proxy\90Ý\92è'
+        TabOrder = 0
+        object lblProxyAddress: TLabel
+          Left = 16
+          Top = 28
+          Width = 40
+          Height = 12
+          Caption = '\83A\83h\83\8c\83X'
+        end
+        object lblProxyPort: TLabel
+          Left = 16
+          Top = 60
+          Width = 31
+          Height = 12
+          Caption = '\83|\81[\83g'
+        end
+        object edtProxyAddress: TEdit
+          Left = 64
+          Top = 24
+          Width = 225
+          Height = 20
+          Hint = 'Proxy\83T\81[\83o\82Ì\83A\83h\83\8c\83X'
+          TabOrder = 0
+        end
+        object edtProxyPort: TEdit
+          Left = 64
+          Top = 56
+          Width = 81
+          Height = 20
+          Hint = 'Proxy\83T\81[\83o\82Ì\83|\81[\83g\94Ô\8d\86'
+          TabOrder = 1
+          OnKeyPress = edtProxyPortKeyPress
+        end
+      end
+      object cbxUseHttpProxy: TCheckBox
+        Left = 16
+        Top = 56
+        Width = 153
+        Height = 17
+        Hint = 'HTTP Proxy\82ð\92Ê\82\82Ä\83{\83g\83\8b\83T\81[\83o\82É\90Ú\91±\82µ\82Ü\82·'
+        Caption = 'HTTP Proxy\82ð\8eg\97p\82·\82é'
+        TabOrder = 1
+      end
+    end
+  end
+  object btnClose: TButton
+    Left = 291
+    Top = 319
+    Width = 75
+    Height = 25
+    Anchors = [akRight, akBottom]
+    Caption = '\95Â\82\82é'
+    Default = True
+    ModalResult = 1
+    TabOrder = 1
+  end
+  object ColorDialog: TColorDialog
+    Ctl3D = True
+    Left = 12
+    Top = 319
+  end
+  object OpenDialog: TOpenDialog
+    Filter = 'Sound File (*.wav)|*.wav|All Files (*.*)|*.*'
+    Left = 48
+    Top = 320
+  end
+end
diff --git a/bottleclient/SettingForm.pas b/bottleclient/SettingForm.pas
new file mode 100755 (executable)
index 0000000..d81be0a
--- /dev/null
@@ -0,0 +1,383 @@
+unit SettingForm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  ComCtrls, StdCtrls, ExtCtrls, ColorCBX, BottleDef, EllipsEd, Spin;
+
+type
+  TfrmSetting = class(TForm)
+    PageControl: TPageControl;
+    btnClose: TButton;
+    tstGeneral: TTabSheet;
+    tstColor: TTabSheet;
+    tstKeys: TTabSheet;
+    rgpWhenReturn: TRadioGroup;
+    rgpWhenShiftReturn: TRadioGroup;
+    rgpWhenCtrlReturn: TRadioGroup;
+    memDefaultScript: TMemo;
+    lblDefaultScript: TLabel;
+    grpLocalConfirm: TGroupBox;
+    ColorDialog: TColorDialog;
+    cbxColorScript: TCheckBox;
+    trkColorTimeLag: TTrackBar;
+    trkColorSpeed: TTrackBar;
+    grpColor: TGroupBox;
+    colTalkColorU: TColorCBox;
+    colMetaWordColor: TColorCBox;
+    Label4: TLabel;
+    Label2: TLabel;
+    Label1: TLabel;
+    colTalkColorH: TColorCBox;
+    Label3: TLabel;
+    colMarkUpColor: TColorCBox;
+    Label5: TLabel;
+    colMarkErrorColor: TColorCBox;
+    cbxIgnoreTimeCritical: TCheckBox;
+    lblColorTimeLag: TLabel;
+    lblColorSpeed: TLabel;
+    colBgColor: TColorCBox;
+    Label8: TLabel;
+    tstReceive: TTabSheet;
+    cbxNoDescript: TCheckBox;
+    cbxNoTranslate: TCheckBox;
+    cbxPort: TComboBox;
+    Label9: TLabel;
+    cbxSilentWhenHidden: TCheckBox;
+    cbxAutoStart: TCheckBox;
+    tstChannel: TTabSheet;
+    tvwChannels: TTreeView;
+    rgpUseChannelPrefs: TRadioGroup;
+    pnlChannelOpt: TPanel;
+    edtSoundFile: TEllipsesEdit;
+    cbxSoundArrived: TCheckBox;
+    rgpTargetGhost: TGroupBox;
+    cbxIgnoreIfGhost: TCheckBox;
+    cbxTargetGhost: TComboBox;
+    cbxUsePort: TCheckBox;
+    rgpTabPosition: TRadioGroup;
+    cbxCanAutoAdd: TCheckBox;
+    OpenDialog: TOpenDialog;
+    cbxNoTransUrl: TCheckBox;
+    spnWaitScriptEnd: TSpinEdit;
+    lblWaitScriptEnd: TLabel;
+    cbxNoSendGhostList: TCheckBox;
+    TabSheet1: TTabSheet;
+    grpProxy: TGroupBox;
+    cbxUseHttpProxy: TCheckBox;
+    edtProxyAddress: TEdit;
+    edtProxyPort: TEdit;
+    lblProxyAddress: TLabel;
+    lblProxyPort: TLabel;
+    Label6: TLabel;
+    cbxWarnPost: TCheckBox;
+    cbxConfirmOnExit: TCheckBox;
+    procedure ColorPick(Sender: TObject; var Col: TColor);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure cbxPortChange(Sender: TObject);
+    procedure edtSoundFileButtonClick(Sender: TObject);
+    procedure tvwChannelsCompare(Sender: TObject; Node1, Node2: TTreeNode;
+      Data: Integer; var Compare: Integer);
+    procedure tvwChannelsChange(Sender: TObject; Node: TTreeNode);
+    procedure rgpUseChannelPrefsClick(Sender: TObject);
+    procedure cbxSoundArrivedClick(Sender: TObject);
+    procedure edtSoundFileChange(Sender: TObject);
+    procedure cbxTargetGhostChange(Sender: TObject);
+    procedure cbxIgnoreIfGhostClick(Sender: TObject);
+    procedure cbxUsePortClick(Sender: TObject);
+    procedure cbxCanAutoAddClick(Sender: TObject);
+    procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
+    procedure cbxWarnPostClick(Sender: TObject);
+  private
+    { Private \90é\8c¾ }
+    function SelChPref: TChannelPrefs;
+    function BottleImage(ChPref: TChannelPrefs): integer;
+  public
+    { Public \90é\8c¾ }
+    procedure Execute;
+  end;
+
+var
+  frmSetting: TfrmSetting;
+
+const
+  DefaultNode = -1;
+  ChannelDefaultGhost = '(\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)';
+  CheckedBottle = 22;
+  UnCheckedBottle = 17;
+
+implementation
+
+{$R *.DFM}
+
+uses MainForm;
+
+procedure TfrmSetting.ColorPick(Sender: TObject; var Col: TColor);
+begin
+  ColorDialog.Color := Col;
+  if ColorDialog.Execute then begin
+    Col := ColorDialog.Color;
+  end;
+end;
+
+procedure TfrmSetting.Execute;
+var i: integer;
+    Node: TTreeNode;
+begin
+  PageControl.ActivePage := tstGeneral;
+  memDefaultScript.Text := Pref.DefaultScript;
+  cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
+  cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
+  cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
+  //
+  cbxColorScript.Checked := Pref.ColorScript;
+  colTalkColorH.SelColor := Pref.TalkColorH;
+  colTalkColorU.SelColor := Pref.TalkColorU;
+  colMarkUpColor.SelColor := Pref.MarkUpColor;
+  colMetaWordColor.SelColor := Pref.MetaWordColor;
+  colMarkErrorColor.SelColor := Pref.MarkErrorColor;
+  colBgColor.SelColor := Pref.BgColor;
+  trkColorTimeLag.Position := Pref.ColorTimeLagValue;
+  trkColorSpeed.Position := Pref.ColorSpeed;
+  //
+  cbxAutoStart.Checked := Pref.AutoStart;
+  rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
+  cbxNoTranslate.Checked := Pref.NoTranslate;
+  cbxNoDescript.Checked := Pref.NoDescript;
+  cbxNoTransUrl.Checked := Pref.NoTransUrl;
+  //cbxIgnoreFrequentYenS.Checked := Pref.IgnoreFrequentYenS;
+  spnWaitScriptEnd.Value := Pref.WaitScriptEnd;
+  //
+  rgpWhenReturn.ItemIndex := Ord(Pref.WhenReturn);
+  rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
+  rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
+  //
+  cbxPort.ItemIndex := cbxPort.Items.Count-1; //\81u\82»\82Ì\91¼\81v
+  for i := 0 to cbxPort.Items.Count-2 do begin
+    if StrToIntDef(cbxPort.Items[i], 0) = Pref.ServerPort then
+      cbxPort.ItemIndex := i;
+  end;
+  cbxUsePort.Checked := Pref.UsePort;
+  cbxPort.Enabled := cbxUsePort.Checked;
+  cbxUsePort.OnClick := cbxUsePortClick; //Dialog\8aJ\82¢\82½\8fu\8aÔ\82É\8cx\8d\90\82³\82ê\82È\82¢\82æ\82¤
+  //
+  cbxSilentWhenHidden.Checked := Pref.SilentWhenHidden;
+  //
+  //Channels
+  tvwChannels.Items.Clear;
+  Node := tvwChannels.Items.Add(nil, '\83f\83t\83H\83\8b\83g');
+  Node.ImageIndex := 1;
+  Node.SelectedIndex := 1;
+  Node.Data := pointer(DefaultNode);
+  for i := 0 to Pref.ChannelPrefCount-1 do begin
+    Node := tvwChannels.Items.Add(nil, Pref.ChannelPrefIndex[i].ChannelName);
+    Node.Data := pointer(i); //\96{\93\96\82Í\82â\82Á\82¿\82á\82¢\82¯\82È\82¢Int>Pointer\83L\83\83\83X\83g
+    Node.ImageIndex := BottleImage(Pref.ChannelPrefIndex[i]);
+    Node.SelectedIndex := BottleImage(Pref.ChannelPrefIndex[i]);
+  end;
+  cbxTargetGhost.Items.Clear;
+  cbxTargetGhost.Items.Add(ChannelDefaultGhost);
+  frmSender.SakuraSeeker.BeginDetect;
+  for i := 0 to frmSender.SakuraSeeker.Count-1 do begin
+    cbxTargetGhost.Items.Add(frmSender.SakuraSeeker[i].Name);
+  end;
+  rgpUseChannelPrefs.Enabled := false;
+  rgpUseChannelPrefsClick(Self);
+  //
+  cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
+  edtProxyAddress.Text := Pref.ProxyAddress;
+  edtProxyPort.Text := IntToStr(Pref.ProxyPort);
+  ShowModal;
+end;
+
+procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+  Pref.DefaultScript := memDefaultScript.Text;
+  Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
+  Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
+  Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
+  //
+  Pref.ColorScript := cbxColorScript.Checked;
+  Pref.TalkColorH := colTalkColorH.SelColor;
+  Pref.TalkColorU := colTalkColorU.SelColor;
+  Pref.MarkUpColor := colMarkUpColor.SelColor;
+  Pref.MetaWordColor := colMetaWordColor.SelColor;
+  Pref.MarkErrorColor := colMarkErrorColor.SelColor;
+  Pref.BgColor := colBgColor.SelColor;
+  Pref.ColorTimeLagValue := trkColorTimeLag.Position;
+  Pref.ColorSpeed := trkColorSpeed.Position;
+  //
+  Pref.AutoStart := cbxAutoStart.Checked;
+  Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
+  Pref.NoTranslate := cbxNoTranslate.Checked;
+  Pref.NoDescript := cbxNoDescript.Checked;
+  Pref.NoTransUrl := cbxNoTransUrl.Checked;
+  //Pref.IgnoreFrequentYenS := cbxIgnoreFrequentYenS.Checked;
+  Pref.WaitScriptEnd := spnWaitScriptEnd.Value;
+  Pref.SilentWhenHidden := cbxSilentWhenHidden.Checked;
+  //
+  Pref.WhenReturn := TReturnKeyFunction(rgpWhenReturn.ItemIndex);
+  Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
+  Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
+  //
+  Pref.UsePort := cbxUsePort.Checked;
+  //
+  Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
+  Pref.ProxyAddress := edtProxyAddress.Text;
+  Pref.ProxyPort := StrToInt(edtProxyPort.Text);
+end;
+
+procedure TfrmSetting.cbxPortChange(Sender: TObject);
+var Str: String;
+    i: integer;
+begin
+  with cbxPort do begin
+    if ItemIndex = Items.Count-1 then begin
+      //\82»\82Ì\91¼
+      Str := IntToStr(Pref.ServerPort);
+      if InputQuery('\83|\81[\83g\94Ô\8d\86\82Ì\8ew\92è', '\83|\81[\83g\94Ô\8d\86', Str) then begin
+        Pref.ServerPort := StrToIntDef(Str, Pref.ServerPort);
+      end;
+    end else begin
+      Pref.ServerPort := StrToIntDef(Items[ItemIndex], Pref.ServerPort);
+    end;
+    for i := 0 to Items.Count-2 do begin
+      if Pref.ServerPort = StrToInt(Items[i]) then ItemIndex := i;
+    end;
+  end;
+end;
+
+procedure TfrmSetting.edtSoundFileButtonClick(Sender: TObject);
+begin
+  if OpenDialog.Execute then begin
+    edtSoundFile.Text := OpenDialog.FileName;
+  end;
+end;
+
+procedure TfrmSetting.tvwChannelsCompare(Sender: TObject; Node1,
+  Node2: TTreeNode; Data: Integer; var Compare: Integer);
+begin
+  if Node1.Text = '\83f\83t\83H\83\8b\83g' then
+    Compare := -1
+  else if Node2.Text = '\83f\83t\83H\83\8b\83g' then
+    Compare := 1
+  else
+    Compare := AnsiCompareStr(Node1.Text, Node2.Text);
+end;
+
+procedure TfrmSetting.tvwChannelsChange(Sender: TObject; Node: TTreeNode);
+var ChPref: TChannelPrefs;
+begin
+  rgpUseChannelPrefs.Enabled := true;
+  if integer(Node.Data) = DefaultNode then begin
+    ChPref := Pref.DefChannelPref;
+    cbxCanAutoAdd.Enabled := false;
+    cbxWarnPost.Enabled := false;
+    rgpUseChannelPrefs.Enabled := false;
+    cbxSoundArrived.AllowGrayed := false;
+  end else begin
+    ChPref := Pref.ChannelPrefIndex[integer(Node.Data)];
+    cbxCanAutoAdd.Enabled := true;
+    cbxWarnPost.Enabled := true;
+    rgpUseChannelPrefs.Enabled := true;
+    cbxSoundArrived.AllowGrayed := true;
+  end;
+  cbxCanAutoAdd.Checked := ChPref.CanAutoAdd;
+  cbxWarnPost.Checked := ChPref.WarnPost;
+  if ChPref.UseChannelPrefs then begin
+    rgpUseChannelPrefs.ItemIndex := 0;
+  end else begin
+    rgpUseChannelPrefs.ItemIndex := 1;
+  end;
+  cbxSoundArrived.State := TCheckBoxState(ChPref.SoundArrived);
+  edtSoundFile.Text := ChPref.SoundFile;
+  cbxIgnoreIfGhost.Checked := ChPref.IgnoreIfGhost;
+  if ChPref.TargetGhost <> '' then
+    cbxTargetGhost.Text := ChPref.TargetGhost
+  else
+    cbxTargetGhost.Text := ChannelDefaultGhost;
+end;
+
+procedure TfrmSetting.rgpUseChannelPrefsClick(Sender: TObject);
+begin
+  pnlChannelOpt.Visible := ((rgpUseChannelPrefs.ItemIndex = 0) and
+                            (tvwChannels.Selected <> nil));
+  if SelChPref <> nil then begin
+    SelChPref.UseChannelPrefs := (rgpUseChannelPrefs.ItemIndex = 0);
+    tvwChannels.Selected.ImageIndex := BottleImage(SelChPref);
+    tvwChannels.Selected.SelectedIndex := BottleImage(SelChPref);
+  end;
+end;
+
+function TfrmSetting.BottleImage(ChPref: TChannelPrefs): integer;
+begin
+  if ChPref = Pref.DefChannelPref then Result := 1
+  else if ChPref.UseChannelPrefs then Result := CheckedBottle
+  else Result := UnCheckedBottle;
+end;
+
+function TfrmSetting.SelChPref: TChannelPrefs;
+begin
+  if tvwChannels.Selected = nil then begin
+    Result := nil;
+    Exit;
+  end else if integer(tvwChannels.Selected.Data) = DefaultNode then begin
+    Result := Pref.DefChannelPref;
+  end else begin
+    Result := Pref.ChannelPrefIndex[integer(tvwChannels.Selected.Data)];
+  end;
+end;
+
+procedure TfrmSetting.cbxSoundArrivedClick(Sender: TObject);
+begin
+  SelChPref.SoundArrived := TSoundArrived(cbxSoundArrived.State);
+end;
+
+procedure TfrmSetting.edtSoundFileChange(Sender: TObject);
+begin
+  SelChPref.SoundFile := edtSoundFile.Text;
+end;
+
+procedure TfrmSetting.cbxTargetGhostChange(Sender: TObject);
+begin
+  if cbxTargetGhost.ItemIndex = 0 then
+    SelChPref.TargetGhost := ''
+  else
+    SelChPref.TargetGhost := cbxTargetGhost.Text;
+end;
+
+procedure TfrmSetting.cbxIgnoreIfGhostClick(Sender: TObject);
+begin
+  SelChPref.IgnoreIfGhost := cbxIgnoreIfGhost.Checked;
+end;
+
+procedure TfrmSetting.cbxUsePortClick(Sender: TObject);
+var Re: integer;
+const Mes = '\8f]\97\88\82Ì\95û\96@\82ð\91I\91ð\82µ\82½\8fê\8d\87\81ASSTP\82ð\8eó\90M\82Å\82«\82é\83S\81[\83X\83g\82Í'+
+            '\83\89\83\93\83_\83\80\82È\88ê\91Ì\82¾\82¯\82Æ\82È\82è\81AIfGhost\82ª\88ê\90Ø\8eg\97p\82Å\82«\82È\82­\82È\82è\82Ü\82·\81B';
+begin
+  if cbxUsePort.Checked then begin
+    Re := MessageDlg(Mes, mtWarning, mbOkCancel, 0);
+    if Re = mrCancel then cbxUsePort.Checked := false;
+  end;
+  cbxPort.Enabled := cbxUsePort.Checked;
+  Pref.UsePort := cbxUsePort.Checked;
+end;
+
+procedure TfrmSetting.cbxCanAutoAddClick(Sender: TObject);
+begin
+  SelChPref.CanAutoAdd := cbxCanAutoAdd.Checked;
+end;
+
+procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
+begin
+  if not(Key in ['0'..'9']) then Key := Char(0);
+end;
+
+procedure TfrmSetting.cbxWarnPostClick(Sender: TObject);
+begin
+  SelChPref.WarnPost := cbxWarnPost.Checked;
+end;
+
+end.
diff --git a/bottleclient/SstpBottle.cfg b/bottleclient/SstpBottle.cfg
new file mode 100755 (executable)
index 0000000..6e574da
--- /dev/null
@@ -0,0 +1,41 @@
+-$A+
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y+
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"../out"
+-N"../dcu"
+-LE"c:\program files\borland\delphi5\Projects\Bpl"
+-LN"c:\program files\borland\delphi5\Projects\Bpl"
+-U"c:\program files\borland\delphi5\Lib\Debug;c:\program files\borland\delphi5\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;c:\program files\borland\delphi5\Source\MenuBar;c:\program files\borland\delphi5\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;c:\program files\borland\delphi5\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10"
+-O"c:\program files\borland\delphi5\Lib\Debug;c:\program files\borland\delphi5\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;c:\program files\borland\delphi5\Source\MenuBar;c:\program files\borland\delphi5\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;c:\program files\borland\delphi5\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10"
+-I"c:\program files\borland\delphi5\Lib\Debug;c:\program files\borland\delphi5\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;c:\program files\borland\delphi5\Source\MenuBar;c:\program files\borland\delphi5\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;c:\program files\borland\delphi5\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10"
+-R"c:\program files\borland\delphi5\Lib\Debug;c:\program files\borland\delphi5\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;c:\program files\borland\delphi5\Source\MenuBar;c:\program files\borland\delphi5\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;c:\program files\borland\delphi5\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10"
diff --git a/bottleclient/SstpBottle.dof b/bottleclient/SstpBottle.dof
new file mode 100755 (executable)
index 0000000..ffef6a1
--- /dev/null
@@ -0,0 +1,102 @@
+[Compiler]
+A=1
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=2
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=../out
+UnitOutputDir=../dcu
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=$(DELPHI)\Lib\Debug;$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;$(DELPHI)\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10
+Packages=Vcl50;Vclx50;VclSmp50;Qrpt50;Vcldb50;Vclbde50;ibevnt50;vcldbx50;TeeUI50;TeeDB50;Tee50;TeeQR50;VCLIB50;vclie50;Inetdb50;Inet50;NMFast50;dclocx50;dclaxserver50;QuadrupleD;DragDropD5;PenDialog;colbox
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+[Language]
+ActiveLang=
+ProjectLang=$00000411
+RootDir=
+[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\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=9
+Item0=$(DELPHI)\Lib\Debug;$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;$(DELPHI)\Source\epsed100;C:\Documents and Settings\naruto\My Documents\dpr\dpk Slpp10
+Item1=$(DELPHI)\Lib\Debug;$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;$(DELPHI)\Source\epsed100
+Item2=$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;$(DELPHI)\Source\epsed100
+Item3=$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker;$(DELPHI)\Source\Eledt101
+Item4=$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SakuraSeeker
+Item5=$(DELPHI)\Source\Colbox11;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray
+Item6=$(DELPHI)\Source\ColorCBX;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar;$(DELPHI)\Source\TaskTray
+Item7=$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp;$(DELPHI)\Source\MenuBar
+Item8=$(DELPHI)\Source\TaskTray;C:\Documents and Settings\naruto\My Documents\dpr\dpk SsParser;C:\Documents and Settings\naruto\My Documents\dpr\dpk FastSstp
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=../dcu
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=../out
diff --git a/bottleclient/SstpBottle.dpr b/bottleclient/SstpBottle.dpr
new file mode 100755 (executable)
index 0000000..ed50367
--- /dev/null
@@ -0,0 +1,49 @@
+{*******************************************************}
+{                                                       }
+{       SSTP Bottle Client                              }
+{                                                       }
+{       Copyright (C) 2001-2002 \82È\82é(naruto)            }
+{                                                       }
+{*******************************************************}
+
+program SstpBottle;
+
+{%ToDo 'SstpBottle.todo'}
+
+uses
+  Forms,
+  MainForm in 'MainForm.pas' {frmSender},
+  BRegExp in 'BRegExp.pas',
+  BottleDef in 'BottleDef.pas',
+  ConstEditor in 'ConstEditor.pas' {frmConstEditor},
+  ConstList in 'ConstList.pas',
+  ConstText in 'ConstText.pas' {frmConstText},
+  SendConfirm in 'SendConfirm.pas' {frmConfirmSend},
+  SettingForm in 'SettingForm.pas' {frmSetting},
+  LogForm in 'LogForm.pas' {frmLog},
+  HeadValue in 'HeadValue.pas',
+  ChannelListForm in 'ChannelListForm.pas' {frmChannelList},
+  Sakura in '..\dpk SakuraSeeker\Sakura.pas',
+  MessageBox in 'MessageBox.pas' {frmMessageBox},
+  Slpp20 in '..\dpk Slpp10\Slpp20.pas',
+  Logs in 'Logs.pas';
+
+{$R *.RES}
+{$DEFINE Mani}
+{$IFDEF Manifest}
+{$R manifest.RES}
+{$ENDIF}
+
+begin
+  Application.Initialize;
+  Application.Title := 'SSTP Bottle Client';
+  Application.ShowMainForm := true;
+  Application.CreateForm(TfrmSender, frmSender);
+  Application.CreateForm(TfrmConstEditor, frmConstEditor);
+  Application.CreateForm(TfrmConstText, frmConstText);
+  Application.CreateForm(TfrmLog, frmLog);
+  Application.CreateForm(TfrmChannelList, frmChannelList);
+  Application.CreateForm(TfrmMessageBox, frmMessageBox);
+  if not Application.Terminated then frmSender.Show;
+  Application.Run;
+end.
diff --git a/bottleclient/SstpBottle.res b/bottleclient/SstpBottle.res
new file mode 100755 (executable)
index 0000000..c3aaf2c
Binary files /dev/null and b/bottleclient/SstpBottle.res differ
diff --git a/bottleclient/SstpBottle.todo b/bottleclient/SstpBottle.todo
new file mode 100755 (executable)
index 0000000..0519ecb
--- /dev/null
@@ -0,0 +1 @@
\ No newline at end of file