From 9e035dc744bb3b59f5ffc32f402e9c69a1e7723f Mon Sep 17 00:00:00 2001 From: Christian Hammacher Date: Fri, 26 Aug 2005 18:29:39 +0000 Subject: [PATCH] Added AMXX-Studio to CVS --- editor/studio/SciSearchReplace.pas | 351 + editor/studio/UnitCodeExplorerUpdater.pas | 321 + editor/studio/UnitCodeInspector.pas | 417 ++ editor/studio/UnitCodeSnippets.pas | 92 + editor/studio/UnitCodeUtils.pas | 431 ++ editor/studio/UnitCompile.pas | 300 + editor/studio/UnitLanguages.pas | 164 + editor/studio/UnitMainTools.pas | 1196 ++++ editor/studio/UnitMenuGenerators.pas | 548 ++ editor/studio/UnitPlugins.pas | 883 +++ editor/studio/UnitReadThread.pas | 58 + editor/studio/UnitTextAnalyze.pas | 404 ++ editor/studio/UnitfrmAllFilesForm.dfm | Bin 0 -> 970 bytes editor/studio/UnitfrmAllFilesForm.pas | 31 + editor/studio/UnitfrmAutoIndent.dfm | Bin 0 -> 936 bytes editor/studio/UnitfrmAutoIndent.pas | 24 + editor/studio/UnitfrmClose.dfm | Bin 0 -> 980 bytes editor/studio/UnitfrmClose.pas | 61 + editor/studio/UnitfrmConnGen.dfm | Bin 0 -> 1886 bytes editor/studio/UnitfrmConnGen.pas | 40 + editor/studio/UnitfrmGoToLine.dfm | Bin 0 -> 1106 bytes editor/studio/UnitfrmGoToLine.pas | 51 + editor/studio/UnitfrmHTMLPreview.dfm | Bin 0 -> 667 bytes editor/studio/UnitfrmHTMLPreview.pas | 73 + editor/studio/UnitfrmHudMsgGenerator.dfm | 7437 ++++++++++++++++++++ editor/studio/UnitfrmHudMsgGenerator.pas | 273 + editor/studio/UnitfrmInfo.dfm | Bin 0 -> 273886 bytes editor/studio/UnitfrmInfo.pas | 56 + editor/studio/UnitfrmMOTDGen.dfm | Bin 0 -> 1128 bytes editor/studio/UnitfrmMOTDGen.pas | 30 + editor/studio/UnitfrmMain.dfm | 7741 +++++++++++++++++++++ editor/studio/UnitfrmMain.pas | 2652 +++++++ editor/studio/UnitfrmMenuGenerator.dfm | Bin 0 -> 24830 bytes editor/studio/UnitfrmMenuGenerator.pas | 295 + editor/studio/UnitfrmPluginsIniEditor.dfm | Bin 0 -> 1711 bytes editor/studio/UnitfrmPluginsIniEditor.pas | 160 + editor/studio/UnitfrmReplace.dfm | Bin 0 -> 2617 bytes editor/studio/UnitfrmReplace.pas | 78 + editor/studio/UnitfrmSearch.dfm | Bin 0 -> 2354 bytes editor/studio/UnitfrmSearch.pas | 81 + editor/studio/UnitfrmSelectColor.dfm | Bin 0 -> 3544 bytes editor/studio/UnitfrmSelectColor.pas | 265 + editor/studio/UnitfrmSettings.dfm | 1806 +++++ editor/studio/UnitfrmSettings.pas | 949 +++ editor/studio/UnitfrmSocketsTerminal.dfm | 189 + editor/studio/UnitfrmSocketsTerminal.pas | 259 + editor/studio/UnitfrmSplashscreen.dfm | Bin 0 -> 225766 bytes editor/studio/UnitfrmSplashscreen.pas | 173 + editor/studio/UnitfrmTextAnalyze.~pa | 198 + 49 files changed, 28087 insertions(+) create mode 100755 editor/studio/SciSearchReplace.pas create mode 100755 editor/studio/UnitCodeExplorerUpdater.pas create mode 100755 editor/studio/UnitCodeInspector.pas create mode 100755 editor/studio/UnitCodeSnippets.pas create mode 100755 editor/studio/UnitCodeUtils.pas create mode 100755 editor/studio/UnitCompile.pas create mode 100755 editor/studio/UnitLanguages.pas create mode 100755 editor/studio/UnitMainTools.pas create mode 100755 editor/studio/UnitMenuGenerators.pas create mode 100755 editor/studio/UnitPlugins.pas create mode 100755 editor/studio/UnitReadThread.pas create mode 100755 editor/studio/UnitTextAnalyze.pas create mode 100755 editor/studio/UnitfrmAllFilesForm.dfm create mode 100755 editor/studio/UnitfrmAllFilesForm.pas create mode 100755 editor/studio/UnitfrmAutoIndent.dfm create mode 100755 editor/studio/UnitfrmAutoIndent.pas create mode 100755 editor/studio/UnitfrmClose.dfm create mode 100755 editor/studio/UnitfrmClose.pas create mode 100755 editor/studio/UnitfrmConnGen.dfm create mode 100755 editor/studio/UnitfrmConnGen.pas create mode 100755 editor/studio/UnitfrmGoToLine.dfm create mode 100755 editor/studio/UnitfrmGoToLine.pas create mode 100755 editor/studio/UnitfrmHTMLPreview.dfm create mode 100755 editor/studio/UnitfrmHTMLPreview.pas create mode 100755 editor/studio/UnitfrmHudMsgGenerator.dfm create mode 100755 editor/studio/UnitfrmHudMsgGenerator.pas create mode 100755 editor/studio/UnitfrmInfo.dfm create mode 100755 editor/studio/UnitfrmInfo.pas create mode 100755 editor/studio/UnitfrmMOTDGen.dfm create mode 100755 editor/studio/UnitfrmMOTDGen.pas create mode 100755 editor/studio/UnitfrmMain.dfm create mode 100755 editor/studio/UnitfrmMain.pas create mode 100755 editor/studio/UnitfrmMenuGenerator.dfm create mode 100755 editor/studio/UnitfrmMenuGenerator.pas create mode 100755 editor/studio/UnitfrmPluginsIniEditor.dfm create mode 100755 editor/studio/UnitfrmPluginsIniEditor.pas create mode 100755 editor/studio/UnitfrmReplace.dfm create mode 100755 editor/studio/UnitfrmReplace.pas create mode 100755 editor/studio/UnitfrmSearch.dfm create mode 100755 editor/studio/UnitfrmSearch.pas create mode 100755 editor/studio/UnitfrmSelectColor.dfm create mode 100755 editor/studio/UnitfrmSelectColor.pas create mode 100755 editor/studio/UnitfrmSettings.dfm create mode 100755 editor/studio/UnitfrmSettings.pas create mode 100755 editor/studio/UnitfrmSocketsTerminal.dfm create mode 100755 editor/studio/UnitfrmSocketsTerminal.pas create mode 100755 editor/studio/UnitfrmSplashscreen.dfm create mode 100755 editor/studio/UnitfrmSplashscreen.pas create mode 100755 editor/studio/UnitfrmTextAnalyze.~pa diff --git a/editor/studio/SciSearchReplace.pas b/editor/studio/SciSearchReplace.pas new file mode 100755 index 00000000..1c2fe418 --- /dev/null +++ b/editor/studio/SciSearchReplace.pas @@ -0,0 +1,351 @@ +//CE_Desc_Include(helpdescriptions.txt) +{$Include SciCommonDef.Inc} +unit SciSearchReplace; +{ + Unit : SciSearchReplace + Purpose : Search and Replace for TScintilla based on Synedit Dialogs + Created : 20/03/2003 + Original Author : Kiriakos Vlahos (kvlahos@london.edu) + History : 29/09/2004 Initial Release with Delphi Scintilla Interface Components + Changed Editor property from TScintilla to TScintillaBase class. + Wasn't any need for the extra properties to use this dialog. + hdalis (hdalis@users.sourceforge.net) + 06/02/2005 Fixed a bug that caused the beginundoaction to be started, + but not finished.. i.e it treated all changes after a replace all + to belonging to the same undo operation.. + hdalis (hdalis@users.sourceforge.net) + 15/02/2005 Somewhat fixed a bug which caused the component to hang when + search/replace for the regular expression '$'.. + it became an endless loop.. + if SelWord is true, we get the word under the caret as the searchword + instead of the need to select the word first.. If there isn't a word + under the caret, uses the previous searchtext if any.. + hdalis (hdalis@users.sourceforge.net) + 07/29/2005 Fixed "Search from caret"-bug +} + +interface +Uses + Types, Classes, Controls, Forms, SciLexer; + +Type + + TSciSearchReplace = class(TComponent) + private + FSearchForSelWord : boolean; + FEditor : TScintillaBase; + FSearchFromCaretInt: boolean; + FFoundText : String; + FOnTextFound : TNotifyEvent; + FOnTextNotFound : TNotifyEvent; + FOnTextReplaced : TNotifyEvent; + protected + procedure Notification(AComponent: TComponent; + Operation: TOperation); override; + public + // Search Options + SearchBackwards: boolean; + SearchCaseSensitive: boolean; + SearchSelectionOnly: boolean; + SearchWholeWords: boolean; + SearchRegex: boolean; + SearchText: string; + SearchTextHistory: string; + ReplaceText: string; + ReplaceTextHistory: string; + ReplacedCount : Integer; + + property FoundText : string read fFoundText; + procedure DoSearchReplaceText(AReplace, ABackwards: boolean); + procedure ShowSearchReplaceDialog(AReplace: boolean); + constructor Create(AOwner : TComponent);override; + published + property SearchForSelWord : boolean read FSearchForSelWord write FSearchForSelWord; + property SearchFromCaret: boolean read FSearchFromCaretInt write FSearchFromCaretInt; + property Editor : TScintillaBase read FEditor write FEditor; + property OnTextFound : TNotifyEvent read FOnTextFound write FOnTextFound; + property OnTextNotFound : TNotifyEvent read FOnTextNotFound write FOnTextNotFound; + property OnTextReplaced : TNotifyEvent read FOnTextReplaced write FOnTextReplaced; + end; + +implementation + +Uses + SciSearchTextDlg, SciConfirmReplaceDlg, SciReplaceTextDlg, SciSupport,sciUtils; + +{ TSciSearchReplace } +constructor TSciSearchReplace.Create(AOwner : TComponent); +begin + ReplacedCount:=0; + SearchFromCaret:=True; + Inherited; +end; + +procedure TSciSearchReplace.DoSearchReplaceText(AReplace, ABackwards: boolean); +var + Options: Integer; + StartPosition, EndPosition : Integer; + TargetStart, TargetEnd, posFind : Integer; + APos: TPoint; + EditRect: TRect; + DlgRes : Integer; + lastMatch,lenTarget,MovePastEOL : Integer; + chNext : Integer; + findLen : Integer; + LenFound, LenReplaced : Integer; +// lastMatch : Integer; + doendundo : Boolean; +begin + doendundo:=false; + if not Assigned(FEditor) then Exit; + Options := 0; + if SearchCaseSensitive then + Options := Options or SCFIND_MATCHCASE; + if SearchWholeWords then + Options := Options or SCFIND_WHOLEWORD; + if SearchRegex then + Options := Options or SCFIND_REGEXP; + if SearchText='' then Exit; + if ABackwards then + begin + if fSearchFromCaretInt and not SearchSelectionOnly then + StartPosition := FEditor.GetSelectionStart - 1 + else if SearchSelectionOnly then + StartPosition := FEditor.GetSelectionEnd + else + StartPosition := FEditor.GetLength; + if SearchSelectionOnly then + EndPosition := FEditor.GetSelectionStart + else + EndPosition := 0; + end else + begin + if fSearchFromCaretInt and not SearchSelectionOnly then + StartPosition := FEditor.GetSelectionEnd + 1 + else if SearchSelectionOnly then + StartPosition := FEditor.GetSelectionStart + else + StartPosition := 0; + if SearchSelectionOnly then + EndPosition := FEditor.GetSelectionEnd + else + EndPosition := FEditor.GetLength; + end; + findLen:=Length(SearchText); + + with FEditor do + begin + SetTargetStart(StartPosition); + SetTargetEnd(EndPosition); + SetSearchFlags(Options); + posFind := SearchInTarget(findLen, PChar(SearchText)); + if (posFind < 0) then + begin + if Assigned(FOnTextNotFound) then + FOnTextNotFound(Self); + end else + begin + lastMatch:=posFind; + TargetStart := GetTargetStart; + TargetEnd := GetTargetEnd; + LenFound := TargetEnd - TargetStart; + LenReplaced := LenFound; + EnsureRangeVisible(TargetStart, TargetEnd); + SetSel(TargetStart, TargetEnd); + FFoundText := FEditor.SelText; + if Assigned(FOnTextFound) then + FOnTextFound(Self); + + // Replace code + if AReplace then + begin + DlgRes := mrYes; + + if ConfirmReplaceDialog = nil then + ConfirmReplaceDialog := TConfirmReplaceDialog.Create(Application); + ReplacedCount:=0; + while (posFind >= 0) and (DlgRes <> mrCancel) do + begin + lenTarget:=GetTargetEnd-GetTargetStart; + movePastEOL:=0; + if lenTarget<=0 then + begin + chNext:=GetCharAt(GetTargetEnd); + if (chNext=10) or (chNext=13) then MovePastEOL:=1; + end; + if not (DlgRes = mrYesToAll) then + begin + APos := Point(PointXFromPosition(TargetStart), PointYFromPosition(TargetStart)); + APos := ClientToScreen(APos); + EditRect := FEditor.ClientRect; + EditRect.TopLeft := ClientToScreen(EditRect.TopLeft); + EditRect.BottomRight := ClientToScreen(EditRect.BottomRight); + + ConfirmReplaceDialog.PrepareShow(EditRect, APos.X, APos.Y, + APos.Y + 2 * FEditor.TextHeight(LineFromPosition(TargetStart)), SearchText); + DlgRes :=ConfirmReplaceDialog.ShowModal; + if (DlgRes = mrYesToAll) and (doendundo=false) then + begin + FEditor.BeginUndoAction; + doendundo:=True; + end; + + end; + + + if DlgRes in [mrYes, mrYesToAll] then + begin + // Replace + if SearchRegex then + LenReplaced := ReplaceTargetRE(Length(ReplaceText), PChar(ReplaceText)) + else + LenReplaced := ReplaceTarget(Length(ReplaceText), PChar(ReplaceText)); + Inc(ReplacedCount); + + lastMatch:=posFind + lenReplaced + movepastEOL; + if lenTarget=0 then + lastMatch:=PositionAfter(lastMatch); + + TargetEnd := TargetStart + LenReplaced -1+movePastEOL; + if Assigned(FOnTextReplaced) then FOnTextReplaced(Self); + end; + if DlgRes in [mrYes, mrNo, mrYesToAll] then + begin + // carry on + if lastMatch>=endPosition then + begin + posFind:=-1; + end else + begin + if ABackwards then + begin + SetTargetStart(TargetStart - 1); + SetTargetEnd(EndPosition); + end else + begin + SetTargetStart(TargetEnd + 1); + EndPosition := EndPosition + LenReplaced - LenFound; + SetTargetEnd(EndPosition); + end; + SetTargetEnd(EndPosition); + SetSearchFlags(Options); + posFind := SearchInTarget(Length(SearchText), PChar(SearchText)); + end; + if posFind >= 0 then + begin + TargetStart := GetTargetStart; + TargetEnd := GetTargetEnd; + lastMatch:=TargetStart; + LenFound := TargetEnd - TargetStart; + LenReplaced := LenFound; + EnsureRangeVisible(TargetStart, TargetEnd); + SetSel(TargetStart, TargetEnd); + end; + end else + break; + end; // While + if doendundo then + FEditor.EndUndoAction; + + // Restore original selection if Searching in Selection + if SearchSelectionOnly then + begin + if ABackwards then + SetSel(EndPosition, StartPosition) + else + SetSel(StartPosition, EndPosition); + EnsureRangeVisible(GetSelectionStart, GetSelectionEnd); + end; + end; // if AReplace + end; //if (posFind < 0) + end; // with FEditor + + if ConfirmReplaceDialog <> nil then + begin + ConfirmReplaceDialog.Free; + ConfirmReplaceDialog := nil; + end; +end; + +procedure TSciSearchReplace.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FEditor) and (Operation = opRemove) then FEditor := nil; +end; + +procedure TSciSearchReplace.ShowSearchReplaceDialog(AReplace: boolean); +var + dlg: TTextSearchDialog; + SelectedText : string; +begin + if not Assigned(FEditor) then Exit; + if AReplace then + dlg := TTextReplaceDialog.Create(Self) + else + dlg := TTextSearchDialog.Create(Self); + with dlg do + try + // assign search options + SearchBackwards := Self.SearchBackwards; + SearchCaseSensitive := Self.SearchCaseSensitive; + SearchFromCursor := Self.SearchFromCaret; + SearchInSelectionOnly := Self.SearchSelectionOnly; + SelectedText := FEditor.SelText; + if (SelectedText <> '') and (Pos(#10, SelectedText) > 0) or (Pos(#13, SelectedText) > 0) then + SearchInSelectionOnly := True + else + SearchInSelectionOnly := False; + + // start with last search text + + if FSearchForSelWord and not SearchInSelectionOnly + then + begin + if Editor.SelectionWord(True)<>'' then + SearchText:=Editor.SelectionWord(True) + else + SearchText := Self.SearchText; + end else + SearchText := Self.SearchText; + SearchTextHistory := Self.SearchTextHistory; + if AReplace then + with dlg as TTextReplaceDialog do + begin + ReplaceText := Self.ReplaceText; + ReplaceTextHistory := Self.ReplaceTextHistory; + end; + SearchWholeWords := Self.SearchWholeWords; + if ShowModal = mrOK then + begin + Self.SearchBackwards := SearchBackwards; + Self.SearchCaseSensitive := SearchCaseSensitive; + Self.SearchFromCaret := SearchFromCursor; + Self.SearchSelectionOnly := SearchInSelectionOnly; + Self.SearchWholeWords := SearchWholeWords; + Self.SearchRegex := SearchRegularExpression; + Self.SearchText := SearchText; + Self.SearchTextHistory := SearchTextHistory; + + if AReplace then + with dlg as TTextReplaceDialog do + begin + Self.ReplaceText := ReplaceText; + Self.ReplaceTextHistory := ReplaceTextHistory; + end; + fSearchFromCaretInt := Self.SearchFromCaret; + if SearchText <> '' then + begin + DoSearchReplaceText(AReplace, Self.SearchBackwards); + fSearchFromCaretInt := True; + end; + Self.SearchSelectionOnly := False; + end; + finally + dlg.Free; + end; +end; + +initialization + ConfirmReplaceDialog := nil; +end. diff --git a/editor/studio/UnitCodeExplorerUpdater.pas b/editor/studio/UnitCodeExplorerUpdater.pas new file mode 100755 index 00000000..77c2b98d --- /dev/null +++ b/editor/studio/UnitCodeExplorerUpdater.pas @@ -0,0 +1,321 @@ +unit UnitCodeExplorerUpdater; + +interface + +uses + Classes, Forms, SysUtils, ComCtrls, Windows, ScintillaLanguageManager, + Dialogs, CommCtrl; + +type + TCodeExplorerUpdater = class(TThread) + private + eConstants: TStringList; + eDefined: TStringList; + eCVars: TStringList; + eIncluded: TStringList; + eMethodsDefault, eMethodsEvents, eStocks: TStringList; + eNatives: TStringList; + eForwards: TStringList; + eVariables: TStringList; + + eCode: TStringList; + + eAutoComplete, eCallTips, eKeywords: String; + protected + procedure Execute; override; + procedure GetCode; + procedure SetValuesPAWN; + end; + +implementation + +uses UnitfrmMain, UnitLanguages, UnitMainTools, UnitCodeUtils, + UnitTextAnalyze, UnitfrmSettings, UnitPlugins; + +{ TCodeExplorerUpdater } + +procedure TCodeExplorerUpdater.Execute; +var eStr: TStringList; +begin + eCode := TStringList.Create; + eConstants := TStringList.Create; + eDefined := TStringList.Create; + eCVars := TStringList.Create; + eIncluded := TStringList.Create; + eMethodsDefault := TStringList.Create; + eMethodsEvents := TStringList.Create; + eStocks := TStringList.Create; + eNatives := TStringList.Create; + eForwards := TStringList.Create; + eVariables := TStringList.Create; + eStr := TStringList.Create; + + repeat + Synchronize(GetCode); + eAutoComplete := ''; + eCallTips := ''; + eKeywords := ''; + + if (not Application.Terminated) and (Started) and (not frmMain.pnlLoading.Visible) and (frmMain.trvExplorer.Visible) then begin + if Plugin_UpdateCodeExplorer(GetCurrLang.Name, ActiveDoc.FileName, frmMain.tsMain.Items[frmMain.tsMain.ActiveTabIndex].Caption, True) then begin + try + if (frmMain.tsMain.ActiveTabIndex = 0) then begin + // analyze code + with ParseCodePAWN(eCode, ExtractFileName(ActiveDoc.FileName)) do begin + eConstants.Assign(Constants); + eDefined.Assign(Defined); + eCVars.Assign(CVars); + eIncluded.Assign(Included); + eMethodsDefault.Assign(MethodsDefault); + eMethodsEvents.Assign(Events); + eStocks.Assign(Stocks); + eNatives.Assign(Natives); + eForwards.Assign(Forwards); + eVariables.Assign(Variables); + + eAutoComplete := eAutoComplete + #13 + AutoComplete.Text; + eCallTips := eCallTips + #13 + CallTips.Text; + eKeywords := eKeywords + #13 + HighlightKeywords.Text; + + DestroyResult; + end; + // apply changes + Synchronize(SetValuesPAWN); + end; + except + // GABEM + end; + end; + Sleep(1000); + end + else + Sleep(50); + until (Application.Terminated); + + eCode.Free; + eConstants.Free; + eDefined.Free; + eCVars.Free; + eIncluded.Free; + eMethodsDefault.Free; + eMethodsEvents.Free; + eStocks.Free; + eNatives.Free; + eForwards.Free; + eVariables.Free; + eStr.Free; +end; + +procedure TCodeExplorerUpdater.GetCode; +begin + eCode.Assign(frmMain.sciEditor.Lines); +end; + +procedure TCodeExplorerUpdater.SetValuesPAWN; +function GetNode(eText: String): TTreeNode; +var i: integer; +begin + Result := nil; + + for i := 0 to frmMain.trvExplorer.Items.Count -1 do begin + if (frmMain.trvExplorer.Items[i].Text = eText) then begin + if (frmMain.trvExplorer.Items[i].ImageIndex = 42) or (frmMain.trvExplorer.Items[i].ImageIndex = 43) then begin + Result := frmMain.trvExplorer.Items[i]; + exit; + end; + end; + end; +end; + +var exConstants, exDefined, exIncluded, exMethods, exDefault, exEvents, + exStocks, exNatives, exForwards, exVariables, exCVars: Boolean; + i, eSelStart, eSelLength: integer; + LineMaxSubord: integer; + eStr: TStringList; + eScrollPosX, eScrollPosY: Integer; +begin + if frmMain.trvExplorer.Items.Count = 0 then exit; + + frmMain.trvExplorer.Items.BeginUpdate; + eScrollPosX := GetScrollPos(frmMain.trvExplorer.Handle, SB_HORZ); + eScrollPosY := GetScrollPos(frmMain.trvExplorer.Handle, SB_VERT); + + // Get Expanded-State and delete children + with GetNode('Constants') do begin + exConstants := Expanded; + DeleteChildren; + end; + with GetNode('CVars') do begin + exCVars := Expanded; + DeleteChildren; + end; + with GetNode('Defined') do begin + exDefined := Expanded; + DeleteChildren; + end; + with GetNode('Included') do begin + exIncluded := Expanded; + DeleteChildren; + end; + with GetNode('Default') do begin + exDefault := Expanded; + DeleteChildren; + end; + with GetNode('Events') do begin + exEvents := Expanded; + DeleteChildren; + end; + with GetNode('Stocks') do begin + exStocks := Expanded; + DeleteChildren; + end; + with GetNode('Methods') do begin + exMethods := Expanded; + DeleteChildren; + end; + with GetNode('Natives') do begin + exNatives := Expanded; + DeleteChildren; + end; + with GetNode('Forwards') do begin + exForwards := Expanded; + DeleteChildren; + end; + with GetNode('Variables') do begin + exVariables := Expanded; + DeleteChildren; + end; + // Create new children + with frmMain.trvExplorer.Items.AddChild(GetNode('Defined'), 'CVars') do begin + ImageIndex := 42; + SelectedIndex := 42; + end; + with frmMain.trvExplorer.Items.AddChild(GetNode('Methods'), 'Default') do begin + ImageIndex := 42; + SelectedIndex := 42; + end; + with frmMain.trvExplorer.Items.AddChild(GetNode('Methods'), 'Events') do begin + ImageIndex := 42; + SelectedIndex := 42; + end; + with frmMain.trvExplorer.Items.AddChild(GetNode('Methods'), 'Stocks') do begin + ImageIndex := 42; + SelectedIndex := 42; + end; + + for i := 0 to eConstants.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Constants'), eConstants[i], Pointer(eConstants.Objects[i])) do begin + ImageIndex := 48; + SelectedIndex := 48; + end; + end; + for i := 0 to eDefined.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Defined'), eDefined[i], Pointer(eDefined.Objects[i])) do begin + ImageIndex := 48; + SelectedIndex := 48; + end; + end; + for i := 0 to eCVars.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('CVars'), eCVars[i], Pointer(eCVars.Objects[i])) do begin + ImageIndex := 35; + SelectedIndex := 35; + end; + end; + for i := 0 to eIncluded.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Included'), eIncluded[i], Pointer(eIncluded.Objects[i])) do begin + ImageIndex := 34; + SelectedIndex := 34; + end; + end; + for i := 0 to eMethodsDefault.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Default'), eMethodsDefault[i], Pointer(eMethodsDefault.Objects[i])) do begin + ImageIndex := 12; + SelectedIndex := 12; + end; + end; + for i := 0 to eMethodsEvents.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Events'), eMethodsEvents[i], Pointer(eMethodsEvents.Objects[i])) do begin + ImageIndex := 47; + SelectedIndex := 47; + end; + end; + for i := 0 to eStocks.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Stocks'), eStocks[i], Pointer(eStocks.Objects[i])) do begin + ImageIndex := 12; + SelectedIndex := 12; + end; + end; + for i := 0 to eNatives.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Natives'), eNatives[i], Pointer(eNatives.Objects[i])) do begin + ImageIndex := 47; + SelectedIndex := 47; + end; + end; + for i := 0 to eForwards.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Forwards'), eForwards[i], Pointer(eForwards.Objects[i])) do begin + ImageIndex := 47; + SelectedIndex := 47; + end; + end; + for i := 0 to eVariables.Count -1 do begin + with frmMain.trvExplorer.Items.AddChildObject(GetNode('Variables'), eVariables[i], Pointer(eVariables.Objects[i])) do begin + ImageIndex := 35; + SelectedIndex := 35; + end; + end; + + GetNode('Constants').Expanded := exConstants; + GetNode('Defined').Expanded := exDefined; + GetNode('CVars').Expanded := exCVars; + GetNode('Included').Expanded := exIncluded; + GetNode('Methods').Expanded := exMethods; + GetNode('Default').Expanded := exDefault; + GetNode('Events').Expanded := exEvents; + GetNode('Stocks').Expanded := exStocks; + GetNode('Natives').Expanded := exNatives; + GetNode('Forwards').Expanded := exForwards; + GetNode('Variables').Expanded := exVariables; + + SetScrollPos(frmMain.trvExplorer.Handle, SB_HORZ, eScrollPosX, False); + SetScrollPos(frmMain.trvExplorer.Handle, SB_VERT, eScrollPosY, False); + frmMain.trvExplorer.Items.EndUpdate; + + if (not frmMain.pnlLoading.Visible) and (not frmMain.sciEditor.AutoCActive) and (not frmMain.sciEditor.CallTipActive) then begin + frmMain.sciAutoComplete.AStrings.Text := eAutoComplete; + for i := frmMain.sciAutoComplete.AStrings.Count -1 downto 0 do begin + if Length(Trim(frmMain.sciAutoComplete.AStrings[i])) <= 1 then + frmMain.sciAutoComplete.AStrings.Delete(i); + end; + frmMain.sciCallTips.ApiStrings.Text := eCallTips; + for i := frmMain.sciCallTips.ApiStrings.Count -1 downto 0 do begin + if Length(Trim(frmMain.sciCallTips.ApiStrings[i])) <= 1 then + frmMain.sciCallTips.ApiStrings.Delete(i); + end; + + with TSciKeywords(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Find('Pawn').Keywords.Items[1])) do begin + eStr := TStringList.Create; + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if not frmMain.sciEditor.GetFoldExpanded(i) then + eStr.Add(IntToStr(i)); + end; + + Keywords.Text := eKeywords; + frmMain.sciEditor.LanguageManager.Update; + + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if eStr.IndexOf(IntToStr(i)) <> -1 then begin + LineMaxSubord := frmMain.sciEditor.GetLastChild(i, -1); + frmMain.sciEditor.SetFoldExpanded(i, False); + if LineMaxSubord > i then + frmMain.sciEditor.HideLines(i+1, LineMaxSubord); + end; + end; + + eStr.Free; + end; + end; + + Plugin_UpdateCodeExplorer(GetCurrLang.Name, ActiveDoc.FileName, frmMain.tsMain.Items[frmMain.tsMain.ActiveTabIndex].Caption, False); +end; + +end. diff --git a/editor/studio/UnitCodeInspector.pas b/editor/studio/UnitCodeInspector.pas new file mode 100755 index 00000000..0ecf8f73 --- /dev/null +++ b/editor/studio/UnitCodeInspector.pas @@ -0,0 +1,417 @@ +unit UnitCodeInspector; + +interface + +uses SysUtils, Classes, Windows, JvInspector, UnitMainTools, Contnrs; + +type + TSelectionTextList = class(TStringList) + private + FSelected: Integer; + function GetSelectedText: string; + function GetSelected: Integer; + procedure SetSelectedText(const Value: string); + procedure SetSelected(const Value: Integer); + public + property Selected: Integer read GetSelected write SetSelected; + property SelectedText: string read GetSelectedText write SetSelectedText; + end; + + TJvInspectorSelectionTextListItem = class(TJvCustomInspectorItem) + protected + function GetDisplayValue: string; override; + procedure GetValueList(const Strings: TStrings); override; + procedure SetDisplayValue(const Value: string); override; + procedure SetFlags(const Value: TInspectorItemFlags); override; + end; + + TStringWrapper = class(TObject) + public + Value: string; + constructor Create(const AValue: string); + end; + + TSTLWrapper = class(TObject) + public + STL: TSelectionTextList; + Value: String; + constructor Create(const ASTL: TSelectionTextList; const AValue: String); + end; + +function AddField(eName, eCategory, eValue: String): TJvCustomInspectorItem; +function AddCombo(eName, eCategory, eValue: String; eValues: array of string): TJvCustomInspectorItem; + +procedure UpdateCI; +procedure UpdateCI_PAWN; + +var eFormatSettings: String; + eAllIncluded: TStringArray; + + FItems: TObjectList; + STLItem: TSelectionTextList; + +implementation + +uses UnitfrmMain, UnitLanguages, UnitCodeUtils, UnitMenuGenerators, + UnitPlugins; + +var eBraceTexts: TStringList; + +{ "Combobox"-Item } + +function TSelectionTextList.GetSelected: Integer; +begin + if FSelected < -1 then + FSelected := -1 + else if FSelected >= Count then + FSelected := Count - 1; + Result := FSelected; +end; + +function TSelectionTextList.GetSelectedText: string; +begin + if Selected >= 0 then + Result := Strings[Selected] + else + Result := ''; +end; + +procedure TSelectionTextList.SetSelected(const Value: Integer); +begin + FSelected := Value; + GetSelected; // adjust FSelected +end; + +procedure TSelectionTextList.SetSelectedText(const Value: string); +begin + FSelected := IndexOf(Value); +end; + +function TJvInspectorSelectionTextListItem.GetDisplayValue: string; +begin + Result := TSelectionTextList(Data.AsOrdinal).SelectedText; +end; + +procedure TJvInspectorSelectionTextListItem.GetValueList(const Strings: TStrings); +begin + Strings.Assign(TSelectionTextList(Data.AsOrdinal)); +end; + +procedure TJvInspectorSelectionTextListItem.SetDisplayValue(const Value: string); +begin + TSelectionTextList(Data.AsOrdinal).SelectedText := Value; +end; + +procedure TJvInspectorSelectionTextListItem.SetFlags(const Value: TInspectorItemFlags); +begin + inherited SetFlags(Value + [iifValueList]); +end; + +constructor TStringWrapper.Create(const AValue: string); +begin + inherited Create; + Value := AValue; +end; + +{ Codeinspector Add Functions } + +function AddCombo(eName, eCategory, eValue: String; eValues: array of string): TJvCustomInspectorItem; +var + i: integer; + eParent: TJvCustomInspectorItem; + Item: TSTLWrapper; + Found: Boolean; +begin + eParent := nil; + for i := 0 to frmMain.jviCode.Root.Count -1 do + begin + if (frmMain.jviCode.Root.Items[i].DisplayName = eCategory) and (frmMain.jviCode.Root.Items[i] is TJvInspectorCustomCategoryItem) then + begin + eParent := frmMain.jviCode.Root.Items[i]; + Break; + end; + end; + if eParent = nil then + begin + eParent := TJvInspectorCustomCategoryItem.Create(frmMain.jviCode.Root, nil); + eParent.DisplayName := eCategory; + end; + + if eName <> '' then + begin + STLItem := TSelectionTextList.Create; + Found := False; + for i := 0 to High(eValues) do begin + STLItem.Add(eValues[i]); + if eValues[i] = eValue then + Found := True; + end; + + if not Found then begin + STLItem.Add(eValue); + STLItem.Sort; + end; + + Item := TSTLWrapper.Create(STLItem, eValue); + FItems.Add(Item); + FItems.Add(STLItem); + + STLItem.SelectedText := Item.Value; + Result := TJvInspectorVarData.New(eParent, eName, TypeInfo(TSelectionTextList), @Item.STL); + frmMain.jviCode.Root.Sort; + eParent.Expanded := True; + end + else + begin + Result := nil; + frmMain.jviCode.Root.Sort; + end; +end; + +function AddField(eName, eCategory, eValue: String): TJvCustomInspectorItem; +var + i: integer; + eParent: TJvCustomInspectorItem; + Item: TStringWrapper; +begin + eParent := nil; + for i := 0 to frmMain.jviCode.Root.Count -1 do + begin + if (frmMain.jviCode.Root.Items[i].DisplayName = eCategory) and (frmMain.jviCode.Root.Items[i] is TJvInspectorCustomCategoryItem) then + begin + eParent := frmMain.jviCode.Root.Items[i]; + Break; + end; + end; + if eParent = nil then + begin + eParent := TJvInspectorCustomCategoryItem.Create(frmMain.jviCode.Root, nil); + eParent.DisplayName := eCategory; + end; + + if eName <> '' then + begin + Item := TStringWrapper.Create(eValue); // StringWrapper erzeugen, damit der String erhalten bleibt + FItems.Add(Item); // und das Item in die Liste eintragen, damit kein Speicherleck entsteht + Result := TJvInspectorVarData.New(eParent, eName, TypeInfo(String), @Item.Value); + frmMain.jviCode.Root.Sort; + eParent.Expanded := True; + end + else + begin + Result := nil; + frmMain.jviCode.Root.Sort; + end; +end; + +{ Parse Functions } + +procedure UpdateCI; +begin + if not Plugin_UpdateCodeInspector(GetCurrLang.Name, ActiveDoc.FileName, frmMain.tsMain.Items[frmMain.tsMain.ActiveTabIndex].Caption, True) then exit; + + if GetCurrLang.Name = 'Pawn' then begin + UpdateCI_PAWN; + Plugin_UpdateCodeInspector(GetCurrLang.Name, ActiveDoc.FileName, frmMain.tsMain.Items[frmMain.tsMain.ActiveTabIndex].Caption, False); + end; +end; + +procedure UpdateCI_PAWN; +procedure HideBracesAndStrings(var eStr: String); +begin + while Between(eStr, '{', '}') <> '' do begin + eBraceTexts.Add('{' + Between(eStr, '{', '}') + '}'); + eStr := StringReplace(eStr, '{' + Between(eStr, '{', '}') + '}', #1 + IntToStr(eBraceTexts.Count) + #1, []); + end; + while CountChars(eStr, '"') > 1 do begin + eBraceTexts.Add('"' + StringReplace(Between(eStr, '"', '"'), ':', #3, [rfReplaceAll]) + '"'); + eStr := StringReplace(eStr, '"' + Between(eStr, '"', '"') + '"', #2 + IntToStr(eBraceTexts.Count) + #2, []); + end; +end; + +function ShowBracesAndStrings(eStr: String): String; +var k: integer; +begin + while Between(eStr, #1, #1) <> '' do begin + k := StrToInt(Between(eStr, #1, #1)); + eStr := StringReplace(eStr, #1 + IntToStr(k) + #1, eBraceTexts[k -1], []); + end; + while Between(eStr, #2, #2) <> '' do begin + k := StrToInt(Between(eStr, #2, #2)); + eStr := StringReplace(eStr, #2 + IntToStr(k) + #2, eBraceTexts[k -1], []); + end; + Result := eStr; +end; + +var eCurrLine, eBackupLine: String; + i, k: integer; + eStr: TStringList; + eVars, eConsts: Integer; + eVarName, eVarType, eVarValue: String; +begin + eBackupLine := frmMain.sciEditor.Lines[frmMain.sciEditor.GetCurrentLineNumber]; + eCurrLine := Trim(StringReplace(eBackupLine, #9, #32, [rfReplaceAll])); + eCurrLine := RemoveStringsAndComments(eCurrLine, False); + eAllIncluded := GetAllIncludeFiles; + eStr := TStringList.Create; + eBraceTexts := TStringList.Create; + eVars := 0; + eConsts := 0; + frmMain.jviCode.Clear; + FItems.Clear; + + eFormatSettings := ''; + { Constants and Variables } + if (IsAtStart('new', eCurrLine, False)) then begin // const or variable + Delete(eCurrLine, 1, 4); + + // done? okay, split all items if there are more than one; and if not, it's okay... + HideBracesAndStrings(eCurrLine); + eStr.Text := StringReplace(eCurrLine, ',', #13, [rfReplaceAll]); + + for i := 0 to eStr.Count - 1 do begin + eStr[i] := ShowBracesAndStrings(eStr[i]); + eVarType := ''; + eVarValue := ''; + + if (Trim(eStr[i]) <> '') then begin + eVarName := Trim(RemoveSemicolon(eStr[i])); + if Pos(':', eVarName) <> 0 then begin + eVarType := Trim(Copy(eVarName, 1, Pos(':', eVarName) -1)); + eVarName := Trim(Copy(eVarName, Pos(':', eVarName) +1, Length(eVarName))); + end; + + if Pos('=', eVarName) <> 0 then begin // constant + Inc(eConsts, 1); + eFormatSettings := eFormatSettings + '-Constant ' + IntToStr(eConsts) + '-'; + + eVarValue := Trim(Copy(eVarName, Pos('=', eVarName) +1, Length(eVarName))); + eVarValue := StringReplace(eVarValue, #3, ':', [rfReplaceAll]); + eVarName := Trim(Copy(eVarName, 1, Pos('=', eVarName) -1)); + + AddField(lName, 'Constant ' + IntToStr(eConsts), eVarName); + if eVarType <> '' then + AddField(lType, 'Constant ' + IntToStr(eConsts), eVarType); + if eVarValue <> '' then + AddField(lValue, 'Constant ' + IntToStr(eConsts), eVarValue); + end + else begin // variable + Inc(eVars, 1); + eFormatSettings := eFormatSettings + '-Variable ' + IntToStr(eVars) + '-'; + AddField(lName, 'Variable ' + IntToStr(eVars), eVarName); + if eVarType <> '' then + AddField(lType, 'Variable ' + IntToStr(eVars), eVarType); + end; + end; + end; + + if frmMain.jviCode.Root.Count = 1 then + frmMain.jviCode.Root.Items[0].DisplayName := Copy(frmMain.jviCode.Root.Items[0].DisplayName, 1, Length(frmMain.jviCode.Root.Items[0].DisplayName) -2); + end + { Conditions } + else if (IsAtStart('if', eCurrLine, False)) then begin + if (CountChars(eCurrLine, '(') = CountChars(eCurrLine, ')')) and (CountChars(eCurrLine, '(') <> 0) then begin + eCurrLine := Copy(eCurrLine, 1, GetMatchingBrace(eCurrLine) -1); + eCurrLine := Copy(eCurrLine, Pos('(', eCurrLine) +1, Length(eCurrLine)); + eFormatSettings := StringReplace(eBackupLine, '(' + eCurrLine + ')', #1#3#3#7, []); + HideBracesAndStrings(eCurrLine); + eStr.Text := StringReplace(eCurrLine, '||', #13, [rfReplaceAll]); + k := eStr.Count -1; // from 0 to k -> OR operators + eStr.Text := StringReplace(eStr.Text, '&&', #13, [rfReplaceAll]); + + for i := 0 to eStr.Count -1 do begin + eStr[i] := Trim(ShowBracesAndStrings(eStr[i])); + if (Pos('(', eStr[i]) = 1) and (Pos(')', eStr[i]) = Length(eStr[i])) then + eStr[i] := Copy(Copy(eStr[i], 2, Length(eStr[i])), 1, Length(eStr[i]) -1); + + if eStr.Count = 1 then + eCurrLine := 'If-Condition' + else + eCurrLine := 'If-Condition ' + IntToStr(frmMain.jviCode.Root.Count +1); + + if i <> eStr.Count -1 then begin + if i < k then + AddCombo('Operator', eCurrLine, '||', ['||', '&&']) + else + AddCombo('Operator', eCurrLine, '&&', ['||', '&&']); + end; + AddField('Condition', eCurrLine, eStr[i]); + end; + end + else + AddField('', 'Invalid condition', ''); + end + { Defined } + else if (IsAtStart('#define', eCurrLine, False)) then begin + eCurrLine := Trim(Copy(eCurrLine, 8, Length(eCurrLine))); + HideBracesAndStrings(eCurrLine); + eCurrLine := StringReplace(eCurrLine, #9, #32, [rfReplaceAll]); + eCurrLine := ShowBracesAndStrings(eCurrLine); + AddField('Name', 'Defined', Copy(eCurrLine, 1, Pos(#32, eCurrLine) -1)); + eCurrLine := Trim(Copy(eCurrLine, Pos(#32, eCurrLine) +1, Length(eCurrLine))); + AddField('Value', 'Defined', eCurrLine); + end + { Included } + else if (IsAtStart('#include', eCurrLine, False)) then begin + eCurrLine := Trim(StringReplace(eCurrLine, #9, #32, [rfReplaceAll])); + if Between(eCurrLine, '<', '>') <> '' then begin + eCurrLine := Between(eCurrLine, '<', '>'); + eFormatSettings := StringReplace(eBackupLine, '<' + eCurrLine + '>', '<-Filename->', []); + end + else if Between(eCurrLine, '"', '"') <> '' then begin + eCurrLine := Between(eCurrLine, '"', '"'); + eFormatSettings := StringReplace(eBackupLine, '"' + eCurrLine + '"', '"-Filename-"', []); + end + else begin + eCurrLine := Copy(eCurrLine, 9, Length(eCurrLine)); + eFormatSettings := '#include -Filename-'; + end; + eCurrLine := Trim(eCurrLine); + AddCombo('File', 'Included', eCurrLine, eAllIncluded); + end + { Assignments } + else begin + if (Pos('=', eCurrLine) <> 0) then begin + eCurrLine := Trim(eCurrLine); + while Pos(eCurrLine[1], frmMain.sciEditor.WordChars + '[]') <> 0 do + Delete(eCurrLine, 1, 1); + eCurrLine := Trim(eCurrLine); + if Pos('=', eCurrLine) <= 2 then begin + while (Pos(Copy(eCurrLine, 1, 1), frmMain.sciEditor.WordChars + #32 + #9) = 0) and (Length(eCurrLine) <> 0) do begin + eFormatSettings := eFormatSettings + eCurrLine[1]; + Delete(eCurrLine, 1, 1); + end; + eCurrLine := RemoveSemicolon(Trim(eBackupLine)); + eCurrLine := StringReplace(eCurrLine, #9, #32, [rfReplaceAll]); + AddField('a', 'Assignment', Copy(eCurrLine, 1, Pos(eFormatSettings, eCurrLine) - Length(eFormatSettings))); + AddField('b', 'Assignment', Trim(Copy(eCurrLine, Pos(eFormatSettings, eCurrLine) + Length(eFormatSettings), Length(eCurrLine)))); + AddField('Operator', 'Assignment', eFormatSettings); + end + else + AddField('', 'No information available.', ''); + end + else + AddField('', 'No information available.', ''); + end; + eStr.Free; + eBraceTexts.Free; +end; + +{ TSTLWrapper } + +constructor TSTLWrapper.Create(const ASTL: TSelectionTextList; + const AValue: String); +begin + STL := ASTL; + Value := AValue; +end; + +initialization + +FItems := TObjectList.Create; + +finalization + +FItems.Free; + +end. diff --git a/editor/studio/UnitCodeSnippets.pas b/editor/studio/UnitCodeSnippets.pas new file mode 100755 index 00000000..8234ca76 --- /dev/null +++ b/editor/studio/UnitCodeSnippets.pas @@ -0,0 +1,92 @@ +unit UnitCodeSnippets; + +interface + +uses SysUtils, Classes, Windows; + +function GetSnippet(Lang, Ident: String): String; +function GetSnippetList(Lang: String): TStringList; +procedure AddSnippet(Lang, Ident, Code: String); +procedure DelSnippet(Lang, Ident: String); +procedure SetSnippet(Lang, Ident, Code: String); + +implementation + +function GetSnippet(Lang, Ident: String): String; +var eFile: TStringList; + i: Integer; +begin + eFile := TStringList.Create; + eFile.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + for i := 0 to eFile.Count -1 do begin + if Pos(Ident + #1, eFile[i]) = 1 then begin + Result := eFile[i]; + Delete(Result, 1, Length(Ident) +1); + Result := StringReplace(Result, #2, #13#10, [rfReplaceAll]); + end; + end; + eFile.Free; +end; + +function GetSnippetList(Lang: String): TStringList; +var i: Integer; +begin + Result := TStringList.Create; + if FileExists(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl') then begin + Result.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + for i := 0 to Result.Count -1 do + Result[i] := Copy(Result[i], 1, Pos(#1, Result[i]) -1); + end; +end; + +procedure AddSnippet(Lang, Ident, Code: String); +var eFile: TStringList; +begin + Code := StringReplace(Code, #13#10, #2, [rfReplaceAll]); + + eFile := TStringList.Create; + eFile.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + eFile.Add(Ident + #1 + Code); + eFile.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + eFile.Free; +end; + +procedure DelSnippet(Lang, Ident: String); +var eFile: TStringList; + i: Integer; +begin + eFile := TStringList.Create; + eFile.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + for i := eFile.Count -1 downto 0 do begin + if Pos(Ident + #1, eFile[i]) = 1 then + eFile.Delete(i); + end; + eFile.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + eFile.Free; +end; + +procedure SetSnippet(Lang, Ident, Code: String); +var eFile: TStringList; + i: Integer; +begin + Code := StringReplace(Code, #13#10, #2, [rfReplaceAll]); + + eFile := TStringList.Create; + eFile.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + { If item exists... } + for i := 0 to eFile.Count -1 do begin + if Pos(Ident + #1, eFile[i]) = 1 then begin + eFile[i] := Ident + #1 + Code; + eFile.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + eFile.Free; + + exit; + end; + end; + { else... } + eFile.Add(Ident + #1 + Code); + eFile.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\' + Lang + '.csl'); // ... .csl = CodeSnippetList + eFile.Free; +end; + +end. diff --git a/editor/studio/UnitCodeUtils.pas b/editor/studio/UnitCodeUtils.pas new file mode 100755 index 00000000..8c83fbf2 --- /dev/null +++ b/editor/studio/UnitCodeUtils.pas @@ -0,0 +1,431 @@ +unit UnitCodeUtils; + +interface + +uses SysUtils, Classes, Forms, Controls, Windows, ScintillaLanguageManager, + RichEdit, ComCtrls, JvInspector; + +function IsAtStart(eSubStr, eStr: String; AllowFunctions: Boolean = True): Boolean; +function GetIndents(Line: Integer = -1): String; +function GetStyleAt(ePos: Integer): TSciStyle; +function LineFromPos(ePos: Integer): Integer; +function RemoveSemicolon(eStr: String): String; +procedure IndentCode; +procedure UnindentCode; +function Between(eText, eFirst, eSecond: String): String; +procedure Delay(eTime: Integer); +function CountChars(eIn: String; eChar: Char): Integer; +function RemoveStringsAndComments(eLine: String; eRemoveStrings: Boolean): String; +function GetMatchingBrace(eString: String): Integer; +function GetColoredLine(eLine: Integer): String; + +function GetRTFText(ARichEdit: TRichedit): string; +procedure SetRTFText(ARichEdit: TRichedit; ARTFText: String); + +implementation + +uses UnitfrmMain, UnitMainTools, UnitLanguages; + +function IsAtStart(eSubStr, eStr: String; AllowFunctions: Boolean = True): Boolean; +begin + eStr := LowerCase(Trim(StringReplace(eStr, #9, #32, [rfReplaceAll]))); + eSubStr := LowerCase(eSubStr); + if Pos(eSubStr + #32, eStr) = 1 then + Result := True + else if (Pos(eSubStr + '(', eStr) = 1) and (AllowFunctions) then + Result := True + else + Result := False; +end; + +function GetIndents(Line: Integer = -1): String; +var i: integer; +begin + Result := ''; + if Line = -1 then + Line := frmMain.sciEditor.GetCurrentLineNumber; + + if Length(frmMain.sciEditor.Lines[Line]) <> 0 then begin + for i := 1 to Length(frmMain.sciEditor.Lines[Line]) do begin + if (frmMain.sciEditor.Lines[Line][i] <> #32) and (frmMain.sciEditor.Lines[Line][i] <> #9) then + break + else + Result := Result + frmMain.sciEditor.Lines[Line][i]; + end; + end; +end; + +function GetStyleAt(ePos: Integer): TSciStyle; +var eBits: Integer; + eStyleNo: Byte; + i: integer; +begin + Result := nil; + + eStyleNo := Byte(frmMain.sciEditor.GetStyleAt(ePos)); + eBits := frmMain.sciEditor.GetStyleBits; + + if eBits = 5 then + eStyleNo := eStyleNo and $1f //Strip away the indicators (3 bits) + else if eBits = 7 then + eStyleNo := eStyleNo and $7f //Strip away the indicators (1 bit) + else if eBits = 6 then + eStyleNo := eStyleNo and $3f; //Strip away the indicators (2 bits) + + if eStyleNo <> 32 then begin + with frmMain.sciEditor.LanguageManager.LanguageList.Find(ActiveDoc.Highlighter).Styles do begin + for i := 0 to Count -1 do begin + if TSciStyle(Items[i]).StyleNumber = eStyleNo then + Result := TSciStyle(Items[i]); + end; + end; + end; +end; + +function LineFromPos(ePos: Integer): Integer; +var i: integer; + eLength: Integer; +begin + Result := -1; + eLength := 0; + + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + eLength := eLength + Length(frmMain.sciEditor.Lines[i]); + if eLength >= ePos then begin + Result := i; + break; + end; + end; +end; + +function RemoveSemicolon(eStr: String): String; +begin + if Length(eStr) <> 0 then begin + if eStr[Length(eStr)] = ';' then + Result := Copy(eStr, 1, Length(eStr) -1) + else + Result := eStr; + end + else + Result := eStr; +end; + +procedure IndentCode; +var eStr: TStringList; + i, k: integer; + eIdent, eTempIdent: Integer; + eString: String; +begin + Screen.Cursor := crHourGlass; + frmMain.sciEditor.Enabled := False; + eStr := TStringList.Create; + eIdent := 0; + eTempIdent := 0; + + ShowProgress; + frmMain.pbLoading.Max := frmMain.sciEditor.Lines.Count *2 -2; + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if Cancel then begin + Cancel := False; + exit; + end; + eStr.Add(TrimLeft(frmMain.sciEditor.Lines[i])); + // Remove strings and comments virtually because they could include brackets + frmMain.pbLoading.Position := i; + SetProgressStatus('Indenting Code...'); + eStr[i] := RemoveStringsAndComments(eStr[i], True); + end; + + for i := 0 to eStr.Count -1 do begin + if CountChars(eStr[i], '{') <> CountChars(eStr[i], '}') then + eIdent := eIdent - CountChars(eStr[i], '}'); + frmMain.sciEditor.Lines[i] := TrimLeft(frmMain.sciEditor.Lines[i]); + + for k := 1 to eIdent + eTempIdent do + frmMain.sciEditor.Lines[i] := ' ' + frmMain.sciEditor.Lines[i]; + if eTempIdent <> 0 then + eTempIdent := eTempIdent -1; + + if (IsAtStart('if', eStr[i], True)) and (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 3) then begin + eString := eStr[i]; + Delete(eString, 1, 2); + if (eString[1] <> Trim(eString)[1]) or (eString[1] = '(') then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end + else if (IsAtStart('for', eStr[i], True)) and (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 4) then begin + eString := eStr[i]; + Delete(eString, 1, 3); + if (eString[1] <> Trim(eString)[1]) or (eString[1] = '(') then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end + else if (IsAtStart('else', eStr[i], False)) and (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 5) then begin + eString := eStr[i]; + Delete(eString, 1, 4); + if eString[1] <> Trim(eString)[1] then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end + else if (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 6) then begin + if (IsAtStart('stock', eStr[i], False)) or (IsAtStart('while', eStr[i], True)) then begin + eString := eStr[i]; + Delete(eString, 1, 5); + if (eString[1] <> Trim(eString)[1]) or (eString[1] = '(') then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end; + end; + + if (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 7) then begin + if (Pos('public', eStr[i]) = 1) or (Pos('native', eStr[i]) = 1) then begin + eString := eStr[i]; + Delete(eString, 1, 6); + if eString[1] <> Trim(eString)[1] then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end; + end + else if (IsAtStart('forward', eStr[i], False)) and (Pos('{', eStr[i]) = 0) and (Length(eStr[i]) > 8) then begin + eString := eStr[i]; + Delete(eString, 1, 7); + if eString[1] <> Trim(eString)[1] then begin + eString := Trim(eString); + if GetMatchingBrace(eString) = Length(eString) then + eTempIdent := eTempIdent +1; + end; + end; + + if CountChars(eStr[i], '{') <> CountChars(eStr[i], '}') then + eIdent := eIdent + CountChars(eStr[i], '{'); + + frmMain.pbLoading.Position := frmMain.sciEditor.Lines.Count + i -1; + SetProgressStatus('Indenting Code...'); + end; + + ActiveDoc.Modified := True; + frmMain.mnuModified.Caption := lModified; + HideProgress; + + frmMain.sciEditor.Enabled := True; + Screen.Cursor := crDefault; +end; + +procedure UnindentCode; +var i: integer; +begin + Screen.Cursor := crHourGlass; + frmMain.sciEditor.Enabled := False; + ShowProgress; + frmMain.pbLoading.Max := frmMain.sciEditor.Lines.Count -1; + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if Cancel then begin + Cancel := False; + exit; + end; + + frmMain.sciEditor.Lines[i] := TrimLeft(frmMain.sciEditor.Lines[i]); + frmMain.pbLoading.Position := i; + SetProgressStatus('Unintending Code...'); + end; + HideProgress; + frmMain.sciEditor.Enabled := True; + Screen.Cursor := crDefault; +end; + +function RemoveStringsAndComments(eLine: String; eRemoveStrings: Boolean): String; +begin + // Remove comments + if (Pos(GetCurrLang.CommentBoxStart, eLine) = 1) or (Pos(GetCurrLang.CommentBoxMiddle, eLine) = 1) or (Pos(GetCurrLang.CommentBoxEnd, eLine) = 1) or (Pos(GetCurrLang.CommentBlock, eLine) = 1) then + eLine := ''; + if Pos(GetCurrLang.CommentBlock, eLine) <> 0 then + eLine := Copy(eLine, 1, Pos('//', eLine) -2); + if (Pos(GetCurrLang.CommentStreamStart, eLine) < Pos(GetCurrLang.CommentStreamEnd, eLine)) and (Pos(GetCurrLang.CommentStreamStart, eLine) <> 0) then + eLine := StringReplace(eLine, GetCurrLang.CommentStreamStart + Between(eLine, GetCurrLang.CommentStreamStart, GetCurrLang.CommentStreamEnd) + GetCurrLang.CommentStreamEnd, '', [rfReplaceAll]); // maybe not the best method, but simple and quite easy + // Remove quotes + if eRemoveStrings then begin + while CountChars(eLine, '"') > 1 do + eLine := StringReplace(eLine, '"' + Between(eLine, '"', '"') + '"', '', [rfReplaceAll]); + end; + + Result := eLine; +end; + +procedure Delay(eTime: Integer); +var i: integer; +begin + for i := 1 to eTime do begin + Sleep(1); + Application.ProcessMessages; + if Application.Terminated then + exit; + end; +end; + +function CountChars(eIn: String; eChar: Char): Integer; +var i: integer; +begin + Result := 0; + if Length(eIn) <> 0 then begin + for i := 1 to Length(eIn) do begin + if eIn[i] = eChar then + Inc(Result, 1); + end; + end; +end; + +function Between(eText, eFirst, eSecond: String): String; +var eTemp: String; +begin + if (Pos(eFirst, eText) = 0) or (Pos(eSecond, eText) = 0) then + Result := '' + else begin + eTemp := eText; + Delete(eTemp, 1, Pos(eFirst, eText) + Length(eFirst) - 1); + Delete(eTemp, Pos(eSecond, eTemp), Length(eTemp)); + Result := eTemp; + end; +end; + +function GetMatchingBrace(eString: String): Integer; +var a, b,c : integer; +begin + Result := 0; + if Length(eString) < 1 then exit; + + b := 0; + c := 0; + + for a := 1 to Length(eString) do begin + if eString[a] = '(' then begin + b := b +1; + c := 1; + end + else if eString[a] = ')' then begin + b := b -1; + c := 1; + end; + + if (b = 0) and (c = 1) then begin + Result := a; + exit; + end; + end; +end; + +function GetColoredLine(eLine: Integer): String; +var eCurrStyle: String; + eChars: Integer; + i: integer; +begin + eChars := 0; + if eLine <> 0 then begin + for i := 0 to eLine -1 do + eChars := eChars + Length(frmMain.sciEditor.Lines[i]) + 2; // +2 for #13#10 + end; + + eCurrStyle := ''; + Result := IntToStr(eLine +1) + '] '; + if Length(frmMain.sciEditor.Lines[eLine]) = 0 then exit; + + for i := 0 to Length(frmMain.sciEditor.Lines[eLine]) -1 do begin + if eCurrStyle <> GetStyleAt(eChars + i).Name then begin + eCurrStyle := GetStyleAt(eChars + i).Name; + + if (eCurrStyle = 'White Space') and (Length(Result) <> Length(IntToStr(eLine +1) + '] ')) then + Result := Result + ''; + if eCurrStyle = 'Ok Braces' then + Result := Result + '02'; + if eCurrStyle = 'Bad Braces' then + Result := Result + '04'; + if eCurrStyle = 'White Space' then + Result := Result + '12'; + if eCurrStyle = 'Comment' then + Result := Result + '07'; + if eCurrStyle = 'Line Comment' then + Result := Result + '07'; + if eCurrStyle = 'Doc Comment' then + Result := Result + '07'; + if eCurrStyle = 'Number' then + Result := Result + '12'; + if eCurrStyle = 'Keyword' then + Result := Result + '03'; + if eCurrStyle = 'Double quoted string' then + Result := Result + '04'; + if eCurrStyle = 'Single quoted string' then + Result := Result + '04'; + if eCurrStyle = 'Symbols/UUID' then + Result := Result + '04'; + if eCurrStyle = 'Preprocessor' then + Result := Result + '07'; + if eCurrStyle = 'Operators' then + Result := Result + '12'; + if eCurrStyle = 'Identifier' then + Result := Result + '12'; + if eCurrStyle = 'Regular expressions' then + Result := Result + '10'; + if eCurrStyle = 'Doc Comment Line' then + Result := Result + '07'; + if eCurrStyle = 'User-defined keywords' then + Result := Result + '04'; + end; + Result := Result + frmMain.sciEditor.Lines[eLine][i +1]; + end; + Result := StringReplace(Result, ' ', ' ', [rfReplaceAll]); +end; + +{ ------------------ NOTES ------------------ } + +function GetRTFText(ARichEdit: TRichedit): string; +var + ss: TStringStream; + emptystr: string; + + eStr: TStringList; + i: integer; +begin + Result := ''; + + emptystr := ''; + ss := TStringStream.Create(emptystr); + eStr := TStringList.Create; + try + ARichEdit.PlainText := False; + ARichEdit.Lines.SaveToStream(ss); + eStr.Text := StringReplace(ss.DataString, '\', '\\ ', [rfReplaceAll]); + for i := 0 to eStr.Count -1 do + Result := Result + '\n' + eStr[i]; + Delete(Result, 1, 2); + finally + ss.Free; + eStr.Free; + end; +end; + +procedure SetRTFText(ARichEdit: TRichedit; ARTFText: String); +var + ss: TStringStream; +begin + ARTFText := StringReplace(ARTFText, '\n', #13#10, [rfReplaceAll]); + ARTFText := StringReplace(ARTFText, '\\ ', '\', [rfReplaceAll]); + + ss := TStringStream.Create(ARTFText); + try + ARichEdit.PlainText := False; + ARichEdit.Lines.LoadFromStream(ss); + finally + ss.Free; + end; +end; + +end. diff --git a/editor/studio/UnitCompile.pas b/editor/studio/UnitCompile.pas new file mode 100755 index 00000000..39ceb842 --- /dev/null +++ b/editor/studio/UnitCompile.pas @@ -0,0 +1,300 @@ +unit UnitCompile; + +interface + +uses SysUtils, Classes, Windows, Forms, Controls, ShellAPI, Messages, IdFTP, + IdFTPCommon; + +type TPAWNCompileThread = class(TThread) + protected + Stream: TStringStream; + + Output: TStringList; + Finished: Boolean; + procedure Execute; override; + procedure ProcessItem(eLineStr: String); + procedure AddOutput; + procedure StartHL; + procedure Upload; + public + FileName: string; + Compiler: string; + Args: string; + Target: string; + Flags: Integer; + end; + +function DoCompilePAWN(eFlags: Integer): Boolean; + +implementation + +uses UnitfrmSettings, UnitLanguages, UnitMainTools, UnitfrmMain, + UnitCodeUtils, UnitPlugins; + +function DoCompilePAWN(eFlags: Integer): Boolean; +var eFile: string; +begin + Result := False; + if not FileExists(frmSettings.txtPAWNCompilerPath.Text) then begin + MessageBox(frmMain.Handle, PChar(lPAWNCompilerNotFound), PChar(Application.Title), MB_ICONERROR); + exit; + end; + + Screen.Cursor := crHourGlass; + if (ActiveDoc.Untitled) then + eFile := ExtractFilePath(ParamStr(0)) + 'Untitled.sma' + else + eFile := ActiveDoc.FileName; + frmMain.sciEditor.Lines.SaveToFile(eFile); + + if Plugin_VisibleControlChange(CTRL_OUTPUT, True) then begin + frmMain.lstOutput.Clear; + frmMain.splOutput.Show; + frmMain.lstOutput.Show; + Plugin_VisibleControlChange(CTRL_OUTPUT, True); + end; + + with TPawnCompileThread.Create(True) do begin + FileName := eFile; + Compiler := frmSettings.txtPAWNCompilerPath.Text; + if DirectoryExists(frmSettings.txtPAWNOutput.Text) then + Target := IncludeTrailingPathDelimiter(frmSettings.txtPAWNOutput.Text) + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx') + else + Target := ChangeFileExt(eFile, '.amxx'); + + Args := frmSettings.txtPAWNArgs.Text; + if Args <> '' then + Args := Args + #32; + Flags := eFlags; + + Resume; + end; +end; + +{ TPAWNCompileThread } + +procedure TPAWNCompileThread.ProcessItem(eLineStr: String); +var eLine: Integer; + eTemp: String; +begin + eLine := -1; + if Pos(LowerCase(FileName), LowerCase(eLineStr)) = 1 then begin + Delete(eLineStr, 1, Length(FileName)); + if IsNumeric(Between(eLineStr, '(', ')')) then + eLine := StrToInt(Between(eLineStr, '(', ')')); + + eTemp := Between(eLineStr, ':', ':'); + + Delete(eLineStr, 1, Pos(':', eLineStr) +1); + Delete(eLineStr, 1, Pos(':', eLineStr) +1); + if eLineStr <> '' then + eLineStr[1] := UpperCase(eLineStr[1])[1]; + if Pos('error', eTemp) <> 0 then + eLineStr := Format(lError, [Trim(eLineStr), eLine]) + else if Pos('warning', eTemp) <> 0 then + eLineStr := Format(lWarning, [Trim(eLineStr), eLine]) + else + eLineStr := Format(lOther, [Trim(eLineStr), eLine]); + end; + + if frmMain.lstOutput.ItemIndex = -1 then begin + if Pos('error', eTemp) <> 0 then begin + frmMain.lstOutput.SetFocus; + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add(eLineStr); + frmMain.SetErrorLine(eLine); + end + else if eLineStr = 'Done.' then begin + if (DirectoryExists(GetAMXXDir(True) + 'plugins\')) and (GetAMXXDir(True) <> '') then begin + if LowerCase(IncludeTrailingPathDelimiter(frmSettings.txtPAWNOutput.Text)) <> LowerCase(GetAMXXDir(True) + 'plugins\') then begin + if FileExists(GetAMXXDir(True) + 'plugins\' + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')) then + DeleteFile(PChar(GetAMXXDir(True) + 'plugins\' + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx'))); + if frmSettings.txtPAWNOutput.Text = '' then + CopyFile(PChar(ChangeFileExt(ActiveDoc.FileName, '.amxx')), PChar(GetAMXXDir(True) + 'plugins\' + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')), False) + else + CopyFile(PChar(frmSettings.txtPAWNOutput.Text + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')), PChar(GetAMXXDir(True) + 'plugins\' + ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')), False); + frmMain.lstOutput.Items.Add('Copied output file to: ' + GetAMXXDir(True)+ 'plugins\'); + end; + end; + + if Flags = COMP_STARTHL then // Start HL + Synchronize(StartHL) + else if Flags = COMP_UPLOAD then + Synchronize(Upload) + else begin + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add('Done.'); + frmMain.lstOutput.Perform(WM_VSCROLL, SB_BOTTOM, 0); + end; + Plugin_Compile(Flags, GetCurrLang.Name, ActiveDoc.FileName, False); + end + else begin + frmMain.lstOutput.Items.Add(eLineStr); + frmMain.lstOutput.Perform(WM_VSCROLL, SB_BOTTOM, 0); + end; + end + else + frmMain.lstOutput.Items.Add(eLineStr); +end; + +procedure TPAWNCompileThread.AddOutput; +var i, eIndex: integer; +begin + if Output.Count > 1 then begin + eIndex := frmMain.lstOutput.ItemIndex; + frmMain.lstOutput.Items.BeginUpdate; + frmMain.lstOutput.Items.Clear; + if Finished then begin + for i := 0 to Output.Count -1 do + ProcessItem(Output[i]); + end + else begin + for i := 0 to Output.Count -2 do + ProcessItem(Output[i]); + end; + frmMain.lstOutput.Items.EndUpdate; + frmMain.lstOutput.ItemIndex := eIndex; + frmMain.Repaint; + Application.ProcessMessages; + end; +end; + +procedure TPAWNCompileThread.Execute; +var StartupInfo: TStartupInfo; + ProcessInfo: TProcessInformation; + SecurityAttr: TSecurityAttributes; + PipeOutputRead: THandle; + PipeOutputWrite: THandle; + PipeErrorsRead: THandle; + PipeErrorsWrite: THandle; + Succeed: Boolean; + Buffer: array[0..255] of Char; + NumberOfBytesRead: DWORD; +begin + Output := TStringList.Create; + FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); + FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); + SecurityAttr.nLength := SizeOf(SecurityAttr); + SecurityAttr.bInheritHandle := True; + SecurityAttr.lpSecurityDescriptor := nil; + CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); + CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); + FillChar(StartupInfo, SizeOf(TStartupInfo), 0); + StartupInfo.cb := SizeOf(StartupInfo); + StartupInfo.hStdInput := 0; + StartupInfo.hStdOutput := PipeOutputWrite; + StartupInfo.hStdError := PipeErrorsWrite; + StartupInfo.wShowWindow := SW_HIDE; + StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; + if CreateProcess(nil, PChar(Compiler + ' "' + FileName + '" ' + Args + '"-o' + Target + '"'), nil, nil, True, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin + CloseHandle(PipeOutputWrite); + CloseHandle(PipeErrorsWrite); + + Stream := TStringStream.Create(''); + try + Finished := False; + while True do begin + Succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil); + if not Succeed then break; + Stream.Write(Buffer, NumberOfBytesRead); + Output.Text := Stream.DataString; + Synchronize(AddOutput); + end; + Finished := True; + Synchronize(AddOutput); + finally + Stream.Free; + end; + CloseHandle(PipeOutputRead); + try + while True do begin + Succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil); + if not Succeed then Break; + { and here the errors } + end; + finally + end; + CloseHandle(PipeErrorsRead); + WaitForSingleObject(ProcessInfo.hProcess, INFINITE); + CloseHandle(ProcessInfo.hProcess); + end + else begin + CloseHandle(PipeOutputRead); + CloseHandle(PipeOutputWrite); + CloseHandle(PipeErrorsRead); + CloseHandle(PipeErrorsWrite); + end; + Screen.Cursor := crDefault; + Output.Free; +end; + +procedure TPAWNCompileThread.StartHL; +begin + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add('Done.'); + frmMain.lstOutput.Items.Add(''); + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add(lStartingHalfLife); + if (FileExists(frmSettings.txtHLExec.Text)) and (frmSettings.txtHLExec.Text <> '') then begin + ShellExecute(frmMain.Handle, 'open', PChar(frmSettings.txtHLExec.Text), PChar(frmSettings.txtCustomParameters.Text), PChar(ExtractFilePath(frmSettings.txtHLExec.Text)), SW_SHOW); + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add('Done.'); + end + else begin + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add(lHLNotFound); + frmMain.lstOutput.ItemIndex := frmMain.lstOutput.Items.Add(lCheckSettingsTryAgain); + MessageBeep(MB_ICONWARNING); + end; +end; + +procedure TPAWNCompileThread.Upload; +procedure AddOutput(eItem: String); +var eAddedIndex: Integer; +begin + eAddedIndex := frmMain.lstOutput.Items.Add(eItem); + + frmMain.lstOutput.ItemIndex := eAddedIndex; + repeat + Delay(50); + frmMain.lstOutput.Repaint; + until frmMain.lstOutput.ItemIndex = eAddedIndex; +end; + +begin + AddOutput('Done.'); + if frmMain.IdFTP.Connected then + frmMain.IdFTP.Disconnect; + + AddOutput(''); + AddOutput(lConnecting); + + if TryConnect = 0 then begin + AddOutput(lChangingDir); + + try + frmMain.IdFTP.ChangeDir(frmSettings.txtDefaultDir.Text + 'plugins/'); + AddOutput(lUploadingFile); + except + MessageBox(frmMain.Handle, PChar(lInvalidDirectory), PChar(Application.Title), MB_ICONERROR); + AddOutput(lUploadFailed); + + if frmMain.IdFTP.Connected then + frmMain.IdFTP.Disconnect; + exit; + end; + + try + frmMain.IdFTP.TransferType := ftBinary; + frmMain.IdFTP.Put(Target, ExtractFileName(Target)); + AddOutput(lDone); + except + on E: Exception do begin + MessageBox(frmMain.Handle, PChar(lErrorUpload + #13 + E.Message), PChar(Application.Title), MB_ICONERROR); + AddOutput(lUploadFailed); + end; + end; + + if frmMain.IdFTP.Connected then + frmMain.IdFTP.Disconnect; + end + else + AddOutput(lUploadFailed); +end; + +end. + diff --git a/editor/studio/UnitLanguages.pas b/editor/studio/UnitLanguages.pas new file mode 100755 index 00000000..959baf4c --- /dev/null +++ b/editor/studio/UnitLanguages.pas @@ -0,0 +1,164 @@ +unit UnitLanguages; + +interface + +uses SysUtils, IniFiles; + +var lInvalidFile: String; + lWarnHighlighterReset: String; + lHighlighterResetDone: String; + lModified: String; + lLnCh: String; + lCloseModify: String; + lSelectOutputPAWN: String; + lSelectOutputCPP: String; + lDynamic: String; + lOutputHint: String; + lAddCodeSnippetCaption: String; + lAddCodeSnippetPrompt: String; + lEmptyCodeSnippetTitle: String; + lCodeSnippetExists: String; + lEnterSearchText: String; + lPrintSelection: String; + lNoFilesToSave: String; + lSaveAllCaption1: String; + lSaveAllCaption2: String; + lCloseAllCaption1: String; + lCloseAllCaption2: String; + lNoMIRCWindowOpen: String; + lSelectChannel: String; + lSelectChannelPrompt: String; + lWarnBigPluginPaste: String; + lConnect: String; + lConnecting: String; + lDisconnect: String; + lLoginIncorrect: String; + lHostNotFound: String; + lConnectionRefused: String; + lWrongPort: String; + lScanning: String; + lFillInEachField: String; + lPastingCodeEscStop: String; + lInvalidDirectory: String; + lFailedLoadNotes: String; + lPAWNCompilerNotFound: String; + lError: String; + lWarning: String; + lOnLine: String; + lOther: String; + lStartingHalfLife: String; + lHLNotFound: String; + lCheckSettingsTryAgain: String; + lUploadingFile: String; + lErrorUpload: String; + lChangingDir: String; + lDone: String; + lUploadFailed: String; + lNoUntitledRegister: String; + lAlreadyRegistered: String; + lSuccessfulRegistered: String; + lFailedUpdatePluginsIni: String; + lInternetExplorerRequired: String; + lUseMOTDAgain: String; + lName: String; + lType: String; + lValue: String; + lVariable: String; + lAddItemCaption: String; + lAddItemPrompt: String; + lEnterTitle: String; + lAddItems: String; + lInvalidPlugin: String; + lPlayersAlreadyAdded: String; + lFailedLoadCache: String; + lAlreadyUnLoaded: String; + lAlreadyLoaded: String; + lSelectAMXXCaption: String; + lPluginError: String; + lSaveCaption: String; + lCloseCaption: String; + lNoCPP: String; + +procedure ResetToEnglish; + +implementation + +procedure ResetToEnglish; +begin + // Messages + lInvalidFile := 'The file couldn''t be found. Check the path and try again.'; + lWarnHighlighterReset := 'Warning: All settings concerning the editor will be reset to default. Continue?'; + lHighlighterResetDone := 'Reset successful. Restart AMXX-Studio and the changes will take affect.'; + lModified := 'Modified'; + lLnCh := 'Ln %u Ch %u'; + lCloseModify := 'The file "%s" has been modified. Save it before closing?'; + lSelectOutputPAWN := 'Please select the default output folder for compiled PAWN Plug-Ins:'; + lSelectOutputCPP := 'Please select the default output folder for compiled C++ libraries:'; + lDynamic := 'Dynamic'; + lOutputHint := 'The output will be copied to the source''s directory.'; + lAddCodeSnippetCaption := 'Add Code-Snippet'; + lAddCodeSnippetPrompt := 'Please enter the title of the new Code-Snippet:'; + lEmptyCodeSnippetTitle := 'You have to enter a title before adding a new Code-Snippet!'; + lCodeSnippetExists := 'The entered Code-Snippet is already added. Please select another title.'; + lEnterSearchText := 'You forgot to enter the text you want to search.'; + lPrintSelection := 'Print only selection?'; + lNoFilesToSave := 'There are no modified files to save!'; + lSaveAllCaption1 := 'Save all files'; + lSaveAllCaption2 := 'Please select all files you want to save:'; + lCloseAllCaption1 := 'Close all files'; + lCloseAllCaption2 := 'Please select all files you want to close:'; + lNoMIRCWindowOpen := 'You have to open mIRC first to use IRC Paster!'; + lSelectChannel := 'Select channel'; + lSelectChannelPrompt := 'Please enter the channel the code shall be sent to:'; + lWarnBigPluginPaste := 'Warning: The plugin is quite large, if you post it to a channel it MAY result in a ban. Are you sure to paste it?'; + lConnect := 'Connect'; + lConnecting := 'Connecting...'; + lDisconnect := 'Disconnect'; + lLoginIncorrect := 'Login incorrect. Check your FTP settings and try again.'; + lHostNotFound := 'The entered host couldn''t be found. Check your settings and try again.'; + lConnectionRefused := 'The host refused the connection. Check your port and try again.'; + lWrongPort := 'The port you entered is definitely wrong. Check it and try again.'; + lScanning := 'Scanning...'; + lFillInEachField := 'Please fill in each field!'; + lPastingCodeEscStop := 'Pasting Code, press Esc to stop...'; + lInvalidDirectory := 'Could not change FTP directory. Update it and try again.'; + lFailedLoadNotes := 'Failed to load the notes!'; + lPAWNCompilerNotFound := 'PAWN compiler not found. Please check your settings and try again.'; + lError := 'Error: %s on line %u'; + lWarning := 'Warning: %s on line %u'; + lOther := '%s on line %u'; + lStartingHalfLife := 'Starting Half-Life...'; + lHLNotFound := 'Could not find the set Half-Life executable.'; + lCheckSettingsTryAgain := 'Check your settings and try again.'; + lUploadingFile := 'Done, uploading file...'; + lErrorUpload := 'Failed to upload the plugin:'; + lChangingDir := 'Connected, changing directory...'; + lDone := 'Done.'; + lUploadFailed := 'Upload failed!'; + lNoUntitledRegister := 'You cannot register an untitled document'; + lAlreadyRegistered := 'This plugin is already registered!'; + lSuccessfulRegistered := 'The plugin has been registered successfully!'; + lFailedUpdatePluginsIni := 'Failed to update plugins.ini!'; + lInternetExplorerRequired := 'Microsoft Internet Explorer 6.0 is required to use this function.'; + lUseMOTDAgain := 'When you finished, use this function again to convert the HTML code to a PAWN string.'; + lName := 'Name'; + lType := 'Type'; + lValue := 'Value'; + lVariable := 'Variable'; + lAddItemCaption := 'Add menu item'; + lAddItemPrompt := 'Please enter the menu item you want to add:'; + lEnterTitle := 'You forgot to enter a title!'; + lAddItems := 'You forgot to add the menu items!'; + lInvalidPlugin := 'Couldn''t find the register_plugin()-event. Add it and try again.'; + lPlayersAlreadyAdded := 'PLAYERS item is already added!'; + lFailedLoadCache := 'Failed to load file cache!'; + lAlreadyUnLoaded := 'Plugin is already unloaded!'; + lAlreadyLoaded := 'Plugin is already loaded!'; + lSelectAMXXCaption := 'Please select the AMX Mod X directory on your listen server:'; + lPluginError := 'A plugin raised this error:'; + lSaveCaption := 'Save'; + lCloseCaption := 'Close'; + lNoCPP := 'Sorry, the C++ IDE is not enabled.'; +end; + +end. diff --git a/editor/studio/UnitMainTools.pas b/editor/studio/UnitMainTools.pas new file mode 100755 index 00000000..1663425e --- /dev/null +++ b/editor/studio/UnitMainTools.pas @@ -0,0 +1,1196 @@ +unit UnitMainTools; + +interface + +uses SysUtils, Classes, Windows, Forms, Controls, SpTBXTabs, TBX, SciLexer, + SciLexerMemo, ExtCtrls, Graphics, sciKeyBindings, ComCtrls, TB2Item, + sciLexerMod, ScintillaLanguageManager, Menus, SpTBXItem, Registry, + ShellApi, DDEMan, IdFTP, IdFTPList, IdException, JvInspector; + +type TDocument = class(TCollectionItem) + private + FSelLength: Integer; + FSelStart: Integer; + FFileName: String; + FCode: TStringList; + FReadOnly: Boolean; + FTopLine: Integer; + FHighlighter: String; + FTitle: String; + FModified: Boolean; + FNotesText: String; + procedure SetFileName(const Value: String); + published + property FileName: String read FFileName write SetFileName; + property Title: String read FTitle write FTitle; + property Code: TStringList read FCode write FCode; + property SelStart: Integer read FSelStart write FSelStart; + property SelLength: Integer read FSelLength write FSelLength; + property Highlighter: String read FHighlighter write FHighlighter; + property ReadOnly: Boolean read FReadOnly write FReadOnly; + property TopLine: Integer read FTopLine write FTopLine; + property Modified: Boolean read FModified write FModified; + property NotesText: String read FNotesText write FNotesText; + public + constructor Create(ACollection: TCollection; AHighlighter: String); reintroduce; + destructor Destroy; reintroduce; + function Untitled: Boolean; + function Save: Boolean; +end; + +type TDocCollection = class(TCollection) + private + FHighlighter: String; + FActiveDocument: TDocument; + public + constructor Create(AHighlighter: String); reintroduce; + function Add(AFilename: String; AHighlighter: String = ''): TDocument; reintroduce; + function Open(AFilename: String; AHighlighter: String = ''): Integer; + function Save(AIndex: Integer; AFilename: String = ''): Boolean; + procedure Close(AIndex: Integer); + procedure Activate(Document: Integer; RestoreCaret: Boolean; SaveLastDoc: Boolean = True); overload; + procedure Activate(Document: TDocument; RestoreCaret: Boolean; SaveLastDoc: Boolean = True); overload; + published + property Highlighter: String read FHighlighter write FHighlighter; + property ActiveDocument: TDocument read FActiveDocument write FActiveDocument; +end; + +type TStringArray = array of string; + +function GetMenuItem(Caption: String; eParent: TTBCustomItem = nil): TTBCustomItem; + +procedure LoadPlugins; +function GetAllIncludeFiles: TStringArray; +function GetCurrLang(FileName: String = ''): TSciLangItem; +procedure FillCodeExplorer(Lang: String); +function IEInstalled: Boolean; +function GetAMXXDir(ListenServer: Boolean): String; + +function CloseDocument(eDocument: TDocument; SaveActiveDoc: Boolean = False): Boolean; +function AddExtension(eFilename, eHighlighter: String): String; + +function ShowColorDialog(var Color: TColor; ePaintImage: TImage): Boolean; + +procedure LoadCodeSnippets(Lang: String); +procedure SetProgressStatus(eStatus: String); +function IsNumeric(eText: String): Boolean; +procedure ActivateProjects(Index: Integer; JumpToLastDoc: Boolean); +procedure ReloadIni; +procedure SelectLanguage(Lang: String); + +procedure ShowProgress; +procedure HideProgress; + +procedure mIRCDDE(Service, Topic, Cmd: string); +function mIRCGet(Service, Topic, Item: string): String; + +function GetAllDirs: TStringList; +procedure SetProxySettings; +function TryConnect: Integer; + +var PAWNProjects: TDocCollection; + CPPProjects: TDocCollection; + OtherProjects: TDocCollection; + + Started: Boolean; + ActiveDoc: TDocument; + Cancel: Boolean; + + OldPercent: Integer; // We don't need to update caption when the new percentage equals to the old + CurrProjects: Integer; + + +implementation + +uses UnitfrmMain, UnitfrmSettings, UnitLanguages, UnitfrmSelectColor, + UnitCodeSnippets, UnitTextAnalyze, UnitCodeUtils, UnitfrmAutoIndent, + UnitPlugins; + +function GetMenuItem(Caption: String; eParent: TTBCustomItem = nil): TTBCustomItem; +var i: integer; +begin + Result := nil; + if eParent = nil then begin + for i := 0 to frmMain.tbxMenu.Items.Count -1 do begin + if frmMain.tbxMenu.Items[i].Caption = Caption then begin + Result := frmMain.tbxMenu.Items[i]; + break; + end + else if frmMain.tbxMenu.Items[i].Count <> 0 then begin + Result := GetMenuItem(Caption, frmMain.tbxMenu.Items[i]); + if Assigned(Result) then + break; + end; + end; + end + else begin + for i := 0 to eParent.Count -1 do begin + if eParent.Items[i].Caption = Caption then begin + Result := eParent.Items[i]; + break; + end + else if eParent.Items[i].Count <> 0 then begin + Result := GetMenuItem(Caption, eParent.Items[i]); + if Assigned(Result) then + break; + end; + end; + end; +end; + +procedure LoadPlugins; +var i: integer; + ePConfig: TStringList; + eRec: TSearchRec; + eFound: Boolean; + eItem: TListItem; +begin + ePConfig := TStringList.Create; + ePConfig.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\plugins.cfg'); + if FindFirst(ExtractFilePath(ParamStr(0)) + 'plugins\*.dll', faAnyFile, eRec) = 0 then begin + repeat + if (eRec.Name[1] <> '.') and (eRec.Attr and faDirectory <> faDirectory) then begin + eFound := False; + for i := 0 to ePConfig.Count -1 do begin + if Pos(#32 + eRec.Name, ePConfig[i]) <> 0 then begin + // We don't need to handle unloaded plugins... + if Pos('LOADED', ePConfig[i]) = 1 then begin // Loaded + eItem := frmSettings.lvPlugins.Items.Add; + eItem.Caption := '-'; + eItem.SubItems.Add(eRec.Name); + eItem.SubItems.Add('-'); + eItem.SubItems.Add('Unloaded'); + LoadPlugin(eItem); + eFound := True; + end; + break; + end; + end; + + if not eFound then begin + with frmSettings.lvPlugins.Items.Add do begin + Caption := '-'; + SubItems.Add(eRec.Name); + SubItems.Add('-'); + SubItems.Add('Unloaded'); + end; + end; + end; + until FindNext(eRec) <> 0; + end; + ePConfig.Free; +end; + +function GetAllIncludeFiles: TStringArray; +var eSearchRec: TSearchRec; + eStr: TStringList; + i: integer; +begin + eStr := TStringList.Create; + if GetAMXXDir(False) <> '' then begin + if FindFirst(GetAMXXDir(False) + 'scripting\include\*.inc', faAnyFile, eSearchRec) = 0 then begin + repeat + if (eSearchRec.Name[1] <> '.') and (eSearchRec.Attr and faDirectory <> faDirectory) then + eStr.Add(eSearchRec.Name); + until (FindNext(eSearchRec) <> 0); + end; + if FindFirst(GetAMXXDir(False) + 'scripting\*.inc', faAnyFile, eSearchRec) = 0 then begin + repeat + if (eSearchRec.Name[1] <> '.') and (eSearchRec.Attr and faDirectory <> faDirectory) then + eStr.Add(eSearchRec.Name); + until (FindNext(eSearchRec) <> 0); + end; + end; + + if (not ActiveDoc.Untitled) then begin + if FindFirst(GetAMXXDir(False) + 'scripting\include\*.inc', faAnyFile, eSearchRec) = 0 then begin + repeat + if (eSearchRec.Name[1] <> '.') and (eSearchRec.Attr and faDirectory <> faDirectory) then + eStr.Add(eSearchRec.Name); + until (FindNext(eSearchRec) <> 0); + end; + end; + + SetLength(Result, eStr.Count); + for i := 0 to eStr.Count -1 do + Result[i] := eStr[i]; + + eStr.Free; +end; + + +function GetCurrLang(FileName: String = ''): TSciLangItem; +var eExt, eLang: String; +begin + if FileName = '' then + eExt := LowerCase(ExtractFileExt(ActiveDoc.FileName)) + else + eExt := LowerCase(ExtractFileExt(FileName)); + + if (eExt = '.sma') or (eExt = '.inc') then + eLang := 'Pawn' + else if (eExt = '.cpp') or (eExt = '.h') then + eLang := 'C++' + else if (eExt = '.htm') or (eExt = '.html') then + eLang := 'HTML' + else if (eExt = '.xml') then + eLang := 'XML' + else if (eExt = '.sql') then + eLang := 'SQL' + else + eLang := 'null'; + + Result := frmMain.sciEditor.LanguageManager.LanguageList.Find(eLang); +end; + +procedure FillCodeExplorer(Lang: String); +function AddItem(eParent: TTreeNode; eText: String): TTreeNode; +begin + if eParent = nil then + Result := frmMain.trvExplorer.Items.Add(nil, eText) + else + Result := frmMain.trvExplorer.Items.AddChild(eParent, eText); + + with Result do begin + ImageIndex := 42; + SelectedIndex := 42; + end; +end; + +var eTemp: TTreeNode; +begin + frmMain.trvExplorer.Items.BeginUpdate; + if (Lang = 'Pawn') then begin // Pawn + AddItem(nil, 'Constants'); + eTemp := AddItem(nil, 'Defined'); + AddItem(eTemp, 'CVars'); + AddItem(nil, 'Forwards'); + AddItem(nil, 'Included'); + eTemp := AddItem(nil, 'Methods'); + AddItem(eTemp, 'Default'); + AddItem(eTemp, 'Events'); + AddItem(eTemp, 'Stocks'); + AddItem(nil, 'Natives'); + AddItem(nil, 'Variables'); + end; + frmMain.trvExplorer.Items.EndUpdate; +end; + +function IEInstalled: Boolean; +var eReg: TRegistry; + eVersion: String; +begin + eReg := TRegistry.Create(KEY_READ); + with eReg do begin + RootKey := HKEY_LOCAL_MACHINE; + OpenKey('Software\Microsoft\Internet Explorer', False); + if ValueExists('Version') then + eVersion := ReadString('Version') + else + eVersion := ''; + CloseKey; + Free; + end; + Result := Pos('6.0', eVersion) = 1; +end; + +function GetAMXXDir(ListenServer: Boolean): String; +begin + if Started then begin + if ListenServer then + Result := frmSettings.txtAMXXDir.Text + else if Length(frmSettings.txtPAWNCompilerPath.Text) > 8 then + Result := IncludeTrailingPathDelimiter(Copy(ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text), 1, Length(ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text)) - 10)) + else + Result := ''; + end + else + Result := ''; +end; + +function CloseDocument(eDocument: TDocument; SaveActiveDoc: Boolean = False): Boolean; +var Collection: TDocCollection; +begin + case frmMain.tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; + 1: Collection := CPPProjects; + else Collection := OtherProjects; + end; + Result := True; + + if (eDocument.Modified) then begin + case MessageBox(frmMain.Handle, PChar(Format(lCloseModify, [ExtractFileName(eDocument.FileName)])), PChar(Application.Title), MB_ICONQUESTION + MB_YESNOCANCEL) of + mrYes: begin + frmMain.mnuSave.Click; + if not eDocument.Untitled then + Collection.Close(eDocument.Index); + end; + mrNo: Collection.Close(eDocument.Index); + mrCancel: Result := False; + end; + end + else + Collection.Close(eDocument.Index); +end; + +function AddExtension(eFilename, eHighlighter: String): String; +begin + if ExtractFileExt(eFilename) = '' then begin + if eHighlighter = 'Pawn' then + Result := eFilename + '.sma'; + if eHighlighter = 'C++' then + Result := eFilename + '.cpp'; + if eHighlighter = 'HTML' then + Result := eFilename + '.html'; + if eHighlighter = 'SQL' then + Result := eFilename + '.sql'; + if eHighlighter = 'XML' then + Result := eFilename + '.xml'; + end + else + Result := eFilename; +end; + +procedure LoadCodeSnippets(Lang: String); +var i: integer; + CSItem: TSpTBXItem; +begin + for i := frmMain.tbxCodeSnippets.Items.Count -1 downto 5 do + frmMain.tbxCodeSnippets.Items.Delete(i); + + with GetSnippetList(Lang) do begin + for i := 0 to Count -1 do begin + CSItem := TSpTBXItem.Create(frmMain.tbxCodeSnippets); + CSItem.Caption := Strings[i]; + CSItem.OnClick := frmMain.OnCodeSnippetClick; + frmMain.tbxCodeSnippets.Items.Add(CSItem); + end; + end; +end; + +function ShowColorDialog(var Color: TColor; ePaintImage: TImage): Boolean; +begin + frmSelectColor.Hexa.SelectedColor := Color; + frmSelectColor.HSL.SelectedColor := Color; + frmSelectColor.chkDefault1.Checked := Color = clDefault; + frmSelectColor.chkDefault2.Checked := Color = clDefault; + frmSelectColor.OldSwatch.Color := Color; + Result := frmSelectColor.ShowModal = mrOk; + if Result then begin + if frmSelectColor.chkDefault1.Checked then + Color := clDefault + else + Color := frmSelectColor.NewSwatch.Color; + + ePaintImage.Canvas.Pen.Color := $008396A0; + ePaintImage.Canvas.Brush.Color := Color; + ePaintImage.Canvas.Rectangle(0, 0, ePaintImage.Width, ePaintImage.Height); + end; +end; + +procedure SetProgressStatus(eStatus: String); +var Percent: Integer; +begin + if not Started then exit; + + if (frmMain.pbLoading.Position <> frmMain.pbLoading.Max) and (frmMain.pbLoading.Max <> 0) then + Percent := Round((frmMain.pbLoading.Position / frmMain.pbLoading.Max) * 100) + else + Percent := 0; + + if frmMain.pbLoading.Caption = IntToStr(Percent) + '% - ' + eStatus then exit; + OldPercent := Percent; + + frmMain.pbLoading.Caption := IntToStr(Percent) + '% - ' + eStatus; +end; + + +function IsNumeric(eText: String): Boolean; +var i: integer; +begin + Result := Length(eText) > 0; + if Result then begin + for i := 1 to Length(eText) do + Result := (Result) and (Pos(eText[i], '0123456789') <> 0); + end; +end; + +procedure ActivateProjects(Index: Integer; JumpToLastDoc: Boolean); +var Collection: TDocCollection; + i: integer; + TabItem: TSpTBXTabItem; + OldIndex: Integer; +begin + if not Plugin_ProjectsChange(CurrProjects, Index, True) then begin + Started := False; + frmMain.tsMain.ActiveTabIndex := CurrProjects; + Started := True; + exit; + end; + + OldIndex := CurrProjects; + + with frmMain do begin + // no save here, it saves when another tab is being activated... + + case Index of + 0: Collection := PAWNProjects; // PAWN + 1: Collection := CPPProjects; // C++ + else Collection := OtherProjects; // Other + end; + + + Started := False; // dont run this command twice + frmMain.tsMain.Items[Index].Checked := True; // select tab + CurrProjects := Index; + Started := True; + + tsDocuments.Items.Clear; + for i := 0 to Collection.Count -1 do begin + TabItem := TSpTBXTabItem.Create(tsDocuments); + TabItem.Caption := TDocument(Collection.Items[i]).Title; + TabItem.OnSelect := frmMain.OnTabSelect; + tsDocuments.Items.Add(TabItem); + end; + + Plugin_ProjectsChange(OldIndex, Index, False); + + if JumpToLastDoc then begin + Started := False; + tsDocuments.Items[Collection.ActiveDocument.Index].Checked := True; + Collection.Activate(Collection.ActiveDocument.Index, True); + Started := True; + end; + end; +end; + +procedure ReloadIni; +var i: integer; + KeyCommand: TSciKeyCommand; + Item: TListItem; + Ident: string; +begin + //> INI-Values eConfig.ReadString('Misc', 'Theme', 'Office11Adaptive')) then + TBXSetTheme(eConfig.ReadString('Misc', 'Theme', 'Office11Adaptive')); + //> Update Settings-Dialog 'No Command' then begin // Important for Control Chars, the user mustn't change the values for it... + Item := frmSettings.lvShortcuts.Items.Add; + Item.Caption:= Ident; + Item.SubItems.Add(ShortCutToText(KeyCommand.ShortCut)); + Item.Data := KeyCommand; + end; + end; + finally + frmSettings.lvShortcuts.Items.EndUpdate; + end; + { FTP Settings } + frmSettings.txtHost.Text := eConfig.ReadString('FTP', 'Host', ''); + frmSettings.txtPort.Text := eConfig.ReadString('FTP', 'Port', '21'); + frmSettings.txtUsername.Text := eConfig.ReadString('FTP', 'Username', ''); + frmSettings.txtPassword.Text := eConfig.ReadString('FTP', 'Password', ''); + frmSettings.txtDefaultDir.Text := eConfig.ReadString('FTP', 'DefaultDir', ''); + frmSettings.chkPassive.Checked := eConfig.ReadBool('FTP', 'Passive', True); + + with frmMain.IdFTP do begin + Host := frmSettings.txtHost.Text; + Port := StrToInt(frmSettings.txtPort.Text); + Username := frmSettings.txtUsername.Text; + Password := frmSettings.txtPassword.Text; + Passive := frmSettings.chkPassive.Checked; + end; + { FTP Proxy } + frmSettings.cboProxy.ItemIndex := eConfig.ReadInteger('Proxy', 'ProxyType', 0); + frmSettings.txtProxyHost.Text := eConfig.ReadString('Proxy', 'Host', ''); + frmSettings.txtProxyPort.Text := eConfig.ReadString('Proxy', 'Port', '8080'); + frmSettings.txtUsername.Text := eConfig.ReadString('Proxy', 'Username', ''); + frmSettings.txtProxyPassword.Text := eConfig.ReadString('Proxy', 'Password', ''); + + SetProxySettings; + { Compiler } + frmSettings.txtPAWNCompilerPath.Text := eConfig.ReadString('Pawn-Compiler', 'Path', ''); + frmSettings.txtPAWNArgs.Text := eConfig.ReadString('Pawn-Compiler', 'Args', ''); + frmSettings.txtPAWNOutput.Text := IncludeTrailingPathDelimiter(eConfig.ReadString('Pawn-Compiler', 'DefaultOutput', '')); + if frmSettings.txtPAWNOutput.Text = '\' then + frmSettings.txtPAWNOutput.Text := ''; + frmSettings.txtCPPCompilerPath.Text := eConfig.ReadString('CPP-Compiler', 'Path', ''); + frmSettings.txtCPPCompilerArguments.Text := eConfig.ReadString('CPP-Compiler', 'Args', ''); + frmSettings.txtCPPOutput.Text := IncludeTrailingPathDelimiter(eConfig.ReadString('CPP-Compiler', 'DefaultOutput', '')); + if frmSettings.txtCPPOutput.Text = '\' then + frmSettings.txtCPPOutput.Text := ''; + { HL } + frmSettings.txtHLExec.Text := eConfig.ReadString('Half-Life', 'Filename', ''); + frmSettings.txtCustomParameters.Text := eConfig.ReadString('Half-Life', 'Params', ''); + frmSettings.txtAMXXDir.Text := IncludeTrailingPathDelimiter(eConfig.ReadString('Half-Life', 'AMXXListen', '')); + if frmSettings.txtAMXXDir.Text = '\' then + frmSettings.txtAMXXDir.Text := ''; + { Code-Snippets } + frmSettings.ftcCodeSnippets.ActiveTab := 0; + { Misc } + frmSettings.txtDefaultName.Text := eConfig.ReadString('Misc', 'DefaultPluginName', 'New Plug-In'); + frmSettings.txtDefaultVersion.Text := eConfig.ReadString('Misc', 'DefaultPluginVersion', '1.0'); + frmSettings.txtDefaultAuthor.Text := eConfig.ReadString('Misc', 'DefaultPluginAuthor', 'Your Name'); + case eConfig.ReadInteger('Misc', 'SaveNotesTo', 0) of + 0: frmSettings.optFileComment.Checked := True; + 1: frmSettings.optConfig.Checked := True; + else frmSettings.optDontSave.Checked := True; + end; + frmSettings.sldSpeed.Value := eConfig.ReadInteger('Misc', 'CPUSpeed', 5); + if frmSettings.sldSpeed.Value <> 0 then + eCPUSpeed := frmSettings.sldSpeed.Value + else + eCPUSpeed := 1; // otherwise the program would hang up + frmSettings.chkShowStatusbar.Checked := eConfig.ReadBool('Misc', 'ShowStatusbar', True); + frmMain.sbStatus.Visible := frmSettings.chkShowStatusbar.Checked; +end; + +procedure SelectLanguage(Lang: String); +begin + frmMain.sciEditor.LanguageManager.SelectedLanguage := Lang; + frmMain.mnuHPAWN.Checked := Lang = 'Pawn'; + frmMain.mnuHCPP.Checked := Lang = 'C++'; + frmMain.mnuHHTML.Checked := Lang = 'HTML'; + frmMain.mnuHSQL.Checked := Lang = 'SQL'; + frmMain.mnuHXML.Checked := Lang = 'XML'; + frmMain.mnuHNone.Checked := Lang = 'null'; +end; + +procedure ShowProgress; +var i: integer; +begin + if not Started then exit; + + frmMain.pnlLoading.Show; + for i := 0 to frmMain.tsDocuments.Items.Count -1 do + frmMain.tsDocuments.Items[i].Enabled := i = frmMain.tsDocuments.ActiveTabIndex; + for i := 0 to frmMain.tsMain.Items.Count -1 do + frmMain.tsMain.Items[i].Enabled := i = frmMain.tsMain.ActiveTabIndex; + for i := 0 to frmMain.tbxMenu.Items.Count -1 do + frmMain.tbxMenu.Items[i].Enabled := False; + for i := 0 to frmMain.tbxToolbar.Items.Count -1 do + frmMain.tbxToolbar.Items[i].Enabled := False; + for i := 0 to frmMain.tbxEdit.Items.Count -1 do + frmMain.tbxEdit.Items[i].Enabled := False; + for i := 0 to frmMain.tbxCodeSnippets.Items.Count -1 do + frmMain.tbxCodeSnippets.Items[i].Enabled := False; + for i := 0 to frmMain.tcTools.Items.Count -1 do + frmMain.tcTools.Items[i].Enabled := False; + frmMain.ppmDocuments.Items.Enabled := False; +end; + +procedure HideProgress; +var i: integer; +begin + if not Started then exit; + + frmMain.pnlLoading.Hide; + for i := 0 to frmMain.tsDocuments.Items.Count -1 do + frmMain.tsDocuments.Items[i].Enabled := True; + for i := 0 to frmMain.tsMain.Items.Count -1 do + frmMain.tsMain.Items[i].Enabled := True; + for i := 0 to frmMain.tbxMenu.Items.Count -1 do + frmMain.tbxMenu.Items[i].Enabled := True; + for i := 0 to frmMain.tbxToolbar.Items.Count -1 do + frmMain.tbxToolbar.Items[i].Enabled := True; + for i := 0 to frmMain.tbxEdit.Items.Count -1 do + frmMain.tbxEdit.Items[i].Enabled := True; + for i := 0 to frmMain.tbxCodeSnippets.Items.Count -1 do + frmMain.tbxCodeSnippets.Items[i].Enabled := True; + for i := 0 to frmMain.tcTools.Items.Count -1 do + frmMain.tcTools.Items[i].Enabled := True; + + frmMain.tiCPP.Enabled := eCPP; + frmMain.mnuNewHeaderCPP.Enabled := eCPP; + frmMain.mnuNewModule.Enabled := eCPP; + frmMain.mnuNewUnit.Enabled := eCPP; + + frmMain.ppmDocuments.Items.Enabled := True; +end; + +{ TDocument } + +constructor TDocument.Create(ACollection: TCollection; + AHighlighter: String); +begin + inherited Create(ACollection); + FHighlighter := TDocCollection(ACollection).Highlighter; + FCode := TStringList.Create; + FModified := False; +end; + +destructor TDocument.Destroy; +begin + inherited Destroy; + FCode.Free; +end; + +function TDocument.Save: Boolean; +var i: integer; + F: Textfile; + sLines: TStringList; + sNotes: String; + eFound: Boolean; +begin + if not Plugin_FileSave(FFilename, True) then begin + Result := False; + exit; + end; + + Result := True; + + ShowProgress; + try + AssignFile(F, FFilename); + Rewrite(F); + if ActiveDoc = Self then begin + sLines := TStringList(frmMain.sciEditor.Lines); + sNotes := GetRTFText(frmMain.rtfNotes); + end + else begin + sLines := Code; + sNotes := NotesText; + end; + + frmMain.pbLoading.Max := sLines.Count -1; + frmMain.pbLoading.Position := 0; + // ... save file... + for i := 0 to sLines.Count -1 do begin + if Cancel then begin + CloseFile(F); + Cancel := False; + exit; + end; + + WriteLn(F, sLines[i]); + frmMain.pbLoading.Position := i; + SetProgressStatus('Saving File...'); + Application.ProcessMessages; + end; + // ... and notes ... + if frmSettings.optFileComment.Checked then begin + WriteLn(F, GetCurrLang.CommentBoxStart + ' AMXX-Studio Notes - DO NOT MODIFY BELOW HERE'); + WriteLn(F, GetCurrLang.CommentBoxMiddle + sNotes); + WriteLn(F, GetCurrLang.CommentBoxEnd); + CloseFile(F); + end + else begin + CloseFile(F); + sLines := TStringList.Create; + + i := 0; // line 1 should be a comment + if FileExists(ParamStr(0) + 'config\Notes.dat') then + sLines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\Notes.dat') + else begin + sLines.Clear; // something must be wrong, clear + sLines.Add('AMXX-Studio Notes - DO NOT MODIFY THIS FILE'); + end; + + eFound := False; + if sLines.Count > 2 then begin + while i <> sLines.Count -1 do begin + Inc(i, 2); + if LowerCase(FFilename) = LowerCase(sLines[i -1]) then begin + sLines[i] := sNotes; + eFound := True; + break; + end; + end; + end; + + if not eFound then begin // no entry found + sLines.Add(FFilename); + sLines.Add(sNotes); + end; + sLines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\Notes.dat'); + sLines.Free; + end; + + FModified := False; + except + Result := False; + end; + + HideProgress; + Plugin_FileSave(FFilename, False); +end; + +procedure TDocument.SetFileName(const Value: String); +begin + FFileName := Value; + FTitle := '< ' + IntToStr(Index +1) + #32 + ExtractFileName(Value) + ' >'; +end; + +function TDocument.Untitled: Boolean; +begin + Result := Pos('\', FFilename) = 0; +end; + +{ TDocCollection } + +procedure TDocCollection.Activate(Document: Integer; RestoreCaret: Boolean; SaveLastDoc: Boolean = True); +begin + Activate(TDocument(Items[Document]), RestoreCaret, SaveLastDoc); +end; + +procedure TDocCollection.Activate(Document: TDocument; RestoreCaret: Boolean; SaveLastDoc: Boolean = True); +var i: integer; +begin + if not Plugin_DocChange(Document.Index, Document.FileName, Document.Highlighter, RestoreCaret, True) then begin + Started := False; + TSpTBXTabItem(frmMain.tsDocuments.Items[ActiveDoc.Index]).Checked := True; + Started := True; + exit; + end; + + Screen.Cursor := crHourGlass; + { Save old } + if SaveLastDoc then begin + ActiveDoc.Code.Text := frmMain.sciEditor.Lines.Text; // saving is fast, but loading is usually slow because of code-folding... + ActiveDoc.Highlighter := frmMain.sciEditor.LanguageManager.SelectedLanguage; + ActiveDoc.ReadOnly := frmMain.sciEditor.ReadOnly; + ActiveDoc.SelStart := frmMain.sciEditor.SelStart; + ActiveDoc.SelLength := frmMain.sciEditor.SelLength; + ActiveDoc.TopLine := frmMain.sciEditor.GetFirstVisibleLine; + ActiveDoc.Modified := frmMain.sciEditor.Modified; + ActiveDoc.NotesText := GetRTFText(frmMain.rtfNotes); + end; + { Other } + ActiveDoc := Document; // one global for save... + FActiveDocument := Document; // ... and one for switch + frmMain.sciEditor.EmptyUndoBuffer; + { Load new } + SelectLanguage(Document.Highlighter); + frmMain.sciEditor.Lines.Clear; + if Started then begin + Started := False; + frmMain.tsDocuments.Items[Document.Index].Checked := True; + if (frmMain.Canvas.TextWidth(Document.FileName) > frmMain.mnuFilename.CustomWidth) and (not Document.Untitled) then + frmMain.mnuFilename.Caption := ExtractFileName(Document.FileName) + else + frmMain.mnuFilename.Caption := Document.FileName; + Started := True; + end; + + if Document.Code.Count > 75 then begin + ShowProgress; + frmMain.pbLoading.Max := Document.Code.Count; + for i := 0 to Document.Code.Count -1 do begin + if Cancel then begin + Cancel := False; + exit; + end; + + frmMain.sciEditor.Lines.Add(Document.Code.Strings[i]); + frmMain.pbLoading.Position := i; + SetProgressStatus('Adding Code To Editor...'); + Application.ProcessMessages; + end; + HideProgress; + frmMain.sciEditor.EmptyUndoBuffer; + end + else + frmMain.sciEditor.Lines.Text := Document.Code.Text; + SetRTFText(frmMain.rtfNotes, Document.NotesText); + frmMain.sciEditor.ReadOnly := Document.ReadOnly; + + if Document.Modified then + frmMain.mnuModified.Caption := lModified + else + frmMain.mnuModified.Caption := ''; + frmMain.sciEditor.Modified := Document.Modified; + + if RestoreCaret then begin + if (eConfig.ReadBool('Editor', 'CheckRestoreCaret', True)) and (eConfig.ReadInteger('Editor', 'CheckRestoreLines', 600) < Document.Code.Count) then begin + Screen.Cursor := crDefault; + exit; + end; + + frmMain.sciEditor.LineScroll(0, (0 - frmMain.sciEditor.GetFirstVisibleLine) + Document.TopLine); + frmMain.sciEditor.SelStart := Document.SelStart; + frmMain.sciEditor.SelLength := Document.SelLength; + end; + Screen.Cursor := crDefault; + Plugin_DocChange(Document.Index, Document.FileName, Document.Highlighter, RestoreCaret, False); +end; + +function TDocCollection.Add(AFilename: String; AHighlighter: String = ''): TDocument; +var TabItem: TSpTBXTabItem; +begin + if AHighlighter = '' then + AHighlighter := Highlighter; + + Result := TDocument.Create(Self, AHighlighter); + with Result do begin + Highlighter := AHighlighter; + FileName := AFileName; + + if Filename = '' then begin // Empty document + if AHighlighter = 'Pawn' then begin + Title := '< ' + IntToStr(Count) + ' Untitled.sma >'; + FileName := 'Untitled.sma'; + end + else if AHighlighter = 'C++' then begin + Title := '< ' + IntToStr(Count) + ' Untitled.cpp >'; + FileName := 'Untitled.cpp'; + end + else if AHighlighter = 'HTML' then begin + Title := '< ' + IntToStr(Count) + ' Untitled.html >'; + FileName := 'Untitled.html'; + end + else if AHighlighter = 'SQL' then begin + Title := '< ' + IntToStr(Count) + ' Untitled.sql >'; + FileName := 'Untitled.sql'; + end + else if AHighlighter = 'XML' then begin + Title := '< ' + IntToStr(Count) + ' Untitled.xml >'; + FileName := 'Untitled.xml'; + end + else begin + Title := '< ' + IntToStr(Count) + ' Untitled.txt >'; + FileName := 'Untitled.txt'; + end; + end + else + Title := '< ' + IntToStr(Count) + #32 + ExtractFileName(AFilename) + ' >'; + + if not Started then exit; + + TabItem := TSpTBXTabItem.Create(frmMain.tsDocuments); + TabItem.Caption := Title; + TabItem.OnSelect := frmMain.OnTabSelect; + frmMain.tsDocuments.Items.Add(TabItem); + end; +end; + +procedure TDocCollection.Close(AIndex: Integer); +var Collection: TDocCollection; + i: integer; +begin + case frmMain.tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; + 1: Collection := CPPProjects; + else Collection := OtherProjects; + end; + + if Collection = Self then begin + frmMain.tsDocuments.Items.Delete(AIndex); + frmMain.tsDocuments.Refresh; + end; + + Delete(AIndex); + for i := 0 to Count -1 do + TDocument(Items[i]).Title := '< ' + IntToStr(i +1) + #32 + ExtractFileName(TDocument(Items[i]).FileName) + ' >'; + + if Collection = Self then begin + for i := 0 to frmMain.tsDocuments.Items.Count -1 do + TSpTBXTabItem(frmMain.tsDocuments.Items[i]).Caption := TDocument(Items[i]).Title; + end; + + if Count = 0 then + Add('', ''); + + if (AIndex < Count) then + Activate(AIndex, True, False) + else + Activate(0, True, False); +end; + +constructor TDocCollection.Create(AHighlighter: String); +begin + inherited Create(TDocument); + Highlighter := AHighlighter; + FActiveDocument := Add(''); +end; + +function TDocCollection.Open(AFilename: String; AHighlighter: String = ''): Integer; +var F: TextFile; + i: integer; + eString: String; + eLines: TStringList; +begin + Result := -1; + + if not Plugin_FileLoad(AFilename, True) then exit; + + if not FileExists(AFilename) then begin + MessageBox(frmMain.Handle, PChar(lInvalidFile), 'AMXX-Studio', MB_ICONWARNING); + exit; + end; + + if Assigned(ActiveDoc) then begin + ActiveDoc.Code.Text := frmMain.sciEditor.Lines.Text; // saving is fast, but loading is usually slow because of code-folding... + ActiveDoc.Highlighter := frmMain.sciEditor.LanguageManager.SelectedLanguage; + ActiveDoc.ReadOnly := frmMain.sciEditor.ReadOnly; + ActiveDoc.SelStart := frmMain.sciEditor.SelStart; + ActiveDoc.SelLength := frmMain.sciEditor.SelLength; + ActiveDoc.TopLine := frmMain.sciEditor.GetFirstVisibleLine; + ActiveDoc.Modified := frmMain.sciEditor.Modified; + ActiveDoc.NotesText := GetRTFText(frmMain.rtfNotes); + end; + + Screen.Cursor := crHourGlass; + ShowProgress; + + AssignFile(F, AFilename); + { ... count lines ... } + i := 0; + Reset(F); + + while not EOF(F) do begin + ReadLn(F, eString); + Inc(i, 1); + end; + { ... read lines ... } + Reset(F); + with Add(AFilename, AHighlighter) do begin + ShowProgress; + frmMain.pbLoading.Max := i; + i := 0; + while not EOF(F) do begin + if Cancel then begin + Cancel := False; + CloseFile(F); + exit; + end; + ReadLn(F, eString); + if Assigned(GetCurrLang(AFilename)) then begin + if (eString = GetCurrLang(AFilename).CommentBoxStart + ' AMXX-Studio Notes - DO NOT MODIFY BELOW HERE') and (frmSettings.optFileComment.Checked) then begin + try + ReadLn(F, eString); + eString := Copy(eString, Length(GetCurrLang(AFilename).CommentBoxMiddle) +1, Length(eString)); + NotesText := eString; + ReadLn(F, eString); + except + MessageBox(frmMain.Handle, PChar(lFailedLoadNotes), PChar(Application.Title), MB_ICONERROR); + end; + end + else + Code.Add(eString); + end + else + Code.Add(eString); + frmMain.pbLoading.Position := i; + SetProgressStatus('Loading file...'); + Inc(i, 1); + Application.ProcessMessages; + end; + HideProgress; + Result := Index; + + CloseFile(F); + + if frmSettings.optConfig.Checked then begin + eLines := TStringList.Create; + if FileExists(ExtractFilePath(ParamStr(0)) + 'config\Notes.dat') then + eLines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\Notes.dat') + else begin + eLines.Clear; // something must be wrong, clear + eLines.Add('AMXX-Studio Notes - DO NOT MODIFY THIS FILE'); + eLines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\Notes.dat'); + end; + + i := 0; // line 1 is a comment + while i < eLines.Count -1 do begin + Inc(i, 2); + if LowerCase(FFilename) = LowerCase(eLines[i -1]) then begin + NotesText := eLines[i]; + break; + end; + end; + + eLines.Free; + end; + end; + Screen.Cursor := crDefault; + + if not Plugin_FileLoad(AFilename, False) then exit; + + if Result <> -1 then + Activate(Result, False); +end; + +function TDocCollection.Save(AIndex: Integer; AFilename: String): Boolean; +begin + if AFilename <> '' then + TDocument(Items[AIndex]).FileName := AFileName; + + Result := TDocument(Items[AIndex]).Save; +end; + +procedure mIRCDDE(Service, Topic, Cmd: string); +var + DDE: TDDEClientConv; +begin + DDE := TDDEClientConv.Create(nil); + try + DDE.SetLink(Service, Topic); + DDE.OpenLink; + DDE.PokeData(Topic, PChar(Cmd)); + finally + DDE.Free; + end; +end; + +function mIRCGet(Service, Topic, Item: string): String; +var + DDE: TDDEClientConv; +begin + DDE := TDDEClientConv.Create(nil); + try + DDE.SetLink(Service, Topic); + Result := DDE.RequestData(Item); + finally + DDE.Free; + end; +end; + +function GetAllDirs: TStringList; +var eList: TStringList; + i: integer; +begin + eList := TStringList.Create; + frmMain.IdFTP.List(eList); + frmMain.IdFTP.DirectoryListing.LoadList(eList); + eList.Clear; + for i := 0 to frmMain.IdFTP.DirectoryListing.Count -1 do begin + if frmMain.IdFTP.DirectoryListing.Items[i].ItemType = ditDirectory then + eList.Add(frmMain.IdFTP.DirectoryListing.Items[i].FileName); + end; + Result := eList; +end; + +procedure SetProxySettings; +begin + with frmMain.IdFTP.ProxySettings do begin + case frmSettings.cboProxy.ItemIndex of + 0: ProxyType := fpcmNone; // none + 1: ProxyType := fpcmHttpProxyWithFtp; // HTTP Proxy with FTP + 2: ProxyType := fpcmOpen; // Open + 3: ProxyType := fpcmSite; // Site + 4: ProxyType := fpcmTransparent; // Transparent + 5: ProxyType := fpcmUserPass; // User (Password) + 6: ProxyType := fpcmUserSite; // User (Site) + end; + Host := frmSettings.txtProxyHost.Text; + Port := StrToInt(frmSettings.txtProxyPort.Text); + Username := frmSettings.txtProxyUsername.Text; + Password := frmSettings.txtProxyPassword.Text; + end; +end; + +function TryConnect: Integer; +begin + Result := 0; + + frmMain.IdFTP.Host := frmSettings.txtHost.Text; + frmMain.IdFTP.Port := StrToInt(frmSettings.txtPort.Text); + frmMain.IdFTP.Username := frmSettings.txtUsername.Text; + frmMain.IdFTP.Passive := frmSettings.chkPassive.Checked; + frmMain.IdFTP.Password := frmSettings.txtPassword.Text; + SetProxySettings; + + try + frmMain.IdFTP.Connect(True, 15000); + except + on E: Exception do begin + if Pos('Login incorrect.', E.Message) <> 0 then begin // login failed + MessageBox(Application.Handle, PChar(lLoginIncorrect), PChar(Application.Title), MB_ICONWARNING); + Result := 1; + end + else if Pos('Host not found.', E.Message) <> 0 then begin // host not found + MessageBox(Application.Handle, PChar(lHostNotFound), PChar(Application.Title), MB_ICONWARNING); + Result := 2; + end + else if Pos('Connection refused.', E.Message) <> 0 then begin // wrong port (?) + MessageBox(Application.Handle, PChar(lConnectionRefused), PChar(Application.Title), MB_ICONWARNING); + Result := 3; + end + else if E is EIdProtocolReplyError then begin // wrong port + MessageBox(Application.Handle, PChar(lWrongPort), PChar(Application.Title), MB_ICONWARNING); + Result := 4; + end + else begin + MessageBox(Application.Handle, PChar(E.Message), PChar(Application.Title), MB_ICONWARNING); // unknown error + Result := 5; + end; + end; + end; +end; + +{ Initialization & Finalization } + +initialization + +PAWNProjects := TDocCollection.Create('Pawn'); +CPPProjects := TDocCollection.Create('C++'); +OtherProjects := TDocCollection.Create('null'); +CurrProjects := 0; +ActiveDoc := PAWNProjects.ActiveDocument; + +finalization + +PAWNProjects.Free; +CPPProjects.Free; +OtherProjects.Free; + +end. diff --git a/editor/studio/UnitMenuGenerators.pas b/editor/studio/UnitMenuGenerators.pas new file mode 100755 index 00000000..75ebdd11 --- /dev/null +++ b/editor/studio/UnitMenuGenerators.pas @@ -0,0 +1,548 @@ +unit UnitMenuGenerators; + +interface + +uses SysUtils, Classes, Windows, Forms, Graphics; + +procedure GenerateSimpleMenu; + +{ Yes, this is from AMXX-Edit v2. I'm too lazy to rewrite it... } +{ >:( } + +function AddOldMenu: Boolean; +function AddOldPlayerMenu: Boolean; +function GetFirst(eStart: String; eSearchMain: Boolean): Integer; +function GetLast(eStart: String; eSearchMain: Boolean): Integer; +function GetLine(eExpression: String; eAllowFunction, eBreak: Boolean): Integer; +function AddIfDoesntExist(eInclude: String): Boolean; +function GetColoredMenu: String; +function PluginInitLine: Integer; + +implementation + +uses UnitCodeUtils, UnitfrmMain, UnitfrmMenuGenerator, UnitLanguages; + +function GetLine(eExpression: String; eAllowFunction, eBreak: Boolean): Integer; +var i: integer; +begin + Result := -1; + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if IsAtStart(eExpression, frmMain.sciEditor.Lines[i], eAllowFunction) then begin + Result := i; + if eBreak then + Break; + end; + end; +end; + +procedure GenerateSimpleMenu; +var eRP, eVL: Integer; // RegisterPlugin, VariableLine + eStr: TStringList; + eIndents, eInternalTitle: String; + i: integer; +begin + { Get Line Numbers } + eVL := GetLine('#define', False, False); + if eVL = -1 then + eVL := GetLine('#include', False, False); + if eVL = -1 then + eVL := 0; + + eRP := PluginInitLine; + + if eRP <> -1 then begin + eInternalTitle := StringReplace(frmMenuGenerator.txtNTitle.Text, #32, '', [rfReplaceAll]); + eStr := TStringList.Create; + // Register Vars + eVL := eVL +1; + eIndents := GetIndents(eVL); + eStr.Add(eIndents + 'new m' + eInternalTitle + ' // Menu'); + eStr.Add(eIndents + 'new mcb' + eInternalTitle + ' // Menu Callback'); + frmMain.sciEditor.Lines.Insert(eVL, eStr.Text); + + + // Register function + eRP := PluginInitLine; + eIndents := GetIndents(eRP); + eStr.Clear; + eStr.Add(eIndents + '/* Menu ' + frmMenuGenerator.txtNTitle.Text + ' */'); + eStr.Add(eIndents + '/* Use menu_display(id, m' + eInternalTitle + ', 0) to show the menu to an user. */'); + eStr.Add(eIndents + 'm' + eInternalTitle + ' = menu_create("' + frmMenuGenerator.txtNTitle.Text + '", "mh_' + eInternalTitle + '")'); + eStr.Add(eIndents + 'mcb' + eInternalTitle + ' = menu_makecallback("mcb_' + eInternalTitle + '")'); + for i := 0 to frmMenuGenerator.lstNMenuItems.Items.Count -1 do + eStr.Add(eIndents + 'menu_additem(m' + eInternalTitle + ', "' + frmMenuGenerator.lstNMenuItems.Items[i] + '", "ma_' + eInternalTitle + '", ' + frmMenuGenerator.cboAccess.Text + ', mcb' + eInternalTitle + ')'); + eStr.Add(eIndents + '/* Menu End */'); + frmMain.sciEditor.Lines.Insert(eRP, eStr.Text); + // Rest + eStr.Clear; + eStr.Add(''); + eStr.Add(''); + eStr.Add('/* Menu ' + frmMenuGenerator.txtNTitle.Text + ' */'); + eStr.Add(''); + eStr.Add('public mh_' + eInternalTitle + '(id, menu, item) {'); + eStr.Add(#9 + '/* This event is called when someone presses a key on this menu */'); + eStr.Add('}'); + eStr.Add(''); + eStr.Add('public ma_' + eInternalTitle + '(id) {'); + eStr.Add(#9 + '/* This event is called when an item was selected */'); + eStr.Add('}'); + eStr.Add(''); + eStr.Add('public mcb_' + eInternalTitle + '(id, menu, item) {'); + eStr.Add(#9 + '/* This is the callback-event, here you can set items enabled or disabled. */'); + eStr.Add(#9 + '/* If you want to enable an item, use: return ITEM_ENABLED */'); + eStr.Add(#9 + '/* If you want to disable an item, use: return ITEM_DISABLED */'); + eStr.Add('}'); + eStr.Add(''); + frmMain.sciEditor.Lines.AddStrings(eStr); + + eStr.Free; + end + else + MessageBox(frmMenuGenerator.Handle, PChar(lInvalidPlugin), PChar(Application.Title), MB_ICONERROR); +end; + +{ Normal Menu } + +function AddOldMenu: Boolean; +var eColoredMenu, DefinedKeys: String; + i: integer; + eStr: TStringList; +begin + Result := GetFirst('public Show' + frmMenuGenerator.txtMenuName.Text, True) = -1; + if not Result then + exit; + + eStr := TStringList.Create; + { Transform text } + eColoredMenu := GetColoredMenu; + { Add functions } + eStr.Add(Format('public Show%s(id) {', [frmMenuGenerator.txtMenuName.Text])); + eStr.Add(' show_menu(id, Keys' + frmMenuGenerator.txtMenuName.Text + ', "' + eColoredMenu + '", -1, "' + frmMenuGenerator.txtMenuName.Text + '")'); + if frmMenuGenerator.chkAddComment.Checked then + eStr[eStr.Count -1] := eStr[eStr.Count -1] + ' // Display menu'; + eStr.Add('}'); + eStr.Add(''); + eStr.Add('public Pressed' + frmMenuGenerator.txtMenuName.Text + '(id, key) {'); + if frmMenuGenerator.chkAddComment.Checked then begin + eStr.Add(' /* Menu:'); + for i := 0 to frmMenuGenerator.rtfMenu.Lines.Count -1 do + eStr.Add(' * ' + frmMenuGenerator.rtfMenu.Lines[i]); + eStr.Add(' */'); + eStr.Add(''); + end; + eStr.Add(' switch (key) {'); + DefinedKeys := ''; + for i := 1 to Length(frmMenuGenerator.txtKeys.Text) do begin + if frmMenuGenerator.txtKeys.Text[i] = '0' then begin + DefinedKeys := DefinedKeys + '|(1<<9)'; + if frmMenuGenerator.chkAddComment.Checked then + eStr.Add(' case 9: { // 0') + else + eStr.Add(' case 9: {'); + eStr.Add(' '); + eStr.Add(' }'); + end + else begin + DefinedKeys := DefinedKeys + '|(1<<' + IntToStr(StrToInt(frmMenuGenerator.txtKeys.Text[i]) -1) + ')'; + if frmMenuGenerator.chkAddComment.Checked then + eStr.Add(' case ' + IntToStr(StrToInt(frmMenuGenerator.txtKeys.Text[i]) -1) + ': { // ' + frmMenuGenerator.txtKeys.Text[i]) + else + eStr.Add(' case ' + IntToStr(StrToInt(frmMenuGenerator.txtKeys.Text[i]) -1) + ': {'); + eStr.Add(' '); + eStr.Add(' }'); + end; + end; + Delete(DefinedKeys, 1, 1); + if frmMenuGenerator.chkAddComment.Checked then + DefinedKeys := DefinedKeys + ' // Keys: ' + frmMenuGenerator.txtKeys.Text; + eStr.Add(' }'); + eStr.Add('}'); + // Insert + AddIfDoesntExist('amxmodx'); + i := GetFirst('#define', True) +2; + if i = 1 then + i := GetFirst('#include', True) +2; + if i = 1 then + i := 0; + + frmMain.sciEditor.Lines.Insert(i, Format('#define Keys%s %s', [frmMenuGenerator.txtMenuName.Text, DefinedKeys])); + frmMain.sciEditor.Lines.Text := frmMain.sciEditor.Lines.Text + #13 + eStr.Text; + if frmMenuGenerator.chkRegisterMenuCommand.Checked then begin + i := GetFirst('register_plugin', True) +2; + if i = 1 then + i := GetFirst('public plugin_init()', True) +2; + if i = 1 then begin + eStr.Clear; + eStr.Add('public plugin_init() {'); + eStr.Add(' register_menucmd(register_menuid("' + frmMenuGenerator.txtMenuName.Text + '"), Keys' + frmMenuGenerator.txtMenuName.Text + ', "Pressed' + frmMenuGenerator.txtMenuName.Text + '")'); + eStr.Add('}'); + frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +2, ''); + frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +3, eStr.Text); + end + else + frmMain.sciEditor.Lines.Insert(i, ' register_menucmd(register_menuid("' + frmMenuGenerator.txtMenuName.Text + '"), Keys' + frmMenuGenerator.txtMenuName.Text + ', "Pressed' + frmMenuGenerator.txtMenuName.Text + '")'); + end; + eStr.Free; +end; + +{ Player Menu } + +function AddOldPlayerMenu: Boolean; +function PrepareItem(eItem: String; eDisabled: Boolean): String; // Remove colors etc. +begin + eItem := StringReplace(eItem, '\w', '', [rfReplaceAll, rfIgnoreCase]); + eItem := StringReplace(eItem, '\y', '', [rfReplaceAll, rfIgnoreCase]); + eItem := StringReplace(eItem, '\r', '', [rfReplaceAll, rfIgnoreCase]); + eItem := StringReplace(eItem, '\d', '', [rfReplaceAll, rfIgnoreCase]); + eItem := StringReplace(eItem, '%n', '%i', [rfIgnoreCase]); + eItem := StringReplace(eItem, '%v', '%s', [rfIgnoreCase]); + if eDisabled then + eItem := '\d' + eItem + else + eItem := '\w' + eItem; + Result := eItem + '^n'; +end; + +var i: integer; + eStr: TStringList; + ePlayersFrom, ePlayersTo: Integer; // Players + ePlayerFormat: String; + eNext, eExit: Integer; // Next and Back/Exit + eNextText, eBackText, eExitText: String; + eCurLineIndex: Integer; // Current .. + eCurLine: String; // .. line + DefinedKeys: String; // Action Keys +begin + Result := GetFirst('public Show' + frmMenuGenerator.txtMenuName.Text, True) = -1; + if not Result then begin + MessageBox(frmMenuGenerator.Handle, 'Menu already exists. Please choose another name.', 'Warning', MB_ICONWARNING); + exit; + end; + + { + Kick player + + $players(1,8,%n. %v) + $next(9,9. Next) + + $exitorback(0, 0. Exit, 0. Back) + } + + eCurLine := frmMenuGenerator.rtfMenu.Lines[0]; + eCurLineIndex := 0; + eNext := -1; + eExit := -1; + eStr := TStringList.Create; + // Prepare Values + try + { Players } + eCurLineIndex := GetFirst('$players', False); + eCurLine := frmMenuGenerator.rtfMenu.Lines[eCurLineIndex]; + ePlayersFrom := StrToInt(Between(LowerCase(Trim(eCurLine)), '$players(', ',')); + ePlayersTo := StrToInt(Between(Trim(LowerCase(eCurLine)), ',', ',')); + while CountChars(eCurLine, ',') > 1 do + Delete(eCurLine, 1, 1); + ePlayerFormat := Between(LowerCase(eCurLine), ',', ')'); + { Next } + if GetFirst('$next', False) <> -1 then begin + eCurLineIndex := GetFirst('$next', False); + eCurLine := frmMenuGenerator.rtfMenu.Lines[eCurLineIndex]; + eNext := StrToInt(Trim(Between(eCurLine, '(', ','))); + eNextText := Between(eCurLine, ',', ')'); + end; + { Exit or Back } + if GetFirst('$exitorback', False) <> -1 then begin + eCurLineIndex := GetFirst('$exitorback', False); + eCurLine := frmMenuGenerator.rtfMenu.Lines[eCurLineIndex]; + eExit := StrToInt(Trim(Between(eCurLine, '(', ','))); + eExitText := Between(eCurLine, ',', ','); + while CountChars(eCurLine, ',') > 1 do + Delete(eCurLine, 1, 1); + eBackText := Between(eCurLine, ',', ')'); + end; + except + MessageBox(frmMenuGenerator.Handle, PChar(Format('Syntax error at line %s: ' + #13 + '%s', [IntToStr(eCurLineIndex +1), frmMenuGenerator.rtfMenu.Lines[eCurLineIndex]])), 'Error', MB_ICONERROR); + Result := False; + exit; + end; + // Check Keys + { Players } + if (ePlayersFrom < 0) or (ePlayersFrom > ePlayersTo) then begin + MessageBox(frmMenuGenerator.Handle, 'Invalid start key (players)', 'Warning', MB_ICONWARNING); + Result := False; + exit; + end; + if (ePlayersTo < 0) or (ePlayersTo > 9) then begin + MessageBox(frmMenuGenerator.Handle, 'Invalid stop key (players)', 'Warning', MB_ICONWARNING); + Result := False; + exit; + end; + { Next, Exit and Custom keys} + eCurLine := ''; + for i := ePlayersFrom to ePlayersTo do + eCurLine := eCurLine + IntToStr(i); + + if Pos(IntToStr(eNext), eCurLine) > 0 then begin + MessageBox(frmMenuGenerator.Handle, PChar(Format('"Next" key already in use (%s). Delete it or choose another one and try again.', [IntToStr(eNext)])), 'Warning', MB_ICONWARNING); + Result := False; + exit; + end; + if Pos(IntToStr(eExit), eCurLine) > 0 then begin + MessageBox(frmMenuGenerator.Handle, PChar(Format('"Exit" key already in use (%s). Delete it or choose another one and try again.', [IntToStr(eExit)])), 'Warning', MB_ICONWARNING); + Result := False; + exit; + end; + eCurLine := eCurLine + IntToStr(eNext); + eCurLine := eCurLine + IntToStr(eExit); + // Insert Code + try + { Includes } + AddIfDoesntExist('amxmodx'); + AddIfDoesntExist('amxmisc'); + { Define Keys } + DefinedKeys := ''; + if Length(eCurLine) <> 0 then begin + for i := 1 to Length(eCurLine) do begin + if eCurLine[i] = '0' then + DefinedKeys := DefinedKeys + '|(1<<9)' + else begin + eCurLine[i] := IntToStr(StrToInt(eCurLine[i]) -1)[1]; + DefinedKeys := DefinedKeys + '|(1<<' + eCurLine[i] + ')'; + end; + end; + Delete(DefinedKeys, 1, 1); + end; + i := GetLast('#define', True) +2; + if i = 1 then + i := GetLast('#include', True) +2; + if i = 1 then + i := 0; + frmMain.sciEditor.Lines.Insert(i, Format('#define Keys%s %s', [frmMenuGenerator.txtMenuName.Text, DefinedKeys])); + frmMain.sciEditor.Lines.Insert(i +1, 'new MenuPos' + frmMenuGenerator.txtMenuName.Text); + frmMain.sciEditor.Lines.Insert(i +2, 'new MenuPlayers' + frmMenuGenerator.txtMenuName.Text + '[32]'); + { Register } + i := GetFirst('register_plugin', True) +2; + if i = 1 then + i := GetFirst('public plugin_init()', True) +2; + if i = 1 then begin + eStr.Clear; + eStr.Add('public plugin_init() {'); + eStr.Add(' register_menucmd(register_menuid("' + frmMenuGenerator.txtMenuName.Text + '"), Keys' + frmMenuGenerator.txtMenuName.Text + ', "Pressed' + frmMenuGenerator.txtMenuName.Text + '")'); + eStr.Add('}'); + frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +2, ''); + frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +3, eStr.Text); + end + else + frmMain.sciEditor.Lines.Insert(i, ' register_menucmd(register_menuid("' + frmMenuGenerator.txtMenuName.Text + '"), Keys' + frmMenuGenerator.txtMenuName.Text + ', "Pressed' + frmMenuGenerator.txtMenuName.Text + '")'); + { Show Menu Functions (thx to xeroblood for code example) } + eStr.Clear; + eStr.Add('public Show' + frmMenuGenerator.txtMenuName.Text + '(id) {'); + eStr.Add(' ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, MenuPos' + frmMenuGenerator.txtMenuName.Text + ' = 0)'); + eStr.Add(' return PLUGIN_HANDLED'); + eStr.Add('}'); + eStr.Add(''); + eStr.Add('public ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, position) {'); + if frmMenuGenerator.chkAddComment.Checked then + eStr.Add(' // Menu stuff //'); + eStr.Add(' if (position < 0) { return 0; }'); + eStr.Add(' '); + eStr.Add(' new i, k'); + eStr.Add(' new MenuBody[255]'); + eStr.Add(' new CurrentKey = ' + IntToStr(ePlayersFrom -1)); + eStr.Add(' new Start = position * ' + IntToStr(ePlayersTo - ePlayersFrom)); + eStr.Add(' new Num'); + eStr.Add(' new UserName[32]'); + eStr.Add(' '); + eStr.Add(' get_players(MenuPlayers' + frmMenuGenerator.txtMenuName.Text + ', Num)'); + eStr.Add(' if (Start >= Num) { Start = position = MenuPos' + frmMenuGenerator.txtMenuName.Text + ' = 0; }'); + eCurLine := GetColoredMenu; + eCurLine := Copy(eCurLine, 1, Pos('$players', eCurLine) -3); + Insert('\R%d/%d^n\w', eCurLine, Pos('^n', eCurLine)); + eStr.Add(' new Len = format(MenuBody, 255, "' + eCurLine + '", position+1, (Num / ' + IntToStr(ePlayersTo - ePlayersFrom) + ' + ((Num % ' + IntToStr(ePlayersTo - ePlayersFrom) + ') ? 1 : 0 )) )'); + eStr.Add(' new End = Start + ' + IntToStr(ePlayersTo - ePlayersFrom)); + if eExit = 0 then + eStr.Add(' new Keys = (1<<9)') + else + eStr.Add(' new Keys = (1<<' + IntToStr(eExit -1) + ')'); + eStr.Add(' if (End > Num) { End = Num; }'); + eStr.Add(' '); + eStr.Add(' for(i=Start;i 0 then + eStr.Add(' case ' + IntToStr(eNext -1) + ': ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, ++MenuPos' + frmMenuGenerator.txtMenuName.Text + ') // More Option') + else + eStr.Add(' case 9: ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, ++MenuPos' + frmMenuGenerator.txtMenuName.Text + ') // More Option'); + + if eExit <> 0 then + eStr.Add(' case ' + IntToStr(eExit -1) + ': ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, --MenuPos' + frmMenuGenerator.txtMenuName.Text + ') // Back Option') + else + eStr.Add(' case 9: ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, --MenuPos' + frmMenuGenerator.txtMenuName.Text + ') // Back Option'); + end + else begin + if eNext <> 0 then + eStr.Add(' case ' + IntToStr(eNext -1) + ': ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, ++MenuPos' + frmMenuGenerator.txtMenuName.Text + ')') + else + eStr.Add(' case 9: ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, ++MenuPos' + frmMenuGenerator.txtMenuName.Text + ')'); + if eExit <> 0 then + eStr.Add(' case ' + IntToStr(eExit -1) + ': ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, --MenuPos' + frmMenuGenerator.txtMenuName.Text + ')') + else + eStr.Add(' case 9: ShowMenu' + frmMenuGenerator.txtMenuName.Text + '(id, --MenuPos' + frmMenuGenerator.txtMenuName.Text + ')'); + end; + eStr.Add(' default: {'); + if frmMenuGenerator.chkAddComment.Checked then + eStr.Add(' // Get User ID and Username'); + eStr.Add(' new PlayerID = MenuPlayers' + frmMenuGenerator.txtMenuName.Text + '[MenuPos' + frmMenuGenerator.txtMenuName.Text + ' * ' + IntToStr(ePlayersTo - ePlayersFrom) + ' + key]'); + eStr.Add(' new UserName[32]'); + eStr.Add(' get_user_name(PlayerID, UserName, 31)'); + if frmMenuGenerator.chkAddComment.Checked then + eStr.Add(' // Do actions here') + else + eStr.Add(' '); + eStr.Add(' }'); + eStr.Add(' }'); + eStr.Add(' return PLUGIN_HANDLED'); + eStr.Add('}'); + frmMain.sciEditor.Lines.Text := frmMain.sciEditor.Lines.Text + #13 + eStr.Text; + except + MessageBox(frmMenuGenerator.Handle, PChar('An error occured while inserting code!'), 'Warning', MB_ICONWARNING); + end; + eStr.Free; +end; + +{ Functions } + +function GetFirst(eStart: String; eSearchMain: Boolean): Integer; +var i: integer; +begin + eStart := LowerCase(Trim(eStart)); + Result := -1; + if eSearchMain then begin + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if Pos(eStart, LowerCase(Trim(frmMain.sciEditor.Lines[i]))) = 1 then begin + Result := i; + exit; + end; + end; + end + else begin + for i := 0 to frmMenuGenerator.rtfMenu.Lines.Count -1 do begin + if Pos(eStart, LowerCase(Trim(frmMenuGenerator.rtfMenu.Lines[i]))) = 1 then begin + Result := i; + exit; + end; + end; + end; +end; + +function GetLast(eStart: String; eSearchMain: Boolean): Integer; +var i: integer; +begin + eStart := LowerCase(Trim(eStart)); + Result := -1; + if eSearchMain then begin + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if Pos(eStart, LowerCase(Trim(frmMain.sciEditor.Lines[i]))) = 1 then + Result := i; + end; + end + else begin + for i := 0 to frmMenuGenerator.rtfMenu.Lines.Count -1 do begin + if Pos(eStart, LowerCase(Trim(frmMenuGenerator.rtfMenu.Lines[i]))) = 1 then + Result := i; + end; + end; +end; + +function AddIfDoesntExist(eInclude: String): Boolean; +var i: integer; +begin + Result := True; + eInclude := LowerCase(eInclude); + for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin + if (Pos('<', frmMain.sciEditor.Lines[i]) <> 0) or (Pos('"', frmMain.sciEditor.Lines[i]) <> 0) then begin + if LowerCase(Between(frmMain.sciEditor.Lines[i], '<', '>')) = eInclude then + exit; + if LowerCase(Between(frmMain.sciEditor.Lines[i], '"', '"')) = eInclude then + exit; + end; + end; + + i := GetLast('#include', True); + if i = -1 then + i := 0; + + frmMain.sciEditor.Lines.Insert(i, '#include <' + eInclude + '>'); +end; + +function GetColoredMenu: String; +var i: integer; + eCurColor: TColor; +begin + eCurColor := clWhite; + Result := ''; + for i := 0 to Length(frmMenuGenerator.rtfMenu.Lines.Text) -1 do begin + frmMenuGenerator.rtfMenu.SelStart := i; + if frmMenuGenerator.rtfMenu.SelAttributes.Color <> eCurColor then begin + eCurColor := frmMenuGenerator.rtfMenu.SelAttributes.Color; + case eCurColor of + clWhite : Result := Result + '\w'; + clYellow: Result := Result + '\y'; + clRed : Result := Result + '\r'; + clGray : Result := Result + '\d'; + end; + end; + Result := Result + frmMenuGenerator.rtfMenu.Lines.Text[i+1]; + end; + frmMenuGenerator.rtfMenu.SelStart := 0; + Result := StringReplace(Result, #13, '^n', [rfReplaceAll]); + Result := StringReplace(Result, #10, '', [rfReplaceAll]); +end; + +function PluginInitLine: Integer; +begin + Result := GetLine('register_concmd', True, False); + if Result = -1 then + Result := GetLine('register_clcmd', True, False); + if Result = -1 then + Result := GetLine('register_plugin', True, True); + if Result = -1 then + Result := GetLine('public plugin_init', True, True); +end; + +end. diff --git a/editor/studio/UnitPlugins.pas b/editor/studio/UnitPlugins.pas new file mode 100755 index 00000000..ded76021 --- /dev/null +++ b/editor/studio/UnitPlugins.pas @@ -0,0 +1,883 @@ +unit UnitPlugins; + +interface + +uses SysUtils, Classes, Windows, Messages, Forms, ComCtrls; + +type TCodeSnippetClick = function (pTitle, pCategory: PChar; pCode: PChar): Integer; cdecl; + TFileAction = function (pFilename: PChar): Integer; cdecl; + TDocChange = function (pIndex: DWord; pFilename: PChar; pHighlighter: PChar; pRestoreCaret: Boolean): Integer; cdecl; + TProjectsChange = function (pOldIndex, pNewIndex: DWord): Integer; cdecl; + TCreateNewFile = function (Item: PByte): Integer; cdecl; + TDisplaySearch = function (pSearchList: PChar; pSelected: PChar): Integer; cdecl; + TSearch = function (pExpression: PChar; pCaseSensivity, pWholeWords, pSearchFromCaret, pSelectedOnly, pRegEx, pForward: Boolean): Integer; cdecl; + TSearchReplace = function (pExpression, pReplace, pExpList, pRepList: PChar; pCaseSensivity, pWholeWords, pSearchFromCaret, pSelectedOnly, pRegEx, pForward: Boolean): Integer; cdecl; + TVisibleControlChange = function (pControl: DWord; pShow: Boolean): Integer; cdecl; + TCompile = function (pCompileType: DWord; Lang, Filename: PChar): Integer; cdecl; + TShowHelp = function (pHelpType: DWord): Integer; cdecl; + TCustomItemClick = function (pCaption: PChar): Integer; cdecl; + TThemeChanged = function (pTheme: PChar): Integer; cdecl; + + TModified = function (pText: PChar): Integer; cdecl; + TKeyPress = function (var pKey: Char): Integer; cdecl; + TEditorClick = function (pDoubleClick: Boolean): Integer; cdecl; + TUpdateSel = function (pSelStart, pSelLength, pFirstVisibleLine: DWord): Integer; cdecl; + TCallTipShow = function (pList: PChar): Integer; cdecl; + TCallTipClick = function (pPosition: DWord): Integer; cdecl; + TAutoCompleteShow = function (pList: PChar): Integer; cdecl; + TAutoCompleteSelect = function (pText: PChar): Integer; cdecl; + + TAppMsg = function (pHwnd: HWND; pMessage: DWord; pWParam, pLParam: Integer; pTime: DWord; pPt: TPoint): Integer; cdecl; + TUpdateCodeTools = function (pLang, pFilename, pCurrProjects: PChar): Integer; cdecl; + TOutputEvent = function (pItemIndex: Integer): Integer; cdecl; + +type TIntegerArray = array of Integer; + +type TLoadInfo = record + { Plugin Values } + sPluginName: PChar; + sPluginDescription: PChar; + { Form Handles } + hAllFilesForm: HWND; + hAutoIndent: HWND; + hClose: HWND; + hConnGen: HWND; + hGoToLine: HWND; + hHTMLPreview: HWND; + hHudMsgGenerator: HWND; + hInfo: HWND; + hMainForm: HWND; + hMenuGenerator: HWND; + hMOTDGen: HWND; + hPluginsIniEditor: HWND; + hReplace: HWND; + hSearch: HWND; + hSelectColor: HWND; + hSettings: HWND; + hSocketsTerminal: HWND; + hSplashscreen: HWND; + { Important Control Handles } + hOutput: HWND; + hCodeExplorer: HWND; + hCodeInspector: HWND; // even if it won't be useful + hNotes: HWND; + { Other } + pApplication: Pointer; // this is only useful for Delphi developers +end; + +type PLoadInfo = ^TLoadInfo; + TLoadPlugin = procedure (var LoadInfo: PLoadInfo); cdecl; + TUnloadPlugin = procedure; cdecl; + +procedure SendToMainApp(eData: String); + +function LoadPlugin(ListItem: TListItem): Boolean; +procedure UnloadPlugin(ListItem: TListItem); + +function Plugin_CodeSnippetClick(Title, Category: String; Code: String): Boolean; +function Plugin_FileLoad(Filename: String; Loading: Boolean): Boolean; +function Plugin_FileSave(Filename: String; Saving: Boolean): Boolean; +function Plugin_DocChange(Index: Integer; Filename, Highlighter: String; RestoreCaret, Changing: Boolean): Boolean; +function Plugin_ProjectsChange(OldIndex, NewIndex: Integer; Changing: Boolean): Boolean; +function Plugin_CreateNewFile(Item: Byte; Creating: Boolean): Boolean; +function Plugin_Search(SearchList, Selected: String; Displaying, SearchAgain: Boolean): Boolean; +function Plugin_SearchReplace(Expression, Replace, ExpList, RepList: String; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; +function Plugin_VisibleControlChange(Control: Integer; Show: Boolean): Boolean; +function Plugin_Compile(CompileType: Integer; Lang, Filename: String; Compiling: Boolean): Boolean; +function Plugin_ShowHelp(HelpType: Integer): Boolean; +function Plugin_CustomItemClick(Caption: String): Boolean; +function Plugin_ThemeChange(Theme: String): Boolean; + +function Plugin_Modified(Code: PChar): Boolean; +function Plugin_KeyPress(var Key: Char): Boolean; +function Plugin_EditorClick(DoubleClick: Boolean): Boolean; +function Plugin_UpdateSel(SelStart, SelLength, FirstVisibleLine: Integer): Boolean; +function Plugin_CallTipShow(List: PChar): Boolean; +function Plugin_CallTipClick(Position: Integer): Boolean; +function Plugin_AutoCompleteShow(List: PChar): Boolean; +function Plugin_AutoCompleteSelect(Text: PChar): Boolean; + +function Plugin_AppMsg(hwnd: HWND; Message: DWord; wParam, lParam: Integer; time: DWord; pt: TPoint): Boolean; +function Plugin_UpdateCodeExplorer(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; +function Plugin_UpdateCodeInspector(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; +function Plugin_OutputDblClick(ItemIndex: Integer): Boolean; +function Plugin_OutputPopup(ItemIndex: Integer): Boolean; + +const { Return values for dlls } + PLUGIN_CONTINUE = 0; // continue... + PLUGIN_STOP = 1; // stop calling funcs and don't handle the command + PLUGIN_HANDLED = 2; // don't handle the command + { Compile values } + COMP_DEFAULT = 0; + COMP_STARTHL = 1; + COMP_UPLOAD = 2; + { Help values } + HELP_DEFAULT = 0; + HELP_SEARCH = 1; + HELP_FORUMS = 2; + HELP_ABOUT = 3; + { Controls for visible state } + CTRL_OUTPUT = 0; // Output list + CTRL_CODETOOLS_MAIN = 1; // Code-Tools window + CTRL_CODETOOLS_ITEM = 2; // Code-Tools tab + CTRL_NOTES = 3; // Notes tab + { Languages } + NEW_PAWN_PLUGIN = 0; + NEW_PAWN_EMPTYPLUGIN = 1; + NEW_PAWN_HEADER = 2; + NEW_CPP_MODULE = 3; + NEW_CPP_UNIT = 4; + NEW_CPP_HEADER = 5; + NEW_OTHER_TEXTFILE = 6; + NEW_OTHER_HTML = 7; + NEW_OTHER_SQL = 8; + NEW_OTHER_XML = 9; + +implementation + +uses UnitfrmSettings, UnitMainTools, UnitfrmAllFilesForm, + UnitfrmAutoIndent, UnitfrmClose, UnitfrmConnGen, UnitfrmGoToLine, + UnitfrmHTMLPreview, UnitfrmHudMsgGenerator, UnitfrmInfo, UnitfrmMain, + UnitfrmMenuGenerator, UnitfrmMOTDGen, UnitfrmPluginsIniEditor, + UnitfrmReplace, UnitfrmSearch, UnitfrmSelectColor, + UnitfrmSocketsTerminal, UnitfrmSplashscreen, UnitLanguages; + +function LoadPlugin(ListItem: TListItem): Boolean; +var eLoadInfo: TLoadInfo; + LoadInfo: PLoadInfo; + eHandle: Cardinal; + eFunc, eFunc2: TLoadPlugin; +begin + Result := False; + + with eLoadInfo do begin + sPluginName := 'Untitled'; + sPluginDescription := 'No description'; + { Handles } + hAllFilesForm := frmAllFilesForm.Handle; + hAutoIndent := frmAutoIndent.Handle; + hClose := frmClose.Handle; + hConnGen := frmConnGen.Handle; + hGoToLine := frmGoToLine.Handle; + hHTMLPreview := frmHTMLPreview.Handle; + hHudMsgGenerator := frmHudMsgGenerator.Handle; + hInfo := frmInfo.Handle; + hMainForm := frmMain.Handle; + hMenuGenerator := frmMenuGenerator.Handle; + hMOTDGen := frmMOTDGen.Handle; + hPluginsIniEditor := frmPluginsIniEditor.Handle; + hReplace := frmReplace.Handle; + hSearch := frmSearch.Handle; + hSelectColor := frmSelectColor.Handle; + hSettings := frmSettings.Handle; + hSocketsTerminal := frmSocketsTerminal.Handle; + hSplashscreen := frmSplashscreen.Handle; + { Important Control Handles } + hOutput := frmMain.lstOutput.Handle; + hCodeExplorer := frmMain.trvExplorer.Handle; + hCodeInspector := frmMain.jviCode.Handle; // even if it won't be useful + hNotes := frmMain.rtfNotes.Handle; + { Other } + pApplication := @Application; // this is only useful for Delphi developers + end; + + eHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])); + if eHandle = 0 then exit; + @eFunc := GetProcAddress(eHandle, 'pftPluginLoad'); + @eFunc2 := GetProcAddress(eHandle, 'pftPluginUnload'); + + if @eFunc2 <> nil then begin + if @eFunc <> nil then begin + ListItem.Data := Pointer(eHandle); + ListItem.SubItems[2] := 'Loaded'; + LoadInfo := @eLoadInfo; + eFunc(LoadInfo); + ListItem.Caption := eLoadInfo.sPluginName; + ListItem.SubItems[1] := eLoadInfo.sPluginDescription; + end + else + MessageBox(Application.Handle, PChar('Error loading plugin:' + #13 + 'pftPluginLoad function not found.'), PChar(ExtractFileName(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])), MB_ICONERROR); + end + else + MessageBox(Application.Handle, PChar('Error loading plugin:' + #13 + 'pftPluginUnload function not found.'), PChar(ExtractFileName(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])), MB_ICONERROR); +end; + +procedure UnloadPlugin(ListItem: TListItem); +var eFunc: TUnloadPlugin; +begin + @eFunc := GetProcAddress(Cardinal(ListItem.Data), 'pftPluginUnload'); + if @eFunc <> nil then + eFunc; + FreeLibrary(Cardinal(ListItem.Data)); + + ListItem.Data := nil; + ListItem.Caption := '-'; + ListItem.SubItems[1] := '-'; + ListItem.SubItems[2] := 'Unloaded'; +end; + +procedure SendToMainApp(eData: String); +var HTargetWnd: HWND; + ACopyDataStruct: TCopyDataStruct; +begin + with ACopyDataStruct do + begin + dwData := 0; + cbData := Length(eData) + 1; + lpData := PChar(eData); + end; + + HTargetWnd := FindWindow('TfrmMain', 'AMXX-Studio'); + if HTargetWnd <> 0 then + SendMessage(HTargetWnd, WM_COPYDATA, 0, LongInt(@ACopyDataStruct)); +end; + + +function GetDLLHandles: TIntegerArray; +var i, eCount: integer; +begin + SetLength(Result, 0); + eCount := 0; + + if not Started then exit; + + for i := 0 to frmSettings.lvPlugins.Items.Count -1 do begin + if frmSettings.lvPlugins.Items[i].Data <> nil then begin + SetLength(Result, eCount +1); + Result[eCount] := Cardinal(frmSettings.lvPlugins.Items[i].Data); + Inc(eCount, 1); + end; + end; +end; + +function Plugin_CodeSnippetClick(Title, Category: String; Code: String): Boolean; +var Func: TCodeSnippetClick; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftCodeSnippetClick'); + + if @Func <> nil then begin + case Func(PChar(Title), PChar(Category), PChar(Code)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_FileLoad(Filename: String; Loading: Boolean): Boolean; +var Func: TFileAction; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Loading then + @Func := GetProcAddress(Handles[i], 'pftLoading') + else + @Func := GetProcAddress(Handles[i], 'pftLoaded'); + + if @Func <> nil then begin + case Func(PChar(Filename)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_FileSave(Filename: String; Saving: Boolean): Boolean; +var Func: TFileAction; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Saving then + @Func := GetProcAddress(Handles[i], 'pftSaving') + else + @Func := GetProcAddress(Handles[i], 'pftSaved'); + + if @Func <> nil then begin + case Func(PChar(Filename)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_DocChange(Index: Integer; Filename, Highlighter: String; RestoreCaret, Changing: Boolean): Boolean; +var Func: TDocChange; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Changing then + @Func := GetProcAddress(Handles[i], 'pftDocChanging') + else + @Func := GetProcAddress(Handles[i], 'pftDocChanged'); + + if @Func <> nil then begin + case Func(Index, PChar(Filename), PChar(Highlighter), RestoreCaret) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_ProjectsChange(OldIndex, NewIndex: Integer; Changing: Boolean): Boolean; +var Func: TProjectsChange; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Changing then + @Func := GetProcAddress(Handles[i], 'pftProjectsChanging') + else + @Func := GetProcAddress(Handles[i], 'pftProjectsChanged'); + + if @Func <> nil then begin + case Func(OldIndex, NewIndex) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_CreateNewFile(Item: Byte; Creating: Boolean): Boolean; +var Func: TCreateNewFile; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Creating then + @Func := GetProcAddress(Handles[i], 'pftCreatingNewFile') + else + @Func := GetProcAddress(Handles[i], 'pftCreatedNewFile'); + + if @Func <> nil then begin + case Func(PByte(Item)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_Search(SearchList, Selected: String; Displaying, SearchAgain: Boolean): Boolean; +var Func: TDisplaySearch; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Displaying then + @Func := GetProcAddress(Handles[i], 'pftDisplayingSearch') + else if SearchAgain then + @Func := GetProcAddress(Handles[i], 'pftSearchAgain') + else + @Func := GetProcAddress(Handles[i], 'pftSearch'); + + if @Func <> nil then begin + case Func(PChar(SearchList), PChar(Selected)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_SearchReplace(Expression, Replace, ExpList, RepList: String; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; +var Func: TSearchReplace; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftSearchReplace'); + + if @Func <> nil then begin + case Func(PChar(Expression), PChar(Replace), PChar(ExpList), PChar(RepList), CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_VisibleControlChange(Control: Integer; Show: Boolean): Boolean; +var Func: TVisibleControlChange; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftVisibleControlChange'); + + if @Func <> nil then begin + case Func(Control, Show) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_Compile(CompileType: Integer; Lang, Filename: String; Compiling: Boolean): Boolean; +var Func: TCompile; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Compiling then + @Func := GetProcAddress(Handles[i], 'pftCompiling') + else + @Func := GetProcAddress(Handles[i], 'pftCompile'); + + if @Func <> nil then begin + case Func(CompileType, PChar(Lang), PChar(Filename)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_ShowHelp(HelpType: Integer): Boolean; +var Func: TShowHelp; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftShowHelp'); + + if @Func <> nil then begin + case Func(HelpType) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_CustomItemClick(Caption: String): Boolean; +var Func: TCustomItemClick; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftCustomItemClick'); + + if @Func <> nil then begin + case Func(PChar(Caption)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_ThemeChange(Theme: String): Boolean; +var Func: TThemeChanged; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftThemeChanged'); + + if @Func <> nil then begin + case Func(PChar(Theme)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_Modified(Code: PChar): Boolean; +var Func: TModified; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftModified'); + + if @Func <> nil then begin + case Func(Code) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_KeyPress(var Key: Char): Boolean; +var Func: TKeyPress; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftKeyPress'); + + if @Func <> nil then begin + case Func(Key) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_EditorClick(DoubleClick: Boolean): Boolean; +var Func: TEditorClick; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if DoubleClick then + @Func := GetProcAddress(Handles[i], 'pftDoubleClick') + else + @Func := GetProcAddress(Handles[i], 'pftClick'); + + if @Func <> nil then begin + case Func(DoubleClick) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_UpdateSel(SelStart, SelLength, FirstVisibleLine: Integer): Boolean; +var Func: TUpdateSel; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftUpdateSel'); + + if @Func <> nil then begin + case Func(SelStart, SelLength, FirstVisibleLine) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_CallTipShow(List: PChar): Boolean; +var Func: TCallTipShow; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftCallTipShow'); + + if @Func <> nil then begin + case Func(List) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_CallTipClick(Position: Integer): Boolean; +var Func: TCallTipClick; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftCallTipClick'); + + if @Func <> nil then begin + case Func(Position) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_AutoCompleteShow(List: PChar): Boolean; +var Func: TAutoCompleteShow; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftAutoCompleteShow'); + + if @Func <> nil then begin + case Func(List) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_AutoCompleteSelect(Text: PChar): Boolean; +var Func: TAutoCompleteSelect; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftAutoCompleteSelect'); + + if @Func <> nil then begin + case Func(Text) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_AppMsg(hwnd: HWND; Message: DWord; wParam, lParam: Integer; time: DWord; pt: TPoint): Boolean; +var Func: TAppMsg; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftMessage'); + + if @Func <> nil then begin + case Func(hwnd, Message, wParam, lParam, time, pt) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_UpdateCodeExplorer(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; +var Func: TUpdateCodeTools; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Updating then + @Func := GetProcAddress(Handles[i], 'pftUpdatingCodeExplorer') + else + @Func := GetProcAddress(Handles[i], 'pftUpdatedCodeExplorer'); + + if @Func <> nil then begin + case Func(PChar(Lang), PChar(Filename), PChar(CurrProjects)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_UpdateCodeInspector(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; +var Func: TUpdateCodeTools; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + if Updating then + @Func := GetProcAddress(Handles[i], 'pftUpdatingCodeInspector') + else + @Func := GetProcAddress(Handles[i], 'pftUpdatedCodeInspector'); + + if @Func <> nil then begin + case Func(PChar(Lang), PChar(Filename), PChar(CurrProjects)) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_OutputDblClick(ItemIndex: Integer): Boolean; +var Func: TOutputEvent; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftOutputDoubleClick'); + + if @Func <> nil then begin + case Func(ItemIndex) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +function Plugin_OutputPopup(ItemIndex: Integer): Boolean; +var Func: TOutputEvent; + i: integer; + Handles: TIntegerArray; +begin + Result := True; + + Handles := GetDLLHandles; + for i := 0 to High(Handles) do begin + @Func := GetProcAddress(Handles[i], 'pftOutputPopup'); + + if @Func <> nil then begin + case Func(ItemIndex) of + PLUGIN_HANDLED: Result := False; + PLUGIN_STOP: begin + Result := False; + exit; + end; + end; + end; + end; +end; + +end. diff --git a/editor/studio/UnitReadThread.pas b/editor/studio/UnitReadThread.pas new file mode 100755 index 00000000..eec4a96c --- /dev/null +++ b/editor/studio/UnitReadThread.pas @@ -0,0 +1,58 @@ +unit UnitReadThread; // from AMXX-Edit v2 + +interface + +uses + Classes, SysUtils, Graphics; + +type + TReadThread = class(TThread) + public + ReadTCP: Boolean; + protected + Read: String; + procedure Execute; override; + procedure AddRead; + end; + +implementation + +uses UnitfrmSocketsTerminal; + +{ TReadThread } + +procedure TReadThread.AddRead; +begin + frmSocketsTerminal.OnRead(Read); +end; + +procedure TReadThread.Execute; +begin + if ReadTCP then begin + frmSocketsTerminal.IdTCPClient.ReadTimeout := 50; + repeat + try + Read := frmSocketsTerminal.IdTCPClient.ReadLn; + Synchronize(AddRead); + except + // nothing + end; + until (Terminated) or (not frmSocketsTerminal.IdTCPClient.Connected); + end + else begin + frmSocketsTerminal.IdUDPClient.ReceiveTimeout := 50; + repeat + try + Read := frmSocketsTerminal.IdUDPClient.ReceiveString; + if Read <> '' then // if ReadTimeout then Read = '' + Synchronize(AddRead); + except + // nothing + end; + until (Terminated) or (not frmSocketsTerminal.IdUDPClient.Active); + end; + Free; +end; + +end. + \ No newline at end of file diff --git a/editor/studio/UnitTextAnalyze.pas b/editor/studio/UnitTextAnalyze.pas new file mode 100755 index 00000000..d9a9b625 --- /dev/null +++ b/editor/studio/UnitTextAnalyze.pas @@ -0,0 +1,404 @@ +unit UnitTextAnalyze; + +interface + +uses SysUtils, Classes, Windows, Forms; + +type TPAWNParseResult = class + public + Constants: TStringList; + Defined: TStringList; + CVars: TStringList; + Included: TStringList; + MethodsDefault: TStringList; + Events: TStringList; + Stocks: TStringList; + Natives: TStringList; + Forwards: TStringList; + Variables: TStringList; + + CallTips: TStringList; + AutoComplete: TStringList; + HighlightKeywords: TStringList; + + constructor Create; reintroduce; + procedure DestroyResult; + end; + +function ParseCodePAWN(eCode: TStringList; FileName: String; IsRecursive: Boolean = False): TPAWNParseResult; +function UpdateIncPath(eInput: String): String; + +var eCPUSpeed: Integer = 1; + +implementation + +uses UnitCodeExplorerUpdater, UnitCodeUtils, UnitfrmSettings, + UnitMainTools, UnitfrmMain; + +var eLookedUpIncluded: TStringList; + +function UpdateIncPath(eInput: String): String; +begin + if FileExists(ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text) + eInput + '.inc') then + Result := ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text) + eInput + '.inc' + else if FileExists(ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text) + 'include\' + eInput + '.inc') then + Result := ExtractFilePath(frmSettings.txtPAWNCompilerPath.Text) + 'include\' + eInput + '.inc' + else if (FileExists(ExtractFilePath(ActiveDoc.FileName) + eInput + '.inc')) and (not ActiveDoc.Modified) then + Result := ExtractFilePath(ActiveDoc.FileName) + eInput + '.inc' + else + Result := ''; +end; + +function ParseCodePAWN(eCode: TStringList; FileName: String; IsRecursive: Boolean = False): TPAWNParseResult; +var i, k: integer; + eString, eTemp: string; + eStr, ePreEvents: TStringList; + eStartLine, eBracesOpen: Integer; + eTimeToSleep: Integer; + eAddingEnum: Integer; + eTempResult: TPawnParseResult; + eProcedureAdded: Boolean; +begin + Result := TPawnParseResult.Create; + if not IsRecursive then + eLookedUpIncluded.Clear; + + eStr := TStringList.Create; + ePreEvents := TStringList.Create; + eBracesOpen := 0; + eStartLine := -1; + eTimeToSleep := 0; + eAddingEnum := 0; + + for i := 0 to eCode.Count - 1 do begin + if (Application.Terminated) or (not Started) or (frmMain.pnlLoading.Visible) or (not frmMain.trvExplorer.Visible) then exit; + + eString := RemoveStringsAndComments(Trim(eCode[i]), True); + eProcedureAdded := False; + Inc(eTimeToSleep, 1); + + if eTimeToSleep = eCPUSpeed then begin + Sleep(1); + eTimeToSleep := 0; + end; + + { Constants and Variables } + if (IsAtStart('new', eString)) and (eBracesOpen = 0) and (not IsRecursive) then begin // const or variable + Delete(eString, 1, 4); + eString := Trim(eString); + // we don't need braces so delete them... + while (CountChars(eString, '{') <> 0) and (CountChars(eString, '}') <> 0) and (Pos('{', eString) < Pos('}', eString)) do + eString := StringReplace(eString, '{' + Between(eString, '{', '}') + '}', '', [rfReplaceAll]); + while (CountChars(eString, '[') <> 0) and (CountChars(eString, ']') <> 0) and (Pos('[', eString) < Pos(']', eString)) do + eString := StringReplace(eString, '[' + Between(eString, '[', ']') + ']', '', [rfReplaceAll]); + // done? okay, split all items if there are more than one; and if not, it's okay... + eStr.Text := StringReplace(eString, ',', #13, [rfReplaceAll]); + for k := 0 to eStr.Count - 1 do begin + if (Trim(eStr[k]) <> '') and (eStr[k] <> '}') then begin + eTemp := Trim(RemoveSemicolon(eStr[k])); + + if Pos(':', eTemp) <> 0 then + eTemp := Copy(eTemp, Pos(':', eTemp) + 1, Length(eTemp)); + + if Pos('=', eTemp) <> 0 then begin // constant + Result.Constants.AddObject(Copy(eTemp, 1, Pos('=', eTemp) - 1), TObject(i)); + Result.AutoComplete.Add(Copy(eTemp, 1, Pos('=', eTemp) - 1)); + end + else begin // variable + Result.Variables.AddObject(eTemp, TObject(i)); + Result.AutoComplete.Add(eTemp); + end; + end; + end; + eString := RemoveStringsAndComments(Trim(eCode[i]), True); + end + { Included } + else if (IsAtStart('#include', eString)) then begin + if Between(eString, '<', '>') <> '' then begin + eString := Between(eString, '<', '>'); + if ExtractFileExt(eString) <> '' then + ChangeFileExt(eString, ''); + end + else if Between(eString, '"', '"') <> '' then begin + eString := Between(eString, '"', '"'); + if ExtractFileExt(eString) <> '' then + ChangeFileExt(eString, ''); + end + else begin + eString := Copy(eString, 9, Length(eString)); + if ExtractFileExt(eString) <> '' then + ChangeFileExt(eString, ''); + end; + eString := Trim(eString); + Result.Included.AddObject(eString, TObject(i)); + + // Recursive update + if (eLookedUpIncluded.IndexOf(eString) = -1) then begin + eLookedUpIncluded.Add(eString); + eTemp := UpdateIncPath(eString); + + if (eString <> '') and (FileExists(eTemp)) then begin + // Load code and parse + try + eStr.LoadFromFile(eTemp); + if Application.Terminated then exit; + eTempResult := ParseCodePAWN(eStr, ExtractFileName(eTemp), True); + // Assign parsed values + Result.AutoComplete.AddStrings(eTempResult.AutoComplete); + Result.CallTips.AddStrings(eTempResult.CallTips); + Result.HighlightKeywords.AddStrings(eTempResult.HighlightKeywords); + // free + eTempResult.DestroyResult; + eTempResult := nil; + except + // mmmm.. burger + end; + // wait + Sleep(20); + end; + end; + end + { CVars } + else if (IsAtStart('register_cvar', eString)) and (not IsRecursive) then begin + if Between(eString, '"', '"') <> '' then + Result.CVars.AddObject(Between(eString, '"', '"'), TObject(i)); + end + { Defined } + else if (IsAtStart('#define', eString)) then begin + eString := Copy(eString, 8, Length(eString)); + eString := Trim(eString); + Result.CallTips.Add(eString + '-> ' + FileName); + if Pos(#32, eString) <> 0 then + eString := Copy(eString, 1, Pos(#32, eString) - 1); + if Pos(' ', eString) <> 0 then + eString := Copy(eString, 1, Pos(' ', eString) - 1); + Result.Defined.AddObject(eString, TObject(i)); + Result.AutoComplete.Add(eString); + end + { Events (Part 1) } + else if (IsAtStart('register_event(', eString)) and (not IsRecursive) then begin + if CountChars(eString, '"') >= 4 then begin + eTemp := StringReplace(eString, '"' + Between(eString, '"', '"') + '"', '', []); + ePreEvents.Add(Between(eString, '"', '"')); + end; + end; + + { Functions (1), this is adapted from AMXX-Edit v2 [see TextAnalyze.pas] } + eBracesOpen := eBracesOpen + CountChars(eString, '{'); + eBracesOpen := eBracesOpen - CountChars(eString, '}'); + + if Pos('{', eString) <> 0 then begin + { Enums -> } + if eAddingEnum = 1 then begin + eAddingEnum := 2; + Delete(eString, 1, Pos('{', eString) + 1); + end + else begin + if eStartLine = -1 then begin + eProcedureAdded := True; + eStartLine := i; + end; + end; + { <- Enums } + end; + if (Pos('}', eString) <> 0) and (not IsAtStart('new', Trim(eCode[eStartLine]))) then begin + { Enums -> } + if eAddingEnum <> 0 then + eAddingEnum := 0; + + { <- Enums } + if (eBracesOpen = 0) and (Length(Trim(eCode[eStartLine])) > 1) then begin + eTemp := Trim(RemoveSemicolon(Trim(eCode[eStartLine]))); + + if eTemp[Length(eTemp)] = '{' then + eTemp := Trim(Copy(eTemp, 1, Length(eTemp) -1)); + + // Analyze type + k := 0; + if IsAtStart('public', eTemp) then + k := 1 + else if IsAtStart('stock', eTemp) then + k := 2 + else if IsAtStart('native', eTemp) then + k := 3 + else if IsAtStart('forward', eTemp) then + k := 4 + else if Pos('enum', LowerCase(eTemp)) = 1 then // no method + k := 5; + + // Remove type + if (Pos(#32, eTemp) <> 0) and (Pos(#32, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eCode[eStartLine], Pos(#32, eCode[eStartLine]) + 1, Length(eCode[eStartLine])) + else if (Pos(#9, eTemp) <> 0) and (Pos(#9, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eTemp, Pos(#9, eTemp) + 1, Length(eTemp)); + // Remove return-type + if (Pos(':', eTemp) <> 0) and (Pos(':', eTemp) < Pos('(', eTemp)) then + Delete(eTemp, 1, Pos(':', eTemp)); + + if Pos('operator', eTemp) = 1 then + k := 6; + + if k < 5 then + Result.CallTips.Add(eTemp + '-> ' + FileName); + // Copy function-name + if Pos('(', eTemp) <> 0 then + eTemp := Copy(eTemp, 1, Pos('(', eTemp) - 1); + eTemp := Trim(eTemp); + + if k < 5 then begin + Result.AutoComplete.Add(eTemp); + Result.HighlightKeywords.Add(eTemp); + end; + + if eTemp <> '' then begin + case k of + 0: begin + if not IsRecursive then + Result.MethodsDefault.AddObject(eTemp, TObject(eStartLine)); // Default Method + end; + 1: begin + k := ePreEvents.IndexOf(eTemp); + if k <> -1 then begin + Result.Events.AddObject(eTemp, ePreEvents.Objects[k]); + ePreEvents.Delete(k); + end + else + Result.MethodsDefault.AddObject(eTemp, TObject(eStartLine)); + end; + 2: Result.Stocks.AddObject(eTemp, TObject(eStartLine)); + 3: Result.Natives.AddObject(eTemp, TObject(eStartLine)); + 4: Result.Forwards.AddObject(eTemp, TObject(eStartLine)); + end; + end; + eStartLine := -1; + eBracesOpen := 0; + end; + end + else if (eAddingEnum = 2) and (Pos('enum', LowerCase(eString)) <> 1) then begin + if Pos(' ', eString) <> 0 then + eString := Copy(eString, 1, Pos(' ', eString) - 1); + if Pos(',', eString) <> 0 then + eString := Copy(eString, 1, Pos(',', eString) - 1); + if Pos(' ', eString) <> 0 then + eString := Copy(eString, 1, Pos(' ', eString) - 1); + if Pos(':', eString) <> 0 then + eString := Copy(eString, 1, Pos(':', eString) - 1); + Result.AutoComplete.Add(eString); + end; + + { Enums } + if IsAtStart('enum', eString) then begin + if Pos('{', eString) <> 0 then + eAddingEnum := 2 // Add values immediately + else + eAddingEnum := 1; // Wait for next brace and add then + end; + + { Functions (2) } + if (IsAtStart('forward', eString)) or (IsAtStart('public', eString)) or (IsAtStart('native', eString)) or (IsAtStart('stock', eString)) then begin + if (not eProcedureAdded) and (Pos('(', eString) <> 0) then begin + eTemp := Trim(RemoveSemicolon(eString)); + if eTemp[Length(eTemp)] = '{' then + eTemp := Trim(Copy(eTemp, 1, Length(eTemp) -1)); + + // Remove type + if (Pos(#32, eTemp) <> 0) and (Pos(#32, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eTemp, Pos(#32, eTemp) + 1, Length(eTemp)); + if (Pos(#9, eTemp) <> 0) and (Pos(#9, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eTemp, Pos(#9, eTemp) + 1, Length(eTemp)); + // Remove return-type + if (Pos(':', eTemp) <> 0) and (Pos(':', eTemp) < Pos('(', eTemp)) then + Delete(eTemp, 1, Pos(':', eTemp)); + + if (Pos('enum', eTemp) = Pos('operator', eTemp)) and (Pos('enum', eTemp) = 0) then + Result.CallTips.Add(eTemp + '-> ' + FileName); + + // Copy function-name + if Pos('(', eTemp) <> 0 then + eTemp := Copy(eTemp, 1, Pos('(', eTemp) - 1); + eTemp := Trim(eTemp); + + if (Pos('enum', eTemp) = Pos('operator', eTemp)) and (Pos('enum', eTemp) = 0) then begin + Result.AutoComplete.Add(eTemp); + Result.HighlightKeywords.Add(eTemp); + end; + + if eTemp <> '' then begin + if IsAtStart('forward', eString) then + Result.Forwards.AddObject(eString, TObject(i)) + else if IsAtStart('public', eString) then begin + k := ePreEvents.IndexOf(eTemp); + if k <> -1 then begin + Result.Events.AddObject(eTemp, ePreEvents.Objects[k]); + ePreEvents.Delete(k); + end + else + Result.MethodsDefault.AddObject(eTemp, TObject(i)); + end + else if IsAtStart('native', eString) then + Result.Natives.AddObject(eTemp, TObject(i)) + else if IsAtStart('stock', eString) then + Result.Stocks.AddObject(eTemp, TObject(i)) + else if (Pos('enum', eTemp) = Pos('operator', eTemp)) and (Pos('enum', eTemp) = 0) then + Result.MethodsDefault.AddObject(eTemp, TObject(i)); + end; + end; + end; + end; + ePreEvents.Free; + eStr.Free; +end; + +{ TPAWNParseResult } + +constructor TPAWNParseResult.Create; +begin + inherited Create; + + Constants := TStringList.Create; + Defined := TStringList.Create; + CVars := TStringList.Create; + Included := TStringList.Create; + MethodsDefault := TStringList.Create; + Events := TStringList.Create; + Stocks := TStringList.Create; + Natives := TStringList.Create; + Forwards := TStringList.Create; + Variables := TStringList.Create; + + CallTips := TStringList.Create; + AutoComplete := TStringList.Create; + HighlightKeywords := TStringList.Create; +end; + +procedure TPAWNParseResult.DestroyResult; +begin + Constants.Free; + Defined.Free; + CVars.Free; + Included.Free; + MethodsDefault.Free; + Events.Free; + Stocks.Free; + Natives.Free; + Forwards.Free; + Variables.Free; + + CallTips.Free; + AutoComplete.Free; + HighlightKeywords.Free; + + Free; +end; + +initialization + + eLookedUpIncluded := TStringList.Create; + +finalization + + eLookedUpIncluded.Free; + + +end. + diff --git a/editor/studio/UnitfrmAllFilesForm.dfm b/editor/studio/UnitfrmAllFilesForm.dfm new file mode 100755 index 0000000000000000000000000000000000000000..a712754892f12f916c16d2cfab465e79c0cbc524 GIT binary patch literal 970 zcmd6kyKdVs6ox6u*2VG--8wa6ry_eNS+S77a%ETy+^waga1qYqAX+cc>GZ)s2(NW!ZhS%I=9XY;_j4Dkp5+*`+UJm_BAo?*&1lxN}w!(O@V zLpMeL?zGiAQh;e}^)5HiusYU;idZY)q1tNk<3`aa`6q zvz=0c_tPSa7F}fDP#f7N)CuT|M?){IgKtxh7Dp{@8d84!*I>rSA8j~h9Vpwufgc5Qc5%!%3W^AOsRzSRup>lv~e<6DyVSrPxs=F0i#H@v56$YrSbwAx;%{ zPMrBgNc;lCk3bw@y>^p+z|AwOnfG~T#(x?{;LXR~MKC>?^aqo`=sfsbGK^s6b=tvF zth*b@Pgn#@wr)k`5iDithgk}EQo1so9v2Y^UtUtMYiDVnV9HmvixWvWtG?()7np?* zp{(EQydln>kPlK4wo02WB}!!oWED#*aq{q#L^3YDG%GHrT-f!H_9XLg2u+VO`Noa0 zNI}|1{ejnAjDmOWusin$K_h?FHO-Ko5*G1o06XdEheG66T}KnVhH5pyF<;}nP}^{f z_LN4h04!menXA=iJS7>l-A=e43IOIRWDuMnO=}sp`t&7F>c$;}qZyLosqimeO3{7}=yJ>HYq^pYA&(izk=SC`r%B>Cq3HkZc^E`q`|WN5}zGshrkmq+ z#R|U4U@ZfEU{I`|zTREYIXF&6OFpOOq2?Qq!vu?{1}Y(GRCwN)i>e{+9xiyA*8nV1 zoT2WGt2Lk)Lp@}9X}#|>P+O25ak8|e3-Cm_h#RTeBdgt5WIZ`B3h#-ty}t_j^-`24 ze+%}0=hWG zA)E1iL)%+JzwZp~?X)}}BTxaM0EAqI6wzca-0)?%qD+R8heGLn)ku7O7nP9TW@^lD zD_D85zS|q$fga!S7VXy#O^t6a^3GITaR$zi6)Gs!u{Qx)Bn&tH(WEh7g*?AaH67o} z=v3#-B0<6~`BK1uubBJz0eDyPM->B;k03`CM2^^}bw~4^@-+zmsb2T_I?+E(oR}}@ J=7x}p&u_RlJ#PR2 literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmClose.pas b/editor/studio/UnitfrmClose.pas new file mode 100755 index 00000000..2d2f9841 --- /dev/null +++ b/editor/studio/UnitfrmClose.pas @@ -0,0 +1,61 @@ +unit UnitfrmClose; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, CheckLst, TFlatSpeedButtonUnit, ComCtrls, + JvExComCtrls, JvComCtrls, JvCheckTreeView; + +type + TfrmClose = class(TForm) + shpFiles: TShape; + cmdSave: TFlatSpeedButton; + cmdCancel: TFlatSpeedButton; + lblInfo: TLabel; + trvFiles: TJvCheckTreeView; + procedure trvFilesMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + end; + +var + frmClose: TfrmClose; + +implementation + +uses UnitLanguages; + +{$R *.DFM} + +procedure TfrmClose.trvFilesMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var eClose: Boolean; + i, k: integer; +begin + if Assigned(trvFiles.GetNodeAt(X, Y)) then begin + if not Assigned(trvFiles.GetNodeAt(X, Y).Parent) then begin + eClose := trvFiles.Checked[trvFiles.GetNodeAt(X, Y)]; + with trvFiles.GetNodeAt(X, Y) do begin + for i := 0 to Count -1 do + trvFiles.Checked[Item[i]] := eClose; + end; + end; + end; + + eClose := True; + for i := 0 to trvFiles.Items.Count -1 do begin + for k := 0 to trvFiles.Items[i].Count -1 do begin + if (trvFiles.Checked[trvFiles.Items[i].Item[k]]) then begin + eClose := False; + break; + end; + end; + end; + + if eClose then + cmdSave.Caption := lCloseCaption + else + cmdSave.Caption := lSaveCaption; +end; + +end. diff --git a/editor/studio/UnitfrmConnGen.dfm b/editor/studio/UnitfrmConnGen.dfm new file mode 100755 index 0000000000000000000000000000000000000000..b004f97440131597cc4160acbc1c9e3b3972bc5e GIT binary patch literal 1886 zcmd5+y>in)5I#$>WJ|V_0%m~9!vlm2B^9x3C&5mviIjn%31?{?i=6K~r!#SC3Oe3^ zSD>Td38;7sIw+~(PA6Lq4oO2ncR#z|e&2U{`^!OL_xR8o93Aa-j?m85fsIh;cX!-y z#3vr3bPuRgEI0Zv66TMR8M3MQq2#t0kAVl`l7L+qrtJh1c4m8cDiTJmI|=|IwQfor z;8-wT^GE_z>_c)k7Uoyv>izR17Gv`pDtnADZdW7H610mWsC5|?+uj)S6okFm?sRug z`r)a!zk3{XLPy_bIkkv9PiV|8LYNCTyUy2p==&`WIX>o+o3gQj zq);DIAnufs0E9^BS*o=*GOf*A>lc)3HQynp1#f^1X3|8vI(*Y-7r-U=5DzoU4F#IH zXG{0?St>MOB?H{ifX0J`clD(;WflA6O196q&Nkm`?;q#s_pV7-!9}_&i~F1j7BR9) z;AM_*vW~E|(&XXg6bi7q>H`*?gHVm9;jB#0Mh@3nhpXv~rb>}eP8dwX){9P@2wTWj zTNAcXzVRU5BlG8R}&DF^%P z+?c{j)tg!!i?seyvj;*(AOp2yV3^D7h7u;$hD%aK1=l-c;V9v-{F7d<*LE2Nu5N*@ zW2JqttLuVBDz1M=O;<1>jaJA8ijPPL?UCTB=f*^4pp1)~;i&&G#UI_<{yZ3BtLm0B z?T{@fkHjN}t+LC;9^^->yxo%obRCmeB%~TF8QZAqvB;G`6nKRW)AU6~3+hHU6+tKg zxSLZ3se3$##iL=4giMN4$ERChnGf=ghq3m_DzNvc9i-zaSpu`zlI^`Hjnf*1Z(5^S ziT;Z8!^F|DS3U!hfm5P7Du&WMXD2q!BjKvBb6uGF#$4pqFCsm5y9j?6kKBL!KWE(Y(otsCJnL z^7CJV(LKE=!=dMaVjH+PmJiYB94lo!IC y%^}+`rPW$Eh6L~~1w&V{%J=Y_-d3*HB|HRHEd>8dvR=JD$*%o>vb8_SM!x_rRblo3 literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmGoToLine.pas b/editor/studio/UnitfrmGoToLine.pas new file mode 100755 index 00000000..6b8f46c0 --- /dev/null +++ b/editor/studio/UnitfrmGoToLine.pas @@ -0,0 +1,51 @@ +unit UnitfrmGoToLine; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, mbTBXEdit, mbTBXValidateEdit, TBXDkPanels, + SpTBXDkPanels, SpTBXEditors; + +type + TfrmGoToLine = class(TForm) + lblCaption: TLabel; + txtGoToLine: TSpTBXEdit; + cmdOK: TSpTBXButton; + cmdCancel: TSpTBXButton; + procedure txtGoToLineChange(Sender: TObject); + procedure txtGoToLineKeyPress(Sender: TObject; var Key: Char); + procedure FormShow(Sender: TObject); + end; + +var + frmGoToLine: TfrmGoToLine; + +implementation + +uses UnitMainTools; + +{$R *.DFM} + +procedure TfrmGoToLine.txtGoToLineChange(Sender: TObject); +begin + if not IsNumeric(txtGoToLine.Text) then + txtGoToLine.Text := '1' + else if txtGoToLine.Text = '0' then + txtGoToLine.Text := '1'; +end; + +procedure TfrmGoToLine.txtGoToLineKeyPress(Sender: TObject; var Key: Char); +begin + if Key = #13 then begin + cmdOK.Click; + Key := #0; + end; +end; + +procedure TfrmGoToLine.FormShow(Sender: TObject); +begin + txtGoToLine.SetFocus; +end; + +end. diff --git a/editor/studio/UnitfrmHTMLPreview.dfm b/editor/studio/UnitfrmHTMLPreview.dfm new file mode 100755 index 0000000000000000000000000000000000000000..207b313e80c6e0ff81d3bacddb9fd07e5d435019 GIT binary patch literal 667 zcmah`!EV$r5OtE>B%AEE6!q8xMK-&gg9{I zio`eY4g3N9gx)!GE{?NBLI^RE?HRq9c{9&<0mAY6Y=O^`bUlByoagA|!FwAaoW>{n zcq?lINw}oY?)@1K64)x|v+ZDU;ru|uoR+F`K3VPp=y|1_r&c%6MCqJq2Qj^I(+GYliag!D!mHd8z%8yLretK+C5vH|7opU&gy%LKoU7SnY$ z$3c&pn(?MY~K zNCHu?>Xz``70)WsdcH~5-Xx`0z?u}~l5Z;eP0%s#I43B?ITSM~+6LsPEp`hU&1}?3 zX5TCJ@wZ|J)^N(`Irn_RB1VBLACtn++bE2*6jHELqDb%sA(ZIz;W0wbkF@g->vHbR z($4Koj+$rR557_#Jvn|@1Us pnlHudmessage.Width then + lblHudMsg.Left := pnlHudmessage.Width; + txtXPos.Text := FloatToStr(RoundTo(lblHudMsg.Left / pnlHudmessage.Width, -2)); + end; + + { Y Pos } + if not chkYCenter.Checked then begin + lblHudMsg.Top := lblHudMsg.Top + (Y - eStartPos.Y); + if lblHudMsg.Top < 0 then + lblHudMsg.Top := 0 + else if lblHudMsg.Top > pnlHudmessage.Height then + lblHudMsg.Top := pnlHudmessage.Height; + txtYPos.Text := FloatToStr(RoundTo(lblHudMsg.Top / pnlHudmessage.Height, -2)); + end; + end; +end; + +procedure TfrmHudMsgGenerator.lblHudMsgMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + eDown := False; +end; + +procedure TfrmHudMsgGenerator.PaintColor; +begin + imgColor.Canvas.Pen.Color := $008396A0; + imgColor.Canvas.Brush.Color := CurrColor; + imgColor.Canvas.Rectangle(0, 0, 31, 31); +end; + +procedure TfrmHudMsgGenerator.txtXPosKeyPress(Sender: TObject; + var Key: Char); +var eXVal: Real; +begin + if Key = '.' then + Key := ',' + else if Key = #13 then begin + try + eXVal := RoundTo(StrToFloat(txtXPos.Text), -2); + txtXPos.Text := FloatToStr(eXVal); + if Pos(',', txtXPos.Text) = 0 then + txtXPos.Text := txtXPos.Text + ',0'; + lblHudMsg.Left := Round(eXVal * pnlHudmessage.Width); + Key := #0; + except + txtXPos.Text := '0,00'; + lblHudMsg.Left := 0; + end; + end; +end; + +procedure TfrmHudMsgGenerator.txtYPosKeyPress(Sender: TObject; + var Key: Char); +var eYVal: Real; +begin + if Key = '.' then + Key := ',' + else if Key = #13 then begin + try + eYVal := RoundTo(StrToFloat(txtYPos.Text), -2); + txtYPos.Text := FloatToStr(eYVal); + if Pos(',', txtYPos.Text) = 0 then + txtYPos.Text := txtYPos.Text + ',0'; + lblHudMsg.Top := Round(eYVal * pnlHudmessage.Height); + Key := #0; + except + txtYPos.Text := '0,00'; + lblHudMsg.Left := 0; + end; + end; +end; + +procedure TfrmHudMsgGenerator.FormShow(Sender: TObject); +begin + CurrColor := clRed; + PaintColor; +end; + +procedure TfrmHudMsgGenerator.txtTextKeyPress(Sender: TObject; + var Key: Char); +begin + if Key = #13 then begin + txtText.SelText := '\n'; + Key := #0; + end; +end; + +procedure TfrmHudMsgGenerator.cmdSelectColorClick(Sender: TObject); +begin + frmSelectColor.chkDefault1.Enabled := False; + frmSelectColor.chkDefault2.Enabled := False; + ShowColorDialog(CurrColor, imgColor); + lblHudMsg.Font.Color := CurrColor; + frmSelectColor.chkDefault1.Enabled := True; + frmSelectColor.chkDefault2.Enabled := True; +end; + +procedure TfrmHudMsgGenerator.txtTextChange(Sender: TObject); +begin + if txtText.Text = '' then + lblHudMsg.Caption := 'Custom Hudmessage' + else + lblHudMsg.Caption := stringReplace(txtText.Text, '\n', #13, [rfReplaceAll]); + + if chkXCenter.Checked then + CenterX; + if chkYCenter.Checked then + CenterY; +end; + +procedure TfrmHudMsgGenerator.txtTimeToShowKeyPress(Sender: TObject; + var Key: Char); +begin + if Key = '.' then + Key := ','; +end; + +procedure TfrmHudMsgGenerator.txtTimeToShowChange(Sender: TObject); +var eVal: Real; +begin + try + eVal := Round(StrToFloat(txtTimeToShow.Text)); + if eVal < 0 then begin + eVal := 0.0; + txtTimeToShow.Text := FloatToStr(eVal); + end; + except + txtTimeToShow.Text := '12,0'; + end; +end; + +procedure TfrmHudMsgGenerator.chkXCenterClick(Sender: TObject); +var eChar: Char; +begin + if chkXCenter.Checked then begin + txtXPos.Text := '-1,0'; + CenterX; + end + else begin + txtXPos.Text := '0,5'; + eChar := #13; + txtXPosKeyPress(Sender, eChar); + end; + + txtXPos.Enabled := not chkXCenter.Checked; +end; + +procedure TfrmHudMsgGenerator.chkYCenterClick(Sender: TObject); +var eChar: Char; +begin + if chkYCenter.Checked then begin + txtYPos.Text := '-1,0'; + CenterY; + end + else begin + txtYPos.Text := '0,5'; + eChar := #13; + txtYPosKeyPress(Sender, eChar); + end; + + txtYPos.Enabled := not chkYCenter.Checked; +end; + +procedure TfrmHudMsgGenerator.CenterX; +begin + lblHudMsg.Left := (pnlHudmessage.Width div 2) - (lblHudMsg.Width div 2); +end; + +procedure TfrmHudMsgGenerator.CenterY; +begin + lblHudMsg.Top := (pnlHudmessage.Height div 2) - (lblHudMsg.Height div 2); +end; + +procedure TfrmHudMsgGenerator.txtPosExit(Sender: TObject); +var eChar: Char; +begin + eChar := #13; + if Sender = txtXPos then + txtXPos.OnKeyPress(txtXPos, eChar) + else + txtYPos.OnKeyPress(txtXPos, eChar); +end; + +end. diff --git a/editor/studio/UnitfrmInfo.dfm b/editor/studio/UnitfrmInfo.dfm new file mode 100755 index 0000000000000000000000000000000000000000..081ca7b0f3ebe35da649b92b53f673430745da1d GIT binary patch literal 273886 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%0D{L1Vx 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 literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmInfo.pas b/editor/studio/UnitfrmInfo.pas new file mode 100755 index 00000000..48fbb9d2 --- /dev/null +++ b/editor/studio/UnitfrmInfo.pas @@ -0,0 +1,56 @@ +unit UnitfrmInfo; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, TBXDkPanels, SpTBXDkPanels, JvExControls, + JvComponent, JvScrollText, ShellAPI, IdHTTP, jpeg, Dialogs; + +type + TfrmInfo = class(TForm) + lblInfo3: TLabel; + lblInfo2: TLabel; + lblInfo1: TLabel; + imgAMXXLarge: TImage; + cmdClose: TSpTBXButton; + pnlGallery: TPanel; + Label1: TLabel; + imgGabeN: TImage; + imgBurger: TImage; + Label2: TLabel; + Label3: TLabel; + imgYams: TImage; + procedure imgGabeNDblClick(Sender: TObject); + procedure imgBurgerDblClick(Sender: TObject); + procedure imgYamsDblClick(Sender: TObject); + end; + +var + frmInfo: TfrmInfo; + +implementation + +{$R *.DFM} + +procedure TfrmInfo.imgGabeNDblClick(Sender: TObject); +begin + ShellExecute(Handle, 'open', PChar('http://sniperbeamer.de/gallery/gaben.php'), nil, nil, SW_SHOW); +end; + +procedure TfrmInfo.imgBurgerDblClick(Sender: TObject); +begin + MessageBeep(MB_ICONQUESTION); + if MessageBox(Handle, 'Do you want a BIG TASTY BURGER?', 'all-in-one-messagebox', MB_ICONQUESTION + MB_YESNO) = mrYes then begin + ShellExecute(Handle, 'open', 'http://www.amxmodx.org/forums/viewtopic.php?t=14658&karma_up=8284', nil, nil, SW_SHOW); + Sleep(5000); + MessageBox(Handle, 'zomg you won''t get one. GabeN (tm) has already eaten each burger on THIS F**KIN'' BURGERLESS WORLD >_< :( Sorry.', 'all-in-one-messagebox', MB_ICONERROR); + end; +end; + +procedure TfrmInfo.imgYamsDblClick(Sender: TObject); +begin + MessageBox(Handle, 'myam(s) myam(s), myam(s)...', 'all-in-one-messagebox', MB_ICONINFORMATION); +end; + +end. diff --git a/editor/studio/UnitfrmMOTDGen.dfm b/editor/studio/UnitfrmMOTDGen.dfm new file mode 100755 index 0000000000000000000000000000000000000000..a83dd8dd1c801586090bfcfdb39be9351e2f6349 GIT binary patch literal 1128 zcmd6m&vMf+5XNOEvHT}V%ZcHZ;Q=~@1NX#98fKCv6RVU91B$(=HI*fgth5O?UWOYF zzyt6|oWYjU1ekJUhMRY_((dou&p&)b#>?4kPKFnwOLTr3H4!3<@p(YjDl=&i{_(Rp zg|%*cu^L3?jg1uyq)I?VddC5~t76C~mp3@1xn@#0-Rgnf1qe`7OVtiJ1ED9tZc^R& zhJrf2W{FN4pR86Wxm4JT`9O;?jiEi3LZ5{xRRw5#G8~QjS5xvnob;E`i1_uXxzmpM zH4}-vC$QClIjFnX-#rsu(hMAj&{Sr$zG!9+PIJH0cRjYlI4hl%N9doK@kV&k!x&k*^*-j;u?X+sjr|>dy+$D5n^stfJk2Sk1_3`%0uD2AJ zEk!9UMQ>K*o*$+1zV?HM-+(GA2Q*)ty?ljGn?yMoyd7+`mcos*B;>My+Dy-lnI06f z-|YpmpB-$}GS$bKtkWqIxApq}Vvg>y!WhIU$K@M1Iiw%#(K%#{MLM&n7g164B2a97 ze5H0vur97d=@QNapkO8w%9l`VxV9~iq>usG<$xWX>Js)3YFtsveD^DK<1?y#@fh`! ks=B9TFXk*?Nve{g0ydtD^5=+9#aDS1X68k8~^|S literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmMOTDGen.pas b/editor/studio/UnitfrmMOTDGen.pas new file mode 100755 index 00000000..4e6cc01e --- /dev/null +++ b/editor/studio/UnitfrmMOTDGen.pas @@ -0,0 +1,30 @@ +unit UnitfrmMOTDGen; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, mxFlatControls, TBXDkPanels, SpTBXDkPanels; + +type + TfrmMOTDGen = class(TForm) + txtMOTD: TmxFlatMemo; + cmdClose: TSpTBXButton; + cmdCopy: TSpTBXButton; + procedure cmdCopyClick(Sender: TObject); + end; + +var + frmMOTDGen: TfrmMOTDGen; + +implementation + +{$R *.DFM} + +procedure TfrmMOTDGen.cmdCopyClick(Sender: TObject); +begin + txtMOTD.CopyToClipboard; + txtMOTD.CopyToClipboard; +end; + +end. diff --git a/editor/studio/UnitfrmMain.dfm b/editor/studio/UnitfrmMain.dfm new file mode 100755 index 00000000..7c941579 --- /dev/null +++ b/editor/studio/UnitfrmMain.dfm @@ -0,0 +1,7741 @@ +object frmMain: TfrmMain + Left = 312 + Top = 331 + Width = 888 + Height = 640 + Caption = 'AMXX-Studio' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001002020040000000000E80200001600000028000000200000004000 + 0000010004000000000000020000000000000000000000000000000000000000 + 000000008000008000000080800080000000800080008080000080808000C0C0 + C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF004444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 44446664444444444666644444444444444CCCC644444444CCCC644444444444 + 444C88CC6444444CC88C644444444444444C888CC64444CC888C644444444444 + 444CC888CC644CC888CC4444444444444444CC888CC6CC888CC4444444444444 + 444444C888CCC888CC44444444444444444444CC888C888CC444444444444444 + 4444444CC88888CC4444444444444444444444444C888C644444444444444444 + 44444444CC888CC644444444444444444444444CC88888CC6444444444444444 + 444444CC888C888CC64444444444444444444CC888CCC888CC64444444444444 + 4444CC888CC4CC888CC6444444444444444CC888CC444CC888CC644444444444 + 444C888CC44444CC888C644444444444444C88CC4444444CC88C644444444444 + 444CCCC444444444CCCC44444444444444444444444444444444444444444444 + 4444444444444444444444444444444444446664444444446664444444444444 + 44444663BB000BB3664444444444444444444466333333366444444444444444 + 4444444466666664444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444440000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000380000000000000000000000000000000000000000000} + KeyPreview = True + OldCreateOrder = False + OnClose = FormClose + OnConstrainedResize = FormConstrainedResize + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object tbxTopDock: TSpTBXDock + Left = 0 + Top = 0 + Width = 880 + Height = 72 + object tbxMenu: TSpTBXToolbar + Left = 0 + Top = 0 + Caption = 'Menu' + CloseButton = False + DefaultDock = tbxTopDock + DockPos = 0 + Images = ilImages + TabOrder = 0 + ChevronVertical = True + object mnuFile: TSpTBXSubmenuItem + CaptionW = 'File' + object mnuNew: TSpTBXSubmenuItem + ImageIndex = 32 + Images = ilImages + CaptionW = 'New' + object infoNewAMXX: TSpTBXRightAlignSpacerItem + FontSettings.Bold = tsTrue + FontSettings.Color = clWindowText + CaptionW = 'AMXX Scripts / Pawn' + end + object mnuEmptyPlugin: TSpTBXItem + ImageIndex = 0 + Images = ilImages + OnClick = mnuEmptyPluginClick + CaptionW = 'Empty Plugin' + end + object mnuNewPlugin: TSpTBXItem + ImageIndex = 18 + Images = ilImages + OnClick = mnuNewPluginClick + CaptionW = 'Plugin' + end + object mnuHeaderPAWN: TSpTBXItem + ImageIndex = 33 + Images = ilImages + OnClick = mnuHeaderPAWNClick + CaptionW = 'Header' + end + object sepNew1: TSpTBXSeparatorItem + Blank = True + end + object infoNewCPP: TSpTBXRightAlignSpacerItem + FontSettings.Bold = tsTrue + FontSettings.Color = clWindowText + CaptionW = 'C++' + end + object mnuNewModule: TSpTBXItem + Enabled = False + ImageIndex = 35 + Images = ilImages + OnClick = mnuNewModuleClick + CaptionW = 'Module' + end + object mnuNewUnit: TSpTBXItem + Enabled = False + ImageIndex = 34 + Images = ilImages + OnClick = mnuNewUnitClick + CaptionW = 'Unit' + end + object mnuNewHeaderCPP: TSpTBXItem + Enabled = False + ImageIndex = 48 + Images = ilImages + OnClick = mnuNewHeaderCPPClick + CaptionW = 'Header' + end + object sepNew3: TSpTBXSeparatorItem + Blank = True + end + object infoNewOther: TSpTBXRightAlignSpacerItem + FontSettings.Bold = tsTrue + FontSettings.Color = clWindowText + CaptionW = 'Other' + end + object mnuNewTextfile: TSpTBXItem + ImageIndex = 34 + Images = ilImages + OnClick = mnuNewTextfileClick + CaptionW = 'Textfile' + end + object mnuNewHTML: TSpTBXItem + ImageIndex = 25 + Images = ilImages + OnClick = mnuNewHTMLClick + CaptionW = 'HTML Page' + end + object mnuNewSQL: TSpTBXItem + ImageIndex = 44 + Images = ilImages + OnClick = mnuNewSQLClick + CaptionW = 'SQL Database' + end + object mnuNewXML: TSpTBXItem + ImageIndex = 34 + OnClick = mnuNewXMLClick + CaptionW = 'XML File' + end + end + object sepFile1: TSpTBXSeparatorItem + end + object mnuOpen: TSpTBXItem + ImageIndex = 3 + Images = ilImages + ShortCut = 16463 + OnClick = mnuOpenClick + CaptionW = 'Open...' + end + object sepFile2: TSpTBXSeparatorItem + end + object mnuSave: TSpTBXItem + ImageIndex = 1 + Images = ilImages + ShortCut = 16467 + OnClick = mnuSaveClick + CaptionW = 'Save' + end + object mnuSaveAs: TSpTBXItem + OnClick = mnuSaveAsClick + CaptionW = 'Save as...' + end + object mnuSaveAllFiles: TSpTBXItem + ImageIndex = 2 + Images = ilImages + ShortCut = 24659 + OnClick = mnuSaveAllFilesClick + CaptionW = 'Save all files' + end + object sepFile3: TSpTBXSeparatorItem + end + object mnuClose: TSpTBXItem + ImageIndex = 46 + ShortCut = 16430 + OnClick = mnuCloseClick + CaptionW = 'Close' + end + object mnuCloseAllFiles: TSpTBXItem + OnClick = mnuCloseAllFilesClick + CaptionW = 'Close all files' + end + object sepFile4: TSpTBXSeparatorItem + end + object mnuPrint: TSpTBXItem + ImageIndex = 4 + Images = ilImages + ShortCut = 16464 + OnClick = mnuPrintClick + CaptionW = 'Print' + end + object sepFile5: TSpTBXSeparatorItem + end + object mnuExit: TSpTBXItem + ImageIndex = 45 + Images = ilImages + ShortCut = 32883 + OnClick = mnuExitClick + CaptionW = 'Exit' + end + end + object mnuEdit: TSpTBXSubmenuItem + CaptionW = 'Edit' + object mnuUndo: TSpTBXItem + ImageIndex = 6 + Images = ilImages + ShortCut = 16474 + OnClick = mnuUndoClick + CaptionW = 'Undo' + end + object mnuRedo: TSpTBXItem + ImageIndex = 7 + Images = ilImages + ShortCut = 24666 + OnClick = mnuRedoClick + CaptionW = 'Redo' + end + object sepEdit1: TSpTBXSeparatorItem + end + object mnuCut: TSpTBXItem + ImageIndex = 8 + Images = ilImages + ShortCut = 16472 + OnClick = mnuCutClick + CaptionW = 'Cut' + end + object mnuCopy: TSpTBXItem + ImageIndex = 9 + Images = ilImages + ShortCut = 16451 + OnClick = mnuCopyClick + CaptionW = 'Copy' + end + object mnuPaste: TSpTBXItem + ImageIndex = 10 + Images = ilImages + ShortCut = 16470 + OnClick = mnuPasteClick + CaptionW = 'Paste' + end + object sepEdit2: TSpTBXSeparatorItem + end + object mnuSelectAll: TSpTBXItem + ImageIndex = 11 + Images = ilImages + ShortCut = 16449 + OnClick = mnuSelectAllClick + CaptionW = 'Select all' + end + end + object mnuSearch: TSpTBXSubmenuItem + CaptionW = 'Search' + object mnuSearchDialog: TSpTBXItem + ImageIndex = 13 + Images = ilImages + ShortCut = 16454 + OnClick = mnuSearchDialogClick + CaptionW = 'Search' + end + object mnuSearchAgain: TSpTBXItem + ShortCut = 114 + OnClick = mnuSearchAgainClick + CaptionW = 'Search again' + end + object sepSearch1: TSpTBXSeparatorItem + end + object mnuReplace: TSpTBXItem + ImageIndex = 39 + Images = ilImages + ShortCut = 16466 + OnClick = mnuReplaceClick + CaptionW = 'Replace' + end + object sepSearch2: TSpTBXSeparatorItem + end + object mnuGoToLine: TSpTBXItem + ImageIndex = 14 + Images = ilImages + ShortCut = 16455 + OnClick = mnuGoToLineClick + CaptionW = 'Go to line...' + end + end + object mnuView: TSpTBXSubmenuItem + CaptionW = 'View' + object mnuChangeTheme: TSpTBXSubmenuItem + CaptionW = 'Change Theme' + object mnuThemes: TSpTBXThemeGroupItem + OnClick = mnuThemesClick + end + end + object mnuSelectHighlighter: TSpTBXSubmenuItem + ImageIndex = 15 + Images = ilImages + CaptionW = 'Set Highlighter' + object mnuHPAWN: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuHXMLClick + CaptionW = 'PAWN' + end + object mnuHCPP: TSpTBXItem + AutoCheck = True + OnClick = mnuHXMLClick + CaptionW = 'C++' + end + object mnuHHTML: TSpTBXItem + AutoCheck = True + OnClick = mnuHXMLClick + CaptionW = 'HTML' + end + object mnuHSQL: TSpTBXItem + AutoCheck = True + OnClick = mnuHXMLClick + CaptionW = 'SQL' + end + object mnuHXML: TSpTBXItem + AutoCheck = True + OnClick = mnuHXMLClick + CaptionW = 'XML' + end + object sepHighlighter: TSpTBXSeparatorItem + end + object mnuHNone: TSpTBXItem + AutoCheck = True + OnClick = mnuHNoneClick + CaptionW = 'None' + end + end + object sepView1: TSpTBXSeparatorItem + end + object mnuFoldAll: TSpTBXItem + OnClick = mnuFoldAllClick + CaptionW = 'Fold all' + end + object sepView2: TSpTBXSeparatorItem + end + object mnuShowFileTB: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowFileTBClick + CaptionW = 'Show File-Toolbar' + end + object mnuShowEditTB: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowEditTBClick + CaptionW = 'Show Edit-Toolbar' + end + object mnuShowCodeSnippets: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowCodeSnippetsClick + CaptionW = 'Show Code-Snippets' + end + object mnuShowCodeToolsWindow: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowCodeToolsClick + CaptionW = 'Show Code-Explorer and Notes' + end + object sepView3: TSpTBXSeparatorItem + end + object mnuShowCodeExplorer: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowCodeExplorerClick + CaptionW = 'Show Code-Explorer' + end + object mnuShowCodeInspector: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowCodeInspectorClick + CaptionW = 'Show Code-Inspector' + end + end + object mnuCompile: TSpTBXSubmenuItem + CaptionW = 'Compile' + object mnuDoCompile: TSpTBXItem + ImageIndex = 22 + Images = ilImages + ShortCut = 120 + OnClick = mnuDoCompileClick + CaptionW = 'Compile' + end + object sepCompile1: TSpTBXSeparatorItem + end + object mnuCompileAndStartHL: TSpTBXItem + ImageIndex = 22 + Images = ilImages + OnClick = mnuCompileAndStartHLClick + CaptionW = 'Compile and start Half-Life' + end + object mnuCompileAndUpload: TSpTBXItem + ImageIndex = 37 + Images = ilImages + OnClick = mnuCompileAndUploadClick + CaptionW = 'Compile and upload' + end + object sepCompile2: TSpTBXSeparatorItem + end + object mnuRegisterPluginsIniLocal: TSpTBXItem + OnClick = mnuRegisterPluginsIniLocalClick + CaptionW = 'Register in plugins.ini (local)' + end + object mnuRegisterPluginsIniWeb: TSpTBXItem + OnClick = mnuRegisterPluginsIniWebClick + CaptionW = 'Register in plugins.ini (FTP)' + end + end + object mnuTools: TSpTBXSubmenuItem + CaptionW = 'Tools' + object mnuIndenter: TSpTBXItem + ImageIndex = 16 + Images = ilImages + ShortCut = 16457 + OnClick = mnuIndenterClick + CaptionW = 'Indenter' + end + object mnuUnindenter: TSpTBXItem + ImageIndex = 17 + Images = ilImages + ShortCut = 24649 + OnClick = mnuUnindenterClick + CaptionW = 'Unindenter' + end + object sepTools1: TSpTBXSeparatorItem + end + object mnuSocketTerminal: TSpTBXItem + ImageIndex = 40 + Images = ilImages + OnClick = mnuSocketTerminalClick + CaptionW = 'Socket Terminal' + end + object sepTools2: TSpTBXSeparatorItem + end + object mnuPluginsIniEditor: TSpTBXItem + ImageIndex = 19 + Images = ilImages + OnClick = mnuPluginsIniEditorClick + CaptionW = 'Plugins.ini Editor' + end + object mnuPaster: TSpTBXItem + ImageIndex = 10 + Images = ilImages + OnClick = mnuPasterClick + CaptionW = 'IRC Paster' + end + object sepTools3: TSpTBXSeparatorItem + end + object mnuSettings: TSpTBXItem + ImageIndex = 41 + Images = ilImages + ShortCut = 123 + OnClick = mnuSettingsClick + CaptionW = 'Settings' + end + end + object mnuGenerators: TSpTBXSubmenuItem + CaptionW = 'Generators' + object mnuMenuGenerator: TSpTBXItem + ImageIndex = 20 + Images = ilImages + OnClick = mnuMenuGeneratorClick + CaptionW = 'Menu Generator' + end + object sepGenerators1: TSpTBXSeparatorItem + end + object mnuHudmessage: TSpTBXItem + OnClick = mnuHudmessageClick + CaptionW = 'Hudmessage Generator' + end + object mnuMOTDGenerator: TSpTBXItem + ImageIndex = 36 + Images = ilImages + OnClick = mnuMOTDGeneratorClick + CaptionW = 'MOTD Generator' + end + object mnuConnectionGen: TSpTBXItem + ImageIndex = 18 + Images = ilImages + OnClick = mnuConnectionGenClick + CaptionW = 'Create connection' + end + end + object mnuHelp: TSpTBXSubmenuItem + CaptionW = 'Help' + object mnuOpenHelp: TSpTBXItem + ImageIndex = 21 + Images = ilImages + ShortCut = 112 + OnClick = mnuOpenHelpClick + CaptionW = 'Open help' + end + object sepHelp1: TSpTBXSeparatorItem + end + object mnuSearchForums: TSpTBXItem + OnClick = mnuSearchForumsClick + CaptionW = 'Search on AMX Mod X forums' + end + object mnuOpenScriptingForum: TSpTBXItem + OnClick = mnuOpenScriptingForumClick + CaptionW = 'Open AMXX Scripting Forum' + end + object sepHelp2: TSpTBXSeparatorItem + end + object mnuInfo: TSpTBXItem + OnClick = mnuInfoClick + CaptionW = 'About AMXX-Studio...' + end + end + end + object tbxToolbar: TTBXToolbar + Left = 0 + Top = 23 + Caption = 'File Toolbar' + DefaultDock = tbxTopDock + DockPos = -10 + DockRow = 1 + TabOrder = 1 + OnVisibleChanged = tbxToolbarVisibleChanged + object mnuTNew: TSpTBXItem + ImageIndex = 0 + Images = ilImages + ShortCut = 16467 + OnClick = mnuTNewClick + CaptionW = 'New' + end + object mnuTOpen: TSpTBXItem + ImageIndex = 3 + Images = ilImages + OnClick = mnuTOpenClick + CaptionW = 'Open' + end + object mnuTSave: TSpTBXItem + ImageIndex = 1 + Images = ilImages + OnClick = mnuTSaveClick + CaptionW = 'Save' + end + object sepToolbar1: TSpTBXSeparatorItem + end + object mnuTSearch: TSpTBXItem + ImageIndex = 13 + Images = ilImages + OnClick = mnuTSearchClick + CaptionW = 'Search' + end + object sepToolbar2: TSpTBXSeparatorItem + end + object mnuTCompile: TSpTBXItem + ImageIndex = 22 + Images = ilImages + OnClick = mnuTCompileClick + CaptionW = 'Compile' + end + end + object tbxCodeSnippets: TSpTBXToolbar + Left = 0 + Top = 49 + Caption = 'Code-Snippets' + DefaultDock = tbxTopDock + DockPos = -3 + DockRow = 3 + TabOrder = 3 + OnVisibleChanged = tbxCodeSnippetsVisibleChanged + ChevronVertical = True + object mnuCodeSnippets: TSpTBXRightAlignSpacerItem + CaptionW = 'Code-Snippets:' + end + object mnuPAWN: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = OnCodeSnippetSelect + CaptionW = 'Pawn' + end + object mnuCPP: TSpTBXItem + AutoCheck = True + OnClick = OnCodeSnippetSelect + CaptionW = 'C++' + end + object mnuHTML: TSpTBXItem + OnClick = OnCodeSnippetSelect + CaptionW = 'HTML' + end + object mnuOther: TSpTBXItem + AutoCheck = True + OnClick = OnCodeSnippetSelect + CaptionW = 'Other' + end + object sepCodeSnippets: TSpTBXSeparatorItem + end + end + object tbxEdit: TSpTBXToolbar + Left = 137 + Top = 23 + Caption = 'Edit Toolbar' + DefaultDock = tbxTopDock + DockPos = 136 + DockRow = 1 + TabOrder = 2 + OnVisibleChanged = tbxEditVisibleChanged + ChevronVertical = True + object mnuTUndo: TSpTBXItem + ImageIndex = 23 + Images = ilImages + OnClick = mnuTUndoClick + CaptionW = 'Undo' + end + object mnuTRedo: TSpTBXItem + ImageIndex = 24 + Images = ilImages + OnClick = mnuTRedoClick + CaptionW = 'Redo' + end + object sepTEdit1: TSpTBXSeparatorItem + end + object mnuTCopy: TSpTBXItem + ImageIndex = 9 + Images = ilImages + OnClick = mnuTCopyClick + CaptionW = 'Copy' + end + object mnuTCut: TSpTBXItem + ImageIndex = 8 + Images = ilImages + OnClick = mnuTCutClick + CaptionW = 'Cut' + end + object mnuTPaste: TSpTBXItem + ImageIndex = 10 + Images = ilImages + OnClick = mnuTPasteClick + CaptionW = 'Paste' + end + object sepTEdit2: TSpTBXSeparatorItem + end + object mnuTSelectAll: TSpTBXItem + ImageIndex = 11 + Images = ilImages + OnClick = mnuTSelectAllClick + CaptionW = 'Select all' + end + end + end + object tsMain: TSpTBXTabSet + Left = 0 + Top = 72 + Width = 880 + Height = 518 + Align = alClient + ActiveTabIndex = 0 + TabPosition = ttpBottom + ThemeType = tttTBX + OnActiveTabChange = tsMainActiveTabChange + HiddenItems = <> + object tiPAWN: TSpTBXTabItem + Checked = True + OnClick = tiPAWNClick + TabPosition = ttpBottom + ThemeType = tttTBX + CaptionW = 'Pawn Projects' + end + object tiCPP: TSpTBXTabItem + Enabled = False + OnClick = tiCPPClick + TabPosition = ttpBottom + ThemeType = tttTBX + CaptionW = 'C++ Projects' + end + object tiOther: TSpTBXTabItem + OnClick = tiOtherClick + TabPosition = ttpBottom + ThemeType = tttTBX + CaptionW = 'Other' + end + object tsDocuments: TSpTBXTabSet + Left = 0 + Top = 0 + Width = 880 + Height = 495 + Align = alClient + ActiveTabIndex = 0 + ThemeType = tttTBX + OnActiveTabChange = tsDocumentsActiveTabChange + HiddenItems = <> + object tiDocument1: TSpTBXTabItem + Checked = True + OnSelect = OnTabSelect + ThemeType = tttTBX + CaptionW = '< 1 Untitled.sma >' + end + object spcLeft1: TImage + Left = 0 + Top = 23 + Width = 3 + Height = 472 + Align = alLeft + end + object spcRight1: TImage + Left = 877 + Top = 23 + Width = 3 + Height = 472 + Align = alRight + end + object splRight: TSplitter + Left = 701 + Top = 23 + Height = 472 + Align = alRight + end + object pnlParent: TPanel + Left = 3 + Top = 23 + Width = 698 + Height = 472 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object splOutput: TSplitter + Left = 0 + Top = 387 + Width = 698 + Height = 3 + Cursor = crVSplit + Align = alBottom + Visible = False + end + object sciEditor: TScintilla + Left = 0 + Top = 0 + Width = 698 + Height = 387 + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Courier' + Font.Style = [] + PopupMenu = ppmEditor + Align = alClient + OnModified = sciEditorModified + OnDblClick = sciEditorDblClick + OnKeyUp = sciEditorKeyUp + OnKeyDown = sciEditorKeyDown + OnKeyPress = sciEditorKeyPress + OnClick = sciEditorClick + OnMouseDown = sciEditorMouseDown + Lines.Strings = ( + '/* Plugin generated by AMXX-Studio */' + '' + '#include ' + '#include ' + '' + '#define PLUGIN "New Plugin"' + '#define VERSION "1.0"' + '#define AUTHOR "Author"' + '' + '' + 'public plugin_init() {' + #9'register_plugin(PLUGIN, VERSION, AUTHOR)' + #9 + #9'// Add your code here...' + '}') + EOLStyle = eolCRLF + Indentation = [KeepIndent, TabIndents] + IndentWidth = 0 + MarginLeft = 1 + MarginRight = 1 + Caret.ForeColor = clNone + Caret.LineBackColor = 16770790 + Caret.LineVisible = True + Caret.Width = 1 + Caret.Period = 1024 + DivOptions.ViewWSpace = sciWsInvisible + DivOptions.UsePalette = False + DivOptions.OverType = False + DivOptions.ViewEOL = False + DivOptions.EndAtLastLine = True + DivOptions.ScrollBarH = True + DivOptions.ScrollBarV = True + ActiveHotSpot.BackColor = 16754856 + ActiveHotSpot.ForeColor = clBlue + ActiveHotSpot.Underlined = True + ActiveHotSpot.SingleLine = False + Colors.SelFore = clHighlightText + Colors.SelBack = clHighlight + Colors.MarkerFore = clWhite + Colors.MarkerBack = clBtnShadow + Colors.FoldHi = clWhite + Colors.FoldLo = clBtnFace + Colors.BookMarkBack = clGray + Colors.BookMarkFore = clWhite + Gutter0.Width = 0 + Gutter0.MarginType = gutLineNumber + Gutter1.Width = 40 + Gutter1.MarginType = gutLineNumber + Gutter2.Width = 14 + Gutter2.MarginType = gutSymbol + WordWrapVisualFlags = [] + WordWrapVisualFlagsLocation = [] + LayoutCache = sciCacheCaret + HideSelect = False + WordWrap = sciNoWrap + EdgeMode = sciEdgeLine + EdgeColumn = 100 + EdgeColor = clSilver + WordChars = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ControlCharSymbol = #0 + BraceHilite = True + Folding = [foldFold, foldComment, foldPreprocessor, foldCommentPython, foldAtElse, foldHTML, foldHTMLPreProcessor] + FoldMarkerType = sciMarkBox + LanguageManager.LanguageList = < + item + Name = 'null' + Lexer = 'null' + Styles = < + item + FontName = 'Arial' + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clYellow + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlack + BackColor = clSilver + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end> + Keywords = <> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '/*' + CommentBoxEnd = '*/' + CommentBoxMiddle = '*' + CommentBlock = '//' + CommentAtLineStart = True + CommentStreamStart = '/*' + CommentStreamEnd = '*/' + NumStyleBits = 5 + end + item + Name = 'XML' + Lexer = 'xml' + Styles = < + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clYellow + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlack + BackColor = clSilver + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Default' + StyleNumber = 0 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 13684736 + CharCase = CASE_MIXED + Name = 'Tags' + StyleNumber = 1 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 13684736 + CharCase = CASE_MIXED + Name = 'Unknown Tags' + StyleNumber = 2 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12624032 + CharCase = CASE_MIXED + Name = 'Attributes' + StyleNumber = 3 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12624032 + CharCase = CASE_MIXED + Name = 'Unknown Attributes' + StyleNumber = 4 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + Name = 'Numbers' + StyleNumber = 5 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'Double quoted strings' + StyleNumber = 6 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'Single quoted strings' + StyleNumber = 7 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'Other inside tag' + StyleNumber = 8 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'Comment' + StyleNumber = 9 + end + item + FontSize = 0 + FontStyles = [fsBold] + CharCase = CASE_MIXED + Name = 'Entities' + StyleNumber = 10 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'XML short tag end' + StyleNumber = 11 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'XML identifier start' + StyleNumber = 12 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'XML identifier end' + StyleNumber = 13 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clMaroon + BackColor = 15790335 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'CDATA' + StyleNumber = 17 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 160 + CharCase = CASE_MIXED + Name = 'XML Question' + StyleNumber = 18 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clFuchsia + CharCase = CASE_MIXED + Name = 'Unquoted values' + StyleNumber = 19 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 13684736 + CharCase = CASE_MIXED + Name = 'SGML tags ' + StyleNumber = 21 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 10526720 + CharCase = CASE_MIXED + Name = 'SGML command' + StyleNumber = 22 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 15793935 + CharCase = CASE_MIXED + Name = 'SGML 1st param' + StyleNumber = 23 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'SGML double string' + StyleNumber = 24 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'SGML single string' + StyleNumber = 25 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'SGML error' + StyleNumber = 26 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 16737843 + CharCase = CASE_MIXED + Name = 'SGML special' + StyleNumber = 27 + end + item + FontSize = 0 + FontStyles = [fsBold] + CharCase = CASE_MIXED + Name = 'SGML entity' + StyleNumber = 28 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'SGML comment' + StyleNumber = 29 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 6684672 + BackColor = 14732492 + CharCase = CASE_MIXED + Name = 'SGML block' + StyleNumber = 31 + end> + Keywords = < + item + KeywordListNumber = 0 + Name = 'Keywords' + end + item + KeywordListNumber = 5 + Name = 'SGML Keywords' + Keywords.Strings = ( + 'ELEMENT' + 'DOCTYPE' + 'ATTLIST' + 'ENTITY' + 'NOTATION') + end> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '' + CommentBoxMiddle = ' ' + CommentBlock = '//' + CommentAtLineStart = True + CommentStreamStart = '' + NumStyleBits = 7 + end + item + Name = 'HTML' + Lexer = 'hypertext' + Styles = < + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clBlue + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlack + BackColor = clSilver + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Text' + StyleNumber = 0 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clBlack + CharCase = CASE_MIXED + Name = 'Tags' + StyleNumber = 1 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clOlive + CharCase = CASE_MIXED + Name = 'Unknown Tags' + StyleNumber = 2 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12624032 + CharCase = CASE_MIXED + Name = 'Attributes' + StyleNumber = 3 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Unknown Attributes' + StyleNumber = 4 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlue + CharCase = CASE_MIXED + Name = 'Numbers' + StyleNumber = 5 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 39338 + CharCase = CASE_MIXED + Name = 'Double quoted strings' + StyleNumber = 6 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'Single quoted strings' + StyleNumber = 7 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Other inside tag' + StyleNumber = 8 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 33023 + CharCase = CASE_MIXED + Name = 'Comment' + StyleNumber = 9 + end + item + FontName = 'Times New Roman' + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 10526880 + CharCase = CASE_MIXED + Name = 'Entities' + StyleNumber = 10 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12632064 + CharCase = CASE_MIXED + Name = 'XML short tag end' + StyleNumber = 11 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'XML identifier start' + StyleNumber = 12 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 10485920 + CharCase = CASE_MIXED + Name = 'XML identifier end' + StyleNumber = 13 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 657920 + CharCase = CASE_MIXED + Name = 'SCRIPT' + StyleNumber = 14 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clYellow + CharCase = CASE_MIXED + Name = 'ASP <% ... %>' + StyleNumber = 15 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clYellow + CharCase = CASE_MIXED + Name = 'ASP <% ... %>' + StyleNumber = 16 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 57343 + CharCase = CASE_MIXED + Name = 'CDATA' + StyleNumber = 17 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 5343743 + CharCase = CASE_MIXED + Name = 'PHP' + StyleNumber = 18 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clFuchsia + CharCase = CASE_MIXED + Name = 'Unquoted values' + StyleNumber = 19 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'XC Comment' + StyleNumber = 20 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 13684736 + CharCase = CASE_MIXED + Name = 'SGML tags ' + StyleNumber = 21 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 10526720 + CharCase = CASE_MIXED + Name = 'SGML command' + StyleNumber = 22 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 15793935 + CharCase = CASE_MIXED + Name = 'SGML 1st param' + StyleNumber = 23 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'SGML double string' + StyleNumber = 24 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'SGML single string' + StyleNumber = 25 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'SGML error' + StyleNumber = 26 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 16737843 + CharCase = CASE_MIXED + Name = 'SGML special' + StyleNumber = 27 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'SGML entity' + StyleNumber = 28 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'SGML comment' + StyleNumber = 29 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlue + CharCase = CASE_MIXED + Name = 'SGML block' + StyleNumber = 31 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 32639 + CharCase = CASE_MIXED + Name = 'JS Start' + StyleNumber = 40 + end + item + FontSize = 0 + FontStyles = [fsBold] + CharCase = CASE_MIXED + EOLFilled = True + Name = 'JS Default' + StyleNumber = 41 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'JS Comment' + StyleNumber = 42 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'JS Line Comment' + StyleNumber = 43 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'JS Doc Comment' + StyleNumber = 44 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + Name = 'JS Number' + StyleNumber = 45 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 13421568 + CharCase = CASE_MIXED + Name = 'JS Word' + StyleNumber = 46 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + Name = 'JS Keyword' + StyleNumber = 47 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'JS Double quoted string' + StyleNumber = 48 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'JS Single quoted string' + StyleNumber = 49 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'JS Symbols' + StyleNumber = 50 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clWhite + BackColor = 2105376 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'JS EOL' + StyleNumber = 51 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 16724672 + CharCase = CASE_MIXED + Name = 'JS Regex' + StyleNumber = 52 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 32639 + CharCase = CASE_MIXED + Name = 'ASP JS Start' + StyleNumber = 55 + end + item + FontSize = 0 + FontStyles = [fsBold] + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP JS Default' + StyleNumber = 56 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP JS Comment' + StyleNumber = 57 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'ASP JS Line Comment' + StyleNumber = 58 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP JS Doc Comment' + StyleNumber = 59 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + Name = 'ASP JS Number' + StyleNumber = 60 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 14737632 + CharCase = CASE_MIXED + Name = 'ASP JS Word' + StyleNumber = 61 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + Name = 'ASP JS Keyword' + StyleNumber = 62 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'ASP JS Double quoted string' + StyleNumber = 63 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'ASP JS Single quoted string' + StyleNumber = 64 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'ASP JS Symbols' + StyleNumber = 65 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clWhite + BackColor = 2105376 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP JS EOL' + StyleNumber = 66 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 16724672 + CharCase = CASE_MIXED + Name = 'ASP JS Regex' + StyleNumber = 67 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS Default' + StyleNumber = 71 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS Comment' + StyleNumber = 72 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS Number' + StyleNumber = 73 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS KeyWord' + StyleNumber = 74 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS String' + StyleNumber = 75 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS Identifier' + StyleNumber = 76 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clWhite + BackColor = 2105376 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'VBS Unterminated string' + StyleNumber = 77 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Default' + StyleNumber = 81 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Comment' + StyleNumber = 82 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Number' + StyleNumber = 83 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP KeyWord' + StyleNumber = 84 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP String' + StyleNumber = 85 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Identifier' + StyleNumber = 86 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clWhite + BackColor = 2105376 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Unterminated string' + StyleNumber = 87 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Python Start' + StyleNumber = 90 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Default' + StyleNumber = 91 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Comment' + StyleNumber = 92 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Number' + StyleNumber = 93 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python String' + StyleNumber = 94 + end + item + FontName = 'Courier New' + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Single quoted string' + StyleNumber = 95 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Keyword' + StyleNumber = 96 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 127 + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Triple quotes' + StyleNumber = 97 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 127 + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Triple double quotes' + StyleNumber = 98 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clBlue + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Class name definition' + StyleNumber = 99 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 8355584 + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python function or method name definition' + StyleNumber = 100 + end + item + FontSize = 0 + FontStyles = [fsBold] + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python function or method name definition' + StyleNumber = 101 + end + item + FontSize = 0 + FontStyles = [] + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'Python Identifiers' + StyleNumber = 102 + end + item + FontSize = 0 + FontStyles = [fsItalic] + ForeColor = 10526720 + CharCase = CASE_MIXED + Name = 'PHP Complex Variable' + StyleNumber = 104 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'ASP Python Start' + StyleNumber = 105 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Default' + StyleNumber = 106 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Comment' + StyleNumber = 107 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Number' + StyleNumber = 108 + end + item + FontName = 'Courier New' + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python String' + StyleNumber = 109 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Single quoted string' + StyleNumber = 110 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Keyword' + StyleNumber = 111 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 127 + BackColor = 13627343 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Triple quotes' + StyleNumber = 112 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 127 + BackColor = 13627343 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Triple double quotes' + StyleNumber = 113 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clBlue + BackColor = 13627343 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Class name definition' + StyleNumber = 114 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = 8355584 + BackColor = 15728623 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python function or method name definition' + StyleNumber = 115 + end + item + FontSize = 0 + FontStyles = [fsBold] + BackColor = 13627343 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python function or method name definition' + StyleNumber = 116 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + BackColor = 13627343 + CharCase = CASE_MIXED + EOLFilled = True + Name = 'ASP Python Identifiers' + StyleNumber = 117 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + EOLFilled = True + Name = 'PHP Default' + StyleNumber = 118 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'PHP Double quoted string' + StyleNumber = 119 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'PHP Single quoted string' + StyleNumber = 120 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clOlive + CharCase = CASE_MIXED + Name = 'PHP Keyword' + StyleNumber = 121 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + Name = 'PHP Number' + StyleNumber = 122 + end + item + FontSize = 0 + FontStyles = [fsItalic] + ForeColor = 10526720 + CharCase = CASE_MIXED + Name = 'PHP Variable' + StyleNumber = 123 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'PHP Comment' + StyleNumber = 124 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'PHP One line Comment' + StyleNumber = 125 + end + item + FontSize = 0 + FontStyles = [fsItalic] + ForeColor = 10526720 + CharCase = CASE_MIXED + Name = 'PHP Variable in double quoted string' + StyleNumber = 126 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + Name = 'PHP operator' + StyleNumber = 127 + end> + Keywords = < + item + KeywordListNumber = 0 + Name = 'HyperText' + Keywords.Strings = ( + 'a' + 'abbr' + 'acronym' + 'address' + 'applet' + 'area' + 'b' + 'base' + 'basefont' + 'bdo' + 'big' + 'blockquote' + 'body' + 'br' + 'button' + 'caption' + 'center' + 'cite' + 'code' + 'col' + 'colgroup' + 'dd' + 'del' + 'dfn' + 'dir' + 'div' + 'dl' + 'dt' + 'em' + 'fieldset' + 'font' + 'form' + 'frame' + 'frameset' + 'h1' + 'h2' + 'h3' + 'h4' + 'h5' + 'h6' + 'head' + 'hr' + 'html' + 'i' + 'iframe' + 'img' + 'input' + 'ins' + 'isindex' + 'kbd' + 'label' + 'legend' + 'li' + 'link' + 'map' + 'menu' + 'meta' + 'noframes' + 'noscript' + 'object' + 'ol' + 'optgroup' + 'option' + 'p' + 'param' + 'pre' + 'q' + 's' + 'samp' + 'script' + 'select' + 'small' + 'span' + 'strike' + 'strong' + 'style' + 'sub' + 'sup' + 'table' + 'tbody' + 'td' + 'textarea' + 'tfoot' + 'th' + 'thead' + 'title' + 'tr' + 'tt' + 'u' + 'ul' + 'var' + 'xml' + 'xmlns' + 'abbr' + 'accept-charset' + 'accept' + 'accesskey' + 'action' + 'align' + 'alink' + 'alt' + 'archive' + 'axis' + 'background' + 'bgcolor' + 'border' + 'cellpadding' + 'cellspacing' + 'char' + 'charoff' + 'charset' + 'checked' + 'cite' + 'class' + 'classid' + 'clear' + 'codebase' + 'codetype' + 'color' + 'cols' + 'colspan' + 'compact' + 'content' + 'coords' + 'data' + 'datafld' + 'dataformatas' + 'datapagesize' + 'datasrc' + 'datetime' + 'declare' + 'defer' + 'dir' + 'disabled' + 'enctype' + 'event' + 'face' + 'for' + 'frame' + 'frameborder' + 'headers' + 'height' + 'href' + 'hreflang' + 'hspace' + 'http-equiv' + 'id' + 'ismap' + 'label' + 'lang' + 'language' + 'leftmargin' + 'link' + 'longdesc' + 'marginwidth' + 'marginheight' + 'maxlength' + 'media' + 'method' + 'multiple' + 'name' + 'nohref' + 'noresize' + 'noshade' + 'nowrap' + 'object' + 'onblur' + 'onchange' + 'onclick' + 'ondblclick' + 'onfocus' + 'onkeydown' + 'onkeypress' + 'onkeyup' + 'onload' + 'onmousedown' + 'onmousemove' + 'onmouseover' + 'onmouseout' + 'onmouseup' + 'onreset' + 'onselect' + 'onsubmit' + 'onunload' + 'profile' + 'prompt' + 'readonly' + 'rel' + 'rev' + 'rows' + 'rowspan' + 'rules' + 'scheme' + 'scope' + 'selected' + 'shape' + 'size' + 'span' + 'src' + 'standby' + 'start' + 'style' + 'summary' + 'tabindex' + 'target' + 'text' + 'title' + 'topmargin' + 'type' + 'usemap' + 'valign' + 'value' + 'valuetype' + 'version' + 'vlink' + 'vspace' + 'width' + 'text' + 'password' + 'checkbox' + 'radio' + 'submit' + 'reset' + 'file' + 'hidden' + 'image' + 'framespacing' + 'scrolling' + 'allowtransparency' + 'bordercolor') + end + item + KeywordListNumber = 1 + Name = 'JavaScript' + Keywords.Strings = ( + 'abstract' + 'boolean' + 'break' + 'byte' + 'case' + 'catch' + 'char' + 'class' + 'const' + 'continue' + 'debugger' + 'default' + 'delete' + 'do' + 'double' + 'else' + 'enum' + 'export' + 'extends' + 'final' + 'finally' + 'float' + 'for' + 'function' + 'goto' + 'if' + 'implements' + 'import' + 'in' + 'instanceof' + 'int' + 'interface' + 'long' + 'native' + 'new' + 'package' + 'private' + 'protected' + 'public' + 'return' + 'short' + 'static' + 'super' + 'switch' + 'synchronized' + 'this' + 'throw' + 'throws' + 'transient' + 'try' + 'typeof' + 'var' + 'void' + 'volatile' + 'while' + 'with') + end + item + KeywordListNumber = 2 + Name = 'VBScript' + Keywords.Strings = ( + 'and' + 'begin' + 'case' + 'call' + 'class' + 'continue' + 'do' + 'each' + 'else' + 'elseif' + 'end' + 'erase' + 'error' + 'event' + 'exit' + 'false' + 'for' + 'function' + 'get' + 'gosub' + 'goto' + 'if' + 'implement' + 'in' + 'load' + 'loop' + 'lset' + 'me' + 'mid' + 'new' + 'next' + 'not' + 'nothing' + 'on' + 'or' + 'property' + 'raiseevent' + 'rem' + 'resume' + 'return' + 'rset' + 'select' + 'set' + 'stop' + 'sub' + 'then' + 'to' + 'true' + 'unload' + 'until' + 'wend' + 'while' + 'with' + 'withevents' + 'attribute' + 'alias' + 'as' + 'boolean' + 'byref' + 'byte' + 'byval' + 'const' + 'compare' + 'currency' + 'date' + 'declare' + 'dim' + 'double' + 'enum' + 'explicit' + 'friend' + 'global' + 'integer' + 'let' + 'lib' + 'long' + 'module' + 'object' + 'option' + 'optional' + 'preserve' + 'private' + 'public' + 'redim' + 'single' + 'static' + 'string' + 'type' + 'variant') + end + item + KeywordListNumber = 3 + Name = 'Python' + Keywords.Strings = ( + 'and' + 'assert' + 'break' + 'class' + 'continue' + 'def' + 'del' + 'elif' + 'else' + 'except' + 'exec' + 'finally' + 'for' + 'from' + 'global' + 'if' + 'import' + 'in' + 'is' + 'lambda' + 'None' + 'not' + 'or' + 'pass' + 'print' + 'raise' + 'return' + 'try' + 'while' + 'yield') + end + item + KeywordListNumber = 4 + Name = 'PHP' + Keywords.Strings = ( + 'and' + 'argv' + 'as' + 'argc' + 'break' + 'case' + 'cfunction' + 'class' + 'continue' + 'declare' + 'default' + 'do' + 'die' + 'echo' + 'else' + 'elseif' + 'empty' + 'enddeclare' + 'endfor' + 'endforeach' + 'endif' + 'endswitch' + 'endwhile' + 'e_all' + 'e_parse' + 'e_error' + 'e_warning' + 'eval' + 'exit' + 'extends' + 'false' + 'for' + 'foreach' + 'function' + 'global' + 'http_cookie_vars' + 'http_get_vars' + 'http_post_vars' + 'http_post_files' + 'http_env_vars' + 'http_server_vars' + 'if' + 'include' + 'include_once' + 'list' + 'new' + 'not' + 'null' + 'old_function' + 'or' + 'parent' + 'php_os' + 'php_self' + 'php_version' + 'print' + 'require' + 'require_once' + 'return' + 'static' + 'switch' + 'stdclass' + 'this' + 'true' + 'var' + 'xor' + 'virtual' + 'while' + '__file__' + '__line__' + '__sleep' + '__wakeup') + end + item + KeywordListNumber = 5 + Name = 'DTD Keywords' + Keywords.Strings = ( + 'ELEMENT' + 'DOCTYPE' + 'ATTLIST' + 'ENTITY' + 'NOTATION') + end> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '' + CommentBoxMiddle = ' ' + CommentBlock = '//' + CommentAtLineStart = True + CommentStreamStart = '' + NumStyleBits = 7 + end + item + Name = 'C++' + Lexer = 'cpp' + Styles = < + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12255232 + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end + item + FontName = 'Courier New' + FontSize = 8 + FontStyles = [] + ForeColor = 12255232 + CharCase = CASE_MIXED + Name = 'White space' + StyleNumber = 0 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Comment' + StyleNumber = 1 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Line Comment' + StyleNumber = 2 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Doc Comment' + StyleNumber = 3 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clNavy + CharCase = CASE_MIXED + Name = 'Number' + StyleNumber = 4 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 30464 + CharCase = CASE_MIXED + Name = 'Keyword' + StyleNumber = 5 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Double quoted string' + StyleNumber = 6 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Single quoted string' + StyleNumber = 7 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Symbols/UUID' + StyleNumber = 8 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 33023 + CharCase = CASE_MIXED + Name = 'Preprocessor' + StyleNumber = 9 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 30464 + CharCase = CASE_MIXED + Name = 'Operators' + StyleNumber = 10 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clNavy + CharCase = CASE_MIXED + Name = 'Identifier' + StyleNumber = 11 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + EOLFilled = True + Name = 'EOL if string is not closed' + StyleNumber = 12 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'Verbatim strings for C#' + StyleNumber = 13 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clHotLight + CharCase = CASE_MIXED + Name = 'Regular expressions' + StyleNumber = 14 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Doc Comment Line' + StyleNumber = 15 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'User-defined keywords' + StyleNumber = 16 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 33023 + CharCase = CASE_MIXED + Name = 'Comment keyword' + StyleNumber = 17 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Comment keyword error' + StyleNumber = 18 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGreen + CharCase = CASE_MIXED + Name = 'Global classes and typedefs' + StyleNumber = 19 + end> + Keywords = < + item + KeywordListNumber = 0 + Name = 'Primary keywords and identifiers' + Keywords.Strings = ( + '__asm' + '_asm' + 'asm' + 'auto' + '__automated' + 'bool' + 'break' + 'case' + 'catch' + '__cdecl' + '_cdecl' + 'cdecl' + 'char' + 'class' + '__classid' + '__closure' + 'const' + 'const_cast' + 'continue' + '__declspec' + 'default' + 'delete' + '__dispid' + 'do' + 'double' + 'dynamic_cast' + 'else' + 'enum' + '__except' + 'explicit' + '__export' + 'export' + 'extern' + 'false' + '__fastcall' + '_fastcall' + '__finally' + 'float' + 'for' + 'friend' + 'goto' + 'if' + '__import' + '_import' + '__inline' + 'inline' + 'int' + '__int16' + '__int32' + '__int64' + '__int8' + 'long' + '__msfastcall' + '__msreturn' + 'mutable' + 'namespace' + 'new' + '__pascal' + '_pascal' + 'pascal' + 'private' + '__property' + 'protected' + 'public' + '__published' + 'register' + 'reinterpret_cast' + 'return' + '__rtti' + 'short' + 'signed' + 'sizeof' + 'static_cast' + 'static' + '__stdcall' + '_stdcall' + 'struct' + 'switch' + 'template' + 'this' + '__thread' + 'throw' + 'true' + '__try' + 'try' + 'typedef' + 'typeid' + 'typename' + 'union' + 'unsigned' + 'using' + 'virtual' + 'void' + 'volatile' + 'wchar_t' + 'while' + 'dllexport' + 'dllimport' + 'naked' + 'noreturn' + 'nothrow' + 'novtable' + 'property' + 'selectany' + 'thread' + 'uuid') + end + item + KeywordListNumber = 1 + Name = 'Secondary keywords and identifiers' + Keywords.Strings = ( + 'TStream' + 'TFileStream' + 'TMemoryStream' + 'TBlobStream' + 'TOleStream' + 'TStrings' + 'TStringList' + 'AnsiString' + 'String' + 'WideString' + 'cout' + 'cin' + 'cerr' + 'endl' + 'fstream' + 'ostream' + 'istream' + 'wstring' + 'string' + 'deque' + 'list' + 'vector' + 'set' + 'multiset' + 'bitset' + 'map' + 'multimap' + 'stack' + 'queue' + 'priority_queue') + end + item + KeywordListNumber = 2 + Name = 'Doc Comments' + Keywords.Strings = ( + 'a' + 'addindex' + 'addtogroup' + 'anchor' + 'arg' + 'attention' + 'author' + 'b' + 'brief' + 'bug' + 'c' + 'class' + 'code' + 'date' + 'def' + 'defgroup' + 'deprecated' + 'dontinclude' + 'e' + 'em' + 'endcode' + 'endhtmlonly' + 'endif' + 'endlatexonly' + 'endlink' + 'endverbatim' + 'enum' + 'example' + 'exception' + 'f$' + 'f[' + 'f]' + 'file' + 'fn' + 'hideinitializer' + 'htmlinclude' + 'htmlonly' + 'if' + 'image' + 'include' + 'ingroup' + 'internal' + 'invariant' + 'interface' + 'latexonly' + 'li' + 'line' + 'link' + 'mainpage' + 'name' + 'namespace' + 'nosubgrouping' + 'note' + 'overload' + 'p' + 'page' + 'par' + 'param' + 'post' + 'pre' + 'ref' + 'relates' + 'remarks' + 'return' + 'retval' + 'sa' + 'section' + 'see' + 'showinitializer' + 'since' + 'skip' + 'skipline' + 'struct' + 'subsection' + 'test' + 'throw' + 'todo' + 'typedef' + 'union' + 'until' + 'var' + 'verbatim' + 'verbinclude' + 'version' + 'warning' + 'weakgroup' + '$' + '@' + '<' + '>' + '\' + '&' + '#' + '{' + '}') + end + item + KeywordListNumber = 3 + Name = 'Unused' + end + item + KeywordListNumber = 4 + Name = 'Global classes and typedefs' + Keywords.Strings = ( + 'LOL') + end> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '/*' + CommentBoxEnd = '*/' + CommentBoxMiddle = '*' + CommentBlock = '//' + CommentAtLineStart = True + CommentStreamStart = '/*' + CommentStreamEnd = '*/' + NumStyleBits = 5 + end + item + Name = 'SQL' + Lexer = 'mssql' + Styles = < + item + FontName = 'Arial' + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clYellow + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [fsBold] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clBlack + BackColor = clSilver + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + Name = 'Default' + StyleNumber = 0 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'Comment' + StyleNumber = 1 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 9474192 + CharCase = CASE_MIXED + Name = 'Line Comment' + StyleNumber = 2 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 224 + CharCase = CASE_MIXED + Name = 'Number' + StyleNumber = 3 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'String' + StyleNumber = 4 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + Name = 'Operator' + StyleNumber = 5 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clSilver + CharCase = CASE_MIXED + Name = 'Identifier' + StyleNumber = 6 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Variable' + StyleNumber = 7 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Column Name' + StyleNumber = 8 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Statement' + StyleNumber = 9 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Data Type' + StyleNumber = 10 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'System Table' + StyleNumber = 11 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Global Variable' + StyleNumber = 12 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Function' + StyleNumber = 13 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Stored Procedure' + StyleNumber = 14 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Default Pref Datatype' + StyleNumber = 15 + end + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'Column Name 2' + StyleNumber = 16 + end> + Keywords = < + item + KeywordListNumber = 0 + Name = 'Statements' + end + item + KeywordListNumber = 1 + Name = 'Data Types' + end + item + KeywordListNumber = 2 + Name = 'System tables' + end + item + KeywordListNumber = 3 + Name = 'Global variables' + end + item + KeywordListNumber = 4 + Name = 'Functions' + end + item + KeywordListNumber = 5 + Name = 'System Stored Procedures' + end + item + KeywordListNumber = 6 + Name = 'Operators' + end> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '/*' + CommentBoxEnd = '*/' + CommentBoxMiddle = '*' + CommentBlock = '#' + CommentAtLineStart = True + CommentStreamStart = '/*' + CommentStreamEnd = '*/' + NumStyleBits = 5 + end + item + Name = 'Pawn' + Lexer = 'cpp' + Styles = < + item + FontSize = 0 + FontStyles = [] + CharCase = CASE_MIXED + Name = 'LineNumbers' + StyleNumber = 33 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 12255232 + CharCase = CASE_MIXED + Name = 'Ok Braces' + StyleNumber = 34 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Bad Braces' + StyleNumber = 35 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Control Chars' + StyleNumber = 36 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clGray + CharCase = CASE_MIXED + Name = 'Indent Guide' + StyleNumber = 37 + end + item + FontName = 'Courier New' + FontSize = 8 + FontStyles = [] + ForeColor = 12255232 + CharCase = CASE_MIXED + Name = 'White space' + StyleNumber = 0 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Comment' + StyleNumber = 1 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Line Comment' + StyleNumber = 2 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Doc Comment' + StyleNumber = 3 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clNavy + CharCase = CASE_MIXED + Name = 'Number' + StyleNumber = 4 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 30464 + CharCase = CASE_MIXED + Name = 'Keyword' + StyleNumber = 5 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Double quoted string' + StyleNumber = 6 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Single quoted string' + StyleNumber = 7 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'Symbols/UUID' + StyleNumber = 8 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 33023 + CharCase = CASE_MIXED + Name = 'Preprocessor' + StyleNumber = 9 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 30464 + CharCase = CASE_MIXED + Name = 'Operators' + StyleNumber = 10 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clNavy + CharCase = CASE_MIXED + Name = 'Identifier' + StyleNumber = 11 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + EOLFilled = True + Name = 'EOL if string is not closed' + StyleNumber = 12 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clLime + CharCase = CASE_MIXED + Name = 'Verbatim strings for C#' + StyleNumber = 13 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clHotLight + CharCase = CASE_MIXED + Name = 'Regular expressions' + StyleNumber = 14 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = 4227327 + CharCase = CASE_MIXED + Name = 'Doc Comment Line' + StyleNumber = 15 + end + item + FontSize = 0 + FontStyles = [] + ForeColor = clRed + CharCase = CASE_MIXED + Name = 'User-defined keywords' + StyleNumber = 16 + end> + Keywords = < + item + KeywordListNumber = 0 + Name = 'Primary keywords and identifiers' + Keywords.Strings = ( + 'assert' + 'char' + '#assert' + 'const' + 'break' + 'de' + 'ned' + '#de' + 'ne' + 'enum' + 'case' + 'sizeof' + '#else' + 'forward' + 'continue' + 'tagof' + '#emit' + 'native' + 'default' + '#endif' + 'new' + 'do' + '#endinput' + 'operator' + 'else' + '#endscript' + 'public' + 'exit' + '#error' + 'static' + 'for' + '#' + 'le' + 'stock' + 'goto' + '#if' + 'if' + '#include' + 'return' + '#line' + 'sleep' + '#pragma' + 'state' + '#section' + 'switch' + '#tryinclude' + 'while' + '#undef' + 'Float') + end + item + KeywordListNumber = 1 + Name = 'Secondary keywords and identifiers' + end + item + KeywordListNumber = 2 + Name = 'Doc Comments' + Keywords.Strings = ( + 'a' + 'addindex' + 'addtogroup' + 'anchor' + 'arg' + 'attention' + 'author' + 'b' + 'brief' + 'bug' + 'c' + 'class' + 'code' + 'date' + 'def' + 'defgroup' + 'deprecated' + 'dontinclude' + 'e' + 'em' + 'endcode' + 'endhtmlonly' + 'endif' + 'endlatexonly' + 'endlink' + 'endverbatim' + 'enum' + 'example' + 'exception' + 'f$' + 'f[' + 'f]' + 'file' + 'fn' + 'hideinitializer' + 'htmlinclude' + 'htmlonly' + 'if' + 'image' + 'include' + 'ingroup' + 'internal' + 'invariant' + 'interface' + 'latexonly' + 'li' + 'line' + 'link' + 'mainpage' + 'name' + 'namespace' + 'nosubgrouping' + 'note' + 'overload' + 'p' + 'page' + 'par' + 'param' + 'post' + 'pre' + 'ref' + 'relates' + 'remarks' + 'return' + 'retval' + 'sa' + 'section' + 'see' + 'showinitializer' + 'since' + 'skip' + 'skipline' + 'struct' + 'subsection' + 'test' + 'throw' + 'todo' + 'typedef' + 'union' + 'until' + 'var' + 'verbatim' + 'verbinclude' + 'version' + 'warning' + 'weakgroup' + '$' + '@' + '<' + '>' + '\' + '&' + '#' + '{' + '}') + end + item + KeywordListNumber = 3 + Name = 'Unused' + end> + AssignmentOperator = '=' + EndOfStatementOperator = ';' + CommentBoxStart = '/*' + CommentBoxEnd = '*/' + CommentBoxMiddle = '*' + CommentBlock = '//' + CommentAtLineStart = True + CommentStreamStart = '/*' + CommentStreamEnd = '*/' + NumStyleBits = 5 + end> + LanguageManager.SelectedLanguage = 'Pawn' + FoldDrawFlags = [sciBelowIfNotExpanded] + KeyCommands = < + item + Command = 2300 + ShortCut = 40 + end + item + Command = 2301 + ShortCut = 8232 + end + item + Command = 2342 + ShortCut = 16424 + end + item + Command = 2426 + ShortCut = 41000 + end + item + Command = 2302 + ShortCut = 38 + end + item + Command = 2303 + ShortCut = 8230 + end + item + Command = 2343 + ShortCut = 16422 + end + item + Command = 2427 + ShortCut = 40998 + end + item + Command = 2415 + ShortCut = 49190 + end + item + Command = 2416 + ShortCut = 57382 + end + item + Command = 2413 + ShortCut = 49192 + end + item + Command = 2414 + ShortCut = 57384 + end + item + Command = 2304 + ShortCut = 37 + end + item + Command = 2305 + ShortCut = 8229 + end + item + Command = 2308 + ShortCut = 16421 + end + item + Command = 2309 + ShortCut = 24613 + end + item + Command = 2428 + ShortCut = 40997 + end + item + Command = 2306 + ShortCut = 39 + end + item + Command = 2307 + ShortCut = 8231 + end + item + Command = 2310 + ShortCut = 16423 + end + item + Command = 2311 + ShortCut = 24615 + end + item + Command = 2429 + ShortCut = 40999 + end + item + Command = 2390 + ShortCut = 49189 + end + item + Command = 2391 + ShortCut = 57381 + end + item + Command = 2392 + ShortCut = 49191 + end + item + Command = 2393 + ShortCut = 57383 + end + item + Command = 2331 + ShortCut = 36 + end + item + Command = 2332 + ShortCut = 8228 + end + item + Command = 2316 + ShortCut = 16420 + end + item + Command = 2317 + ShortCut = 24612 + end + item + Command = 2345 + ShortCut = 32804 + end + item + Command = 2431 + ShortCut = 40996 + end + item + Command = 2314 + ShortCut = 35 + end + item + Command = 2315 + ShortCut = 8227 + end + item + Command = 2318 + ShortCut = 16419 + end + item + Command = 2319 + ShortCut = 24611 + end + item + Command = 2347 + ShortCut = 32803 + end + item + Command = 2432 + ShortCut = 40995 + end + item + Command = 2320 + ShortCut = 33 + end + item + Command = 2321 + ShortCut = 8225 + end + item + Command = 2433 + ShortCut = 40993 + end + item + Command = 2322 + ShortCut = 34 + end + item + Command = 2323 + ShortCut = 8226 + end + item + Command = 2434 + ShortCut = 40994 + end + item + Command = 2180 + ShortCut = 46 + end + item + Command = 2177 + ShortCut = 8238 + end + item + Command = 2336 + ShortCut = 16430 + end + item + Command = 2396 + ShortCut = 24622 + end + item + Command = 2324 + ShortCut = 45 + end + item + Command = 2179 + ShortCut = 8237 + end + item + Command = 2178 + ShortCut = 16429 + end + item + Command = 2325 + ShortCut = 27 + end + item + Command = 2326 + ShortCut = 8 + end + item + Command = 2326 + ShortCut = 8200 + end + item + Command = 2335 + ShortCut = 16392 + end + item + Command = 2176 + ShortCut = 32776 + end + item + Command = 2395 + ShortCut = 24584 + end + item + Command = 2176 + ShortCut = 16474 + end + item + Command = 2011 + ShortCut = 16473 + end + item + Command = 2177 + ShortCut = 16472 + end + item + Command = 2178 + ShortCut = 16451 + end + item + Command = 2179 + ShortCut = 16470 + end + item + Command = 2013 + ShortCut = 16449 + end + item + Command = 2327 + ShortCut = 9 + end + item + Command = 2328 + ShortCut = 8201 + end + item + Command = 2329 + ShortCut = 13 + end + item + Command = 2329 + ShortCut = 8205 + end + item + Command = 2333 + ShortCut = 16491 + end + item + Command = 2334 + ShortCut = 16493 + end + item + Command = 2373 + ShortCut = 16495 + end + item + Command = 2337 + ShortCut = 16460 + end + item + Command = 2338 + ShortCut = 24652 + end + item + Command = 2455 + ShortCut = 24660 + end + item + Command = 2339 + ShortCut = 16468 + end + item + Command = 2404 + ShortCut = 16452 + end + item + Command = 2340 + ShortCut = 16469 + end + item + Command = 2341 + ShortCut = 24661 + end> + end + object lstOutput: TListBox + Left = 0 + Top = 390 + Width = 698 + Height = 82 + Align = alBottom + ItemHeight = 13 + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Visible = False + OnDblClick = lstOutputDblClick + OnEnter = lstOutputEnter + OnMouseDown = lstOutputMouseDown + OnMouseMove = lstOutputMouseMove + end + object pnlLoading: TSpTBXPanel + Left = 268 + Top = 278 + Width = 253 + Height = 57 + Caption = 'pnlLoading' + Color = clNone + ParentColor = False + TabOrder = 2 + Visible = False + TBXStyleBackground = True + object pbLoading: TSpTBXProgressBar + Left = 4 + Top = 4 + Width = 245 + Height = 18 + Caption = '0 % - Loading File...' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + CaptionGlowColor = clBtnFace + CaptionType = pctDefault + Smooth = True + ThemeType = thtTBX + end + object cmdCancel: TSpTBXButton + Left = 70 + Top = 30 + Width = 111 + Height = 21 + Cursor = crArrow + Caption = 'Click here to cancel' + TabOrder = 1 + OnClick = cmdCancelClick + CaptionGlowColor = clBtnFace + LinkFont.Charset = DEFAULT_CHARSET + LinkFont.Color = clBlue + LinkFont.Height = -11 + LinkFont.Name = 'MS Sans Serif' + LinkFont.Style = [fsUnderline] + ThemeType = thtTBX + end + end + end + object tcTools: TSpTBXTabControl + Left = 704 + Top = 23 + Width = 173 + Height = 472 + Align = alRight + ActiveTabIndex = 0 + TabPosition = ttpBottom + ThemeType = tttTBX + OnActiveTabChange = tcToolsActiveTabChange + HiddenItems = <> + object tiTools: TSpTBXTabItem + Checked = True + TabPosition = ttpBottom + ThemeType = tttTBX + CaptionW = 'Code-Tools' + end + object tiNotes: TSpTBXTabItem + TabPosition = ttpBottom + ThemeType = tttTBX + CaptionW = 'Notes' + end + object tsNotes: TSpTBXTabSheet + Left = 0 + Top = 0 + Width = 173 + Height = 449 + Caption = 'Notes' + ImageIndex = -1 + TabItem = 'tiNotes' + object imgRight4: TImage + Left = 170 + Top = 26 + Width = 1 + Height = 421 + Align = alRight + end + object imgBottom4: TImage + Left = 2 + Top = 447 + Width = 169 + Height = 2 + Align = alBottom + end + object imgTop4: TImage + Left = 2 + Top = 24 + Width = 169 + Height = 2 + Align = alTop + end + object imgLeft4: TImage + Left = 2 + Top = 26 + Width = 1 + Height = 421 + Align = alLeft + end + object tbxNotes: TSpTBXToolbar + Left = 2 + Top = 2 + Width = 169 + Height = 22 + Align = alTop + Caption = 'tbxNotes' + Images = ilImages + TabOrder = 0 + ChevronVertical = True + object mnuBold: TSpTBXItem + AutoCheck = True + ImageIndex = 29 + OnClick = mnuBoldClick + CaptionW = 'Bold' + end + object mnuItalic: TSpTBXItem + AutoCheck = True + ImageIndex = 27 + OnClick = mnuItalicClick + CaptionW = 'Italic' + end + object mnuUnderline: TSpTBXItem + AutoCheck = True + ImageIndex = 28 + OnClick = mnuUnderlineClick + CaptionW = 'Underline' + end + object sepNotes: TSpTBXSeparatorItem + end + object mnuSelectColor: TSpTBXSubmenuItem + ImageIndex = 26 + CaptionW = 'Select color' + object cpNotes: TTBXColorPalette + Color = clBlack + PaletteOptions = [tpoCustomImages] + OnChange = cpNotesChange + end + end + end + object rtfNotes: TRichEdit + Left = 3 + Top = 26 + Width = 167 + Height = 421 + Align = alClient + TabOrder = 1 + OnKeyDown = rtfNotesKeyDown + OnMouseDown = rtfNotesMouseDown + end + end + object tsExplorer: TSpTBXTabSheet + Left = 0 + Top = 0 + Width = 173 + Height = 449 + Caption = 'Code-Tools' + ImageIndex = -1 + TabItem = 'tiTools' + object spcBottom2: TImage + Left = 2 + Top = 447 + Width = 169 + Height = 2 + Align = alBottom + end + object spcLeft2: TImage + Left = 2 + Top = 2 + Width = 3 + Height = 445 + Align = alLeft + end + object spcRight2: TImage + Left = 168 + Top = 2 + Width = 3 + Height = 445 + Align = alRight + end + object pnlDock: TSpTBXMultiDock + Left = 5 + Top = 2 + Width = 163 + Height = 445 + Position = dpxClient + object pnlCodeExplorer: TSpTBXDockablePanel + Left = 0 + Top = 0 + Caption = 'Code-Explorer' + DockedWidth = 159 + DockPos = 0 + TabOrder = 0 + OnVisibleChanged = pnlCodeExplorerVisibleChanged + object trvExplorer: TTreeView + Left = 0 + Top = 26 + Width = 159 + Height = 184 + Align = alClient + Images = ilImages + Indent = 19 + ReadOnly = True + SortType = stText + TabOrder = 1 + OnCollapsed = trvExplorerCollapsed + OnDblClick = trvExplorerDblClick + OnExpanded = trvExplorerExpanded + Items.Data = { + 07000000220000002A0000002A000000FFFFFFFFFFFFFFFF0000000000000000 + 09436F6E7374616E7473200000002A0000002A000000FFFFFFFFFFFFFFFF0000 + 00000100000007446566696E65641E0000002A0000002A000000FFFFFFFFFFFF + FFFF0000000000000000054356617273210000002A0000002A000000FFFFFFFF + FFFFFFFF000000000000000008466F727761726473210000002A0000002A0000 + 00FFFFFFFFFFFFFFFF000000000000000008496E636C75646564200000002A00 + 00002A000000FFFFFFFFFFFFFFFF0000000003000000074D6574686F64732000 + 00002A0000002A000000FFFFFFFFFFFFFFFF0000000000000000074465666175 + 6C741F0000002A0000002A000000FFFFFFFFFFFFFFFF00000000000000000645 + 76656E74731F0000002A0000002A000000FFFFFFFFFFFFFFFF00000000000000 + 000653746F636B73200000002A0000002A000000FFFFFFFFFFFFFFFF00000000 + 00000000074E617469766573220000002A0000002A000000FFFFFFFFFFFFFFFF + 0000000000000000095661726961626C6573} + end + end + object pnlCodeInspector: TSpTBXDockablePanel + Left = 0 + Top = 214 + Caption = 'Code-Inspector' + DockedWidth = 159 + DockPos = 214 + TabOrder = 1 + OnVisibleChanged = pnlCodeInspectorVisibleChanged + object jviCode: TJvInspector + Left = 0 + Top = 26 + Width = 159 + Height = 185 + Align = alClient + Divider = 80 + ItemHeight = 16 + Painter = JvInspectorDotNETPainter + OnItemValueChanged = jviCodeItemValueChanged + end + end + end + end + end + end + end + object sbStatus: TSpTBXStatusBar + Left = 0 + Top = 590 + Width = 880 + Height = 23 + object mnuFilename: TSpTBXRightAlignSpacerItem + CustomWidth = 623 + CaptionW = 'Untitled.sma' + end + object sepStatus1: TSpTBXSeparatorItem + end + object mnuShowCodeTools: TSpTBXItem + AutoCheck = True + Checked = True + OnClick = mnuShowCodeToolsClick + CaptionW = 'Show Code-Tools' + end + object sepStatus2: TSpTBXSeparatorItem + end + object mnuModified: TSpTBXRightAlignSpacerItem + CustomWidth = 50 + end + object sepStatus3: TSpTBXSeparatorItem + end + object mnuCaret: TSpTBXRightAlignSpacerItem + Alignment = taCenter + CustomWidth = 80 + CaptionW = 'Ln 0 Ch 0' + end + end + object TBXSwitcher: TTBXSwitcher + Theme = 'OfficeXP' + Left = 813 + Top = 5 + end + object ilImages: TImageList + Left = 722 + Top = 36 + Bitmap = { + 494C010131003600040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 000000000000360000002800000040000000E0000000010020000000000000E0 + 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 + 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 + 0000000000000000000000000000000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6A59C00FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7EF00FFF7EF00FFF7 + EF00FFF7EF00FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6A59C00FFFF + FF00FFF7F700FFF7F700FFF7F700FFFFFF00FFFFFF00FFFFFF00FFF7EF00FFF7 + EF00FFF7EF00FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6ADA500FFFF + FF00FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEF + D600FFEFD600FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6ADA500FFFF + FF00F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6 + A500F7D6A500FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CEB5AD00FFFF + FF00FFFFFF00FFFFFF00FFF7F700FFF7F700FFFFFF00FFF7F700FFF7F700FFF7 + F700FFF7EF00FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D6B5AD00FFFF + FF00FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEFD600FFEF + D600FFEFD600FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D6BDB500FFFF + FF00F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6A500F7D6 + A500F7D6A500FFF7EF00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D6BDB500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFF7F700FFF7 + F700FFF7F700FFF7F700B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DEBDB500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFF7 + F700FFF7F700FFF7F700B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DEC6B50029AD + D60029ADD60029ADD60029ADD60029ADD60029ADD60029ADD60029ADD6002183 + A7002183A700C6BDAD00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E7C6B50029AD + D6008CF7FF008CF7FF008CF7FF008CF7FF008CF7FF008CF7FF0041EFFF00C6A5 + 9400B5948C00B58C8400B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E7C6B50029AD + D6008CF7FF00E88E6000E88E6000E88E6000E4753E00E1622300B04A1800BD8C + 7300EFB57300EFA54A00C6846B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EFCEBD0029AD + D6008CF7FF008CF7FF008CF7FF008CF7FF008CF7FF008CF7FF0041EFFF00C694 + 7B00FFC67300CE94730000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E7C6B50029AD + D60029ADD60029ADD60029ADD60029ADD60029ADD60029ADD6007FC7E900C694 + 7B00CE9C84000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E7C6B500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500EFCEB500D6BDB500BD84 + 7B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000008740D0008740D000874 + 0D0008740D000000000000000000000000008484840084848400848484008484 + 8400848484008484840084848400848484008484840084848400FFFFFF00C6C6 + C60084848400C6C6C600FFFFFF00C6C6C6000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B58484000000000000000000000000000F80AA000F80 + AA000F80AA000F80AA000F80AA000F80AA000000000008740D001DAF310021A9 + 330008740D000000000000000000000000008484840084848400848484008484 + 840084848400848484008484840084848400848484008484840084848400FFFF + FF0084848400FFFFFF0084848400848484000000000052CEEF0052CEEF0052CE + EF0029ADD60029ADD60052CEEF0029ADD60052CEEF0029ADD60052CEEF0029AD + D60029ADD6000000000000000000000000000000000000000000C6A59C00FFE7 + D600FFE7D600FFE7D600F7DEC600F7DEC600F7D6A500EFCE9C00EFCE9400EFCE + 9400EFCE9400F7D69C00B58484000000000000000000088DBB0048DFFA0035D6 + F80038D9F9006FEAFC008DEEF90029B8DE000F80AA0008740D001DAF31001DAF + 310008740D000000000000000000000000008400000084000000840000008400 + 00000000000000000000848484008484840084848400FFFFFF00FFFFFF00FFFF + FF008400000084000000840000008400000029ADD6009CFFFF009CFFFF005ACE + EF005ACEEF0052CEEF009CFFFF005ACEEF006BE7FF0052CEEF006BE7FF005ACE + EF006BE7FF0029ADD60000000000000000000000000000000000C6A59C00FFEF + D600FFC67300FFC67300FFC67300FFC67300FFC67300EFB57300EFB57300EFA5 + 4A00EFA54A00EFCE9C00B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F90068E8FC0008740D0008740D0008740D0008740D0023B93B001FB4 + 340008740D0008740D0008740D0008740D000000000000000000000000008400 + 0000FF00000084000000000000000000000084848400FFFFFF00FFFFFF00FFFF + FF008400000000000000000000000000000029ADD6009CFFFF005ACEEF009CFF + FF005ACEEF006BE7FF0052CEEF005ACEEF005ACEEF005ACEEF0052CEEF006BE7 + FF0052CEEF0029ADD60000000000000000000000000000000000C6ADA500FFEF + E700FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7 + D600FFE7D600EFCE9C00B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F90068E8FC0008740D0038D05D0036CE5A0031C953002BC2490028BF + 430022B839001FB434001DAF310008740D000000000000000000000000008400 + 000084000000FF0000008400000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF008400000000000000000000000000000029ADD6009CFFFF009CFFFF009CFF + FF009CFFFF005ACEEF009CFFFF0052CEEF006BE7FF005ACEEF006BE7FF0052CE + EF006BE7FF0029ADD60000000000000000000000000000000000C6ADA500FFF7 + E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEC600F7D6B500F7D6AD00EFCE + 9C00EFCE9C00EFCE9400B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F90068E8FC0008740D0038D05D0038D05D0038D05D0034CC57002EC5 + 4D002BC2490025BB3E0020B6370008740D000000000000000000000000008400 + 0000FF00000084000000FF00000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF008400000000000000000000000000000029ADD6009CFFFF009CFFFF009CFF + FF005ACEEF009CFFFF005ACEEF005ACEEF005ACEEF006BE7FF005ACEEF005ACE + EF0052CEEF005ACEEF0000000000000000000000000000000000CEB5AD00FFFF + F700FFC67300FFC67300FFC67300FFC67300FFC67300EFB57300EFB57300EFA5 + 4A00EFA54A00EFCE9C00B584840000000000088DBB00B2F9FD00B7F9FD00C2F9 + FD00DEFAFD00DEFAFD0008740D0008740D0008740D0008740D0038D05D0038D0 + 5D0008740D0008740D0008740D0008740D000000000000000000000000008400 + 000084000000FF0000008400000000000000FFFFFF00FFFF0000FFFFFF00FFFF + 00008400000000000000000000000000000029ADD6009CFFFF009CFFFF006BE7 + FF009CFFFF006BE7FF009CFFFF006BE7FF009CFFFF0052CEEF006BE7FF005ACE + EF006BE7FF0029ADD60000000000000000000000000000000000D6B5AD00FFFF + FF00FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7 + D600FFE7D600F7D6A500B584840000000000088DBB00B5EEF20031BFE30012A3 + CF0010A0CD0010A0CD0018A9D4000991BF0098E2E40008740D0038D05D0038D0 + 5D0008740D000000000000000000000000000000000000000000000000008400 + 0000FF00000084000000FF00000000000000FFFF0000FFFFFF00FFFF0000FFFF + FF008400000000000000000000000000000029ADD6009CFFFF009CFFFF009CFF + FF0084EFFF009CFFFF009CFFFF009CFFFF0084EFFF006BE7FF0052CEEF005ACE + EF005ACEEF005ACEEF00000000000000000000000000005A0000D6BDB500FFFF + FF00FFF7F700FFF7EF00FFEFDE00F7DEC600F7DEC600F7DEC600F7DEC600F7DE + BD00F7D6B500F7D6AD00B584840000000000088DBB0036C5E70059E7FC0035D6 + F80038D9F9006FEAFC008DEEF90031BFE3000A88B50008740D0038D05D0038D0 + 5D0008740D000000000000000000000000000000000000000000000000008400 + 000084000000FF0000008400000000000000FFFFFF00FFFF0000FFFFFF00FFFF + 00008400000000000000000000000000000029ADD6009CFFFF009CFFFF009CFF + FF006BE7FF009CFFFF009CFFFF005ACEEF009CFFFF006BE7FF009CFFFF005ACE + EF006BE7FF0029ADD60000000000000000000000000000730800005A0000FFFF + FF00FFC67300FFC67300FFC67300FFC67300FFC67300EFB57300EFB57300EFA5 + 4A00EFA54A00F7DEB500B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F9006FEAFC008DEEF90031BFE3000E9DCA0008740D0008740D000874 + 0D0008740D000000000000000000000000000000000000000000000000008400 + 0000FF00000084000000FF00000000000000FFFF0000FFFFFF00FFFF0000FFFF + FF008400000000000000000000000000000029ADD6009CFFFF009CFFFF009CFF + FF009CFFFF009CFFFF005ACEEF009CFFFF005ACEEF009CFFFF009CFFFF005ACE + EF0052CEEF005ACEEF000000000000000000000000000073080000730800005A + 0000FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFE7 + D600FFE7D600F7D6B500B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F9006FEAFC008DEEF90031BFE3000C9BC9000F80AA00000000000000 + 0000000000000000000000000000000000000000000000000000000000008400 + 0000840000008400000084000000840000008400000084000000840000008400 + 00008400000000000000000000000000000029ADD6006BE7FF009CFFFF005ACE + EF009CFFFF005ACEEF006BE7FF0029ADD60029ADD60029ADD60052CEEF0029AD + D60029ADD6000000000000000000089418000000000008841000008C0800008C + 0800FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700F7DEC600F7DEC600FFEF + D600E7DEC600C6BDAD00B584840000000000088DBB008AF1FA0059E7FC0035D6 + F80038D9F9006FEAFC008DEEF90031BFE3000E9DCA000F80AA00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052CEEF009CFFFF009CFF + FF005ACEEF006BE7FF0000000000000000000000000000000000000000000000 + 00000000000000000000000000001084180000000000008C0800008C0800FFFF + FF00FFC67300FFC67300EFB57300EFB57300EFA54A00FFF7EF00F7E7D600C6A5 + 9400B5948C00B58C8400B584840000000000088DBB0091EEF80082EEFA006FEA + FC007BECFB0097EEF800ABFAFD0063E7FB0012A3CF000F80AA00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000005ACEEF005ACEEF0029AD + D60029ADD60052CEEF00000000000000000000000000000000000000000029AD + D600108418000000000031AD52000894180000000000008C0800E7C6B500FFFF + FF00FFE7D600FFE7D600FFE7D600FFE7D600FFE7D600FFFFF700E7CECE00BD8C + 7300EFB57300EFA54A00C6846B0000000000088DBB00DEFAFD00DEFAFD00D3FA + FD00B2F9FD00AEFAFD00AEFAFD00ABFAFD0074ECFC000F80AA00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000840000008400000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000089418000894180031AD5200000000000000000000000000EFCEBD00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7D6CE00C694 + 7B00FFC67300CE9473000000000000000000000000000991BF00DEFAFD00DEFA + FD00C2F9FD00AEFAFD00ABFAFD00A7F7FC000C85B10000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000021AD390039C65A0010841800000000000000000000000000E7C6B500FFF7 + F700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00E7CECE00C694 + 7B00CE9C84000000000000000000000000000000000000000000088DBB00088D + BB00088DBB00088DBB00088DBB00088DBB000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000089418000894180010841800108418000000000000000000E7C6B500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500EFCEB500D6BDB500BD84 + 7B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001EA1CD002CAAD3001585B000000000000000 + 00000000000000000000000000000000000000000000078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00000000000000000000000000078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00000000000000000000000000B552180084522100844218008442 + 1800844218008442180084421800844218008442180084421800844218008442 + 18008442180084421800844218008442180000000000000000000000000027A5 + CF0023A4CE001585B0001E98C2002CABD3002CABD300178AB5001587B1002CAB + D30029A7D100000000000000000000000000078DBE0062CBF200078DBE00A4F6 + FD0066CEF50066CEF50066CEF50066CEF50066CEF50066CEF50066CEF50066CE + F5003AAFDA00ABF2FC00078DBE0000000000078DBE0025A0CD005FC8EE0083E1 + FB0066CDF40066CDF40066CDF40066CDF40066CDF40066CDF40066CDF40066CD + F4003AAED8001495C4000000000000000000B552180052392900523929005239 + 2900523929005239290052392900523929005239290052392900523929005239 + 29005239290052392900523929008442180000000000000000000000000027A5 + CF002CABD3002CABD3001DA0CC0020D0F8004AD7F70027A5CF005EC1DC0064C1 + DA0027A5CF00000000000000000000000000078DBE006BD2F700078DBE00A9F3 + FC006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4 + F8003AAFDA00BEECF400078DBE0000000000078DBE004CBBE30031A8D30095EC + FB006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4 + F9003FB1DB00C8F6FB00078DBE0000000000B552180000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000008442180000000000178CB6001E98C2004FC2 + E1007FDFF5004FC2E1003ACBEF001DD1FA003CD5F8005DD9F60074C1D600AEE2 + ED0091E3F500178AB5000000000000000000078DBE0072D6FA00078DBE00ABF2 + FC0079DCFA0079DCFA0079DCFA0079DCFA0079DCFA007ADDFB0079DCFA0079DC + FA0045B6DF00BEECF400078DBE0000000000078DBE0072D6F900078DBE00ACF8 + FD007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADB + FA0043B5DD00C8F6FB00078DBE0000000000B552180000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000084421800000000005EC1DC002CABD3004FC2 + E10096E4F5008BE2F5005DD9F60027D0F7001DD1FA0056D9F70076DEF5007FDF + F5003ACBEF002CABD30027A5CF0000000000078DBE007ADDFB00078DBE00B4F3 + FC0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4 + FB0045B6DF00C3F0F700078DBE0000000000078DBE007CDDFA001495C40095EC + FB0092EAFB0086E3FB0083E1FB0083E1FB0086E3FB0083E1FB0083E1FB0086E3 + FB0049B8E000C8F6FB001495C40000000000B552180000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000084421800000000001B91BC0023A4CE004FC2 + E1007FDFF50091E3F50070DCF5005EC1DC004FC2E1002DCFF4001DD1FA001DD1 + FA001DD1FA0020D0F8002CABD30000000000078DBE0081E2FB00078DBE00BEF4 + FC008EECFC008EECFC008EECFC008EECFC008EECFC008EECFC008EECFC008EEC + FC004CBCE400BEF4FC00078DBE0000000000078DBE0083E1FB0043B5DD0059C4 + EA00ACF8FD008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB008FE9 + FB004CBBE300C8F6FB00C8F6FB00078DBE00B55218000000000046464600FFFF + FF0046464600464646000808080000000000464646006B6B6B006B6B6B006B6B + 6B006B6B6B00000000000000000084421800000000001A8FBA002CABD30045C7 + E9006BDBF60089BECD00979696009796960097969600979696004FC2E1001DD1 + FA001DD1FA001DD1FA001D9EC90000000000078DBE008BEAFC00078DBE00D2F7 + FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6 + FC00BADADF00D2F7FC00078DBE0000000000078DBE008CE7FB0078DAFA0025A0 + CD00E5F8FA00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6 + FB0095ECFB00E5F8FA00CFF6FA00078DBE00B552180000000000FFFFFF000808 + 0800000000000000000000000000FFFFFF004646460000000000000000000000 + 000000000000000000000000000084421800000000001B91BC002CABD3002CAB + D3005DD9F60097969600E2DFE300B0B4B700ACA3A200BEB2B2009796960056D9 + F7009DE3F200AEE2ED001E98C20000000000078DBE0094F1FD00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE0000000000078DBE0096F0FC0096F0FC001495 + C400078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00B552180000000000FFFFFF000000 + 000000000000FFFFFF0008080800FFFFFF000808080000000000000000000000 + 00000000000000000000000000008442180000000000178CB6001EA1CD002CAB + D30045C7E90097969600E2DFE300B0B4B700ACA3A200BEB2B200979696007FDF + F500AEE2ED0089BECD0027A5CF0000000000078DBE009BF4FD009BF4FD009BF4 + FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4 + FD00078CBD00000000000000000000000000078DBE009CF5FD009AF4FD009AF4 + FD009CF5FD009DF6FD009AF4FD009CF5FD009AF4FD009CF5FD009AF4FD009AF4 + FD00088DBE00000000000000000000000000B55218000000000046464600FFFF + FF00464646000000000000000000080808000000000000000000000000000000 + 00000000000000000000000000008442180000000000000000001585B00021A3 + CE003ACBEF0097969600E2DFE300B0B4B700ACA3A200BEB2B2009796960067DA + F60064C1DA001585B0000000000000000000078DBE00D2F7FC00A0F6FD00A0F6 + FD00A0F6FD00A2F7FD00A2F7FD00A0F6FD00A2F7FD00A2F7FD00A0F6FD00A2F7 + FD00078CBD00000000000000000000000000078DBE00E5F8FA00A1F9FE00A1F9 + FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9 + FE00088DBE00000000000000000000000000B552180000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000844218000000000000000000000000001589 + B4001A8FBA0097969600E2DFE300B0B4B700ACA3A200BEB2B200979696001E98 + C2001B91BC0000000000000000000000000000000000078DBE00D2F7FC00A4F6 + FD00A4F6FD00A4F6FD00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE000000000000000000000000000000000000000000078DBE00E5F8FA00A4F9 + FE00A4F9FE00A4F9FE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE0000000000000000000000000000000000B552180029211800292118002921 + 1800292118002921180029211800292118002921180029211800292118002921 + 1800292118002921180029211000844218000000000000000000000000000000 + 00000000000097969600E2DFE300BAAFAE00AAA1A100BEB2B200979696000000 + 0000000000000000000000000000000000000000000000000000078DBE00078D + BE00078DBE00078DBE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000078DBE00078D + BE00078DBE00078DBE0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B5521800EAC07800EAC07800EAC0 + 7800EAC07800EAC07800EAC07800EAC07800EAC07800EAC07800EAC07800EAC0 + 7800EAC07800EAC07800EAC07800844218000000000000000000000000000000 + 00000000000097969600B0B4B700A6A0A00098969600A8A0A000979696000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B5521800E78C3100E78C3100E78C + 3100E78C3100E78C3100E78C3100E78C3100E78C3100E78C3100E78C3100EF9C + 4A00EF9C5200D68C5A006B7BC600844218000000000000000000000000000000 + 00000000000097969600E0E0E300BEB2B200A6A0A000B0A5A400979696000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A3522800A3522800A352 + 2800A3522800A3522800A3522800A3522800A3522800A3522800A3522800A352 + 2800A3522800A3522800A3522800000000000000000000000000000000000000 + 00000000000097969600E2DFE300E2DFE300B9B3B400A39E9E00979696000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000097969600979696009796960097969600000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000636B7300C69C94000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CC670100CC670100CC67 + 0100CC670100CC670100CC670100CC670100CC670100CC670100CC670100CC67 + 0100CC670100CC670100CC670100CC6701000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000082818A00346E9D00B991 + 9200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000006394B500218CEF002173B500CE9C + 9400000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFAF500FFF3E600FEEBD500FEE3C300FEDCB500FED7AB00FED7AB00FED7 + AB00FED7AB00FED7AB00FED7AB00CC6701000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004B88C2002E8BDF006481 + 9D00BC8E96000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000004AB5FF0042A5FF00218CEF007B84 + 9400CE9C94000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFFFF00FFFAF500FFF3E600FEEBD500FEE3C400FEDCB50000C0C00000C0 + C00000C0C00000C0C000FED7AB00CC6701000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004EB2FD0061BDFC002E8B + DF00247DC900B991920000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052BDFF005ABDFF00218C + EF002173B500CE9C940000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFAF500FFF3E600FFEBD500FEE3C400FFFFFF00FFFF + FF00FFFFFF0000C0C000FED7AB00CC6701001894CE001894CE001894CE001894 + CE00000000000000000000000000000000000000000000000000000000000000 + 00000073080000000000000000000000000000000000000000004EB2FD004EB2 + FD002E8BDF0064819D00B9919200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000031A5FF0052BDFF0042A5 + FF00218CEF0084849400CE9C9400000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFAF500FFF3E600FFEBD500FEE3C400FEDC + B500FED7AB00FED7AB00FED7AB00CC6701001894CE00ADF7FF007BF7FF006BEF + F70031B5DE0031B5DE0031B5DE001894CE001894CE001094CE00000000000073 + 08005AE78C000073080000000000000000000000000000000000000000004EB2 + FD0061BDFC002E8BDF00217AC200000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000052BD + FF005ABDFF003184D60052636B00000000009C6B6B0000630000007300000073 + 0800427B310000000000000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFAF500FFF3E600FFEBD500FEE3 + C400FEDCB500FED7AB00FED7AB00CC6701001894CE0084DEEF0094FFFF007BF7 + FF0084F7FF0084F7FF007BF7FF006BE7FF0063DEF70031B5DE000073080052D6 + 7B0042D66B0031C64A0000730800000000000000000000000000000000000000 + 00004EB2FD004EB2FD002E8BDF000000000000000000AE837E00AE837E00AE83 + 7E00AE837E0000000000000000000000000000000000000000000000000031A5 + FF0052BDFF00C6CEDE009C9C9C00AD8C84004284310084A55A0063944200109C + 290021AD42004A944200000000000000000000000000CC670100FFFFFF00FFFF + FF00FFFFFF00808080008080800080808000FFFFFF0080808000FFF3E6008080 + 80008080800080808000FED7AB00CC6701001894CE0063C6E70094FFFF0073F7 + FF007BF7FF0073EFFF0073EFFF0073EFFF007BEFFF007BF7FF0052C6E700108C + 210031C64A00109C210000000000000000000000000000000000000000000000 + 0000000000000000000000000000B9919200E3C5A200FEFEDD00FEFEDB00FEFE + DB00FEFEDD00E1CAB200AE837E00000000000000000000000000000000000000 + 000000000000C6ADAD00CEA59400FFE7BD00FFF7CE00FFFFD600FFFFD600FFFF + DE001084210031BD5200088418000000000000000000CC6701008080FF000000 + FF008080FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFAF500FFF3 + E600FFEBD500FEE3C400FEDCB500CC6701001894CE001894CE0084E7F7007BF7 + FF007BF7FF0073EFFF0073EFFF0073EFFF0073EFFF0073EFFF0052C6E7000884 + 100018AD29000884100000000000000000000000000000000000000000000000 + 0000000000000000000000000000E0C5A700FDF3C700FEFEDA00FEFEDA00FEFE + E000FEFEE500FEFEFA00E1CAB200000000000000000000000000000000000000 + 000000000000BD8C8C00EFDEB5008CB57B00FFF7CE00FFFFD600FFFFDE00FFFF + EF00108418004AE77B00087B18000000000000000000CC6701000000FF000000 + FF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFA + F500FFF3E600FFEBD500FEE3C400CC6701001894CE005AD6EF001894CE0094FF + FF0073F7FF007BEFFF0073EFFF0073EFFF0073EFFF0073EFFF0052C6E700088C + 100008A518000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00F1D7AD00EFC99900FEFEDB00FEFEDA00FEFE + F100FEFEFA00FEFEF500FEFEE900AE837E000000000000000000000000000000 + 000000000000006300001884210052EF840010841800FFFFD600528C390021A5 + 420042D66B0052F78C004AE77B002184310000000000CC6701008080FF000000 + FF008080FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFAF500FFF3E600FFEBD500CC6701001894CE007BF7FF001894CE0073CE + EF007BDEEF007BDEEF0094EFFF0084F7FF006BEFFF006BEFFF00088C100008A5 + 1800088410000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00EFC79600F0C08D00FEFDD700FEFEDC00FEFE + EE00FEFEF700FEFEEE00FEFEE000AE837E000000000000000000000000000000 + 000000000000107B180052E77B0052F78C0039CE6B00FFFFD600FFFFDE001073 + 100039CE6B005AF78C0052E77B005294420000000000CC670100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFAF500FFF3E600CC6701001894CE008CFFFF0063E7F7001894 + CE001894CE001894CE005AC6E70000730800087B0800088C1000088C1000087B + 080073EFFF0018A5D60000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00EFC99900F0BE8D00F6DFB400FDF7CE00FEFE + DD00FEFEDD00FEFEDB00FEFEDA00AE837E000000000000000000000000000000 + 00001084180010841800108421004AE77B00108418001084180010841800FFFF + D6009CBD8C001084180052943900C694940000000000CC670100CC670100CC67 + 0100CC670100CC670100CC670100CC670100CC670100CC670100CC670100CC67 + 0100CC670100CC670100CC670100CC6701001894CE0084FFFF0084FFFF0084FF + FF007BF7FF007BF7FF001894CE001894CE006BCEEF0094E7F70084DEEF0094E7 + F700A5F7FF0039ADDE0000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00F8E4B900EFC79600EFC99900F7E2B600FEFE + DA00FEFEDC00FEFEDB00FEFEDC00AE837E000000000000000000000000000000 + 000000000000D6ADA500087B180042DE730010841800F7D6A500F7E7BD00FFFF + D600FFFFD6009CB58400FFFFD600000000000000000000000000CC670100CC67 + 0100CC670100CC670100CC670100CC670100CC670100CC670100CC670100CC67 + 0100CC670100CC670100CC670100000000001894CE008CFFFF007BF7FF007BF7 + FF007BF7FF0084F7FF0084FFFF0073F7FF001894CE001894CE001894CE001894 + CE00299CCE001894CE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000E1CAB200FEFEFA00F8E4B900F0C08D00EFC3 + 9200EFC99900FDF3C700DEC6AE00000000000000000000000000000000000000 + 00000000000000000000C69C8C0031C6630021AD4200F7C69400EFBD8400F7C6 + 9400F7D6AD00FFEFC600BD9C8C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001894CE0084E7F70094FFFF008CFF + FF0084FFFF0063D6EF001894CE001894CE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AE837E00DFC7B100FEFDD700F3DAAF00EFC9 + 9900F2D8AD00DEC5AB00AE837E00000000000000000000000000000000000000 + 0000000000000000000000000000087B180021AD4200107310006394420084A5 + 630042843100C69C940000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001894CE001894CE001894 + CE001894CE001894CE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AE837E00AE837E00AE83 + 7E00AE837E000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C69C8C00CEA59C00C69C + 9400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000AD73 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000C6A59C0069F3 + FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3 + FF0069F3FF007FC7E900B5848400000000000000000000000000C6A59C00FFEF + D600F7E7C600F7DEBD00F7DEB500F7D6AD00F7D6A500EFCE9C00EFCE9400EFCE + 9400EFCE9400F7D69C00B5848400000000000000000000000000000000000000 + 00000000000000000000000000003131C6003131C6003131A5003131A5000000 + 000000000000000000000000000000000000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000C6A59C0069F3 + FF00E88E6000E88E6000E88E6000E4753E00E4753E00E4753E00E1622300E162 + 2300E16223007FC7E900B5848400000000000000000000000000C6A59C00FFEF + D600C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A5 + 9C00C6A59C00EFCE9C00B5848400000000000000000000000000000000000000 + 000000000000000000003139FF003139FF003139FF003131E7003131E7003131 + A50000000000000000000000000000000000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000C6ADA5007FC7 + E90029ADD60029ADD60029ADD60029ADD60029ADD60029ADD60029ADD60029AD + D60029ADD60029ADD600B5848400000000000000000000000000C6ADA500FFEF + E700F7E7D600F7E7CE00F7DEC600F7DEBD00F7D6B500F7D6AD00EFCE9C00EFCE + 9C00EFCE9400EFCE9C00B5848400000000000000000000000000000000000000 + 0000000000003139FF003139FF003139FF003139FF003139FF003131E7003131 + E7003131A500000000000000000000000000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000C6ADA500FFF7 + E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEB500F7D6B500F7D6AD00EFCE + 9C00EFCE9C00EFCE9400B5848400000000000000000000000000C6ADA500FFF7 + E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEB500F7D6B500F7D6AD00EFCE + 9C00EFCE9C00EFCE9400B5848400000000000000000000000000000000000000 + 0000000000003139FF006363FF003139FF003139FF003139FF003139FF003131 + E7003131A500000000000000000000000000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000CEB5AD00FFFF + F700FFEFE700F7E7D600F7E7D600F7E7CE00F7DEC600F7DEBD00F7DEC600F7DE + C600EFCE9C00EFCE9C00B5848400000000000000000000000000CEB5AD00FFFF + F700C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A5 + 9C00C6A59C00EFCE9C00B584840000000000CE6B00007B3908007B3908007B39 + 08007B3908006363FF006363FF003139FF003139FF003139FF003139FF003139 + FF003131A500000000000000000000000000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000D6B5AD00FFFF + FF00FFCD9100FFCD9100FFC37D00FFC37D00FFC37D00FFBA6900FFBA6900FFBA + 6900F7D6A500F7D6A500B5848400000000000000000000000000D6B5AD00FFFF + FF00FFF7EF00FFEFE700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEBD00F7D6 + AD00F7D6A500F7D6A500B584840000000000CE6B0000F7941000CE630000CE63 + 0000CE6300006363FF009C9CFF006363FF003139FF003139FF003139FF003139 + FF003131A500004A0000004A0000004A0000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000D6BDB500FFFF + FF00FFF7F700FFF7EF00FFEFDE00F7E7D600F7E7CE00F7E7C600F7DEC600F7DE + BD00F7D6B500F7D6AD00B5848400000000000000000000000000D6BDB500FFFF + FF00FFF7F700FFF7EF00FFEFDE00F7E7D600F7E7CE00F7E7C600F7DEC600F7DE + BD00F7D6B500F7D6AD00B58484000000000000000000CE6B0000F7941000E76B + 0000E76B0000E76B00006363FF009C9CFF006363FF003139FF003139FF003131 + C600007B0800007B0800007B0800004A0000000000000000000000000000AD73 + 8400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00B5848400000000000000000000000000D6BDB500FFFF + FF00FFFFFF00FFF7F700FFF7EF00FFEFE700F7E7D600F7E7CE00F7DEC600F7DE + BD00F7DEB500F7DEB500B5848400000000000000000000000000D6BDB500FFFF + FF00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00C6A5 + 9C00C6A59C00F7DEB500B5848400000000000000000000000000CE6B0000F794 + 1000E76B0000CE6300007B3908006363FF003139FF003139FF003139FF00009C + 0800009C0800009C0800007B0800004A000000000000000000003184FF003184 + FF003184FF00F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7 + F700F7F7F700F7F7F700B5848400000000000000000000000000DEBDB500FFFF + FF00FFCD9100FFCD9100FFC37D00FFC37D00FFC37D00FFBA6900FFBA6900FFBA + 6900F7DEC600F7D6B500B5848400000000000000000000000000DEBDB500FFFF + FF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00F7E7D600F7E7CE00F7DE + C600F7DEC600F7D6B500B584840000000000000000000000000000000000CE6B + 0000F79410007B390800000000000873100042C67300009C0800009C0800009C + 0800009C0800009C0800007B0800004A000000000000000000003184FF0042B5 + F7003184FF00EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEF + EF00EFEFEF00EFEFEF00B5848400000000000000000000000000DEC6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00FFEFDE00FFEF + D600E7DEC600C6BDAD00B5848400000000000000000000000000DEC6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00FFEFDE00FFEF + D600E7DEC600C6BDAD00B5848400000000000000000000000000000000000000 + 0000CE6B000000000000000000000873100042C67300009C0800009C0800009C + 0800009C0800009C0800007B0800004A00003184FF003184FF003184FF0042B5 + F7003184FF003184FF003184FF00E7E7E700E7E7E700E7E7E700E7E7E700B584 + 7300B5948C00B58C8400B5848400000000000000000000000000E7C6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFF7EF00FFF7EF00F7E7D600C6A5 + 9400B5948C00B58C8400B5848400000000000000000000000000E7C6B500FFFF + FF00C6A59C00C6A59C00C6A59C00C6A59C00C6A59C00FFF7EF00F7E7D600C6A5 + 9400B5948C00B58C8400B5848400000000000000000000000000000000000000 + 00000000000000000000000000000873100042C67300009C0800009C0800009C + 0800009C0800009C0800007B0800004A00003184FF008CD6F700B5DEF700B5DE + F700B5DEF7008CD6F7003184FF00DEDEDE00DEDEDE00DEDEDE00C6C6C600B584 + 7300FFFFFF00FFFFFF00B5848400000000000000000000000000E7C6B5007FC7 + E90029ADD60029ADD60029ADD60029ADD60029ADD60029ADD6002183A700BD8C + 7300EFB57300EFA54A00C6846B00000000000000000000000000E7C6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFF700E7CECE00BD8C + 7300EFB57300EFA54A00C6846B00000000000000000000000000000000000000 + 00000000000000000000000000000873100042C67300009C0800009C0800009C + 0800009C0800009C0800007B0800004A00003184FF003184FF003184FF00B5DE + F7003184FF003184FF003184FF00D6D6D600D6D6D600D6D6D600C6C6C600B584 + 7300FFFFFF00B584840000000000000000000000000000000000E7C6B50069F3 + FF00E88E6000E88E6000E88E6000E88E6000E4753E00E1622300B04A1800C694 + 7B00FFC67300CE94730000000000000000000000000000000000EFCEBD00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7D6CE00C694 + 7B00FFC67300CE94730000000000000000000000000000000000000000000000 + 00000000000000000000000000000873100042C6730042C6730042C6730042C6 + 730042C6730042C6730042C67300004A000000000000000000003184FF00B5DE + F7003184FF00CECECE00CECECE00CECECE00CECECE00CECECE00C6C6C600B584 + 7300B58484000000000000000000000000000000000000000000E7C6B50069F3 + FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3FF0069F3FF007FC7E900C694 + 7B00CE9C84000000000000000000000000000000000000000000E7C6B500FFF7 + F700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00E7CECE00C694 + 7B00CE9C84000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000087310000873100008731000087310000873 + 10000873100008731000087310000873100000000000000000003184FF003184 + FF003184FF00B5847300B5847300B5847300B5847300B5847300B5847300B584 + 7300000000000000000000000000000000000000000000000000EFCEB500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500E7C6B500D6BDB500BD84 + 7B00000000000000000000000000000000000000000000000000E7C6B500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500EFCEB500D6BDB500BD84 + 7B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D5820000D582 + 0000D5820000D5820000D5820000D5820000D5820000D5820000D5820000D582 + 0000D5820000D582000000000000000000000000000000000000D5810000D581 + 0000D5810000D5810000D5810000D5810000D5810000D5810000D5810000D581 + 0000D5810000D581000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D5820000FEEAD500FDE8 + D100FCE7CF00FBE4CB00FBE1C400FBDFC000FBDEBD00FBDDBC00FBDAB500FBDA + B500FBD8B200FBD8B200D58200000000000000000000D5810000FEF7EF00FDED + DC00FDEAD600FDE8D100FDE7CE00FEE4C700FEE3C400FEE1C200FDDFBC00FDDE + BB00FDDDBA00FEE1C200D5810000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D5820000FEEDDA00FEEB + D700CF834400CF834400CF834400CF834400CF834400CF834400CF834400CF83 + 4400FBDAB500FBD8B200D58200000000000000000000D5810000FDF2E600FDE9 + D300FDE5CA00FDE5CA00FEE4C700FDE0BE00FDDDBA00FDDEBB00FDDFBC00FDDD + BA00F7D7B700FDDDBA00D5810000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D5820000FEF0E000FEEE + DC00FEECD800FEEAD500FCE7CF00FBE4CB00FBE1C400FBE0C200FBDEBE00FBDE + BD00FBDBB700FBDAB500D58200000000000000000000D5810000FDF5EC00FDED + DC00E7B78A00D2884400D78A4000CE884A00CE884A00D3884200E1A26500F2D0 + AE00FDDDBA00FDDEBB00D5810000000000000000000029ADD60029ADD60029AD + D6002D2D2D0058534E0029ADD60029ADD60029ADD60029ADD60029ADD60029AD + D60029ADD60029ADD60029ADD600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D5820000FEF2E500FEF0 + E000FEEEDC00F6D1AA00CF844000CF834400D4895700CF834400EEC6A000FBDF + C000FBDEBD00FBDBB700D58200000000000000000000D5810000FEF8F100FDEF + E000FEE4C700DB8D3F00D87B0F00E3A76D00EDC6A200DA732000D2710300DF97 + 4F00FDDFBC00FDE0BE00D5810000000000000000000029ADD6008CF7FF008CF7 + FF0058534E00454442005160610073DEF70073DEF70073DEF70029ADD60029AD + D60073DEF70073DEF70029ADD6000000000000000000808080008D5E5D008D5E + 5D008D5E5D008D5E5D008D5E5D008D5E5D008D5E5D008D5E5D008D5E5D000000 + 00000000000000000000000000000000000000000000D5820000FEF5EA00FEF2 + E500FEEEDC00D4895700D6875D00FDE9D300FDE8D100DAAF8D00D4895700FBDD + BC00FBDFC000FBDEBD00D58200000000000000000000D5810000FEFBF600FDF2 + E600FDE8D100E0995100DA732000E8BB9100FDEFE000E1A26500D2710300DA73 + 2000FDDFBC00FEE1C200D5810000000000000000000029ADD6008CF7FF008CF7 + FF0073DEF70054777B00477AA90018556F008A5B520073DEF70029ADD600ADFF + FF0029ADD60073DEF70029ADD600000000000000000080808000FFFAEB00F9F1 + E200F9F0DF00F7EEDC00F7EEDB00F7EDDA00F8EFDB00F2E5D1008E5F5E000000 + 000000000000C0000000000000000000000000000000D5820000FEF6EE00FEF5 + EA00FEEBD700D2884900E1B59100FEEDDA00FEEAD500FADBB900D4895700FAD7 + B100FBE1C400FBDFC000D58200000000000000000000D5810000FEFDFA00FEF7 + EF00FDE9D300E19C5800DE8F3D00E4AE7B00EDC6A200D78A4000D2710300E1A0 + 6000FEE1C200FEE4C700D5810000000000000000000029ADD6009CFFFF008CF7 + FF008CF7FF0054777B0041749600947E7500C17135008A5B520029ADD600ADFF + FF00ADFFFF0029ADD60029ADD600000000000000000080808000F9F1E400F5E2 + CD00F5E0CA00F4DFC900F3DEC500F2DDC300F2E2CD00EBDBC9008E5F5E000000 + 0000FF000000FF000000C00000000000000000000000D5820000FEF9F300FEF7 + EF00FEEEDD00D2884900DDB28E00FEEFDE00FEEDDA00FADBB900D6875D00FADB + B900FBE4CB00FBE1C400D58200000000000000000000D5810000FEFEFD00FEF7 + EF00FCEBD900E19E5B00DE903E00CE884A00D3884200D2710300CE884A00FBDC + BA00FEE3C400FDE5CA00D5810000000000000000000029ADD6009CFFFF009CFF + FF008CF7FF0073DEF7007C707800F1BC8600F0A85C00C07638008A5B520029AD + D60029ADD60029ADD60029ADD600000000000000000080808000FCF5EA00FCD8 + B500FCD8B400FCD8B300FBD7B300FBD7B200FADAB800EBDECE0092646200FF00 + 0000FF000000FF000000FF000000C000000000000000D5820000FEFAF500FEF9 + F300FEF0E100D3894C00E0B49000FEF1E300FEF0E000FBDFC000D6875D00FBDF + C000FDE8D100FBE4CB00D58200000000000000000000D5810000FEFEFD00FEFB + F600F1E9E100E1A06000DE903E00E7B78A00EFCBA900DB8D3F00DA732000E8BB + 9100FDE7CE00FDE7CE00D5810000000000000000000029ADD6009CFFFF009CFF + FF009CFFFF008CF7FF00AD7B7300FBD3A900F9C48D00EFA65A00C07638008A5B + 520073DEF70073DEF70029ADD600000000000000000080808000FEFBF500FDD2 + A700FDD2A700FDD2A700FDD2A700FDD2A700FDD2A700F0E5DA00A57A75000000 + 0000FF000000FF000000C00000000000000000000000D5820000FEFCF800FEFB + F700FEF3E800D3894C00E6BB9600FEF4E900FEF2E500FAE1C800D6875D00FAE1 + C800FEEAD500FDE8D100D58200000000000000000000D5810000FEFEFD00FEFD + FA00F7F0E900E3A76D00DF924200EDC6A200FDF2E600E19C5800D87B0F00E4AB + 7300FDE8D100FDE9D300D5810000000000000000000029ADD6009CFFFF009CFF + FF009CFFFF009CFFFF008CF7FF00AD7B7300FBD3A900F9C48D00F0A85C00C171 + 35008A5B520073DEF70029ADD600000000000000000080808000FFFDFB00FDEA + D800FCE7D400FBE6D300FAE6D100FDE9D300FDF4E600E8E0D900C0000000C000 + 0000FF000000FF000000C00000000000000000000000D5820000FEFCF800FEFC + F800E4B89300D1833300D4895700FBE5CE00FEF4E900DAAF8D00D0833A00DDB2 + 8E00FEECD800FEEAD500D58200000000000000000000D5810000FEFEFD00FEFE + FD00F2D0AE00E0995100DE903E00E1A26500E3A76D00DE8F3D00DF924200EFCB + A900FDEAD600FCEBD900D5810000000000000000000029ADD6009CFFFF009CFF + FF009CFFFF009CFFFF009CFFFF008CF7FF00AD7B7300FBD3A900F8C28C00EDA7 + 5F00B56D3E008A5B520029ADD600000000000000000080808000FFFFFF00FDD2 + A700FDD2A700FDD2A700FDD2A700EBDFDB00FF000000FF000000FF000000FF00 + 0000FF000000FF000000C00000000000000000000000D5820000FEFCF800FEFC + F800FEFCF800FEFCF800FEFAF400FEF8F100FEF6EE00FEF5EA00FEF2E600FEF1 + E200FEEFDE00FEEDDA00D58200000000000000000000D5810000FEFEFD00FEFD + FB00EFCBA900EBC19A00EDC6A200EBC19A00E7B78A00EBC19A00F7D7B700FDED + DC00FDEAD600FDEFE000D5810000000000000000000029ADD6009CFFFF009CFF + FF009CFFFF009CFFFF009CFFFF009CFFFF008CF7FF00AD7B7300FBD3A9009891 + A20035A8F5000316AC0000009A00000000000000000080808000FFFFFF00FCE7 + D400FCE7D400FCE7D400FCE7D400B48E8800B48E8800B48E8800B48E88000000 + 00000000000000000000000000000000000000000000D5820000FEFCF800FEFC + F800FEFCF800FEFCF800FEFCF800FEFAF500FEF8F200FEF7EF00FEF5EA00FEF3 + E800FEF1E200FEEFDE00D58200000000000000000000D5810000FEFEFD00FEFE + FD00FEFEFD00FEFEFD00FEFEFD00FEFEFD00FEFEFD00FEFEFD00FEFCF800FEF7 + EF00FDF3E900FEF9F300D5810000000000000000000029ADD60029ADD60029AD + D60029ADD60029ADD60029ADD60029ADD60029ADD60029ADD600AD7B73004A9E + ED001029D6001029D6000316AC0000009A000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00B48E8800EBB56F00C68C7800000000000000 + 0000000000000000000000000000000000000000000000000000D5820000D582 + 0000D5820000D5820000D5820000D5820000D5820000D5820000D5820000D582 + 0000D5820000D582000000000000000000000000000000000000D5810000D581 + 0000D5810000D5810000D5810000D5810000D5810000D5810000D5810000D581 + 0000D5810000D581000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000018 + C6006D8AFD00106BFF001029D600000000000000000080808000808080008080 + 8000808080008080800080808000808080008080800000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000018C6000018C60000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008543220085432200854322008543220085432200854322000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008543 + 220085432200C9660100C9660100C9660100C9660100C9660100C96601008543 + 2200854322000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BD4A0000BD4A0000BD4A + 0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A + 0000BD4A0000BD4A0000BD4A0000BD4A00000000000000000000D6820000D682 + 0000D6820000D6820000D6820000D6820000D6820000D6820000D6820000D682 + 0000D6820000D6820000000000000000000000000000000000009A4E1800C662 + 0100C9650000C9650000C9650000C9650000C9650000C9660100C9660100C966 + 0100C76301008543220000000000000000000000000000000000000000000000 + 00000000000000000000A5947B00AD847B009C636300BD734A00000000000000 + 00000000000000000000000000000000000000000000BD4A0000FFFFFF00FFFF + FF00FFFFF700FFEFDE00FFE7CE00FFDEB500FFD6A500FFCE9400FFCE9400FFCE + 9400FFCE9400FFCE9400FFCE9400BD4A000000000000D6820000FEF7EE00FEED + D800FEEBD400FDE8D000FDE8D000FCE3C800FDE1C300FEE0BE00FEDEBB00FDDD + B800FDDDB800FDE1C100D682000000000000000000009A4E1800C6620100C763 + 0100C6620100C6620100C6620100C6620100C7630100C9640100C9660100C966 + 0100C9660100C763010085432200000000000000000000000000000000000000 + 000000000000A57B6300BD633900C6634200C66342009C52420084736B000000 + 00000000000000000000000000000000000000000000BD4A0000FFFFFF00FFFF + FF00FFFFFF00FFFFF700FFEFDE00FFE7CE00FFDEB500FFD6A500FFCE9400FFCE + 9400FFCE9400FFCE9400FFCE9400BD4A000000000000D6820000FEF3E500FEEA + D200FDE8D000FCE2C600FDE1C300FDE1C100FDDCB800FDDCB700FDDBB500FBD9 + B500FAD7B300FDDDB800D68200000000000000000000BD5F0800C6620100C360 + 0200C3600200CB741D00D58D4500DB9B5A00DB9B5A00D2863A00C9640100C966 + 0100C9660100C966010085432200000000000000000000000000000000000000 + 0000BD734A00C65A1800A54218008C522100B5421800BD522900CE6339008442 + 31000000000000000000000000000000000000000000BD4A0000FFFFFF002952 + FF002952FF002952FF00FFFFF7008C2900008C2900008C290000FFD6A5000084 + BD000084BD000084BD00FFCE9400BD4A000000000000D6820000FEF5EA00FEED + D800FEEED900ECC29C00D9814200D7823700E2B08300FEDEBB00FEDDB900FDDB + B500FBD9B500FEDDB900D682000000000000A7541200C9680600C9680600C968 + 0600DB9B5A00FBFAF900FBFAF900FBFAF900FBFAF900E9C39B00C6620100C964 + 0100C9660100C9660100C966010085432200000000000000000000000000BD73 + 4A00BD521000A5390000AD420000316300006B4A0000AD390000A5390800BD5A + 39007352420000000000000000000000000000000000BD4A0000FFFFFF002952 + FF002952FF002952FF00FFFFFF008C2900008C2900008C290000FFDEB5000084 + BD000084BD000084BD00FFCE9400BD4A000000000000D6820000FEF8F100FEEF + DB00FEEDD800FEECD600DBAE8500D3801F00F1CDAA00FCE2C600FEE0BE00FDDD + B800FDDBB500FEE0BE00D682000000000000AC571100CB701500CB701500CB74 + 1D00FBFAF900E9C09600CE7B2800CB741D00CB701500BD5F0800C3600200C763 + 0100C9650000C9660100C9660100854322000000000000000000BD734A009C52 + 4200AD420000CE5A0000BD6B0000007B000021730000C65A0000B54A00007363 + 2100845A310073524200000000000000000000000000BD4A0000FFFFFF002952 + FF002952FF002952FF00FFFFFF008C2900008C2900008C290000FFE7CE000084 + BD000084BD000084BD00FFCE9400BD4A000000000000D6820000FEFBF600FEF1 + E100FEEFDB00FEF1DF00F3D0AD00D2802700E8B98E00FDE8D000FDE1C100FEDE + BB00FDDDB800FEE0BE00D682000000000000AC571100D0813100D0813100CE7B + 2800FBFAF900D2863A00CE7B2800CB701500C9680600E9C39B00C15F0400C662 + 0100C9650000C9660100C9660100854322000000000000000000BD734A009C52 + 4200CE5A0000D67B0000848C000039940000C6840000BD7B000021730000086B + 0800636B2900BD734A00000000000000000000000000BD4A0000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFF700FFEFDE00FFE7 + CE00FFDEB500FFD6A500FFCE9400BD4A000000000000D6820000FEFDFA00FEF3 + E500FEF1E100FEF2E200FCE5CC00D9814200E0AF8300FDE7CF00FCE2C600FDE1 + C100FEDEBB00FDE1C300D682000000000000AC571100DEA26500D9965200D58D + 4500FBFAF900E5B58300D2863A00CE7B2800CB701500FBFAF900E9C09600C360 + 0200C9650000C9660100C9660100854322000000000000000000BD734A009C52 + 4200C673000029A5180031AD2100D6AD1800FF9C0800E78C0000318400000073 + 0000426B1000636B2900000000000000000000000000BD4A0000FFFFFF00BD84 + 8400BD848400BD848400FFFFFF00DE630000DE630000DE630000FFFFF7000084 + 00000084000000840000FFD6A500BD4A000000000000D6820000FEFDFC00FEF6 + EC00FEF3E500FEF2E200FEF1E100E2B08300DB7C4F00FCE1C400FDE8D000FCE2 + C600FDE1C100FCE4CA00D682000000000000AC571100E5B58300E4B17D00D996 + 5200F1D5B900FBFAF900F6E5D300F6E5D300F7EADD00FBFAF900FBFAF900EECF + AF00C9650000C9660100C96601008543220000000000000000009C524200BD73 + 4A007B94080010C64A0031CE63007BCE6B00FFCE5A00FFA510006B8C00000084 + 0000296B0000296B0000000000000000000000000000BD4A0000FFFFFF00BD84 + 8400BD848400BD848400FFFFFF00DE630000DE630000DE630000FFFFFF000084 + 00000084000000840000FFDEB500BD4A000000000000D6820000FEFDFC00FEF8 + F100FEF6EC00FEF3E500FEF5EA00EDC5A000D9814200F3D0AD00FEECD600FCE4 + CA00FCE2C600FDE7CF00D682000000000000AC571100E4B17D00F1D5B900E4B1 + 7D00E0A76D00E9C39B00F1D5B900EECFAF00F4DFC900FBFAF900FBFAF900ECCA + A700C9650000C9660100C9660100854322000000000000000000A5947B00BD73 + 4A0031BD390042D67300A5E79C00A5F7B500D6E79400D6B52900B58C00003184 + 00005A7B2900A5947B00000000000000000000000000BD4A0000FFFFFF00BD84 + 8400BD848400BD848400FFFFFF00DE630000DE630000DE630000FFFFFF000084 + 00000084000000840000FFE7CE00BD4A000000000000D6820000FEFDFC00FEFA + F400FEF7EF00FEF5EA00FEF6EC00FCE5CC00DB7C4F00EBC09800FEF1DF00FDE8 + D000FCE4CA00FEEAD200D68200000000000000000000B25B1000F2D9C000F2D9 + C000E7B98A00E0A76D00DB9B5A00D58D4500D0813100FBFAF900E8BC8F00CA66 + 0200C9650000C96601008543220000000000000000000000000000000000A594 + 7B0084C6730063DE7B00BDF7AD00D6FFBD005ADE840039B53100F78C0000C684 + 0800A5947B0000000000000000000000000000000000BD4A0000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFF700FFEFDE00BD4A000000000000D6820000FEFDFC00FEFB + F800FEFAF400FEF7EF00FEF7EF00E8DCCF00DB7C4F00DB7C4F00F6D4B100FEEE + D900FDE8D000FEECD600D68200000000000000000000AC571100E5B58300F6E5 + D300F4DFC900E7B98A00DC9E5F00D58D4500D0813100E8BC8F00CB741D00C968 + 0600C9660100C763010085432200000000000000000000000000000000000000 + 0000A5947B00ADC68C00A5D6840094DE8C0052CE63004AB53900D69C4200A594 + 7B000000000000000000000000000000000000000000BD4A0000BD4A0000BD4A + 0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A + 0000BD4A0000BD4A0000BD4A0000BD4A000000000000D6820000FEFDFC00FEFD + FA00FEFBF800FEFAF400FEF9F200E1D4C600EABE9500E6B68A00F3D0AD00FEF1 + DF00FEEBD400FEF0DD00D6820000000000000000000000000000AC571100E7B9 + 8A00F4DFC900F6E5D300EECFAF00E7B98A00E2AD7700DC9E5F00D58D4500CB70 + 1500C76301008E471E0000000000000000000000000000000000000000000000 + 000000000000A5947B00A5947B00AD847B00A5947B00A5947B00A5947B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D6820000FEFDFC00FEFD + FC00FEFDFC00FEFDFC00FEFDFC00FEFDFC00FEFDFC00FEFDFC00FEFDFA00FEF6 + EC00FEF4E800FEF9F200D682000000000000000000000000000000000000AC57 + 1100B25B1000E8BC8F00ECCAA700ECCAA700E8BC8F00DEA26500CE7B2800B25B + 1000884421000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D6820000D682 + 0000D6820000D6820000D6820000D6820000D6820000D6820000D6820000D682 + 0000D6820000D682000000000000000000000000000000000000000000000000 + 000000000000AC571100B25B1000B25B1000B25B1000B25B10009A4E18000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008342230083422300834223008342230083422300834223000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000CC6802000000000000000000000000009C3B0C009C3B0C009C3B0C009C3B + 0C009C3B0C000000000000000000000000000000000000000000000000000000 + 00000000000000000000E7C4B300E7C4B300E7C4B300D6B9AE00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008342 + 230083422300C9650000C9650000C9650000C9650000C9650000C96500008342 + 2300834223000000000000000000000000000000000000000000000000000000 + 0000CC680200CC680200CC680200CD6904009C3B0C00F89A9400EBA15E00DA84 + 2C009C3B0C000000000000000000000000000000000000000000000000000000 + 000000000000E7C4B300F2E7E100CAD0D600CAD0D600F2E7E100D6B9AE000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000004A000000630000004A00000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009D4F1700C361 + 0300C9650000C9650000C9650000C9650000C9650000C9650000C9650000C965 + 0000C66301008342230000000000000000000000000000000000000000000000 + 0000CC6802000000000000000000000000009B3A0C009C3B0C009C3A0C009B3A + 0C009C3B0C000000000000000000000000000000000000000000000000000000 + 0000E7C4B300F2E7E100FEFEFE00D0805D00C4695200BFB9B900F2E7E100D6B9 + AE00000000000000000000000000000000000000000000000000000000000000 + 00000000000000630000089C210000630000004A000000000000000000000000 + 00000000000000000000000000000000000000000000994D1900C3610300C964 + 0000C6630100C6630100C6630100C6630100C9640000C9640000C9650000C965 + 0000C9650000C663010083422300000000000000000000000000000000000000 + 0000CC6802000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E7C4 + B300F2E7E100FEFEFE00D0805D00C46E5200BF694C00C4695200BFB9B900F2E7 + E100D6B9AE000000000000000000000000000000000000000000000000000000 + 00000000000000630000109C2100089C210000630000004A0000000000000000 + 00000000000000000000000000000000000000000000BE5F0600C6630100C361 + 0300C3610300BE5F0600D2883E00D8945100DB9B5C00D58E4700CC782300C965 + 0000C9650000C965000083422300000000000000000000000000000000000000 + 0000CC6802000000000000000000000000009C3B0C009C3B0C009C3B0C009C3B + 0C009C3B0C000000000000000000000000000000000000000000E7C4B300F2E7 + E100FEFEFE00D0805D00C46E5200F8EDE700F8EDE700F8E1D600BF694C00BFB9 + B900F2E7E100D6B9AE0000000000000000000000000000000000000000000000 + 0000000000000063000010A5290010A52900089C210000630000004A00000000 + 000000000000000000000000000000000000A8551200C7680800C7680800C768 + 0800C7660600C3610300EAC49E00FBF7F400FBF7F400FBF7F400FBF7F400DB9B + 5C00C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC680200CC680200CC680200CC6802009C3B0C00F89A9400EBA15E00DA84 + 2C009C3B0C0000000000000000000000000000000000E7C4B300F2E7E100FEFE + FE00D0805D00C46E5200C46E5200C46E5200F8EDE700C46E5200C46E5200BF69 + 4C00BFB9B900F2E7E100D6B9AE00000000000000000000000000000000000000 + 0000000000000063000010B5390010A52900089C2100089C210000630000004A + 000000000000000000000000000000000000AB571100C96E1400C9711800C971 + 1800C9711800C9711800C9711800C9711800C9711800CA741D00E6B98B00FBF7 + F400C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC6802000000000000000000000000009B3A0C009C3B0C009C3A0C009B3A + 0C009C3B0C0000000000000000000000000000000000EDD0C400FEFEFE00D080 + 5D00CA7A5700C46E5200C46E5200C46E5200F8EDE700C46E5200C46E5200C46E + 5200BF694C00BFB9B900D6B9AE00000000000000000000000000000000000000 + 0000000000000063000018B54A0010AD390010AD390010AD390010A529000063 + 000000520000000000000000000000000000AB571100D0823300CE7D2C00CE7D + 2C00CE7D2C00CE7D2C00EDCDAC00C9711800C76A0C00BE5F0600C96E1400FBF7 + F400C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC6802000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000EDD0C400FFFFFF00F8E1 + CA00E1A27400CA7A5700C46E5200C46E5200F8EDE700C46E5200C46E5200C46E + 5200D0805D00CAD0D600D6B9AE00000000000000000000000000000000000000 + 0000000000000063000052BD52005ABD52004ABD52004ABD52004ABD52000063 + 000000520000000000000000000000000000AE5A1200DC9E6000D8945100D288 + 3E00D58E4700EFD0B100FBF7F400CE7D2C00C9711800C7680800DB9B5C00FBF7 + F400C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC6802000000000000000000000000009C3B0C009C3B0C009C3B0C009C3B + 0C009C3B0C0000000000000000000000000000000000E7C4B300F2E7E100FFFF + FF00F8E1CA00E1A27400CA7A5700F8EDE700F8EDE700C46E5200C46E5200D080 + 5D00E7EDED00F2E7E100D6B9AE00000000000000000000000000000000000000 + 000000000000006300005AC65A006BC66B006BC663004ABD520000630000004A + 000000000000000000000000000000000000AB571100E5B58400E3AE7900D894 + 5100F4DFC900FBF7F400FBF7F400F8EDE200F5E2CF00F4DFC900FBF7F400E6B9 + 8B00C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC680200CC680200CC680200CC6802009C3B0C00F89A9400EBA15E00DA84 + 2C009C3B0C000000000000000000000000000000000000000000E7C4B300F2E7 + E100FFFFFF00F8E1CA00E1A27400CA7A5700E7AE8500C46E5200D0805D00FEFE + FE00F2E7E100E1C4B30000000000000000000000000000000000000000000000 + 000000000000006300006BC66B007BD67B007BD67B0000630000004A00000000 + 000000000000000000000000000000000000A8551200E5B58400F0D3B500E3AE + 7900F5E2CF00FBF7F400FBF7F400F5E2CF00EDCDAC00EBC7A200DC9E6000C663 + 0100C9650000C9650000C9650000834223000000000000000000000000000000 + 0000CC6802000000000000000000000000009B3A0C009C3B0C009C3A0C009B3A + 0C009C3B0C00000000000000000000000000000000000000000000000000E7C4 + B300F2E7E100FFFFFF00F8E1CA00E1A27400F8EDE700D0805D00FEFEFE00F2E7 + E100E1C4B3000000000000000000000000000000000000000000000000000000 + 0000000000000063000063C663008CD68C0000630000004A0000000000000000 + 00000000000000000000000000000000000000000000AE5A1200F2DAC200F2DA + C200E7BB8E00F1D6BB00FBF7F400D58E4700D0823300CC782300C96E1400C865 + 0400C9650000C9650000834223000000000000000000000000009C3B0C009C3B + 0C009C3B0C009C3B0C009C3B0C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E7C4B300F2E7E100FFFFFF00F8E1CA00D0805D00FEFEFE00F2E7E100E1C4 + B300000000000000000000000000000000000000000000000000000000000000 + 0000000000000063000039AD390000630000004A000000000000000000000000 + 00000000000000000000000000000000000000000000A8551200E5B58400F6E5 + D400F4DFC900E7BB8E00EFD0B100D58E4700D0823300CC782300C9711800C768 + 0800C9650000C6630100834223000000000000000000000000009C3B0C00F89A + 9400EBA15E00DA842C009C3B0C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000E7C4B300F2E7E100FFFFFF00FEFEFE00F2E7E100E1C4B3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000004A000000630000004A00000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AB571100E6B9 + 8B00F4DFC900F6E5D400EFD0B100E6B98B00DFA66D00DC9E6000D58E4700C96E + 1400C66301008E481E00000000000000000000000000000000009B3A0C009C3B + 0C009C3A0C009B3A0C009C3B0C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000E7C4B300E7C4B300E1C4B300E1C4B300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000AB57 + 1100B25C1100E7BB8E00ECC9A700ECC9A700E7BB8E00DC9E6000CE7D2C00B25C + 11008A4620000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000AE5A1200B25C1100B25C1100B25C1100AE5A12009D4F17000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A70D800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 2000000000000000000000000000000000001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 2000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000076DD400197EE400076DD400076DD40000000000CE630000CE630000CE63 + 0000CE630000CE630000CE630000CE630000CE630000CE630000CE630000CE63 + 0000CE630000CE630000CE630000CE6300001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 2000000000000000000000000000000000001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 200000000000000000000000000000000000000000000000000018CEF60019CB + F70000000000000000000000000000000000000000000000000000000000076D + D4002A94F3002BACF900076DD4000000000000000000CE630000FFFFFF00FFFF + FF00FFFFF700FFF7E700FFEFD600FFE7C600FFD6AD00FFD6AD00F7D6AD00FFD6 + AD00FFD6AD00FFD6AD00FFD6AD00CE6300000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000018CE + F60019CBF7000000000000000000076DD400076DD400076DD400076DD4002790 + F0002CA4F900076DD400000000000000000000000000CE630000FFFFFF00BDC6 + C600BDC6C600BDC6C600BDC6C600BDC6C600BDC6C600BDC6C600BDC6C600BDC6 + C600BDC6C600BDC6C600FFD6AD00CE63000000000000000000002066AB000000 + 0000000000000000000000000000006600000066000000660000006600000066 + 0000006600000000000000000000000000000000000000000000000000001B63 + AA00000000000000000000000000006600000066000000660000006600000066 + 0000006600000000000000000000000000000000000000000000000000000000 + 000000000000000000000A70D8000E73DB002790F0004FCBF3004FCBF300238B + EE00076DD40000000000000000000000000000000000CE630000FFFFFF00FFFF + FF002D2D2D0058534E00AAAAAA00FFF7E700FFE7C600FFE7C600FFD6AD00FFD6 + AD00F7D6AD00FFD6AD00FFD6AD00CE63000000000000000000002066AB002066 + AB000000000000000000000000000066000044B65D0030AB47001E9E2F001593 + 23000066000000000000000000000000000000000000000000001B63AA001B63 + AA000000000000000000000000000066000036B0650026A144001A942C00158B + 2100006600000000000000000000000000000000000000000000000000000000 + 00000000000010635D001176DE002CA4F9001F86E9002E9EF8002BACF9002E9E + F800076DD40000000000000000000000000000000000CE630000FFFFFF00BDC6 + C60058534E0045444200516061009B9B9B00BDC6C600BDC6C600BDC6C600BDC6 + C600BDC6C600BDC6C600FFD6AD00CE6300002066AB002066AB004393D8004393 + D8002066AB000000000000000000006600000066000000660000006600000066 + 000000660000000000000000000000000000000000001B63AA005FBBBF005FBB + BF001B63AA001B63AA0000000000006600000066000000660000006600000066 + 0000006600000000000000000000000000000000000000000000000000000000 + 00000B8813001A9A2A0010635D002790F0004FCBF300197EE4001F86E9002D98 + F600076DD40000000000000000000000000000000000CE630000FFFFFF00FFFF + FF00FFFFFF0054777B00477AA90018556F008A5B5200AAAAAA00FFE7C600FFE7 + C600FFD6AD00FFD6AD00FFD6AD00CE6300002066AB00A9C8B40092C79F004393 + D8004393D8002066AB0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001B63AA00B6D8EA007FCAC4005FBB + BF005FBBBF001B63AA0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000674 + 080012911E004EB47A002EBB520010635D001F86E9002E9EF8001176DE001C82 + E700076DD40000000000000000000000000000000000CE630000FFFFFF00BDC6 + C600BDC6C60054777B0041749600947E7500C17135008A5B52009B9B9B00BDC6 + C600BDC6C600ADB5BD00FFD6AD00CE6300002066AB002066AB004393D80074C1 + 86002066AB000000000000000000006600000066000000660000006600000066 + 000000660000006600000066000000660000000000001B63AA00C0D6E3005FBB + BF001B63AA001B63AA0000000000006600000066000000660000006600000066 + 0000006600000066000000660000006600000000000000000000000000000A79 + 0D0033C25D001FA3340037C2660012911E0011635C00197EE4002D98F6000E73 + DB00076DD40000000000000000000000000000000000CE630000FFFFFF00FFFF + FF00FFFFFF00FFFFFF007C707800F1BC8600F0A85C00C07638008A5B5200AAAA + AA00FFE7C600FFD6AD00FFD6AD00CE63000000000000000000002066AB002066 + AB000000000000000000000000000066000050B9670044B65D0044B65D0039B0 + 510029A63F001E9E2F001797260007700B0000000000000000001B63AA001B63 + AA000000000000000000000000000066000036B0650036B0650032AE5C0032AE + 5C0026A14400209A3700168E2400056E08000000000000000000000000000A79 + 0D0033C25D001C9D2E000B881300057F08000279030011635C001176DE00076D + D4000000000000000000000000000000000000000000CE630000FFFFFF00BDC6 + C600BDC6C600BDC6C600AD7B7300FBD3A900F9C48D00EFA65A00C07638008A5B + 52009B9B9B00BDC6C600FFD6AD00CE63000000000000000000002066AB000000 + 0000000000000000000000000000006600000066000000660000006600000066 + 0000006600000066000000660000006600000000000000000000000000001B63 + AA00000000000000000000000000006600000066000000660000006600000066 + 0000006600000066000000660000006600000000000000000000000000000A79 + 0D002AB749001C9D2E0006810B00037B0500027903000279030011635C000000 + 00000000000000000000000000000000000000000000CE630000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00AD7B7300FBD3A900F9C48D00F0A85C00C171 + 35008A5B5200AAAAAA00FFD6AD00CE6300000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001291 + 1E000E8B170009851000037B0500037B0500016E0100016C01000000000018CE + F60019CBF70000000000000000000000000000000000CE630000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AD7B7300FBD3A900F8C28C00EDA7 + 5F00B56D3E008A5B52009B9B9B00CE6300001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 2000000000000000000000000000000000001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 20000000000000000000000000000000000000000000000000001C9D2E0033C2 + 5D00067408000169020001690200016902000169020000000000000000000000 + 000018CEF60019CBF700000000000000000000000000CE630000CE630000CE63 + 0000CE630000CE630000CE630000CE630000CE630000AD7B7300FBD3A9009891 + A20035A8F5000316AC0000009A00CE6300001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 2000000000000000000000000000000000001583200015832000158320001583 + 2000158320001583200015832000158320001583200015832000158320001583 + 20000000000000000000000000000000000000000000137C160033C25D000985 + 1000016902000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CE630000CE63 + 0000CE630000CE630000CE630000CE630000CE630000CE630000AD7B73004A9E + ED001029D6001029D6000316AC0000009A000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000026B0300036F0500027702000169 + 0200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000018 + C6006D8AFD00106BFF001029D600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000015952200026B0300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000018C6000018C60000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000082818A00346E9D00B991 + 9200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6A59C00FFEF + D600F7E7C600F7DEBD00F7DEB500F7D6AD00F7D6A500EFCE9C00EFCE9400EFCE + 9400EFCE9400F7D69C00B5848400000000000000000000000000C6A59C00FFEF + D600F7E7C600F7DEBD00F7DEB500F7D6AD00F7D6A500EFCE9C00EFCE9400EFCE + 9400EFCE9400F7D69C00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004B88C2002E8BDF006481 + 9D00BC8E96000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6A59C00FFEF + D600848484008484840084848400848484008484840084848400848484008484 + 840084848400EFCE9C00B5848400000000000000000000000000C6A59C00FFEF + D60031C6520029BD4A0010A5310010A5310010A53100008C0800008C0800008C + 0800006B0800EFCE9C00B5848400000000000000000000000000000000004242 + 4200000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004EB2FD0061BDFC002E8B + DF00247DC900B991920000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6ADA500FFEF + E700F7E7D600F7E7CE00F7DEC600F7DEBD00F7D6B500F7D6AD00EFCE9C00EFCE + 9C00EFCE9400EFCE9C00B5848400000000000000000000000000C6ADA500FFEF + E700F7E7D600F7E7CE00F7DEC600F7DEBD00F7D6B500F7D6AD00EFCE9C00EFCE + 9C00EFCE9400EFCE9C00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000004242420000000000424242000000 + 00000000000000000000000000000000000000000000000000004EB2FD004EB2 + FD002E8BDF0064819D00B9919200000000000000000000000000000000000000 + 0000000000000000000000000000000000000073080000000000C6ADA500FFF7 + E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEB500F7D6B500F7D6AD00EFCE + 9C00EFCE9C00EFCE9400B5848400000000000000000000000000C6ADA500FFF7 + E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEB500F7D6B500F7D6AD00EFCE + 9C00EFCE9C00EFCE9400B5848400000000000000000000000000000000000000 + 0000424242000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004EB2 + FD0061BDFC002E8BDF00217AC200000000000000000000000000000000000000 + 000000000000000000000000000000000000007308000073080000730800FFFF + F7000063CE000063CE000063CE000063CE000063CE000063CE000063CE000063 + CE000063CE00EFCE9C00B5848400000000000000000000000000CEB5AD00FFFF + F70073A5FF00004AF700004AF700004AF700004AF700004AF700004AF700004A + F700004AF700EFCE9C00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004EB2FD004EB2FD002E8BDF000000000000000000AE837E00AE837E00AE83 + 7E00AE837E000000000000000000000000000073080000730800007308000073 + 080010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7 + FF0010F7FF00EFCE9C00B5848400000000000000000000000000D6B5AD00FFFF + FF00FFF7EF00FFEFE700F7E7D600F7E7CE00F7E7C600F7DEC600F7DEBD00F7D6 + AD00F7D6A500F7D6A500B5848400000000000000000000000000000000008484 + 8400000000004242420000000000000000000000000042424200000000004242 + 4200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B9919200E3C5A200FEFEDD00FEFEDB00FEFE + DB00FEFEDD00E1CAB200AE837E0000000000008C0800008C0800008C0800008C + 080010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7FF0010F7 + FF0010F7FF00F7DEB500B5848400000000000000000000000000D6BDB500FFFF + FF00FFF7F700FFF7EF00FFEFDE00F7E7D600F7E7CE00F7E7C600F7DEC600F7DE + BD00F7D6B500F7D6AD00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000E0C5A700FDF3C700FEFEDA00FEFEDA00FEFE + E000FEFEE500FEFEFA00E1CAB20000000000008C0800008C0800008C0800FFFF + FF000063CE000063CE000063CE000063CE000063CE000063CE000063CE000063 + CE000063CE00F7DEB500B5848400000000000000000000000000D6BDB500FFFF + FF0031C6520029BD4A0010A5310010A5310010A53100008C0800008C0800008C + 0800006B0800F7DEB500B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00F1D7AD00EFC99900FEFEDB00FEFEDA00FEFE + F100FEFEFA00FEFEF500FEFEE900AE837E00008C080000000000DEBDB500FFFF + FF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00F7E7D600F7E7CE00F7DE + C600F7DEC600F7D6B500B5848400000000000000000000000000DEBDB500FFFF + FF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00F7E7D600F7E7CE00F7DE + C600F7DEC600F7D6B500B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00EFC79600F0C08D00FEFDD700FEFEDC00FEFE + EE00FEFEF700FEFEEE00FEFEE000AE837E000000000000000000DEC6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00FFEFDE00FFEF + D600E7DEC600C6BDAD00B5848400000000000000000000000000DEC6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEFDE00FFEFDE00FFEF + D600E7DEC600C6BDAD00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00EFC99900F0BE8D00F6DFB400FDF7CE00FEFE + DD00FEFEDD00FEFEDB00FEFEDA00AE837E000000000000000000E7C6B500FFFF + FF008484840084848400848484008484840084848400FFF7EF00F7E7D600C6A5 + 9400B5948C00B58C8400B5848400000000000000000000000000E7C6B500FFFF + FF0073A5FF00004AF700004AF700004AF700004AF700FFF7EF00F7E7D600C6A5 + 9400B5948C00B58C8400B5848400000000000000000000000000000000000000 + 0000000000004242420000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AE837E00F8E4B900EFC79600EFC99900F7E2B600FEFE + DA00FEFEDC00FEFEDB00FEFEDC00AE837E000000000000000000E7C6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFF700E7CECE00BD8C + 7300EFB57300EFA54A00C6846B00000000000000000000000000E7C6B500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFF700E7CECE00BD8C + 7300EFB57300EFA54A00C6846B00000000000000000000000000000000000000 + 0000000000000000000042424200000000004242420000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000E1CAB200FEFEFA00F8E4B900F0C08D00EFC3 + 9200EFC99900FDF3C700DEC6AE00000000000000000000000000EFCEBD00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7D6CE00C694 + 7B00FFC67300CE94730000000000000000000000000000000000EFCEBD00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7D6CE00C694 + 7B00FFC67300CE94730000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AE837E00DFC7B100FEFDD700F3DAAF00EFC9 + 9900F2D8AD00DEC5AB00AE837E00000000000000000000000000E7C6B500FFF7 + F700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00E7CECE00C694 + 7B00CE9C84000000000000000000000000000000000000000000E7C6B500FFF7 + F700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7EF00E7CECE00C694 + 7B00CE9C84000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AE837E00AE837E00AE83 + 7E00AE837E000000000000000000000000000000000000000000E7C6B500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500EFCEB500DEBDB500BD84 + 7B00000000000000000000000000000000000000000000000000E7C6B500EFCE + B500EFCEB500EFCEB500EFCEB500E7C6B500E7C6B500EFCEB500D6BDB500BD84 + 7B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A5787300A5787300A5787300A5787300A5787300A5787300A578 + 7300A5787300A57873008C5D5C0000000000000000000000000000669A000066 + 9A0000669A00A37F7700A37F7700A37F7700A37F7700A37F7700A37F7700A37F + 7700A37F7700A37F77008F6261000000000000000000C6847300B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400000000000000000000000000000000000000 + 000000000000AD3900008C290000000000000000000000000000A54200008C29 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A97B7500FCE3CA00FDE1C500FDDFC100FCDAB900FCDAB900F9D4 + B000F9D4B000F5CCA6008C5D5C00000000000000000000669A004BC3E4004BC3 + E4004BC3E400B3847600F7ECDE00FAF1E700F8EEE100F7ECDE00F7ECDE00F7EC + DE00F7ECDE00F7ECDE008F62610000000000C6A59C00FFFFFF00FFFFFF00FFFF + FF00FFFFEF00FFFFEF00FFFFEF00FFF7DE00FFF7DE00FFEFD600FFEFD600FFEF + D600FFDEB50000189C00FFD6A500B58484000000000000000000000000000000 + 0000C65A0000A5420000A54200008C29000000000000A5420000AD390000AD39 + 00008C2900000000000000000000000000000000000000000000000000000000 + 000000000000AD7E7500FAE6D400E5A55600E5A55600E5A55600E5A55600E5A5 + 5600E5A55600F9D4B0008C5D5C00000000000000000000669A004AC5E6004BC3 + E4004BC3E400B3847600F5E7D800E3A55B00E4A55900E4A55900E4A55900E4A5 + 5900E4A55900F5E3D1008F62610000000000C6A59C00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFEF00FFFFEF00FFFFEF00FFF7DE00FFF7DE00FFEF + D600FFEFD60000189C00FFDEBD00B58484000000000000000000000000000000 + 0000AD39000000000000000000008C29000000000000AD390000000000000000 + 00008C2900000000000000000000000000000000000000000000000000000000 + 000000000000B5867A00FBEEE200F9E9D900FBE4CF00FCE3CA00FDE1C500FCDD + BD00FCDAB900F9D4B0008C5D5C00000000000000000000669A004CC7E9004AC5 + E6004BC3E400B9877500F7ECDE00F5E4D200EFDCC900EFDCC900EFDCC900EBD8 + C600EFDCC900F5E4D2008F62610000000000C6ADA500FFFFFF00FFFFFF00FFFF + FF00DEA57B00C6847300FFFFFF00DEA57B00C6847300FFFFEF00DEA57B002118 + CE002118CE002118CE0000189C0000189C000000000000000000000000000000 + 0000AD3900008C290000000000008C29000000000000AD39000000000000C65A + 00008C290000000000000000000000000000A5787300A5787300A5787300A578 + 7300A5787300BA8C7D00FBF1E700E5A55600E5A55600E5A55600E5A55600E5A5 + 5600E5A55600FCDAB9008C5D5C00000000000000000000669A0057CDED0050C9 + EA004AC5E600B9877500F9EFE400E3A55B00E4A55900E4A55900E4A55900E4A5 + 5900E4A55900F5E5D5008F62610000000000C6ADA500FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFEF00FFFF + EF00FFF7DE002118CE00FFEFD600B58484000000000000000000000000000000 + 0000C65A0000AD390000AD390000AD390000A5948400AD390000AD390000AD39 + 00008C290000000000000000000000000000A97B7500FCE3CA00FDE1C500FDDF + C100FCDAB900BD918400FDF5ED00FBF1E700FBEEE200F9E9D900FAE6D400FCE3 + CA00FDE1C500FDDFC1008C5D5C00000000000000000000669A005DD1EF0057CD + ED0053CBEB00C18C7200FAF2E900F7ECDE00F5E4D200F5E4D200F5E3D100F3E1 + CD00F5E4D200F5E9DB008F62610000000000D6B5AD00FFFFFF00C6847300FFFF + FF00FFFFFF00EFE7E700943931008C2121008C212100A5635A008C212100E7CE + C600FFFFEF002118CE00FFEFD600B58484000000000000000000000000000000 + 000000000000C65A0000A54200009C4A18008C634A00AD390000A54200008C29 + 000000000000000000000000000000000000AD7E7500FAE6D400E5A55600E5A5 + 5600E5A55600BD918400FEF9F300E5A55600E5A55600E5A55600E5A55600E5A5 + 5600E5A55600FCE3CA008C5D5C00000000000000000000669A0065D6F20061D4 + F1005BD0EE00C6906F00FAF4EE00E3A55B00E4A55900E4A55900E4A55900E4A5 + 5900E4A55900F9EEE2008F62610000000000D6B5AD00FFFFFF00DEA57B00FFFF + FF00FFFFFF00BD7B7B009C424200FFFFFF00EFE7E7009C5252008C212100FFFF + FF00FFFFEF00DEA57B00FFEFD600B58484000000000000000000000000000000 + 00000000000000000000000000008C736B00E7DED6008C736B00000000000000 + 000000000000000000000000000000000000B5867A00FBEEE200F9E9D900FBE4 + CF00FCE3CA00DEAB8400FEFBF900FEF9F500FDF7F000FCF4EA00FBF1E700FBEE + E200F9E9D900FAE5D1008C5D5C00000000000000000000669A006DDBF50069D9 + F40061D4F100C6906F00FBF8F400FBF6F200F9F0E600F9EFE400F8EEE100F9EE + E200F9F0E600F5E9DB008F62610000000000D6BDB500FFFFFF00FFFFFF00FFFF + FF00FFFFFF00C68C8C008C212100CE949400FFFFFF00FFFFFF008C212100FFFF + FF00FFFFFF00FFFFEF00FFF7DE00B58484000000000000000000000000000000 + 000000000000000000008C736B00E7DED6009C847B00D6CEBD008C736B000000 + 000000000000000000000000000000000000BA8C7D00FBF1E700E5A55600E5A5 + 5600E5A55600DEAB8400FEFBF900FEFBF900FEF9F500FEF9F300FDF5ED00F9E9 + D900ECC5A200BD9184008C5D5C00000000000000000000669A0075DFF80071DD + F60069D9F400D5A58900FBF8F400FCFAF900FCFAF900FCFAF900FCFAF900B384 + 7600B3847600B3847600B384760000000000D6BDB500FFFFFF00C6847300FFFF + FF00FFFFFF00FFFFFF00B56B6B00943931008C2121008C2121008C212100FFFF + FF00FFFFFF00C6847300FFFFEF00B58484000000000000000000000000000000 + 000000000000000000009C847B00E7DED6009C847B00D6CEBD009C847B000000 + 000000000000000000000000000000000000BD918400FDF5ED00FBF1E700FBEE + E200F9E9D900E2B18A00FEFBF900FEFBF900FEFBF900FEFBF800FEF9F300B281 + 7600B2817600B2817600B07F7500000000000000000000669A007CE2F90078E1 + F90071DDF600D5A58900FCFAF800FCFAF900FCFAF900FCFAF900FCFAF900B384 + 7600DDA57200E2A45B000000000000000000D6BDB500FFFFFF00DEA57B00FFFF + FF00FFFFFF00EFE7E700CE949400FFFFFF00FFFFFF00E7D6D6008C212100FFFF + FF00FFFFFF00DEA57B00FFFFEF00B58484000000000000000000000000000000 + 0000000000008C736B00E7DED6008C736B00000000007B7B7300D6CEBD008C73 + 6B0000000000000000000000000000000000BD918400FEF9F300E5A55600E5A5 + 5600E5A55600E5B68E00FEFBF900FEFBF900FEFBF900FEFBF900FEFBF800B281 + 7600E5AE7000E4A3530000000000000000000000000000669A007EE3F9007CE2 + F90078E1F900D5A58900D9A68200D9A68200D9A68200D9A68200D9A68200B384 + 7600C6AE9A0000669A000000000000000000E7C6B500FFFFFF00FFFFFF00FFFF + FF00FFFFFF00EFE7E7008C212100BD7B7B00CE949400B56B6B008C212100FFFF + FF00FFFFFF00FFFFFF00FFFFEF00B58484000000000000000000000000000000 + 000000000000D6CEBD008C736B000000000000000000000000008C736B00D6CE + BD0000000000000000000000000000000000DEAB8400FEFBF900FEF9F500FDF7 + F000FCF4EA00E5B68E00DEAB8400DEAB8400DEAB8400DEAB8400DEAB8400B281 + 7600E8AB5E000000000000000000000000000000000000669A0088E5F9007EE3 + F9007EE3F9007EE3F90078E1F90075DFF8006DDBF50065D6F2005DD1EF0057CD + ED0053CBEB0000669A000000000000000000E7C6B500FFFFFF00C6847300FFFF + FF00FFFFFF00FFFFFF00DEBDB5009C525200943931009C424200DEBDB500FFFF + FF00FFFFFF00C6847300FFFFEF00B58484000000000000000000000000000000 + 00008C736B00E7DED6009C847B000000000000000000000000009C847B00D6CE + BD008C736B00000000000000000000000000DEAB8400FEFBF900FEFBF900FEF9 + F500FEF9F300FDF5ED00F9E9D900ECC5A200BD9184008C5D5C00000000000000 + 0000000000000000000000000000000000000000000000669A0088E5F90088E5 + F9007372720073727200737272007372720073727200737272007372720061D4 + F1005BD0EE0000669A000000000000000000E7C6B500FFFFFF00DEA57B00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DEA57B00FFFFFF00B58484000000000000000000000000000000 + 0000D6CEBD008C736B0000000000000000000000000000000000000000007B7B + 7300D6CEBD00000000000000000000000000E2B18A00FEFBF900FEFBF900FEFB + F900FEFBF800FEF9F300B2817600B2817600B2817600B07F7500000000000000 + 0000000000000000000000000000000000000000000000669A0088E5F90088E5 + F90073727200D1C5BA00D1C5BA00D1C5BA00D1C5BA00C9BFB6007372720069D9 + F40061D4F10000669A000000000000000000E7C6B500FFFFFF00FFFFFF00FFFF + FF00DEA57B00C6847300FFFFFF00DEA57B00C6847300FFFFFF00DEA57B00C684 + 7300FFFFFF00FFFFFF00FFFFFF00B58484000000000000000000000000000000 + 00008C736B000000000000000000000000000000000000000000000000000000 + 00007B7B7300000000000000000000000000E5B68E00FEFBF900FEFBF900FEFB + F900FEFBF900FEFBF800B2817600E5AE7000E4A3530000000000000000000000 + 000000000000000000000000000000000000000000000000000000669A000066 + 9A0073727200EBD8C600FAFAF900FCF9F700FCF9F700D1C5BA00737272000066 + 9A0000669A00000000000000000000000000E7C6B500FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00C68473000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000E5B68E00DEAB8400DEAB8400DEAB + 8400DEAB8400DEAB8400B2817600E8AB5E000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007372720073727200737272007372720073727200000000000000 + 00000000000000000000000000000000000000000000E7C6B500E7C6B500E7C6 + B500E7C6B500E7C6B500E7C6B500D6BDB500D6BDB500D6B5AD00D6B5AD00C6AD + A500C6ADA500C6A59C00C6A59C00000000000000000000000000000000000000 + 0000868483008684830000000000000000008684830086848300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000632DE000632DE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008684 + 8300C0BAB800B8B3B300868483008684830086848300EDEBE900868483008684 + 830086848300000000000000000000000000000000000632DE000632DE000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000632DE000632DE00000000000000000000000000854100008541 + 0000763A00006B350000673301006B3500006B3500006B3500006B3500006B35 + 00006B3500005B2E030000000000000000000000000000000000854302008340 + 0000733900006B35000068340000683400006834000068340000683400006834 + 0000683400005D2F03000000000000000000000000000000000086848300E3E2 + E100B8B3B300B8B3B300B8B3B300505050004F4F4F0086848300CECCCC00E9E7 + E600C8C7C700868483008684830086848300000000000632DE000632DE000632 + DE00000000000000000000000000000000000000000000000000000000000000 + 00000632DE000632DE00000000000000000000000000AA540000CF660000CF66 + 0000B6590000B5590000AF560000AD550000AF560000AF560000AF560000AF56 + 0000B4590000964A00005B2E03000000000000000000AB540000D0670000BC5D + 0000BC5D0000B5590000B0570000AE550000AE550000AE550000AE550000AE55 + 0000B5590000964A00005D2F0300000000000000000086848300E0DEDE00D8D5 + D500A9A4A300A9A4A300A9A4A300595858001616160012121200181818001212 + 120093888500CBCAC9008684830000000000000000000632DE000632DD000632 + DE000632DE000000000000000000000000000000000000000000000000000632 + DE000632DE0000000000000000000000000000000000CF660000E7740300DC6D + 0100D66A0000D0670000CF660000B6590000B6590000B6590000B6590000B659 + 0000CF660000B45900006B3500000000000000000000D0670000E7730100DA6E + 0300D46A0100D0670000D0670000BC5D0000BC5D0000BC5D0000BC5D0000BC5D + 0000BC5D0000B5590000683400000000000086848300D8D5D500D8D5D500A9A4 + A300E0DEDE00DAD8D800CDCBCB00C5BDB900B8B3B300A9A3A100777676001212 + 12001414140013131300868483009388850000000000000000000433ED000632 + DE000632DE000632DE00000000000000000000000000000000000632DE000632 + DE000000000000000000000000000000000000000000D1670100EA760500E271 + 0200DC6D0100D4690000E6934100E69A4F00E69A4F00E6974900D7611900B659 + 0000B6590000AF5600006B3500000000000000000000D1680100EB760400E372 + 0300DA6E0300EC862100E9974600F0A35800E9974600E8934000BA5C0000BA5C + 0000BC5D0000AE550000683400000000000086848300D8D5D500A9A4A300F4F1 + ED00F6F3EF00F6F3EF00E9E7E600E9E7E600E5E4E300DAD8D800CCCBCB00C0BA + B800A9A3A10072717100938885008E8683000000000000000000000000000000 + 00000632DE000632DE000632DD00000000000632DD000632DE000632DE000000 + 00000000000000000000000000000000000000000000D66A0000EA7E1400ED7A + 0800E7740300DF6F0100F8C99C00FCFAF800FCFAF800FCFAF800FCFAF800E69A + 4F00B6590000AF5600006B3500000000000000000000D46A0100EE7F1300ED7A + 0A00F0A35800FCF8F500FCF8F500FCF8F500FCF8F500F8CA9E00BC5D0000BA5C + 0000BC5D0000AE550000683400000000000086848300A9A4A300F6F3EF00F6F3 + EF00F6F3EF00E0DEDE00ADA9A900B1ACAC00C5BDB900D1CFCE00E0DEDE00E3E2 + E100D4D2D100C8C7C700AAA5A500858383000000000000000000000000000000 + 0000000000000632DD000533E7000533E7000533E9000632DD00000000000000 + 00000000000000000000000000000000000000000000D66A0000E98C3100EB81 + 1900ED7A0800E7740300E5730300EA7E1400D7611900D7611900F4BF8C00FCFA + F800B6590000AF5600006B3500000000000000000000D46A0100EC8D3100EE82 + 1800FCF8F500F7C08B00ED841D00EE821800DA641600D5690400BC5D0000BC5D + 0000BC5D0000AE5500006834000000000000000000008684830086848300F2EF + EC00C0BAB80093888500A9A3A100ADA9A900ACA7A700B1ACAC00ADA9A900B1AC + AC00CAC9C900DDDBDB00D1CFCE00868483000000000000000000000000000000 + 000000000000000000000632E4000632E4000433EF0000000000000000000000 + 00000000000000000000000000000000000000000000D66A0000EDA45C00EA8A + 2C00EA7E1400ED7A0800F8C99C00E2710200DF6F0100D66A0000D4670A00FCFA + F800CF660000B15700006B3500000000000000000000D46A0100F2A55B00ED8A + 2900FCF8F500ED841D00E9750300E3720300DF700300F8CA9E00D0670000D067 + 0000BC5D0000B057000068340000000000000000000000000000000000008684 + 8300C99B9700BF9B8B009F8D8500908684008280800093888500A9A4A300BBB6 + B500D8D5D500D1CFCE0086848300000000000000000000000000000000000000 + 0000000000000632DD000433ED000533E9000433EF000434F400000000000000 + 00000000000000000000000000000000000000000000D66A0000F4B27200E890 + 3900EB811900F8C89900FCFAF800EA760500E5730300DF6F0100E89E5500FCFA + F800CF660000B6590000723800000000000000000000D46A0100F6B37200EB90 + 3700FCF8F500F5AA6200EC780600EB760400E7730100FCF8F500F8C59400D168 + 0100D0670000B85B000073390000000000000000000000000000000000000000 + 0000C99B9800FBE4C900F9DAB700F0D4B600C69C9100C69C9100C99B98009A8B + 8500868483008684830000000000000000000000000000000000000000000000 + 00000434F4000433EF000533EB0000000000000000000434F4000335F8000000 + 00000000000000000000000000000000000000000000D66A0000F5B97D00E693 + 4100FADCBE00FCFAF800FCFAF800FBE8D500FAE1C700FAE1C700FCFAF800F4BF + 8C00D96C0000CF660000854100000000000000000000D46A0100F6B97E00E893 + 4000F8CA9E00FCF8F500FBE3CB00FBE3CB00FBEBDA00FCF8F500FCF8F500F9D5 + B100D66B0200BC5D000083400000000000000000000000000000000000000000 + 0000C99B9800FBE4C900F9DBB900F9DAB700F9DAB700F6D8B600C99B98000000 + 0000000000000000000000000000000000000000000000000000000000000335 + F8000433EF000334F800000000000000000000000000000000000335F8000335 + F8000000000000000000000000000000000000000000D66A0000F4BC8500E89E + 5500F9D8B700FCFAF800FCFAF800FAE1C700F8C99C00F8C99C00EDA45C00E271 + 0200E2710200CF660000904700000000000000000000D46A0100F7BE8700ED9C + 4C00EB903700F6B37200F8CA9E00F8CA9E00FADEC300FCF8F500FCF8F500F9D0 + A800E3720300D06700009148000000000000000000000000000000000000C99B + 9800FCECD900FCE7CF00F9E0C300F9DBB900F9DAB700C99B9800000000000000 + 00000000000000000000000000000000000000000000000000000335F8000335 + F8000335F8000000000000000000000000000000000000000000000000000335 + F8000335F80000000000000000000000000000000000D66A0000F8C79600EEA7 + 6100E8903900F8CCA100FCFAF800EA831D00EB811900ED7A0800EC780600EA76 + 0500EA760500D66A00009E4E00000000000000000000D46A0100F8C59400F5AA + 6200E9923C00EB903700ED882500ED841D00EE821800FCF8F500F7C08B00EB76 + 0400E9750300D46A01009D4D000000000000000000000000000000000000C99B + 9800FAEFE200FCECD900FBE5CC00F9E0C300F9DAB700C99B9800000000000000 + 000000000000000000000000000000000000000000000335F8000335F8000335 + F800000000000000000000000000000000000000000000000000000000000000 + 0000000000000335F800000000000000000000000000D66A0000F8C89900F5C2 + 9000F5B97D00F1AC6800F9D3AE00E6974900E98C3100EB811900ED7A0800EC78 + 0600EC780600E2710200AA5400000000000000000000D46A0100F8C79800F8C3 + 8E00F7B67800F6B06C00F2A55B00ED9C4C00EB903700F7C08B00ED7A0A00EC78 + 0600EC780600DF700300AB540000000000000000000000000000C99B9800F6F3 + EF00F6F3EF00FAEFE200FCEAD600FCE7CF00F3D6B700C99B9800000000000000 + 0000000000000000000000000000000000000335F8000335F8000335F8000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D66A0000F5B97D00F8C9 + 9C00F8CCA100F8C79600F4BC8500F4B27200E6974900EA882800ED7A0800ED7A + 0800ED7A0800E7740300B55900000000000000000000D46A0100F7B67800F8CA + 9E00F8CA9E00F8C59400F7BC8300F6B06C00ED9C4C00ED882500EE7D0E00EC78 + 0600EC780600E9750300B5590000000000000000000000000000C99B9800C99B + 9800C99B9800F8F2EA00FCECD900FCE7CF00C99B980000000000000000000000 + 0000000000000000000000000000000000000335F8000335F800000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EA7E1400E98C + 3100E98C3100E98C3100EA8A2C00EA852200EA7E1400D4670A00D96C0000D66A + 0000D66A0000CF66000000000000000000000000000000000000DA641600EC8D + 3100EC8D3100EC8D3100ED8A2900EC862100DA641600D8670C00D66B0200D66B + 0200D66B0200D067000000000000000000000000000000000000000000000000 + 000000000000C99B9800C99B9800C99B98000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7818200B781 + 8200B7818200B7818200B7818200B7818200B7818200B7818200B7818200B781 + 8200B7818200B7818200B7818200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE0000000000000000000000000000000000C8A79D00F8EA + D900F4E0C800F2DABD00F2D8B300F2D4AA00F1D3A600EFCFA200EFCFA200EFCF + A200EFCFA200F0D1A100B781820000000000000000000000000097433F009743 + 3F00C2999900C2999900C2999900C2999900C2999900C2999900C29999009230 + 2F0097433F0000000000000000000000000000000000AD5A5A00AD5A5A00E7C6 + C600E7C6C600C6CEC600C6CEC600C6CEC600C6CEC600AD5A5A00943131000000 + 000000000000000000000000000000000000078DBE001A9DAA005EC7EB0084E1 + FA0066CDF20066CDF20066CDF20066CDF20066CDF20066CDF20066CDF20066CD + F20046B8D400078DBE0000000000000000000000000000000000C8A79D00F8EA + D900F5E4CF00F3DEC500F2D9B900F2D8B300F2D4AA00F0D1A100EECEA200EECE + A200EECEA200F0D1A100B7818200000000000000000097433F00CD666600C663 + 6300E4E0E400922B2B00922B2B00E6E5E700E5E3E500E4E0E400CECACC00922B + 2B009E43410097433F000000000000000000BD7B7300C65A5A00C65A5A00E7C6 + C6009C393900B5737300C6CEC600F7F7F700F7F7F700C65A5A00943131000000 + 000000000000000000000000000000000000078DBE004BBBDD0046B8D4009BF1 + FC0072D6F80072D6F8006DD2F60072D6F80072D6F80072D6F80072D6F8006DD2 + F60048B9D90080DEF900078DBE00000000000000000000000000C9A99E00FAF1 + E800F7E7D500F5E4CF00F3DEC500F2DABD00F2D8B300F2D4AA00F0D1A100EECE + A200EECEA200F0D1A100B7818200000000000000000097433F00CD656600C162 + 6200E5E3E500922B2B00922B2B00E4E0E400E6E5E700E4E0E400CECBCC00922B + 2B009E43410097433F000000000000000000BD7B7300C65A5A00C65A5A00C694 + 8C009C3939009C4A4A00E7C6C600C6CEC600F7F7F700C65A5A00943131000000 + 000094313100000000000000000000000000078DBE0072D6F800078DBE00ACF7 + FC007BDCFA007BDCFA007BDCFA007BDCFA007BDCFA007BDCFA007BDCFA007BDC + FA0048B9D900ACF7FC00078DBE00000000000000000000000000CAAEA300FBF5 + EF00F8EAD900F7E7D500F5E4CF00F3DEC500F2D9B900F2D8B300F2D4AA00F0D1 + A100EECEA200F0D1A100B7818200000000000000000097433F00CD656600C162 + 6200E5E3E500922B2B00922B2B00E4E0E400E6E5E700E6E5E700CECBCC00922B + 2B009E43410097433F000000000000000000BD7B7300C65A5A00C65A5A00C694 + 8C00C6948C00BDA5A500BDA5A500E7C6C600C6CEC600C65A5A0094313100C65A + 5A0094313100000000000000000000000000078DBE007BDCFA001396B60099F0 + FC0092EBFB0086E3FB0086E3FB0086E3FB0086E3FB0086E3FB0086E3FB0086E3 + FB0048B9D900B1F7FC00078DBE00000000000000000000000000CEACA800FDFA + F600FAF1E800F8EAD900F7E7D500F3E1CC00F3DEC500F2DABD00F2D8B300F2D4 + AA00F0D1A100F0D1A100B7818200000000000000000097433F00CD656600C162 + 6200E6E5E700E6E5E700E4E0E400E4E0E400E4E0E400E4E0E400CECBCC00922B + 2B009E43410097433F000000000000000000BD7B7300AD524A00B55A5A00C65A + 5A00C65A5A00C65A5A00C65A5A00C65A5A00C65A5A00C65A5A0094313100C65A + 5A0094313100000000009431310000000000078DBE0086E3FB0048B9D90058C3 + E700ACF7FC008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB000C84 + 18004BBBDD00B6F7FD0066CDF200078DBE000000000000000000D0A9AB00FEFC + FB00FBF5EF00FAF1E800F8EAD900F7E7D500F4E0C800F3DEC500F2D9B900F2D8 + B300F2D4AA00F1D3A600B7818200000000000000000097433F00CD656600C663 + 6300C8676700C6717000C6717000C86A6A00C4636300C86C6C00CA666600C463 + 6300CD65660097433F000000000000000000BD7B7300AD524A00FFF7F700FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A5A0094313100C65A + 5A0094313100C65A5A009431310000000000078DBE008CE7FB0077DAF9001A9D + AA00D8F7FB00CAF6FD00CAF6FD00CAF6FD00CAF6FD00CAF6FD000C84180035BC + 73000C841800D8F7FB00D6F6FB00078DBE000000000000000000E6BDAF00FEFC + FB00FDFAF600FBF5EF00F9EDDE00F8EAD900F7E7D500F5E4CF00F3DEC500F2D9 + B900F2D8B300F2D6AF00B7818200000000000000000097433F00B8646400C47C + 7B00C89E9E00CAA8A800CAA8A800CAA8A800C9A0A000C9A0A000CAA8A800CAA8 + A800CC66660097433F000000000000000000BD7B7300AD524A00FFF7F700FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A5A0094313100C65A + 5A0094313100C65A5A009431310000000000078DBE0095EEFC0095EEFC001396 + B600078DBE00078DBE00078DBE00078DBE00078DBE000C84180046CC80004BCC + 98003DC374000C841800078DBE00078DBE000000000000000000E6BDAF00FEFC + FB00FEFCFB00FCF8F400FBF5EF00F9EDDE00F8EAD900F7E7D500F3E1CC00F2DC + C100F2D9B900F2D8B300B7818200000000000000000097433F00CC666600F8F8 + F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8 + F800CC66660097433F000000000000000000BD7B7300AD524A00FFF7F700FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A5A0094313100C65A + 5A0094313100C65A5A009431310000000000078DBE009EF4FD009FF6FD009FF6 + FD009EF4FD009FF6FD009FF6FD009EF4FD000C84180046CC800049CD890049CD + 89004BCC98003DC374000C841800000000000000000000000000E6BDAF00FEFC + FB00FEFCFB00FEFCFB00FCF8F400FBF5EF00F9EDDE00F8EAD900F7E7D500F4E0 + C800F4E0C800F2D9B900B7818200000000000000000097433F00CC666600F8F8 + F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8 + F800CC66660097433F000000000000000000BD7B7300AD524A00FFF7F700FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A5A0094313100C65A + 5A0094313100C65A5A009431310000000000078DBE00D8F7FB00A2F7FD00A2F7 + FD00A2F7FD00A2F7FD00A2F7FD000C8418000C8418000C8418000C84180049CD + 890046CC80000C8418000C8418000C8418000000000000000000E7C4AD00FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FCF8F400FBF5EF00F9EDDE00F9EDDE00F8EA + D900F2DCC100CCAFA600B7818200000000000000000097433F00CC666600F8F8 + F800CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00F8F8 + F800CC66660097433F000000000000000000BD7B7300AD524A00FFF7F700FFF7 + F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A5A0094313100C65A + 5A0094313100C65A5A00943131000000000000000000078DBE00D8F7FB00A5F7 + FC00A5F7FC00A5F7FC00078DBB0048B9D90048B9D90048B9D9000C84180046CC + 800035BC73000C84180000000000000000000000000000000000E7C4AD00FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FCF8F400FBF5EF00F3E1CC00C6A1 + 9600C0958800BA8F8600B7818200000000000000000097433F00CC666600F8F8 + F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8 + F800CC66660097433F000000000000000000BD7B7300AD524A00D6D6D600CEB5 + B500CEB5B500CEB5B500CEB5B500CEB5B500D6D6D600AD524A0094313100C65A + 5A0094313100C65A5A0094313100000000000000000000000000078DBE00078D + BE00078DBE00078DBE00000000000000000000000000000000000C8418003FC6 + 79000C8418000000000000000000000000000000000000000000EACAAC00FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFBF900F3DEC500C188 + 7500DF9D5600DF9D5600C58B7200000000000000000097433F00CC666600F8F8 + F800CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00CDCBCC00F8F8 + F800CC66660097433F0000000000000000000000000000000000BD7B7300AD52 + 4A00FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700C65A + 5A0094313100C65A5A0094313100000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000C84180030B8720030B8 + 72000C8418000000000000000000000000000000000000000000EACAAC00FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00F3E1CC00C39A + 8D00EECEA200CD906A0000000000000000000000000097433F00CC666600F8F8 + F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8 + F800CC66660097433F0000000000000000000000000000000000BD7B7300AD52 + 4A00D6D6D600CEB5B500CEB5B500CEB5B500CEB5B500CEB5B500D6D6D600AD52 + 4A0094313100C65A5A0094313100000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000C84180030B872000C84 + 1800000000000000000000000000000000000000000000000000EACAAC00FCF8 + F400FCF8F400FCF8F400FCF8F400FBF5EF00FBF5EF00FBF5EF00F3E1CC00C197 + 8900C39A8D00000000000000000000000000000000000000000097433F00F8F8 + F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8F800F8F8 + F80097433F000000000000000000000000000000000000000000000000000000 + 0000BD7B7300AD524A00FFF7F700FFF7F700FFF7F700FFF7F700FFF7F700FFF7 + F700FFF7F700C65A5A0094313100000000000000000000000000000000000000 + 00000000000000000000000000000C8418000C8418000C8418000C8418000000 + 0000000000000000000000000000000000000000000000000000E9C8AB00EACA + AC00EACAAC00EACAAC00EACAAC00EACAAC00EACAAC00EACAAC00E6BDAF00BD85 + 7900000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BD7B7300AD524A00D6D6D600CEB5B500CEB5B500CEB5B500CEB5B500CEB5 + B500D6D6D600AD524A0094313100000000000000000000000000000000000000 + 0000000000000C8418000C8418000C8418000C84180000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000E00000000100010000000000000700000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000C001000000000000C001000000000000 + C001000000000000C001000000000000C001000000000000C001000000000000 + C001000000000000C001000000000000C001000000000000C001000000000000 + C001000000000000C001000000000000C001000000000000C003000000000000 + C007000000000000C00F000000000000FF870000FFFFC001C08700008007C001 + 800700000003C0010000E0070003C0010000E0070003C0010000E0070003C001 + 0000E0070003C0010007E007000380010007E007000380010007E00700038001 + 003FE00700068001003FFFFF83FE8001003FF81F83E48001003FF81FFFF1C003 + 807FF81FFFF1C007C0FFFFFFFFF0C00FFFFFFE3F800380070000E00700010003 + 0000E00700010001000080030001000100008001000100010000800100010000 + 0000800100010000000080010001000000008001000700070000C00300070007 + 0000E007800F800F0000F81FC3FFC3FF0000F81FFFFFFFFF0000F81FFFFFFFFF + 8001F81FFFFFFFFFFFFFFC3FFFFFFFFFFFFFB6DBFFFF9FFF8000AAAB8FFF0FFF + 8000AAAB87FF07FF8000B6DB83FF83FF80000FF7C1FF81FF80000023E1FFE107 + 80000001F187E00380000003FE01F80180000003FE01F80180000007FC00F800 + 80000007FC00F80080000003FC00F00080000003FC00F801C0010003FE01FC01 + FFFF00FFFE01FE03FFFF83FFFF87FF8FFFFFC001C001FFFFE001C001C001FE1F + E001C001C001FC0FE001C001C001F807E001C001C001F807E001C001C0010007 + E001C001C0010000E001C001C0018000E001C001C001C000C001C001C001E200 + C001C001C001F6000001C001C001FE000001C001C001FE000003C003C003FE00 + C007C007C007FE00C00FC00FC00FFFFFFFFFFFFFFFFFDDBBC003C003FFFFAD5B + 80018001FFFFAD5B80018001FFFFA953800180018001DDBB800180018001801F + 800180018001801B800180018001801180018001800180008001800180018011 + 80018001800180018001800180018001800180018001801F800180018000803F + C003C003FFE1807FFFFFFFFFFFF3FFFFF81FFFFFFFFFFFFFE007FFFF8000C003 + C003FC3F800080018001F81F800080018001F00F800080010000E00780008001 + 0000C003800080010000C003800080010000C003800080010000C00380008001 + 0000C003800080018001E007800080018001F00F80008001C003F81FFFFF8001 + E007FFFFFFFFC003F81FFFFFFFFFFFFFFFFFFFFFFFFFF81FF707FC3FFFFFE007 + F007F81FF8FFC003F707F00FF87F8001F7FFE007F83F8001F707C003F81F0000 + F0078001F80F0000F7078001F8070000F7FF8001F8070000F7078001F80F0000 + F007C003F81F0000F707E007F83F8001C1FFF00FF87F8001C1FFF81FF8FFC003 + C1FFFC3FFFFFE007FFFFFFFFFFFFF81FFFFFFFFFFFFDFFFF000F000FFFF08000 + 000F000FCFE18000FFFFFFFFE6038000DE07EE07FC078000CE07CE07F8078000 + 06078207F007800003FF03FFE007800006008200E0078000CE00CE00E00F8000 + DE00EE00E01F8000FFFFFFFFE0278000000F000FC0738000000F000F87FFC000 + FFFFFFFF0FFFFFE1FFFFFFFF3FFFFFF3FFFFFFFFC001C001FFFF8FFFC001C001 + BFFF87FFC001C001CFFF83FFC001C001EE4FC1FF4001C001E717E1FF0001C001 + E68FF1870001C001E327FE010001C001F3FFFE010001C001F3FFFC004001C001 + E0FFFC00C001C001F9FFFC00C001C001F93FFC00C001C001FC7FFE01C003C003 + FFFFFE01C007C007FFFFFF87C00FC00FFFFFF801C0018001F9CFF80180010000 + F087F80180010000F6B7F80180010000F2A7000180010000F007000180010000 + F80F000180010000FE3F000180010000FC1F000180010000FC1F000180030000 + F88F000380030000F9CF000780030000F1C7003F80030000F3E7003F80030000 + F7F7007FC0070000FFFF00FFF83F8001F33FFFFCFFFFFFFFE0079FF9C003C003 + C0008FF380018001800187E7800180010000C3CF800180010000F11F80018001 + 0000F83F800180018000FC7F80018001E001F83F80018001F003F19F80018001 + F01FE3CF80018001E03FC7E780018001E03F8FFB80018001C03F1FFF80018001 + C07F3FFFC003C003F8FFFFFFFFFFFFFFC001FFFFFFFF8003C001C007801F0003 + C0018003001F0001C001800300070001C001800300070001C001800300010000 + C001800300010000C001800300010000C001800300010001C001800300010000 + C001800300018003C00180030001C3C7C0018003C001FF87C0038003C001FF8F + C007C007F001FE1FC00FFFFFF001F87F00000000000000000000000000000000 + 000000000000} + end + object ppmOutput: TSpTBXPopupMenu + OnInitPopup = ppmOutputInitPopup + Left = 783 + Top = 7 + object mnuCopyMessage: TSpTBXItem + OnClick = mnuCopyMessageClick + CaptionW = 'Copy message' + end + object mnuCopyAll: TSpTBXItem + OnClick = mnuCopyAllClick + CaptionW = 'Copy all' + end + object sepOutput: TSpTBXSeparatorItem + end + object mnuSaveToFile: TSpTBXItem + OnClick = mnuSaveToFileClick + CaptionW = 'Save to file...' + end + end + object sciCallTips: TSciCallTips + EndDefinition = ')' + Editor = sciEditor + ParametersEnd = ')' + ParametersSeparators = ',' + ParametersStart = '(' + WordCharacters = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + OnBeforeShow = sciCallTipsBeforeShow + Left = 842 + Top = 36 + end + object sciPropertyLoader: TSciPropertyLoader + Editor = sciEditor + Left = 812 + Top = 36 + end + object odOpen: TOpenDialog + Filter = + 'All supported files|*.sma;*.inc;*.cpp;*.h;*.htm;*.html;*.sql;*.x' + + 'ml;*.txt|SMALL scripts (*.sma;*.inc)|*.sma;*.inc|C++ files (*.cp' + + 'p;*.h)|*.cpp;*.h|HTML files (*.htm;*.html)|*.htm;*.html|SQL data' + + 'bases (*.sql)|*.sql|XML files (*.xml)|*.xml|Textfiles (*.txt)|*.' + + 'txt|All Files (*.*)|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Title = 'Open...' + Left = 752 + Top = 6 + end + object sdSave: TSaveDialog + Filter = + 'All supported files|*.sma;*.inc;*.cpp;*.h;*.htm;*.html;*.sql;*.x' + + 'ml;*.txt|SMALL scripts (*.sma;*.inc)|*.sma;*.inc|C++ files (*.cp' + + 'p;*.h)|*.cpp;*.h|HTML files (*.htm;*.html)|*.htm;*.html|SQL data' + + 'bases (*.sql)|*.sql|XML files (*.xml)|*.xml|Textfiles (*.txt)|*.' + + 'txt|All Files (*.*)|*.*' + Title = 'Save...' + Left = 752 + Top = 36 + end + object sciPrinter: TSciPrinter + Editor = sciEditor + Title = 'DelphiSci' + HeaderFont.Charset = DEFAULT_CHARSET + HeaderFont.Color = clBlack + HeaderFont.Height = -11 + HeaderFont.Name = 'Courier New' + HeaderFont.Style = [] + FooterFont.Charset = DEFAULT_CHARSET + FooterFont.Color = clBlack + FooterFont.Height = -11 + FooterFont.Name = 'Courier New' + FooterFont.Style = [] + ColorMode = sccmNormal + WordWrap = sciNoWrap + Magnification = 0 + Left = 692 + Top = 6 + end + object alControlChars: TActionList + Left = 662 + Top = 36 + object acControlChar1: TAction + ShortCut = 24641 + OnExecute = acControlCharHandler + end + object acControlChar2: TAction + ShortCut = 24641 + OnExecute = acControlCharHandler + end + object acControlChar3: TAction + ShortCut = 16453 + OnExecute = acControlCharHandler + end + object acControlChar4: TAction + ShortCut = 16454 + OnExecute = acControlCharHandler + end + object acControlChar5: TAction + ShortCut = 16455 + OnExecute = acControlCharHandler + end + object acControlChar6: TAction + ShortCut = 16456 + OnExecute = acControlCharHandler + end + object acControlChar7: TAction + ShortCut = 16459 + OnExecute = acControlCharHandler + end + object acControlChar8: TAction + ShortCut = 16462 + OnExecute = acControlCharHandler + end + object acControlChar9: TAction + ShortCut = 16463 + OnExecute = acControlCharHandler + end + object acControlChar10: TAction + ShortCut = 16465 + OnExecute = acControlCharHandler + end + object acControlChar11: TAction + ShortCut = 16466 + OnExecute = acControlCharHandler + end + object acControlChar12: TAction + ShortCut = 16467 + OnExecute = acControlCharHandler + end + object acControlChar13: TAction + ShortCut = 16468 + OnExecute = acControlCharHandler + end + object acControlChar14: TAction + ShortCut = 16473 + OnExecute = acControlCharHandler + end + object acControlChar15: TAction + ShortCut = 24642 + OnExecute = acControlCharHandler + end + object acControlChar16: TAction + ShortCut = 24643 + OnExecute = acControlCharHandler + end + object acControlChar17: TAction + ShortCut = 24644 + OnExecute = acControlCharHandler + end + object acControlChar18: TAction + ShortCut = 24645 + OnExecute = acControlCharHandler + end + object acControlChar19: TAction + ShortCut = 24646 + OnExecute = acControlCharHandler + end + object acControlChar20: TAction + ShortCut = 24647 + OnExecute = acControlCharHandler + end + object acControlChar21: TAction + ShortCut = 24648 + OnExecute = acControlCharHandler + end + object acControlChar22: TAction + ShortCut = 24651 + OnExecute = acControlCharHandler + end + object acControlChar23: TAction + ShortCut = 24654 + OnExecute = acControlCharHandler + end + object acControlChar24: TAction + ShortCut = 24655 + OnExecute = acControlCharHandler + end + object acControlChar25: TAction + ShortCut = 24656 + OnExecute = acControlCharHandler + end + object acControlChar26: TAction + ShortCut = 24657 + OnExecute = acControlCharHandler + end + object acControlChar27: TAction + ShortCut = 24658 + OnExecute = acControlCharHandler + end + object acControlChar28: TAction + ShortCut = 24659 + OnExecute = acControlCharHandler + end + object acControlChar29: TAction + ShortCut = 24662 + OnExecute = acControlCharHandler + end + object acControlChar30: TAction + ShortCut = 24663 + OnExecute = acControlCharHandler + end + object acControlChar31: TAction + ShortCut = 24664 + OnExecute = acControlCharHandler + end + object acControlChar32: TAction + ShortCut = 24665 + OnExecute = acControlCharHandler + end + object acControlChar33: TAction + ShortCut = 24666 + OnExecute = acControlCharHandler + end + object acControlChar34: TAction + Caption = 'acControlChar34' + ShortCut = 114 + OnExecute = acControlCharHandler + end + object acControlChar35: TAction + ShortCut = 16463 + OnExecute = acControlCharHandler + end + object acControlChar36: TAction + ShortCut = 16467 + OnExecute = acControlCharHandler + end + object acControlChar37: TAction + ShortCut = 24659 + OnExecute = acControlCharHandler + end + object acControlChar38: TAction + ShortCut = 27 + OnExecute = acControlCharHandler + end + object acControlChar39: TAction + ShortCut = 16457 + OnExecute = acControlCharHandler + end + object acControlChar40: TAction + ShortCut = 24649 + OnExecute = acControlCharHandler + end + object acControlChar41: TAction + ShortCut = 112 + OnExecute = acControlCharHandler + end + end + object ppmEditor: TSpTBXPopupMenu + Images = ilImages + Left = 782 + Top = 36 + object mnuEditorCopy: TSpTBXItem + ImageIndex = 9 + Images = ilImages + OnClick = mnuEditorCopyClick + CaptionW = 'Copy' + end + object mnuEditorCut: TSpTBXItem + ImageIndex = 8 + Images = ilImages + OnClick = mnuEditorCutClick + CaptionW = 'Cut' + end + object mnuEditorPaste: TSpTBXItem + ImageIndex = 10 + Images = ilImages + OnClick = mnuEditorPasteClick + CaptionW = 'Paste' + end + object mnuEditorDelete: TSpTBXItem + ImageIndex = 5 + Images = ilImages + OnClick = mnuEditorDeleteClick + CaptionW = 'Delete' + end + object sepEditorMenu1: TSpTBXSeparatorItem + end + object mnuEditorSelectAll: TSpTBXItem + ImageIndex = 11 + Images = ilImages + OnClick = mnuEditorSelectAllClick + CaptionW = 'Select all' + end + object sepEditorMenu2: TSpTBXSeparatorItem + end + object mnuEditorUndo: TSpTBXItem + ImageIndex = 6 + Images = ilImages + OnClick = mnuEditorUndoClick + CaptionW = 'Undo' + end + object mnuEditorRedo: TSpTBXItem + ImageIndex = 7 + Images = ilImages + OnClick = mnuEditorRedoClick + CaptionW = 'Redo' + end + object sepEditorMenu3: TSpTBXSeparatorItem + end + object mnuToogleBookmark: TSpTBXItem + ShortCut = 49218 + OnClick = mnuToogleBookmarkClick + CaptionW = 'Toogle Bookmark' + end + object mnuGoToBookmark: TSpTBXItem + ShortCut = 16450 + OnClick = mnuGoToBookmarkClick + CaptionW = 'Go to next Bookmark' + end + end + object sciSearchReplace: TSciSearchReplace + SearchForSelWord = False + Editor = sciEditor + Left = 692 + Top = 36 + end + object IdFTP: TIdFTP + MaxLineAction = maSplit + ProxySettings.ProxyType = fpcmNone + ProxySettings.Port = 0 + Left = 722 + Top = 6 + end + object sciAutoComplete: TSciAutoComplete + NumStartChars = 1 + AStrings.Strings = ( + '' + 'access' + 'add' + 'ADMIN_ADMIN' + 'ADMIN_ALL' + 'ADMIN_BAN' + 'ADMIN_CFG' + 'ADMIN_CHAT' + 'ADMIN_CVAR' + 'ADMIN_IMMUNITY' + 'ADMIN_KICK' + 'ADMIN_LEVEL_A' + 'ADMIN_LEVEL_B' + 'ADMIN_LEVEL_C' + 'ADMIN_LEVEL_D' + 'ADMIN_LEVEL_E' + 'ADMIN_LEVEL_F' + 'ADMIN_LEVEL_G' + 'ADMIN_LEVEL_H' + 'ADMIN_MAP' + 'ADMIN_MENU' + 'ADMIN_PASSWORD' + 'ADMIN_RCON' + 'ADMIN_RESERVATION' + 'ADMIN_SLAY' + 'ADMIN_USER' + 'ADMIN_VOTE' + 'ALLIES' + 'AMX_FLAG_BIGENDIAN' + 'AMX_FLAG_BROWSE' + 'AMX_FLAG_COMPACT' + 'AMX_FLAG_DEBUG' + 'AMX_FLAG_LINEOPS' + 'AMX_FLAG_NOCHECKS' + 'AMX_FLAG_RELOC' + 'AMXX_VERSION' + 'AMXX_VERSION_STR[]="1' + 'anglevector' + 'assert' + 'attach_view' + 'ATTN_IDLE' + 'ATTN_NONE' + 'ATTN_STATIC' + 'AXIS' + 'BLOCK_NOT' + 'BLOCK_ONCE' + 'BLOCK_SET' + 'bomb_defused' + 'bomb_defusing' + 'bomb_explode' + 'bomb_planted' + 'bomb_planting' + 'break' + 'build_path' + 'call_think' + 'callfunc_begin' + 'callfunc_end' + 'callfunc_push_float' + 'callfunc_push_floatrf' + 'callfunc_push_int' + 'callfunc_push_intrf' + 'callfunc_push_str' + 'CAMERA_3RDPERSON' + 'CAMERA_NONE' + 'CAMERA_TOPDOWN' + 'CAMERA_UPLEFT' + 'case' + 'CHAN_AUTO' + 'CHAN_ITEM' + 'CHAN_NETWORKVOICE_BASE' + 'CHAN_NETWORKVOICE_END' + 'CHAN_STATIC' + 'CHAN_STREAM' + 'CHAN_WEAPON' + 'change_task' + 'char' + 'clamp' + 'client_authorized' + 'client_built' + 'client_changeclass' + 'client_changeteam' + 'client_cmd' + 'client_command' + 'client_connect' + 'client_damage' + 'client_death' + 'client_disconnect' + 'client_impulse' + 'client_infochanged' + 'client_kill' + 'client_PostThink' + 'client_PreThink' + 'client_print' + 'client_putinserver' + 'client_score' + 'client_spawn' + 'cmd_access' + 'cmd_target' + 'colored_menus' + 'console_cmd' + 'console_print' + 'const' + 'contain' + 'containi' + 'CONTENTS_TRANSLUCENT' + 'continue' + 'copy' + 'copy_keyvalue' + 'copyc' + 'create_entity' + 'CreateEntity' + 'cs_get_hostage_foll' + 'cs_get_hostage_id' + 'cs_get_no_knives' + 'cs_get_user_bpammo' + 'cs_get_user_buyzone' + 'cs_get_user_deaths' + 'cs_get_user_defuse' + 'cs_get_user_driving' + 'cs_get_user_hasprim' + 'cs_get_user_model' + 'cs_get_user_money' + 'cs_get_user_nvg' + 'cs_get_user_plant' + 'cs_get_user_stationary' + 'cs_get_user_team' + 'cs_get_user_tked' + 'cs_get_user_vip' + 'cs_get_weapon_ammo' + 'cs_get_weapon_burst' + 'cs_get_weapon_id' + 'cs_get_weapon_silen' + 'cs_reset_user_model' + 'cs_set_hostage_foll' + 'cs_set_no_knives' + 'cs_set_user_bpammo' + 'cs_set_user_deaths' + 'cs_set_user_defuse' + 'cs_set_user_model' + 'cs_set_user_money' + 'cs_set_user_nvg' + 'cs_set_user_plant' + 'cs_set_user_team' + 'cs_set_user_tked' + 'cs_set_user_vip' + 'cs_set_weapon_ammo' + 'cs_set_weapon_burst' + 'cs_set_weapon_silen' + 'cstrike_running' + 'CSW_AK47' + 'CSW_AUG' + 'CSW_AWP' + 'CSW_C4' + 'CSW_DEAGLE' + 'CSW_ELITE' + 'CSW_FAMAS' + 'CSW_FIVESEVEN' + 'CSW_FLASHBANG' + 'CSW_G3SG1' + 'CSW_GALI' + 'CSW_GALIL' + 'CSW_GLOCK18' + 'CSW_HEGRENADE' + 'CSW_KNIFE' + 'CSW_M249' + 'CSW_M3' + 'CSW_M4A1' + 'CSW_MAC10' + 'CSW_MP5NAVY' + 'CSW_P228' + 'CSW_P90' + 'CSW_SCOUT' + 'CSW_SG550' + 'CSW_SG552' + 'CSW_SMOKEGRENADE' + 'CSW_TMP' + 'CSW_UMP45' + 'CSW_USP' + 'CSW_XM1014' + 'current_num_ents' + 'custom_weapon_add' + 'custom_weapon_dmg' + 'custom_weapon_shot' + 'cvar_exists' + 'date' + 'dbi_close' + 'dbi_connect' + 'dbi_error' + 'dbi_field' + 'dbi_free_result' + 'dbi_nextrow' + 'dbi_num_rows' + 'dbi_query' + 'dbi_result' + 'dbi_type' + 'default' + 'define' + 'defined' + 'delete_file' + 'DF_Blocked' + 'DF_ClientCommand' + 'DF_ClientConnect' + 'DF_ClientDisconnect' + 'DF_ClientKill' + 'DF_ClientPutInServer' + 'DF_ClientUserInfoChanged' + 'DF_CreateInstancedBaseline' + 'DF_GameInit' + 'DF_GetGameDescription' + 'DF_GetHullBounds' + 'DF_MetaFunc_CallGameEntity' + 'DF_ParmsChangeLevel' + 'DF_ParmsNewLevel' + 'DF_pfnAllowLagCompensation' + 'DF_PlayerPostThink' + 'DF_PlayerPreThink' + 'DF_PM_FindTextureType' + 'DF_RegisterEncoders' + 'DF_ServerDeactivate' + 'DF_SetAbsBox' + 'DF_Spawn' + 'DF_SpectatorConnect' + 'DF_SpectatorDisconnect' + 'DF_SpectatorThink' + 'DF_StartFrame' + 'DF_Sys_Error' + 'DF_Think' + 'DF_Touch' + 'DF_Use' + 'DispatchKeyValue' + 'DispatchSpawn' + 'dllfunc' + 'DMG_ACID' + 'DMG_ALWAYSGIB' + 'DMG_BLAST' + 'DMG_BULLET' + 'DMG_BURN' + 'DMG_CLUB' + 'DMG_CRUSH' + 'DMG_DROWN' + 'DMG_DROWNRECOVER' + 'DMG_ENERGYBEAM' + 'DMG_FALL' + 'DMG_FREEZE' + 'DMG_GENERIC' + 'DMG_MORTAR' + 'DMG_NERVEGAS' + 'DMG_NEVERGIB' + 'DMG_PARALYZE' + 'DMG_POISON' + 'DMG_RADIATION' + 'DMG_SHOCK' + 'DMG_SLASH' + 'DMG_SLOWBURN' + 'DMG_SLOWFREEZE' + 'DMG_SONIC' + 'DMG_TIMEBASED' + 'do' + 'dod_get_map_info' + 'dod_get_next_class' + 'dod_get_pl_deaths' + 'dod_get_pl_teamname' + 'dod_get_pronestate' + 'dod_get_team_score' + 'dod_get_user_ammo' + 'dod_get_user_class' + 'dod_get_user_kills' + 'dod_get_user_score' + 'dod_get_user_weapon' + 'dod_is_deployed' + 'dod_is_randomclass' + 'dod_make_deathmsg' + 'dod_set_fuse' + 'dod_set_pl_deaths' + 'dod_set_pl_teamname' + 'dod_set_stamina' + 'dod_set_user_ammo' + 'dod_set_user_class' + 'dod_set_user_kills' + 'dod_set_user_score' + 'dod_set_user_team' + 'dod_user_kill' + 'dod_wpnlog_to_id' + 'dod_wpnlog_to_name' + 'DODMAX_WEAPONS' + 'drop_to_floor' + 'EF_AllocString' + 'EF_AngleVectors' + 'EF_AnimationAutomove' + 'EF_BuildSoundMSG' + 'EF_CanSkipPlayer' + 'EF_ChangeLevel' + 'EF_ChangePitch' + 'EF_ChangeYaw' + 'EF_CheckVisibility' + 'EF_CreateEntity' + 'EF_CreateFakeClient' + 'EF_CreateNamedEntity' + 'EF_CrosshairAngle' + 'EF_DecalIndex' + 'EF_DropToFloor' + 'EF_EmitAmbientSound' + 'EF_EmitSound' + 'EF_EntIsOnFloor' + 'EF_EntitiesInPVS' + 'EF_FadeClientVolume' + 'EF_FindClientInPVS' + 'EF_FindEntityByString' + 'EF_FindEntityInSphere' + 'EF_FreeEntPrivateData' + 'EF_GetAimVector' + 'EF_GetAttachment' + 'EF_GetBonePosition' + 'EF_GetClientListening' + 'EF_GetCurrentPlayer' + 'EF_GetEntityIllum' + 'EF_GetPhysicsInfoString' + 'EF_GetPhysicsKeyValue' + 'EF_InfoKeyValue' + 'EF_INVLIGHT' + 'EF_LIGHT' + 'EF_LightStyle' + 'EF_MakeStatic' + 'EF_MakeVectors' + 'EF_MessageBegin' + 'EF_ModelFrames' + 'EF_ModelIndex' + 'EF_MoveToOrigin' + 'EF_NODRAW' + 'EF_NOINTERP' + 'EF_NumberOfEntities' + 'EF_ParticleEffect' + 'EF_PlaybackEvent' + 'EF_PointContents' + 'EF_PrecacheEvent' + 'EF_PrecacheGeneric' + 'EF_PrecacheModel' + 'EF_PrecacheSound' + 'EF_RegUserMsg' + 'EF_RemoveEntity' + 'EF_RunPlayerMove' + 'EF_SetClientKeyValue' + 'EF_SetClientListening' + 'EF_SetClientMaxspeed' + 'EF_SetGroupMask' + 'EF_SetKeyValue' + 'EF_SetModel' + 'EF_SetOrigin' + 'EF_SetPhysicsKeyValue' + 'EF_SetSize' + 'EF_SetView' + 'EF_StaticDecal' + 'EF_SzFromIndex' + 'EF_Time' + 'EF_TraceHull' + 'EF_TraceLine' + 'EF_TraceModel' + 'EF_TraceMonsterHull' + 'EF_TraceSphere' + 'EF_TraceTexture' + 'EF_TraceToss' + 'EF_VecToAngles' + 'EF_VecToYaw' + 'EF_WalkMove' + 'EF_WriteAngle' + 'EF_WriteCoord' + 'else' + 'emit_sound' + 'endif' + 'engclient_cmd' + 'engclient_print' + 'engfunc' + 'ENT_SetModel' + 'ENT_SetOrigin' + 'entity_count' + 'entity_get_byte' + 'entity_get_edict' + 'entity_get_float' + 'entity_get_int' + 'entity_get_string' + 'entity_get_vector' + 'entity_range' + 'entity_set_byte' + 'entity_set_edict' + 'entity_set_float' + 'entity_set_int' + 'entity_set_model' + 'entity_set_origin' + 'entity_set_size' + 'entity_set_string' + 'entity_set_vector' + 'Entvars_Get_Byte' + 'Entvars_Get_Edict' + 'Entvars_Get_Float' + 'Entvars_Get_Int' + 'Entvars_Get_String' + 'Entvars_Get_Vector' + 'Entvars_Set_Byte' + 'Entvars_Set_Edict' + 'Entvars_Set_Float' + 'Entvars_Set_Int' + 'Entvars_Set_String' + 'Entvars_Set_Vector' + 'enum' + 'equal' + 'equali' + 'exit' + 'fake_touch' + 'fakedamage' + 'FakeTouch' + 'fclose' + 'FCVAR_CLIENTDLL' + 'FCVAR_EXTDLL' + 'FCVAR_PRINTABLEONLY' + 'FCVAR_PROTECTED' + 'FCVAR_SPONLY' + 'FCVAR_UNLOGGED' + 'feof' + 'fflush' + 'fgetc' + 'fgetf' + 'fgeti' + 'fgetl' + 'fgets' + 'file_exists' + 'file_size' + 'filesize' + 'find_ent' + 'find_ent_by_class' + 'find_ent_by_model' + 'find_ent_by_owner' + 'find_ent_by_target' + 'find_ent_by_tname' + 'find_ent_in_sphere' + 'find_ent_sphere' + 'find_entity' + 'find_player' + 'find_plugin_bydesc' + 'find_plugin_byfile' + 'find_sphere_class' + 'FindEntity' + 'FL_ALWAYSTHINK' + 'FL_BASEVELOCITY' + 'FL_CUSTOMENTITY' + 'FL_DORMANT' + 'FL_DUCKING' + 'FL_FAKECLIENT' + 'FL_FLOAT' + 'FL_FROZEN' + 'FL_GRAPHED' + 'FL_IMMUNE_LAVA' + 'FL_IMMUNE_WATER' + 'FL_KILLME' + 'FL_MONSTERCLIP' + 'FL_ONTRAIN' + 'FL_PROXY' + 'FL_SPECTATOR' + 'FL_WORLDBRUSH' + 'FLAG_AUTHID' + 'FLAG_IP' + 'FLAG_KICK' + 'FLAG_NOPASS' + 'FLAG_TAG' + 'float' + 'floatabs' + 'floatacos' + 'floatadd' + 'floatasin' + 'floatatan' + 'floatatan2' + 'floatcmp' + 'floatcos' + 'floatdiv' + 'floatfract' + 'floatlog' + 'floatmul' + 'floatpower' + 'floatround' + 'floatsin' + 'floatsqroot' + 'floatstr' + 'floatsub' + 'floattan' + 'FMRES_HANDLED' + 'FMRES_IGNORED' + 'FMRES_OVERRIDE' + 'FMRES_SUPERCEDE' + 'FMV_CELL' + 'FMV_FLOAT' + 'fopen' + 'for' + 'force_unmodified' + 'force_use' + 'format' + 'format_args' + 'format_time' + 'forward' + 'forward_return' + 'fputc' + 'fputf' + 'fputi' + 'fputl' + 'fputs' + 'fread' + 'fscanf' + 'fseek' + 'FT_NEW' + 'FT_OLD' + 'ftell' + 'funcidx' + 'FUSE_RESET' + 'FUSE_SET' + 'FVecIVec' + 'fwrite' + 'geoip_code2' + 'geoip_code3' + 'geoip_country' + 'get_basedir' + 'get_brush_entity_origin' + 'get_build' + 'get_class' + 'get_clcmd' + 'get_clcmdsnum' + 'get_client_listen' + 'get_concmd' + 'get_concmdsnum' + 'get_configsdir' + 'get_customdir' + 'get_cvar_flags' + 'get_cvar_float' + 'get_cvar_num' + 'get_cvar_string' + 'get_datadir' + 'get_decal_index' + 'get_distance' + 'get_entity_distance' + 'get_entity_flags' + 'get_entity_origin' + 'get_entity_velocity' + 'get_entity_visibility' + 'get_filename' + 'get_flags' + 'get_gametime' + 'get_global_edict' + 'get_global_float' + 'get_global_int' + 'get_global_string' + 'get_global_vector' + 'get_grenade' + 'get_grenade_id' + 'get_grenade_index' + 'get_hostage_id' + 'get_info_keybuffer' + 'get_keyvalue' + 'get_lang' + 'get_langsnum' + 'get_localinfo' + 'get_logfile' + 'get_mapname' + 'get_mask' + 'get_max_entities' + 'get_maxplayers' + 'get_maxspeed' + 'get_modname' + 'get_module' + 'get_modulesnum' + 'get_msg_arg_float' + 'get_msg_arg_int' + 'get_msg_arg_string' + 'get_msg_args' + 'get_msg_argtype' + 'get_msg_block' + 'get_msg_origin' + 'get_owner' + 'get_pdata' + 'get_pdata_char' + 'get_pdata_float' + 'get_pdata_int' + 'get_pdata_short' + 'get_players' + 'get_playersnum' + 'get_plugin' + 'get_pluginsnum' + 'get_private_f' + 'get_private_i' + 'get_range' + 'get_res' + 'get_spawn' + 'get_speak' + 'get_special' + 'get_speed' + 'get_speedchange' + 'get_srvcmd' + 'get_srvcmdsnum' + 'get_stats' + 'get_stats2' + 'get_statsnum' + 'get_string' + 'get_systime' + 'get_time' + 'get_timeleft' + 'get_tr' + 'get_user_aiming' + 'get_user_ammo' + 'get_user_armor' + 'get_user_astats' + 'get_user_attacker' + 'get_user_authid' + 'get_user_button' + 'get_user_deaths' + 'get_user_flags' + 'get_user_frags' + 'get_user_godmode' + 'get_user_gravity' + 'get_user_health' + 'get_user_hitzones' + 'get_user_index' + 'get_user_info' + 'get_user_ip' + 'get_user_lstats' + 'get_user_maxspeed' + 'get_user_menu' + 'get_user_money' + 'get_user_msgid' + 'get_user_msgname' + 'get_user_name' + 'get_user_noclip' + 'get_user_oldbutton' + 'get_user_origin' + 'get_user_ping' + 'get_user_rstats' + 'get_user_stats' + 'get_user_stats2' + 'get_user_team' + 'get_user_time' + 'get_user_userid' + 'get_user_velocity' + 'get_user_vstats' + 'get_user_weapon' + 'get_user_weapons' + 'get_user_wlstats' + 'get_user_wrstats' + 'get_user_wstats' + 'get_usercmd' + 'get_vaultdata' + 'get_weaponname' + 'get_xvar_float' + 'get_xvar_id' + 'get_xvar_num' + 'getarg' + 'getkey_float' + 'getkey_int' + 'getkey_string' + 'GetMessageBlock' + 'give_item' + 'globals_get_edict' + 'globals_get_float' + 'globals_get_int' + 'globals_get_string' + 'globals_get_vector' + 'goto' + 'gpglobals_v' + 'gpgobals_time' + 'grenade_throw' + 'halflife_time' + 'has_weapon' + 'heapspace' + 'HIT_CHEST' + 'HIT_GENERIC' + 'HIT_HEAD' + 'HIT_LEFTARM' + 'HIT_LEFTLEG' + 'HIT_RIGHTARM' + 'HIT_RIGHTLEG' + 'HIT_STOMACH' + 'HIW_AK47' + 'HIW_AKS74U' + 'HIW_BERETTA' + 'HIW_FLASHBANG' + 'HIW_GLOCK' + 'HIW_M11' + 'HIW_M11SD' + 'HIW_M16A2' + 'HIW_M4A1' + 'HIW_MP5A4' + 'HIW_MP5SD5' + 'HIW_NATOGREN' + 'HIW_PSG1' + 'HIW_REMINGTON' + 'HIW_SPAS12' + 'HIW_TANGOGREN' + 'HIW_ZASTAVA' + 'HLTime' + 'HULL_HEAD' + 'HULL_HUMAN' + 'HULL_LARGE' + 'HULL_POINT' + 'if' + 'IN_ALT1' + 'IN_ATTACK' + 'IN_ATTACK2' + 'IN_BACK' + 'IN_CANCEL' + 'IN_DUCK' + 'IN_FORWARD' + 'IN_JUMP' + 'IN_LEFT' + 'in_list_float' + 'in_list_int' + 'in_list_string' + 'IN_MOVELEFT' + 'IN_MOVERIGHT' + 'IN_RELOAD' + 'IN_RIGHT' + 'IN_RUN' + 'IN_SCORE' + 'IN_USE' + 'include' + 'inconsistent_file' + 'is_combat' + 'is_dedicated_server' + 'is_ent_valid' + 'is_entity' + 'is_jit_enabled' + 'is_linux_server' + 'is_map_valid' + 'is_module_loaded' + 'is_plugin_loaded' + 'is_running' + 'is_user_admin' + 'is_user_alive' + 'is_user_bot' + 'is_user_connected' + 'is_user_connecting' + 'is_user_hltv' + 'is_valid_ent' + 'isalnum' + 'isalpha' + 'isdigit' + 'isspace' + 'IVecFVec' + 'jghg_find_ent_owner' + 'jghg2_set_size' + 'jghg2_think' + 'keytable_clear' + 'keytable_count' + 'keytable_delete' + 'keytable_getkey' + 'keytable_getval' + 'keytable_next' + 'keytable_reset' + 'lang_exists' + 'LANG_PLAYER' + 'LANG_SERVER' + 'list_clear' + 'list_clear_float' + 'list_clear_int' + 'list_clear_string' + 'list_delete' + 'list_delete_float' + 'list_delete_int' + 'list_delete_string' + 'list_get' + 'list_get_float' + 'list_get_int' + 'list_get_string' + 'list_getf' + 'list_next' + 'list_next_float' + 'list_next_int' + 'list_next_string' + 'list_pop' + 'list_pop_float' + 'list_pop_int' + 'list_pop_string' + 'list_push_float' + 'list_push_int' + 'list_push_string' + 'list_reset' + 'list_reset_float' + 'list_reset_int' + 'list_reset_string' + 'list_size' + 'list_size_float' + 'list_size_int' + 'list_size_string' + 'list_store_float' + 'list_store_int' + 'list_store_string' + 'log_amx' + 'log_message' + 'log_to_file' + 'make_deathmsg' + 'make_string' + 'max' + 'md5' + 'md5_file' + 'MENU_KEY_0' + 'MENU_KEY_1' + 'MENU_KEY_2' + 'MENU_KEY_3' + 'MENU_KEY_4' + 'MENU_KEY_5' + 'MENU_KEY_6' + 'MENU_KEY_7' + 'MENU_KEY_8' + 'MENU_KEY_9' + 'message_begin' + 'message_end' + 'MessageBlock' + 'min' + 'MOVETYPE_ANGLECLIP' + 'MOVETYPE_ANGLENOCLIP' + 'MOVETYPE_BOUNCEMISSILE' + 'MOVETYPE_FOLLOW' + 'msg_args' + 'msg_data' + 'msg_data_type' + 'msg_dest' + 'msg_loc' + 'msg_name' + 'MSG_ONE_UNRELIABLE' + 'MSG_PAS' + 'MSG_PAS_R' + 'MSG_PVS' + 'MSG_PVS_R' + 'msg_set_f' + 'msg_set_i' + 'msg_set_s' + 'msg_strdata' + 'msg_type' + 'mysql_close' + 'mysql_connect' + 'mysql_error' + 'mysql_getfield' + 'mysql_nextrow' + 'mysql_query' + 'native' + 'new' + 'new_float_list' + 'new_int_list' + 'new_keytable' + 'new_list' + 'new_string_list' + 'NS_CONST_INC' + 'ns_get_build' + 'ns_get_class' + 'ns_get_deaths' + 'ns_get_energy' + 'ns_get_exp' + 'ns_get_hive_trait' + 'ns_get_jpfuel' + 'ns_get_mask' + 'ns_get_maxspeed' + 'ns_get_points' + 'ns_get_res' + 'ns_get_score' + 'ns_get_spawn' + 'ns_get_speedchange' + 'ns_get_struct_owner' + 'ns_get_weap_clip' + 'ns_get_weap_dmg' + 'ns_get_weap_range' + 'ns_get_weap_reserve' + 'ns_give_item' + 'ns_has_weapon' + 'NS_INC' + 'ns_is_combat' + 'ns_popup' + 'ns_set_deaths' + 'ns_set_energy' + 'ns_set_exp' + 'ns_set_fov' + 'ns_set_hive_trait' + 'ns_set_jpfuel' + 'ns_set_mask' + 'ns_set_player_body' + 'ns_set_player_model' + 'ns_set_player_skin' + 'ns_set_points' + 'ns_set_res' + 'ns_set_score' + 'ns_set_speedchange' + 'ns_set_struct_owner' + 'ns_set_weap_clip' + 'ns_set_weap_dmg' + 'ns_set_weap_range' + 'ns_set_weap_reserve' + 'ns2amx_getammo' + 'ns2amx_getenergy' + 'ns2amx_gethives' + 'ns2amx_getjpfuel' + 'ns2amx_giveitem' + 'ns2amx_inrange' + 'ns2amx_isdigesting' + 'ns2amx_moveto' + 'ns2amx_nspopup' + 'ns2amx_setammo' + 'ns2amx_setenergy' + 'ns2amx_setjpfuel' + 'ns2amx_setres' + 'ns2amx_version' + 'num_to_str' + 'num_to_word' + 'numargs' + 'number_of_entities' + 'numtostr' + 'operator' + 'parse' + 'parse_loguser' + 'parse_time' + 'pause' + 'pev' + 'pev_f' + 'pev_i' + 'pfn_keyvalue' + 'pfn_playbackevent' + 'pfn_spawn' + 'pfn_think' + 'pfn_touch' + 'PITCH_HIGH' + 'PITCH_LOW' + 'playback_event' + 'plugin_cfg' + 'PLUGIN_CONTINUE' + 'plugin_end' + 'plugin_flags' + 'PLUGIN_HANDLED' + 'PLUGIN_HANDLED_MAIN' + 'plugin_init' + 'plugin_log' + 'plugin_modules' + 'plugin_pause' + 'plugin_precache' + 'plugin_unpause' + 'point_contents' + 'PointContents' + 'power' + 'precache_event' + 'precache_generic' + 'precache_model' + 'precache_sound' + 'public' + 'radius_damage' + 'RadiusDamage' + 'random' + 'random_float' + 'random_num' + 'read_argc' + 'read_args' + 'read_argv' + 'read_data' + 'read_datanum' + 'read_dir' + 'read_file' + 'read_flags' + 'read_logargc' + 'read_logargv' + 'read_logdata' + 'regex_free' + 'regex_match' + 'regex_substr' + 'register_changelvl' + 'register_clcmd' + 'register_clientkill' + 'register_concmd' + 'register_cvar' + 'register_dictionary' + 'register_event' + 'register_forward' + 'register_impulse' + 'register_logevent' + 'register_menu' + 'register_menucmd' + 'register_menuid' + 'register_message' + 'register_msgblock' + 'register_msgedit' + 'register_playback' + 'register_plugin' + 'register_srvcmd' + 'register_statsfwd' + 'register_think' + 'register_touch' + 'remove_cvar_flags' + 'remove_entity' + 'remove_entity_name' + 'remove_quotes' + 'remove_task' + 'remove_user_flags' + 'remove_vaultdata' + 'RemoveEntity' + 'replace' + 'require_module' + 'reset_user_wstats' + 'return' + 'rewind' + 'SEEK_CUR' + 'SEEK_END' + 'SEEK_SET' + 'server_changelevel' + 'server_cmd' + 'server_exec' + 'server_frame' + 'server_print' + 'ServerFrame' + 'set_client_listen' + 'set_cvar_flags' + 'set_cvar_float' + 'set_cvar_num' + 'set_cvar_string' + 'set_entity_flags' + 'set_entity_origin' + 'set_entity_velocity' + 'set_entity_visibility' + 'set_hudmessage' + 'set_kvhandled' + 'set_lights' + 'set_localinfo' + 'set_mask' + 'set_msg_arg_float' + 'set_msg_arg_int' + 'set_msg_arg_string' + 'set_msg_block' + 'set_pdata' + 'set_pdata_char' + 'set_pdata_float' + 'set_pdata_int' + 'set_pdata_short' + 'set_pev' + 'set_pev_f' + 'set_pev_i' + 'set_player_body' + 'set_player_model' + 'set_player_skin' + 'set_private_f' + 'set_private_i' + 'set_rendering' + 'set_size' + 'set_speak' + 'set_speedchange' + 'set_task' + 'set_tr' + 'set_user_armor' + 'set_user_deaths' + 'set_user_flags' + 'set_user_footsteps' + 'set_user_frags' + 'set_user_godmode' + 'set_user_gravity' + 'set_user_health' + 'set_user_hitzones' + 'set_user_info' + 'set_user_maxspeed' + 'set_user_money' + 'set_user_noclip' + 'set_user_origin' + 'set_user_rendering' + 'set_user_velocity' + 'set_usercmd' + 'set_vaultdata' + 'set_view' + 'set_xvar_float' + 'set_xvar_num' + 'setarg' + 'setc' + 'SetSpeak' + 'SetView' + 'show_activity' + 'show_hudmessage' + 'show_menu' + 'show_motd' + 'sizeof' + 'sleep' + 'socket_change' + 'socket_close' + 'socket_open' + 'socket_recv' + 'socket_send' + 'SOCKET_TCP' + 'SOCKET_UDP' + 'spawn' + 'SPEAK_ALL' + 'SPEAK_LISTENALL' + 'SPEAK_MUTED' + 'SPEAK_NORMAL' + 'sqroot' + 'STAMINA_RESET' + 'STAMINA_SET' + 'static' + 'stock' + 'store_float' + 'store_int' + 'store_string' + 'str_to_num' + 'strbreak' + 'string' + 'strip_user_weapons' + 'strlen' + 'strpack' + 'strtok' + 'strtolower' + 'strtonum' + 'strtoupper' + 'strunpack' + 'supercede' + 'SVC_ADDANGLE' + 'SVC_CDTRACK' + 'SVC_INTERMISSION' + 'SVC_NEWUSERMSG' + 'SVC_ROOMTYPE' + 'SVC_TEMPENTITY' + 'SVC_WEAPONANIM' + 'swapchars' + 'switch' + 'take_damage' + 'task_exists' + 'tfc_clearmodel' + 'tfc_getbammo' + 'tfc_getweaponbammo' + 'tfc_isgrenade' + 'tfc_setbammo' + 'tfc_setmodel' + 'tfc_setpddata' + 'tfc_setweaponbammo' + 'tfc_userkill' + 'TFCMAX_WEAPONS' + 'tickcount' + 'time' + 'tolower' + 'toupper' + 'trace_hull' + 'trace_line' + 'trace_normal' + 'TraceLn' + 'TraceNormal' + 'traceresult' + 'trim' + 'ts_createpwup' + 'ts_getkillingstreak' + 'ts_getusercash' + 'ts_getuseritems' + 'ts_getuserkillflags' + 'ts_getuserlastfrag' + 'ts_getuserpwup' + 'ts_getuserspace' + 'ts_getuserwpn' + 'ts_givepwup' + 'ts_giveweapon' + 'ts_setpddata' + 'ts_wpnlogtoid' + 'ts_wpnlogtoname' + 'TSA_FLASHLIGHT' + 'TSA_LASERSIGHT' + 'TSA_SCOPE' + 'TSA_SILENCER' + 'TSITEM_KUNGFU' + 'TSITEM_SUPERJUMP' + 'TSKF_DOUBLEKILL' + 'TSKF_ISSPEC' + 'TSKF_KILLEDSPEC' + 'TSKF_SLIDINGKILL' + 'TSKF_STUNTKILL' + 'TSMAX_WEAPONS' + 'TSPWUP_ARMOR' + 'TSPWUP_DFIRERATE' + 'TSPWUP_GRENADE' + 'TSPWUP_HEALTH' + 'TSPWUP_INFAMMO' + 'TSPWUP_KUNGFU' + 'TSPWUP_RANDOM' + 'TSPWUP_SLOWMO' + 'TSPWUP_SLOWPAUSE' + 'TSPWUP_SUPERJUMP' + 'ucfirst' + 'unlink' + 'unpause' + 'use' + 'user_has_weapon' + 'user_kill' + 'user_silentkill' + 'user_slap' + 'user_spawn' + 'vaultdata_exists' + 'VecDist' + 'VecLength' + 'VecToAngles' + 'vector_distance' + 'vector_length' + 'vector_to_angle' + 'velocity_by_aim' + 'VelocityByAim' + 'vexd_pfntouch' + 'ViewContents' + 'VOL_NORM' + 'write_angle' + 'write_byte' + 'write_char' + 'write_coord' + 'write_entity' + 'write_file' + 'write_long' + 'write_shortwrite_string' + 'xmod_get_maxweapons' + 'xmod_get_stats_size' + 'xmod_get_wpnlogname' + 'xmod_get_wpnname' + 'xmod_is_custom_wpn' + 'xmod_is_melee_wpn' + 'XS__LIBRELEASE' + 'XS_AMX' + 'XS_AMXX' + 'xvar_exists - BLA blubb XD') + IgnoreCase = True + ChooseSingle = False + AutoHide = True + DropRestOfWord = False + CancelAtStart = False + CompleteWord = False + CompleteWordOnlyOne = True + Editor = sciEditor + WordCharacters = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + OnBeforeShow = sciAutoCompleteBeforeShow + MaxWidth = 0 + MaxHeight = 5 + Left = 842 + Top = 6 + end + object ppmDocuments: TSpTBXPopupMenu + Left = 662 + Top = 6 + object mnuPClose: TSpTBXItem + OnClick = mnuPCloseClick + CaptionW = 'Close file' + end + object mnuPCloseAllFiles: TSpTBXItem + OnClick = mnuPCloseAllFilesClick + CaptionW = 'Close all files' + end + object sepDocuments: TSpTBXSeparatorItem + end + object mnuPSave: TSpTBXItem + CaptionW = 'Save file' + end + end + object JvInspectorDotNETPainter: TJvInspectorDotNETPainter + DrawNameEndEllipsis = False + Left = 632 + Top = 6 + end +end diff --git a/editor/studio/UnitfrmMain.pas b/editor/studio/UnitfrmMain.pas new file mode 100755 index 00000000..41203d54 --- /dev/null +++ b/editor/studio/UnitfrmMain.pas @@ -0,0 +1,2652 @@ +unit UnitfrmMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, SpTBXItem, TB2Item, TBX, TB2Dock, TB2Toolbar, Menus, ImgList, + TBXSwitcher, { Themes -> } TBXAluminumTheme, TBXDreamTheme, TBXEosTheme, + TBXMonaiTheme, TBXNexos2Theme, TBXNexos3Theme, TBXNexos4Theme, TBXNexos5Theme, + TBXOffice11AdaptiveTheme, TBXOfficeCTheme, TBXOfficeKTheme, TBXOfficeXPTheme, + TBXReliferTheme, TBXSentimoXTheme, TBXTristanTheme, TBXTristan2Theme, + TBXXitoTheme, { <- Themes } SpTBXTabs, ExtCtrls, SpTBXDkPanels, TFlatSplitterUnit, + SciLexer, SciLexerMemo, SciLexerMod, SciCallTips, ComCtrls, mbTBXTreeView, + StdCtrls, mbTBXRichEdit, TBXDkPanels, TBXToolPals, SciPropertyMgr, + mbTBXHint, mbTBXHotKeyEdit, SciAutoComplete, sciKeyBindings, + sciPrint, mxFlatControls, ClipBrd, ActnList, SciSearchReplace, + IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, + ShellAPI, IdFTPCommon, IdAntiFreezeBase, IdAntiFreeze, JvComponent, + JvInspector, JvExControls, JvPluginManager, JvgLanguageLoader, + JvWndProcHook, CommCtrl; + +type + TfrmMain = class(TForm) + TBXSwitcher: TTBXSwitcher; + ilImages: TImageList; + ppmOutput: TSpTBXPopupMenu; + tbxTopDock: TSpTBXDock; + tbxMenu: TSpTBXToolbar; + mnuFile: TSpTBXSubmenuItem; + mnuNew: TSpTBXSubmenuItem; + mnuEmptyPlugin: TSpTBXItem; + mnuNewPlugin: TSpTBXItem; + mnuHeaderPAWN: TSpTBXItem; + mnuNewModule: TSpTBXItem; + mnuNewUnit: TSpTBXItem; + mnuNewHeaderCPP: TSpTBXItem; + sepFile1: TSpTBXSeparatorItem; + mnuOpen: TSpTBXItem; + sepFile2: TSpTBXSeparatorItem; + mnuSave: TSpTBXItem; + mnuSaveAs: TSpTBXItem; + mnuSaveAllFiles: TSpTBXItem; + sepFile3: TSpTBXSeparatorItem; + mnuClose: TSpTBXItem; + mnuCloseAllFiles: TSpTBXItem; + sepFile4: TSpTBXSeparatorItem; + mnuPrint: TSpTBXItem; + sepFile5: TSpTBXSeparatorItem; + mnuExit: TSpTBXItem; + mnuEdit: TSpTBXSubmenuItem; + mnuUndo: TSpTBXItem; + mnuRedo: TSpTBXItem; + sepEdit1: TSpTBXSeparatorItem; + mnuCut: TSpTBXItem; + mnuCopy: TSpTBXItem; + mnuPaste: TSpTBXItem; + sepEdit2: TSpTBXSeparatorItem; + mnuSelectAll: TSpTBXItem; + mnuSearch: TSpTBXSubmenuItem; + mnuSearchDialog: TSpTBXItem; + mnuSearchAgain: TSpTBXItem; + sepSearch1: TSpTBXSeparatorItem; + mnuReplace: TSpTBXItem; + sepSearch2: TSpTBXSeparatorItem; + mnuGoToLine: TSpTBXItem; + mnuView: TSpTBXSubmenuItem; + mnuChangeTheme: TSpTBXSubmenuItem; + mnuThemes: TSpTBXThemeGroupItem; + mnuSelectHighlighter: TSpTBXSubmenuItem; + mnuHPAWN: TSpTBXItem; + mnuHCPP: TSpTBXItem; + mnuHHTML: TSpTBXItem; + mnuHSQL: TSpTBXItem; + mnuHXML: TSpTBXItem; + sepHighlighter: TSpTBXSeparatorItem; + mnuHNone: TSpTBXItem; + sepView2: TSpTBXSeparatorItem; + mnuShowFileTB: TSpTBXItem; + mnuShowEditTB: TSpTBXItem; + mnuShowCodeSnippets: TSpTBXItem; + mnuShowCodeToolsWindow: TSpTBXItem; + mnuCompile: TSpTBXSubmenuItem; + mnuDoCompile: TSpTBXItem; + sepCompile1: TSpTBXSeparatorItem; + mnuCompileAndStartHL: TSpTBXItem; + mnuCompileAndUpload: TSpTBXItem; + sepCompile2: TSpTBXSeparatorItem; + mnuRegisterPluginsIniLocal: TSpTBXItem; + mnuRegisterPluginsIniWeb: TSpTBXItem; + mnuTools: TSpTBXSubmenuItem; + mnuIndenter: TSpTBXItem; + mnuUnindenter: TSpTBXItem; + sepTools1: TSpTBXSeparatorItem; + mnuSocketTerminal: TSpTBXItem; + sepTools2: TSpTBXSeparatorItem; + mnuPluginsIniEditor: TSpTBXItem; + sepTools3: TSpTBXSeparatorItem; + mnuSettings: TSpTBXItem; + mnuGenerators: TSpTBXSubmenuItem; + mnuHudmessage: TSpTBXItem; + mnuMOTDGenerator: TSpTBXItem; + mnuHelp: TSpTBXSubmenuItem; + mnuOpenHelp: TSpTBXItem; + sepHelp1: TSpTBXSeparatorItem; + mnuSearchForums: TSpTBXItem; + mnuOpenScriptingForum: TSpTBXItem; + tbxToolbar: TTBXToolbar; + mnuTNew: TSpTBXItem; + mnuTOpen: TSpTBXItem; + mnuTSave: TSpTBXItem; + sepToolbar1: TSpTBXSeparatorItem; + mnuTSearch: TSpTBXItem; + sepToolbar2: TSpTBXSeparatorItem; + mnuTCompile: TSpTBXItem; + tbxCodeSnippets: TSpTBXToolbar; + mnuCodeSnippets: TSpTBXRightAlignSpacerItem; + mnuPAWN: TSpTBXItem; + mnuCPP: TSpTBXItem; + sepCodeSnippets: TSpTBXSeparatorItem; + tbxEdit: TSpTBXToolbar; + mnuTUndo: TSpTBXItem; + mnuTRedo: TSpTBXItem; + sepTEdit1: TSpTBXSeparatorItem; + mnuTCopy: TSpTBXItem; + mnuTCut: TSpTBXItem; + mnuTPaste: TSpTBXItem; + sepTEdit2: TSpTBXSeparatorItem; + mnuTSelectAll: TSpTBXItem; + tsMain: TSpTBXTabSet; + tiPAWN: TSpTBXTabItem; + tiCPP: TSpTBXTabItem; + tsDocuments: TSpTBXTabSet; + tiDocument1: TSpTBXTabItem; + spcLeft1: TImage; + spcRight1: TImage; + sciCallTips: TSciCallTips; + sbStatus: TSpTBXStatusBar; + sepGenerators1: TSpTBXSeparatorItem; + infoNewAMXX: TSpTBXRightAlignSpacerItem; + infoNewCPP: TSpTBXRightAlignSpacerItem; + sepNew1: TSpTBXSeparatorItem; + mnuPaster: TSpTBXItem; + tiOther: TSpTBXTabItem; + sciPropertyLoader: TSciPropertyLoader; + odOpen: TOpenDialog; + sdSave: TSaveDialog; + sepNew3: TSpTBXSeparatorItem; + infoNewOther: TSpTBXRightAlignSpacerItem; + mnuNewTextfile: TSpTBXItem; + mnuNewHTML: TSpTBXItem; + mnuNewSQL: TSpTBXItem; + mnuNewXML: TSpTBXItem; + sepHelp2: TSpTBXSeparatorItem; + mnuInfo: TSpTBXItem; + mnuFilename: TSpTBXRightAlignSpacerItem; + sepStatus2: TSpTBXSeparatorItem; + mnuCaret: TSpTBXRightAlignSpacerItem; + sepStatus3: TSpTBXSeparatorItem; + mnuModified: TSpTBXRightAlignSpacerItem; + sepStatus1: TSpTBXSeparatorItem; + mnuShowCodeTools: TSpTBXItem; + mnuOther: TSpTBXItem; + mnuFoldAll: TSpTBXItem; + sepView1: TSpTBXSeparatorItem; + sciPrinter: TSciPrinter; + pnlParent: TPanel; + sciEditor: TScintilla; + splRight: TSplitter; + tcTools: TSpTBXTabControl; + tiTools: TSpTBXTabItem; + tiNotes: TSpTBXTabItem; + tsNotes: TSpTBXTabSheet; + imgRight4: TImage; + imgBottom4: TImage; + imgTop4: TImage; + imgLeft4: TImage; + tbxNotes: TSpTBXToolbar; + mnuBold: TSpTBXItem; + mnuItalic: TSpTBXItem; + mnuUnderline: TSpTBXItem; + sepNotes: TSpTBXSeparatorItem; + mnuSelectColor: TSpTBXSubmenuItem; + cpNotes: TTBXColorPalette; + rtfNotes: TRichEdit; + tsExplorer: TSpTBXTabSheet; + spcBottom2: TImage; + spcLeft2: TImage; + spcRight2: TImage; + lstOutput: TListBox; + splOutput: TSplitter; + mnuCopyMessage: TSpTBXItem; + mnuCopyAll: TSpTBXItem; + mnuSaveToFile: TSpTBXItem; + sepOutput: TSpTBXSeparatorItem; + alControlChars: TActionList; + acControlChar1: TAction; + acControlChar2: TAction; + acControlChar3: TAction; + acControlChar4: TAction; + acControlChar5: TAction; + acControlChar6: TAction; + acControlChar7: TAction; + acControlChar8: TAction; + acControlChar9: TAction; + acControlChar10: TAction; + acControlChar11: TAction; + acControlChar12: TAction; + acControlChar13: TAction; + acControlChar14: TAction; + acControlChar15: TAction; + acControlChar16: TAction; + acControlChar17: TAction; + acControlChar18: TAction; + acControlChar19: TAction; + acControlChar20: TAction; + acControlChar22: TAction; + acControlChar23: TAction; + acControlChar24: TAction; + acControlChar25: TAction; + acControlChar21: TAction; + acControlChar26: TAction; + acControlChar27: TAction; + acControlChar28: TAction; + acControlChar29: TAction; + acControlChar30: TAction; + acControlChar31: TAction; + acControlChar32: TAction; + acControlChar33: TAction; + ppmEditor: TSpTBXPopupMenu; + mnuEditorCopy: TSpTBXItem; + mnuEditorPaste: TSpTBXItem; + mnuEditorCut: TSpTBXItem; + sepEditorMenu2: TSpTBXSeparatorItem; + mnuEditorUndo: TSpTBXItem; + mnuEditorRedo: TSpTBXItem; + sepEditorMenu3: TSpTBXSeparatorItem; + mnuToogleBookmark: TSpTBXItem; + mnuGoToBookmark: TSpTBXItem; + mnuEditorDelete: TSpTBXItem; + sepEditorMenu1: TSpTBXSeparatorItem; + mnuEditorSelectAll: TSpTBXItem; + sciSearchReplace: TSciSearchReplace; + acControlChar34: TAction; + acControlChar35: TAction; + acControlChar36: TAction; + acControlChar37: TAction; + IdFTP: TIdFTP; + acControlChar38: TAction; + pnlLoading: TSpTBXPanel; + pbLoading: TSpTBXProgressBar; + cmdCancel: TSpTBXButton; + acControlChar39: TAction; + acControlChar40: TAction; + sciAutoComplete: TSciAutoComplete; + mnuHTML: TSpTBXItem; + ppmDocuments: TSpTBXPopupMenu; + mnuPClose: TSpTBXItem; + mnuPSave: TSpTBXItem; + sepDocuments: TSpTBXSeparatorItem; + mnuPCloseAllFiles: TSpTBXItem; + mnuMenuGenerator: TSpTBXItem; + pnlDock: TSpTBXMultiDock; + pnlCodeExplorer: TSpTBXDockablePanel; + trvExplorer: TTreeView; + pnlCodeInspector: TSpTBXDockablePanel; + JvInspectorDotNETPainter: TJvInspectorDotNETPainter; + jviCode: TJvInspector; + mnuConnectionGen: TSpTBXItem; + acControlChar41: TAction; + sepView3: TSpTBXSeparatorItem; + mnuShowCodeExplorer: TSpTBXItem; + mnuShowCodeInspector: TSpTBXItem; + procedure FormConstrainedResize(Sender: TObject; var MinWidth, + MinHeight, MaxWidth, MaxHeight: Integer); + procedure mnuExitClick(Sender: TObject); + procedure OnCodeSnippetSelect(Sender: TObject); + procedure cpNotesChange(Sender: TObject); + procedure mnuBoldClick(Sender: TObject); + procedure mnuItalicClick(Sender: TObject); + procedure mnuUnderlineClick(Sender: TObject); + procedure rtfNotesMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure rtfNotesKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure trvExplorerCollapsed(Sender: TObject; Node: TTreeNode); + procedure trvExplorerExpanded(Sender: TObject; Node: TTreeNode); + procedure mnuSettingsClick(Sender: TObject); + procedure tsMainActiveTabChange(Sender: TObject; ItemIndex: Integer); + procedure tsDocumentsActiveTabChange(Sender: TObject; + ItemIndex: Integer); + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure mnuTOpenClick(Sender: TObject); + procedure mnuTSaveClick(Sender: TObject); + procedure mnuTSearchClick(Sender: TObject); + procedure mnuTCompileClick(Sender: TObject); + procedure mnuTUndoClick(Sender: TObject); + procedure mnuTRedoClick(Sender: TObject); + procedure mnuTCopyClick(Sender: TObject); + procedure mnuTCutClick(Sender: TObject); + procedure mnuTPasteClick(Sender: TObject); + procedure mnuTSelectAllClick(Sender: TObject); + procedure mnuEmptyPluginClick(Sender: TObject); + procedure mnuNewPluginClick(Sender: TObject); + procedure mnuHXMLClick(Sender: TObject); + procedure mnuHNoneClick(Sender: TObject); + procedure mnuOpenClick(Sender: TObject); + procedure mnuNewTextfileClick(Sender: TObject); + procedure mnuNewHTMLClick(Sender: TObject); + procedure mnuNewSQLClick(Sender: TObject); + procedure mnuNewXMLClick(Sender: TObject); + procedure mnuUndoClick(Sender: TObject); + procedure mnuSaveClick(Sender: TObject); + procedure mnuSaveAsClick(Sender: TObject); + procedure mnuThemesClick(Sender: TObject); + procedure mnuInfoClick(Sender: TObject); + procedure mnuRedoClick(Sender: TObject); + procedure mnuCutClick(Sender: TObject); + procedure mnuCopyClick(Sender: TObject); + procedure mnuPasteClick(Sender: TObject); + procedure mnuSelectAllClick(Sender: TObject); + procedure mnuCloseClick(Sender: TObject); + procedure mnuShowCodeToolsClick(Sender: TObject); + procedure sciEditorClick(Sender: TObject); + procedure sciEditorKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure sciEditorKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure mnuFoldAllClick(Sender: TObject); + procedure tbxToolbarVisibleChanged(Sender: TObject); + procedure mnuShowFileTBClick(Sender: TObject); + procedure tbxEditVisibleChanged(Sender: TObject); + procedure mnuShowEditTBClick(Sender: TObject); + procedure tbxCodeSnippetsVisibleChanged(Sender: TObject); + procedure mnuShowCodeSnippetsClick(Sender: TObject); + procedure mnuCopyMessageClick(Sender: TObject); + procedure mnuCopyAllClick(Sender: TObject); + procedure mnuSaveToFileClick(Sender: TObject); + procedure ppmOutputInitPopup(Sender: TObject; PopupView: TTBView); + procedure mnuSearchForumsClick(Sender: TObject); + procedure mnuOpenScriptingForumClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure acControlCharHandler(Sender: TObject); + procedure mnuEditorUndoClick(Sender: TObject); + procedure mnuEditorRedoClick(Sender: TObject); + procedure mnuEditorCopyClick(Sender: TObject); + procedure mnuEditorCutClick(Sender: TObject); + procedure mnuEditorPasteClick(Sender: TObject); + procedure mnuToogleBookmarkClick(Sender: TObject); + procedure mnuEditorDeleteClick(Sender: TObject); + procedure mnuEditorSelectAllClick(Sender: TObject); + procedure mnuGoToBookmarkClick(Sender: TObject); + procedure mnuSearchDialogClick(Sender: TObject); + procedure mnuReplaceClick(Sender: TObject); + procedure mnuSearchAgainClick(Sender: TObject); + procedure mnuGoToLineClick(Sender: TObject); + procedure mnuPrintClick(Sender: TObject); + procedure mnuSaveAllFilesClick(Sender: TObject); + procedure sciEditorKeyPress(Sender: TObject; var Key: Char); + procedure mnuCloseAllFilesClick(Sender: TObject); + procedure mnuIndenterClick(Sender: TObject); + procedure mnuUnindenterClick(Sender: TObject); + procedure mnuPasterClick(Sender: TObject); + procedure mnuPluginsIniEditorClick(Sender: TObject); + procedure cmdCancelClick(Sender: TObject); + procedure mnuSocketTerminalClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure trvExplorerDblClick(Sender: TObject); + procedure tiPAWNClick(Sender: TObject); + procedure tiCPPClick(Sender: TObject); + procedure tiOtherClick(Sender: TObject); + procedure mnuOpenHelpClick(Sender: TObject); + procedure mnuHudmessageClick(Sender: TObject); + procedure mnuDoCompileClick(Sender: TObject); + procedure lstOutputMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lstOutputDblClick(Sender: TObject); + procedure lstOutputMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure sciEditorMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure lstOutputEnter(Sender: TObject); + procedure mnuCompileAndStartHLClick(Sender: TObject); + procedure mnuCompileAndUploadClick(Sender: TObject); + procedure mnuRegisterPluginsIniLocalClick(Sender: TObject); + procedure mnuRegisterPluginsIniWebClick(Sender: TObject); + procedure sciAutoCompleteBeforeShow(Sender: TObject; + const Position: Integer; ListToDisplay: TStrings; + var CancelDisplay: Boolean); + procedure mnuMOTDGeneratorClick(Sender: TObject); + procedure mnuHeaderPAWNClick(Sender: TObject); + procedure OnTabSelect(Sender: TTBCustomItem; Viewer: TTBItemViewer; + Selecting: Boolean); + procedure mnuPCloseClick(Sender: TObject); + procedure mnuPCloseAllFilesClick(Sender: TObject); + procedure mnuTNewClick(Sender: TObject); + procedure jviCodeItemValueChanged(Sender: TObject; + Item: TJvCustomInspectorItem); + procedure mnuMenuGeneratorClick(Sender: TObject); + procedure JvPluginManagerPlugInError(Sender: TObject; + AError: Exception); + procedure mnuNewModuleClick(Sender: TObject); + procedure mnuNewUnitClick(Sender: TObject); + procedure mnuNewHeaderCPPClick(Sender: TObject); + procedure tcToolsActiveTabChange(Sender: TObject; ItemIndex: Integer); + procedure sciEditorModified(Sender: TObject; const position, + modificationType: Integer; text: PAnsiChar; const len, linesAdded, + line, foldLevelNow, foldLevelPrev: Integer); + procedure sciEditorDblClick(Sender: TObject); + procedure sciCallTipsBeforeShow(Sender: TObject; + const Position: Integer; ListToDisplay: TStrings; + var CancelDisplay: Boolean); + procedure sciEditorCallTipClick(Sender: TObject; + const position: Integer); + procedure sciEditorAutoCSelection(Sender: TObject; text: PAnsiChar); + procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; + procedure pnlCodeInspectorVisibleChanged(Sender: TObject); + procedure pnlCodeExplorerVisibleChanged(Sender: TObject); + procedure mnuShowCodeExplorerClick(Sender: TObject); + procedure mnuShowCodeInspectorClick(Sender: TObject); + procedure mnuConnectionGenClick(Sender: TObject); + private + procedure UpdateNotes; + public + IRCPasterStop: Boolean; + eErrorLine: Integer; + SelectedTab: TSpTBXTabItem; + procedure OnCodeSnippetClick(Sender: TObject); + procedure OnCustomClick(Sender: TObject); + procedure SetErrorLine(eLine: Integer); + end; + +var + frmMain: TfrmMain; + eCPP: Boolean; + +implementation + +uses UnitfrmSettings, UnitMainTools, UnitLanguages, UnitfrmInfo, + UnitCodeSnippets, UnitfrmSearch, UnitfrmReplace, UnitfrmGoToLine, + UnitfrmAllFilesForm, UnitCodeUtils, UnitfrmPluginsIniEditor, + UnitfrmSocketsTerminal, UnitfrmSplashscreen, UnitCodeExplorerUpdater, + UnitTextAnalyze, UnitfrmHudMsgGenerator, UnitCompile, UnitfrmAutoIndent, + UnitfrmHTMLPreview, UnitCodeInspector, UnitfrmMOTDGen, + UnitfrmMenuGenerator, UnitfrmClose, UnitPlugins, UnitfrmConnGen, + UnitMenuGenerators; + +{$R *.dfm} + +procedure TfrmMain.FormConstrainedResize(Sender: TObject; var MinWidth, + MinHeight, MaxWidth, MaxHeight: Integer); +begin + pnlLoading.Left := sciEditor.Left + 3 + (sciEditor.Width div 2) - (pnlLoading.Width div 2); + pnlLoading.Top := tsDocuments.Top + sciEditor.Top + ((sciEditor.Height * 5) div 6) - (pnlLoading.Height div 2); + + if (Canvas.TextWidth(ActiveDoc.FileName) +10 > mnuFilename.CustomWidth) then + mnuFilename.Caption := ExtractFileName(ActiveDoc.FileName) + else + mnuFilename.Caption := ActiveDoc.FileName; +end; + +procedure TfrmMain.mnuExitClick(Sender: TObject); +begin + Close; +end; + +{ Notes -> } + +procedure TfrmMain.OnCodeSnippetSelect(Sender: TObject); +begin + mnuPAWN.Checked := Sender = mnuPAWN; + mnuCPP.Checked := Sender = mnuCPP; + mnuHTML.Checked := Sender = mnuHTML; + mnuOther.Checked := Sender = mnuOther; + LoadCodeSnippets((Sender As TSpTBXItem).Caption); +end; + +procedure TfrmMain.cpNotesChange(Sender: TObject); +begin + rtfNotes.SelAttributes.Color := cpNotes.Color; +end; + +procedure TfrmMain.UpdateNotes; +begin + cpNotes.Color := rtfNotes.SelAttributes.Color; + mnuBold.Checked := fsBold in rtfNotes.SelAttributes.Style; + mnuItalic.Checked := fsItalic in rtfNotes.SelAttributes.Style; + mnuUnderline.Checked := fsUnderline in rtfNotes.SelAttributes.Style; +end; + +procedure TfrmMain.mnuBoldClick(Sender: TObject); +begin + if fsBold in rtfNotes.SelAttributes.Style then + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style - [fsBold] + else + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style + [fsBold]; +end; + +procedure TfrmMain.mnuItalicClick(Sender: TObject); +begin + if fsItalic in rtfNotes.SelAttributes.Style then + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style - [fsItalic] + else + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style + [fsItalic]; +end; + +procedure TfrmMain.mnuUnderlineClick(Sender: TObject); +begin + if fsUnderline in rtfNotes.SelAttributes.Style then + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style - [fsUnderline] + else + rtfNotes.SelAttributes.Style := rtfNotes.SelAttributes.Style + [fsUnderline]; +end; + +procedure TfrmMain.rtfNotesMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + UpdateNotes; +end; + +procedure TfrmMain.rtfNotesKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + UpdateNotes; +end; + +{ <- Notes - Code-Explorer -> } + +procedure TfrmMain.trvExplorerCollapsed(Sender: TObject; Node: TTreeNode); +begin + Node.ImageIndex := 42; + Node.SelectedIndex := 42; +end; + +procedure TfrmMain.trvExplorerExpanded(Sender: TObject; Node: TTreeNode); +begin + Node.ImageIndex := 43; + Node.SelectedIndex := 43; +end; + +{ <- Code Explorer } + +procedure TfrmMain.mnuSettingsClick(Sender: TObject); +var i: integer; + eModified: Boolean; +begin + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\PAWN.csl'), PChar(ExtractFilePath(ParamStr(0)) + 'config\PAWN.bak'), False); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\C++.csl'), PChar(ExtractFilePath(ParamStr(0)) + 'config\C++.bak'), False); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\Other.csl'), PChar(ExtractFilePath(ParamStr(0)) + 'config\Other.bak'), False); + eModified := ActiveDoc.Modified; + + if frmSettings.ShowModal = mrOk then begin + { Shortcuts } + for i := 0 to frmSettings.lvShortcuts.Items.Count - 1 do + TSciKeyCommand(frmSettings.lvShortcuts.Items[i].Data).ShortCut := ShortcutToSciKey(TextToShortCut(frmSettings.lvShortcuts.Items[i].SubItems[0])); + { Tools } + if frmSettings.chkIndentGuides.Checked then + sciEditor.Indentation := sciEditor.Indentation + [IndentationGuides] + else + sciEditor.Indentation := sciEditor.Indentation - [IndentationGuides]; + sciEditor.BraceHilite := frmSettings.chkHighlightBraces.Checked; + sciEditor.ClearUndoAfterSave := frmSettings.chkClearUndoAfterSave.Checked; + sciEditor.AutoCloseBraces := frmSettings.chkAutoCloseBraces.Checked; + sciEditor.AutoCloseQuotes := frmSettings.chkAutoCloseQuotes.Checked; + if frmSettings.chkWordWrap.Checked then + sciEditor.WordWrap := sciWrap + else + sciEditor.WordWrap := sciNoWrap; + + case frmSettings.cboCodeFolding.ItemIndex of + 0: sciEditor.FoldMarkerType := sciMarkArrows; + 1: sciEditor.FoldMarkerType := sciMarkBox; + 2: sciEditor.FoldMarkerType := sciMarkCircle; + 3: sciEditor.FoldMarkerType := sciMarkPlusMinus; + end; + if frmSettings.cboCodeFolding.ItemIndex = 4 then + sciEditor.Folding := sciEditor.Folding - [foldFold] + else + sciEditor.Folding := sciEditor.Folding + [foldFold]; + + sciEditor.Caret.ForeColor := frmSettings.CaretFore; + sciEditor.Caret.LineBackColor := frmSettings.CaretBack; + sciEditor.Caret.LineVisible := frmSettings.chkShowCaret.Checked; + sciEditor.Caret.Period := StrToInt(frmSettings.txtPeriod.Text); + eConfig.WriteBool('Editor', 'Auto-Indent', frmSettings.chkAutoIndent.Checked); + eConfig.WriteBool('Editor', 'IndentOpeningBrace', frmAutoIndent.chkIndentOpeningBrace.Checked); + eConfig.WriteBool('Editor', 'UnindentClosingBrace', frmAutoIndent.chkUnindentPressingClosingBrace.Checked); + eConfig.WriteBool('Editor', 'UnindentEmptyLine', frmAutoIndent.chkUnindentLine.Checked); + { Editor } + eConfig.WriteBool('Editor', 'LimitCaretRestore', frmSettings.chkRestoreCaret.Checked); + eConfig.WriteString('Editor', 'LimitCaretRestoreVal', frmSettings.txtLines.Text); + if FileExists(sciPropertyLoader.FileName) then + sciPropertyLoader.Save; + { Compiler } + eConfig.WriteString('Pawn-Compiler', 'Path', frmSettings.txtPAWNCompilerPath.Text); + eConfig.WriteString('Pawn-Compiler', 'Args', frmSettings.txtPAWNArgs.Text); + eConfig.WriteString('Pawn-Compiler', 'DefaultOutput', frmSettings.txtPAWNOutput.Text); + eConfig.WriteString('CPP-Compiler', 'Path', frmSettings.txtCPPCompilerPath.Text); + eConfig.WriteString('CPP-Compiler', 'Args', frmSettings.txtCPPCompilerArguments.Text); + eConfig.WriteString('CPP-Compiler', 'DefaultOutput', frmSettings.txtCPPOutput.Text); + { HL } + eConfig.WriteString('Half-Life', 'Filename', frmSettings.txtHLExec.Text); + eConfig.WriteString('Half-Life', 'Params', frmSettings.txtCustomParameters.Text); + eConfig.WriteString('Half-Life', 'AMXXListen', frmSettings.txtAMXXDir.Text); + { FTP Settings } + eConfig.WriteString('FTP', 'Host', frmSettings.txtHost.Text); + eConfig.WriteString('FTP', 'Port', frmSettings.txtPort.Text); + eConfig.WriteString('FTP', 'Username', frmSettings.txtUsername.Text); + eConfig.WriteString('FTP', 'Password', frmSettings.txtPassword.Text); + eConfig.WriteString('FTP', 'DefaultDir', frmSettings.txtDefaultDir.Text); + eConfig.WriteBool('FTP', 'Passive', frmSettings.chkPassive.Checked); + { FTP Proxy } + eConfig.WriteInteger('Proxy', 'ProxyType', frmSettings.cboProxy.ItemIndex); + eConfig.WriteString('Proxy', 'Host', frmSettings.txtProxyHost.Text); + eConfig.WriteString('Proxy', 'Port', frmSettings.txtProxyPort.Text); + eConfig.WriteString('Proxy', 'Username', frmSettings.txtUsername.Text); + eConfig.WriteString('Proxy', 'Password', frmSettings.txtProxyPassword.Text); + { Misc } + eConfig.WriteString('Misc', 'DefaultPluginName', frmSettings.txtDefaultName.Text); + eConfig.WriteString('Misc', 'DefaultPluginVersion', frmSettings.txtDefaultVersion.Text); + eConfig.WriteString('Misc', 'DefaultPluginAuthor', frmSettings.txtDefaultAuthor.Text); + if frmSettings.optFileComment.Checked then + eConfig.WriteInteger('Misc', 'SaveNotesTo', 0) + else if frmSettings.optConfig.Checked then + eConfig.WriteInteger('Misc', 'SaveNotesTo', 1) + else + eConfig.WriteInteger('Misc', 'SaveNotesTo', 3); + eConfig.WriteInteger('Misc', 'CPUSpeed', frmSettings.sldSpeed.Value); + eConfig.WriteBool('Misc', 'ShowStatusbar', frmSettings.chkShowStatusbar.Checked); + end + else begin + { Restore Code-Snippets } + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\PAWN.csl'); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\C++.csl'); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\Other.csl'); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\PAWN.bak'), PChar(ExtractFilePath(ParamStr(0)) + 'config\PAWN.csl'), False); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\C++.bak'), PChar(ExtractFilePath(ParamStr(0)) + 'config\C++.csl'), False); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\Other.bak'), PChar(ExtractFilePath(ParamStr(0)) + 'config\Other.csl'), False); + end; + + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\PAWN.bak'); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\C++.bak'); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'config\Other.bak'); + + if FileExists(sciPropertyLoader.FileName) then + sciPropertyLoader.Load; + ReloadIni; + + sciEditor.Modified := eModified; + ActiveDoc.Modified := eModified; + if eModified then + mnuModified.Caption := lModified + else + mnuModified.Caption := ''; + + sciEditor.Gutter1.MarginType := gutLineNumber; + sciEditor.Gutter1.Width := 40; +end; + +{ Change Tab -> } + +procedure TfrmMain.tsMainActiveTabChange(Sender: TObject; + ItemIndex: Integer); +begin + if (not Started) or (frmMain.pnlLoading.Visible) then exit; + + if (lstOutput.Visible) then begin + if Plugin_VisibleControlChange(CTRL_OUTPUT, False) then begin + splOutput.Hide; + lstOutput.Hide; + Plugin_VisibleControlChange(CTRL_OUTPUT, False); + end; + end; + + case tsMain.ActiveTabIndex of + 0: begin + mnuTNew.Caption := 'New Plugin'; + end; + 1: begin + mnuTNew.Caption := 'New Unit'; + sciCallTips.ApiStrings.Clear; + sciAutoComplete.AStrings.Clear; + end; + 2: begin + mnuTNew.Caption := 'New Textfile'; + sciCallTips.ApiStrings.Clear; + sciAutoComplete.AStrings.Clear; + end; + end; + ActivateProjects(ItemIndex, True); + + trvExplorer.Items.Clear; + FillCodeExplorer(GetCurrLang.Name); +end; + +procedure TfrmMain.tsDocumentsActiveTabChange(Sender: TObject; + ItemIndex: Integer); +var Collection: TDocCollection; +begin + if (not Started) or (pnlLoading.Visible) then exit; + + if (lstOutput.Visible) then begin + if Plugin_VisibleControlChange(CTRL_OUTPUT, False) then begin + splOutput.Hide; + lstOutput.Hide; + Plugin_VisibleControlChange(CTRL_OUTPUT, False); + end; + end; + + case tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; // PAWN + 1: Collection := CPPProjects; // C++ + else Collection := OtherProjects; // Other + end; + Collection.Activate(ItemIndex, True); +end; + +{ <- Change Tab | Settings -> } + +procedure TfrmMain.FormShow(Sender: TObject); +begin + if (Screen.Cursor = crDefault) and (not pnlLoading.Visible) then begin + Started := True; + TCodeExplorerUpdater.Create(False); + ReloadIni; + end; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin +end; + +{ <- Settings | Toolbars -> } + +procedure TfrmMain.mnuTOpenClick(Sender: TObject); +begin + mnuOpen.Click; +end; + +procedure TfrmMain.mnuTSaveClick(Sender: TObject); +begin + mnuSave.Click; +end; + +procedure TfrmMain.mnuTSearchClick(Sender: TObject); +begin + mnuSearch.Click; +end; + +procedure TfrmMain.mnuTCompileClick(Sender: TObject); +begin + mnuDoCompile.Click; +end; + +procedure TfrmMain.mnuTUndoClick(Sender: TObject); +begin + mnuUndo.Click; +end; + +procedure TfrmMain.mnuTRedoClick(Sender: TObject); +begin + mnuRedo.Click; +end; + +procedure TfrmMain.mnuTCopyClick(Sender: TObject); +begin + mnuCopy.Click; +end; + +procedure TfrmMain.mnuTCutClick(Sender: TObject); +begin + mnuCut.Click; +end; + +procedure TfrmMain.mnuTPasteClick(Sender: TObject); +begin + mnuPaste.Click; +end; + +procedure TfrmMain.mnuTSelectAllClick(Sender: TObject); +begin + mnuSelectAll.Click; +end; + +procedure TfrmMain.mnuEmptyPluginClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_PAWN_EMPTYPLUGIN, True) then exit; + + if tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + + PAWNProjects.Activate(PAWNProjects.Add(''), True); + Plugin_CreateNewFile(NEW_PAWN_EMPTYPLUGIN, False); +end; + +procedure TfrmMain.mnuNewPluginClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_PAWN_PLUGIN, True) then exit; + + if tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + + PAWNProjects.Activate(PAWNProjects.Add(''), False); + sciEditor.Lines.Add('/* Plugin generated by AMXX-Studio */'); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('#include '); + sciEditor.Lines.Add('#include '); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('#define PLUGIN "' + eConfig.ReadString('Misc', 'DefaultPluginName', 'New Plugin') + '"'); + sciEditor.Lines.Add('#define VERSION "' + eConfig.ReadString('Misc', 'DefaultPluginVersion', '1.0') + '"'); + sciEditor.Lines.Add('#define AUTHOR "' + eConfig.ReadString('Misc', 'DefaultPluginAuthor', 'Your name') + '"'); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('public plugin_init() {'); + sciEditor.Lines.Add(' register_plugin(PLUGIN, VERSION, AUTHOR)'); + sciEditor.Lines.Add(' '); + sciEditor.Lines.Add(' // Add your code here...'); + sciEditor.Lines.Add('}'); + + Plugin_CreateNewFile(NEW_PAWN_PLUGIN, False); +end; + +procedure TfrmMain.mnuHXMLClick(Sender: TObject); +begin + SelectLanguage((Sender As TSpTBXItem).Caption); +end; + +procedure TfrmMain.mnuHNoneClick(Sender: TObject); +begin + SelectLanguage('null'); +end; + +procedure TfrmMain.mnuOpenClick(Sender: TObject); +var eExt: String; +begin + if odOpen.Execute then begin + eExt := ExtractFileExt(odOpen.FileName); + eExt := LowerCase(eExt); + if (eExt = '.sma') or (eExt = '.inc') then begin // Pawn files + if tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + PAWNProjects.Open(odOpen.FileName); + end + else if (eExt = '.cpp') or (eExt = '.h') then begin // C++ files + if not eCPP then + MessageBox(Handle, PChar(lNoCPP), PChar(Application.Title), MB_ICONWARNING) + else begin + if tsMain.ActiveTabIndex <> 1 then + ActivateProjects(1, False); + CPPProjects.Open(odOpen.FileName); + end; + end + else if (eExt = '.htm') or (eExt = '.html') then begin // HTML files + if tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + OtherProjects.Open(odOpen.FileName, 'HTML'); + end + else if (eExt = '.sql') then begin // SQL databases + if tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + OtherProjects.Open(odOpen.FileName, 'SQL'); + end + else if (eExt = '.xml') then begin // XML files + if tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + OtherProjects.Open(odOpen.FileName, 'XML'); + end + else begin // Other files and/or Textfiles + if tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + OtherProjects.Open(odOpen.FileName, 'null'); + end; + end; +end; + +procedure TfrmMain.mnuNewTextfileClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_OTHER_TEXTFILE, True) then exit; + + if tsMain.ActiveTabIndex <> 2 then + ActivateProjects(2, False); + + OtherProjects.Activate(OtherProjects.Add(''), True); + + Plugin_CreateNewFile(NEW_OTHER_TEXTFILE, False); +end; + +procedure TfrmMain.mnuNewHTMLClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_OTHER_HTML, True) then exit; + + if tsMain.ActiveTabIndex <> 2 then + ActivateProjects(2, False); + + OtherProjects.Activate(OtherProjects.Add('', 'HTML'), True); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add(#9''); + sciEditor.Lines.Add(#9#9'Your Title'); + sciEditor.Lines.Add(#9''); + sciEditor.Lines.Add(#9''); + sciEditor.Lines.Add(#9#9'<-- Your text here -->'); + sciEditor.Lines.Add(#9''); + sciEditor.Lines.Add(''); + + Plugin_CreateNewFile(NEW_OTHER_HTML, False); +end; + +procedure TfrmMain.mnuNewSQLClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_OTHER_SQL, True) then exit; + + if tsMain.ActiveTabIndex <> 2 then + ActivateProjects(2, False); + + OtherProjects.Activate(OtherProjects.Add('', 'SQL'), True); + + Plugin_CreateNewFile(NEW_OTHER_SQL, False); +end; + +procedure TfrmMain.mnuNewXMLClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_OTHER_XML, True) then exit; + + if tsMain.ActiveTabIndex <> 2 then + ActivateProjects(2, False); + + OtherProjects.Activate(OtherProjects.Add('', 'XML'), True); + + Plugin_CreateNewFile(NEW_OTHER_XML, False); +end; + +procedure TfrmMain.mnuUndoClick(Sender: TObject); +begin + sciEditor.Undo; +end; + +procedure TfrmMain.mnuSaveClick(Sender: TObject); +begin + if ActiveDoc.Untitled then + mnuSaveAs.Click + else begin + ActiveDoc.Save; + mnuModified.Caption := ''; + end; +end; + +procedure TfrmMain.mnuSaveAsClick(Sender: TObject); +begin + if sdSave.Execute then begin + ActiveDoc.FileName := AddExtension(sdSave.FileName, ActiveDoc.Highlighter); + ActiveDoc.Save; + // Don't know why tsDocuments.Items[0].Caption := '???'; not works, but this works: + TSpTBXTabItem(tsDocuments.Items[ActiveDoc.Index]).Caption := ActiveDoc.Title; + end; +end; + +procedure TfrmMain.mnuThemesClick(Sender: TObject); +begin + if Started then + eConfig.WriteString('Misc', 'Theme', TBXCurrentTheme); + Plugin_ThemeChange(TBXCurrentTheme); +end; + +procedure TfrmMain.mnuInfoClick(Sender: TObject); +begin + if Plugin_ShowHelp(HELP_ABOUT) then + frmInfo.ShowModal; +end; + +procedure TfrmMain.mnuRedoClick(Sender: TObject); +begin + sciEditor.Redo; +end; + +procedure TfrmMain.mnuCutClick(Sender: TObject); +begin + sciEditor.Cut; +end; + +procedure TfrmMain.mnuCopyClick(Sender: TObject); +begin + sciEditor.Copy; +end; + +procedure TfrmMain.mnuPasteClick(Sender: TObject); +begin + sciEditor.Paste; +end; + +procedure TfrmMain.mnuSelectAllClick(Sender: TObject); +begin + sciEditor.SelectAll; +end; + +procedure TfrmMain.mnuCloseClick(Sender: TObject); +begin + CloseDocument(ActiveDoc); +end; + +procedure TfrmMain.mnuShowCodeToolsClick(Sender: TObject); +begin + if not Plugin_VisibleControlChange(CTRL_CODETOOLS_MAIN, not tcTools.Visible) then exit; + + tcTools.Visible := (Sender As TSpTBXItem).Checked; + splRight.Visible := (Sender As TSpTBXItem).Checked; + mnuShowCodeTools.Checked := (Sender As TSpTBXItem).Checked; + mnuShowCodeToolsWindow.Checked := (Sender As TSpTBXItem).Checked; + Application.ProcessMessages; + + Plugin_VisibleControlChange(CTRL_CODETOOLS_MAIN, tcTools.Visible); +end; + +procedure TfrmMain.sciEditorClick(Sender: TObject); +begin + mnuCaret.Caption := Format(lLnCh, [sciEditor.GetCurrentLineNumber +1, sciEditor.GetCaretInLine +1]); + Plugin_EditorClick(False); + Plugin_UpdateSel(sciEditor.SelStart, sciEditor.SelLength, sciEditor.GetFirstVisibleLine); +end; + +procedure TfrmMain.sciEditorKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +var i: integer; +begin + mnuCaret.Caption := Format(lLnCh, [sciEditor.GetCurrentLineNumber +1, sciEditor.GetCaretInLine +1]); + Plugin_UpdateSel(sciEditor.SelStart, sciEditor.SelLength, sciEditor.GetFirstVisibleLine); + + if Key = 46 then begin + mnuModified.Caption := lModified; + ActiveDoc.Modified := True; + end; + + if sciEditor.Caret.LineVisible <> frmSettings.chkShowCaret.Checked then + sciEditor.Caret.LineVisible := frmSettings.chkShowCaret.Checked; + if sciEditor.Caret.LineBackColor <> frmSettings.CaretBack then begin + sciEditor.Caret.LineBackColor := frmSettings.CaretBack; + sciEditor.Colors.SelBack := clHighlight; + + i := sciEditor.SelLength; + sciEditor.SelLength := 0; + sciEditor.SelStart := sciEditor.SelStart +i; + end; +end; + +procedure TfrmMain.sciEditorKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); +var eStr: String; +begin + if not Started then exit; + + mnuCaret.Caption := Format(lLnCh, [sciEditor.GetCurrentLineNumber +1, sciEditor.GetCaretInLine +1]); + Plugin_UpdateSel(sciEditor.SelStart, sciEditor.SelLength, sciEditor.GetFirstVisibleLine); + + if (Key = 13) and (frmSettings.chkAutoIndent.Checked) and (Trim(sciEditor.Lines[sciEditor.GetCurrentLineNumber]) = '') then begin + if (sciEditor.LanguageManager.SelectedLanguage = 'Pawn') or (sciEditor.LanguageManager.SelectedLanguage = 'C++') then begin + eStr := Trim(RemoveStringsAndComments(sciEditor.Lines[sciEditor.GetCurrentLineNumber -1], True)); + if (Copy(eStr, Length(eStr), 1) = '{') and (frmAutoIndent.chkIndentOpeningBrace.Checked) then + sciEditor.SelText := #9; + if (eStr = '') and (frmAutoIndent.chkUnindentLine.Checked) then begin + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := Copy(sciEditor.Lines[sciEditor.GetCurrentLineNumber], 1, Length(sciEditor.Lines[sciEditor.GetCurrentLineNumber]) -1); // remove last indent.. + sciEditor.SelStart := sciEditor.SelStart + Length(sciEditor.Lines[sciEditor.GetCurrentLineNumber]); // and jump to last position + end; + end; + end; + + Application.ProcessMessages; + UpdateCI; +end; + +procedure TfrmMain.mnuFoldAllClick(Sender: TObject); +begin + Screen.Cursor := crHourGlass; + sciEditor.FoldAll; + Screen.Cursor := crDefault; +end; + +procedure TfrmMain.tbxToolbarVisibleChanged(Sender: TObject); +begin + mnuShowFileTB.Checked := tbxToolbar.Visible; +end; + +procedure TfrmMain.mnuShowFileTBClick(Sender: TObject); +begin + tbxToolbar.Visible := mnuShowFileTB.Checked; +end; + +procedure TfrmMain.tbxEditVisibleChanged(Sender: TObject); +begin + mnuShowEditTB.Checked := tbxEdit.Visible; +end; + +procedure TfrmMain.mnuShowEditTBClick(Sender: TObject); +begin + tbxEdit.Visible := mnuShowEditTB.Checked; +end; + +procedure TfrmMain.tbxCodeSnippetsVisibleChanged(Sender: TObject); +begin + mnuShowCodeSnippets.Checked := tbxCodeSnippets.Visible; +end; + +procedure TfrmMain.mnuShowCodeSnippetsClick(Sender: TObject); +begin + tbxCodeSnippets.Visible := mnuShowCodeSnippets.Checked; +end; + +procedure TfrmMain.OnCodeSnippetClick(Sender: TObject); +function GetCat: String; +begin + if mnuPAWN.Checked then + Result := 'Pawn' + else if mnuCPP.Checked then + Result := 'C++' + else if mnuHTML.Checked then + Result := 'HTML' + else + Result := 'Other'; +end; + +begin + if Plugin_CodeSnippetClick(TSpTBXItem(Sender).Caption, GetCat, GetSnippet(GetCat, (Sender As TSpTBXItem).Caption)) then + sciEditor.SelText := GetSnippet('Pawn', (Sender As TSpTBXItem).Caption); +end; + +procedure TfrmMain.mnuCopyMessageClick(Sender: TObject); +begin + if lstOutput.ItemIndex <> -1 then + Clipboard.SetTextBuf(PChar(lstOutput.Items[lstOutput.ItemIndex])); +end; + +procedure TfrmMain.mnuCopyAllClick(Sender: TObject); +begin + Clipboard.SetTextBuf(PChar(lstOutput.Items.Text)); +end; + +procedure TfrmMain.mnuSaveToFileClick(Sender: TObject); +begin + sdSave.FilterIndex := 7; + if sdSave.Execute then + lstOutput.Items.SaveToFile(sdSave.FileName); +end; + +procedure TfrmMain.ppmOutputInitPopup(Sender: TObject; PopupView: TTBView); +begin + mnuCopyMessage.Enabled := lstOutput.ItemIndex <> -1; +end; + +procedure TfrmMain.mnuSearchForumsClick(Sender: TObject); +begin + if Plugin_ShowHelp(HELP_SEARCH) then + ShellExecute(Handle, 'open', 'http://www.amxmodx.org/forums/search.php', nil, nil, SW_SHOW); +end; + +procedure TfrmMain.mnuOpenScriptingForumClick(Sender: TObject); +begin + if Plugin_ShowHelp(HELP_FORUMS) then + ShellExecute(Handle, 'open', 'http://www.amxmodx.org/forums/viewforum.php?f=8', nil, nil, SW_SHOW); +end; + +procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if (Shift = [ssCtrl, ssShift]) then begin + if Key = 16 then + Key := 0; + end; +end; + +procedure TfrmMain.acControlCharHandler(Sender: TObject); +function TriggerMenuShortcut(eShortcut: TShortcut; Item: TTBCustomItem): Boolean; +var i: integer; +begin + Result := False; + for i := 0 to Item.Count -1 do begin + if Item.Items[i].ShortCut = eShortcut then begin + Item.Items[i].OnClick(Self); + Result := True; + exit; + end + else + TriggerMenuShortcut(eShortcut, Item.Items[i]); + end; +end; + +var i: integer; +begin + Application.ProcessMessages; + // stop IRC Paster if escape is pressed + if ShortCutToText((Sender As TAction).ShortCut) = 'Esc' then + IRCPasterStop := True; + if sciEditor.CallTipActive then + sciEditor.CallTipCancel; + if sciEditor.AutoCActive then + sciEditor.AutoCCancel; + // Some menu commands are suppressed by the controlchars thingy, so they will be triggered manually + for i := 0 to tbxMenu.Items.Count -1 do begin + if TriggerMenuShortcut((Sender As TAction).ShortCut, tbxMenu.Items[i]) then + exit; + end; + Application.ProcessMessages; +end; + +procedure TfrmMain.mnuEditorUndoClick(Sender: TObject); +begin + mnuUndo.Click; +end; + +procedure TfrmMain.mnuEditorRedoClick(Sender: TObject); +begin + mnuRedo.Click; +end; + +procedure TfrmMain.mnuEditorCopyClick(Sender: TObject); +begin + mnuCopy.Click; +end; + +procedure TfrmMain.mnuEditorCutClick(Sender: TObject); +begin + mnuCut.Click; +end; + +procedure TfrmMain.mnuEditorPasteClick(Sender: TObject); +begin + mnuPaste.Click; +end; + +procedure TfrmMain.mnuToogleBookmarkClick(Sender: TObject); +begin + sciEditor.BookmarkToggle(sciEditor.GetCurrentLineNumber); +end; + +procedure TfrmMain.mnuEditorDeleteClick(Sender: TObject); +begin + sciEditor.Clear; +end; + +procedure TfrmMain.mnuEditorSelectAllClick(Sender: TObject); +begin + sciEditor.SelectAll; +end; + +procedure TfrmMain.mnuGoToBookmarkClick(Sender: TObject); +begin + sciEditor.BookmarkNext; +end; + +procedure TfrmMain.mnuSearchDialogClick(Sender: TObject); +begin + Plugin_Search(frmSearch.cboSearchFor.Items.Text, frmSearch.cboSearchFor.Text, True, False); + if frmSearch.ShowModal = mrOk then begin + if not Plugin_Search(frmSearch.cboSearchFor.Items.Text, frmSearch.cboSearchFor.Text, False, False) then + exit; + + with sciSearchReplace do begin + SearchBackwards := frmSearch.chkBackward.Checked; + SearchCaseSensitive := frmSearch.chkCaseSensivity.Checked; + SearchFromCaret := frmSearch.chkSearchFromCaret.Checked; + SearchSelectionOnly := frmSearch.chkSelectedTextOnly.Checked; + SearchWholeWords := frmSearch.chkWholeWordsOnly.Checked; + SearchRegex := frmSearch.chkRegularExpression.Checked; + SearchText := frmSearch.cboSearchFor.Text; + Screen.Cursor := crHourGlass; + DoSearchReplaceText(False, frmSearch.chkBackward.Checked); + Screen.Cursor := crDefault; + end; + end; +end; + +procedure TfrmMain.mnuReplaceClick(Sender: TObject); +var Stop: Boolean; +begin + if frmReplace.ShowModal = mrOk then begin + if not Plugin_SearchReplace(frmReplace.cboSearchFor.Text, frmReplace.cboReplaceWith.Text, frmReplace.cboSearchFor.Items.Text, frmReplace.cboReplaceWith.Items.Text, frmSearch.chkCaseSensivity.Checked, frmSearch.chkWholeWordsOnly.Checked, frmSearch.chkSearchFromCaret.Checked, frmSearch.chkSelectedTextOnly.Checked, frmSearch.chkRegularExpression.Checked, frmSearch.chkForward.Checked) then + exit; + with sciSearchReplace do begin + SearchBackwards := frmReplace.chkBackward.Checked; + SearchCaseSensitive := frmReplace.chkCaseSensivity.Checked; + SearchFromCaret := frmReplace.chkSearchFromCaret.Checked; + SearchSelectionOnly := frmReplace.chkSelectedTextOnly.Checked; + SearchWholeWords := frmReplace.chkWholeWordsOnly.Checked; + SearchRegex := frmReplace.chkRegularExpression.Checked; + SearchText := frmReplace.cboSearchFor.Text; + + Stop := False; + Screen.Cursor := crHourGlass; + repeat + DoSearchReplaceText(False, frmReplace.chkBackward.Checked); + if sciEditor.SelLength = 0 then + Stop := True + else + sciEditor.SelText := frmReplace.cboReplaceWith.Text; + until (not frmReplace.chkReplaceAll.Checked) or (Stop); + Screen.Cursor := crDefault; + end; + end; +end; + +procedure TfrmMain.mnuSearchAgainClick(Sender: TObject); +begin + if not Plugin_Search(frmSearch.cboSearchFor.Items.Text, frmSearch.cboSearchFor.Text, False, True) then + exit; + + sciSearchReplace.SearchText := frmSearch.cboSearchFor.Text; + sciSearchReplace.SearchFromCaret := True; + Screen.Cursor := crHourGlass; + sciSearchReplace.DoSearchReplaceText(False, frmSearch.chkBackward.Checked); + Screen.Cursor := crDefault; +end; + +procedure TfrmMain.mnuGoToLineClick(Sender: TObject); +begin + if frmGoToLine.ShowModal = mrOk then begin + sciEditor.GotoLineEnsureVisible(StrToInt(frmGoToLine.txtGoToLine.Text) -1); + UpdateCI; + end; +end; + +procedure TfrmMain.mnuPrintClick(Sender: TObject); +begin + sciPrinter.Title := ExtractFileName(ActiveDoc.FileName); + sciPrinter.PrintRange := prAllPages; + if sciEditor.SelLength <> 0 then begin + case MessageBox(Handle, PChar(lPrintSelection), PChar(Application.Title), MB_ICONQUESTION + MB_YESNOCANCEL) of + mrYes: sciPrinter.PrintRange := prSelection; + mrCancel: exit; + end; + end; + sciPrinter.Print; +end; + +procedure TfrmMain.mnuSaveAllFilesClick(Sender: TObject); +var a,b: integer; + Collection: TDocCollection; +begin + case tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; + 1: Collection := CPPProjects; + else Collection := OtherProjects; + end; + + frmAllFilesForm.Caption := lSaveAllCaption1; + frmAllFilesForm.lblCaption.Caption := lSaveAllCaption2; + + frmAllFilesForm.lstFiles.Clear; + for a := 0 to Collection.Count -1 do begin + if TDocument(Collection.Items[a]).Modified then + frmAllFilesForm.lstFiles.Checked[frmAllFilesForm.lstFiles.Items.AddObject(IntToStr(a +1) + ') ' + ExtractFileName(TDocument(Collection.Items[a]).FileName), TObject(a))] := True; + end; + + if frmAllFilesForm.lstFiles.Items.Count = 0 then begin + MessageBox(Handle, PChar(lNoFilesToSave), PChar(Application.Title), MB_ICONINFORMATION); + exit; + end; + + if frmAllFilesForm.ShowModal = mrOk then begin + for a := 0 to frmAllFilesForm.lstFiles.Items.Count -1 do begin + if frmAllFilesForm.lstFiles.Checked[a] then begin + b := Integer(frmAllFilesForm.lstFiles.Items.Objects[a]); + if TDocument(Collection.Items[b]).Untitled then begin + if sdSave.Execute then begin + TDocument(Collection.Items[b]).FileName := AddExtension(sdSave.FileName, TDocument(Collection.Items[b]).Highlighter); + TDocument(Collection.Items[b]).Save; + TSpTBXTabItem(tsDocuments.Items[b]).Caption := TDocument(Collection.Items[b]).Title; + end + else + exit; + end + else + TDocument(Collection.Items[b]).Save; + if ActiveDoc = Collection.Items[b] then + mnuModified.Caption := ''; + end; + end; + end; +end; + +procedure TfrmMain.sciEditorKeyPress(Sender: TObject; var Key: Char); +begin + if Started then begin + if not Plugin_KeyPress(Key) then + exit; + + mnuModified.Caption := lModified; + ActiveDoc.Modified := True; + + if (Key = '}') and (frmSettings.chkAutoIndent.Checked) then begin + if (Trim(sciEditor.Lines[sciEditor.GetCurrentLineNumber]) = '') and (frmAutoIndent.chkUnindentPressingClosingBrace.Checked) then begin + if (sciEditor.LanguageManager.SelectedLanguage = 'Pawn') or (sciEditor.LanguageManager.SelectedLanguage = 'C++') then begin + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := Copy(sciEditor.Lines[sciEditor.GetCurrentLineNumber], 1, Length(sciEditor.Lines[sciEditor.GetCurrentLineNumber]) -1); // remove last indent.. + sciEditor.SelStart := sciEditor.SelStart + Length(sciEditor.Lines[sciEditor.GetCurrentLineNumber]); // and jump to last position + end; + end; + end; + end; +end; + +procedure TfrmMain.mnuCloseAllFilesClick(Sender: TObject); +var i: integer; + Collection: TDocCollection; +begin + case tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; + 1: Collection := CPPProjects; + else Collection := OtherProjects; + end; + + frmAllFilesForm.Caption := lCloseAllCaption1; + frmAllFilesForm.lblCaption.Caption := lCloseAllCaption2; + + frmAllFilesForm.lstFiles.Clear; + for i := 0 to Collection.Count -1 do + frmAllFilesForm.lstFiles.Checked[frmAllFilesForm.lstFiles.Items.Add(IntToStr(i +1) + ') ' + ExtractFileName(TDocument(Collection.Items[i]).FileName))] := True; + + if frmAllFilesForm.ShowModal = mrOk then begin + for i := Collection.Count -1 downto 0 do begin + if not CloseDocument(TDocument(Collection.Items[i])) then + exit; + end; + end; +end; + +procedure TfrmMain.mnuIndenterClick(Sender: TObject); +begin + IndentCode; +end; + +procedure TfrmMain.mnuUnindenterClick(Sender: TObject); +begin + UnindentCode; +end; + +procedure TfrmMain.mnuPasterClick(Sender: TObject); +var i: integer; + eChannel: String; + eIsGamesurge: Boolean; +begin + if FindWindow('mirc', nil) = 0 then begin + MessageBox(Handle, PChar(lNoMIRCWindowOpen), PChar(Application.Title), MB_ICONERROR); + exit; + end; + + if sciEditor.Lines.Count > 35 then begin + if MessageBox(Handle, PChar(lWarnBigPluginPaste), PChar(Application.Title), MB_ICONWARNING + MB_YESNO) = mrNo then + exit; + end; + + if InputQuery(lSelectChannel, lSelectChannelPrompt, eChannel) then begin + if eChannel = '' then exit; + IRCPasterStop := False; + + Caption := 'AMXX-Studio - ' + lPastingCodeEscStop; + eISGamesurge := Pos('gamesurge', LowerCase(mIRCGet('mIRC', 'SERVER', 'SERVER'))) = 0; + for i := 0 to sciEditor.Lines.Count -1 do begin + if (FindWindow('mirc', nil) = 0) or (Application.Terminated) or (IRCPasterStop) then begin + Caption := 'AMXX-Studio'; + exit; + end; + + if (sciEditor.LanguageManager.SelectedLanguage = 'Pawn') or (sciEditor.LanguageManager.SelectedLanguage = 'C++') then + mIRCDDE('mIRC', 'COMMAND', '/msg ' + eChannel + #32 + StringReplace(GetColoredLine(i), '|', '$chr(124)', [rfReplaceAll])) + else + mIRCDDE('mIRC', 'COMMAND', '/msg ' + eChannel + #32 + StringReplace(sciEditor.Lines[i], ' | ', ' $chr(124) ', [rfReplaceAll])); + + if not eIsGamesurge then + Delay(2500) + else + Application.ProcessMessages; + end; + Caption := 'AMXX-Studio'; + end; +end; + +procedure TfrmMain.mnuPluginsIniEditorClick(Sender: TObject); +begin + frmPluginsIniEditor.txtFile.Clear; + + if FileExists(GetAMXXDir(True) + 'configs\plugins.ini') then + frmPluginsIniEditor.chkEditLocal.Click + else if (frmSettings.txtHost.Text <> '') and (frmPluginsIniEditor.chkEditFTP.Checked) then + frmPluginsIniEditor.chkEditFTP.Click + else + frmPluginsIniEditor.chkEditLocal.Click; + + if frmPluginsIniEditor.txtFile.Text = '' then exit; + + if frmPluginsIniEditor.ShowModal = mrOk then begin + Screen.Cursor := crHourGlass; + if frmPluginsIniEditor.chkEditFTP.Checked then begin + if not IdFTP.Connected then begin + if TryConnect <> 0 then + exit; + end; + + try + IdFTP.ChangeDir(frmSettings.txtDefaultDir.Text + 'configs/'); + except + IdFTP.Disconnect; + MessageBox(Handle, PChar(lInvalidDirectory), PChar(Application.Title), MB_ICONERROR); + Screen.Cursor := crDefault; + exit; + end; + + frmPluginsIniEditor.txtFile.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + IdFTP.TransferType := ftASCII; + IdFTP.Put(ExtractFilePath(ParamStr(0)) + 'plugins.ini', 'plugins.ini'); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + end + else + frmPluginsIniEditor.txtFile.Lines.SaveToFile(frmPluginsIniEditor.odOpen.FileName); + Screen.Cursor := crDefault; + end; +end; + +procedure TfrmMain.cmdCancelClick(Sender: TObject); +begin + Cancel := True; + HideProgress; + Screen.Cursor := crDefault; +end; + +procedure TfrmMain.mnuSocketTerminalClick(Sender: TObject); +begin + frmSocketsTerminal.ShowModal; +end; + +procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); +var i, k: integer; + eRoot: TTreeNode; + eItem: TDocument; + eSavedFiles: TStringList; +begin + ActiveDoc.Code.Text := sciEditor.Lines.Text; + frmClose.trvFiles.Items.Clear; + { PAWN Projects } + eRoot := frmClose.trvFiles.Items.Add(nil, tsMain.Items[0].Caption); + for i := 0 to PAWNProjects.Count -1 do begin + if TDocument(PAWNProjects.Items[i]).Modified then + frmClose.trvFiles.Items.AddChild(eRoot, IntToStr(i +1) + '. ' + ExtractFileName(TDocument(PAWNProjects.Items[i]).FileName)); + end; + if eRoot.Count = 0 then + eRoot.Free + else + eRoot.Expand(False); + { C++ Projects } + eRoot := frmClose.trvFiles.Items.Add(nil, tsMain.Items[1].Caption); + for i := 0 to CPPProjects.Count -1 do begin + if TDocument(CPPProjects.Items[i]).Modified then + frmClose.trvFiles.Items.AddChild(eRoot, IntToStr(i +1) + '. ' + ExtractFileName(TDocument(CPPProjects.Items[i]).FileName)); + end; + if eRoot.Count = 0 then + eRoot.Free + else + eRoot.Expand(False); + { Other Projects } + eRoot := frmClose.trvFiles.Items.Add(nil, tsMain.Items[1].Caption); + for i := 0 to OtherProjects.Count -1 do begin + if TDocument(OtherProjects.Items[i]).Modified then + frmClose.trvFiles.Items.AddChild(eRoot, IntToStr(i +1) + '. ' + ExtractFileName(TDocument(OtherProjects.Items[i]).FileName)); + end; + if eRoot.Count = 0 then + eRoot.Free + else + eRoot.Expand(False); + + eSavedFiles := TStringList.Create; + eSavedFiles.Clear; + for i := 0 to frmSettings.lvPlugins.Items.Count -1 do begin + if frmSettings.lvPlugins.Items[i].Data <> nil then + eSavedFiles.Add('LOADED ' + frmSettings.lvPlugins.Items[i].SubItems[0]) + else + eSavedFiles.Add('UNLOADED ' + frmSettings.lvPlugins.Items[i].SubItems[0]); + end; + eSavedFiles.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\Plugins.cfg'); + eSavedFiles.Clear; + + if frmClose.trvFiles.Items.Count <> 0 then begin + frmClose.cmdSave.Caption := lCloseCaption; + if (frmClose.ShowModal = mrOk) then begin + if frmClose.cmdSave.Caption = lSaveCaption then begin + for i := 0 to frmClose.trvFiles.Items.Count -1 do begin + { PAWN Projects } + if frmClose.trvFiles.Items[i].Text = tsMain.Items[0].Caption then begin + with frmClose.trvFiles.Items[i] do begin + for k := 0 to Count -1 do begin + if frmClose.trvFiles.Checked[Item[k]] then begin + eItem := TDocument(PAWNProjects.Items[StrToInt(Copy(Item[k].Text, 1, Pos('.', Item[k].Text) -1)) -1]); + // Process item here + if not eItem.Untitled then + eItem.Save + else begin + frmMain.sdSave.FilterIndex := 1; + if frmMain.sdSave.Execute then begin + eItem.FileName := AddExtension(frmMain.sdSave.FileName, eItem.Highlighter); + eItem.Save; + end + else begin + Action := caNone; + exit; + end; + end; + eSavedFiles.Add(eItem.FileName); + end; + end; + end; + end; + { C++ Projects } + if frmClose.trvFiles.Items[i].Text = tsMain.Items[1].Caption then begin + with frmClose.trvFiles.Items[i] do begin + for k := 0 to Count -1 do begin + if frmClose.trvFiles.Checked[Item[k]] then begin + eItem := TDocument(CPPProjects.Items[StrToInt(Copy(Item[k].Text, 1, Pos('.', Item[k].Text) -1)) -1]); + // Process item here + if not eItem.Untitled then + eItem.Save + else begin + frmMain.sdSave.FilterIndex := 2; + if frmMain.sdSave.Execute then begin + eItem.FileName := AddExtension(frmMain.sdSave.FileName, eItem.Highlighter); + eItem.Save; + end + else begin + Action := caNone; + exit; + end; + end; + eSavedFiles.Add(eItem.FileName); + end; + end; + end; + end; + { Other Projects } + if frmClose.trvFiles.Items[i].Text = tsMain.Items[2].Caption then begin + with frmClose.trvFiles.Items[i] do begin + for k := 0 to Count -1 do begin + if frmClose.trvFiles.Checked[Item[k]] then begin + eItem := TDocument(OtherProjects.Items[StrToInt(Copy(Item[k].Text, 1, Pos('.', Item[k].Text) -1)) -1]); + // Process item here + if not eItem.Untitled then + eItem.Save + else begin + frmMain.sdSave.FilterIndex := 0; + if frmMain.sdSave.Execute then begin + eItem.FileName := AddExtension(frmMain.sdSave.FileName, eItem.Highlighter); + eItem.Save; + end + else begin + Action := caNone; + exit; + end; + end; + eSavedFiles.Add(eItem.FileName); + end; + end; + end; + end; + end; + end; + Application.Terminate; + Started := False; + end + else begin + Action := caNone; + exit; + end; + end + else begin + Application.Terminate; + Started := False; + end; + + if eSavedFiles.Count = 0 then begin + for i := 0 to PAWNProjects.Count -1 do begin + if (not TDocument(PAWNProjects.Items[i]).Untitled) then + eSavedFiles.Add(TDocument(PAWNProjects.Items[i]).FileName); + end; + for i := 0 to CPPProjects.Count -1 do begin + if (not TDocument(CPPProjects.Items[i]).Untitled) then + eSavedFiles.Add(TDocument(CPPProjects.Items[i]).FileName); + end; + for i := 0 to OtherProjects.Count -1 do begin + if (not TDocument(OtherProjects.Items[i]).Untitled) then + eSavedFiles.Add(TDocument(OtherProjects.Items[i]).FileName); + end; + end; + eSavedFiles.SaveToFile(ExtractFilePath(ParamStr(0)) + 'config\Cache.cfg'); + eSavedFiles.Free; +end; + +procedure TfrmMain.trvExplorerDblClick(Sender: TObject); +begin + if Assigned(trvExplorer.Selected) then begin + if (trvExplorer.Selected.ImageIndex <> 42) and (trvExplorer.Selected.ImageIndex <> 43) then begin + sciEditor.GotoLineEnsureVisible(Integer(trvExplorer.Selected.Data)); + sciEditor.SetFocus; + UpdateCI; + end; + end; +end; + +procedure TfrmMain.tiPAWNClick(Sender: TObject); +begin + trvExplorer.Enabled := True; + jviCode.Enabled := True; + mnuGenerators.Visible := True; + mnuIndenter.Enabled := True; + mnuCompile.Visible := True; + mnuRegisterPluginsIniLocal.Enabled := True; + mnuRegisterPluginsIniWeb.Enabled := True; + UpdateCI; +end; + +procedure TfrmMain.tiCPPClick(Sender: TObject); +begin + trvExplorer.Enabled := False; + jviCode.Clear; + AddField('', 'This language is not supported.', ''); + jviCode.Enabled := False; + mnuGenerators.Visible := False; + mnuIndenter.Enabled := True; + mnuCompile.Visible := True; + mnuRegisterPluginsIniLocal.Enabled := False; + mnuRegisterPluginsIniWeb.Enabled := False; +end; + +procedure TfrmMain.tiOtherClick(Sender: TObject); +begin + trvExplorer.Enabled := False; + jviCode.Clear; + AddField('', 'This language is not supported.', ''); + jviCode.Enabled := False; + mnuGenerators.Visible := False; + mnuIndenter.Enabled := False; + mnuCompile.Visible := False; + mnuRegisterPluginsIniLocal.Enabled := False; + mnuRegisterPluginsIniWeb.Enabled := False; +end; + +procedure TfrmMain.mnuOpenHelpClick(Sender: TObject); +begin + if Plugin_ShowHelp(HELP_DEFAULT) then + ShellExecute(Handle, 'open', 'http://www.amxmodx.org/doc/', nil, nil, SW_SHOW); +end; + +procedure TfrmMain.mnuHudmessageClick(Sender: TObject); +function Dot(eIn: String): String; +begin + Result := StringReplace(eIn, ',', '.', [rfReplaceAll]); +end; + +var eStr: String; +begin + frmHudMsgGenerator.chkXCenter.Checked := False; + frmHudMsgGenerator.chkYCenter.Checked := False; + frmHudMsgGenerator.txtXPos.Text := '0,00'; + frmHudMsgGenerator.txtYPos.Text := '0,00'; + frmHudMsgGenerator.lblHudMsg.Left := 0; + frmHudMsgGenerator.lblHudMsg.Top := 0; + frmHudMsgGenerator.lblHudMsg.Font.Color := clRed; + frmHudMsgGenerator.txtText.Text := ''; + frmHudMsgGenerator.CurrColor := clRed; + + if frmHudMsgGenerator.ShowModal = mrOk then begin + eStr := Format(GetIndents + 'set_hudmessage(%u, %u, %u, %s, %s, 0, 6.0, %s)', [GetRValue(frmHudMsgGenerator.CurrColor), GetGValue(frmHudMsgGenerator.CurrColor), GetBValue(frmHudMsgGenerator.CurrColor), Dot(frmHudMsgGenerator.txtXPos.Text), Dot(frmHudMsgGenerator.txtYPos.Text), Dot(frmHudMsgGenerator.txtTimeToShow.Text)]); + eStr := eStr + #13#10 + GetIndents + 'show_hudmessage(id, "' + frmHudMsgGenerator.txtText.Text + '")'; + sciEditor.Lines.Insert(sciEditor.GetCurrentLineNumber, eStr); + end; +end; + +procedure TfrmMain.mnuDoCompileClick(Sender: TObject); +begin + if not Plugin_Compile(COMP_DEFAULT, GetCurrLang.Name, ActiveDoc.FileName, True) then + exit; + + if (LowerCase(ExtractFileExt(ActiveDoc.FileName)) = '.inc') or (LowerCase(ExtractFileExt(ActiveDoc.FileName)) = '.h') then exit; + + if tsMain.ActiveTabIndex = 0 then + DoCompilePAWN(COMP_DEFAULT) + else if (LowerCase(ExtractFileExt(ActiveDoc.FileName)) = '.htm') or (LowerCase(ExtractFileExt(ActiveDoc.FileName)) = '.html') then begin + if IEInstalled then + frmHTMLPreview.Show + else + MessageBox(Handle, PChar(lInternetExplorerRequired), PChar(Application.Title), MB_ICONINFORMATION); + end; +end; + +procedure TfrmMain.lstOutputMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var eItem: Integer; +begin + eItem := lstOutput.ItemAtPos(Point(X, Y), True); + if eItem = -1 then + lstOutput.Hint := '' + else begin + if (lstOutput.Hint <> lstOutput.Items[eItem]) and (Canvas.TextWidth(lstOutput.Items[eItem]) > lstOutput.Width) then + lstOutput.Hint := lstOutput.Items[eItem]; + end; +end; + +procedure TfrmMain.lstOutputDblClick(Sender: TObject); +var eLine: Integer; + eStr: String; +begin + if not Plugin_OutputDblClick(lstOutput.ItemIndex) then + exit; + + if (lstOutput.ItemIndex <> -1) then begin + eStr := lstOutput.Items[lstOutput.ItemIndex]; + while Pos(#32, eStr) <> 0 do + Delete(eStr, 1, 1); + if IsNumeric(eStr) then begin + eLine := StrToInt(eStr); + SetErrorLine(eLine); + end; + end; +end; + +procedure TfrmMain.lstOutputMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if (Button = mbRight) and (Plugin_OutputPopup(lstOutput.ItemIndex)) then begin + lstOutput.ItemIndex := lstOutput.ItemAtPos(Point(X, Y), True); + mnuCopyMessage.Enabled := lstOutput.ItemAtPos(Point(X, Y), True) <> -1; + ppmOutput.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); + end; +end; + +procedure TfrmMain.SetErrorLine(eLine: Integer); +begin + eLine := eLine -1; + sciEditor.SetFocus; + sciEditor.SelLength := 0; + sciEditor.GotoLineEnsureVisible(eLine); + sciEditor.SelLength := Length(sciEditor.Lines[eLine]); + sciEditor.Caret.LineVisible := True; + sciEditor.Caret.LineBackColor := clMaroon; + sciEditor.Colors.SelBack := clMaroon; + eErrorLine := eLine; +end; + +procedure TfrmMain.sciEditorMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var i: integer; +begin + if not Started then exit; + + if sciEditor.Caret.LineVisible <> frmSettings.chkShowCaret.Checked then + sciEditor.Caret.LineVisible := frmSettings.chkShowCaret.Checked; + if sciEditor.Caret.LineBackColor <> frmSettings.CaretBack then begin + sciEditor.Caret.LineBackColor := frmSettings.CaretBack; + sciEditor.Colors.SelBack := clHighlight; + + i := sciEditor.SelLength; + sciEditor.SelLength := 0; + sciEditor.SelStart := sciEditor.SelStart +i; + end; + UpdateCI; +end; + +procedure TfrmMain.lstOutputEnter(Sender: TObject); +var i: integer; +begin + if sciEditor.Caret.LineVisible <> frmSettings.chkShowCaret.Checked then + sciEditor.Caret.LineVisible := frmSettings.chkShowCaret.Checked; + if sciEditor.Caret.LineBackColor <> frmSettings.CaretBack then begin + sciEditor.Caret.LineBackColor := frmSettings.CaretBack; + sciEditor.Colors.SelBack := clHighlight; + + i := sciEditor.SelLength; + sciEditor.SelLength := 0; + sciEditor.SelStart := sciEditor.SelStart +i; + end; +end; + +procedure TfrmMain.mnuCompileAndStartHLClick(Sender: TObject); +begin + if not Plugin_Compile(COMP_STARTHL, GetCurrLang.Name, ActiveDoc.FileName, True) then + exit; + + if tsMain.ActiveTabIndex = 0 then + DoCompilePAWN(COMP_STARTHL); +end; + +procedure TfrmMain.mnuCompileAndUploadClick(Sender: TObject); +begin + if not Plugin_Compile(COMP_UPLOAD, GetCurrLang.Name, ActiveDoc.FileName, True) then + exit; + + if tsMain.ActiveTabIndex = 0 then + DoCompilePAWN(COMP_UPLOAD); +end; + +procedure TfrmMain.mnuRegisterPluginsIniLocalClick(Sender: TObject); +function RemComments(eLine: String): String; +var a, b: integer; +begin + if Length(eLine) > 0 then begin + b := 0; + for a := 1 to Length(eLine) -1 do begin + if (eLine[a] = ';') or (eLine[a] = '/') then begin + b := a; + break; + end; + end; + + if (b = 0) and (Pos(' debug', LowerCase(eLine)) <> 0) then + b := Pos(' debug', LowerCase(eLine)); + if b <> 0 then + eLine := Trim(Copy(eLine, 1, b -1)); + end; + Result := Trim(eLine); +end; + +var eStr: TStringList; + i: integer; + eFound: Boolean; +begin + if ActiveDoc.Untitled then begin + MessageBox(Handle, PChar(lNoUntitledRegister), PChar(Application.Title), MB_ICONINFORMATION); + exit; + end; + + if FileExists(GetAMXXDir(True) + 'configs\plugins.ini') then begin + eFound := False; + + eStr := TStringList.Create; + eStr.LoadFromFile(GetAMXXDir(True) + 'configs\plugins.ini'); + for i := 0 to eStr.Count -1 do begin + if (Copy(eStr[i], 1, 1) <> ';') and (Copy(eStr[i], 1, 2) <> '//') then begin + if LowerCase(RemComments(eStr[i])) = LowerCase(ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')) then begin + eFound := True; + break; + end; + end; + end; + + if eFound then + MessageBox(Handle, PChar(lAlreadyRegistered), PChar(Application.Title), MB_ICONINFORMATION) + else begin + eStr.Add(ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')); + eStr.SaveToFile(GetAMXXDir(True) + 'configs\plugins.ini'); + MessageBox(Handle, PChar(lSuccessfulRegistered), PChar(Application.Title), MB_ICONINFORMATION); + end; + + eStr.Free; + end; +end; + +procedure TfrmMain.mnuRegisterPluginsIniWebClick(Sender: TObject); +function RemComments(eLine: String): String; +var a, b: integer; +begin + if Length(eLine) > 0 then begin + b := 0; + for a := 1 to Length(eLine) -1 do begin + if (eLine[a] = ';') or (eLine[a] = '/') then begin + b := a; + break; + end; + end; + eLine := Trim(Copy(eLine, 1, b -1)); + end; + Result := eLine; +end; + +var eStr: TStringList; + i: integer; + eFound: Boolean; +begin + if ActiveDoc.Untitled then begin + MessageBox(Handle, PChar(lNoUntitledRegister), PChar(Application.Title), MB_ICONINFORMATION); + exit; + end; + + Screen.Cursor := crHourGlass; + if not IdFTP.Connected then begin + if TryConnect <> 0 then + exit; + end; + + try + IdFTP.ChangeDir(frmSettings.txtDefaultDir.Text + 'configs/'); + IdFTP.Get('plugins.ini', ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + except + Screen.Cursor := crDefault; + MessageBox(Handle, PChar(lFailedUpdatePluginsIni), PChar(Application.Title), MB_ICONERROR); + end; + + eFound := False; + + eStr := TStringList.Create; + eStr.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + for i := 0 to eStr.Count -1 do begin + if (Copy(eStr[i], 1, 1) <> ';') and (Copy(eStr[i], 1, 2) <> '//') then begin + if LowerCase(RemComments(eStr[i])) = LowerCase(ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')) then begin + eFound := True; + break; + end; + end; + end; + + if eFound then begin + Screen.Cursor := crDefault; + MessageBox(Handle, PChar(lAlreadyRegistered), PChar(Application.Title), MB_ICONINFORMATION); + exit; + end + else begin + eStr.Add(ChangeFileExt(ExtractFileName(ActiveDoc.FileName), '.amxx')); + eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + Screen.Cursor := crDefault; + MessageBox(Handle, PChar(lSuccessfulRegistered), PChar(Application.Title), MB_ICONINFORMATION); + end; + eStr.Free; + + try + IdFTP.TransferType := ftASCII; + IdFTP.Put(ExtractFilePath(ParamStr(0)) + 'plugins.ini', 'plugins.ini'); + IdFTP.Disconnect; + except + Screen.Cursor := crDefault; + MessageBox(Handle, PChar(lFailedUpdatePluginsIni), PChar(Application.Title), MB_ICONERROR); + end; +end; + +procedure TfrmMain.sciAutoCompleteBeforeShow(Sender: TObject; + const Position: Integer; ListToDisplay: TStrings; + var CancelDisplay: Boolean); +var eCurrStyle: Integer; +begin + if not Plugin_AutoCompleteShow(ListToDisplay.GetText) then begin + CancelDisplay := True; + exit; + end; + + if (Started) and (Assigned(GetStyleAt(sciEditor.SelStart))) then begin + eCurrStyle := GetStyleAt(sciEditor.SelStart).StyleNumber; + + if (ActiveDoc.Highlighter = 'Pawn') or (ActiveDoc.Highlighter = 'C++') then begin + CancelDisplay := (eCurrStyle = 12) or (eCurrStyle = 1) or (eCurrStyle = 2) or (eCurrStyle = 3) or (eCurrStyle = 15); + CancelDisplay := (CancelDisplay) or (Pos('#', Trim(sciEditor.Lines[sciEditor.GetCurrentLineNumber])) = 1); + CancelDisplay := (CancelDisplay) or (IsAtStart('new', sciEditor.Lines[sciEditor.GetCurrentLineNumber], False)); + end; + end; +end; + +procedure TfrmMain.mnuMOTDGeneratorClick(Sender: TObject); +var eStr: TStringList; + i: integer; +begin + if (GetCurrLang.Name = 'HTML') then begin + eStr := TStringList.Create; + eStr.Text := StringReplace(sciEditor.Lines.Text, #9, '', [rfReplaceAll]); + for i := 0 to eStr.Count -1 do + eStr[i] := '"' + eStr[i] + '\n" +'; + frmMOTDGen.txtMOTD.Lines.Assign(eStr); + eStr.Free; + + frmMOTDGen.ShowModal; + end + else begin + mnuNewHTML.Click; + if IEInstalled then + frmHTMLPreview.Show; + MessageBox(Handle, PChar(lUseMOTDAgain), PChar(Application.Title), MB_ICONINFORMATION); + end; +end; + +procedure TfrmMain.mnuHeaderPAWNClick(Sender: TObject); +begin + if not Plugin_CreateNewFile(NEW_PAWN_HEADER, True) then exit; + + if tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + + PAWNProjects.Activate(PAWNProjects.Add('Untitled.inc'), False); + sciEditor.Lines.Add('/* Header generated by AMXX-Studio*/'); + sciEditor.Lines.Add(''); + Plugin_CreateNewFile(NEW_PAWN_HEADER, False); +end; + +procedure TfrmMain.OnTabSelect(Sender: TTBCustomItem; + Viewer: TTBItemViewer; Selecting: Boolean); +begin + if (GetAsyncKeyState(VK_RBUTTON) <> 0) and (not pnlLoading.Visible) and (not Selecting) then begin + SelectedTab := TSpTBXTabItem(Sender); + ppmDocuments.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); + end; +end; + +procedure TfrmMain.mnuPCloseClick(Sender: TObject); +var Collection: TDocCollection; +begin + try + case tsMain.ActiveTabIndex of + 0: Collection := PAWNProjects; // PAWN + 1: Collection := CPPProjects; // C++ + else Collection := OtherProjects; // Other + end; + + if tsDocuments.Items.IndexOf(SelectedTab) <> -1 then + CloseDocument(TDocument(Collection.Items[tsDocuments.Items.IndexOf(SelectedTab)])); + except + Application.ProcessMessages; // :o + end; +end; + +procedure TfrmMain.mnuPCloseAllFilesClick(Sender: TObject); +begin + mnuCloseAllFiles.Click; +end; + +procedure TfrmMain.mnuTNewClick(Sender: TObject); +begin + case tsMain.ActiveTabIndex of + 0: mnuNewPlugin.Click; + 1: mnuNewUnit.Click; + 2: mnuNewTextfile.Click; + end; +end; + +procedure TfrmMain.jviCodeItemValueChanged(Sender: TObject; + Item: TJvCustomInspectorItem); +function FindItem(eParent: TJvCustomInspectorItem; eName: String): TJvCustomInspectorItem; +var i: integer; +begin + Result := nil; + for i := 0 to eParent.Count -1 do begin + if eParent.Items[i].DisplayName = eName then + Result := eParent.Items[i]; + end; +end; + +var eLine, eTemp: String; + i: integer; +begin + if (Assigned(Item.Parent)) then begin + // Variables and Constants + if (Pos('Constant', Item.Parent.DisplayName) = 1) or (Pos('Variable', Item.Parent.DisplayName) = 1) then begin + eLine := eFormatSettings; + for i := 0 to jviCode.Root.Count -1 do begin + eTemp := ''; + if Pos('Constant', jviCode.Root.Items[i].DisplayName) = 1 then begin + if (FindItem(jviCode.Root.Items[i], 'Name').DisplayValue <> '') then begin + eTemp := eTemp + ', '; + if Assigned(FindItem(jviCode.Root.Items[i], 'Type')) then + eTemp := eTemp + FindItem(jviCode.Root.Items[i], 'Type').DisplayValue + ':'; + eTemp := eTemp + FindItem(jviCode.Root.Items[i], 'Name').DisplayValue; + eTemp := eTemp + ' = ' + FindItem(jviCode.Root.Items[i], 'Value').DisplayValue; + end; + end + else begin + if (FindItem(jviCode.Root.Items[i], 'Name').DisplayValue <> '') then begin + eTemp := eTemp + ', '; + if Assigned(FindItem(jviCode.Root.Items[i], 'Type')) then + eTemp := eTemp + FindItem(jviCode.Root.Items[i], 'Type').DisplayValue + ':'; + eTemp := eTemp + FindItem(jviCode.Root.Items[i], 'Name').DisplayValue; + end; + end; + + if jviCode.Root.Count = 1 then + eLine := StringReplace(eLine, '-' + jviCode.Root.Items[i].DisplayName + ' 1-', eTemp, []) + else + eLine := StringReplace(eLine, '-' + jviCode.Root.Items[i].DisplayName + '-', eTemp, []); + end; + Delete(eLine, 1, 2); + eLine := GetIndents + 'new ' + eLine; + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := eLine; + end + // If-Conditions + else if Pos('If-Condition', Item.Parent.DisplayName) = 1 then begin + eLine := ''; + for i := 0 to jviCode.Root.Count -1 do begin + eLine := eLine + FindItem(jviCode.Root.Items[i], 'Condition').DisplayValue; + if i <> jviCode.Root.Count -1 then + eLine := eLine + #32 + FindItem(jviCode.Root.Items[i], 'Operator').DisplayValue + #32; + end; + eLine := StringReplace(eFormatSettings, #1#3#3#7, '(' + eLine + ')', []); + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := eLine; + end + // Defined + else if Item.Parent.DisplayName = 'Defined' then begin + eLine := GetIndents + '#define '; + eLine := eLine + Item.Parent.Items[0].DisplayValue; + eLine := eLine + ' ' + Item.Parent.Items[1].DisplayValue; + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := eLine; + end + // Included + else if Item.Parent.DisplayName = 'Included' then begin + eLine := StringReplace(eFormatSettings, '-Filename-', Item.DisplayValue, []); + eLine := GetIndents + eLine; + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := eLine; + end + // Assignment + else if Item.Parent.DisplayName = 'Assignment' then begin + eLine := GetIndents + Item.Parent.Items[0].DisplayValue; + eLine := eLine + #32 + Item.Parent.Items[2].DisplayValue + #32 + Item.Parent.Items[1].DisplayValue; + sciEditor.Lines[sciEditor.GetCurrentLineNumber] := eLine; + end; + end; +end; + +procedure TfrmMain.mnuMenuGeneratorClick(Sender: TObject); +begin + frmMenuGenerator.ShowModal; +end; + +procedure TfrmMain.JvPluginManagerPlugInError(Sender: TObject; + AError: Exception); +begin + MessageBox(Handle, PChar(lPluginError + #13 + AError.Message), PChar(Application.Title), MB_ICONERROR); +end; + +procedure TfrmMain.mnuNewModuleClick(Sender: TObject); +begin + Plugin_CreateNewFile(NEW_CPP_MODULE, True); +end; + +procedure TfrmMain.mnuNewUnitClick(Sender: TObject); +begin + Plugin_CreateNewFile(NEW_CPP_UNIT, True); +end; + +procedure TfrmMain.mnuNewHeaderCPPClick(Sender: TObject); +begin + Plugin_CreateNewFile(NEW_CPP_HEADER, True); +end; + +procedure TfrmMain.tcToolsActiveTabChange(Sender: TObject; + ItemIndex: Integer); +begin + Plugin_VisibleControlChange(CTRL_CODETOOLS_ITEM, ItemIndex = 0); + Plugin_VisibleControlChange(CTRL_NOTES, ItemIndex = 1); +end; + +procedure TfrmMain.sciEditorModified(Sender: TObject; const position, + modificationType: Integer; text: PAnsiChar; const len, linesAdded, line, + foldLevelNow, foldLevelPrev: Integer); +begin + if Started then + Plugin_Modified(text); +end; + +procedure TfrmMain.sciEditorDblClick(Sender: TObject); +begin + Plugin_EditorClick(True); +end; + +procedure TfrmMain.sciCallTipsBeforeShow(Sender: TObject; + const Position: Integer; ListToDisplay: TStrings; + var CancelDisplay: Boolean); +begin + CancelDisplay := not Plugin_CallTipShow(ListToDisplay.GetText); +end; + +procedure TfrmMain.sciEditorCallTipClick(Sender: TObject; + const position: Integer); +begin + if not Plugin_CallTipClick(position) then + sciEditor.CallTipCancel; +end; + +procedure TfrmMain.sciEditorAutoCSelection(Sender: TObject; + text: PAnsiChar); +begin + Plugin_AutoCompleteSelect(text); +end; + +procedure TfrmMain.WMCopyData(var Msg: TWMCopyData); +var eCommand, eExt: String; + eItem: TSpTBXItem; + eItem2: TTBCustomItem; +begin + if Msg.Msg = WM_COPYDATA then begin + SetLength(eCommand, Msg.CopyDataStruct.cbData); + StrLCopy(PChar(eCommand), Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); + { AddMenuItem } + if Pos('ADDMENUITEM', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 11); + eCommand := Trim(eCommand); + if (CountChars(eCommand, '"') = 4) then begin + eItem2 := GetMenuItem(Between(eCommand, '"', '"')); + while CountChars(eCommand, '"') > 2 do + Delete(eCommand, 1, 1); + eItem := TSpTBXItem.Create(frmMain.tbxMenu.Items); + eItem.OnClick := OnCustomClick; + eItem.Caption := Between(eCommand, '"', '"'); + eItem2.Add(eItem); + Msg.Result := 1; + exit; + end + else + Msg.Result := 0; + end + { AddMenuSubItem } + else if Pos('ADDMENUSUBITEM', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 12); + eCommand := Trim(eCommand); + if (CountChars(eCommand, '"') = 4) and (Assigned(GetMenuItem(Between(eCommand, '"', '"')))) then begin + while CountChars(eCommand, '"') > 2 do + Delete(eCommand, 1, 1); + eItem := TSpTBXSubmenuItem.Create(frmMain.tbxMenu.Items); + eItem.OnClick := OnCustomClick; + eItem.Caption := Between(eCommand, '"', '"'); + frmMain.tbxMenu.Items.Add(GetMenuItem(Between(eCommand, '"', '"'))); + Msg.Result := 1; + exit; + end + else + Msg.Result := 0; + end + else if Pos('REMOVEMENUITEM', UpperCase(eCommand)) = 1 then begin + eCommand := Between(eCommand, '"', '"'); + if Assigned(GetMenuItem(eCommand)) then begin + TSpTBXItem(GetMenuItem(eCommand)).Free; + Msg.Result := 1; + end + else + Msg.Result := 0; + end + { SetEditorText } + else if Pos('SETEDITORTEXT', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 14); + frmMain.sciEditor.Lines.Text := eCommand; + Msg.Result := 1; + end + { GetEditorText } + else if Pos('GETEDITORTEXT', UpperCase(eCommand)) = 1 then + Msg.Result := LongInt(sciEditor.Lines.GetText) + { ExecMenuItem } + else if Pos('EXECMENUITEM', UpperCase(eCommand)) = 1 then begin + eCommand := TrimLeft(Copy(eCommand, Pos(#32, eCommand) +1, Length(eCommand))); + if Assigned(GetMenuItem(eCommand)) then begin + GetMenuItem(eCommand).Click; + Msg.Result := 1; + end + else + Msg.Result := 0; + end + { LoadFile } + else if Pos('LOADFILE PAWN', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 13); + if frmMain.tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + if PAWNProjects.Open(Trim(eCommand)) <> -1 then + Msg.Result := 1 + else + Msg.Result := 0; + end + else if Pos('LOADFILE CPP', UpperCase(eCommand)) = 1 then begin + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(1, False); + Delete(eCommand, 1, 12); + if CPPProjects.Open(Trim(eCommand)) <> -1 then + Msg.Result := 1 + else + Msg.Result := 0; + end + else if Pos('LOADFILE OTHER', UpperCase(eCommand)) = 1 then begin + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + Delete(eCommand, 1, 12); + if CPPProjects.Open(Trim(eCommand)) <> -1 then + Msg.Result := 1 + else + Msg.Result := 0; + end + else if Pos('LOADFILE', UpperCase(eCommand)) = 1 then begin + eExt := ExtractFileExt(eCommand); + eExt := LowerCase(eExt); + Msg.Result := 0; + if (eExt = '.sma') or (eExt = '.inc') then begin // Pawn files + if frmMain.tsMain.ActiveTabIndex <> 0 then + ActivateProjects(0, False); + if PAWNProjects.Open(eCommand) <> -1 then + Msg.Result := 1; + end + else if (eExt = '.cpp') or (eExt = '.h') then begin // C++ files + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(1, False); + if CPPProjects.Open(eCommand) <> -1 then + Msg.Result := 1; + end + else if (eExt = '.htm') or (eExt = '.html') then begin // HTML files + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + if OtherProjects.Open(eCommand, 'HTML') <> -1 then + Msg.Result := 1; + end + else if (eExt = '.sql') then begin // SQL databases + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + if OtherProjects.Open(eCommand, 'SQL') <> -1 then + Msg.Result := 1; + end + else if (eExt = '.xml') then begin // XML files + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + if OtherProjects.Open(eCommand, 'XML') <> -1 then + Msg.Result := 1; + end + else begin // Other files and/or Textfiles + if frmMain.tsMain.ActiveTabIndex <> 1 then + ActivateProjects(2, False); + if OtherProjects.Open(eCommand, 'null') <> -1 then + Msg.Result := 1; + end; + end + { SaveFile } + else if Pos('SAVEFILE', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 8); + Msg.Result := 0; + eCommand := Trim(eCommand); + if eCommand <> '' then + ActiveDoc.FileName := eCommand; + if ActiveDoc.Save then + Msg.Result := 1; + end + { ActivateFile } + else if Pos('ACTIVATEFILE', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 12); + eCommand := Trim(eCommand); + Msg.Result := 0; + if IsNumeric(eCommand) then begin + if StrToInt(eCommand) < frmMain.tsDocuments.Items.Count then begin + frmMain.tsDocuments.ActiveTabIndex := StrToInt(eCommand); + Msg.Result := 1; + end; + end; + end + { ActivateProjects } + else if Pos('ACTIVATEPROJECTS', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 12); + eCommand := Trim(eCommand); + Msg.Result := 0; + if IsNumeric(eCommand) then begin + if StrToInt(eCommand) < frmMain.tsMain.Items.Count then begin + ActivateProjects(StrToInt(eCommand), True); + Msg.Result := 1; + end; + end; + end + { DeleteMenuItem } + else if Pos('DELETEMENUITEM', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 14); + eCommand := Trim(eCommand); + if Assigned(GetMenuItem(eCommand)) then begin + GetMenuItem(eCommand).Free; + Msg.Result := 1; + end + else + Msg.Result := 0; + end + { C++ IDE } + else if Pos('CPPIDE', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 7); + eCommand := Trim(UpperCase(eCommand)); + Msg.Result := 0; + if eCommand = 'ON' then begin + tiCPP.Enabled := True; + mnuNewHeaderCPP.Enabled := True; + mnuNewModule.Enabled := True; + mnuNewUnit.Enabled := True; + eCPP := True; + Msg.Result := 1; + end + else if eCommand = 'OFF' then begin + frmMain.tiCPP.Enabled := False; + frmMain.mnuNewHeaderCPP.Enabled := False; + frmMain.mnuNewModule.Enabled := False; + frmMain.mnuNewUnit.Enabled := False; + eCPP := False; + Msg.Result := 1; + end; + end + { Output } + else if Pos('OUTPUT', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 6); + eCommand := Trim(eCommand); + Msg.Result := 0; + if Pos('ADD', eCommand) = 1 then begin + Delete(eCommand, 1, 4); // +1 for space + frmMain.lstOutput.Items.Add(eCommand); + Msg.Result := 1; + end + else if Pos('DELETE', eCommand) = 1 then begin + Delete(eCommand, 1, 7); + if IsNumeric(eCommand) then begin + if StrToInt(eCommand) < frmMain.lstOutput.Items.Count then + frmMain.lstOutput.Items.Delete(StrToInt(eCommand)); + end; + end + else if Pos('SETTEXT', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 8); // +1 for space + frmMain.lstOutput.Items.Text := eCommand; + Msg.Result := 1; + end + else if Pos('GETTEXT', UpperCase(eCommand)) = 1 then begin + eCommand := frmMain.lstOutput.Items.Text; + Msg.Result := LongInt(PChar(eCommand)); + end + else if Pos('CLEAR', UpperCase(eCommand)) = 1 then begin + frmMain.lstOutput.Items.Clear; + Msg.Result := 1; + end + else if Pos('SHOW', UpperCase(eCommand)) = 1 then begin + frmMain.splOutput.Show; + frmMain.lstOutput.Show; + Msg.Result := 1; + end + else if Pos('HIDE', UpperCase(eCommand)) = 1 then begin + frmMain.splOutput.Hide; + frmMain.lstOutput.Hide; + Msg.Result := 1; + end + end + { New } + else if Pos('NEW', UpperCase(eCommand)) = 1 then begin + Delete(eCommand, 1, 4); + Msg.Result := 1; + if UpperCase(eCommand) = 'EMPTY_PLUGIN' then + frmMain.mnuEmptyPlugin.Click + else if UpperCase(eCommand) = 'PLUGIN' then + frmMain.mnuNewPlugin.Click + else if UpperCase(eCommand) = 'HEADER_PAWN' then + frmMain.mnuHeaderPAWN.Click + else if UpperCase(eCommand) = 'MODULE' then + frmMain.mnuNewModule.Click + else if UpperCase(eCommand) = 'HEADER_CPP' then + frmMain.mnuNewHeaderCPP.Click + else if UpperCase(eCommand) = 'TEXTFILE' then + frmMain.mnuNewTextfile.Click + else if UpperCase(eCommand) = 'HTML' then + frmMain.mnuNewHTML.Click + else if UpperCase(eCommand) = 'SQL' then + frmMain.mnuNewSQL.Click + else if UpperCase(eCommand) = 'XML' then + frmMain.mnuNewXML.Click + else + Msg.Result := 0; + end; + end +end; + +procedure TfrmMain.OnCustomClick(Sender: TObject); +begin + Plugin_CustomItemClick((Sender As TTBXCustomItem).Caption); +end; + +procedure TfrmMain.pnlCodeInspectorVisibleChanged(Sender: TObject); +begin + mnuShowCodeInspector.Checked := pnlCodeInspector.Visible; +end; + +procedure TfrmMain.pnlCodeExplorerVisibleChanged(Sender: TObject); +begin + mnuShowCodeExplorer.Checked := pnlCodeExplorer.Visible; +end; + +procedure TfrmMain.mnuShowCodeExplorerClick(Sender: TObject); +begin + pnlCodeExplorer.Visible := mnuShowCodeExplorer.Checked; +end; + +procedure TfrmMain.mnuShowCodeInspectorClick(Sender: TObject); +begin + pnlCodeInspector.Visible := mnuShowCodeInspector.Checked; +end; + +procedure TfrmMain.mnuConnectionGenClick(Sender: TObject); +var eIncluded: Integer; + eRegLine: Integer; + eIndents: String; +begin + eRegLine := PluginInitLine; + if (frmConnGen.ShowModal = mrOk) and (eRegLine <> -1) then begin + // Add include and add var + eIncluded := GetLast('#include', True); + if eIncluded = -1 then + eIncluded := 0; + sciEditor.Lines.Insert(eIncluded +1, 'new sck' + frmConnGen.txtName.Text); + eRegLine := eRegLine +1; + AddIfDoesntExist('sockets'); + // CVar stuff + eIndents := GetIndents(eRegLine +1); + sciEditor.Lines.Insert(eRegLine +2, eIndents + '/* Init CVars for the socket "' + frmConnGen.txtName.Text + '" */'); + sciEditor.Lines.Insert(eRegLine +3, eIndents + 'if (cvar_exists("amx_' + frmConnGen.txtName.Text + '_socket")) {'); + sciEditor.Lines.Insert(eRegLine +4, eIndents + #9 + 'sck' + frmConnGen.txtName.Text + ' = get_cvar_num("amx_' + frmConnGen.txtName.Text + '_socket")'); + sciEditor.Lines.Insert(eRegLine +5, eIndents + #9 + 'read_' + frmConnGen.txtName.Text + '()'); + sciEditor.Lines.Insert(eRegLine +6, eIndents + '}'); + sciEditor.Lines.Insert(eRegLine +7, eIndents + 'else'); + sciEditor.Lines.Insert(eRegLine +8, eIndents + #9 + 'register_cvar("amx_' + frmConnGen.txtName.Text + '_socket", "0", FCVAR_PROTECTED&FCVAR_UNLOGGED)'); + sciEditor.Lines.Insert(eRegLine +9, eIndents + '/* End */'); + // Functions + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('/* Socket ' + frmConnGen.txtName.Text + ' */'); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('public connect_' + frmConnGen.txtName.Text + '() {'); + sciEditor.Lines.Add(#9 + 'new error = 0'); + sciEditor.Lines.Add(#9 + 'sck' + frmConnGen.txtName.Text + ' = socket_open("' + frmConnGen.txtHost.Text + '", ' + frmConnGen.txtPort.Text + ', ' + frmConnGen.cboProtocol.Text + ', error)'); + sciEditor.Lines.Add(#9 + 'if (sck' + frmConnGen.txtName.Text + ' > 0) {'); + sciEditor.Lines.Add(#9 + #9 + '/* Connect successful */'); + sciEditor.Lines.Add(#9 + #9 + 'read_' + frmConnGen.txtName.Text + '()'); + sciEditor.Lines.Add(#9 + '}'); + sciEditor.Lines.Add(#9 + 'else {'); + sciEditor.Lines.Add(#9 + #9 + 'switch (error) {'); + sciEditor.Lines.Add(#9 + #9 + #9 + 'case 1: { /* Error creating socket */ }'); + sciEditor.Lines.Add(#9 + #9 + #9 + 'case 2: { /* Could not resolve hostname */ }'); + sciEditor.Lines.Add(#9 + #9 + #9 + 'case 3: { /* Could not connect to given host:port */ }'); + sciEditor.Lines.Add(#9 + #9 + '}'); + sciEditor.Lines.Add(#9 + '}'); + sciEditor.Lines.Add('}'); + sciEditor.Lines.Add(''); + sciEditor.Lines.Add('public read_' + frmConnGen.txtName.Text + '() {'); + sciEditor.Lines.Add(#9 + 'if (socket_change(sck' + frmConnGen.txtName.Text + ', 100)) {'); + sciEditor.Lines.Add(#9 + #9 + 'new buf[512], lines[30][100], count = 0'); + sciEditor.Lines.Add(#9 + #9 + 'socket_recv(sck' + frmConnGen.txtName.Text + ', buf, 511)'); + sciEditor.Lines.Add(#9 + #9 + 'count = ExplodeString(lines, 50, 119, buf, 13)'); + sciEditor.Lines.Add(#9 + #9 + 'for(new i=0;i-o;R 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 literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmMenuGenerator.pas b/editor/studio/UnitfrmMenuGenerator.pas new file mode 100755 index 00000000..209d4681 --- /dev/null +++ b/editor/studio/UnitfrmMenuGenerator.pas @@ -0,0 +1,295 @@ +unit UnitfrmMenuGenerator; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, TBXDkPanels, SpTBXDkPanels, JvExControls, + JvComponent, JvPageList, TFlatRadioButtonUnit, TFlatMemoUnit, + TFlatEditUnit, TB2Dock, TB2Toolbar, TBX, SpTBXItem, ImgList, TB2Item, + Dialogs, TFlatComboBoxUnit, ComCtrls, ClipBrd, TFlatCheckBoxUnit; + +type + TfrmMenuGenerator = class(TForm) + jplMain: TJvPageList; + jspSelectType: TJvStandardPage; + pnlSelectType: TPanel; + lblSelectInfo: TLabel; + optSimpleOldMenu: TSpTBXRadioButton; + optPlayerMenu: TSpTBXRadioButton; + optSimpleMenu: TSpTBXRadioButton; + cmdCancel: TSpTBXButton; + cmdNext: TSpTBXButton; + jspOldMenuAdd1: TJvStandardPage; + optOldPlayerMenu: TSpTBXRadioButton; + jspNewMenuAdd: TJvStandardPage; + ilImages: TImageList; + pnlBack: TPanel; + pnlMenu: TPanel; + tbxMenuItems: TSpTBXToolbar; + mnuAdd: TSpTBXItem; + mnuRemove: TSpTBXItem; + sepItems: TSpTBXSeparatorItem; + mnuUp: TSpTBXItem; + mnuMoveDown: TSpTBXItem; + lstNMenuItems: TListBox; + txtNTitle: TFlatEdit; + lblNTitle: TLabel; + lblMenuNItemsCaption: TLabel; + cmdNCreate: TSpTBXButton; + cmdBack: TSpTBXButton; + pnlAccess: TPanel; + lblAccess: TLabel; + cboAccess: TFlatComboBox; + lblState: TLabel; + tbxColors: TSpTBXToolbar; + mnuYellow: TSpTBXItem; + mnuWhite: TSpTBXItem; + mnuRed: TSpTBXItem; + mnuGray: TSpTBXItem; + pnlControls: TPanel; + rtfMenu: TRichEdit; + sepColors: TSpTBXSeparatorItem; + mnuCopy: TSpTBXItem; + cmdOldNext1: TSpTBXButton; + cmdOldBack1: TSpTBXButton; + lblHelp: TLabel; + jspOldMenuAdd2: TJvStandardPage; + Panel1: TPanel; + txtKeys: TFlatEdit; + lblKeys: TLabel; + txtMenuName: TFlatEdit; + lblName: TLabel; + chkAddComment: TFlatCheckBox; + chkRegisterMenuCommand: TFlatCheckBox; + chkUseTime: TFlatCheckBox; + txtTime: TFlatEdit; + Label1: TLabel; + cmdOldNext2: TSpTBXButton; + cmdOldBack2: TSpTBXButton; + procedure mnuAddClick(Sender: TObject); + procedure mnuRemoveClick(Sender: TObject); + procedure mnuUpClick(Sender: TObject); + procedure mnuMoveDownClick(Sender: TObject); + procedure cmdNCreateClick(Sender: TObject); + procedure cmdBackClick(Sender: TObject); + procedure cmdNextClick(Sender: TObject); + procedure lblHelpMouseEnter(Sender: TObject); + procedure lblHelpMouseLeave(Sender: TObject); + procedure mnuYellowClick(Sender: TObject); + procedure mnuWhiteClick(Sender: TObject); + procedure mnuRedClick(Sender: TObject); + procedure mnuGrayClick(Sender: TObject); + procedure rtfMenuMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure rtfMenuKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure cmdOldNext1Click(Sender: TObject); + procedure mnuCopyClick(Sender: TObject); + procedure cmdOldNext2Click(Sender: TObject); + procedure lblHelpClick(Sender: TObject); + private + procedure UpdateColor; + procedure UpdateMenu(Sender: TObject); + end; + +var + frmMenuGenerator: TfrmMenuGenerator; + +implementation + +uses UnitLanguages, UnitMenuGenerators, UnitCodeUtils, UnitMainTools; + +{$R *.DFM} + +procedure TfrmMenuGenerator.mnuAddClick(Sender: TObject); +var eStr: String; +begin + if InputQuery(lAddItemCaption, lAddItemPrompt, eStr) then begin + if (optPlayerMenu.Checked) and (UpperCase(eStr) = 'PLAYERS') then begin + eStr := 'PLAYERS'; + if lstNMenuItems.Items.IndexOf('PLAYERS') <> -1 then begin + MessageBox(Handle, PChar(lPlayersAlreadyAdded), PChar(Application.Title), MB_ICONERROR); + end; + end; + lstNMenuItems.ItemIndex := lstNMenuItems.Items.Add(eStr); + end; +end; + +procedure TfrmMenuGenerator.mnuRemoveClick(Sender: TObject); +begin + if lstNMenuItems.ItemIndex <> -1 then + lstNMenuItems.DeleteSelected; +end; + +procedure TfrmMenuGenerator.mnuUpClick(Sender: TObject); +begin + if lstNMenuItems.ItemIndex > 0 then + lstNMenuItems.Items.Exchange(lstNMenuItems.ItemIndex, lstNMenuItems.ItemIndex -1); +end; + +procedure TfrmMenuGenerator.mnuMoveDownClick(Sender: TObject); +begin + if (lstNMenuItems.ItemIndex <> -1) and (lstNMenuItems.ItemIndex <> lstNMenuItems.Items.Count -1) then + lstNMenuItems.Items.Exchange(lstNMenuItems.ItemIndex, lstNMenuItems.ItemIndex +1); +end; + +procedure TfrmMenuGenerator.cmdNCreateClick(Sender: TObject); +begin + if txtNTitle.Text = '' then + MessageBox(Handle, PChar(lEnterTitle), PChar(Application.Title), MB_ICONERROR) + else if lstNMenuItems.Items.Count = 0 then + MessageBox(Handle, PChar(lAddItems), PChar(Application.Title), MB_ICONERROR) + else if self.optSimpleMenu.Checked then begin + GenerateSimpleMenu; + ModalResult := mrOk; + end; +end; + +procedure TfrmMenuGenerator.cmdBackClick(Sender: TObject); +begin + jplMain.ActivePageIndex := 0; + lblState.Caption := 'Menu Generator'; +end; + +procedure TfrmMenuGenerator.cmdNextClick(Sender: TObject); +begin + // New style + if optSimpleMenu.Checked then begin + jplMain.ActivePageIndex := 1; + lblState.Caption := 'Create a simple menu'; + end; + // Old style + if optSimpleOldMenu.Checked then begin + jplMain.ActivePageIndex := 2; + lblState.Caption := 'Create a simple menu'; + lblHelp.Hide; + end; + if optOldPlayerMenu.Checked then begin + jplMain.ActivePageIndex := 2; + lblState.Caption := 'Create a player menu'; + lblHelp.Show; + end; +end; + +procedure TfrmMenuGenerator.lblHelpMouseEnter(Sender: TObject); +begin + lblHelp.Font.Color := clHotLight; + lblHelp.Font.Style := [fsUnderline]; +end; + +procedure TfrmMenuGenerator.lblHelpMouseLeave(Sender: TObject); +begin + lblHelp.Font.Color := clWindowText; + lblHelp.Font.Style := []; +end; + +procedure TfrmMenuGenerator.mnuYellowClick(Sender: TObject); +begin + rtfMenu.SelAttributes.Color := clYellow; + UpdateMenu(Sender); +end; + +procedure TfrmMenuGenerator.mnuWhiteClick(Sender: TObject); +begin + rtfMenu.SelAttributes.Color := clWhite; + UpdateMenu(Sender); +end; + +procedure TfrmMenuGenerator.mnuRedClick(Sender: TObject); +begin + rtfMenu.SelAttributes.Color := clRed; + UpdateMenu(Sender); +end; + +procedure TfrmMenuGenerator.mnuGrayClick(Sender: TObject); +begin + rtfMenu.SelAttributes.Color := clGray; + UpdateMenu(Sender); +end; + +procedure TfrmMenuGenerator.UpdateColor; +begin + case rtfMenu.SelAttributes.Color of + clYellow: mnuYellow.Checked := True; + clWhite: mnuWhite.Checked := True; + clRed: mnuRed.Checked := True; + clGray: mnuGray.Checked := True; + end; +end; + +procedure TfrmMenuGenerator.UpdateMenu(Sender: TObject); +begin + mnuYellow.Checked := Sender = mnuYellow; + mnuWhite.Checked := Sender = mnuWhite; + mnuRed.Checked := Sender = mnuRed; + mnuGray.Checked := Sender = mnuGray; +end; + +procedure TfrmMenuGenerator.rtfMenuMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + UpdateColor; +end; + +procedure TfrmMenuGenerator.rtfMenuKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + UpdateColor; +end; + +procedure TfrmMenuGenerator.cmdOldNext1Click(Sender: TObject); +var i: integer; +begin + if Trim(rtfMenu.Text) = '' then begin + MessageBox(Handle, 'The menu is empty!', PChar(Application.Title), MB_ICONERROR); + exit; + end; + + txtKeys.Clear; + for i := 0 to rtfMenu.Lines.Count -1 do begin + if IsNumeric(Copy(rtfMenu.Lines[i], 1, 1)) then + txtKeys.Text := txtKeys.Text + rtfMenu.Lines[i][1]; + end; + jplMain.ActivePageIndex := 3; +end; + +procedure TfrmMenuGenerator.mnuCopyClick(Sender: TObject); +begin + Clipboard.SetTextBuf(PChar(GetColoredMenu)); + MessageBox(Handle, 'Okay, menu copied to clipboard.', PChar(Application.Title), MB_ICONINFORMATION); +end; + +procedure TfrmMenuGenerator.cmdOldNext2Click(Sender: TObject); +begin + if optSimpleOldMenu.Checked then + AddOldMenu + else + AddOldPlayerMenu; + ModalResult := mrOk; +end; + +procedure TfrmMenuGenerator.lblHelpClick(Sender: TObject); +var eMsg: String; +begin + eMsg := '1. Choose a menu title (e.g. Kick player)' + #13; + eMsg := eMsg + '2. Set dynamic players with $players in this format:' + #13; + eMsg := eMsg + ' $players(StartKey, StopKey, Caption)' + #13; + eMsg := eMsg + ' Variables in caption are: %n (Key) and %v(Player)' + #13; + eMsg := eMsg + '3. Set Next and Back keys using $next(Key, Caption)' + #13; + eMsg := eMsg + ' and $exitorback(Key, ExitCaption, BackCaption)' + #13; + eMsg := eMsg + #13; + eMsg := eMsg + 'Show example?'; + + if MessageBox(Handle, PChar(eMsg), PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin + rtfMenu.Clear; + rtfMenu.SelAttributes.Color := clYellow; + rtfMenu.SelText := 'Kick player' + #13 + #13; + rtfMenu.SelStart := Length(rtfMenu.Lines.Text); + rtfMenu.SelAttributes.Color := clWhite; + rtfMenu.SelText := '$players(1,8,%n. %v)' + #13 + '$next(9,9. Next)' + '$exitorback(0,0. Exit,0. Back)'; + rtfMenu.SelStart := 0; + end; +end; + +end. diff --git a/editor/studio/UnitfrmPluginsIniEditor.dfm b/editor/studio/UnitfrmPluginsIniEditor.dfm new file mode 100755 index 0000000000000000000000000000000000000000..7cd138df606ebcd55cb769b7b03fd34a178dda6d GIT binary patch literal 1711 zcmd5-%W~5&6jkiT&Z|jz55vZ67$`%hztFf1%`|N?u{vc3j(ro0Dw4-m+H~j#u;mZ< z4YsTp7JLcAj$sLs<;0}~)~pg;>7IMe(Y^A|8p567;h=Z?ynEzzkGgxiUECj{?TvR9 zLU_>GzKzGpbUF zw(G}&aAw`iA-4!4js|VGlmHX^KqiqezoNQcpO8>Q=C@MW<&-COHK1+5I(`6+4rgM^ zjr=49VYhboIy=Wb{L!{hMp__m&psz$#Dg&MprNeH<+zS!_=1S_2tPjW>XgYwT%Yw*wRZ|u7 zTI;BWrz6~caR^gxi@E3!3Ylw$rA#v_Wv%s1$;wUmfNBz*Q`(jyZ7WUNTtpS@k1`qt zLa2egSVFdELU2|NreXg;U&Pz&B8-~GH2fUWxWBvtqkm99l{R{Wo&M9&W^p2O)si2^+O)|bO`B;3ZqoT5ljJJ#9&(@5>nJ<22KIxKWjoGgNO) z!K}1ocH=61#_jrGsYV;hsXf!Cn|ip+_qprEbUj>Jb61~trX)=Xn>ew4LW}xqm6ODe zW4R~0`&|8B5^65XWo-V77G2epb=;4E>6hK&p;}n-QIid4J(b^*XX=4VoyVKX_$Qay k&*cuK&Ug{uRME{cCW3;sq4F0#sT4ibU-TE{v%C}Z3t6!w5C8xG literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmPluginsIniEditor.pas b/editor/studio/UnitfrmPluginsIniEditor.pas new file mode 100755 index 00000000..e42ee67a --- /dev/null +++ b/editor/studio/UnitfrmPluginsIniEditor.pas @@ -0,0 +1,160 @@ +unit UnitfrmPluginsIniEditor; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, TBXDkPanels, SpTBXDkPanels, mbTBXMemo, Dialogs, + IdFTPCommon; + +type + TfrmPluginsIniEditor = class(TForm) + txtFile: TmbTBXMemo; + cmdOK: TSpTBXButton; + cmdCancel: TSpTBXButton; + pnlEditType: TPanel; + chkEditFTP: TSpTBXCheckBox; + chkEditLocal: TSpTBXCheckBox; + cmdRemove: TSpTBXButton; + odOpen: TOpenDialog; + procedure chkEditFTPClick(Sender: TObject); + procedure chkEditLocalClick(Sender: TObject); + procedure cmdRemoveClick(Sender: TObject); + end; + +var + frmPluginsIniEditor: TfrmPluginsIniEditor; + +implementation + +uses UnitfrmMain, UnitfrmSettings, UnitMainTools, UnitLanguages; + +{$R *.DFM} + +procedure TfrmPluginsIniEditor.chkEditFTPClick(Sender: TObject); +begin + if Screen.Cursor = crHourGlass then exit; + + Screen.Cursor := crHourGlass; + + if not frmMain.IdFTP.Connected then begin + if TryConnect <> 0 then begin + cmdRemove.Enabled := False; + exit; + end; + end; + + try + frmMain.IdFTP.ChangeDir(frmSettings.txtDefaultDir.Text + 'configs/'); + except + frmMain.IdFTP.Disconnect; + MessageBox(Application.Handle, PChar(lInvalidDirectory), PChar(Application.Title), MB_ICONERROR); + chkEditFTP.Checked := False; + chkEditLocal.Checked := True; + cmdRemove.Enabled := False; + Screen.Cursor := crDefault; + exit; + end; + + frmMain.IdFTP.TransferType := ftASCII; + frmMain.IdFTP.Get('plugins.ini', ExtractFilePath(ParamStr(0)) + 'plugins.ini', True); + frmPluginsIniEditor.txtFile.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'plugins.ini'); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'plugins.ini')); + + chkEditFTP.Checked := True; + chkEditLocal.Checked := False; + cmdRemove.Enabled := True; + Screen.Cursor := crDefault; +end; + +procedure TfrmPluginsIniEditor.chkEditLocalClick(Sender: TObject); +begin + if Screen.Cursor = crHourGlass then exit; + + Screen.Cursor := crHourGlass; + if not FileExists(GetAMXXDir(True) + 'configs\plugins.ini') then begin + if odOpen.Execute then begin + txtFile.Lines.LoadFromFile(odOpen.FileName); + cmdRemove.Enabled := Pos('amxmodx', LowerCase(odOpen.FileName)) <> 0; + end + else + cmdRemove.Enabled := False; + end + else begin + txtFile.Lines.LoadFromFile(GetAMXXDir(True) + 'configs\plugins.ini'); + odOpen.FileName := GetAMXXDir(True) + 'configs\plugins.ini'; + cmdRemove.Enabled := True; + end; + chkEditFTP.Checked := False; + chkEditLocal.Checked := True; + Screen.Cursor := crDefault; +end; + +procedure TfrmPluginsIniEditor.cmdRemoveClick(Sender: TObject); +function RemComments(eLine: String): String; +var a, b: integer; +begin + if Length(eLine) > 0 then begin + b := 0; + for a := 1 to Length(eLine) -1 do begin + if (eLine[a] = ';') or (eLine[a] = '/') then begin + b := a; + break; + end; + end; + + if (b = 0) and (Pos(' debug', LowerCase(eLine)) <> 0) then + b := Pos(' debug', LowerCase(eLine)); + if b <> 0 then + eLine := Trim(Copy(eLine, 1, b -1)); + end; + Result := Trim(eLine); +end; + +var eStr: TStringList; + a,b: integer; + eFound: Boolean; +begin + Screen.Cursor := crHourGlass; + if chkEditFTP.Checked then begin + if not frmMain.IdFTP.Connected then begin + if TryConnect <> 0 then begin + Screen.Cursor := crDefault; + exit; + end; + end; + + eStr := TStringList.Create; + try + frmMain.IdFTP.ChangeDir(frmSettings.txtDefaultDir.Text + 'plugins/'); + frmMain.IdFTP.List(eStr, '', False); + for a := txtFile.Lines.Count -1 downto 0 do begin + if (Copy(txtFile.Lines[a], 1, 1) <> ';') and (Copy(txtFile.Lines[a], 1, 1) <> '/') and (Trim(txtFile.Lines[a]) <> '') then begin + eFound := False; + for b := 0 to eStr.Count -1 do begin + if RemComments(txtFile.Lines[a]) = eStr[b] then + eFound := True; + end; + + if not eFound then + txtFile.Lines.Delete(a); + end; + end; + except + MessageBox(Application.Handle, PChar(lInvalidDirectory), PChar(Application.Title), MB_ICONERROR); + end; + + eStr.Free; + end + else begin + for a := txtFile.Lines.Count -1 downto 0 do begin + if (Copy(txtFile.Lines[a], 1, 1) <> ';') and (Copy(txtFile.Lines[a], 1, 1) <> '/') then begin + if (not FileExists(Copy(ExtractFilePath(odOpen.FileName), 1, Length(ExtractFilePath(odOpen.FileName)) -8) + 'plugins\' + RemComments(txtFile.Lines[a]))) and (Trim(txtFile.Lines[a]) <> '') then + txtFile.Lines.Delete(a); + end; + end; + end; + Screen.Cursor := crDefault; +end; + +end. diff --git a/editor/studio/UnitfrmReplace.dfm b/editor/studio/UnitfrmReplace.dfm new file mode 100755 index 0000000000000000000000000000000000000000..bed4a6e388ae5d47dcfc0973764fb9ebd5dd577f GIT binary patch literal 2617 zcmd5;&2HO95T;0rlt@XI-5;Pgp~$)Lp(v1?BGFP~#Et}!fpRF2uE>$ddbKN%E6YCi z0ebF3^xPLH@&tW`zCzFKaJeKE(FuAgauP-E%s1aR-_Gtow&qXfH}moAdgzX|i~bW^ z)BM@w!tqzhW)53Q0X6LgI-B3RY{GUdDv-wdInnh&eMm zD#1X&z38|!1}0uWypDwNm*(XE7jY;e<87nqa>^5{9ng_r6GZJyI1}Hv5lK=I*6HPV zGJJjQzja>>=ib=2^RF_d6VOG>LcaGA#*rU#6#ehE{P&7%z%+dl@eRoXWyOxxo6^ut zfC!joJX)<8Pvfj~tGDG|kN_|jYsN2AmanrgKH22Y=9GC6-&?KhRrb`K#rHtd86;OM zi1Z)rtRPiNS2O)khf(XN;p1PUIshdryh5nscgp@)$dB9-BlV@6ysE3J^ zz>8Q!hp8@9s$o4ift!=xXm^!a~I+bGk1pYYulYqhtGPNmb*oP0~__=8IMyQV5Ne%4AQEft{b zW(M>XXa9@WoEb^bOVZ{oJO7ipvsEdlpJOMaHAf`4T_a5vwz1tKxC7c<-WBa0QkoM! zk%WIzgnugt>qgUy$QG>jGDT-y#|%pG+z5hO6t5pdw=PM+1D3{jv3NN2Pe0G7FN$8D zmIC&&pg~$hRmC5)T|t~7#3JGp7C0r+DWmUUe629nb&S4@8tk*M0mrxsrE)<*|N(By}jI2nV)S$W&N>2IGRQWVw3S(Ty zaEcK^D6Nt=D+3f8w1XS;GEPvkf`IXd_TC=-wY2Qh(qZi~l@x7OK|m73sz$kt#<_e0ojdIC=`JT{l=O|8WamXeK= z<654m20yRY(kj+h#WX%r3^u-#pCY535S%rGO*nlic^m!ws_;%zXjcW=S7pET>B|b| zq{Ojh7AZg '') and (cboReplaceWith.Items.IndexOf(cboReplaceWith.Text) = -1) then + cboReplaceWith.Items.Add(cboReplaceWith.Text); + ModalResult := mrOK; + end; +end; + +procedure TfrmReplace.FormShow(Sender: TObject); +begin + cboSearchFor.SetFocus; +end; + +end. diff --git a/editor/studio/UnitfrmSearch.dfm b/editor/studio/UnitfrmSearch.dfm new file mode 100755 index 0000000000000000000000000000000000000000..1f990df8c73b15a8da6794100cfc3eb2f467b7c8 GIT binary patch literal 2354 zcmd5-O>g5w7^HI1@k}(HY}-5k zfj_`c;KCho;_q;V@r=h#n`Om;!`|$fdFFYa=lz(!JtLXUZ{v%zd3b4@jz4z|BbiN4 zy=2A87!XTyxBcqhz=~VH_N;_%tUr5)XDKh1_qFA9>;`$W+AaznA0f4TDS6)M3# zyp4l62aJPry#89@W$eB&if|S(Kpdi4(O@v6RZ)v@MjINZ41k0pbg>f=b2f)<~*cC~0^GC0atBGi2*vSoA0v_TeZmpEAn|5uw**}n$nBUqO z(pu_wmcBHMQ4(*G$(tV--EJoI!P^iVN$acK>rT~m)^CQsuWavgn)8kKc8Xt7^1mBz zCn%>Sdg8c0Lrgd-b3X9YPo1j4AVEu+1haQ6#K{CrPY)=NL;= za9_g$DsUZ3Z;$0zur%esXc-E3_^y<18k&5c=7lZ_feX?a*zuTqJfBD&3@L}KF3ab7 zrVUZCPjnoE!pU}irpVf3IuT5BSZ^_67Y`c-RV5l~SJRt@ioA!a0S3?_J5l|e9MN(~ zMHxJqONyf}o9RSxSc{$}`P94OQ0ms|ZZ*7!T*Kq64%9i>opXA%Rj4~|C_3)EV8TnS z%=+Dsw7ThjZkz7Aw)ET<@=>;(`Cr=36S)=B?jEshH>0}YUTU+uhI5+ZJBB-AnBpS6 zbH)*AJy9#N_aJi*VlIZVcode+N}B`SoxX^qo)6DM`LZdl@ApF)=<{7Hy?>8I6x&b@ z+R2u4N)FO8i>{?=>sURLKN$_#l_vYF&9)g`cQpN$#*?>5vE!S92s1zM){VLo^1Tyt zdV;rb)Gq7S?yz0yUOYsqAO=>fx?9w%=dY^QM7(ymAYiyj4kaXy8*pr%b1`|J$#zA+ mAtEVYCH)Us=+=j%+v769I$b7$K-i)Sthkx%R>jN+};WywKjMAKBwi{{$bigoOh-~!nZ zCUF!RWq&sApVpdDJVx<}AK|1{9|i7{grHdu;RQ$^x#UTRjLIl!1u%>zh7IQ=h_JrZ zi(=I98E$fLa8S3y0AbQa!DLFbQ>7->kApFpYPM451P#* zIDPReZtyu$Xxg+8z#0Tg6ea^&W$aJY&#H`8O2`7b=fDvP z^>7qEK$oIrb%nR=M^NU;tGl|~ZXDAPwBR)Zo)1~2EAYG-5faTn)){A(q(FOD0y5HAYhZP604GvrWpc*t?VKEUSE!w+z(XycXe0y?4Me8pTX}MAtE#X?VbgzjnP-u=W zLU&GmkwOU58fjy+=dxI;R(7Xwjtp~@&}ujVMgZ)1EHH;01pYaSIZ%=7TWQgs$~fBh z;8p8e?NX02i9@2_9NurfzZc(b>`mzZ=$1u+j~aW^jXkJxR=gj8_Q0MZpNe%^^QY%6 zbOsk8SxMHCDxAoIUduFn?O}o%=}Y39lOrky?RrS_Hg@vJhx`s;xU%=Uy-280vY6?* zdNQN3JHcbLRFzi|!C|qmR~LcSb)8IEmQ+?R8l$ifSo=zv|DLRdwcfA|-nY028nbAh zhFeo#l|SP^8GgwbqHz)STM2vfDzN2!8s;dAsyp{%gm5wLa~b!YtHd?-d7wOU*=dFg zR1Ex^4E*L*0_*!M4v)KPzqGk)_WMEFW~2SKJ=)TO`&fqy6xHjg`JTxr+85w@*A-SR zm}|GotkiJnZz7F_me-t@Hd@YN7GQ{dM7M_PvbfTB(qz=RMOUQ%3{Z~TJ$5u3Mbxzg z^@!X);%C&CvizUO^6!?##IWTjtvH&q6VeG1vd%IWZ}o&u9P)rO*+Q5R6f9n1XQr;v zuTTDo-^ukXGO*aY$$?Aa08bKyZ`Xz0faT3b9}nDlfZOAMl-il>MH=78G(M1NydfZ! zJLN}^N`;;+J-FnT+6#Ie;Pm$2=ath}bJA6YoE}SSr1W;dHGozHFNad9k2y!X^*a9z$aC?u2}R$XY-b5ym2F=QMkK-EuG#su+22F&i3t>*;;I7IcjwH-~U2A J '') and ERed.Focused then + case ColorModel.ItemIndex of + 0: + begin + HSL.RValue := ERed.Value; + NewSwatch.Color := RGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + 1: + begin + HSL.HValue := ERed.Value; + NewSwatch.Color := HSLRangeToRGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + end; +end; + +procedure TfrmSelectColor.EGreenChange(Sender: TObject); +begin +if (EGreen.Text <> '') and EGreen.Focused then + case ColorModel.ItemIndex of + 0: + begin + HSL.GValue := EGreen.Value; + NewSwatch.Color := RGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + 1: + begin + HSL.SValue := EGreen.Value; + NewSwatch.Color := HSLRangeToRGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + end; +end; + +procedure TfrmSelectColor.EBlueChange(Sender: TObject); +begin +if (EBlue.Text <> '') and EBlue.Focused then + case ColorModel.ItemIndex of + 0: + begin + HSL.BValue := EBlue.Value; + NewSwatch.Color := RGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + 1: + begin + HSL.LValue := EBlue.Value; + NewSwatch.Color := HSLRangeToRGB(ERed.Value, EGreen.Value, EBlue.Value); + end; + end; +end; + +procedure TfrmSelectColor.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + case Key of + VK_RETURN: ModalResult := mrOK; + VK_ESCAPE: ModalResult := mrCancel; + end; +end; + +procedure TfrmSelectColor.HexaChange(Sender: TObject); +begin + NewSwatch.Color := Hexa.SelectedColor; +end; + +function TfrmSelectColor.GetHint(c: TColor): string; +begin + Result := Format('RGB(%u, %u, %u)'#13'Hex: %s', [GetRValue(c), GetGValue(c), GetBValue(c), ColorToHex(c)]); +end; + +procedure TfrmSelectColor.NewSwatchColorChange(Sender: TObject); +begin + NewSwatch.Hint := GetHint(NewSwatch.Color); +end; + +procedure TfrmSelectColor.OldSwatchColorChange(Sender: TObject); +begin + OldSwatch.Hint := GetHint(OldSwatch.Color); + SetAllToSel(OldSwatch.Color); +end; + +procedure TfrmSelectColor.SetAllToSel(c: TColor); +begin + case Pages.ActivePageIndex of + // Standard Page + 0: Hexa.SelectedColor := c; + // Custom Page + 1: + begin + HSL.SelectedColor := c; + case ColorModel.ItemIndex of + 0: + begin + ERed.Value := GetRValue(c); + EGreen.Value := GetGValue(c); + EBlue.Value := GetBValue(c); + end; + 1: + begin + RGBtoHSLRange(c, h, s, l); + ERed.Value := h; + EGreen.Value := s; + EBlue.Value := l; + end; + end; + end; + end; + NewSwatch.Color := c; +end; + +procedure TfrmSelectColor.PagesChange(Sender: TObject); +begin + SetAllToSel(NewSwatch.Color); +end; + +procedure TfrmSelectColor.chkDefault2Click(Sender: TObject); +begin + chkDefault1.Checked := (Sender As TCheckBox).Checked; + chkDefault2.Checked := (Sender As TCheckBox).Checked; + + lblColor1.Enabled := not (Sender As TCheckBox).Checked; + bvlSpace1.Enabled := not (Sender As TCheckBox).Checked; + Hexa.Enabled := not (Sender As TCheckBox).Checked; + lblColor2.Enabled := not (Sender As TCheckBox).Checked; + lblColorModel.Enabled := not (Sender As TCheckBox).Checked; + LRed.Enabled := not (Sender As TCheckBox).Checked; + LGreen.Enabled := not (Sender As TCheckBox).Checked; + LBlue.Enabled := not (Sender As TCheckBox).Checked; + bvlSpace2.Enabled := not (Sender As TCheckBox).Checked; + HSL.Enabled := not (Sender As TCheckBox).Checked; + ColorModel.Enabled := not (Sender As TCheckBox).Checked; + ERed.Enabled := not (Sender As TCheckBox).Checked; + EGreen.Enabled := not (Sender As TCheckBox).Checked; + EBlue.Enabled := not (Sender As TCheckBox).Checked; +end; + +end. diff --git a/editor/studio/UnitfrmSettings.dfm b/editor/studio/UnitfrmSettings.dfm new file mode 100755 index 00000000..81569977 --- /dev/null +++ b/editor/studio/UnitfrmSettings.dfm @@ -0,0 +1,1806 @@ +object frmSettings: TfrmSettings + Left = 413 + Top = 547 + BorderStyle = bsDialog + Caption = 'AMXX-Studio - Settings' + ClientHeight = 297 + ClientWidth = 488 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object trvSettings: TJvSettingsTreeView + Left = 0 + Top = 0 + Width = 135 + Height = 260 + AutoExpand = False + ShowButtons = True + ShowLines = True + PageDefault = 0 + PageList = jplSettings + Align = alLeft + HotTrack = True + Indent = 19 + TabOrder = 0 + OnChanging = trvSettingsChanging + Items.Data = { + 060000001F0000000100000001000000FFFFFFFFFFFFFFFF0000000003000000 + 06456469746F7224000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000 + 0000000B486967686C6967687465721E000000FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF010000000000000005546F6F6C7322000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF02000000000000000953686F727463757473210000000100000001 + 000000FFFFFFFFFFFFFFFF040000000200000008436F6D70696C65722A000000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040000000000000011436F6D70696C65 + 722053657474696E67732C000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0500 + 0000000000001348616C662D4C696665204469726563746F727926000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF03000000000000000D436F64652D536E6970 + 706574731C0000000100000001000000FFFFFFFFFFFFFFFF0600000002000000 + 0346545021000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0600000000000000 + 0853657474696E67731E000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070000 + 00000000000550726F787921000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 + 0000000000000008506C75672D496E731D000000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF0900000000000000044D697363} + Items.Links = { + 0D00000000000000000000000100000002000000040000000400000005000000 + 030000000600000006000000070000000800000009000000} + end + object jplSettings: TJvPageList + Left = 135 + Top = 0 + Width = 353 + Height = 260 + ActivePage = jspTools + PropagateEnable = False + Align = alClient + OnChange = jplSettingsChange + OnChanging = jplSettingsChanging + object jspHighlighter: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Highlighter' + object lblStyles: TLabel + Left = 6 + Top = 48 + Width = 33 + Height = 13 + Caption = 'Styles:' + end + object lblLanguage: TLabel + Left = 6 + Top = 6 + Width = 51 + Height = 13 + Caption = 'Language:' + end + object lblProperties: TLabel + Left = 134 + Top = 48 + Width = 53 + Height = 13 + Caption = 'Properties:' + end + object shpStyles: TShape + Left = 6 + Top = 64 + Width = 121 + Height = 158 + Pen.Color = 8623776 + end + object cboLanguage: TFlatComboBox + Left = 6 + Top = 22 + Width = 255 + Height = 21 + Style = csDropDownList + Color = clWindow + ItemHeight = 13 + TabOrder = 0 + ItemIndex = -1 + OnChange = cboLanguageChange + end + object pnlHighlighter: TPanel + Left = 134 + Top = 64 + Width = 213 + Height = 157 + BevelOuter = bvLowered + TabOrder = 1 + object lblFont: TLabel + Left = 4 + Top = 4 + Width = 26 + Height = 13 + Caption = 'Font:' + end + object lblFontSize: TLabel + Left = 4 + Top = 90 + Width = 119 + Height = 13 + Caption = 'Font Size (0 for default):' + end + object cboFont: TmbXPFontCombo + Left = 4 + Top = 20 + Width = 205 + Height = 22 + Style = csOwnerDrawFixed + Color = clWhite + ItemHeight = 16 + ItemIndex = 7 + TabOrder = 0 + Text = 'Courier' + OnChange = cboFontChange + Items.Strings = ( + 'Arial' + 'Arial Black' + 'Arial Narrow' + 'Book Antiqua' + 'Bookman Old Style' + 'Century Gothic' + 'Comic Sans MS' + 'Courier' + 'Courier New' + 'Default' + 'Estrangelo Edessa' + 'Fixedsys' + 'Franklin Gothic Medium' + 'Garamond' + 'Gautami' + 'Georgia' + 'Haettenschweiler' + 'Impact' + 'Latha' + 'Lucida Console' + 'Lucida Sans Unicode' + 'Mangal' + 'Marlett' + 'Microsoft Sans Serif' + 'Modern' + 'Monotype Corsiva' + 'MS Outlook' + 'MS Sans Serif' + 'MS Serif' + 'MV Boli' + 'Palatino Linotype' + 'Raavi' + 'Roman' + 'Script' + 'Shruti' + 'Small Fonts' + 'Sylfaen' + 'Symbol' + 'System' + 'Tahoma' + 'Terminal' + 'Times New Roman' + 'Trebuchet MS' + 'Tunga' + 'Verdana' + 'Webdings' + 'Wingdings' + 'Wingdings 2' + 'Wingdings 3' + 'WST_Czec' + 'WST_Engl' + 'WST_Fren' + 'WST_Germ' + 'WST_Ital' + 'WST_Span' + 'WST_Swed') + Selected = 'Courier' + end + object chkBold: TFlatCheckBox + Left = 4 + Top = 66 + Width = 39 + Height = 17 + Caption = 'Bold' + TabOrder = 1 + TabStop = True + OnClick = chkBoldClick + end + object chkItalic: TFlatCheckBox + Left = 44 + Top = 66 + Width = 41 + Height = 17 + Caption = 'Italic' + TabOrder = 2 + TabStop = True + OnClick = chkItalicClick + end + object chkUnderlined: TFlatCheckBox + Left = 88 + Top = 66 + Width = 71 + Height = 17 + Caption = 'Underlined' + TabOrder = 3 + TabStop = True + OnClick = chkUnderlinedClick + end + object chkVisible: TFlatCheckBox + Left = 160 + Top = 66 + Width = 47 + Height = 17 + Caption = 'Visible' + TabOrder = 4 + TabStop = True + OnClick = chkVisibleClick + end + object pnlColors: TPanel + Left = 6 + Top = 110 + Width = 201 + Height = 41 + BevelOuter = bvLowered + TabOrder = 5 + object imgBackground: TImage + Left = 108 + Top = 18 + Width = 19 + Height = 19 + end + object lblBackground: TLabel + Left = 108 + Top = 2 + Width = 60 + Height = 13 + Caption = 'Background:' + end + object imgForeground: TImage + Left = 4 + Top = 18 + Width = 19 + Height = 19 + end + object lblForeground: TLabel + Left = 4 + Top = 4 + Width = 60 + Height = 13 + Caption = 'Foreground:' + end + object cmdSelectBackground: TFlatButton + Left = 132 + Top = 19 + Width = 61 + Height = 18 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Select...' + TabOrder = 0 + OnClick = cmdSelectBackgroundClick + end + object cmdSelectForeground: TFlatButton + Left = 28 + Top = 19 + Width = 61 + Height = 18 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Select...' + TabOrder = 1 + OnClick = cmdSelectForegroundClick + end + end + object txtFontSize: TFlatEdit + Left = 128 + Top = 86 + Width = 77 + Height = 19 + ColorFlat = clWhite + TabOrder = 6 + Text = '0' + OnChange = txtFontSizeChange + end + object chkUseDefaultFont: TFlatCheckBox + Left = 4 + Top = 46 + Width = 101 + Height = 17 + Caption = 'Use Default Font' + TabOrder = 7 + TabStop = True + OnClick = chkUseDefaultFontClick + end + end + object cmdReset: TFlatButton + Left = 266 + Top = 23 + Width = 82 + Height = 21 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'General Reset' + TabOrder = 2 + OnClick = cmdResetClick + end + object lstStyles: TListBox + Left = 7 + Top = 65 + Width = 119 + Height = 156 + BorderStyle = bsNone + ItemHeight = 13 + TabOrder = 3 + OnClick = lstStylesClick + end + end + object jspTools: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Tools' + object bvlTools1: TBevel + Left = 4 + Top = 66 + Width = 347 + Height = 3 + Shape = bsTopLine + end + object lblCodeFolding: TLabel + Left = 6 + Top = 164 + Width = 67 + Height = 13 + Caption = 'Code-Folding:' + end + object lblCaret: TLabel + Left = 6 + Top = 76 + Width = 31 + Height = 13 + Caption = 'Caret:' + end + object lblAutoIndent: TLabel + Left = 194 + Top = 164 + Width = 63 + Height = 13 + Caption = 'Auto-Indent:' + end + object chkHighlightBraces: TFlatCheckBox + Left = 6 + Top = 26 + Width = 95 + Height = 17 + Caption = 'Highlight braces' + TabOrder = 0 + TabStop = True + end + object chkAutoCloseBraces: TFlatCheckBox + Left = 176 + Top = 4 + Width = 107 + Height = 17 + Caption = 'Auto-Close braces' + TabOrder = 1 + TabStop = True + end + object chkAutoCloseQuotes: TFlatCheckBox + Left = 176 + Top = 24 + Width = 107 + Height = 17 + Caption = 'Auto-Close quotes' + TabOrder = 2 + TabStop = True + end + object chkClearUndoAfterSave: TFlatCheckBox + Left = 6 + Top = 46 + Width = 125 + Height = 17 + Caption = 'Clear Undo after save' + TabOrder = 3 + TabStop = True + end + object chkWordWrap: TFlatCheckBox + Left = 176 + Top = 44 + Width = 173 + Height = 17 + Caption = 'Word-Wrap (not recommended)' + TabOrder = 4 + TabStop = True + end + object pnlCodeFolding: TPanel + Left = 6 + Top = 180 + Width = 183 + Height = 49 + BevelOuter = bvLowered + TabOrder = 5 + object lblCodeFoldingStyle: TLabel + Left = 4 + Top = 4 + Width = 94 + Height = 13 + Caption = 'Code-Folding Style:' + end + object cboCodeFolding: TFlatComboBox + Left = 4 + Top = 20 + Width = 171 + Height = 21 + Style = csDropDownList + Color = clWindow + ItemHeight = 13 + Items.Strings = ( + 'Arrows' + 'Box' + 'Circle' + 'Plus-Minus' + 'Disabled') + TabOrder = 0 + Text = 'Box' + ItemIndex = 1 + end + end + object pnlCaret: TPanel + Left = 6 + Top = 92 + Width = 343 + Height = 67 + BevelOuter = bvLowered + TabOrder = 6 + object imgCaretFore: TImage + Left = 4 + Top = 18 + Width = 19 + Height = 19 + end + object lblSelectCaretFore: TLabel + Left = 4 + Top = 4 + Width = 60 + Height = 13 + Caption = 'Foreground:' + end + object imgCaretBack: TImage + Left = 96 + Top = 18 + Width = 19 + Height = 19 + end + object lblSelectCaretBack: TLabel + Left = 96 + Top = 4 + Width = 60 + Height = 13 + Caption = 'Background:' + end + object bvlCaret1: TBevel + Left = 186 + Top = 1 + Width = 3 + Height = 41 + Shape = bsLeftLine + end + object lblCaretPeriod: TLabel + Left = 192 + Top = 4 + Width = 34 + Height = 13 + Caption = 'Period:' + end + object bvlCaret2: TBevel + Left = 1 + Top = 42 + Width = 340 + Height = 3 + Shape = bsTopLine + end + object cmdSelectCaretFore: TFlatButton + Left = 28 + Top = 20 + Width = 61 + Height = 17 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Select...' + TabOrder = 0 + OnClick = cmdSelectCaretForeClick + end + object cmdSelectCaretBack: TFlatButton + Left = 120 + Top = 19 + Width = 61 + Height = 18 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Select...' + TabOrder = 1 + OnClick = cmdSelectCaretBackClick + end + object chkShowCaret: TFlatCheckBox + Left = 266 + Top = 20 + Width = 73 + Height = 17 + Caption = 'Show Caret' + TabOrder = 2 + TabStop = True + end + object txtPeriod: TFlatEdit + Left = 192 + Top = 19 + Width = 67 + Height = 18 + ColorFlat = clWhite + MaxLength = 6 + TabOrder = 3 + OnChange = txtPeriodChange + end + object chkRestoreCaret: TFlatCheckBox + Left = 4 + Top = 46 + Width = 331 + Height = 17 + Caption = 'Do not restore caret when document has more than xxxxxx lines' + TabOrder = 4 + TabStop = True + OnClick = chkRestoreCaretClick + end + object txtLines: TFlatEdit + Left = 272 + Top = 47 + Width = 35 + Height = 14 + ColorFlat = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -7 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 5 + Text = '600' + OnChange = txtLinesChange + end + end + object chkIndentGuides: TFlatCheckBox + Left = 6 + Top = 6 + Width = 129 + Height = 17 + Caption = 'Activate Indent Guides' + TabOrder = 7 + TabStop = True + end + object pnlAutoIndent: TPanel + Left = 194 + Top = 180 + Width = 155 + Height = 49 + BevelOuter = bvLowered + TabOrder = 8 + object chkAutoIndent: TFlatCheckBox + Left = 4 + Top = 4 + Width = 135 + Height = 17 + Caption = 'Enable Auto-Indentation' + TabOrder = 0 + TabStop = True + end + object cmdAdvancedAutoIndent: TFlatButton + Left = 6 + Top = 23 + Width = 143 + Height = 20 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Advanced...' + TabOrder = 1 + OnClick = cmdAdvancedAutoIndentClick + end + end + end + object jspShortcuts: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Shortcuts' + object shpShortcuts: TShape + Left = 8 + Top = 8 + Width = 339 + Height = 191 + Pen.Color = 8623776 + end + object lvShortcuts: TListView + Left = 9 + Top = 9 + Width = 337 + Height = 189 + BorderStyle = bsNone + Columns = < + item + Caption = 'Function' + Width = 160 + end + item + Caption = 'Shortcut' + Width = 160 + end> + ColumnClick = False + FlatScrollBars = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnClick = lvShortcutsClick + OnSelectItem = lvShortcutsSelectItem + end + object hkShortcut: THotKey + Left = 8 + Top = 206 + Width = 247 + Height = 19 + Enabled = False + InvalidKeys = [] + Modifiers = [] + TabOrder = 1 + end + object cmdApply: TFlatButton + Left = 263 + Top = 205 + Width = 85 + Height = 20 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Apply' + Enabled = False + TabOrder = 2 + OnClick = cmdApplyClick + end + end + object jspCodeSnippets: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Code-Snippets' + object ftcCodeSnippets: TFlatTabControl + Left = 6 + Top = 8 + Width = 343 + Height = 221 + Tabs.Strings = ( + 'Pawn' + 'C++' + 'HTML' + 'Other') + OnTabChanged = ftcCodeSnippetsTabChanged + object shpCodeSnippets: TShape + Left = 6 + Top = 28 + Width = 121 + Height = 165 + Pen.Color = 8623776 + end + object shpCodeSnippet: TShape + Left = 134 + Top = 28 + Width = 202 + Height = 188 + Pen.Color = 8623776 + end + object lstCodeSnippets: TListBox + Left = 7 + Top = 29 + Width = 119 + Height = 163 + BorderStyle = bsNone + ItemHeight = 13 + TabOrder = 0 + OnClick = lstCodeSnippetsClick + end + object txtCodeSnippet: TMemo + Left = 135 + Top = 29 + Width = 200 + Height = 186 + BorderStyle = bsNone + ScrollBars = ssBoth + TabOrder = 1 + WantTabs = True + OnKeyUp = txtCodeSnippetKeyUp + end + object cmdCSAdd: TFlatButton + Left = 6 + Top = 196 + Width = 59 + Height = 20 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Add' + TabOrder = 2 + OnClick = cmdCSAddClick + end + object cmdCSRemove: TFlatButton + Left = 68 + Top = 196 + Width = 59 + Height = 20 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Remove' + Enabled = False + TabOrder = 3 + OnClick = cmdCSRemoveClick + end + end + end + object jspCompiler: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Compiler' + object lblPAWN: TLabel + Left = 8 + Top = 12 + Width = 79 + Height = 13 + Caption = 'PAWN-Compiler:' + end + object lblCPPCompiler: TLabel + Left = 8 + Top = 114 + Width = 71 + Height = 13 + Caption = 'C++ Compiler:' + end + object pnlSMALLCompiler: TPanel + Left = 8 + Top = 28 + Width = 341 + Height = 81 + BevelOuter = bvLowered + TabOrder = 0 + object lblPAWNCompilerPath: TLabel + Left = 4 + Top = 4 + Width = 45 + Height = 13 + Caption = 'Compiler:' + end + object lblPAWNArgs: TLabel + Left = 4 + Top = 40 + Width = 143 + Height = 13 + Caption = 'Optional Compiler Arguments:' + end + object lblSPAWNOutput: TLabel + Left = 160 + Top = 40 + Width = 123 + Height = 13 + Caption = 'Default Output Directory:' + end + object txtPAWNCompilerPath: TFlatEdit + Left = 4 + Top = 18 + Width = 297 + Height = 19 + ColorFlat = clWhite + TabOrder = 0 + end + object cmdBrowsePAWNCompiler: TFlatButton + Left = 306 + Top = 18 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 1 + OnClick = cmdBrowsePAWNCompilerClick + end + object txtPAWNOutput: TFlatEdit + Left = 158 + Top = 54 + Width = 143 + Height = 19 + ColorFlat = clWhite + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnChange = txtPAWNOutputExit + OnEnter = txtPAWNOutputExit + OnExit = txtPAWNOutputExit + end + object txtPAWNArgs: TFlatEdit + Left = 4 + Top = 54 + Width = 149 + Height = 19 + ColorFlat = clWhite + TabOrder = 3 + end + object cmdBrowseOutputPAWN: TFlatButton + Left = 306 + Top = 54 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 4 + OnClick = cmdBrowseOutputPAWNClick + end + end + object pnlCPPCompiler: TPanel + Left = 6 + Top = 130 + Width = 341 + Height = 97 + BevelOuter = bvLowered + TabOrder = 1 + object lblCPPCompilerPath: TLabel + Left = 4 + Top = 4 + Width = 45 + Height = 13 + Caption = 'Compiler:' + end + object lblCPPHint: TLabel + Left = 4 + Top = 80 + Width = 263 + Height = 13 + Caption = 'Hint: AMXX-Studio'#39's C++ Editor supports only libraries!' + end + object lblCPPCompilerArgs: TLabel + Left = 4 + Top = 40 + Width = 143 + Height = 13 + Caption = 'Optional Compiler Arguments:' + end + object lblCPPOutput: TLabel + Left = 160 + Top = 40 + Width = 143 + Height = 13 + Caption = 'Optional Compiler Arguments:' + end + object txtCPPCompilerPath: TFlatEdit + Left = 4 + Top = 18 + Width = 297 + Height = 19 + ColorFlat = clWhite + TabOrder = 0 + end + object cmdBrowseCPPCompiler: TFlatButton + Left = 306 + Top = 18 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 1 + OnClick = cmdBrowseCPPCompilerClick + end + object txtCPPCompilerArguments: TFlatEdit + Left = 4 + Top = 54 + Width = 149 + Height = 19 + ColorFlat = clWhite + TabOrder = 2 + end + object txtCPPOutput: TFlatEdit + Left = 158 + Top = 54 + Width = 143 + Height = 19 + ColorFlat = clWhite + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnChange = txtCPPOutputChange + OnEnter = txtCPPOutputChange + OnExit = txtCPPOutputChange + end + object cmdBrowseOutputCPP: TFlatButton + Left = 306 + Top = 54 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 4 + OnClick = cmdBrowseOutputCPPClick + end + end + end + object jspHalfLife: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Half-Life Directory' + object pnlHLExecutable: TPanel + Left = 38 + Top = 70 + Width = 281 + Height = 123 + BevelOuter = bvLowered + TabOrder = 0 + object lblHLExec: TLabel + Left = 4 + Top = 4 + Width = 100 + Height = 13 + Caption = 'Half-Life Executable:' + end + object lblCustomParameters: TLabel + Left = 6 + Top = 82 + Width = 98 + Height = 13 + Caption = 'Custom parameters:' + end + object lblAMXXDir: TLabel + Left = 6 + Top = 42 + Width = 180 + Height = 13 + Caption = 'AMX Mod X directory on listen server:' + end + object txtHLExec: TFlatEdit + Left = 4 + Top = 20 + Width = 235 + Height = 19 + ColorFlat = clWhite + TabOrder = 0 + end + object cmdBrowseHL: TFlatButton + Left = 244 + Top = 20 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 1 + OnClick = cmdBrowseHLClick + end + object txtCustomParameters: TFlatEdit + Left = 6 + Top = 98 + Width = 267 + Height = 19 + ColorFlat = clWhite + TabOrder = 2 + end + object txtAMXXDir: TFlatEdit + Left = 6 + Top = 58 + Width = 233 + Height = 19 + ColorFlat = clWhite + TabOrder = 3 + end + object cmdBrowseAMXXDir: TFlatButton + Left = 244 + Top = 58 + Width = 29 + Height = 19 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '...' + TabOrder = 4 + OnClick = cmdBrowseAMXXDirClick + end + end + end + object jspFTP: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Settings' + object lblFTPData: TLabel + Left = 8 + Top = 6 + Width = 48 + Height = 13 + Caption = 'FTP Data:' + end + object lblDefaultDirectory: TLabel + Left = 10 + Top = 94 + Width = 282 + Height = 13 + Caption = 'Plesae select the AMX Mod X directory on your FTP server:' + end + object pnlFTPData: TPanel + Left = 6 + Top = 22 + Width = 339 + Height = 63 + BevelOuter = bvLowered + TabOrder = 0 + object lblHost: TLabel + Left = 6 + Top = 6 + Width = 26 + Height = 13 + Caption = 'Host:' + end + object lblPassword: TLabel + Left = 258 + Top = 6 + Width = 50 + Height = 13 + Caption = 'Password:' + end + object lblUsername: TLabel + Left = 176 + Top = 6 + Width = 52 + Height = 13 + Caption = 'Username:' + end + object lblPort: TLabel + Left = 130 + Top = 6 + Width = 24 + Height = 13 + Caption = 'Port:' + end + object chkPassive: TFlatCheckBox + Left = 6 + Top = 42 + Width = 143 + Height = 17 + Caption = 'Use PASV (Passive) Mode' + Checked = True + TabOrder = 0 + TabStop = True + end + object txtHost: TFlatEdit + Left = 6 + Top = 20 + Width = 121 + Height = 19 + ColorFlat = clWhite + TabOrder = 1 + end + object txtPort: TFlatEdit + Left = 130 + Top = 20 + Width = 41 + Height = 19 + ColorFlat = clWhite + TabOrder = 2 + Text = '21' + OnChange = txtPortChange + end + object txtUsername: TFlatEdit + Left = 176 + Top = 20 + Width = 77 + Height = 19 + ColorFlat = clWhite + TabOrder = 3 + end + object txtPassword: TFlatEdit + Left = 256 + Top = 20 + Width = 79 + Height = 19 + ColorFlat = clWhite + PasswordChar = '*' + TabOrder = 4 + end + object cmdConnect: TFlatButton + Left = 256 + Top = 42 + Width = 79 + Height = 17 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorBorder = clBtnShadow + ColorHighLight = clBtnShadow + ColorShadow = clBtnShadow + Caption = 'Connect' + TabOrder = 5 + OnClick = cmdConnectClick + end + end + object pnlDefaultPath: TPanel + Left = 8 + Top = 110 + Width = 339 + Height = 119 + BevelOuter = bvLowered + TabOrder = 1 + object lblDefaultDir: TLabel + Left = 4 + Top = 96 + Width = 104 + Height = 13 + Caption = 'AMX Mod X Directory:' + end + object pnlDirectory: TPanel + Left = 4 + Top = 4 + Width = 331 + Height = 85 + BevelOuter = bvLowered + TabOrder = 0 + object trvDirectories: TTreeView + Left = 1 + Top = 1 + Width = 329 + Height = 83 + Align = alClient + BorderStyle = bsNone + Images = ilImages + Indent = 19 + TabOrder = 0 + OnChange = trvDirectoriesChange + OnCollapsing = trvDirectoriesCollapsing + OnExpanding = trvDirectoriesExpanding + OnExpanded = trvDirectoriesExpanded + end + end + object txtDefaultDir: TFlatEdit + Left = 112 + Top = 94 + Width = 223 + Height = 19 + ColorFlat = clWhite + Enabled = False + TabOrder = 1 + end + end + end + object jspProxy: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Proxy' + object pnlProxy: TPanel + Left = 62 + Top = 48 + Width = 223 + Height = 135 + BevelOuter = bvLowered + Caption = 'pnlProxy' + TabOrder = 0 + object lblProxyPassword: TLabel + Left = 116 + Top = 88 + Width = 50 + Height = 13 + Caption = 'Password:' + Enabled = False + end + object lblProxyUsername: TLabel + Left = 8 + Top = 88 + Width = 52 + Height = 13 + Caption = 'Username:' + Enabled = False + end + object lblProxyPort: TLabel + Left = 150 + Top = 48 + Width = 24 + Height = 13 + Caption = 'Port:' + Enabled = False + end + object lblProxyHost: TLabel + Left = 8 + Top = 48 + Width = 26 + Height = 13 + Caption = 'Host:' + Enabled = False + end + object lblProxy: TLabel + Left = 8 + Top = 6 + Width = 32 + Height = 13 + Caption = 'Proxy:' + end + object txtProxyPassword: TFlatEdit + Left = 114 + Top = 104 + Width = 99 + Height = 19 + ColorFlat = clWhite + Enabled = False + PasswordChar = '*' + TabOrder = 4 + OnChange = txtProxyHostChange + end + object txtProxyUsername: TFlatEdit + Left = 8 + Top = 104 + Width = 99 + Height = 19 + ColorFlat = clWhite + Enabled = False + TabOrder = 3 + OnChange = txtProxyHostChange + end + object txtProxyHost: TFlatEdit + Left = 8 + Top = 64 + Width = 137 + Height = 19 + ColorFlat = clWhite + Enabled = False + TabOrder = 1 + OnChange = txtProxyHostChange + end + object txtProxyPort: TFlatEdit + Left = 148 + Top = 64 + Width = 65 + Height = 19 + ColorFlat = clWhite + Enabled = False + MaxLength = 5 + TabOrder = 2 + Text = '8080' + OnChange = txtProxyPortChange + end + object cboProxy: TFlatComboBox + Left = 6 + Top = 22 + Width = 207 + Height = 21 + Style = csDropDownList + Color = clWindow + ItemHeight = 13 + Items.Strings = ( + 'None' + 'HTTP Proxy with FTP' + 'Open' + 'Site' + 'Transparent' + 'User (Pass)' + 'User (Site)') + TabOrder = 0 + Text = 'None' + ItemIndex = 0 + OnChange = cboProxyChange + end + end + end + object jspPlugIns: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Plug-Ins' + object shpPlugins: TShape + Left = 6 + Top = 6 + Width = 343 + Height = 191 + Pen.Color = 8623776 + end + object lvPlugins: TListView + Left = 7 + Top = 7 + Width = 341 + Height = 188 + BorderStyle = bsNone + Columns = < + item + Caption = 'Plugin Name' + Width = 70 + end + item + Caption = 'Filename' + Width = 90 + end + item + Caption = 'Description' + Width = 105 + end + item + Caption = 'Status' + Width = 60 + end> + ColumnClick = False + FlatScrollBars = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + end + object cmdReload: TFlatButton + Left = 7 + Top = 201 + Width = 80 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Reload' + TabOrder = 1 + OnClick = cmdReloadClick + end + object cmdLoad: TFlatButton + Left = 93 + Top = 201 + Width = 80 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Load' + TabOrder = 2 + OnClick = cmdLoadClick + end + object cmdUnload: TFlatButton + Left = 179 + Top = 201 + Width = 80 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Unload' + TabOrder = 3 + OnClick = cmdUnloadClick + end + object cmdRemove: TFlatButton + Left = 266 + Top = 201 + Width = 80 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Remove' + TabOrder = 4 + OnClick = cmdRemoveClick + end + end + object jspMisc: TJvStandardPage + Left = 0 + Top = 25 + Width = 353 + Height = 235 + Caption = 'Misc' + object pnlDefaultNewPluginValues: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 69 + BevelOuter = bvLowered + TabOrder = 0 + object lblDefaultInfo: TLabel + Left = 4 + Top = 4 + Width = 229 + Height = 13 + Caption = 'Use the following data for creating new plugins:' + end + object lblDefaultAuthor: TLabel + Left = 212 + Top = 26 + Width = 37 + Height = 13 + Caption = 'Author:' + end + object lblDefaultVersion: TLabel + Left = 132 + Top = 26 + Width = 39 + Height = 13 + Caption = 'Version:' + end + object lblDefaultName: TLabel + Left = 6 + Top = 26 + Width = 68 + Height = 13 + Caption = 'Plug-In Name:' + end + object txtDefaultAuthor: TFlatEdit + Left = 212 + Top = 42 + Width = 117 + Height = 19 + ColorFlat = clWhite + TabOrder = 0 + Text = 'Your name' + end + object txtDefaultName: TFlatEdit + Left = 6 + Top = 42 + Width = 121 + Height = 19 + ColorFlat = clWhite + TabOrder = 1 + Text = 'New Plugin' + end + object txtDefaultVersion: TFlatEdit + Left = 132 + Top = 42 + Width = 73 + Height = 19 + ColorFlat = clWhite + TabOrder = 2 + Text = '1.0' + end + end + object chkShowStatusbar: TFlatCheckBox + Left = 8 + Top = 214 + Width = 93 + Height = 17 + Caption = 'Show Statusbar' + TabOrder = 1 + TabStop = True + end + object pnlNotes: TPanel + Left = 8 + Top = 84 + Width = 337 + Height = 57 + BevelOuter = bvLowered + TabOrder = 2 + object lblSaveNotesTo: TLabel + Left = 4 + Top = 4 + Width = 71 + Height = 13 + Caption = 'Save notes to:' + end + object optFileComment: TFlatRadioButton + Left = 4 + Top = 20 + Width = 131 + Height = 17 + Caption = 'Its file (as comment)' + Checked = True + TabOrder = 0 + TabStop = True + end + object optConfig: TFlatRadioButton + Left = 138 + Top = 20 + Width = 193 + Height = 17 + Caption = 'AMXX-Studio configs (recommended)' + TabOrder = 1 + end + object optDontSave: TFlatRadioButton + Left = 4 + Top = 36 + Width = 69 + Height = 17 + Caption = 'Don'#39't save' + TabOrder = 2 + end + end + object pnlPCSpeed: TPanel + Left = 8 + Top = 146 + Width = 337 + Height = 67 + BevelOuter = bvLowered + TabOrder = 3 + object lblCPUSpeed: TLabel + Left = 4 + Top = 4 + Width = 267 + Height = 13 + Caption = 'Please rate your CPU speed (needed for Auto-Update):' + end + object lblSlow: TLabel + Left = 4 + Top = 48 + Width = 22 + Height = 13 + Caption = 'Slow' + end + object lblAverage: TLabel + Left = 131 + Top = 48 + Width = 41 + Height = 13 + Caption = 'Average' + end + object lblFast: TLabel + Left = 308 + Top = 48 + Width = 21 + Height = 13 + Caption = 'Fast' + end + object sldSpeed: TJvxSlider + Left = 4 + Top = 18 + Width = 325 + Height = 31 + Increment = 2 + MinValue = 1 + MaxValue = 10 + TabOrder = 0 + Value = 5 + end + end + end + object lblCurrSetting: TLabel + Left = 0 + Top = 0 + Width = 353 + Height = 25 + Align = alTop + Alignment = taCenter + Caption = 'Editor - Highlighter' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -21 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + end + end + object pnlControls: TPanel + Left = 0 + Top = 260 + Width = 488 + Height = 37 + Align = alBottom + BevelOuter = bvNone + TabOrder = 2 + object bvlControls: TBevel + Left = 0 + Top = 0 + Width = 488 + Height = 3 + Align = alTop + Shape = bsTopLine + end + object cmdOK: TFlatButton + Left = 386 + Top = 7 + Width = 85 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '&OK' + ModalResult = 1 + TabOrder = 0 + end + object cmdCancel: TFlatButton + Left = 296 + Top = 7 + Width = 85 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 1 + end + end + object odBrowse: TOpenDialog + Filter = 'Executables (*.exe)|*.exe|All files (*.*)|*.*' + Left = 441 + Top = 2 + end + object ilImages: TImageList + Left = 410 + Top = 2 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 00000000000000000000000000000000000000000000078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00000000000000000000000000078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE0062CBF200078DBE00A4F6 + FD0066CEF50066CEF50066CEF50066CEF50066CEF50066CEF50066CEF50066CE + F5003AAFDA00ABF2FC00078DBE0000000000078DBE0025A0CD005FC8EE0083E1 + FB0066CDF40066CDF40066CDF40066CDF40066CDF40066CDF40066CDF40066CD + F4003AAED8001495C40000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE006BD2F700078DBE00A9F3 + FC006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4F8006FD4 + F8003AAFDA00BEECF400078DBE0000000000078DBE004CBBE30031A8D30095EC + FB006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4F9006ED4 + F9003FB1DB00C8F6FB00078DBE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE0072D6FA00078DBE00ABF2 + FC0079DCFA0079DCFA0079DCFA0079DCFA0079DCFA007ADDFB0079DCFA0079DC + FA0045B6DF00BEECF400078DBE0000000000078DBE0072D6F900078DBE00ACF8 + FD007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADBFA007ADB + FA0043B5DD00C8F6FB00078DBE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE007ADDFB00078DBE00B4F3 + FC0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4FB0084E4 + FB0045B6DF00C3F0F700078DBE0000000000078DBE007CDDFA001495C40095EC + FB0092EAFB0086E3FB0083E1FB0083E1FB0086E3FB0083E1FB0083E1FB0086E3 + FB0049B8E000C8F6FB001495C400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE0081E2FB00078DBE00BEF4 + FC008EECFC008EECFC008EECFC008EECFC008EECFC008EECFC008EECFC008EEC + FC004CBCE400BEF4FC00078DBE0000000000078DBE0083E1FB0043B5DD0059C4 + EA00ACF8FD008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB008FE9FB008FE9 + FB004CBBE300C8F6FB00C8F6FB00078DBE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE008BEAFC00078DBE00D2F7 + FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6FC00C8F6 + FC00BADADF00D2F7FC00078DBE0000000000078DBE008CE7FB0078DAFA0025A0 + CD00E5F8FA00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6FB00C8F6 + FB0095ECFB00E5F8FA00CFF6FA00078DBE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE0094F1FD00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE0000000000078DBE0096F0FC0096F0FC001495 + C400078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00078DBE00078DBE00078DBE00078DBE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE009BF4FD009BF4FD009BF4 + FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4FD009BF4 + FD00078CBD00000000000000000000000000078DBE009CF5FD009AF4FD009AF4 + FD009CF5FD009DF6FD009AF4FD009CF5FD009AF4FD009CF5FD009AF4FD009AF4 + FD00088DBE000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000078DBE00D2F7FC00A0F6FD00A0F6 + FD00A0F6FD00A2F7FD00A2F7FD00A0F6FD00A2F7FD00A2F7FD00A0F6FD00A2F7 + FD00078CBD00000000000000000000000000078DBE00E5F8FA00A1F9FE00A1F9 + FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9FE00A1F9 + FE00088DBE000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000078DBE00D2F7FC00A4F6 + FD00A4F6FD00A4F6FD00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE000000000000000000000000000000000000000000078DBE00E5F8FA00A4F9 + FE00A4F9FE00A4F9FE00078DBE00078DBE00078DBE00078DBE00078DBE00078D + BE00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000078DBE00078D + BE00078DBE00078DBE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000078DBE00078D + BE00078DBE00078DBE0000000000000000000000000000000000000000000000 + 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 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF0080038007000000000001000300000000 + 0001000100000000000100010000000000010001000000000001000000000000 + 0001000000000000000100000000000000070007000000000007000700000000 + 800F800F00000000C3FFC3FF00000000FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/editor/studio/UnitfrmSettings.pas b/editor/studio/UnitfrmSettings.pas new file mode 100755 index 00000000..e111024c --- /dev/null +++ b/editor/studio/UnitfrmSettings.pas @@ -0,0 +1,949 @@ +unit UnitfrmSettings; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, JvExControls, JvComponent, JvPageList, + ComCtrls, JvExComCtrls, JvPageListTreeView, TBXDkPanels, SpTBXDkPanels, + SpTBXEditors, IniFiles, TFlatButtonUnit, TFlatEditUnit, TFlatCheckBoxUnit, + TFlatListBoxUnit, TFlatComboBoxUnit, mbXPFontCombo, ScintillaLanguageManager, + SciKeyBindings, menus, TFlatTabControlUnit, TFlatMemoUnit, + TFlatRadioButtonUnit, sciLexer, sciLexerMod, sciLexerMemo, Dialogs, + FileCtrl, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, + IdFTP, IdException, ImgList, JvxSlider; + +type + TfrmSettings = class(TForm) + trvSettings: TJvSettingsTreeView; + jplSettings: TJvPageList; + jspHighlighter: TJvStandardPage; + jspTools: TJvStandardPage; + jspShortcuts: TJvStandardPage; + jspCompiler: TJvStandardPage; + jspFTP: TJvStandardPage; + jspPlugIns: TJvStandardPage; + jspMisc: TJvStandardPage; + jspCodeSnippets: TJvStandardPage; + lblCurrSetting: TLabel; + pnlControls: TPanel; + bvlControls: TBevel; + cmdOK: TFlatButton; + cmdCancel: TFlatButton; + lblStyles: TLabel; + cboLanguage: TFlatComboBox; + lblLanguage: TLabel; + pnlHighlighter: TPanel; + lblProperties: TLabel; + cboFont: TmbXPFontCombo; + lblFont: TLabel; + chkBold: TFlatCheckBox; + chkItalic: TFlatCheckBox; + chkUnderlined: TFlatCheckBox; + chkVisible: TFlatCheckBox; + pnlColors: TPanel; + cmdSelectBackground: TFlatButton; + imgBackground: TImage; + lblBackground: TLabel; + cmdSelectForeground: TFlatButton; + imgForeground: TImage; + lblForeground: TLabel; + lblFontSize: TLabel; + txtFontSize: TFlatEdit; + chkUseDefaultFont: TFlatCheckBox; + cmdReset: TFlatButton; + pnlDefaultNewPluginValues: TPanel; + lblDefaultInfo: TLabel; + lblDefaultAuthor: TLabel; + txtDefaultAuthor: TFlatEdit; + lblDefaultVersion: TLabel; + lblDefaultName: TLabel; + txtDefaultName: TFlatEdit; + txtDefaultVersion: TFlatEdit; + shpStyles: TShape; + lstStyles: TListBox; + chkHighlightBraces: TFlatCheckBox; + chkAutoCloseBraces: TFlatCheckBox; + chkAutoCloseQuotes: TFlatCheckBox; + chkClearUndoAfterSave: TFlatCheckBox; + bvlTools1: TBevel; + chkWordWrap: TFlatCheckBox; + lblCodeFolding: TLabel; + pnlCodeFolding: TPanel; + cboCodeFolding: TFlatComboBox; + lblCodeFoldingStyle: TLabel; + lvShortcuts: TListView; + hkShortcut: THotKey; + cmdApply: TFlatButton; + shpShortcuts: TShape; + ftcCodeSnippets: TFlatTabControl; + shpCodeSnippets: TShape; + shpCodeSnippet: TShape; + lstCodeSnippets: TListBox; + txtCodeSnippet: TMemo; + cmdCSAdd: TFlatButton; + cmdCSRemove: TFlatButton; + chkShowStatusbar: TFlatCheckBox; + lblCaret: TLabel; + pnlCaret: TPanel; + cmdSelectCaretFore: TFlatButton; + imgCaretFore: TImage; + lblSelectCaretFore: TLabel; + cmdSelectCaretBack: TFlatButton; + imgCaretBack: TImage; + lblSelectCaretBack: TLabel; + bvlCaret1: TBevel; + chkShowCaret: TFlatCheckBox; + lblCaretPeriod: TLabel; + txtPeriod: TFlatEdit; + pnlNotes: TPanel; + lblSaveNotesTo: TLabel; + optFileComment: TFlatRadioButton; + optConfig: TFlatRadioButton; + shpPlugins: TShape; + lvPlugins: TListView; + cmdReload: TFlatButton; + cmdLoad: TFlatButton; + cmdUnload: TFlatButton; + cmdRemove: TFlatButton; + chkRestoreCaret: TFlatCheckBox; + txtLines: TFlatEdit; + bvlCaret2: TBevel; + optDontSave: TFlatRadioButton; + lblPAWN: TLabel; + pnlSMALLCompiler: TPanel; + lblCPPCompiler: TLabel; + pnlCPPCompiler: TPanel; + lblPAWNCompilerPath: TLabel; + txtPAWNCompilerPath: TFlatEdit; + cmdBrowsePAWNCompiler: TFlatButton; + txtCPPCompilerPath: TFlatEdit; + lblCPPCompilerPath: TLabel; + cmdBrowseCPPCompiler: TFlatButton; + lblCPPHint: TLabel; + lblCPPCompilerArgs: TLabel; + txtCPPCompilerArguments: TFlatEdit; + txtCPPOutput: TFlatEdit; + lblCPPOutput: TLabel; + txtPAWNOutput: TFlatEdit; + txtPAWNArgs: TFlatEdit; + lblPAWNArgs: TLabel; + lblSPAWNOutput: TLabel; + cmdBrowseOutputPAWN: TFlatButton; + cmdBrowseOutputCPP: TFlatButton; + pnlFTPData: TPanel; + lblFTPData: TLabel; + chkPassive: TFlatCheckBox; + txtHost: TFlatEdit; + lblHost: TLabel; + txtPort: TFlatEdit; + txtUsername: TFlatEdit; + txtPassword: TFlatEdit; + lblPassword: TLabel; + lblUsername: TLabel; + lblPort: TLabel; + pnlDefaultPath: TPanel; + pnlDirectory: TPanel; + trvDirectories: TTreeView; + txtDefaultDir: TFlatEdit; + cmdConnect: TFlatButton; + lblDefaultDir: TLabel; + lblDefaultDirectory: TLabel; + odBrowse: TOpenDialog; + ilImages: TImageList; + jspProxy: TJvStandardPage; + pnlProxy: TPanel; + txtProxyPassword: TFlatEdit; + txtProxyUsername: TFlatEdit; + lblProxyPassword: TLabel; + lblProxyUsername: TLabel; + txtProxyHost: TFlatEdit; + txtProxyPort: TFlatEdit; + lblProxyPort: TLabel; + lblProxyHost: TLabel; + cboProxy: TFlatComboBox; + lblProxy: TLabel; + pnlPCSpeed: TPanel; + lblCPUSpeed: TLabel; + sldSpeed: TJvxSlider; + lblSlow: TLabel; + lblAverage: TLabel; + lblFast: TLabel; + jspHalfLife: TJvStandardPage; + pnlHLExecutable: TPanel; + lblHLExec: TLabel; + txtHLExec: TFlatEdit; + cmdBrowseHL: TFlatButton; + lblCustomParameters: TLabel; + txtCustomParameters: TFlatEdit; + chkIndentGuides: TFlatCheckBox; + lblAutoIndent: TLabel; + pnlAutoIndent: TPanel; + chkAutoIndent: TFlatCheckBox; + cmdAdvancedAutoIndent: TFlatButton; + txtAMXXDir: TFlatEdit; + lblAMXXDir: TLabel; + cmdBrowseAMXXDir: TFlatButton; + procedure jplSettingsChange(Sender: TObject); + procedure txtLinesChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure chkRestoreCaretClick(Sender: TObject); + procedure txtFontSizeChange(Sender: TObject); + procedure cboLanguageChange(Sender: TObject); + procedure chkUseDefaultFontClick(Sender: TObject); + procedure cboFontChange(Sender: TObject); + procedure chkBoldClick(Sender: TObject); + procedure chkItalicClick(Sender: TObject); + procedure chkUnderlinedClick(Sender: TObject); + procedure chkVisibleClick(Sender: TObject); + procedure cmdResetClick(Sender: TObject); + procedure lstStylesClick(Sender: TObject); + procedure lvShortcutsClick(Sender: TObject); + procedure trvSettingsChanging(Sender: TObject; Node: TTreeNode; + var AllowChange: Boolean); + procedure txtPeriodChange(Sender: TObject); + procedure txtPortChange(Sender: TObject); + procedure lvShortcutsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure cmdApplyClick(Sender: TObject); + procedure cmdSelectForegroundClick(Sender: TObject); + procedure cmdSelectBackgroundClick(Sender: TObject); + procedure cmdSelectCaretForeClick(Sender: TObject); + procedure cmdSelectCaretBackClick(Sender: TObject); + procedure cmdBrowsePAWNCompilerClick(Sender: TObject); + procedure cmdBrowseCPPCompilerClick(Sender: TObject); + procedure cmdBrowseOutputPAWNClick(Sender: TObject); + procedure cmdBrowseOutputCPPClick(Sender: TObject); + procedure txtPAWNOutputExit(Sender: TObject); + procedure txtCPPOutputChange(Sender: TObject); + procedure cmdCSAddClick(Sender: TObject); + procedure cmdCSRemoveClick(Sender: TObject); + procedure lstCodeSnippetsClick(Sender: TObject); + procedure ftcCodeSnippetsTabChanged(Sender: TObject); + procedure txtCodeSnippetKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure cmdConnectClick(Sender: TObject); + procedure trvDirectoriesExpanded(Sender: TObject; Node: TTreeNode); + procedure trvDirectoriesChange(Sender: TObject; Node: TTreeNode); + procedure trvDirectoriesExpanding(Sender: TObject; Node: TTreeNode; + var AllowExpansion: Boolean); + procedure trvDirectoriesCollapsing(Sender: TObject; Node: TTreeNode; + var AllowCollapse: Boolean); + procedure cboProxyChange(Sender: TObject); + procedure txtProxyPortChange(Sender: TObject); + procedure jplSettingsChanging(Sender: TObject; PageIndex: Integer; + var AllowChange: Boolean); + procedure txtProxyHostChange(Sender: TObject); + procedure cmdBrowseHLClick(Sender: TObject); + procedure cmdAdvancedAutoIndentClick(Sender: TObject); + procedure cmdReloadClick(Sender: TObject); + procedure cmdUnloadClick(Sender: TObject); + procedure cmdLoadClick(Sender: TObject); + procedure cmdRemoveClick(Sender: TObject); + procedure cmdBrowseAMXXDirClick(Sender: TObject); + public + Foreground, Background: TColor; + CaretFore, CaretBack: TColor; + procedure UpdateItemIndex; + procedure PaintForeground(eColor: TColor); + procedure PaintBackground(eColor: TColor); + procedure PaintCaretFore(eColor: TColor); + procedure PaintCaretBack(eColor: TColor); + procedure EnableControls(eEnable: Boolean); // For Proxy + end; + +var + frmSettings: TfrmSettings; + eConfig: TIniFile; + +implementation + +uses UnitMainTools, UnitfrmMain, UnitfrmSelectColor, UnitLanguages, + UnitCodeSnippets, UnitfrmAutoIndent, UnitPlugins; + +{$R *.DFM} + +procedure TfrmSettings.jplSettingsChange(Sender: TObject); +begin + if not Started then exit; + + if Assigned(trvSettings.Selected.Parent) then + lblCurrSetting.Caption := trvSettings.Selected.Parent.Text + ' - ' + (jplSettings.ActivePage as TJvStandardPage).Caption + else + lblCurrSetting.Caption := (jplSettings.ActivePage as TJvStandardPage).Caption; + + txtPAWNOutputExit(Sender); + txtCPPOutputChange(Sender); +end; + +procedure TfrmSettings.txtLinesChange(Sender: TObject); +begin + if not IsNumeric(txtLines.Text) then + txtLines.Text := '600'; +end; + +procedure TfrmSettings.FormCreate(Sender: TObject); +begin + eConfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config\Settings.ini'); + ReloadIni; + case eConfig.ReadInteger('Misc', 'WindowState', 0) of + 0: frmMain.WindowState := wsNormal; + 1: frmMain.WindowState := wsMaximized; + 2: frmMain.WindowState := wsMinimized; + end; + + PaintForeground(clBlack); + PaintBackground(clBlack); + PaintCaretFore(clBlack); + PaintCaretBack(clBlack); +end; + +procedure TfrmSettings.FormDestroy(Sender: TObject); +begin + case frmMain.WindowState of + wsNormal : eConfig.WriteInteger('Misc', 'WindowState', 0); + wsMaximized: eConfig.WriteInteger('Misc', 'WindowState', 1); + else eConfig.WriteInteger('Misc', 'WindowState', 2); + end; + + if frmMain.IdFTP.Connected then + frmMain.IdFTP.Disconnect; + + eConfig.Free; +end; + +procedure TfrmSettings.FormShow(Sender: TObject); +var i: integer; +begin + txtLines.Enabled := chkRestoreCaret.Checked; + cboLanguage.OnChange(Self); + for i := 0 to trvSettings.Items.Count -1 do + trvSettings.Items[i].Expand(True); +end; + +procedure TfrmSettings.chkRestoreCaretClick(Sender: TObject); +begin + txtLines.Enabled := chkRestoreCaret.Checked; +end; + +procedure TfrmSettings.txtFontSizeChange(Sender: TObject); +begin + if not IsNumeric(txtFontSize.Text) then begin + txtFontSize.Text := '0'; + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontSize := 0; + end + else + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontSize := StrToInt(txtFontSize.Text); +end; + +{ For Highlighter Section } + +procedure TfrmSettings.PaintBackground(eColor: TColor); +begin + imgBackground.Canvas.Pen.Color := $008396A0; + imgBackground.Canvas.Brush.Color := eColor; + imgBackground.Canvas.Rectangle(0, 0, 19, 19); +end; + +procedure TfrmSettings.PaintForeground(eColor: TColor); +begin + imgForeground.Canvas.Pen.Color := $008396A0; + imgForeground.Canvas.Brush.Color := eColor; + imgForeground.Canvas.Rectangle(0, 0, 19, 19); +end; + +procedure TfrmSettings.cboLanguageChange(Sender: TObject); +var i: integer; +begin + lstStyles.Items.Clear; + for i := 0 to TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Count -1 do + lstStyles.Items.Add(TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[i]).Name); + + if lstStyles.Items.Count > 0 then + lstStyles.ItemIndex := 0; + cboFont.Enabled := lstStyles.Items.Count <> 0; + chkUseDefaultFont.Enabled := lstStyles.Items.Count <> 0; + chkBold.Enabled := lstStyles.Items.Count <> 0; + chkItalic.Enabled := lstStyles.Items.Count <> 0; + chkUnderlined.Enabled := lstStyles.Items.Count <> 0; + chkVisible.Enabled := lstStyles.Items.Count <> 0; + cmdSelectForeground.Enabled := lstStyles.Items.Count <> 0; + cmdSelectBackground.Enabled := lstStyles.Items.Count <> 0; + + UpdateItemIndex; +end; + +procedure TfrmSettings.chkUseDefaultFontClick(Sender: TObject); +begin + cboFont.Enabled := not chkUseDefaultFont.Checked; + if chkUseDefaultFont.Checked then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontName := '' + else + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontName := cboFont.Selected; +end; + +procedure TfrmSettings.cboFontChange(Sender: TObject); +begin + if (not chkUseDefaultFont.Checked) then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontName := cboFont.Selected; +end; + +procedure TfrmSettings.chkBoldClick(Sender: TObject); +begin + if chkBold.Checked then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles + [fsBold] + else + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles - [fsBold]; +end; + +procedure TfrmSettings.chkItalicClick(Sender: TObject); +begin + if chkItalic.Checked then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles + [fsItalic] + else + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles - [fsItalic]; +end; + +procedure TfrmSettings.chkUnderlinedClick(Sender: TObject); +begin + if chkUnderlined.Checked then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles + [fsUnderline] + else + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles := TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontStyles - [fsUnderline]; +end; + +procedure TfrmSettings.chkVisibleClick(Sender: TObject); +begin + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).Visible := chkVisible.Checked; +end; + +procedure TfrmSettings.cmdResetClick(Sender: TObject); +begin + if MessageBox(Handle, PChar(lWarnHighlighterReset), 'AMXX-Studio', MB_ICONWARNING + MB_YESNO) = mrYes then begin + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'config\Editor.sci')); + cmdReset.Enabled := False; + cboLanguage.Enabled := False; + lstStyles.Enabled := False; + lblFont.Enabled := False; + cboFont.Enabled := False; + chkUseDefaultFont.Enabled := False; + chkBold.Enabled := False; + chkItalic.Enabled := False; + chkUnderlined.Enabled := False; + chkVisible.Enabled := False; + lblFontSize.Enabled := False; + txtFontSize.Enabled := False; + lblForeground.Enabled := False; + cmdSelectForeground.Enabled := False; + lblBackground.Enabled := False; + cmdSelectBackground.Enabled := False; + MessageBox(Handle, PChar(lHighlighterResetDone), 'AMXX-Studio', MB_ICONINFORMATION); + end; +end; + +procedure TfrmSettings.UpdateItemIndex; +begin + lblFont.Enabled := lstStyles.ItemIndex <> -1; + cboFont.Enabled := lstStyles.ItemIndex <> -1; + chkUseDefaultFont.Enabled := lstStyles.ItemIndex <> -1; + chkBold.Enabled := lstStyles.ItemIndex <> -1; + chkItalic.Enabled := lstStyles.ItemIndex <> -1; + chkUnderlined.Enabled := lstStyles.ItemIndex <> -1; + chkVisible.Enabled := lstStyles.ItemIndex <> -1; + lblFontSize.Enabled := lstStyles.ItemIndex <> -1; + txtFontSize.Enabled := lstStyles.ItemIndex <> -1; + lblForeground.Enabled := lstStyles.ItemIndex <> -1; + cmdSelectForeground.Enabled := lstStyles.ItemIndex <> -1; + lblBackground.Enabled := lstStyles.ItemIndex <> -1; + cmdSelectBackground.Enabled := lstStyles.ItemIndex <> -1; + + if lstStyles.ItemIndex <> -1 then begin + with TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]) do begin + chkUseDefaultFont.Checked := FontName = ''; + if FontName <> '' then + cboFont.Selected := FontName; + cboFont.Enabled := FontName <> ''; + chkBold.Checked := fsBold in FontStyles; + chkItalic.Checked := fsItalic in FontStyles; + chkUnderlined.Checked := fsUnderline in FontStyles; + chkVisible.Checked := Visible; + txtFontSize.Text := IntToStr(TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).FontSize); + + PaintForeground(ForeColor); + PaintBackground(BackColor); + end; + end; +end; + +procedure TfrmSettings.lstStylesClick(Sender: TObject); +begin + UpdateItemIndex; +end; + +procedure TfrmSettings.lvShortcutsClick(Sender: TObject); +begin + cmdApply.Enabled := Assigned(lvShortcuts.Selected); + hkShortcut.Enabled := cmdApply.Enabled; + if cmdApply.Enabled then + hkShortcut.HotKey := TextToShortCut(lvShortcuts.Selected.Subitems[0]); +end; + +procedure TfrmSettings.trvSettingsChanging(Sender: TObject; + Node: TTreeNode; var AllowChange: Boolean); +begin + if (not Started) then exit; + + if (Assigned(Node.Parent)) and (not cmdReset.Enabled) then + AllowChange := Node.Parent.Index <> 0 + else + AllowChange := True; +end; + +procedure TfrmSettings.txtPeriodChange(Sender: TObject); +begin + if not IsNumeric(txtPeriod.Text) then + txtPeriod.Text := '1024'; +end; + +procedure TfrmSettings.txtPortChange(Sender: TObject); +begin + if not IsNumeric(txtPort.Text) then + txtPort.Text := '21'; +end; + +procedure TfrmSettings.PaintCaretBack(eColor: TColor); +begin + imgCaretBack.Canvas.Pen.Color := $008396A0; + imgCaretBack.Canvas.Brush.Color := eColor; + imgCaretBack.Canvas.Rectangle(0, 0, 19, 19); +end; + +procedure TfrmSettings.PaintCaretFore(eColor: TColor); +begin + imgCaretFore.Canvas.Pen.Color := $008396A0; + imgCaretFore.Canvas.Brush.Color := eColor; + imgCaretFore.Canvas.Rectangle(0, 0, 19, 19); +end; + +procedure TfrmSettings.lvShortcutsSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + lvShortcuts.OnClick(Sender); +end; + +procedure TfrmSettings.cmdApplyClick(Sender: TObject); +begin + if Assigned(lvShortcuts.Selected) then + lvShortcuts.Selected.SubItems[0] := ShortcutToText(hkShortcut.HotKey); +end; + +procedure TfrmSettings.cmdSelectForegroundClick(Sender: TObject); +begin + if ShowColorDialog(Foreground, imgForeground) then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).ForeColor := Foreground; +end; + +procedure TfrmSettings.cmdSelectBackgroundClick(Sender: TObject); +begin + if ShowColorDialog(Background, imgBackground) then + TSciStyle(TSciLangItem(frmMain.sciEditor.LanguageManager.LanguageList.Items[cboLanguage.ItemIndex]).Styles.Items[lstStyles.ItemIndex]).BackColor := Background; +end; + +procedure TfrmSettings.cmdSelectCaretForeClick(Sender: TObject); +begin + ShowColorDialog(CaretFore, imgCaretFore); +end; + +procedure TfrmSettings.cmdSelectCaretBackClick(Sender: TObject); +begin + ShowColorDialog(CaretBack, imgCaretBack); +end; + +procedure TfrmSettings.cmdBrowsePAWNCompilerClick(Sender: TObject); +begin + if odBrowse.Execute then + txtPAWNCompilerPath.Text := odBrowse.FileName; +end; + +procedure TfrmSettings.cmdBrowseCPPCompilerClick(Sender: TObject); +begin + if odBrowse.Execute then + txtCPPCompilerPath.Text := odBrowse.FileName; +end; + +procedure TfrmSettings.cmdBrowseOutputPAWNClick(Sender: TObject); +var eDir: String; +begin + if SelectDirectory(lSelectOutputPAWN, txtPAWNOutput.Text, eDir) then + txtPAWNOutput.Text := eDir; +end; + +procedure TfrmSettings.cmdBrowseOutputCPPClick(Sender: TObject); +var eDir: String; +begin + if SelectDirectory(lSelectOutputCPP, txtCPPOutput.Text, eDir) then + txtCPPOutput.Text := eDir; +end; + +procedure TfrmSettings.txtPAWNOutputExit(Sender: TObject); +var eHDC: HDC; + eCanvas: TCanvas; +begin + if (txtPAWNOutput.Text = '') and (not txtPAWNOutput.Focused) then begin + eHDC := GetDC(txtPAWNOutput.Handle); + eCanvas := TCanvas.Create; + eCanvas.Handle := eHDC; + eCanvas.Font.Name := 'Tahoma'; + eCanvas.Font.Color := clBtnShadow; + eCanvas.Font.Size := 7; + eCanvas.TextOut(1, 1, lDynamic); + eCanvas.Free; + txtPAWNOutput.Hint := lOutputHint; + end + else + txtPAWNOutput.Hint := ''; +end; + +procedure TfrmSettings.txtCPPOutputChange(Sender: TObject); +var eHDC: HDC; + eCanvas: TCanvas; +begin + if (txtCPPOutput.Text = '') and (not txtCPPOutput.Focused) then begin + eHDC := GetDC(txtCPPOutput.Handle); + eCanvas := TCanvas.Create; + eCanvas.Handle := eHDC; + eCanvas.Font.Name := 'Tahoma'; + eCanvas.Font.Color := clBtnShadow; + eCanvas.Font.Size := 7; + eCanvas.TextOut(1, 1, lDynamic); + eCanvas.Free; + txtCPPOutput.Hint := lOutputHint; + end + else + txtCPPOutput.Hint := ''; +end; + +procedure TfrmSettings.cmdCSAddClick(Sender: TObject); +var eStr: String; +begin + if InputQuery(lAddCodeSnippetCaption, lAddCodeSnippetPrompt, eStr) then begin + eStr := StringReplace(eStr, '=', '', [rfReplaceAll]); + if eStr = '' then begin + MessageBox(Handle, PChar(lEmptyCodeSnippetTitle), PChar(Application.Title), MB_ICONWARNING); + cmdCSAdd.Click; + end + else begin + if lstCodeSnippets.Items.IndexOf(eStr) = -1 then begin + lstCodeSnippets.ItemIndex := lstCodeSnippets.Items.Add(eStr); + AddSnippet(ftcCodeSnippets.Tabs[ftcCodeSnippets.ActiveTab], eStr, ''); + txtCodeSnippet.Enabled := True; + lstCodeSnippetsClick(Sender); + end + else + MessageBox(Handle, PChar(lCodeSnippetExists), PChar(Application.Title), MB_ICONWARNING); + end; + end; +end; + +procedure TfrmSettings.cmdCSRemoveClick(Sender: TObject); +begin + if lstCodeSnippets.ItemIndex <> -1 then begin + DelSnippet(ftcCodeSnippets.Tabs[ftcCodeSnippets.ActiveTab], lstCodeSnippets.Items[lstCodeSnippets.ItemIndex]); + lstCodeSnippets.Items.Delete(lstCodeSnippets.ItemIndex); + if lstCodeSnippets.Items.Count > 0 then + lstCodeSnippets.ItemIndex := 0 + else + txtCodeSnippet.Clear; + lstCodeSnippetsClick(Sender); + end; + cmdCSRemove.Enabled := lstCodeSnippets.ItemIndex <> -1; + txtCodeSnippet.Enabled := lstCodeSnippets.Items.Count > 0; +end; + +procedure TfrmSettings.lstCodeSnippetsClick(Sender: TObject); +begin + cmdCSRemove.Enabled := lstCodeSnippets.ItemIndex <> -1; + if cmdCSRemove.Enabled then + txtCodeSnippet.Lines.Text := GetSnippet(ftcCodeSnippets.Tabs[ftcCodeSnippets.ActiveTab], lstCodeSnippets.Items[lstCodeSnippets.ItemIndex]); +end; + +procedure TfrmSettings.ftcCodeSnippetsTabChanged(Sender: TObject); +begin + lstCodeSnippets.Items.Text := GetSnippetList(ftcCodeSnippets.Tabs[ftcCodeSnippets.ActiveTab]).Text; + if lstCodeSnippets.Items.Count > 0 then + lstCodeSnippets.ItemIndex := 0 + else + txtCodeSnippet.Clear; + lstCodeSnippetsClick(Sender); + txtCodeSnippet.Enabled := lstCodeSnippets.Items.Count > 0; + cmdCSRemove.Enabled := lstCodeSnippets.ItemIndex <> -1; +end; + +procedure TfrmSettings.txtCodeSnippetKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + SetSnippet(ftcCodeSnippets.Tabs[ftcCodeSnippets.ActiveTab], lstCodeSnippets.Items[lstCodeSnippets.ItemIndex], txtCodeSnippet.Lines.Text); +end; + +procedure TfrmSettings.cmdConnectClick(Sender: TObject); +var i: integer; + eStr: TStringList; + CurNode: TTreeNode; +begin + { The following functions are copied from my installer } + + if (Trim(txtHost.Text) = '') or (Trim(txtUsername.Text) = '') or (Trim(txtPassword.Text) = '') then + MessageBox(Handle, PChar(lFillInEachField), PChar(Application.Title), MB_ICONWARNING) + else if cmdConnect.Caption = lConnect then begin + // ... design stuff ... + Screen.Cursor := crHourGlass; + cmdConnect.Enabled := False; + txtHost.Enabled := False; + txtPort.Enabled := False; + txtUsername.Enabled := False; + txtPassword.Enabled := False; + chkPassive.Enabled := False; + cmdConnect.Caption := lConnecting; + // ... disconnect if already connected ... + if frmMain.IdFTP.Connected then + frmMain.IdFTP.Disconnect; + // ... set values, connect and check errors etc ... + i := TryConnect; + case i of + 1: begin + txtUsername.SetFocus; + txtUsername.SelectAll; + end; + 2: begin + txtHost.SetFocus; + txtHost.SelectAll; + end; + 3, 4: begin + txtPort.SetFocus; + txtPort.SelectAll; + end; + end; + + if i <> 0 then begin + // reset button properties + cmdConnect.Enabled := True; + txtHost.Enabled := True; + txtPort.Enabled := True; + txtUsername.Enabled := True; + txtPassword.Enabled := True; + chkPassive.Enabled := True; + cmdConnect.Caption := lConnect; + Screen.Cursor := crDefault; + // ... connect failed, leave procedure ... + exit; + end; + // ... connect successful, change captions ... + trvDirectories.Enabled := True; + cmdConnect.Enabled := True; + cmdConnect.Caption := lDisconnect; + // ... scan for initial directory ... + eStr := TStringList.Create; + eStr.Text := StringReplace(frmMain.IdFTP.RetrieveCurrentDir, '/', #13, [rfReplaceAll]); + for i := eStr.Count -1 downto 0 do begin + if eStr[i] = '' then + eStr.Delete(i); + end; + + CurNode := nil; + if eStr.Count <> 0 then begin + for i := 0 to eStr.Count -1 do + CurNode := trvDirectories.Items.AddChild(CurNode, eStr[i]); + end; + if trvDirectories.Items.Count <> 0 then + trvDirectories.Items.Item[0].Expand(True); + eStr.Free; + + // ... scan for directories ... + with GetAllDirs do begin + for i := 0 to Count -1 do + trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(CurNode, Strings[i]), 'Scanning...'); + Free; + end; + + if Assigned(CurNode) then + CurNode.Expand(False); + Screen.Cursor := crDefault; + end + else begin + Screen.Cursor := crHourGlass; + frmMain.IdFTP.Quit; + trvDirectories.Items.Clear; + cmdConnect.Enabled := True; + trvSettings.Enabled := True; + txtHost.Enabled := True; + txtPort.Enabled := True; + txtUsername.Enabled := True; + txtPassword.Enabled := True; + chkPassive.Enabled := True; + cmdConnect.Caption := lConnect; + Screen.Cursor := crDefault; + end; +end; + +procedure TfrmSettings.trvDirectoriesExpanded(Sender: TObject; + Node: TTreeNode); +var ePath: String; + CurNode: TTreeNode; + i: integer; +begin + if Node.Item[0].Text = lScanning then begin // no directories have been added yet + Screen.Cursor := crHourGlass; + // get complete path + ePath := '/'; + CurNode := Node; + repeat + ePath := '/' + CurNode.Text + ePath; + CurNode := CurNode.Parent; + until (not Assigned(CurNode)); + // change dir and add directories in it + try + Repaint; + frmMain.IdFTP.ChangeDir(ePath); + with GetAllDirs do begin + Node.Item[0].Free; + for i := 0 to Count -1 do begin + trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(Node, Strings[i]), lScanning); + end; + Free; + end; + finally + Application.ProcessMessages; + end; + Screen.Cursor := crDefault; + end; +end; + +procedure TfrmSettings.trvDirectoriesChange(Sender: TObject; + Node: TTreeNode); +var ePath: String; + CurNode: TTreeNode; +begin + if Screen.Cursor <> crDefault then exit; // on disconnect this event is also raised + + // get complete path + ePath := '/'; + CurNode := Node; + repeat + ePath := '/' + CurNode.Text + ePath; + CurNode := CurNode.Parent; + until (not Assigned(CurNode)); + // change path + txtDefaultDir.Text := ePath; +end; + +procedure TfrmSettings.trvDirectoriesExpanding(Sender: TObject; + Node: TTreeNode; var AllowExpansion: Boolean); +begin + Node.ImageIndex := 1; + Node.SelectedIndex := 1; +end; + +procedure TfrmSettings.trvDirectoriesCollapsing(Sender: TObject; + Node: TTreeNode; var AllowCollapse: Boolean); +begin + Node.ImageIndex := 0; + Node.SelectedIndex := 0; +end; + +procedure TfrmSettings.cboProxyChange(Sender: TObject); +begin + EnableControls(cboProxy.ItemIndex <> 0); // 0 = None + SetProxySettings; +end; + +procedure TfrmSettings.EnableControls(eEnable: Boolean); +begin + lblProxyHost.Enabled := eEnable; + lblProxyPassword.Enabled := eEnable; + lblProxyPort.Enabled := eEnable; + lblProxyUsername.Enabled := eEnable; + txtProxyHost.Enabled := eEnable; + txtProxyPort.Enabled := eEnable; + txtProxyUsername.Enabled := eEnable; + txtProxyPassword.Enabled := eEnable; +end; + +procedure TfrmSettings.txtProxyPortChange(Sender: TObject); +begin + if not IsNumeric(txtProxyPort.Text) then + txtProxyPort.Text := '8080'; + SetProxySettings; +end; + +procedure TfrmSettings.jplSettingsChanging(Sender: TObject; + PageIndex: Integer; var AllowChange: Boolean); +begin + if (frmMain.IdFTP.Connected) and (jplSettings.Pages[PageIndex] = jspProxy) then + AllowChange := False; +end; + +procedure TfrmSettings.txtProxyHostChange(Sender: TObject); +begin + SetProxySettings; +end; + +procedure TfrmSettings.cmdBrowseHLClick(Sender: TObject); +begin + if odBrowse.Execute then + txtHLExec.Text := odBrowse.FileName; +end; + +procedure TfrmSettings.cmdAdvancedAutoIndentClick(Sender: TObject); +begin + frmAutoIndent.ShowModal; +end; + +procedure TfrmSettings.cmdReloadClick(Sender: TObject); +begin + if Assigned(lvPlugins.Selected) then begin + if lvPlugins.Selected.SubItems[2] = 'Loaded' then + cmdUnload.Click; + cmdLoad.Click; + end; +end; + +procedure TfrmSettings.cmdUnloadClick(Sender: TObject); +begin + if Assigned(lvPlugins.Selected) then begin + if lvPlugins.Selected.SubItems[2] = 'Unloaded' then + MessageBox(Handle, PChar(lAlreadyUnLoaded), PChar(Application.Title), MB_ICONERROR) + else + UnloadPlugin(lvPlugins.Selected); + end; +end; + +procedure TfrmSettings.cmdLoadClick(Sender: TObject); +begin + if Assigned(lvPlugins.Selected) then begin + if lvPlugins.Selected.SubItems[2] = 'Loaded' then + MessageBox(Handle, PChar(lAlreadyLoaded), PChar(Application.Title), MB_ICONERROR) + else + LoadPlugin(lvPlugins.Selected); + end; +end; + +procedure TfrmSettings.cmdRemoveClick(Sender: TObject); +begin + if Assigned(lvPlugins.Selected) then begin + if lvPlugins.Selected.SubItems[2] = 'Loaded' then + cmdUnload.Click; + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'plugins\' + lvPlugins.Selected.SubItems[0])); + lvPlugins.DeleteSelected; + end; +end; + +procedure TfrmSettings.cmdBrowseAMXXDirClick(Sender: TObject); +var eStr: String; +begin + if SelectDirectory(lSelectAMXXCaption, ExtractFilePath(txtHLExec.Text), eStr) then + txtAMXXDir.Text := eStr; +end; + +end. diff --git a/editor/studio/UnitfrmSocketsTerminal.dfm b/editor/studio/UnitfrmSocketsTerminal.dfm new file mode 100755 index 00000000..45e0a3f7 --- /dev/null +++ b/editor/studio/UnitfrmSocketsTerminal.dfm @@ -0,0 +1,189 @@ +object frmSocketsTerminal: TfrmSocketsTerminal + Left = 584 + Top = 418 + ActiveControl = rtfEnter + BorderStyle = bsDialog + Caption = 'Socket Terminal' + ClientHeight = 230 + ClientWidth = 369 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + Position = poMainFormCenter + OnClose = FormClose + PixelsPerInch = 96 + TextHeight = 13 + object pnlSettings: TPanel + Left = 0 + Top = 141 + Width = 369 + Height = 89 + Align = alBottom + BevelOuter = bvNone + TabOrder = 2 + object lblStatusCaption: TLabel + Left = 2 + Top = 72 + Width = 35 + Height = 13 + Caption = 'Status:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object lblStatus: TLabel + Left = 40 + Top = 72 + Width = 69 + Height = 13 + Caption = 'not connected' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object lblSettings: TLabel + Left = 4 + Top = 6 + Width = 43 + Height = 13 + Caption = 'Settings:' + end + object pnlSettings2: TPanel + Left = 4 + Top = 24 + Width = 361 + Height = 41 + BevelOuter = bvLowered + TabOrder = 0 + object lblHost: TLabel + Left = 4 + Top = 3 + Width = 26 + Height = 13 + Caption = 'Host:' + end + object lblPort: TLabel + Left = 184 + Top = 3 + Width = 24 + Height = 13 + Caption = 'Port:' + end + object txtHost: TFlatEdit + Left = 4 + Top = 17 + Width = 173 + Height = 19 + ColorFlat = clWhite + TabOrder = 0 + end + object txtPort: TFlatEdit + Left = 184 + Top = 17 + Width = 39 + Height = 19 + ColorFlat = clWhite + TabOrder = 1 + Text = '1' + OnChange = txtPortChange + end + object optUDP: TFlatRadioButton + Left = 230 + Top = 20 + Width = 39 + Height = 17 + Caption = 'UDP' + TabOrder = 3 + OnClick = optTCPClick + end + object optTCP: TFlatRadioButton + Left = 230 + Top = 4 + Width = 35 + Height = 15 + Caption = 'TCP' + Checked = True + TabOrder = 2 + TabStop = True + OnClick = optTCPClick + end + object cmdConnect: TFlatButton + Left = 278 + Top = 10 + Width = 77 + Height = 21 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Connect' + TabOrder = 4 + OnClick = cmdConnectClick + end + end + end + object rtfEnter: TRichEdit + Left = 0 + Top = 121 + Width = 369 + Height = 20 + Align = alBottom + TabOrder = 1 + WantReturns = False + OnKeyPress = rtfEnterKeyPress + end + object rtfReceived: TRichEdit + Left = 0 + Top = 0 + Width = 369 + Height = 121 + Align = alClient + ScrollBars = ssVertical + TabOrder = 0 + end + object IdTCPClient: TIdTCPClient + MaxLineAction = maSplit + OnDisconnected = IdTCPClientDisconnected + OnConnected = IdTCPClientConnected + Port = 0 + Left = 4 + Top = 4 + end + object IdUDPClient: TIdUDPClient + OnStatus = IdUDPClientStatus + Port = 0 + Left = 4 + Top = 34 + end + object alCopyPaste: TActionList + Left = 4 + Top = 64 + object acCopy: TAction + Caption = 'Copy' + ShortCut = 16451 + OnExecute = acCopyExecute + end + object acPaste: TAction + Caption = 'Paste' + ShortCut = 16470 + OnExecute = acPasteExecute + end + object acUndo: TAction + Caption = 'Undo' + OnExecute = acUndoExecute + end + object acSelectAll: TAction + Caption = 'Select all' + OnExecute = acSelectAllExecute + end + end +end diff --git a/editor/studio/UnitfrmSocketsTerminal.pas b/editor/studio/UnitfrmSocketsTerminal.pas new file mode 100755 index 00000000..fba21969 --- /dev/null +++ b/editor/studio/UnitfrmSocketsTerminal.pas @@ -0,0 +1,259 @@ +unit UnitfrmSocketsTerminal; // the "old" dialog from AMXX-Edit v2 + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, StdCtrls, ComCtrls, TFlatEditUnit, + TFlatRadioButtonUnit, TFlatButtonUnit, IdUDPBase, IdUDPClient, + IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, UnitReadThread, + ActnList; + +type + TfrmSocketsTerminal = class(TForm) + pnlSettings: TPanel; + rtfEnter: TRichEdit; + rtfReceived: TRichEdit; + lblStatusCaption: TLabel; + lblStatus: TLabel; + lblSettings: TLabel; + pnlSettings2: TPanel; + lblHost: TLabel; + txtHost: TFlatEdit; + txtPort: TFlatEdit; + lblPort: TLabel; + optUDP: TFlatRadioButton; + optTCP: TFlatRadioButton; + cmdConnect: TFlatButton; + IdTCPClient: TIdTCPClient; + IdUDPClient: TIdUDPClient; + alCopyPaste: TActionList; + acCopy: TAction; + acPaste: TAction; + acUndo: TAction; + acSelectAll: TAction; + procedure txtPortChange(Sender: TObject); + procedure cmdConnectClick(Sender: TObject); + procedure optTCPClick(Sender: TObject); + procedure IdTCPClientConnected(Sender: TObject); + procedure IdTCPClientDisconnected(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure rtfEnterKeyPress(Sender: TObject; var Key: Char); + procedure IdUDPClientStatus(ASender: TObject; const AStatus: TIdStatus; + const AStatusText: String); + procedure acCopyExecute(Sender: TObject); + procedure acPasteExecute(Sender: TObject); + procedure acUndoExecute(Sender: TObject); + procedure acSelectAllExecute(Sender: TObject); + private + ReadThread: TReadThread; + public + procedure Append(eText: String; eColor: TColor = clBlack); + procedure SetStatus(eStatus: String; eColor: TColor); + procedure OnRead(eRead: String); + procedure EnableControls(eValue: Boolean); + end; + +var + frmSocketsTerminal: TfrmSocketsTerminal; + +implementation + +{$R *.dfm} + +procedure TfrmSocketsTerminal.Append(eText: String; eColor: TColor); +begin + eText := Format('[%s] %s', [TimeToStr(Time), eText]); + rtfReceived.SelStart := Length(rtfReceived.Lines.Text); + rtfReceived.SelAttributes.Color := eColor; + rtfReceived.SelText := eText + #13#10; + rtfReceived.Perform(WM_VSCROLL, SB_BOTTOM, 0); +end; + +procedure TfrmSocketsTerminal.OnRead(eRead: String); +begin + Append(eRead, clWindowText); +end; + +procedure TfrmSocketsTerminal.SetStatus(eStatus: String; eColor: TColor); +begin + lblStatus.Caption := eStatus; + lblStatus.Font.Color := eColor; +end; + +procedure TfrmSocketsTerminal.txtPortChange(Sender: TObject); +begin + try + StrToInt(txtPort.Text); + except + txtPort.Text := '1'; + end; +end; + +procedure TfrmSocketsTerminal.cmdConnectClick(Sender: TObject); +begin + if Tag = 0 then begin + if optTCP.Checked then begin + IdTCPClient.Host := txtHost.Text; + IdTCPClient.Port := StrToInt(txtPort.Text); + EnableControls(False); + Append('Connecting to ' + txtHost.Text + ':' + txtPort.Text + '...', clHighlight); + try + IdTCPClient.Connect; + ReadThread := TReadThread.Create(True); + ReadThread.ReadTCP := True; + ReadThread.Resume; + except + on E: Exception do begin + MessageBox(Handle, PChar('Couldn''t connect to server:' + #13 + E.Message), 'Warning', MB_ICONWARNING); + EnableControls(True); + end; + end; + end + else begin + IdUDPClient.Host := txtHost.Text; + IdUDPClient.Port := StrToInt(txtPort.Text); + EnableControls(False); + try + IdUDPClient.Active := True; + ReadThread := TReadThread.Create(True); + ReadThread.ReadTCP := False; + ReadThread.Resume; + SetStatus('socket active', clGreen); + Append('Opened socket to ' + txtHost.Text + ':' + txtPort.Text + '!', clGreen); + except + on E: Exception do begin + MessageBox(Handle, PChar('Couldn''t activate socket:' + #13 + E.Message), 'Warning', MB_ICONWARNING); + EnableControls(True); + end; + end; + end; + end + else begin + if optTCP.Checked then begin + Screen.Cursor := crHourGlass; + IdTCPClient.Disconnect; + ReadThread.Terminate; + while Tag <> 0 do begin + Sleep(5); + Application.ProcessMessages; + end; + Screen.Cursor := crDefault; + end + else begin + Screen.Cursor := crHourGlass; + IdUDPClient.Active := False; + ReadThread.Terminate; + EnableControls(True); + SetStatus('socket inactive', clRed); + Append('Closed socket to ' + txtHost.Text + ':' + txtPort.Text + '!', clRed); + Screen.Cursor := crDefault; + end; + end; +end; + +procedure TfrmSocketsTerminal.optTCPClick(Sender: TObject); +begin + if optTCP.Checked then begin + if not IdTCPClient.Connected then + SetStatus('not connected', clRed); + end + else begin + if not IdUDPClient.Active then + SetStatus('socket inactive', clRed); + end; +end; + +procedure TfrmSocketsTerminal.EnableControls(eValue: Boolean); +begin + txtHost.Enabled := eValue; + txtPort.Enabled := eValue; + lblHost.Enabled := eValue; + lblPort.Enabled := eValue; + optTCP.Enabled := eValue; + optUDP.Enabled := eValue; + if eValue then begin + cmdConnect.Caption := 'Connect'; + Tag := 0; + end + else begin + cmdConnect.Caption := 'Disconnect'; + Tag := 1; + end; +end; + +procedure TfrmSocketsTerminal.IdTCPClientConnected(Sender: TObject); +begin + Append('Established connection to ' + txtHost.Text + ':' + txtPort.Text, clGreen); + SetStatus('connected', clGreen); +end; + +procedure TfrmSocketsTerminal.IdTCPClientDisconnected(Sender: TObject); +begin + Append('Disconnected from ' + txtHost.Text + ':' + txtPort.Text, clMaroon); + EnableControls(True); + SetStatus('not connected', clRed); +end; + +procedure TfrmSocketsTerminal.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + if Tag = 1 then + cmdConnect.Click; +end; + +procedure TfrmSocketsTerminal.rtfEnterKeyPress(Sender: TObject; + var Key: Char); +begin + if Tag = 1 then begin + if (Key = #13) and (rtfEnter.Text <> '') then begin + if IdTCPClient.Connected then + IdTCPClient.WriteLn(rtfEnter.Text) + else + IdUDPClient.Send(rtfEnter.Text); + Append(rtfEnter.Text, clNavy); + rtfEnter.Clear; + Key := #0; + end; + end; +end; + +procedure TfrmSocketsTerminal.IdUDPClientStatus(ASender: TObject; + const AStatus: TIdStatus; const AStatusText: String); +begin + Append(AStatusText, clGray); +end; + +procedure TfrmSocketsTerminal.acCopyExecute(Sender: TObject); +begin + if (ActiveControl is TRichEdit) then + TRichEdit(ActiveControl).CopyToClipboard; + if (ActiveControl is TFlatEdit) then + TFlatEdit(ActiveControl).CopyToClipboard; +end; + +procedure TfrmSocketsTerminal.acPasteExecute(Sender: TObject); +begin + if (ActiveControl is TRichEdit) then + TRichEdit(ActiveControl).PasteFromClipboard; + if (ActiveControl is TFlatEdit) then + TFlatEdit(ActiveControl).PasteFromClipboard; +end; + +procedure TfrmSocketsTerminal.acUndoExecute(Sender: TObject); +begin + if (ActiveControl is TRichEdit) then + TRichEdit(ActiveControl).Undo; + if (ActiveControl is TFlatEdit) then + TFlatEdit(ActiveControl).Undo; +end; + +procedure TfrmSocketsTerminal.acSelectAllExecute(Sender: TObject); +begin + if (ActiveControl is TRichEdit) then + TRichEdit(ActiveControl).SelectAll; + if (ActiveControl is TFlatEdit) then + TFlatEdit(ActiveControl).SelectAll; +end; + +end. diff --git a/editor/studio/UnitfrmSplashscreen.dfm b/editor/studio/UnitfrmSplashscreen.dfm new file mode 100755 index 0000000000000000000000000000000000000000..42218acda6efb8fbc575d0333f1d6650df479187 GIT binary patch literal 225766 zcmbTfXO|?`nI`szkI0Bf6X|_cW>#iadY@U|b(t>jZI`d=?&_|tY6pTK2uBbgKp1jJ z5HvHK*_oZ)**)4hbELESAbpYaO&|0_^aEC(r6($ZngquzG;<#GJQ)@C#(VF5&2xkQ zuZ1?I*A~}T7RJ|S*C*Gerk1E||G!>vw6QW>wr@Oq`E339)yb>Jug+dxTwL4!$k2hB=Pjs(#`dSGRNue)w9w z{X^#}?EjXSS%U9=!%O74`y;`|=dH?$CF?(z=ul>zcbrLu3KRbDJ zVY__xsJl^b8<8cm4OtSteRA=xN#yZ2Uf--={^&x{RxZz8zwz>-c<1Kz3{={3lvDva{yFqA1!p(i9v^EK3?s z8b=KNKn#!bnAgWeECNfa#1bRo+76!l67d4|<6|;eu?vff$qt-{BaSg|P!~uyuO$+r zDlFMR83Fg^5y>axheVu&jf#NFiad!pzk+k$au6SnHo$(ei^$F4Zg79Hogps{z1)xlE-`+Fcy9Ec{?vLx*ti;Rai^H{enIj9@ zoACG?8X2#c7`!hI+4BbxUEB7b{7Ab0KW`KH(6JxhMHk9nVF`+QG++v9KBv&)`gtKZs{ z1*DsM@hIktvidmkneW1#toM(h@NWh6{5u$9YUENB6~_ z(4BD@{=qSvofT~`JiKkzd~v#Y|F9WztZ@rUg?1SAo zE{2=LUZk=TIYiciHo{m0JH()f{W)A-!=0+;ZQR-*XOvX4Wzd)mDI9rl)8>8R;*3is4v%HpmFm<9w|d(?Fl{^>&@TXY@eR5KD%7~ zo7Zdq{>`1Uv(>YMoiASR{o=*Oi=&Ms@fB$0h)%nKL^OY}NtpE8N>lbIMR}Yte^J?qMo29FZwbvJ$pFCgq?2XkI=UX=? zo1gt)>w~L>7Z>}l&$oZ^eET;qSDs(2K096d?d!EKt~XzuZ9P2O{N>BtU*g^_HXa@= z{O08#eU}Y~NgL+?=ic?#1fwU#`74UwZm*_1CZ00g!I~Z2=F@*Df#CzqncZ{Cf5A`5FN7*|U{LXXa1v?(P3N zzc^X`#m(Ah*UQI8^9Kj>KR%s%`)FxzcXMTL+V?T%4|BAE2{;=h#Q*o2MrW zpIpuT?CHYEiMiWPFPDG%c;(<=^?dW-t)pGwV*B9X&VwJH?Y@1wbFs5`u(S8!=`H~B z9sXeL!wVA!4@}(ghsW!mT;krgPfxawj?5eW)vJxC7fTP%mVWtS?ThEDXQxZ2$4i}i zJ33m%d;IL#1_1IMe!Bdtmz$qFSv)>iIzC!`|KZXH4_9|~mv=Y!-aFa_K!Ep;P3&#$ zA093L^l}LRIXYhX=*cnwa(cG>>9ggZU$2~1`Z>v-YU z&lbPBUis)|{y)7seE)3Y%~SIcetop|_R-Gz#@e%^g}-<__s6HpFCJ|^zufxE>$N|> zT6}!6c)7Fu>FLHtC)>vxD=&}Met9yFpIfVYj~7?Jy14)8!<`@PZJw>3e)V|eql>*) z56<6we()dPTKZ3KFTZ)c_w3>N?`~#)|6=LleDAHpm7hGF`sjN0$44vgoveKNV&>y# zlkXnRpB@~2_T>J@R~v7g%>VfD_S+ZhzrUG4*Lde-1%t!8kG6kyx%I}`=?~9$zrGwf zTUt0+nEb=DwJ*;Xe|R*1fBxXFo-P0W$@1R%-o-ASaqHc)-FHszudeKUcCq;R<>u+$ z-qqpSTgNM(K3rH^-F)-m?(^-%FCH&F-dSB;S@_~;@wXRC7&CXbRzE#l{`W8TZjPr{ zx3|7}wD7x=p(hXS?{05>_VD!UN4u|27A_wz{q}P8_m7u;Xm*F$ukq?H_fO7XX6rw{ zG6B-z=nLoPW_S2!`^EcLkN)nR7yri}f2&|7V(AY*diL(Y(%{5!rj$7x%3n;@inVOH z*;wh%ZVly{^=yBuurrVbZ#1jTN_A(VyfTn!*XpfmZDSuY1B&EdY`N@=WCIT+3!jFd*p?eYHV-az_bG+(Rd`UfhzgBkp3 zq*-dW^XnshClh_uR8sk*l@x+oL(4(k#?l#r457 zP-_-|wSg4yZ{V%|+WtgwYqYP}%;jtOdzJWDp*LNqhZ~9e?a2LlBw9(v8>!9F#Qwcx zaXeM77x7YnN}~iU_otWIsZy;_ZWmXF(m=UYE;UOl{e3{GQO2LJ!#DfXi`XB)Nvi$% z^`Vrxf4hkN7yC2!o9S$&SSjbn8;S8|yjsoI8~J z769qy#Zqp*-n-DuVPjvZh@06S?Q6HQ{bW>?tz@Rwm#-BU+Gzj;z;gkG zdMRJeF18aup^*cY`jf!F#_Qj-TcKV6I&BDIw(V{EgM1&}Xx7);*|iqzr&g<1R~qT% zda7J0l^R)emhG`@qrcc5C>~7a9!z8h2J-#=h5fM{0P=k}jzwbv-S!LvZughAMlt{h zusNItTJ2)9UfUUqZ;tg;YZctm?o?`TI^7y*ug>(nTueWk%Zv|a``g)#!Svc-u2iqq z%DIJs#8Q7^xLK=}>XYTn#dPV_#^{^7*|#>T3uDRCd%69U^0WEk>U4RunLnJLd~&~W zJXV;j6^2WF%k|iLvuCu{ceq)9W3%#lr@1;;+M3J!U^$MT1H;ArnZ{ddk=MKRy@}Lh zfAz;(sok;2+(2P)p!{e&`gkHX*k8o3@OV1&aJEowx1KDHoGm6_@7FHp2c9epzIj-G zv=o1~I56BExL(Yo8POC6_gfgR-rLMPnk$`ex6U`RGsDq?`FwvfJ=BW4^B_6apFNx` zy}47lUN630sWwZ^o0Y`V<ni2#`Hi2#;{Z`G;2AS_hK^z6lz6asg(wb-|Y+C{bFFS z^73%;i+A5Zloa9Votv|*>E`)le81%!=#hpK!coJr-*8qET7O1AYpQ28Wi+QXlFDh* zvDx4!`}liVVSmu_U`UIlYV)wV7-^IoDONnL)Ouxa=+-@Y076UW2R{BPpOw9`qMF6yVo*XvSB06Ioqqw zByn%ngJA;%KS3`0-6I*>KvF%g+aLD3hWf0nlzQ5*KW#aOdvyS$n?Gq9LrDz)>E_pM z_bB#HsE?|S$2DUxp%28Z4{OegsxjPa13-YGq!l=?IDr3O{4{SJPTKq9+Jn4hFQ?^v zO2(q6Ag?{^JFoV$6)Ny#youmPuK1HjGn_vpt(`+i=pM>JqB zYXxc{9oWrSj|#SSOanl$8+PvOe^}64QMDemJjhzHThVVRcyV2ArPp3HG+;GtU+*)T zKE2`9Rx`G(l(pp70g!IKomEO<5di7tM_F4lWNk#94|49EjJ?%k8&5eNRjjXu+%tIx z@N(GqV%RsCa{@QR{@Z)A_4k-J+0D<3wz0Ic5mt6mmhF_5^~!m_ww|;_T10X;%X5ye|`;+bexKG~Rh**IKc{^~&cl-2e zPz6A~4`0vQ`$8J9mb0y9t?7UT0Kcd@1`;~#4Mup?c8#TV;HqU@HJz|G0OWh|wreD1 z?Y8HR4Z~bJ_6hQ^V(-`_$kl*-qSpgl^;@q7wCO(AVmbK!V({ISo`rtTa87$rvFw!f za<3yFw=ZYW6P0F<){H8%Ic+RuEe5s4lIxur67qE3^`v5XR$^8Q%33|Ro3;ID!atv-sgm}h z#vNDOmviBvjPj^v+b&uM5?p_r-709u4cF$Nccb5RTv0z>Hr6Wq!%6Q4vzCwMw5!>` zc8&Xd*|yeFFQ;9LHTBh$@Pj4SMA`9b!Tn;AdsgNLdzFk|`Q=)6KkJHkY!C0n)?(Uk z7GmX)BO7r3cHX$L|1e=&8}`oBtsf72->>;v*}!zs z{v>Yy<5VmkvW;h~@0R^r74KZZcR!`=7nRwB(&w=bCcKMDel6}P#I>2K@$=cs0MFLd*@k>0Jz zk?Z4AO(diuA3Qj%6-yWmCX!MsW@!fLw5^W%DQu@ggg>mPJ9%!TV5GdX+9y74QNk-! zdYx}h%Rih^z)K0olYScMRo5HF!vX%iMaR7qmkL-{THX)uOYhzn({3t9g?HxocNWz` z#&0;Ji5?mX^ByPfuusUQnWL|ZVwvk z{f^lRHNxcflg&+q09B%7@$iDd=6l3igwvfY0P-hXGZ>(={f@WeqTR`94z?0vDnVAU zbFz&s`ngh&)tn+w3^0Id2tdJ4c^^{PJOJ{2c*)Dz+!oa(<%3KvAaJ^b0!GX#IgzGA z?px$s8u@Lc*+i=$_68~IV@K+xVuyOjLdJO@`auxyTb+P~m zuZnlPdwYi`9W1Me07y4STX7Z%0Qo+=WN?}y=oYc;>?{4}^mOlZV- ztBbQasUD?9#N+_T_u=&@-)+x#c3TcGy1@Y;B|pJ{0gytFRGY=-P#ZDoPf#czr+T!d z8Z#bOJ%*%NP==+7leKA*O_Oo+FrlDL^{HISU}84buyEy|xK*H)9$GA`g(Q2`4y+cr zg)~*;wAicc=cI^>RU}Gid`v@)PeL2kebR#x7qn3-#Lp*aH9@T;6?%kL!J;a=UX!Joi+Wus z9SK0n%>p2TE`oITg>IheVMqImrzZ!u6$<+7(e~TRtwK`4aQE|j)}N2j$q;+Lz(1?g zn}f997MHX1vsv{?kuX%Q^(miB(61LQvrz)xs+k<~(P5pwm=>?gv^gN{mg&E2(%)`b z`eSs}wtqEEf3+@c<@g~l-8AW}N_~EL&_`D#>3KumsA&gn?Z-9xvwOl-li8}!|G6V> zROnapOw&srEYeR0JdF^&x5U2A)8~`6my`77482*UciQ6h80Dh$U)T6ITDJKb?M=|r zg7Ci`*zz&jNzmtG!tWN{ds#YfIbKzm7iDfLLThRI#eLVulg7Q6X)0$q_8`MG!(1gq zhXnxu>E`7i9prfcq?@;6>{&%RE(qlS0S9?;FDDdy<~}=p98d}nu$^H65d3K~Wdh{; z@Uo8%a?);=$4e;$`K35F<7Yw&W0UBg);O;8y!>oVT*0H2E#nz^sU*KOqM=)%L6-CM4~xvdo7W$X@KqoEPwST7&*+;? zCF5X^df9`Nlrp4>hyB?Q|2GTbs{!`<9*5!gyv$yX(DO-pIiNhPu^20!wyb}*Z~Jmy zduxDTQCkTNam;mFId0SMrsT&ldN8QO9dw$q{(4OF>$IArFGelz52%Mt&CsnIe!A}= zRaF-%^u>Vw)0SttOz@`OOVe-K%;tzz?4g%&`rC1Cy2L!4;y)>~e;l{wLR56qr=!X* zMrpIc45g(RHw|M-)nu2f?szhu{l(K=)RN(fJwMxA8|;n6Tuy_ZNwUwz)wwba zmwdAk+Q@LDMQ1s}oYa-Y2=yoVM$)lc6*fv-)DFj<9SPF@fHN7e*OSieGB*>Uv4XGJ zqnH%dU>l?|? z%W-$m!`yE=_VRQ;N~JhETyf9z&_tL5F6x1;#%Z@L4%MRZfYR_&f0R5f#cF6J>>S05 z)4I9lmN8QRaG?QAC4j{#I(%xm2XPIA8j{73b7ATWLvW+$cBvR70OUK|39p`jjyHA3 zEe6vW?LoS^;%0IY!f6#ZC%f28fO@^epr|eiF^!2qmc%ibn$sA`{bY3`D7Zbpj}Rsx zh{(Ap=Oo3(8-`ePQo(>gM9_3TtrJF9RhRGx7~TPp?{F7y&Im3%iy+#Bn2n-vgDt#d zk)1ZOTgakHx=r!e$mbx%!mzrz4*=55Ijh)XCjjK1au}!PQY=!ezc0zuX8klJw? zNHT7>&1E=RQLYvsRkm1cV*d77ELKjn@fgxeZU}vNyOnSFxSEgCtvsBcjDva+(ZCY}#o?B@pz8I_15lCjjr-=2AO$2-3~1 zF6A5hbSVhv$}s{!5cO1I1c2C_QaOqknLu1lr5Par1VFe7I1O2Hs2v+t92PS=^HCPp zb;v*|Le(UBV`3z!juxriOAdzs`++wL`?1|U%dP#u5yh|{H^^h*Fap=I&FM1) zxMW!y$%;5sMs+OaVq?2k*yd6Pc?|>RVCPPAKJ$$BdV4J$r->-WNf~2Ne*lA+`e2ZY1vSj_0dX5$o9DEq{M zlT|g&VHYbdb1<}9IhZSK6{ZW)v0-p@qpueDPsZrgjQn_r{&HLY@d&M?F-Hr(*;c>a(U#Nnpw9njh<-9n z+hu+xMqe%qAHef(3UAE1f43?A-L~a0O_z1$kE_DptkTVZJRfJy%gkAWCL;(;=*uPg z!K8q`Jkv{mxx@d(wsbWtttaU}pS%9BDZHH2fxkVn{l{&Z$q**)zuRH{YK4}|++vXd z|HF>*(X8ieT>ay^@aOBoT#kM?Zhd2b{$kDYd{R7Z(uc$J<$`)LB%h3E?~d_58l<&8 zd8gud`_`lA_tIdHKP}K%fd&H-0P-E4V+Z_}exCvl|1`^hw7oLOWl0$Fs{>x;1f_%w z)AXnSLV%4d(i#>3jDM&5u%IJ80r4B^~yP4X;>p^Se=Y z+C~YPk89GXl_s22^vY!~w-ux11P?C=SVZ;ai$_bic;J5IPoCX;a9|#uY6M(Jx_FSeFbe{J+z$(#V{uNPb5307j(2Yd zpAPdeCkKFZ^ZBTZtQ5|PceK(Y<$GpA})BB5+)# z1YWbV4VU1uDjrQ3a5H-;Gx7>))bFBxH|MvCVH-E;!wrzzN^YGdqs)A-(CcG?jhqF2 zB<*34&fQ4ys|ho`372C#&8;K_*e3#282qixvsv`1K6x(5N1PNkXug-5>oLQPw4Yr{ zGShJ$^QPA+BVb=mk;`rddbk!&i?klhX+N(Wmh2_3Fp_dDMc65a>TvOjA%EP|H$1%0 zOz~;=-L`Qrc@)N_N^OtQaEfk=7_jp9e9U-IamlPxLI`6SbaNe!jV%xBQMs5~2kCG; za@)(@@3AhF>|0gsYA68ni(9DaC)7CBvnU3c*|xK)Wd#nTi!vTzHYVK*aY?Vzg_wicC#-RtoQr#rw=xrikXkx**}8XWFcvccwoTNMAmv$ zHS-v?xP*NBW=@{)QxaX9RDN*KxOA zUCcy1b6M$n%GKkPJi0QG;%Cwna*D_+;&r40n#l8Bog44v8gZRdT)L{_gcAuiU{`Dc zO{c}t7=@i0aIcqNN;4Ll)$n>i7JA9*G!(18n&l^YDPxFXpE4Jx*%$>d$Ydi!h@^Ui zY*>%ErM5w1K_TY1C&HegpgNr7174@cScjDUiPt?&H*6ZyyPXD zL$DiS#m`~%hRX-98`HO`0p_3{mf%i!bmE*EZ;0^fJNww|Qq?DwJ%Xl*nktptLdwMn zHifs!af3yuMHZ1PGKS*3i`A?$0MgA1F4LtKXqDF00b~}3(yXkc7njmB5H7b5%oA!^Vn998;MZNtH;e!AT@hT8xUm~p-KWZ z2wh@y3HKj!U|EX{AYk`fAsH8Kl8m7~V&@&Ag7`IVh{;>MzNB$5JdEV14Ix57NM)`) zf$o}TgF1szo#4NU9E>@Knvu?1HNI>R(#uX84>S-_I*|W2dnaCs8G&k?%}^>n9s#dv zXAq^LFi{M_WtDlGfTVQGYaZ*+S-5KO*j-j8;F8*YGY|+n8A-;xL;a|Esb<>0?%|Ml zhofysTm;dj!P+>^uj>Ki9u?AchLKog`FcgNqq~VhLZlQ#?lzRJgpg{^P-Y@tVq+Q= zk^C1~tinksl(nNg#o=etV$L#F86tKeXeUfMHk?*6iBE)W6CwiSBm=scJePDf?vg`x zDB%U4Rmz8i9w)gq+0eD1Q|z=qtBG*~Gab*{Bt*e|J|X91EShNcQzwJ|3)1P!{Rv0A zUR&ROfLnsh{;QkKH>P@^kf{cly);td>|T=|w78#4NpFwxYc+AWhc2pgT%uZ-3SK&_ z(n-w>4VnRZ)}oJ=)RiKJCez8^&C+mOLV5I2gI)|XAZNqUixJwbP#*c}5FORcq+B*c z*`SL3FB{ZEZYn75)g+u2;Z-BdoYe^hkw`;VLr;(V@ zjL~U@E(gHPNau|a<`*k26eE!8Kd;bPnOZSw^&t0%7y(66szm6xLHkuRZBp&QW7003 z<+grz+904)%e&+4uzXx0pcRsUqcQ=_AlgJh;Q(y{4jh%}0PPbHhkWuyo&b>V@Bn+! zCjdhM7P#a60p>Kr10dZT)5KApM?Sw6fO(Poq|XlD&t44UY3G7S$BdIW%cm(y;Pwh^AYn6kmF z`e+FWc|_b+T5-{WosxEBFxU+*?ZEhLl(*AbzywG)FF0sDXac00BWH^;4GJ`w01q3U z3ea?rP*ff9({+t*YBU}K*cY&$hDpX_sG;yri|k~K?)A`3g?mw9W|K6NrROdFNtJ5{ zspOyyTnqPLW573IDz_UkTx^9*fFPK~LjfQN^}d$#Pi6PhE0HU^M;#!5MvJ$9LA#2u<$s`KZauy5qz9c$$A0F6l(v)Kpjkgn`QQnY%S!j$W?njCAUnZM zxoOafe1+syl@YHph(Syf6Ap3OgHjRY46_zF@1_Nh*&rxWPKRhQLFoV`T(sOv+c^=k z4NN!3S>>otu6Y>vLYs*3GfLerAPIbyqT^n?II4SSKZ%qzTMw{(9$HV)N`kU}6Dz1C zWw?yjETiw{#rr*kvMDk!AlNO2?1zs(>ftWZ3LXmB_R?N}Nm$6EO0zD0+{*hj(JsqN zUU}Z5_%$=XF&&ggU4kKSURCWkl$KNRYF4kvP5IPmzZOu$h;A7*gnM2KxKriFo$Rzv zawsgE;Yl|?Vkc~@=yV_b$U}o(Dq3kVsxQT?MH^~x++mE}!@y{mnZUgWvlHghE}@D# z8v1FR${sTtxrO^j-}JH_n}k_*Y_((0u;ErzIiF2^c)gDGpz!2gTE7(zq_@7G=r@qqYbaBzKHc3a(V*0^yYm!>!34B%9epSOcxaP~V4hs(&{&Iop^?lm04Ar=F^&!TEh z9txI5)J%-)E~y;i5Y{0d<*?WW!g9wm_u9S9pj370e76NY_FdIK)N~dcu+DR zO@TZ!^2w0Rz#8GbAg>7Tu@@dM)~g9z(Zg3f4BT3>G3g-J7Z%{gvv#4^%L7;pEZAjC z_lVcvdSM|kTz7~`u*#0H%W*FUfOK=#kYa8IFqaqVO2Eb-I=EHK2v#d=t{#NPr7BK4 zfnIeh@gwB(l^_&BC(6ZQ-y1de2dkl!@EZQA4M4~ZDwUD4po2`H3Arf zy$=&m5Jdzl=P(JJ0TJnLBpWed#Tnht839wy(N1tyj{t!XrW=S}SP34o6n3%zX;^S5 zgG5{$9)xre4jX_K*g(|H0mzDWKRel^9uEtE!0YO9bAai7=~B$a0;cb!D>&h|=T!dj zTHoD%w-0Op+AW}C4|g2PB{8fey^QFR6_1>cuy{rkRvenO8R7wuZjOi&E`({H7KdH2 z*Zn*I;?Rv&SODyr1Lz!UQ|$=WP_M~`2_YK*0>A^;WW5$N_jg+DhHmSR@FNK&?Da(h z>Ttr$$-{8e!!5{8)#6mLUKU;oyihYIZ^wYo8cv(lVMC;YQ>j)> zbW3O-c(Y^|1dkeVGv@npSp0CG65L2q^oK1juT;8KCZMxBtYY0GR9&2I5fHH!okGzi ztLT|BpZBN;U}as^9JY#A>T{am7^`yuH}!-ha{;Twz}UTZopL1n2`=|)BIk+>|d%`JA=xu5woB+#HtLEuJDc+ ztPDmy>&{kf(p_Kf4S1GDDpwZ|@KlCGhi6Mzp>WdDR&qiNDxr#@UaizwN_2#531OwReIP!QIf$>{}^6GnGoX5rr4(qx-OXYf@(nC zukdhg5heA*dxz(MVok{W`4IV^Dm8sjMbc%B9yiVHLoxPYou2lap#kuuO=l%Sgbv}v zY0*3c1<*#&Bsf(r$_)hB-4eVV1};!J%pxJVQ=~$aDhb-Jn0fD7f+{_xyN=Ti$C$y0 zNuIU{ULP_@PnrZT$n@}ICh6wz*y|yP6GU7HK)(P$5KXkB0>pbL835RbSO1_$C{mRC z5&-fYp5;p+27vShxZ_)W93mP3q?_+%Fo`hrD7TOOGc4RKC@uHTuuyTpqlW3iwVwA81gpAA%ka{}tj9?xSg!^N)pL}D%nEhnI~>kAYC}LrPj$y} z8$}0|T<}Jir2u7YX1`tvGN{xiR3T-RH`Bs)R>-+6Ik$oa+2~_)0rR=GbL@VBug92X zoI9yVH!XQ8&EHGQPwV=_qKdRe&OuvIelBXNH~^6O7$jsSKumsHqU!LJhkyl??7!O% zaP5F4b2|e?C;$#XDGDsc%tPP-0^gkT_WYe|b#K4pYqt>-ykC%RZhDwr_yg>5RXMH7 zP#)G}2m={->;!*F!5QZm*YGVH$vRq)1yS!b{KkXss8@J;!`j zS;$%59MoUbgc10k9(tUi2YqHu6T!Zz0?H%nOJNoJ^BA&_lYu`5`$VM={Rjc?LD>RD zN(_AjN~9#6^`c%t$T{Cs^ftU%orlN}d6jz+3Rp4M(0Gtga%v=eIgd1l+Y4dbgIqzF zbP`HV2{#f=grd)YL6E*cP;@Uuvo6Vw3^h*+K6M77XoWXymI*6^egu~rNe{@?b`!K$ z78ZL6k@cetrNa~t&{l+Y6D)-E$q*ewE`snaL^FNbK??oO9Bd&iKp17(B<%AWTQvzD z8OFR`Qc+8NbhwJ?Mqz04!RFLRVJR)4CW2C|VelCG3SLdHs7Tsk)*HjnG4+EpsVsqMD$T{Spg0R6ix0n4~JuK-~13w!Pxe`#3^oHjQQVnWwr%f+9 zs3CPGJH39*mGQ#!5q-Lw>`r*O)sWp{({%%@OKf?!;Dk@_#Ht(}VgpDo6sut7F?!7E zKhoOm#4R@zajGbF%|c9#N0o!C0+?sHf_I*TLIu0)|t>!cexzDw{VLgm_S!03h8Q>J%NH zt=o2d>Tk3C}D6ae6B>cn89fa zixf08HMPSWyigP@;8~f98UvmuqiRU1n;}0400JkZQ`Z0ipsoQh1fjFQ007LAz(2Oh zxBH;ofX=a|;^ zRThrpV4L*mxtsA;u))s zVBAcAW1ZB>fOo#>IV|#+yC-X&v65>!K@Y0jy{0kVaBh{wF*t!0Pso%#n7LUq3#8L9 zYHD$6W#p;4^JdcZdPpCP()}XVd|99LJH~Q$=tfTJ#`TCRpLDLZohYzkY{x_f|M_v- zdcT))y>hK!f6#Iq4|p+_V&TS8MhwG@-Im2Z)$gLY3g$l7W=WfBNPRkGQ?96uXPkdaYh&_ z=%bDBeAzRMQb?LGXw<^|dB3$)G75c;K|j@;WZ0-TCZV2)F&X*!T*@&T=a5dc+gXc7 z=$q&Qx(%fw?oax!xxlSa+}YVNKT0F;zq;P~$x41SX+h3sGizJz(-0b0BlI9gr)9Qz zYbTdgQ#~>iGuIhi)*;%z^}3-CuifUKBW&KwoHV(UI#a~4$iolu&^N*Z9}Tf5CFY0u7z+mk^7e`<$Wj8UEZA<{BczknqP zkJ=^yK#*fcZDkhX*ap2ubbyp;jGh%~qm2R_4M*9t3_U7v<8g>v=vjq()JMa&=Q*pH zr-cjA46v6i?n#p|qXxflSz!T?ZVn|3Br!n0M+P1jd7$l5K>f=G50)TXLq|qMbwZ{b=3E`>%{jGAIQJZd4 zLcf=lcXJw4TTt|2`Q%AXLvk|jG4=3Ad9@PYF)i+AyM10dZzX=OWla*%G0A!0eqto2A4H-u-xTv)yzQ3Dn(qRQ~_;ar7O7PYEr@E!_V zDXekx5e0x77Ddz$kym0eE)>=1eu#nk#oWhEvq%L*Imj*GRo-dKO+Eju799jh8wl6e z;vxu^Wr3_G%=KAVtF@JsfgC(BH@BIP05k~l#_K%-ka0j@$*jeA0D0z=gT-Qje_Su{ z?fG$u?(KIR^+%NT0g!HvG4r&bVL>ReD42rJ3*w`SjI<nz4ncsDOT=lPR_MCUK@zi+HGVXv zy=X946__>9AhZ$ZOLj*=w{~*uSt|rc%v6}43JHFl@oA%hqz&)E>^AmSVM5adjoB|1qHod1*$K9~h^m#q{#+$)_8GC!!& z`=hkqpy?iZXO#PN(Sah%<01Y1etMoYGvs4I`o(JEVIR~%W+VuS)J}%SM2{NryA#$A zC$;$`y`I*7I!K>SvFm-bmZkT{#H&0V4?AY#<~a6;O%49)Xq$u}ytwi~q}6a5})CFpsHI}Fo!!Ggf#B1vx#Sh0}g=^&wYu$yBy+uCRZ z>kA0t5M;mx1N2UX`DobLh%q@2JxS8L4F!4?__|w3!fb^V_Xs?p3Y(5Fsep`iC>{Gm z?F;}%UpDJ#QT<}B^uhCe^COE4y>qtqV5B$bvp|rroYOZFv|eNFb`KIP^C_CCxFHL9 zG^SwEtmMOWETZY5t1)JH$g?$Tg-qqJE>u!jJWj7?m77U!dn|yG>v@|#+_dgZdiKWs z%MrS$i|Yf%`hfj%P(#5Q2~}11p)7(`Z0JxyyEYJJ5uO|j_^>+cH|zXt0+&#o4#%@L zO&1LeN=Jk4tvp?hS}@_RmlQ0O+AEs`^8TZtz!KI9CHZ@GJ5Km)P&}ORPZnHrA#)kX zdcSLXP2#L!g^ zy)_4g19GamDdNQnS;@|cHWpTgpCFn?gu?@UJ9PW9LxONUq7lmU$h#sr6U1lytURRY zm`aM!(%TswI!wQ*&Bl^jQDqZ4C7@JM72PVp%>zKXIacrDTByido#sMIEc?QuNQjvc zWcBI{WY3V?AYhDJIZP-lzGSCxJvLJ(PZpNZSR`1`>G1KqJMDV6jvbt{^55#}`EHJT zK=c8CKy-wm6)@FD(D}Ov0J-Cc)F5j|BLE<13W)K5+cx1lIUlqeaL2Ji7Fu^xSAV;T zwxh9^Yy!M!3>N^30$BNr8Mzk^i)%S#7!vY?4v*f^v3Kn1U$Q-~N5hN8>o%Mgr&I5! z0<1RG<*~qxhXW5|a2N{Y3Ru7CaG>vqFv2`?>^2*NwuJ`{J-kQq!}Wy{Da8g7RwJVI z`Y7TubJ|epAXkP!4C^4id0$q762op0AZG#~wgQlR0IZOx%j9)HD#kLRAV~}o0uvdU z%5li(K5UxPM7v@Ez>(3##%fx{@P(P(RBbtIP<_A#LJ`YY$%>4}OhzfC?TwUp($c|Y zOq zjagS~rsn@(2w82Y0_dwb3c%YB_~F+fQ7~VXk$hf6#;>FxNGT@85mfM#lt{9oNYK4c z=1paCE$M>r62Z=Nfsq_c;5L_zs5TqLdLQO!Kn@3xEfJFmQ?fYMZ@{%c1hkM~b%WYT zVK7D|4-MoTJua-b<%Y5<((gl6*Qf*Q)TmWOJ3}8Ugz)7_=q?>B7Vlj2b7{jAK4AgH zY|dQs<*-RuvNT^Z*A_u$(;MW1E`;PVmSCX60wCQy8@4SCrml`RkZ(t6`0RLXVX}14 z_N?VCh>5n^%AYNW&&DLoV#@{gR~zDcWAu2^fm!CQDfZ_}>}s947!u&A{untxxbEX3 zRwVsooK9OB%IjaPE1%2|KJD^sOn+UaKi{xGB=dAi{d|T#=qF6ySY(RDM=Mzx2t#U4 zA53Ajk%EsftQE!IF4LED^zpoarAhyAXyyiyexIv)UJcOy`cOi?eYIu$=S}(_wqZpg z!mGdErDu@)j_PYUdVh%iV#|3s%sw4q-fhsYR<)f5CT`*9Q}nZ8x|!scv1d*CWYxM< z)<+XOl9mrDR1I+zIcC@k}SRHBVhh5xUl%I)U6~C!(pY(BKeh#%TACizkcA-bi`tUIX zdC{!kGq*}1X*0qtL!w|4@^)nE`PZ6xvt_|F9wtK%N|eoShzaHL0XL zX4wumiT!&VJj!+u6(i4y8wS9k#f`hAxLbfs2$J%Sst}}`Lz5pxgo5*gxPOJ;Y0htT z?6;cs2m*v}^z92#Q{Lavv_pgp-0|56gHQ49dhh4$I{v|s+s1j0?$cXNg2&JWR$Wjc*n|a!+BE%Ld zVIFJSx3S7EC<5CB!YcAXzXB6N{uv(oKu8&hicf0vx~i=7>GK)ulY)8z<%thMS!pdI zLC20~>FC&R+s#~?Fd5)R0xVtxFzjal7y~fmqiGjm=m;x3q$86aQ&I&1{F^oYgQ~Pr zwIOrzv$p&oY2_Kl1(9OSoS!e&&&A|ohTuZrlN;!J`t&b&7&e2j5s zNL(v%7e(fiQRZ?`xE>aMJ14x?q~}w{eoOga%C?(8k(8_WnnUPLWK4=&ldHZQi|M@60=rT3@5vRHsVjmZTow^mDSlLX_ z2UWF&MV-3%-k^2}4PITiDg}@8{2TE38}@^;_5D%f80DU%yqY(5!}QU(YbUN;w&hM-2=0Q?&MGAI+A1 z$WkIza#*HfOu3(TOb4~?5GHhXx@3cd>98UU#O(-_&YNc0aVqDW${Pz|dNs%o_0n>` z`}weX-R2e=woDjtklKn%>5z4}&we&&nalAWxKe)p`6%;jL_8XDqWV@BS>CNHHubFj8ULAp6sU)psA0O{tCciJ@-=xo2!#-r$Chup!YLV*LX7^{`7 zx`K_!tK%g2rUwYl@32}7n+n$gD-a=O_Bt#ma3FPN$C6H2hHDK+7prAOhtlIPrG}%oDy>H86Q&%LOCER zP!7Pe#cEcS0pj>fjf($00R{5-glb+IUpA3+8TsBj9Xm)jhbEs_BmktF!{zJzPY!f) zBX>G;h>ox#5&-GuIJTo*@0{m5Tos{qz~XlR842j*(NM_Yz}o~s00k?5t#ZzV6_=<_ zSpbxbQKvv?2FJS|l#maEy0MOq|I*@ zY2r8SW7>&?gpA$Bu%ZNj09fn*poHqe$Hnn=a?bqp5GpUkvCv+j{FletmVn9%W~CUb zZgo4O+02shW>v~0WuISwyN)8D>SSGB2DO0E1a#VFsR#*{$sS5a8IQ{h2{Gfl3@IE? z;Q>NJ>j^M62qRNi;bktt#sXe5TJ#`_Avn)dX>-{cj13E%t4;W{R=gS%MaYoCr&LsM+yhp%<9kg#0Vx-jkN`|03Ge1B3F&?b ztFu}2Yf6F!0Y4V2`V9^-OOI@(9n5+Y@raaz8cJ{KK*S3@C#u`6j5XzB5UQiVn(#}h zh#s&ZRSxYsTS~LrLwv=DD25XtruB(24-G-pP~wXLN(H4%M4PVKmg|tj3mD8t(+)fc zzCQpJqC>+sMo=o^5mf;o-5lQpXw|BlJI5Tua1#5g*SoLg5~Fz)P5P|Gez_<^^z!x` zeKAX)->2(w89I=^-n0DqGQB&c@8{_47X9@mcYaU7cU?Xhr+>Gm?&eJ4`e*a>lL^AN zeZYUSL4Ws1d231iaGCpJ0*hPejcN9sdG4<^gdaeif~B<)dSi$_U!aF0%4&&uQl}q} z;=4V<&A9qE+w}G*{cJ%zAGZI)G5v90!@|`!=K1&9^y>xXsvGW^GW*jo*4zaxJPeK)Bkv4{rn#4J9OEmKi_1&STvJ+ z2oj$U(DNa}XN3m7RVIM^2}eF3Kt3Pns1cwa9#8QPTc!>l9NQuIhd2QevTiMLHy`#( z7X<=9{)9h-@~3ESAM%NveL(&{#@;(TlCw(teyX~v{; zk8N4jQPxB!3`^K~e~;Q8MDTaLzRn+K z+NJKU>ZhJM;lA%fPhnSu*j=fBnaAHzCO{eC-}qaO!T7_2<)STa>qs%FbKY7h`ZMgk z>BhlQv8xd5t4^zBJX?%sDfIa0VS#c1lmgcV()89Wb$gCRVV|N6K86EqcuR(ab61B{ zw4uPa50UyU@1KBj`+%!?L~TUdo@3pUZ-AxeJ|)2fK$5+TRqjbp(id4l`EkGruw-xX zh7ZtjD95rPUn@!|7$9U&J(Q2=jqNpBPS&r~vwId^EsyP#IK{_+Mjb3gt>l z2P<*xD}DZCB#EnEX3F32slW^+q|x`pZhRm4wTdn*v){&wvp(K5Uaw*O|3UDcu^U5d9Hs1*AvL{p0B$`af=7_YadibIvs za0txCLC91}_%4AZ&8%CS#Xu>#RkppQ+O`5w!QRM;WGm>CNR~9;pWka46+=%PNX!~G z85Aezk3^&;pV5#VFxle>NqjrW6rFm?eQiO}85Af{_#I+nhT4Y~fk!fQ2C3`9==8`W zovd?Ho+J!nL~CQY>}jGrVc(dmZ!WO0(GhFyEwOISm55)k91=;A=d6qwAbiI2^x+(} zBFz9%gF+M~^kij{dNnm4LeT24F_>oCR_vp30MKy<=$8T#VH?MTtoziU)CSB9iNhuG zZ^s&)?7dqG1ms-Gvt9Yt&3R&LiD)jer_l#2rIls}mIM10C>m{o{wj^fAE`Ikf*m$ndnr1*9%}E%mvcZt+#C%p)kS85*tY{?Q3x&(mwE8SdR%$Rc8tTar02m4q zu4pi@u2`z5Wdv;jpSLMZ^cEU^uLo8sk9(riNGO<^YV9u2TXL<5O#X*~1Y&ir$Cnn) ziaDW&RDvgwf-ttdNXX`EL=m|$7d1M9UWdzVxr}`ur_96Jy29sJPvA) z5FRCd-ex2`*0`51?BJv0K5ZF4FLCn3QJ8RA|BPc_#?QZkGskz@Ai`rweEXk$)5!Eu zl6qxe81Wmn9K9PUeg#Y7^Fi!ja%z{&h?7&;bqD;N|-um_Y?vE=I<5QQ(m^)apB zqA?ud&|`im`C#eo!eJ)-T1t>Tv)))&|37Pw1MF@O z_Xs?3-R0Fx51^F%m_;$&hQ|YL5YrrPUMKm*&>PjwP+8ngZJ7^(2GX5tLjf#15&|Rx znn>2YO+|BPNTtyNfMN-hnu|lwF0TU-yITeRCwUD9U=IyL4isYzU@#u7LZRi24kR;@ zn1B{_*&+LY>gG6DEg-95zalvrG9gSbNXX6~P>X{mLt_Q2h{=S}bZJ1fi(@JqwcQ17 zT<*YNcWGpR5Tg~#Q^0TwZ%7Bn4hzrY0VriD4?*sR$}N-4k`T>tQVgdFt&Ar{3Io7M zBqc}{fi;b1jm<4JX0t`WYWLZLFt}k|Ww=ZP6TF9aMg|9}fkkIB?G?gb)wPu%T{d3DuB2(G7ij0h)U)iev;a~m2R zR-i?i4S@nA3*>}2Ybe9!B?3vL+M(Sd+)b|sk~Ei^rwM%%5E(->3 z7HBSsflo;>(^CwZR@|y+1zhW!~E1_5N*dh0L7MwHsMyH}lU8*DY|sj0Z=+V5ZXu%BQzLd(Nhw9D6GXzm z&e_9xg5L}~uUbCt0lgeTx3ff4=7`z?aiB!5j?eTsS(>-)pgYpW<$V3_Scl5?rX5@tda7(m2vq&L{Ml|VK{%+Ux_y+ z$^x|0Ov5N$>{^c4ll&$y|FBcJp)j14J{aTjxD`v{jc@o{E2xoLu~%Q$%HtY1WQ5MD z6Glynja~pgp$qScPq~%9MS21~RSbuJ@?x@gP?x5XN?`O6iqWW{CZEmsQ4uZxTum@W z#RCJMygplD{c|4;=UO)8$Q~tz1FVZhg#=j=-=3`GfOcq)3&~@$i%zg-8S>s?4*_IL zsT}eb_uY7=N_HR-hG8+5t!~UzDDPl6EB!I_J(kgfo3bq6c!6l52)858vObfZrWGP~ zKiVvD71`Jfx1~3xu1Xbr2Mh=ep9^x5XbMCPkn-er##!le3}qq=XQfX>nvB@N24l(Z zz%>EVmc-s8ZwTfJ1wsrN!>+iJ0&m45&le1H+$F6&BH92eIz-GVeJuGp2Xw?-?x~mhx1cYOTSTIk zeqVX2*u>g{wY`jrq{7VdqmhcS7t3ZR4u`z#{tshrLaxED9 zDnI4gSGf<#h^rj-+fuSblwpwx>wa-r3u?6_}gz9cAbaMU1gr2YoA0k*vMZBDgIY ziU+Nk7LuJ!MaY~Yq^XSOi?Jd}|AaFIR7Psigsr7veM73gA;sW(0?_J=XefyC@FK=o zAJhhT61rVczcCsS-NE`#1LY9+m`0K z{E-R|&0%&V6A-SnQkP8p7NWJuAW zh{G2$T@dQQ9L8LZbibF!0Zj^G7`Mwpov<@gOOINkA(AWuy0_1vM}6+j94pXGG=(sL zzU<5quaOpV5|(#l$!i6Or6Wfo+>oRT25tPr-DzqlWT&%_15Pp&Lak1NNkj=T9CZdl z5?~K*DipALyw3U*8-SeRG>wW@Tbe=^5DieqHYt4ZG)aWKXyYLETa)z)f(7UA`k-Pk zfWcT5=bNttf`IaE^7RZb!zS_0+mX_x3nguZ)ob-gL!-VTEV&PS zE>8zG-XtELt%e#n-vPr1(&=zZqAsumj=6y$U+HrU2gqYU1+Vall#*EYK4G3m|#w=rlit6G|@!?=l?f8QJhK;tESilCWlt4QX5$w zPq1bpaR%@}iO00GxB`%vWs}6Qv)GdB3iK3!_P@LKco7r_dj&>s2-u#_Wy1)K&;tp3 z?I92NNf`)npHh;gR#TZP!`)Cs>nIdm#UcVv-ebaUg8{92HJH(C7nqzg>Xcdm)U4#W z+f>e-+ia-W4DRu-0FRTy?V=45q&fj1$o z+QF6pQxP7WAfDenCn7YTq6IDaDN19eJvDC4OH*K?RY75OIkEhRL5I;1a58tG7?r$) zk(22MNP`$GMQOlOiY$h!)H)Dy4<_`sTuVyW9^z7Kb`U$IDey9oW;J04lQ9KNu23{3 zq*9k~T7zL{G&63`B|8olB01q)4`WMvPxPQ5M zF`SitYp%Vmwq*0BEwUz~T0e5vuDgax>I+?25oNd{u(8aYjjoPlA}Hvkz$YTOm60SG zEGgFVsCTp|vZqwdi>p063JYbkyD=u^ruPwD)Y8qDl@>sf3_2lPCr}3mwWZQ5&$Pmr z+d&<;(ps9K(*xQIj;K;WAd4;KK%Kh3PQsH2+G*DkY>=uT4vC)d_8JRXQY93Nh`=i? z1q5sbW8sj^oes&noxV}5~XqJUPVfW4{A)~OWTQlsoGl5bd^ zVr;FpY^^aWGh9`v2FyM(h0bizmN1UgSTLNw@)3f@c#$4W5^s#ton`|hd~>B}iddS$ z+M#ll=6-$1S{=5bxsBnh^nn@kC9x#l_=aB@(P92#I21Q_mZ=yHT5|`>rPT!u{Cy>s z{iPZ{eM}_&Q1+w4jwMz8pzzE0DU*y~nr^LW_I*_v@aB@BjWQstw832T!4&kJ04k&6 zNY)8H79jU{uAOxSocji@n;z>(CT0cSp6At)`t3wDF}tNFrnd)`xB)sshG9~xoO|D6 z0mr^BT|@hVHA%~UO{M}ZnvyKab(pNpuJozFrW-?<_H627XwGCC7j+wyw~loN^^Slw>EmDwUuMQj zhu^?L77c6n>G-@Du!s(l2;?9_7E~_xmf820BfIez>n*viSbH5HwO(T#(oQ{Cr(uX1 zA*%vOWJiU&dRfSND6sVft-)$f;xGLR(m<(#AWj+&)ve9(g z#x!f8TVNYgETgF!B3C3DNDdx=4`%c)|$5i90&KytG7`K|o{ zHN=b(RXRs<{qpi(j+_6`VY$-X2n0Az1)qb@TgLx8zG=i)4@HV=7un!{y@L z-QvT2QgVvN7VKk~q}=;}Lnu&h%#w9=dUJ1R2S@|lk;9DJDwX{u&}`-7dtb43PrX4b zni?_hD7I|NcEM)l^4^@UJ=kmG58?jM4IIdUz#?(-P}F4>4B9g)8LT@B8H^$dOtCH| zlUdd_f#@)SbVN#92ki=aGNUOLisT*H+AYQ6jgZ_+JS9F$ci7eyk?REH*c(%hIr zps(T<>%3to0NJ|2bdMnbFmZ+FW*VAHWI93VNFGE$>_E7+!crg8=}pKCg={fw-J7c* zkHb_NYzKXrY=N+F#Ha1dwe8MP0a7BoxiK9^t(6Rd`!~tUz**_jOFb}9_SV;JmvSZ+E~)(MX>Z-c?@TzpBl0ev12$GVF{KNwu8#x(E!9Z6mW!sCXp(C8w%KvQX$GE zrIqg)Hfu9v6iq~(7Bs=J6CmMWI9PfJVG0|m0UfCHupPtUpS%br9E>G~v(irq*jXyA ze4n6+;X{H*_-%;hwPm7vBjrQ+8VpjQR)&UlIBes~(5WGP@CR+YDA~9HTY@ApA<0uX zDIpDqED6USctx)Ud@_)A@=y#v?z8csSi*0Qc@0^cN)tGdpcQ}_hJ&G;Mi(;Vw}5Tt zF5tHdM_iGpn_3yUKjAu6U(zU8W26jry9Kp6N{d!I%9d;eg2qiU8-fH~<`<+zo{$E0 z0t4gi@aZJxnJ%Hbbhl|G0zu6W41~+7Gk}KXTEGd;*(h|%E|1S=@dseXhzj&K&|0Uz zz>e*etmMD)Wn}1)*lCR00Yjvk%!T$Ymds-Q?4v)w%+Ut0jU`{Fq2usaSki?==3XmF z4R~NWP~h8>dgDlrOMP#j6^EM_hx5h3BujUt@77A`iV`NdB(7WP+sJ5BqqUI>yum~V zMMtnP(-0X9wYL%vBFBvmjeLEj&nzZ*>)h#FAE%JfCKO9=?$ONGo#Zx|= zy00D46Ez)ub%~M!K_o*00&+5R2NAnhN!WzX0EvWPyND3MI$WyDB6P7i?Y<7u+LGr&h2sDQO(10lbv(hV}?j#gV?LPNrRZ)0#% zmDe=X4K<$e1_z@*!KV#Xdto{4YV-0SXv|j+w|QVx)#ge?BfbEGM_Wpv=!=?&I#v~g z$SctK@dG9aT2Li5El8O`bOqrxURw!H~98jc8`*Z#8k0w$H>Nx z{F~~*zyMm-Ytrp>ieaHP#SJW}XMV#!ATi!xak)xKy!R_U0XZ66NP(f{vcC+lsBKN2 z`zGqZ;BwQf7`iT4(wB8hI02n7R#=KQ^0-&RPOR2J{lzAD;GdfGu&4m)2jNw2m zeWk`;WaAic=~xmEf5S&=8$|^<+q483A5abQ7#wu1ll?Lr42A__3nO_}m~N#ZJGl34 z<%~hp8Qe*`3fk{j9uuRa{`u+zHA59`Z3Nkxf+~>gWRDercL;ZR5pHyj$-X7ifuoP5Z=_mE)Z|KZZkHyxdTL#ml*c3ikbd08Lc0flj z9auiNeJqJfU+E|Dz^~%fC59g#*gv3jzLNYt2`N{Lbw*XRG($d}hX^qhLm7NbMsR2q z9#Q93V}=dGS?N=9p~(h{5WG#5PYIY(V-0cgUQiQ0vnb-(TxM)3v(_XWbt#gA0N|=2 z!-gdhGL$AT1d*f~YNo+JJ=U1Sw4>mWVUoJ;tMmdBtM)c7F*N)}h z3Vlhkxvgb1R;=6$dz!?ZtzHQDEjju)IwUz%z4XEaI@mgy3%?8J3ml!SigX6+P9R$f z&s_oB*c4S-;uanO$d8~m&ZZp$yQ|599#6V}u7z!Og8!}{T4$7Dt&n7i(m|_2s%7k2 zrO#O#6-?pTnJ1MqX?Xyhy0uY<%>KG2FrkcEkuA12xyK6h z?S+hWQ^t#(;N*9rMH2=#?>h+AeU**dlREs@cPQ)|bk=%G18?cqKh+~p6YWeFFj5Z@ zq-7gjWg!}NJJZBqkyu~trnh)^gBWCvPpv_t@ZJUigJ7go+*vE`sfYI@|8{S-SPR6_ zA-A$_>I`9n*#x^6=AO$qJQYeEY^j#rq4;staN#nCG}FtY)$C)fB``jhiMK;)+!ExoXc)=n|9uWjD|Nvs)%|l z^)!$(DE$D3NCW8sqQfwmAV34r>Nho?oh_Y>9Rv)B1suAclC9~M8WCufYlcuz{#tUx*2(PLoA75KM4n%h`%DicNf z*E*iB$9F@`GWkBdIaUyq>?bsZr0#l9!%R07UK5--#3H^7hV%d8Q&weIsnl2ZX;L9m z;<|01L_kewPA9}zYQQNv^;HL!qAOthOx=p%{DtqfXe!`-8>--h>xeOVZT9ql!mh$# z0$OtPQ>c?OVvPP8g-X`jt7}-^7dO^kYq}Qq2ND5BoLgB}A$K6?4sfrb`Uq$!7&9BP z4WQkw5Is9dg=M9X33yf&+ZYfZOW3H*lG;$?0xkurih3_fjIs`F z*V*2Au)fk$KraZnSeo5It<7#Qm>|Wfa(v40B~}E?m{zC z>?(K+z)jh4=V*x&eSTudO|6cBYNe;xzPcpH)1fvO4PgxePD8GGq|3D~U7+H-z02MO z`Xw&2ByK|hfk+M47T8vmTkq=^V`UIaUDersc2d1S|zqv(& z<&+1hzm~D=k`+$h4b7IdmB=nhw23|7k`iQW!uj@;fcX#IQZ9h1epWm%m?!R9Z5^m| zuC4O!Zib=Bz$tfWriZL^tX^%*)lnNJR35BANKNan_9o@m>hncSj(p(mZ?$*UxLe8@ z%x9EJsCmg2eYmlc*8zM8yU0d$o+!pHqILjq>Nu@GI(2_oLTftx*s?*4n zncGYBPAxR45rnhSr#y?8C5A%@4o7NgMI>i|G!w(YxMwlI(lQvRtQZ;FK~2V?iihvm z^qzs7HMtf_^m_~Sn~IshLhzs@BMO|AzQl4bDZ$G$K4IGYfmd58KV8o;z*Z5 zXCKK0)F3hDUt>w17jO70U&n7rwe72rgPCwJZCM%Pqx~c zB_$sL@U&$s7(OTz270c})tHK##2W)GM!^zmO_Os#$W|~}w~yNp{h$ut5;yD7)hV)K zI7xq3A+=MQ`^JG%fpKv1c>V;376!u~_g7lTnDFz50iZ%uEll}W zYz9L`X$axF6+YT2D_`fcFw%D7UI5`3&R_YwIj{4c*m$N?wnWpL?}v%lhhYi_nc(8<%z09FK%#BM(v^l(JL-0yCee zMSq)f*Ys63f#Iz5?RL??h-7qP=?9vki|Y&;fhn1B9nm5BGF_=gSBiE7?qMYpNc9_Q z1}C}pSh_ewgNLfbtqrnl$Uh<7A88PsSr%sZP;@;~?QGA~C`ueCvF*yWg7WQ6Q(s>r zb?>`V1ta6{X%%ni5NlWl;K`90T)zImr#V@qKV)wuU;!=#5+H<0mOGpuZ0oI80(85TILdWvjhzY7#=xA+86}OaF$IDy{ z6gZG2kb>FQMEA{pXQ^{@M2^Bd(kUKUZ{yT9p%T+19v%`uJcOnbgl=vMGJQF`sV7x= zN4NU1LCc$Zd{A!R-7h{lY8-5|aMOKeRD5o;xOa_ff0O+^eV#WiOHm;$dtZb2_)riq z61ppg>&5+j%3vu&@f5^T&=`R{#WUie&DQq}8gE}?8?Ui{VN9^eQ+_|tVE^i{^PzR- z#!`KKiS0dYI`3KH7JFMf_t)DF68XnS9IS-d?`ScBazV-brw;ucE$S9JkEP06o0PY= z=sRod%*E)Xt{#&Yf$_Whv&CoD+Dhr6`^8(@T(=j9M)sd#eJmks>}-r1YbB2W*ne-C zSYIpAFZ>+z4Ut~oykd^P4IiG=c6caR46zazg8!KG8NHpOU^sQ4XmaHkS)8_f*P(&J zcic8+Qw5#!n-6ar?kNbR*%1{iPP3J#+ZfylCo-vLyG)M!vrkllw!qjR{BVwl!4Pu2iNMr7)XjStBImg zeq1X|Smockya0WH`vUqkJ$@YCme(;3C`{2cCttx25fwwV5=+)VZ0O}Jzb85ya{iOc z#NqvUk-uH}eTq|cj4#X}Njk`woG7{MlcAusXLy4g0L<88m$>5Mgofb|VFGI@1gGk; zV|0GOu5&eE)h1`>;i&Fp-9uGCDL8E4)g?yVWr71oG$!d=ooLr6<>@M45+5~4{>k^$ zeFk!uoF?OD=;kxw0wXG;B9OzT6sO*4V#G7(mr_SSBL&7sS*jHA7Sx38Odmi@o4T+y zJ7UcWYt#`Gj~#Jx%ECAThG|%pTG)tf#mCd_T}-CUymp~ zb!WuMV+{Q=>@s3ERf5uF#GWuzj70;Q!bE5V^avREmA=r!rk-$`n#Dx`pXO932hkhi zQWRwhjNgc#?9UoOF8_@+ChvhmJ_4DdjAyX87hw@Gb(Xs&JtIuDGQb4M8_ zEr-p?J_tHpb{`oW>l2!VJK$?9GHY_V7j%UYLUI~~qyR&0Sk_^XlwokxXh&cYpRZdv zUx{Patr6X%h~%~kpJEG=g4^XF2|fYrH{fpY{JLpn>JV5C-UA_Vri-Npb!?dVg+Th1L{x|Arh?a4D3x7Z^)RU(=K@kt5QUODMH-)=0mHrM%4fHh0ZsYy=tTJ_T%`4vr=Y}uw z!?G_RZ5Jg(spT#e13>aH0jh-HFjb5(4GLYFWuB3&$y4)}&lCgE52+y^GcbVYNUsyt zVp|Hd&G{C%7}%yfmBxK(#0t`BQ<;KQ#HIQ%dLZaga}ny|_8rB7(@*+b5dM~RML%UU zTN;@o{&=o3R)XHRj!E2m8NgQ%Ru(FRy9%Z1FVfsZZUkvrE{W))Hb|YYIII+rc&3RV z9!AWA_DhG+gg_aw)tM-SC@2X>8O(~R+wxpX$uxx28IX{+1f6=K+^AFu;LnG%mYIez z8NdT{C({1g2%H!BU!YI1u}o<wkOd@)iC{x*sD0vL}BYyq>CqY8Q# zYckQ95t%{Jn_Vjj*)e}D(8Ps#HuYg43UN%W)A z7Zr6ONvovlLU*j1Zmf-wXQBq^8W0g16D|y#m42f`QqqBL_Rv-IfzM>%vKY;mYojdH zLOeh*VH5?_xCO(%vF4NO4e4DBe_ykxMMx?~0mQz&P6}R8zSw~fQ;ykE5T-!HDB*3z z3=5E;%B{INw*$O3`t`e;#lAKf8S+npUSQZraxgv5UeRAvG?o=V*u|{#K9hQTY+U$k*ze~ED6}h z@|7)xj99Y6gWHrZ`(pGL5Qg2&8fMbj@;ykEU_8gds7==GaIU$p%!(#_XR-elG>#HF_hvobfs!VHxRw8Yh{xlt!eK0@}<&w7&bX3^8F`Gc_o%E+OMv5&6 z>}6!mS?Aj~RXYB$#kD_AWErxT4KDq@dKKx6Jiqa#M*Z$m337nPw;6V7ro4t2&PtzN z2_zJ7>^Sfdl9+bMO~{io8ZaCz`L~c4wl;W2I*JeN9Ohf0$vv`jb4PpeP`Lw~IlAA> z`)C8LktNj*F`Sh?yC{l<7|u$c4Id~AEJa>KP!V9ZC*~r2h0^PD+JULlYQb>$Col5j zB8r0H{Dlvy#3|!bARic-_83Juc2o{VN`)FSxN(G2FzPKBk8H5@1))fUxv?GP8tl_>&ef(@jY+6&ME~; z;eb7gc0@wr@EIUQB23LN;DbC%TUM&}B|i%a1{80*TL4u>0~uQ`-^xUi8Ve`L`LcRB zHHze%J|qIlkGzP_MF0SU&;Q~Li9k#@awYQC#t0!~9gh`~kO&6=CvpN5Q;O^ou8a~O z*E|+8LLny6$i*ptZ>tLE8qF3I3#~46=j6_ecnkbO9E9%-NO>+bA2t)=gcZ!N1h)g_ z6_lM-1r3cXfW(HXno?7pY4sLEVKNl89W*Q4=*IiNa7t`BgCMaa&isbYhQrtzEV+|2 zkq6@#N|X%Q#Bf&n5*6T9LB(*g)E1KH7uYL29rz%pSL1WJjJ%2FR5_PirZ^!c=}_3= zF-{O;i(|Lv01RiP5Bw6qzs0mLE0A3-iRG4NV4v)VIOGc#35}Xwi^HQE_hgpkjP3_H8q)bL+`#Fy24-);sR`@sIxH(!#lknb|LX z^(&j!wNiouHJuuEu^6~+tPM2t8HrK~#@la!AHi>0;8b9L>t50UB#~{9b^*6T1|C2A?3}2m;I@9dJY0S;8*U;gCa70p+rh(pyhOiy$ui@C9sW4H>Y9s1g7>7n-9oUlPzfF4bzERTqMNIF`Sh?W#pTyHB8o%SNKga`%SgRUKpcM*^k>^rR-_|(jaHW zZZBgvk)YyAZG6Heh)?x+7Hz05_;*F&O0}eq?4Tk21qGg6-z*twL4HT$JLV3-GS8QdHV+fXVnFjRD_iH zRfcU+H@k$n)kcY5A1_eROUZX@{K^A)I+nu3B0t&=7A!`@>()4iNlaw{dwCF4fWD>J zTIwfKQr8!%8;V}J4miWb8md7Iky)E-tYM~@M_~QgR{RuHWWBbLd{xefgdXD6)-ydP zPp+{-YT#v#u~HY~;UIS~WgbAjpFEVw@)>$px|M|;^NG$h4W)e?7@)vo0FcmFgm8xp zV`ms}yK2I+jHqC|p+}<%wK}GO+4lNG$i_rYS@q?-G8hGwqcW9%o?X90)O!@;1!!SwG*hoNT0S?P1#R%dCPCfcnOXV&EaW;Q6%02hbSI1DyEXaPtt zm|+Di!#Fbv3+)L@M~W74!>@VeJMjKD{J;7>0QNYTE(ycF5pkkC&T99W3iv>7bA)9m zK>&?oqGh>PaZuUP^&Xdo;jHx8?d#pv2Di!%z-GQS-5AWVgdlkOEu>~Bif8%c&j%=R zeGyvvc3RbxZCP(P$+fqQH5}HN&kNDxrbapU8G}|iUM#kBRm{$vyMFb=p}{I7tr7_f zot;&=2K0H_&^zj^ds}Rj1OX)y@}X~^$-o&?p;^Fh9re(t)rgrf8~{8GK^4RK3*RDX zO_WCn*IO%#mnMGs+`_XjEzVBN%s;<$?#lGB=N1>g{iTOGa(%#1bKN=sDi(m$!)KTU znmpOo!Bi#3r{+hY>oTmIVf6z2mW`>lUPAX&No|8x*_IP#=0#Jw6`DDqnv{?qXg%pO za!Cy4X08Dl>u4#BcpI|}@Hdt!1yM&{*v`#MvO{H+1Z_v5*i;o{)+aq>;9(;rPI?x( z;oxY2iV$l}kY|mB8L2xZb1`+5#GS4`cf&oStxAwq}cn?98{d-J;fA>42{AO zCA-c9bPV~V&Y*h^r2;l9dUr0iP_vpK%BwT5Y=h6a&gaSmK*i)ZKz%VsC?RJk+~An3 z^x@WR$u%(w``Fez2S&?-$0!3Dw&qjtm+d4Rh`Kn9IqpO2Dqh96o3|et-_)Ixm1PEF z%ovs8Le#HbOGo;(UT1&{X&s$tI{1`Q>9o@6qsEwU>m(!K)iWbfHiY6Q@}$fPr!57X zhF=Efh{q0mou@N_F?Bg+1C^%g znfxwc6&fICT@<%R0t%IN7-|IVF(x6p9lQ^NpO{+i^tjl;U<$xZB}f1V2**6?cW}!v zP_;45q)`aZj_sY=rZ+@T=jIrgj~qs_Mu96gs)9##y6k*;qHA!`k&pv=X${#~Kxf-W z6P^f`@CHmc#b+dLf&g4Y%Zi8*i7^Pcq{=jGID#L7hO`mIapT&}h8+_*=G0U8EY6 z`UHa=r9Qb&=M5dEGi=CQp5HMeViN6xF`&fCo{3O7UytB1ih?r{7kO4dTm(=pp$*GCXmM0R$`y9}w4$>p%hpUh9M1JdpC zoo@uGix41)Yu<@ibl>u8IphV*4Xtk6;qyqwkJ~Lv4W8!oRKaaeG%Drz={fmo@ zH4fBb12P$mvR5E29`l*t)oC_CYGxLL)2AY`fmVsvFX&12XN!O66U~({(}RdYQ$C6Z zT~5=?j5!Na9YGTcfMjB}7Py-0<2h-vuE?%Pv7ONaq-+$x=@&E0+lz{+E-bp~b?b5Y zJHno}tC}4DjeI?ufZcR+zLY3=P;zIn;HgcaZx8qfm_3HG(x-RE1%!*?ihx(M(Cy_C zG0IJ1*V*50;MiaFZ(!F~;@I)&;}lR%Bt!Q}mDd|SYLjEld3Wsr->yf6*uP_RtgGD(tVXe03 zFqS1+kQoJ7wXW3JSL#6IA2>8Hq*Y~3eENee*$PlYsJr!rk*(|6wy*DKE((F?2YpIF zm=|=F#C!}@+*m-G=4?!NGxCFos600q3t3i|TSqI*94`$$v8uwX%tBAeO%mOk&5&P+ zME00l@5ncHuPqqqt60^T-H|8pilr$kC`Zt?odrQ?x%@Q!IpH<=F_>tOlu=u%iNyQO(h{J0H`!~6v>&t*$8puSy$y)*y|{lb>&%Fa%>Tk z8Zt6y4$4GeXi;HZTkaaHi4S$w4tLcJRz-lm6hr~@-(l zq{8Z2RqO<@S(l+9;6TZREs?3~^%?rszRIqevdXkrTbhIDG&A7h3Bu1&8MN}?gDjQ_ zlsyxUJB?pPvbq4z6Q!gw_1kL{yBOvm$zR28U$#e!xm;O6HyX$kKO>Ab$copcnT)c^ z^fEdb$h`sBKF!PUclf_%SFQ>2Htcp&;%?2d@yPRAm}rm~?QW>d3Df-n@WYP_8;f>r znb!f4fqq|B(AJz~>&ka>viu1-<^WMjK&28gR_$jT4;w76Q&w$ZKAkB!M1A@C0098A zUzre8>?}`lA%+8awgf77&>9VExv5Tgz9{Fji*lXYQiG+-Az4{L>QGC~V0~p-VTOZQ zejZ1fRf)O{B(e%!&U(K)%?9dEsW7eOh6*~gE;X>Hp>j=i4pbxPJsEBTv1d7f{dH{ zVojxo6G3nGz(B$ED`%(A{`aQg=JEEzef{OD8ls)$=B66&P(=dNA|VH|c(rjSK~ZNz z@!tNfp{g8wk`aE#rmU1WlU#IB6*7tf4unmRHz{x%;1~mTnu%1NohY=Ycy;`Y5TY84 ztBCUm;IbD*eG~!MnP0v*v2f;BM~-Y^TjK{Jvm;JJqOC8}+M6z!$N+JN(nTMWl_KtR zud6F6BYBW}`5}{eVf~bzGIin>Mm#WXfU*+3S48{iLv1Y!bZ3NbE)ly6^%T3mEpF~E zwbCy@9En0JqozRnpaZ|XCG^G?eWVahhn4>Y^oUjzKU`tlM9y(jzQIEuir;QV8Woyr z^2Kc(Dowx*d6XmMOktSXWY9Ej_$LMVTbTG3fx;u+-Q{{?wL(j!Gs|@#hcT2^B1y!- z`cO>GAhn_LU;)F!SlAq!k|Kb$*!yEfzQ>-biOzu95VuqABJpoVZ#k^yN2CUCO~BF~ zlhpn1}BmG*hGoT>>BCEIdrP)*0E*$Ud zt`7t?!Y#&@NzRK?+;eE%^NVMmK6W}QH7y<9x|@X^`0S@Y{KCxBk3RU`l$ehhqu{Gc zGrS*s``y#0e|2sC+}ydRuK#9X>Fh7wba<3_o~I|0h};_dIw6ml5_GX&^%ZzdoIHMR zX6oKUgNQ-->}E6^?r+Jua`nu_)Ugd~8|dtyM8}BpZF|P&&i(MEg=gkw&d$%C`R&5f z-+AbtNW)>Ce(E1@dT#OL%+iS+y9U^4iMSCODM7WUIl z@2V^M^5;G{Kl$_vS0?5spS(Q#?1{&}e|SqjrOuekh?z!1n!7S$FG99b4O23Je8LoHW4`VfSFKu%CN`@Wp#D~3r}S0-ka7xd*+Gf7Zyl`*w8>a z6K@05Su@b_?=843(j5EoXkHmX?NRQ9RQe`M<7`OAyvXQz(OT$%dUAAM{4 z*r4Aghr@EK@XiV^*b7!CV+(Qoxwbnt1Lp6j% zpd{+rJly>sKYNVI25{5#qjSlya>q(|)O*6E=%73q6BY+D->>snLR*V^w}8(}63K$_LH z-a8wR4Ux~vHC67zJ=(rrcSW{~=jMiTu%?`;dv#spU~8Z!&p~Trs1}g3WQz|qhBvo( zN9!e$fkCd_rRFVbJqP=u#bv=bQqrZ8#6)#5Ge67|gt7obc%eEYMc7&C3b;wBZynlo5OHc`qZgVyu@%;`cyd_%m3m0g`Z_>tt{Um#bay;i$#OWDlQsfqdHcW){mtwE}Y zexJI&l$y4<@8)$cEuOf3^;zIdXi9*zgv#-skKF&e#b>_%a%rC;nkVB>kCJ3TU%NacNT=a55E2GKTJOP2O2}CfBElUdEb*i`uy*n zoBZj&eYvN^O*gYL+xN>Kee2~@zy8hf#|PU>OVT|f^(DVKee~+|xo>>qvqNo>9_scf z;@M+AdFk5IzrFgaFMRH;=N|jcd$yF(&_|05*ua5m1ww9Xnia_I?ZbuFpMU0sx#MrY zV+Z3!;PtO|x9@)Q3lDx`;_R~%r=HopZG?7MFDU&?G&f}P{ar_f zuU~$4^3+phX)Z1Z%{U+yu)O#6=g&Uz^*>yln47rp^MC!yPal2w>BoO@WqS7DaCb$* zi4YX6z#o48zU%*c?&^gnSnw2xh!~ljih96Eg>_r44SlETyyy?U@}cX`pLlux`1c=u z~sIRffFI5!2_W2L|VfOfszwi-C3Ox17kUI$2 z`Ws8nJ^8ci7iX?7O#R@SU;6q(pS<|we_x-Q*uH)>#hHBFQi@!j4dq*{81j_chzE@= zo7cWPf98+ZE=S07yeI2T`rO5FTeHf>sSB#(Jy@f`Sd<^5;y`GmKq>Q71j^kwf^PBP4 zD;Qh3rMK|dg_(uv+1YdFKKbA$AO6aN)MsA4ID6{+u_K%M8Y4z$niqEMN8WbF^##iE zb3b_Wp`ZQh!|yz>6#S$7&CiT@KDo-gy+hpICs~>MO9WG& zAY6Q5K)ka}Y|9a^Yxmt;E*R-MU@RW*4t|JHT`X@WD2vJ)om^$NjjGBqbu9m43NL8$u`* zf?-T0o7l>yWC6-j8luYXd=0}{=>wA7Q((n#R{B+O+qN=+;jHvqid?r36utkpF{yhX z+(!=Y+}K+j&2%DnfYfAF$HhyS5QLT$(<$bF80= zE8!wlxHavS<#b{!I_#}9N=P;x+&CEWvP_A_;kQ_vKDn@PcK7yS_!oe?pj3BvR6cd~ z{2yPQ>~Bp##OxdBoVoDSbC*xw_vSmTZa+8{8YQV&xi$68#7Jn9`h9`o%8au|e|~N8 zH z>71tD?+-*1Pd@cubC>6SIk~W9+jizskwL%%jRf3Z|H4OJxHSFKUp!q@U6?@b(l6(D z4vwr&k1J??61u}-{g*F(eCEur9{$o7X^?Xz+l*Opkk8bI`G;{RDD^r?VRgv{G&>g2qA+@#H8RCWt z?12*Kfjw(3E}T9#J)!6tg?c)(Ks9ubV7(PDK0kS8VXmREkUm0Is`m3={cP^a%*_V| zGf=KWQo||ky=(iWOK1Q4smFsso%nXJuXN_}()larhI;B!3=s|~oA(SZEuEe@e-s@a z-HwjB?5@JJ^*asf?bOB*=%Z8)%mA$B(#5IM=brt*yKY_Ao!`+>*4bRKwzX(&XL(m^ z4GRpE(P&@ExrvFXYiIh~%a}X`yYtgu`taq;XTJ9EhmqeVaLtN2NMOJCFAtu$@XXOC zA8TtUmFOUwY>SKxc2Rrh7!PH3D4B%!I&>|DaZ9E0g8bO0-h1D+4c)pEF+efi*E)0Z z*`=lPkNxlw6f#?~J!en-VsT;ShmSr$jSlDwYOxdm|MAvQs{Q1W-~HN0FJC(OiO+q; zWiu+{CW#fbca-Gm6Ww`u^VzAHskucuzqBX1o6F|rPG7%z;oye$%&5qYincuO&;I!n zFJ3!$;?(~sN_EKq+$k=-IDKXQ6-P7V~WfHi4=_+vH21 z`w)Ts0}p>xgXl`Y$<&c4etnx5?zE=^ z(`^h5SBT+eQIKId)F$p5PzP%CRkhxY<>HneoqRbG7tD;<(V$ipLBtmQh2mf@B0-87 z@FD`=$1K;Tw0K$oH78Is+^VhReprz8(9;TCW!bJQ5Ks=y2ckuBf~}3(4H})z(zgjyNj4m{(O&SNLuV$6$h*;0oX7umg6*a8~;13GYZt z$?ePd_7qJV+C99vH}94f=dKEPE=qm2w!cPuEgk9CdYw_ET-z=EWq+D}@^_O@jI1sN zqdQ#4fL9X~6NTT8y z%wEZK9T@Mqdg0msoj!Z+CqMY(bF*Z%caHY8(m-EEsU2Qd{J$5UnVmebzONP)3rdSk z8D2m;TMNZ*iBm<#$vjf4@*LmNS4u(P`g13b3>8T%cbffAOHcpL<)gRnUPWJw`Z=|9 zW=4ZTY$~v``Os^FgF}FQ&;CC4w1vy(7v~?Jed=4lLgCu;aqV}P%(&Q|&hk&BdcgUxmBC%^xh z7nY{J^y&AvW~!)WWd|KuVdoRyeejQSPyPIR-zW?^8$!wlZrknr$5?Le*Mx>j)Bv`$JGaoAAj-VOLNaY`h^cQ1#K-UK9mOX zQa!($K1o`4c;9BHilmrX;scL~3a**0GipbwK_dKE;xy_#X3Qc{ku@Hp%)vg)@NhZJ z7GeT}9lr7Huf8yS;!ktWoZpdWE-d$oa#yrPHUM*f7}C zRTQjGw}aLj9`3q){@C@Y6Wa&cQL3zuxqmm^8MitJKFG1iJK3346veb(q2wu1CrpZ|`wGu-3h)-G$cKn`^{_ z1KRFRG1_F@RwVwZ-w&nYK!$XnM2gk&F$2AbtI~&A1 z2gFS^%APhG5&j3(>bKO0k(O{*j#P~NY_DY#bEewGzi(8&J7x}5ihVtv?~PdB+~Xao z^W3`H|NeD8fOD(!aBNF zS;=Zy!~MX>gBn%eoS^OgO7#P6_M)ITwA%Id7S~%kt?kI;XN&tg^xc%@3q(Vi97_Au z0Y`tiad(gU;WqPKjphynA%p56GMbo>?QHbYV}IcTF3KQ54hm3h8<;{xMJ1tvT^}n% z?N?<@j7Crz!})*lx$ojJ(cV{o_44fE;&elAy+5h|jQ~nYIL*EG)>}tjTsk#*VLBG{ z(c(w$GT<>E`N9LgyLj?@U-=k**zbCAjym@7Z$9+FyY>ye`KEQ)ox4`ucVztadpEr4 z=5^G}A;%%H2;3d%ym-XkmMa=F9g{P&=jUcQ06ML{D3BNt*cj zBk!46n*Gs#{`d`tH{G#+-R-yTy=m{J*YE24hnv;WI{o#OFg%dlrj({X#&mZe9c;VW`Up#f}?QgsP{?~8Z zzkBG=zTvmLe#0GmIuGs|*t2yN(`pLhwuc^iV0!x8S3m#WqEy2K?cmhFl@YY(MfG&I z>`cA9aB^mLamTi8QA2j~(ZZtR|JM6{9i-18)@P;X*laDmFH=UZAT3VbKTb0k~c4E4w zs>HR0r>RtI9$SShRbO3feqmzn;^JUmH4!POmA0137cQNl7Twrbm>rX|P!I1ISa^Pl z5^+J;1CJZ1jG-!h_4#9K8d};Kn%f)uyUMyseV{vl>C8@_nYwUlWb0NmP(bm412pXp z!*JE)#VOs>-fV5@Se%)?H2Z98YcT}}YV2Qo=tC1r#~=9o`!eCzqlMxSjonq(E>BFH z{q>vQ{idyZM(^0S^}v>OJNJ!l-L>J!j^Vu<*D|PzU@T!*33OHNnq^`>=j-yxM1W2= zxV6H<#Ls{6lNV=B{&wn@VTU-ff8c*Fox8j^qgw5{W+_V8kO2p+5%4-w{Td|4hd%!? z`X>MKm5(BilW-Yf#{C2&0)*b~uAN(#X3x?ypmfa%>;6Q zQfOwXvZolHmsXHx0f;!laOZp&+~j6%nh1Fg1$Z6_+S*KQD9@@Ig2yyvqr>R`Eo-192TsI7_fsv#^Uj|r4cRlABMRZnmDMIJ?i%j;BG03f5- zZ^>T4t^@CPd!*s~m7m11Cttte7iS8?XT@+<`VEY_s4m*IX)~=cRahRpbN4%k%b2@Bn0x3T8J%)ThgES@{}$HntIy30UX=0+UMXCE#> zkjet`a8H9{PXnk(4H>9gM(cS(U0#|SUtP;na{plY<;#~(&rVOy&2lmq=Vq@hEG*1S zPtRYNn45a}!s*ooK2-RQ4EOzh=GgVcUu^Ekc>mj9$F2SAA3g}02spt=Z~03zkN@d6 zv!^CzCN9jqd}W5R)x^|=xrN1-7SBC5chZRrvnhV^&5!@_>d|j}`O_iP{Ic{mZVjK* z%VK!eaD^3S`jy!;zgs-{=9|ZWsAZZ+?wFmW!CgB>E?t`Z!*j<;MG-N6-A!YEnm_sC z`&b;rIb!dk4Rq>uw85?g&+L;DL+u$-K&Car3eEQJ(VFMzo-ZChFwoWzbr1#C#gziTHQ&*x{4ZE8(W zA|Qic-$p;MKTo1g(H{Scl=l?HlZyg`kdFB56V(r(*rx7&8NO}7kTvn|PzEZZ{04VCqKU#pwd?r-OWt<&L79) zD|zPLJNG%yIUjiM#pfT5^BAgPv>4FP#R3Fd8Lzl~=klrP)00zE*o9Xn=>{57FPuLz zfAQ$r`Xq$o0GF0VD&a5F+WKJjzI!{Dp~^pM8jXCQ)`aM@mb5ZhG>=^Ak6XE@wx1<4DJ!&L5te zJiKvuwd@>JoPFu|yVFzefB#=zDU5Mud1Rn3h{~o234}~^KojASFg|Mut67No%J)GY z51YXA!{Xc&BUVI#F_vqC<$1c!SPPFzgf+TiOn}Nj2Z03z%>v@3E~w773bY7rZ&WYM zGVmx{m0^Ov0FfappjeTj=}pun`%SoM19908OC8B>uh^2QKp7G}7M6@vxFM&Df`E)4 z*i)eV>PmMjcT- z94qAEG$ldu-||HB_V%p1x36H9O22*QmhR<^kuhNl+T)CRDU6|}!XV2FD+rRsdAyHp ztlZG>J54^fy);IGP)XGtA2hH^u5U@FMw*?O+0dSaHZ|hmn3bc>$JcyxbN}?j9AEro zbjyt_b}BY>Kl3 zK69bHJc)Lt)oMj1g8vugu8^A&D0FV(@JAQM*Z21V$BSx0dqu}Rs8CEPqVHZ znx6RM<@bK}?dL7V0KIPZK@7g@8_LFK&&*CA>Z(m=eV2@u^cXEIM;($CHY4Y)BvFO` zBbRKjDfYv&Cnm?|8tMya5LF}uKDab7H9fI=xNlWmZdYv@v9dPj$-8fyo|(LK{xCfg zv;v;^%2$rf&b;#Q%^0kdBpNpM3I3jH{^j`LCHQ7|n{jXc;ZQ$p2?={^sMk zHy^uiC-oNdP_U7>#*FUSK6!TL$a`C%z$lkeM{cJu;iYvWBym4ZYD zrHxB1nUKk{i5rKyuTC62IyJR!dHd+b{?T#~Z6eTE_cbqtT_Q;u;J=;29 zwE)7`S!LP_!z=_qz(|9615jUPXRT>@&6UY#1K3_=9Rv$%wa&}sSE z)I`h3>Sf0m>CR11W}JHe*D29X@c#$5bj_Wen4KPPF9rH)pxF*@3xNxn%z|&SNBPZ{ zKL7FM6OTRl6eA!WN6d8CyHVUi#Mm<2e&OoHV-v@t1B&z*skuJ=@EK7GZbGbAe0e&YV8|*7i;P zK8+fT{VUHrbZPqCXP$jpuT#-L;JPDO^v=xLs~1o09&X|Mzx?v!=gz~PVweh22%k8s zOcFt=9jw001UG8|O@VJu56QT0yUmmntp(|UVvEsgqXowf8eRi(I;eFqZIopYt=6J| zq9mj=I-Mq?IU_>KiBN!G!N(bm6j@gaeIL6eJJy6L57>BEt65=NMUn@%DPeNcZ-+9# zUdHPI+^)v030M!^5>`nnQZQoCW~ioepTufX(QxwwF|E*8Bn!MGyF(__;CaeO8u0;7=%^jrV_l?Bi{ z_+CguU%GpYC)oVOAD5>2`8}}kkZqv}UmmX=&V#vT{>$Z~mnMGsqbGK@B_jSKz>WLx>CX8{LJt?$T1TSn%CM5~|J(=$KyqYuyhc4b@g`g}!W zs(9r7Js-@S`rGsyU%q{q@BYOrhn{_)b7_XLFd*ysk9DWdUwZcsmuEOvY#)}V!;=EP zp~fO=9h%!AQ643Bl!@L<-9UTB+|0zE&Q7fBPDlARC(3*Lr_cUz_Q(s*+?pOIu;gBn zq9ytHPhMote&V|iM&qQDm+^z)_}Rp+uwTNqf769>F&{iB+RPRCw~2n zPp%yP{!{zc7V2QwrA10Bi`{4b2v3gUAS55;hu?mJ`To^2zv`?@ijOqH`DzBXk!}E~ zeqdeypC^7Xf8o8{NL+rzjlF5WR?nY0(%)26lPEFRVt%)4^NJ78zcYV+Ixoc^?^Q!; z{{8r=sfiQYHxA~5Huq~yf;l)FOcgNWKU_RF(zldzP66|SSH8%N_x88G(3W9kHjS3i z#)kM$Cm9LN931MQbbRy0+dsZ={NKLywWe4%)~>NmaqHfp`74L!Cx4EP9Cp(E$zo}g z4AskWDF?!u-UwBuU6bdv^aKsfX#2ovf*FkmYYejwXbz$=pk5ZO%(R<|{Z1<9!36v) z^tnC*0y4`});CWVwY)LA5qhvpEZA6XExW zO=)6FhKLBr%qC=4+vD&%z}8u8%TcUK!HNr23dM$WSl-5Bx3Vo-KgRDwY{#KT=m3$W zwnY3=Sx2mC@cEG=OF0@4gLg3GRF?n6}!K$=+4w*4&6 ziGWe)09lEd9awIk$L+M+pom5VbpemDuC(Z**|Wc&Ia5bVQYPG5fYTdxjxH}p4EUw_x#X%tp~)6*qnKrx)j@zWYxvT(_od zur7S}ZP!hXAO3jm@V$FiSS%JQ_VPFt-yIwfqXTxVh_WNCl$}%OXFr&H`{1^fg*BCp z-5pbhes{uXI{vLYzoXRetN6uhZCh`{*0{*0k2QHg>OAF>~m*e>ivYTi^RO zcz$|NJ9?^)y?f-`#MC3Zm*=|0=%y`Gr_aovdw)%PCSJ6yOL880VAs^SBk#?e-MRm| z8+P_RdSH{;;56&4TxHtY=xp2cri!q(ELz*rTzK@v^z5n0j;73jOK(%_HY~5YeD?k6 z$rE3G{N9aAbGP&tKK{_1S1+GGKlRq8wtTAngSXv0|IxW$eD|w%pPlmtc57^S>8aW2 z$*Ge|3t}O^4=i8y?uny+{b1_Z$L{E9@2Ib-yYH@pA77aQRNdDO*GkECdEuF-kB?8k z{*@=Gaxq?anN@t{!QN}|rSZBVU81c%>F4hqn)&dPAAIL&&>davozH#c6&f<*r`{?n z&X4xmZrd^V!*4x$WM=l=sdLN%?%vnu^IOd>I}(!Y@s%c7o`uIFblNQ=J*UnbpPZV0 z^@Yb?d+LFI{puIL_0prSzwq!I-+uWD9op&f=BgZ^HB{!@)nSLGv#;sU)WqbO>8ZUV%XV#D84iZD zl9IjwZE8f(-DV5GMf?Pr?M6FnmrkFiSGH|vHGoN3V*%KQ8f}wnTGl~rVMXD-TW(|r zbm`*J?#jZFSl4aWulkQSzVZ9Bb8o-#qupCNDb%sPq-DCat8DK4`=`!~-~WaC+Zu9~ zH0M3_$O9K=PfuMuRM%dJj!M98HW_iW)R+}or;_oIwyY%c{N(hR$*I#9#$S8pfz+f} zbSOc&z?O~l+X7zet-FWMPrY|`?($uC-?MRLOIuCGj?vA({OOPK60EqfzxKjoCl9~% z*AJ)u<@Kiq`#am4O7GgWlpkNUqWk4nUb=Ml_?7b~VLs9&Skam}F>~VT?D=mz`{j~w)w$D~R`pUVG7NqAi;tc@I|aYsxu@=`tShZ;s{F|hU%dM1#W#QRyVA5|u%^4W zEj>ATd}`**^Iv>$MN{GOwZliI&$6<7;d3_wI|1hp5r!23VN?jGG_+}DXtcnv^|(#| zR4_RxwDkz2z|J<>Ws@MfULcwfF2|?<^)qxZ)K)z+F={ z`b^xZa0>Hi9bO&oX{ES~K|Kqa05)JdZuDTTY$|h#N?4*ki`iqU^$Em7>hf%j*;*V1 zLFt73aMjg3dnwu-kOvDq%L)|KnGTN;@D)t$_-KITN{4GwE&qt{_=&D9SS zI%A`N{fo*J1E?6zC!5nuR!qNy>H=(N8eBk(sDC^jTYQwMG~J$EoHV?;4>csKLi_Um zz6Y1ZbtRh{qV$_{lw)~H3>MKT+E^k7$$!hyNWZ2jUCZ1sS{77CRvlhvg%7z%^`3#O ziP>YPW{&I}%vx2T$+5{D*Paypk_2(f&aR7-r!JxYh%%w({EjxdHd73xBvRVVUpipKKbD14>G14$rsnvKp&IwEjvoY zt}@X8Bq_%H>G_}i_3B$kfAfR6iFf|;$+63GZ+>uo^78nbUm2^z-W0+@ic{R)8oczq z`#xouIQh=}l_T>XoM5{5ayTquBj~D{N`_eGyloEZ+`RkoK#10jJ~_b@bj-uYW$-UZ|rMwu?t`(QW48?sU9hi2O`XU z_N`8z|L`~%?-lLYotaXlA7wwq`jORFCXW5}0`sYNF3%ld1opw?@l`|pY&5pjMa)nC z`26W#U%z8uS%!8XLkYyl>sJ2h_`l6hz45t&>j0(>6u2K4>z*9{?fDO;KRx^taOvl- z&d$z_KeDxRX{sS1Mgu+Mt#3a#|NA2prA*%8K>oa}>onV7EPgeaHN{ zAIj(9{P_Iz+kZOwtC`DFYd0@nmf`4#5m(Ot_VW1AKc1idc1>IbN$l1au?%T%)UiEq!@J3uW5#WxuqDU3vu<#^y9mhAy!Ex9}H;FS^*sd89(F` zPv5fQ&y)ZD;m4<$Zmez2zOKLY@OwWydtvtSski4Z96NXB$RAD}EBEWuWu*oEKui7n zl~aG7e&_0$iTMvN{pHZl=jVbRB!JD}03W<__xzRj=P$l{ z+a3Gi9MM!qI31J=svV7qkZ?iDnQyvb{ruI*`O7C~CV%nC?+=4@|8(M4tNKe*yta40 z`{JL@96oXA@YLkwN1%N!9cKWvq%`oG@811~**Acao;~v(W)?h=m><1Ab?)-i(Z61r zgq{jY_S17mubw&fAMd_jksMv^H}CJRy*TmC?9{2>Pfva_efZ-G?|ppw@ZQ$Kk?Pdh z<8RLY;lljnuOHsjgKC6Dt^46CU;fkViMM|G^E1a!&R;#ll;`r))SKhK`2OS9AtV^^ zipY4?%lE9EKmFtLbBCwFUS2r#mzlTEUzz#Azkg#>Yx=TmV~khE5&#INf=xq3!6`aJ z$eYN$ZXmuLan1(633+5txUF&8))=cprJ>z~L~36WaANe(l)b5_VgmWoC%N>iQbaGl z20kU8JKYIl1m#Sx4!+({ijo35HDtm=WMzWjuV7e{f{GRCvJfj@iu7nb5|I@7e7|@k z-dJY*T$N!%xd-mj>Qr-ooIImMUTkBocyW!bBZF=d!cDSHR9n1k%ey*StV>eyWuc#7D!kGEPl99eo})6a&#JdhD5%gSq^gzx2_if7P)#yIdgxNX?ckWN>o>(v>qq8us{r) zUCcm|#5^Jke~K(IgtBYAX-|Xm)=~-5?qHc8Lr)AE)~7JCQGwe>z<*b^+{(sF9WU1v zaaz2ms}sHJ>yw_{)upA~E*x98^maGI_#!MumZ4}F=YzZ+4o4NyCW2&f?(hV&La@=5 z^nv|uTWPGiEYXDBk_XebfLL3f_TicHSEtVoH>T6$wRv@*SzzVR{@uA_?Xi;=rYFWb zmgL`h@P=off8n(U?>M-+D;#jckK@aWF95n;2&Pr0>h9mS^yOEcdEqNhK7a4X$kJ?` z8O3F1R+J$-N{2S3+ZUo2lo_G1yL|9f@7mY3V{K(tjP1a-)!%;g{#U>9`F&#>QZka$ z;xJECMn$?pL3v z;mZ#l+&h|`9AbmU3=za*ghxx|%mns{r@o9l4ziPA>JVT-08>`Z1Rf-0^j* z`qph+pB3vyNKkJ;EJht|lWqQJU|LNUCh~wo-aUEg{nJ->ZCnlrhcA&{QfC-MkyGtO zHB_xwUy}!gr*CQRjt#?k35Mzn^Nriqyz}#)T$nxb>o;D%Zo}aE;X$?!vgQf0Fcx(} zjN#T>H-F*T$6k5*@tY5<%}jR#PewP<>lO?vA@*W&6tJr-DtMsIS6_JH{JG;N#t&KT zArMWuF*+nHF!v0)4fK#p5>3eFM7b?XN?i}#y8NGCdH$bX{PGi@TeV}TFu`x<@pxcE z`ORZZYgRQ>)+9gvz{YRAdh?Ud-qKl~amS{v+qbP;zhd>~p>_EYc6M!rF@c@K-TO8* ztzVY?$PHV5@Zuxie*Tsl$2#I&xTL8$59nQtjIKNlNonfjtFJz}VSD$^;okfdOLnT| zx?Ss+_b=Ho*45gS3WE}*#C=e7JlQI>wol(dmg@bPjhVr^!aQ(1RMuC zJb5AAotp=qyZ4@#zV^)5AG`I=(f(Iof9~FU4wo}Kf zGu|8piZ5G@IW?wfHMr5$=!VM8F;E+{Vr7LF_7ITZ()1veA&45Y&5gC|+Dc`0svMNZWnqTcStly;ZN1ehYPk(n8lQ*vpzpyV$}8$K)u8NF7mKCE=AKe}PK+A4 zu&j;`qcv?l9zRGZr?0zh$4vs{*A=&y>|*c{&5U;*q6C%wB!7E)`C5mklmlvrs+ zk#2L1xwG0fSQV^D5<6OT)y4Lv>cHj(4Ms?HS>_x2ocF9xedY7?+f~s9v2|!*Wqtat z8pHYm3BS?OSmWkm#YiD=V!9tHlEwM@LfJ+K6!CWaQ%Yrlpq7GQFJ2_6>iQVProNI7 z&i?ko%&#`|mo_G8`_k04DPSSw)AG>%7OJ3&)5lZ8QeUohO`$C_TAdrKLAG&YfdRVf zl1wwbBi?y)l3f2FOueB(-<_>04~f-<(rA^enoF!N5*v!;1d$o?6*;0jU0If@>dzF* zbJQ3Uj3Awpc%P&XzemGmbt-zQNEizI~ zt5Vck3atq-A~Qi=AuQI?X5= z;_Yiw#pVKYbfk#E%_?2Lx6GXuBQg@i)@nqZQ5#&`ryXyOJ|OLbnaZI!vJa#q~-D`XNyzUR+9%!W`1IPYjZvfP+qT%u$NgbOX+@=^4O7*gWeUwSvT2*#+?%1an$7_l+!OE7zsP=8_K7V%h#L@RV zD-x@4$L6`}lttI;J+cy%+a=Q>Ik7xg5QzBX;&Ec@P#efhCMnf^pjjfqgcyjdD;_{a z&CEAFz9}ODuo=q`xVtBA+%|P-?%#j@LqvFhS^<(zumF7#MTn0%O#uU@W{M?V24UE2 zh?;<|G0KcJIe%>r8qq?RXS+bPOYHBwa?8}@FE3r1*f-eNm1l;GP@3x6J&@OvZ(<{*6VP=c~ISGzvTS{KkZM_V=)x|haDwUGuSC|6{d)|5j0 zghj3zZb)2F6%(mN;Y8J$$QD%_2a=(-Eg+$H#-NIZfP9 zsa%sNdUEWo3A*cxjMtZ{P-p~t(c=~)NVwDlHy0b9Xj443)Y2X+72qh8B3G>k8|-|# z`>VurOXYUN{wm#d70Sok4IOC;ye;l57kkp+o6Gd-XL=n6N@T22Z-McSR_)y#TJYqE zy1zE09?cOuTI}0vv0;*S=8NT3mX2Hjd;MUAl*EW_1hC=1Xlo5OqAG-ZE>N2 zG2DSHv9(0Q9lN|xjOMBzY7wZQtf|!YM2dY`npVaEF7Zs8lX=975;a~G+rwf*s*1U7 zf4=izg{3pWiVhVYZCj4&dqduYND&bd57vukT0~i@+^ZQ)70-34u%f`BU|*4L3nPha z)z&iUkvj3i)h_On18vINOT>M3hOv6ti{#~2?X4}AEe$ze*xzSSD78wlY{hDj3_W?; zngkgFM)~j?q`8IgJjZGt!Wr zAdpt}GCuG+s$+~rvC5>73RYV0lBBnP^Q{w;N7|c97);Qo3VI!GhZ!MmhRZewV)qu1 zCzUbU&bFcxCnrCgIlZk{j*y48ZO)=I+DbTqB=2{hNf!XKsnGy7>jWd=cN?&>Y z@$rch-}~AVydNf^Jon>{O&^R-#>a?8>g@)#fhU-3NP+!OMN934@i#A@`gPBeG8&?Yc&zQNJbLWN zrMamu-MXQLu*2$-NFeR94tM0Gko|L-~+P;FRFL$y|nY z?Wv!BG<)*YiBIMxzx&D;UVrTs#0^gT?)zC$YW4zo(Hgc|B?$m9>~T&T>keebXuBiI z?x53>l%TSERo)Qb8BvgC2n4l2!P%H+;YZ*W!yEfQ{@}#XcYcgu4rF26f3o~aS%K4T zVy1xX0|vp+A{cfjIneeL$e=NRc;o9|WmdIw^8mX)xM^;K#M{QXY5d*qvk@B|TQ959 zp~h)daotlR6tsT>ZcT^=2(lX?;q|Kn9u>15`b)-u+R8$}&NOHW`CTT1R2pGm2Z4z| zI4X$5B@*lGycAYttWOHNgvKi36GUGz)r%-eHGpH;kgwfQYp#MuRN`5k@8~KL`RVG` zGV}HZvAIU%rI?(~YZTFtT+l{EIFKf|u2z0O{UyfQ6uJA#d`g}s^;IS>dbtG#%vnGRagx~t4Hk)8>S31aAsh74iZ2!bD&X?qkGZzOlpHHl zTxD$muQD;(P+w@?RxWPuG=R(;YPP}}!}@bsxfVXr!Dd58k+G&I`?dp15%9zf_t|~R zKi8Yo5N9q4>DTA#M+$TmA!rEnv=s!&;ygQSTwkh@E9bC^#z=dnZvGDw@1Ht5Gkx*n zGe@tSn|N#L(_f8$h&;uI=Z=q`K7aAT>A#&l+LGtmGrH``nKR&=drEX=kqT62w-qQy z3)HoVs)`up#%$e|JS&691^~%bifx6WK3-}{Qezyst6YF2M^$52l>!bj#vGM#(pZ&p zLy@2(#LB*=LN`>QX#_Njcu2n3RHnqZhw6PaU$Ljcn3HHqj#O^W75gfURQ1&fVn?xb zu+|8-lzeBoVPk=&BtcmfCpMRetraRX5~~wTyDK%jisj|9Hcq*&NI6oeD~l5aaoW8D zS-V>T)KNX@hCQWXN0C6h5%ThmQq`sc8BmSp_O8_hf4h8Yc6?&Z(jw*v^usYtXpRsY z@NX?t)<>x7LQ0T18w*5Rw3HH53>8>66kFJ3@HVK@M@ntT!16KI=18NJ#vDk07@_8g zHR#pE0DTdZL)+*##>z94kzCzqq3ocS5)wbB-+uK7WP$8RJ?fOm;1@(N($cNZH)1SR z8f5|1fC1}z6h5O2c?q(B_RcJU#u1O5-GxT9`qL8yo8?&_>&9phmQOacu8fB z2jxRN#XQCWzXNtK&*Xc@2LF8N^x>IFs^!*zr6FbyCI}r z5>g@R4gs($-u%#(o)6BRn!7T4?`RJM0_IlvUyPCyHwzFaNAiD$p@5us~i1_wx9~@ zAEwXf$&`6iaI&JTy0*0Bq2lx`6q0pPonKcSVa&=-I(K0TRKV*G-)J-`Axfj~v@A_2Rxx&26pve_fAfvFJ<{FZ8Ltw#vA*(cG0LUK-RA z_)oD$d}F!wCzFK~0Ib8Dj0VO6jx zzQ5A59<6VLi=DE?Qfo-XO%8eXg%op>xUD>=NnBusq$uLI91gREhN0y*@zBW^V1!rr% zc&bykBU|C|7*<#5ca>{~GBj{!Ajs2F_)@R&<_^XFPO&XR{A|RG+Ield@;m*C-G$=D zKIzc`{g;Q*-*~JI5lHauJaq>fA`;`B;M?)!0^ja&Nx+YpP!J@GbDP6doS^2@S?y?^ zn=8|d%bODG8mgAmR*iP&ZtcuytFLHlDBshcef_G!j>eLjx{3|mnLM=`nrc3G&+UhQ z@=R5lo}UG5LwQM%{3E&3>0CITWO4p~{jAI7V)Y?N7Uxcv17sjUvN%U&rYKfLkSxw! zZs+3TKRYHO=&VRmm&U1_4vXDkLluFr*z9(FtAtK*F?+;ecxwlxU*1Et0<0EaK0D$G8BUKsRhHlYA80H`bVI@ln0OhT6=gJ4iJGOvT`K7}yy>1NYf2AaK|s(c=m_B`zH2gxyV4z^F3n z7}6n1nUR1}t1M|tk(nOlEG~32mEM>pqC@7WNa?l?krg4~0^C#KV@QD)hK(ki$pr1a zDOD8_;(KZ;VE3Jj*M>gmwt;2=JJD9|EX@HLDPrzMd#7nsx|42?ZhFCa$asI#lEN^4s7?Q;~KMuv1 z`1|kq&wN*s#{KI`OmGEqMwyApB0Q3ke{l zg=<8zIbVs;BC)r|wmd;pL~2Wesa@Xs@eh~-KKyI2gn(@3?S15UR`fkY6UQC z2eGCbh*1Jy0HuJ}#wt(^xNBKNS%jr03Ts!v))HiUe}Y&IM*uS#i&(?FCQE@A36vio zJ>(!3@Gs~|mVY+ajU1%{UrU5Q^F7*Jm%1O%&}2F!5ti(y zvHCsb8a9dKbN(an4}{J}p7AIPXq0C3-apZmAu{)`sEGm`aBD_M2=S$lI_XVcBQMC;bI-zpRea$0tb#a z5Pc8sXUHZrY&Tx>bZ(9p2U;vo^eTBSQThTQd!k3yipOJOpveBkCB{dZodwa%fW)p$ z)eEhrWd+KnRIx8fJl>!mEHk24-08tzSZ<6stb+T$D}-#X+(!ifk2Dq}CXhVbGki_( ze*pkl?PhRb!LuOBrmgTQ*fL<-gn}qv;XXQDCNWmvd3n%%SB+SjB1WrhuMAu7Z4!{G zmZgcOminGw=^d_=U8^3bH@>i1poa$7dma6p906Jzg%f6xC_|?Ebs1s9iZp2`RhR8I z!wa~nM%r0pS=y9_at3=(@a;>Nud67{U7By9jqG+dkNaIl;_tubKXZ~qd&3{Z(}WhabZL zoz7#>u_5A~*J~7R8>lcr6W)zBGP^vB!mQDA3AiX+8cx2=XuuVP7MVjM+0{yRPcguQ z4FZ8CrZ8TtXe7zy)z#;y*{nfpg-lA%7FAn=&FZpfVeA$q%AXPAkI~5n4Q51i0{$J#BKfg>4lEpcXZYB}L!ZZA{ zoJaRqr65Qa=gfIOJBA6KK^_fs5W$Hh*1?J`l+P`jP=5dB3fa7X zP2X^VJbIAPL@{EB9PNEHmtw_mp&TS-@p8iJ+zk>ArE{4w|AI^_!y#E&>gMlO;Ev&Vko>UR;)_V&=O&WxS>?6E0)VM zP*UrP#Ohpz&NAzKO`iPrXe(ufu-{p275H%GDP^B~Osh(HhL9Ei4b7h`vl& zB%Cf2P~N^|L1g=t1iqpK3E1*pDpDC4C3_aE%9DdONUBG>B3=NK&hX>2X&@hrW#K?v zSG6WAt-zklCeO=OM@p+BRLI!k8;)*aYlH%H1ikJhA;CrfL_}GFe9sf0^(qk?EXUtR z)TfHdBmqc+kiRc+VvKvET244@;duGF$Nnd0B$|Jc7Oov!+Ja~WZ*pah421$Uw=!0& zj+fE`N}fvtVMR|!#<+qw>i5aPf<-<+tNdEdyo24uGCV86W>X2L=vOAn4^`fC7X>H& zefVft1$gYi7&Ts&*&+G-bJ|&aIYs0IIZN=XpSW-Y$>JQz%~i2t0EEmnzs}xR z<+2!A>VZOib(B~UR$|J-b9+r#u_{vb$fmE($p@azdPn`UK0^!83pH1~-G{R@tCFClx`rU?pZ=QT($UD#!;0;5$Vk`F{+Q@k9<{J8QB)|#LLCa94dMJfzSpj;Xho@pR z9*FYTWgtS^3Z#E6C6%4a!6T3w2USbRKNm6(vVDMQ1qgp!QS z3vPXt2^2_{kjGmZRO3|(r)z;PK=O~}_L@X^efCdFP9@dBI1 zL6N@)B$StC90%#|}r*Jqlw0tw84G2z}^lGieh&Tge zUIrl?#8U`08_YU&8WX~>w7!jct3hY^EH@c!3!1Sci*pXk@~H@t#km2yy`U}*0cb0` zJ1gIMSi`a-uUYUI#Jp7)fE*c_+(GL$JCx3t0PN{Rk8p*I7LPhBT8kJ0bZ(8uh!9PD zP^q+=$uSUQ+@rS1Zi8J#rlsZ9n0TYbA=3{LShHXW;Wam8ior@#T%6Bh)vz_@L9Ma+ z9TszTNcQ#P{*mvcfSM=jxYIS{w6ebX3hY?gzH3%rY1fQM6;Jj4Hm4KL(@Ose=uKR*c$c2)fiRE4uHp`lZjO z!E2Sz4jPbO$kc#&4LbQCxL`D3*Cj+$idBt30rH+Evyv)>!iL7X%W44;5y_6mYVz1^ zF+stjm|+BT9-ibBbzZv$v>|H~qi~FSyrDoLI~~*@oeKOT5FyD*Q0V|Qh22Z5GH+Se zEF^Q-C`Q-!FRxGD+hn8~EQ&Lh#_PA1Lq1iY(MOOh&OvuTmquS@YpIgg5me!ru?h`n zmijnR1IndR?5~!gMBQ1^^)(bWN~$je!^bMsw2ZLt#L*InCjSLnRD$Fm$+u7~Upt;; zasGe(>}aI~s)Qg}oNuc@9ESHVku1(}SES2CkSxwQhUfgk@%&%%&N^N}vbRC1PgT;8 zp>pH>l*KBEkrKJ0u1Z!ClyGA;a(T?igKZ1v3V0{6a6UiFH&HELd!1x)zPXeVogI({ z^bY(2){C-e&89+$ygWura3Kg@BtYPxtIu2y4kK0K`eIsS0GZ_SY?x{}N=<;YA&SEq zg5KuFB8lfeuXDg>uam4#wJ;c^>(U#c><%d8nVm(^=~uM?EC+pIRUn1e8<70h{C`)5 zHLWo9>{66hGZ5DH1(oO>#rQPC@kUG;kbeO<#2e;TL0*-6U}F)NLw@rFTfC8C%*U0y z|FJ6FFit&TRcWktV~K(&j#l$mUIe`i-wI8q)!Bkz{i2C6lp|L@sEC8mTa&2-1;k>( z8i5TKAEzX&L)vI%hMXf*f(F-yLKSSj)CdimcM`DHAOq8wL8OUwY088s*;ET)_E4fS z0bArKXrfS|tB%u;mFwis7_BBa;TsASNUiezK}oT*pgg8fr*}HQt^|!EKU7UI7(ftP zeiW>TP^^rUskvxEN_4`;1%6+kgrY9z+~jHFp{C#oTULp$undyLJTtC zW6d(l$(m?&j7x!>SD#M|WXb?_&K z(q(vUs!h`orR-$T@0CRkYlEU5O9HgNuH6Ge$Zw*}6~RtKw9#z$YoPhJJH-I!*)2=z zt%#97f}h+b3$|}c5;$us%=Fv!tpO2>O#|XH@Gn9Z)(URd?Uh!*>d78`P7ntZc?W@| zFO5e?1S>Nv1tA+a;cZ3gHHC&8gbHKDfogH<60xepusm1!V4Jw9$dq!8lX7RJ0OHO) zKofO;DOgJ7@}`)bYiqFb(4xz_dR0wDT7L;Gbm8^rP@G`Y2x|rpM1o{-UY??|I<*du z0X9v(tnsda#9EppvA=LrLRpPGj;NMH9&1d5i@thAiUJQr`b#9NP!6}o>Cuu`B=%Zn2z2ISXC7Ux(o zBBtT=8cE<6AcA3Y=|LTk134f#{{$}*pqrR90ny=d6vT_XSQ(ka@8m_^h6UL`yABb4 z0we>$n?yuW_As^UIN-C_Ny@_thf4trIM*Ya1!HDvuqd-#@}NiMk|d`{q`w^yDvA?} z0C$atn!+Y2Xl`Fqo)jjbw91=D+L&IqIT)~2BrD64h1aY1c(s*0kQ0R4r}G7k73mUF zeqfCR3CM@YYl<q zFb}8!c#OdQ^MUZ82ky|CY--L!VG?+3rQRv!G0cq>BszzJ<}Lj?H|>3o{AA!E;Pxt! zd<5qY8O`WI_C$WnqH|&os(eu@n1B_jYM0N1w>od;+WXPUpDS5Zrb-Ai`h(UY7?)IH zZll{{q6bCqlo}6-mBM(gmjdA$`u4zVvSSoRyNSv$4MD1qkPLc-UPn_Ui$<$a!oM{c zkzNz}`I5$@g<+Ir#aT%KRRMAVXd<JEawC{@qgudc}JsPIOemQp&mMu{C;HF=#M$Avakt4 zcEHXd!^SdnLpvqNz5*HuZCEocue2mae`}o{{r0wIOD)Zu z5~;b^xV*-5Z=b8qE1Iee1+bQA+yQ;8473#nM{2N-m+!##5-*MD7D$dIo~(F17rHh~ zOHj+ekH;ge7_@()eb(Mw9h9-0C`X4NjxqW2|B z;km??a)Dh`S4p5XQv$-;SD?q@a2d5zwW%fB43@jM#ExNQb#65K6sTM6DN=HRtS#T3 zW-W_Q8H@^zP6AzUW4$iIDO7OuJfb}b1dF4&+`YLWvOZVDMu?_T?fzxjEiL+-L?ga4 z2!Gwuqgh!UGg_-^$(Hfn+sb6J$xXeqF3nD}E-S{`lTC38g3-iX10$>v|M!qoRA9NO z&3J38tu)J)94kg^#Uq2Ett-oJx^6jwm6A|Be{k^5Ww9+OwvtE<#Ia39n(DBIg>_fC zf*|=H`B<^oT_N%Nd3|3E28AFx6jb9oYjis*l?(mt15KLSI!wTOSS9yWtB9%y(Uzh^ z2WD@Tk{9da#dXzkko<%Bo+?2s9KSgKUw;o=r+u|@kSxv{62#tGIY<`gJWm#0UwF3s z|MP|8p;QpOhxT-Fuu<&4_WN;!* z#d+3l%o24m#)?PCp^p`$+ounXHxj9|2CSHaqW<)E-^2}qo z)~q-kaN>O>CZae=QJtZ?rP8uDU$uau98K4brfX=PQ`GIu((cO8&`YlmtH2WPuK*$f zsZeoagL)4np;mEyHHJh| zM~doTjp9J1f-0^dLCIEecZC8H1iG4gt5tg{B{Vh(5?<#3a$etGtAQ&~9If9|pt`P* z?SQTzQnSBAcYT?Ggd%e^N4GuCkQFEKnBAPF8O<`}#_KAB%C!k9Bs)q&+L~C?&O+PH zJR?3l_)sR zMhBgvXGxv1bq(--*Gt%I&so5w& zZ|p-+5M<-Ed{w+DC2XaYy*YQW+};wd}?xnWO2?vExb;$IET;;6}>x&9f8b28%h>8$m1Rv zKmYKO;0=X3n*4xcQHk7@pNz&-}%(G6U(Mio=4udUEO(I$^wcD5*XC5jg|>6a#| zVbI@IDITg3cXi6Q<>v=2yFsZjB&t>2TC2ezX{=M79) z8_UE^?Veq1v5Ul)`XQKW>%-!ox7e6}-P5h)J>1zSzOluzp4cN84rG!-W@=26DVfhVs-A8TYg_E?dFlt&r2p#CMP3_%109(rhtG_PAd0>O$>QARbuGM3vN*RpJV?}* zB?%j@4_i&$95#oi)k8HFe0cMcE^&l4Q}{ke&a_$aoYCt=oq( zwyG^n#y2`5%s!{9FijK|>(`jq9V zQUd%Mr(W*}qEg$JKox5A+wJv9W-ba40($a1MO%_IK%^LKG^L1E^oYDJ2kH~aGRYlu zP0;7!iGdcD&mMM~f{igc7Em@uZnw2KUQ--PMQ!!DZMpRJ*`a&A7K^JWM$bc)YTV(n zz&a@k8{F1_-s&lgGN(rhgTrs|X^8XaKMczMopa7XR-Jrtuod$num#l(}GJ514I)g zyVFq#F%!(c%Sn)MZve`$dTp%!m9YxD-{A;2tK*dfHkOuv4pJeP#vWlLU?!5=LI!)t z)SRXU(`ySFtpP)0ijpAr1YA5_2@<#8*_5bhOi+^`T-lPSBuEzL4zHy-nT>$P>9Z0G zIWL-AX6R{z$!#R+6IB2zEIyMp;Kjt8$(=pqcSHo}E3%zuLc_gU6;={f59iRikn^I) zZKNSa0D5=0&MEaTXnCU&o~|1XFRr|fQqLL)sEpgw97 zcr&boQ18?bPB0-(K@%AKIz1M2Zz${ab{k6)mccZiO->WPkiQyST9Zdl0?&~x0C*w~ zFcqgDS)8M9&+!!D{2kYEzK#J(d)&ZUBuh1!dN9za~|EEIi(PPN|9lcn0%sBcKsqs-i%f@QXHbGfRc)P%>!XrCURj@s;m>TJ;* z6g%4(;aRU=qH4@yx1t?sibJ4=)nvFvo9Oez#fgJGP&Pt#N$l+qVS3Sev)6MC-4O|l z+~w5hO8t;zZ73(VX6hJ3_U36o)>%wO%6=f_$ze}lg##Wz92N#%bw#=ftUEhCc2%ou ztSc)NE332vH7;hm!*zOqC{P?$*7@j-u*ogU4k9=_+~nu|U_nL6w=7Hk9#y2d@#{hF z0>ci2!M3edhg3*+u>w>)WQ~n=DmG$l7cB-`6_N#c#uS)<31asWJu1f?WmZtQg~^^h z_3D&FKeO7$2IXpJSBI57;O%YFJs4K}82uhGGn%Z&z%WTbDr7!$rY-&-Q&ooSLFS)5;2 zEUHuFP3yi=vA;|-Wh*<1bk~=Q0~JEvu~MN`{I~r2N_oj6NEYWi%go^68)Btx^q-5> zO)2K#BFl?|#uwMySCv`n5~bbM(hUtf7}-rLSLP@-R?2YAmSp2?OH6lkYCG~ZH5uwn z)!IAi<^FA6jB$6RxUr7Dt30#VRVNPCnSnPT6}Z1iwZF<)lPW*!cGu`0YBK@I@6J{} z+NyeJiKdngNsP3=(s)CWHZM^@+*V<}z0#7OB;_WE>kHI-+tuw^s1v9+Rf(-Nf{h{I zHxz-`mX^oLK*W1$#pl{|ZP`}3uNzA>>q_L7OHq<)V~uJ}sZ9SbO%z)|Q&bwWQy_>dwuM}tTR?ewg81BBLnWxCB}0^N+h46 |D)_Z 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 0PJNp#bI=Lxx7Y5D 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

*9TmLjgqN3M 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 literal 0 HcmV?d00001 diff --git a/editor/studio/UnitfrmSplashscreen.pas b/editor/studio/UnitfrmSplashscreen.pas new file mode 100755 index 00000000..9033ffc2 --- /dev/null +++ b/editor/studio/UnitfrmSplashscreen.pas @@ -0,0 +1,173 @@ +unit UnitfrmSplashscreen; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, SciLexerMemo, JvInspector, + UnitfrmMain, UnitfrmSettings, UnitfrmSelectColor, UnitfrmSearch, + UnitfrmReplace, UnitfrmAllFilesForm, UnitfrmGoToLine, + UnitfrmPluginsIniEditor, UnitfrmSocketsTerminal, UnitfrmInfo, TBX, + TB2Item, SpTBXItem, Dialogs; + +type + TfrmSplashscreen = class(TForm) + imgSplashscreen: TImage; + lblStudio: TLabel; + tmrHide: TTimer; + procedure FormShow(Sender: TObject); + procedure tmrHideTimer(Sender: TObject); + public + procedure OnMessage(var Msg: TMsg; var Handled: Boolean); + end; + +var + frmSplashscreen: TfrmSplashscreen; + +implementation + +uses UnitCodeExplorerUpdater, UnitCodeSnippets, UnitCodeUtils, + UnitLanguages, UnitMainTools, UnitReadThread, UnitfrmHudMsgGenerator, + UnitfrmAutoIndent, UnitfrmHTMLPreview, UnitCodeInspector, UnitPlugins, + UnitfrmMenuGenerator, UnitfrmMOTDGen, UnitfrmClose, UnitfrmConnGen; + + +{$R *.DFM} + +procedure TfrmSplashscreen.FormShow(Sender: TObject); +var eCache: TStringList; + i: integer; + eExt: String; +begin + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmMain, frmMain); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmAutoIndent, frmAutoIndent); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmSettings, frmSettings); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmSelectColor, frmSelectColor); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmInfo, frmInfo); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmSearch, frmSearch); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmReplace, frmReplace); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmAllFilesForm, frmAllFilesForm); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmGoToLine, frmGoToLine); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmPluginsIniEditor, frmPluginsIniEditor); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmSocketsTerminal, frmSocketsTerminal); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmHudMsgGenerator, frmHudMsgGenerator); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmMenuGenerator, frmMenuGenerator); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmMOTDGen, frmMOTDGen); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmClose, frmClose); + Application.ProcessMessages; + Repaint; + Application.CreateForm(TfrmConnGen, frmConnGen); + Application.ProcessMessages; + Repaint; + + if IEInstalled then begin + Application.CreateForm(TfrmHTMLPreview, frmHTMLPreview); + Application.ProcessMessages; + Repaint; + end + else + frmMain.mnuMOTDGenerator.Enabled := False; + + Application.OnMessage := OnMessage; + + with frmMain do begin + sciPropertyLoader.FileName := ExtractFilePath(ParamStr(0)) + 'config\Editor.sci'; + if FileExists(sciPropertyLoader.FileName) then + sciPropertyLoader.Load + else + sciPropertyLoader.Save; // create new if it doesnt exist... + + sciEditor.Gutter1.Width := 40; + sciEditor.Gutter1.MarginType := gutLineNumber; + LoadCodeSnippets('Pawn'); + ResetToEnglish; + TJvCustomInspectorData.ItemRegister.Add(TJvInspectorTypeInfoRegItem.Create(TJvInspectorSelectionTextListItem, TypeInfo(TSelectionTextList))); + + eCache := TStringList.Create; + if FileExists(ExtractFilePath(ParamStr(0)) + 'config\Cache.cfg') then + eCache.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config\Cache.cfg'); + for i := 1 to ParamCount do begin + if eCache.IndexOf(ParamStr(i)) = -1 then + eCache.Add(ParamStr(i)); + end; + + for i := 0 to eCache.Count -1 do begin + if FileExists(eCache[i]) then begin + eExt := ExtractFileExt(eCache[i]); + eExt := LowerCase(eExt); + if (eExt = '.sma') or (eExt = '.inc') then // PAWN files + PAWNProjects.Open(eCache[i]) + else if (eExt = '.cpp') or (eExt = '.h') then // C++ files + CPPProjects.Open(eCache[i]) + else if (eExt = '.htm') or (eExt = '.html') then // HTML files + OtherProjects.Open(eCache[i], 'HTML') + else if (eExt = '.sql') then // SQL databases + OtherProjects.Open(eCache[i], 'SQL') + else if (eExt = '.xml') then // XML files + OtherProjects.Open(eCache[i], 'XML') + else // Other files and/or Textfiles + OtherProjects.Open(eCache[i], 'null'); + end; + end; + eCache.Free; + + if PAWNProjects.Count > 1 then + PAWNProjects.Close(0); + if CPPProjects.Count > 1 then + CPPProjects.Close(0); + if OtherProjects.Count > 1 then + OtherProjects.Close(0); + + ActivateProjects(0, False); // Started := True is already set here + PAWNProjects.Activate(PAWNProjects.Count -1, False, False); + UpdateCI; + LoadPlugins; + end; + + tmrHide.Enabled := True; +end; + +procedure TfrmSplashscreen.OnMessage(var Msg: TMsg; var Handled: Boolean); +begin + Handled := not Plugin_AppMsg(Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam, Msg.time, Msg.pt); +end; + +procedure TfrmSplashscreen.tmrHideTimer(Sender: TObject); +begin + Hide; + frmMain.Show; + + tmrHide.Enabled := False; +end; + +end. diff --git a/editor/studio/UnitfrmTextAnalyze.~pa b/editor/studio/UnitfrmTextAnalyze.~pa new file mode 100755 index 00000000..deb2e10d --- /dev/null +++ b/editor/studio/UnitfrmTextAnalyze.~pa @@ -0,0 +1,198 @@ +unit UnitfrmTextAnalyze; + +interface + +uses SysUtils, Classes; + +type TPAWNParseResult = class + public + +end + +function ParseCodePAWN(eCode: TStringList): TPAWNParseResult; + +implementation + +function ParseCodePAWN(eCode: TStringList): TPAWNParseResult; +var i, k: integer; + eTrimmed, eLowered, eNoComments: String; + eStr, ePreEvents: TStringList; + eStartLine, eBracesOpen: Integer; + eTemp: String; +begin + Synchronize(GetCodeAndPos); + eConstants.Clear; + eDefined.Clear; + eCVars.Clear; + eIncluded.Clear; + eMethodsDefault.Clear; + eMethodsEvents.Clear; + eStocks.Clear; + eNatives.Clear; + eForwards.Clear; + eVariables.Clear; + ePreEvents.Clear; + eBracesOpen := 0; + eCurrLine := 0; + eStartLine := -1; + for i := 0 to eCode.Count -1 do begin + eTrimmed := Trim(eCode[i]); + eLowered := LowerCase(eTrimmed); + eNoComments := RemoveStringsAndComments(eTrimmed); + + { Constants and Variables } + if (Pos('new ', eLowered) = 1) and (eBracesOpen = 0) then begin // const or variable + Delete(eTrimmed, 1, 4); + eLowered := Trim(eTrimmed); + // we don't need braces so delete them... + while (CountChars(eTrimmed, '{') = CountChars(eTrimmed, '}')) and (CountChars(eTrimmed, '{') <> 0) and (Pos('{', eTrimmed) < Pos('}', eTrimmed)) do + eTrimmed := StringReplace(eTrimmed, '{' + Between(eTrimmed, '{', '}') + '}', '', [rfReplaceAll]); + while (CountChars(eTrimmed, '[') = CountChars(eTrimmed, ']')) and (CountChars(eTrimmed, '[') <> 0) and (Pos('[', eTrimmed) < Pos(']', eTrimmed)) do + eTrimmed := StringReplace(eTrimmed, '[' + Between(eTrimmed, '[', ']') + ']', '', [rfReplaceAll]); + // done? okay, split all items if there are more than one; and if not, it's okay... + eStr.Text := StringReplace(eTrimmed, ',', #13, [rfReplaceAll]); + for k := 0 to eStr.Count -1 do begin + if Trim(eStr[k]) <> '' then begin + if Pos(':', eStr[k]) <> 0 then + eStr[k] := Copy(eStr[k], Pos(':', eStr[k]) +1, Length(eStr[k])); + eStr[k] := Trim(RemoveSemicolon(eStr[k])); + if Pos('=', eStr[k]) <> 0 then // constant + eConstants.AddObject(Copy(eStr[k], 1, Pos('=', eStr[k]) -1), TObject(i)) + else + eVariables.AddObject(eStr[k], TObject(i)); + end; + end; + end + { Included } + else if Pos('#include ', eLowered) = 1 then begin + if Between(eTrimmed, '<', '>') <> '' then begin + eTrimmed := Between(eTrimmed, '<', '>'); + if ExtractFileExt(eTrimmed) <> '' then + ChangeFileExt(eTrimmed, ''); + end + else if Between(eTrimmed, '"', '"') <> '' then begin + eTrimmed := Between(eTrimmed, '"', '"'); + if ExtractFileExt(eTrimmed) <> '' then + ChangeFileExt(eTrimmed, ''); + end + else begin + eTrimmed := Copy(eTrimmed, 9, Length(eTrimmed)); + if ExtractFileExt(eTrimmed) <> '' then + ChangeFileExt(eTrimmed, ''); + end; + eTrimmed := Trim(eTrimmed); + eIncluded.AddObject(eTrimmed, TObject(i)); + end + { CVars } + else if Pos('register_cvar(', eLowered) = 1 then begin + if Between(eTrimmed, '"', '"') <> '' then + eCVars.AddObject(Between(eTrimmed, '"', '"'), TObject(i)); + end + { Defined } + else if Pos('#define ', eLowered) = 1 then begin + eTrimmed := Copy(eTrimmed, 8, Length(eTrimmed)); + eTrimmed := Trim(eTrimmed); + if Pos(#32, eTrimmed) <> 0 then + eTrimmed := Copy(eTrimmed, 1, Pos(#32, eTrimmed) -1); + eDefined.AddObject(eTrimmed, TObject(i)); + end + { Events (Part 1) } + else if Pos('register_event(', eLowered) = 1 then begin + if CountChars(eLowered, '"') >= 4 then + ePreEvents.Add(Between(eTrimmed, '"', '"')); + end; + + { Functions, this is adapted from AMXX-Edit v2 [see TextAnalyze.pas] } + if Pos('{', eNoComments) <> 0 then begin + if eStartLine = -1 then + eStartLine := i; + Inc(eBracesOpen, CountChars(eTrimmed, '{')); + end; + if Pos('}', eNoComments) <> 0 then begin + Inc(eBracesOpen, -CountChars(eTrimmed, '}')); + if (eBracesOpen = 0) then begin + eTemp := Trim(StringReplace(eCode[eStartLine], '{', '', [rfReplaceAll])); + // Analyze type + k := 0; + if Pos('public ', LowerCase(eTemp)) = 1 then + k := 1 + else if Pos('stock ', LowerCase(eTemp)) = 1 then + k := 2 + else if Pos('native ', LowerCase(eTemp)) = 1 then + k := 3 + else if Pos('forward ', LowerCase(eTemp)) = 1 then + k := 4; + // Remove type + if (Pos(#32, eTemp) <> 0) and (Pos(#32, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eCode[eStartLine], Pos(#32, eCode[eStartLine]) +1, Length(eCode[eStartLine])); + // Copy function-name + if Pos('(', eTemp) <> 0 then + eTemp := Copy(eTemp, 1, Pos('(', eTemp) -1); + // Remove return-type + if Pos(':', eTemp) <> 0 then + Delete(eTemp, 1, Pos(':', eTemp)); + eTemp := Trim(eTemp); + + if eTemp <> '' then begin + case k of + 0: eMethodsDefault.AddObject(eTemp, TObject(i)); // Default Method + 1: begin + k := ePreEvents.IndexOf(eTemp); + if k <> -1 then begin + eMethodsEvents.AddObject(eTemp, ePreEvents.Objects[k]); + ePreEvents.Delete(k); + end + else + eMethodsDefault.AddObject(eTemp, TObject(i)); + end; + 2: eStocks.AddObject(eTemp, TObject(i)); + 3: eNatives.AddObject(eTemp, TObject(i)); + 4: eForwards.AddObject(eTemp, TObject(i)); + end; + end; + eStartLine := -1; + eBracesOpen := -2; + end; + end; + if (Pos('forward ', eLowered) = 1) or (Pos('public ', eLowered) = 1) or (Pos('native ', eLowered) = 1) or (Pos('stock ', eLowered) = 1) then begin + eBracesOpen := 0; + if ((Pos('{', eLowered) = 0)) or (Pos('{', eLowered) <> 0) and (Pos('}', eLowered) <> 0) then begin + eTemp := eTrimmed; + // Remove type + if (Pos(#32, eTemp) <> 0) and (Pos(#32, eTemp) < Pos('(', eTemp)) then + eTemp := Copy(eTemp, Pos(#32, eTemp) +1, Length(eTemp)); + // Copy function-name + if Pos('(', eTemp) <> 0 then + eTemp := Copy(eTemp, 1, Pos('(', eTemp) -1); + // Remove return-type + if Pos(':', eTemp) <> 0 then + Delete(eTemp, 1, Pos(':', eTemp)); + eTemp := Trim(eTemp); + + if eTemp <> '' then begin + if Pos('forward', eLowered) = 1 then + eForwards.AddObject(eTrimmed, TObject(i)) + else if Pos('public', eLowered) = 1 then begin + k := ePreEvents.IndexOf(eTemp); + if k <> -1 then begin + eMethodsEvents.AddObject(eTemp, ePreEvents.Objects[k]); + ePreEvents.Delete(k); + end + else + eMethodsDefault.Add(eTemp); + end + else if Pos('native', eLowered) = 1 then + eNatives.AddObject(eTemp, TObject(i)) + else if Pos('stock', eLowered) = 1 then + eStocks.AddObject(eTemp, TObject(i)) + else + eMethodsDefault.AddObject(eTemp, TObject(i)); + end; + end; + end; + + Sleep(5); + end; +end; + +end.