diff --git a/.gitattributes b/.gitattributes index 51419715a8..f420ac4fdb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1115,6 +1115,26 @@ examples/bitbutton.lpi svneol=native#text/plain examples/bitbutton.pp svneol=native#text/pascal examples/checkbox.lpi svneol=native#text/plain examples/checkbox.pp svneol=native#text/pascal +examples/cleandir/README.TXT svneol=native#text/plain +examples/cleandir/cleandir.lpi svneol=native#text/plain +examples/cleandir/cleandir.lpr svneol=native#text/plain +examples/cleandir/cleandirs.lpi svneol=native#text/plain +examples/cleandir/cleandirs.lpr svneol=native#text/plain +examples/cleandir/confcleandirs.lpi svneol=native#text/plain +examples/cleandir/confcleandirs.lpr svneol=native#text/plain +examples/cleandir/dircleaner.pp svneol=native#text/plain +examples/cleandir/frmlog.lfm svneol=native#text/plain +examples/cleandir/frmlog.lrs svneol=native#text/plain +examples/cleandir/frmlog.pp svneol=native#text/plain +examples/cleandir/frmmain.lfm svneol=native#text/plain +examples/cleandir/frmmain.lrs svneol=native#text/plain +examples/cleandir/frmmain.pp svneol=native#text/plain +examples/cleandir/svccleandirs.lfm svneol=native#text/plain +examples/cleandir/svccleandirs.lrs svneol=native#text/plain +examples/cleandir/svccleandirs.pp svneol=native#text/plain +examples/cleandir/svcmap.lfm svneol=native#text/plain +examples/cleandir/svcmap.lrs svneol=native#text/plain +examples/cleandir/svcmap.pp svneol=native#text/plain examples/codepageconverter/codepages.ini svneol=native#text/plain examples/codepageconverter/filefind/filefind.lrs svneol=native#text/pascal examples/codepageconverter/filefind/filefind.pas svneol=native#text/pascal diff --git a/examples/cleandir/README.TXT b/examples/cleandir/README.TXT new file mode 100644 index 0000000000..cf2a534d9d --- /dev/null +++ b/examples/cleandir/README.TXT @@ -0,0 +1,107 @@ +This is the cleandirs demonstration program for Lazarus. + +It demonstrates 3 things: + +1. How to use services and the TEventLog component (cleandirs) +2. How to use RTTI controls (confcleandirs) +3. How to write a TCustomApplication descendent (cleandir) + +These are actually 3 programs: + +cleandir: +========= + +A command-line tool. It will clean all directories according to +the configuration file given. If no configuration file is specified, +it will look for one in the standard user-specific and global locations. + +cleandirs: +========== +a service application (daemon) that can be installed and run as a service. +It performs the same action as the cleandir program, at a given time of +the day. It cleans only standard directories specified in the configuration +file. + +confcleandirs: +============== + +A GUI program that can be created to create a configuration file +for the cleandirs and cleandir program. it can be used to (test) +run the algorithm as well, and shows the log in a window. + +The configuration works as follows: + +Directories: +------------ + Directories that should be cleaned. + Each directory can be enabled or disabled. + If the recurse flag is set, subdirectories will be checked as well. + +Locations: +---------- + Locations where files should be moved to. + The tool can create subdirectories of the given location, using + file extension, year, month, day, date, hour min and time: + for instance extension, year, month will create a subdirectory + doc/2007/10 + if a file with extension .doc is moved to this location in october of 2007. + +Actions: +-------- + A set of actions to be performed on the files: + +Location: + File will be copied to the location. + This is the name of one of the locations defined above. +Extensions: + A space separated list of extensions to apply the action on. + The extensions should not have the initial dot character. + e.g.: + zip gz z bz2 rar + will match all archives +Casesensitive: + Are extensions case-sensitive ? +Delete: + File will be deleted after it was succesfully copied. +Compress: + File will be compressed (like gzip). +MincompressSize: + File will only be compressed if it's size is larger than the value indicated here. + +Global options: +--------------- +LogOnly: + Only log the actions, do not actually execute them. + (this can only be set in code, it is set automatically when testing) + +Log All Files: + Check if you want the tool to show all files it encounters while + checking the directories + +All Actions: + By default, only the first matching action is executed. If this + option is set, then all actions that match the file are executed. + + If one of the actions has the "Delete" flag set, the file will be + deleted only after all actions were tried. + +Stop On Error: + No further files will be treated. + Default is to continue with the next file in case of error. + +The service can be installed on windows with +cleandirs --install --config=c:\path\to\config\file.cfg +it can then be controlled from the service manager. + +Running on linux happens wih +cleandirs -r -c path/to/config/file.cfg + +If no config file is specified, a file named CleanDirs.cfg (case sensitive) +is searched +- in /etc or in ~/.config/ for unix +- in c:\documents and settings\username\local settings\ + or next to the application binary in Windows. + +Enjoy ! + +Michael. diff --git a/examples/cleandir/cleandir.lpi b/examples/cleandir/cleandir.lpi new file mode 100644 index 0000000000..a95679ff1b --- /dev/null +++ b/examples/cleandir/cleandir.lpi @@ -0,0 +1,49 @@ + + + + + + + + + + + + </General> + <VersionInfo> + <ProjectVersion Value=""/> + </VersionInfo> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + </local> + </RunParams> + <Units Count="2"> + <Unit0> + <Filename Value="cleandir.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="cleandir"/> + </Unit0> + <Unit1> + <Filename Value="dircleaner.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="dircleaner"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="5"/> + <CodeGeneration> + <Generate Value="Faster"/> + </CodeGeneration> + <Other> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> +</CONFIG> diff --git a/examples/cleandir/cleandir.lpr b/examples/cleandir/cleandir.lpr new file mode 100644 index 0000000000..25a56da78e --- /dev/null +++ b/examples/cleandir/cleandir.lpr @@ -0,0 +1,200 @@ +{ Directory cleaner - command-line interface + + Copyright (C) 2007 Michael Van Canneyt michael@freepascal.org + + This source is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This code is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + A copy of the GNU General Public License is available on the World Wide Web + at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing + to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. +} +program cleandir; + +{$mode objfpc}{$H+} + +uses + Classes, + SysUtils, + CustApp, + dircleaner; + +ResourceString + SErrNoConfig = 'No configuration file found.'; + SErrInvalidConfig = 'Configuration file "%s" does not exist.'; + SErrNoDirectories = 'No directories to clean'; + SUsage0 = 'Usage: %s [options] directory1 ... directoryN'; + SUsage1 = 'Where options is one or more of:'; + SUsageh = '-h --help This help message'; + SUsagec = '-c --config=file Filename for configuration data'; + SUsagev = '-v --verbose Log more messages'; + SUsagel = '-l --logonly Only log actions, do not execute commands'; + SUsageq = '-q --quiet Do not log actions (disables -l)'; + SUsages = '-s --stoponerror Stop at the first error.'; + SUsager = '-r --recurse Recurse directories specified on command-line'; + SUsaged = '-d --standarddirs Clean standard dirs from configuration file'; + + + + +Type + + { TCleanDirs } + TRunMode = (rmHelp,rmExecute); + + TCleanDir = Class (TCustomApplication) + private + FCleaner: TCleanDirs; + Function ProcessCommandLine : TRunMode; + Public + Constructor Create(AOwner : TComponent); override; + Procedure DoRun; override; + Procedure Usage; + Procedure OnLog(Msg : String); + Property Cleaner : TCleanDirs Read FCleaner; + end; + +{ TCleanDir } + +Var + Application : TCleanDir; + +function TCleanDir.ProcessCommandLine: TRunMode; + +Const + OptCount = 8; + Opts : Array[1..OptCount] of string = + ('help','config','verbose','logonly','quiet', + 'stoponerror','recurse','standarddirs'); + OptChars = 'hcvlqsrd'; + +Var + FN : String; + OptL,Dirs : TStrings; + I : integer; + +begin + Result:=rmHelp; + If HasOption('h','help') then + Exit; + Dirs:=TStringList.Create; + try + OptL:=TStringList.Create; + try + For I:=1 to OptCount do + OptL.Add(Opts[i]); + FN:=CheckOptions(OptChars,OptL,Nil,Dirs); + finally + OptL.Free; + end; + If (FN<>'') then + begin + Writeln(StdErr,FN); + Exit; + end; + FN:=''; + If HasOption('c','config') then + begin + FN:=Self.GetOptionValue('c','config'); + If Not FileExists(FN) then + begin + Writeln(StdErr,format(SErrInvalidConfig,[FN])); + Exit; + end; + end + else + begin + FN:=GetAppConfigFile(false,false); + If Not FileExists(FN) then + begin + FN:=GetAppConfigFile(True,false); + If Not FileExists(FN) then + FN:=''; + end; + If (FN='') then + begin + Writeln(StdErr,SErrNoConfig); + Exit; + end; + end; + FCleaner.LoadFromFile(FN); + If Not HasOption('q','quiet') then + begin + FCleaner.OnLog:=@Self.OnLog; + FCleaner.LogAllFiles:=HasOption('v','verbose'); + FCleaner.LogOnly:=HasOption('l','logonly'); + end; + If Hasoption('s','stoponerror') then + FCleaner.StopOnError:=True; + if Not HasOption('d','standarddirs') then + FCleaner.Directories.Clear; + If (Dirs.Count>0) then + begin + For I:=0 to Dirs.Count-1 do + With FCleaner.Directories.AddDirectory do + begin + Path:=Dirs[i]; + Enabled:=True; + Recurse:=HasOption('r','recurse'); + end; + end; + If (FCleaner.Directories.Count=0) then + Writeln(StdErr,SErrNoDirectories) + else + Result:=rmExecute; + Finally + Dirs.Free; + end; +end; + +constructor TCleanDir.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FCleaner:=TCleanDirs.Create(Self); + StopOnException:=True; +end; + +procedure TCleanDir.DoRun; +begin + Case ProcessCommandLine of + rmHelp : Usage; + rmExecute : FCleaner.Execute; + end; + Terminate; +end; + +procedure TCleanDir.Usage; +begin + Writeln(Format(SUsage0,[ExtractFileName(paramstr(0))])); + Writeln(SUsage1); + Writeln(SUsagec); + Writeln(SUsaged); + Writeln(SUsageh); + Writeln(SUsagel); + Writeln(SUsageq); + Writeln(SUsager); + Writeln(SUsages); + Writeln(SUsagev); +end; + +procedure TCleanDir.OnLog(Msg: String); +begin + Writeln(Msg); +end; + +begin + OnGetApplicationName:=@CleanDirApp; + Application:=TCleandir.Create(nil); + Application.Title:='cleandisk'; + Application.Run; + Application.Free; +end. + diff --git a/examples/cleandir/cleandirs.lpi b/examples/cleandir/cleandirs.lpi new file mode 100644 index 0000000000..a22559c2b3 --- /dev/null +++ b/examples/cleandir/cleandirs.lpi @@ -0,0 +1,79 @@ +<?xml version="1.0"?> +<CONFIG> + <ProjectOptions> + <PathDelim Value="/"/> + <Version Value="5"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <AutoCreateForms Value="False"/> + <IconPath Value="./"/> + <TargetFileExt Value=""/> + <Title Value="Directory Cleaning service"/> + </General> + <VersionInfo> + <ProjectVersion Value=""/> + </VersionInfo> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + </local> + </RunParams> + <RequiredPackages Count="3"> + <Item1> + <PackageName Value="LCL"/> + </Item1> + <Item2> + <PackageName Value="LazDaemon"/> + </Item2> + <Item3> + <PackageName Value="FCL"/> + </Item3> + </RequiredPackages> + <Units Count="4"> + <Unit0> + <Filename Value="cleandirs.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="cleandirs"/> + </Unit0> + <Unit1> + <Filename Value="/home/michael/source/lazarus/diskclean/svcmap.pp"/> + <ComponentName Value="CleanDirServiceMapper"/> + <IsPartOfProject Value="True"/> + <ResourceFilename Value="/home/michael/source/lazarus/diskclean/svcmap.lrs"/> + <UnitName Value="svcmap"/> + </Unit1> + <Unit2> + <Filename Value="svccleandirs.pp"/> + <ComponentName Value="CleanDirsDaemon"/> + <IsPartOfProject Value="True"/> + <ResourceFilename Value="svccleandirs.lrs"/> + <UnitName Value="svccleandirs"/> + </Unit2> + <Unit3> + <Filename Value="dircleaner.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="dircleaner"/> + </Unit3> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="5"/> + <CodeGeneration> + <Generate Value="Faster"/> + </CodeGeneration> + <Other> + <CustomOptions Value="-dUseCThreads"/> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> +</CONFIG> diff --git a/examples/cleandir/cleandirs.lpr b/examples/cleandir/cleandirs.lpr new file mode 100644 index 0000000000..9518a921fe --- /dev/null +++ b/examples/cleandir/cleandirs.lpr @@ -0,0 +1,37 @@ +{ Directory cleaning service + + Copyright (C) 2007 Michael Van Canneyt michael@freepascal.org + + This source is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This code is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + A copy of the GNU General Public License is available on the World Wide Web + at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing + to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. +} + +Program cleandirs; + +Uses +{$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, +{$ENDIF}{$ENDIF} + lazdaemon, + daemonapp, + sysutils + { add your units here }, svcmap, svccleandirs, dircleaner; + +begin + OnGetApplicationName:=@CleanDirApp; + Application.Title:='Directory Cleaning service'; + Application.Initialize; + Application.Run; +end. diff --git a/examples/cleandir/confcleandirs.lpi b/examples/cleandir/confcleandirs.lpi new file mode 100644 index 0000000000..fbc884d294 --- /dev/null +++ b/examples/cleandir/confcleandirs.lpi @@ -0,0 +1,84 @@ +<?xml version="1.0"?> +<CONFIG> + <ProjectOptions> + <PathDelim Value="/"/> + <Version Value="5"/> + <General> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <AutoCreateForms Value="False"/> + <IconPath Value="./"/> + <TargetFileExt Value=""/> + <Title Value="Configure directory cleaner"/> + <UseXPManifest Value="True"/> + </General> + <VersionInfo> + <UseVersionInfo Value="True"/> + <CurrentVersionNr Value="1"/> + <ProjectVersion Value=""/> + <LegalCopyright Value="GPL"/> + </VersionInfo> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + </local> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="RunTimeTypeInfoControls"/> + <MinVersion Minor="1" Valid="True"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="4"> + <Unit0> + <Filename Value="confcleandirs.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="confcleandirs"/> + </Unit0> + <Unit1> + <Filename Value="diskclean.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="diskclean"/> + </Unit1> + <Unit2> + <Filename Value="frmmain.pp"/> + <ComponentName Value="MainForm"/> + <IsPartOfProject Value="True"/> + <ResourceFilename Value="frmmain.lrs"/> + <UnitName Value="frmmain"/> + </Unit2> + <Unit3> + <Filename Value="frmlog.pp"/> + <ComponentName Value="LogForm"/> + <IsPartOfProject Value="True"/> + <ResourceFilename Value="frmlog.lrs"/> + <UnitName Value="frmlog"/> + </Unit3> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="5"/> + <CodeGeneration> + <Generate Value="Faster"/> + </CodeGeneration> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> +</CONFIG> diff --git a/examples/cleandir/confcleandirs.lpr b/examples/cleandir/confcleandirs.lpr new file mode 100644 index 0000000000..414b4ab3b5 --- /dev/null +++ b/examples/cleandir/confcleandirs.lpr @@ -0,0 +1,24 @@ +program confcleandirs; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms + { add your units here }, + sysutils, + dircleaner, frmmain, frmlog; +{$ifdef win32} +{$R manifest.res} +{$R confcleandirs.res} +{$endif} +begin + Application.Title:='Configure directory cleaner'; + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. + diff --git a/examples/cleandir/dircleaner.pp b/examples/cleandir/dircleaner.pp new file mode 100644 index 0000000000..1669202cd2 --- /dev/null +++ b/examples/cleandir/dircleaner.pp @@ -0,0 +1,1077 @@ +{ Directory cleaning component + + Copyright (C) 2007 Michael Van Canneyt + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit dircleaner; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, inicol, inifiles; + +Type + TSubDir = (sdExtension,sdYear,sdMonth,sdDay,sdDate,sdHour,sdMin,sdTime); + TSubDirs = Set of TSubDir; + + { TLocation } + + TLocation = Class(TNamedIniCollectionItem) + private + FBasePath: String; + FSubDirs: TSubDirs; + procedure SetSubDirs(const AValue: TSubDirs); + Public + Function GetLocation(AExtension : String;ATime : TDateTime) : String; + Procedure Assign(Source : TPersistent); override; + Procedure SaveToIni(Ini: TCustomInifile; Section : String); override; + Procedure LoadFromIni(Ini: TCustomInifile; Section : String); override; + Published + Property BasePath : String Read FBasePath Write FBasePath; + Property SubDirs : TSubDirs Read FSubDirs Write SetSubDirs; + end; + + { TLocations } + + TLocations = Class(TNamedIniCollection) + private + function GetLocation(Index : Integer): TLocation; + procedure SetLocation(Index : Integer; const AValue: TLocation); + Public + Constructor Create; + Function AddLocation : TLocation; + Function LocationByName(AName : String) : TLocation; + Property Locations [Index : Integer] : TLocation Read GetLocation Write SetLocation; Default; + end; + + { TFileAction } + + TFileAction = Class(TNamedIniCollectionItem) + private + FCaseSensitive: Boolean; + FCompress: Boolean; + FDelete: Boolean; + FExtensions: String; + FLocation: TLocation; + FLocationName: String; + FMinCompressSize: Integer; + FWorkExt : String; + Public + Procedure Prepare; + Function FileNameFits(AFileName : String) : Boolean; + Property Location : TLocation Read FLocation Write FLocation; + Procedure SaveToIni(Ini: TCustomInifile; Section : String); override; + Procedure LoadFromIni(Ini: TCustomInifile; Section : String); override; + Procedure Assign(Source : TPersistent); override; + Published + Property LocationName : String Read FLocationName Write FLocationName; + Property Extensions : String Read FExtensions Write FExtensions; + Property Delete : Boolean Read FDelete Write FDelete; + Property Compress : Boolean Read FCompress write FCompress; + Property CaseSensitive : Boolean Read FCaseSensitive Write FCaseSensitive; + Property MinCompressSize : Integer Read FMinCompressSize Write FMinCompressSize; // In Kb. + end; + + { TFileActions } + + TFileActions = Class(TNamedIniCollection) + private + function GetAction(Index : Integer): TFileAction; + procedure SetAction(Index : Integer; const AValue: TFileAction); + Public + Constructor Create; + Procedure Prepare; + Function AddFileAction : TFileAction; + Procedure BindLocations(Locations : TLocations); + Property FileActions [Index : Integer] : TFileAction Read GetAction Write SetAction; Default; + end; + + { TDirectory } + + TDirectory = Class(TNamedIniCollectionItem) + private + FEnabled: Boolean; + FPath: String; + FRecurse: Boolean; + Public + Procedure Assign(Source : TPersistent); override; + Procedure SaveToIni(Ini: TCustomInifile; Section : String); override; + Procedure LoadFromIni(Ini: TCustomInifile; Section : String); override; + Published + Property Path : String Read FPath Write FPath; + Property Enabled : Boolean Read FEnabled Write FEnabled; + Property Recurse : Boolean Read FRecurse Write FRecurse; + end; + + + { TDirectories } + + TDirectories = Class(TNamedIniCollection) + private + function GetDir(Index : Integer): TDirectory; + procedure SetDir(Index : Integer; const AValue: TDirectory); + Public + Constructor Create; + Function AddDirectory : TDirectory; + Property Directories [Index : Integer] : TDirectory Read GetDir Write SetDir; Default; + end; + + { TCleanDirs } + TLogEvent = Procedure(Msg : String) of Object; + + TScheduleMode = (smDaily,smHourly); + + TScheduleDay = (sdMonday,sdTuesDay,sdWednesday,sdThursDay,sdFriday,sdSaturday,sdSunday); + TScheduleDays = set of TScheduleDay; + + TCleanDirs = Class(TComponent) + private + FAllFileActions: Boolean; + FCancelled: Boolean; + FConfigFile: String; + FDailyAt: TDateTime; + FDirectories: TDirectories; + FEndTime: TDateTime; + FFileActions: TFileActions; + FHourlyAt: Integer; + FLocations: TLocations; + FLogAllFiles: Boolean; + FlogEvent: TLogEvent; + FLogOnly: Boolean; + FScheduleDays: TScheduleDays; + FScheduleMode: TScheduleMode; + FStopOnError: Boolean; + FCreatedDirs : TStrings; + FStartTime : TDateTime; + function NeedDirectory(D: String): Boolean; + procedure SetDirectories(const AValue: TDirectories); + procedure SetFileActions(const AValue: TFileActions); + procedure SetLocations(const AValue: TLocations); + Protected + Procedure LogAction(Const Msg : String); + Procedure LogAction(Const Fmt: String; Args : Array of const); + Function CreateLocation(L : TLocation; AExtension : String) : boolean; virtual; + Procedure DoCleanDir(Dir : String; Recurse : Boolean); virtual; + function DoCompressFile(const AFileName, ADestDir: String): Boolean; + function DoCopyFile(const AFileName, ADestDir: String): Boolean; + function DoDeleteFile(const AFileName: String): Boolean; virtual; // Returns true + function DoFileAction(F: TFileAction; const AFileName: String): Boolean; virtual; + Property CreatedDirs : TStrings Read FCreatedDirs; + Public + Constructor Create(AOwner : TComponent); override; + Destructor Destroy; override; + Function CleanFile(const AFileName: String): Boolean; + procedure CleanDirectory(D: TDirectory); + Procedure Execute; + Procedure Cancel; + Procedure LoadFromIni(Ini : TCustomInifile); virtual; + Procedure SaveToIni(Ini : TCustomInifile); virtual; + Procedure LoadFromFile(AFileName : String); + Procedure SaveToFile(AFileName : String); + Property StartTime : TDateTime Read FStartTime; + Property EndTime : TDateTime Read FEndTime; + Property ConfigFile : String Read FConfigFile; + Property Cancelled : Boolean Read FCancelled; + Published + Property Directories : TDirectories Read FDirectories Write SetDirectories; + Property FileActions : TFileActions Read FFileActions Write SetFileActions; + Property Locations : TLocations Read FLocations Write SetLocations; + Property LogOnly : Boolean Read FLogOnly Write FLogOnly; + Property OnLog : TLogEvent Read FlogEvent Write FLogEvent; + Property StopOnError : Boolean Read FStopOnError Write FStopOnError; + Property AllFileActions : Boolean Read FAllFileActions Write FAllFileActions; + Property LogAllFiles : Boolean Read FLogAllFiles Write FLogAllFiles; + // Scheduling + Property ScheduleMode : TScheduleMode Read FScheduleMode Write FScheduleMode; + Property ScheduleDays : TScheduleDays Read FScheduleDays Write FScheduleDays; + Property DailyAt : TDateTime Read FDailyAt Write FDailyAt; + Property HourlyAt : Integer Read FHourlyAt Write FHourlyAt; + end; + + EDiskClean = Class(Exception); + +// Auxiliary functions +Function UserDir : String; +Function CleanDirApp : String; // Can be used to force single app name + +Var + LogOnly : Boolean; + LogEvent : TLogEvent; + +implementation + +uses +{$ifdef mswindows} + shfolder, +{$endif} + zstream, + typinfo; + +ResourceString + SCleanDirApp = 'CleanDirs'; + SNewDirectory = 'New directory'; + SNewLocation = 'New Location'; + SNewFileAction = 'New Action'; + SCreatingDir = 'Creating directory "%s".'; + SErrCreateDir = 'Could not create directory "%s".'; + SErrUnknownLocation = 'Unknown location : "%s"'; + SSkippingDir = 'Skipping disabled directory "%s": %s'; + SNoSuchDir = 'Directory does not exist: %s'; + SCleaningDir = 'Cleaning directory: %s'; + SDeleteFailed = 'Failed to delete file: %s'; + SDeletingFile = 'Deleting file: %s'; + SCopyFailed = 'Failed to copy file "%s" to "%s": %s'; + SCopyingFile = 'Copying file "%s" to directory: %s'; + SCompressingFile = 'Compressing file %s to directory: %s'; + SCompressFailed = 'Failed to compress file "%s" to "%s": %s'; + SUsercancelled = 'User cancelled'; + SConsideringFile = 'Considering file: %s'; + SFileFitsAction = 'File %s fits action %s'; + +{ --------------------------------------------------------------------- + Auxiliary functions + ---------------------------------------------------------------------} + +Function UserDir : String; + +{$ifdef mswindows} +Var + PATH : Array[0..MAX_PATH] of char; +{$endif} + +begin +{$ifdef mswindows} + Path[0]:=#0; + SHGetFolderPath(0,CSIDL_PERSONAL,0,@PATH); + Result:=StrPas(Path); +{$else} + Result:=GetEnvironmentVariable('HOME'); +{$endif} +end; + +{ TLocation } + + +procedure TLocation.SetSubDirs(const AValue: TSubDirs); + +Var + V : TSubDirs; + +begin + V:=AValue; + If (sdDate in V) then + V:=V-[sdYear,sdMonth,sdDay]; + If (sdTime in AValue) then + V:=V-[sdHour,sdMin]; + FSubDirs:=V; +end; + + +function TLocation.GetLocation(AExtension: String;ATime : TDateTime): String; + +begin + Result:=IncludeTrailingPathDelimiter(BasePath); + If (sdExtension in SubDirs) then + begin + If (Length(AExtension)>0) then + If AExtension[1]='.' then + Delete(AExtension,1,1); + Result:=Result+AExtension+PathDelim; + end; + if (sdDate in SubDirs) then + Result:=Result+FormatDateTime('yyyy-mm-dd',ATime)+PathDelim + else + begin + if (sdYear in SubDirs) then + Result:=Result+FormatDateTime('yyyy',ATime)+PathDelim; + if (sdMonth in SubDirs) then + Result:=Result+FormatDateTime('mm',ATime)+PathDelim; + if (sdDay in SubDirs) then + Result:=Result+FormatDateTime('dd',ATime)+PathDelim; + end; + if (sdTime in SubDirs) then + Result:=Result+FormatDateTime('hh-nn',ATime)+PathDelim + else + begin + if (sdHour in SubDirs) then + Result:=Result+FormatDateTime('hh',ATime)+PathDelim; + if (sdMin in SubDirs) then + Result:=Result+FormatDateTime('nn',ATime)+PathDelim; + end; +end; + +procedure TLocation.Assign(Source: TPersistent); + +Var + L : TLocation; + +begin + if (Source is TLocation) then + begin + L:=TLocation(Source); + Name:=L.Name; + BasePath:=L.BasePath; + SubDirs:=L.SubDirs; + end + else + inherited Assign(Source); +end; + +procedure TLocation.SaveToIni(Ini: TCustomInifile; Section: String); + +Var + S : String; + +begin + With Ini do + begin + WriteString(Section,'BasePath',BasePath); + S:=SetToString(FindPropInfo(Self,'Subdirs'),Integer(SubDirs)); + WriteString(Section,'Subdirs',S); + end; +end; + +procedure TLocation.LoadFromIni(Ini: TCustomInifile; Section: String); + +Var + S : String; + P : PPropInfo; + +begin + With Ini do + begin + BasePath:=ReadString(Section,'BasePath',BasePath); + P:=FindPropInfo(Self,'Subdirs'); + S:=SetToString(P,Integer(SubDirs)); + S:=ReadString(Section,'Subdirs',S); + SubDirs:=TSubDirs(StringToSet(P,S)); + end; +end; + +{ TLocations } + +function TLocations.GetLocation(Index : Integer): TLocation; +begin + Result:=TLocation(Items[Index]); +end; + +procedure TLocations.SetLocation(Index : Integer; const AValue: TLocation); +begin + Items[Index]:=AValue; +end; + +constructor TLocations.Create; +begin + Inherited Create(TLocation); + FPrefix:='Location'; + FSectionPrefix:='Location'; +end; + +function TLocations.AddLocation: TLocation; + +Var + I : Integer; + N : String; + +begin + Result:=Add as TLocation; + I:=1; + N:=SNewLocation; + While Self.IndexOfName(N)<>-1 do + begin + Inc(I); + N:=SNewLocation+IntToStr(I); + end; + Result.Name:=N; +end; + +function TLocations.LocationByName(AName: String): TLocation; +begin + Result:=TLocation(FindByName(AName)); + If (Result=Nil) then + Raise EDiskClean.CreateFmt(SErrUnknownLocation,[AName]); +end; + +{ TFileAction } + + +procedure TFileAction.Prepare; +begin + FWorkExt:=' '+FExtensions+' '; + If Not CaseSensitive then + FWorkExt:=UpperCase(FWorkExt); +end; + +function TFileAction.FileNameFits(AFileName: String): Boolean; + +Var + Ext : String; + +begin + Ext:=ExtractFileExt(AFileName); + system.Delete(Ext,1,1); + if Not CaseSensitive then + Ext:=UpperCase(Ext); + FileNameFits:=Pos(Ext,FWorkExt)<>0; +end; + +procedure TFileAction.SaveToIni(Ini: TCustomInifile; Section: String); +begin + With Ini do + begin + WriteString(Section,'Location',LocationName); + WriteString(Section,'Extensions',Extensions); + WriteBool(Section,'Delete',Delete); + WriteBool(Section,'Compress',Compress); + WriteBool(Section,'CaseSensitive',CaseSensitive); + WriteInteger(Section,'MinCompressSize',MinCompressSize); + end; +end; + +procedure TFileAction.LoadFromIni(Ini: TCustomInifile; Section: String); +begin + With Ini do + begin + LocationName:=ReadString(Section,'Location',LocationName); + Extensions:=ReadString(Section,'Extensions',Extensions); + Delete:=ReadBool(Section,'Delete',Delete); + Compress:=ReadBool(Section,'Compress',Compress); + CaseSensitive:=ReadBool(Section,'CaseSensitive',CaseSensitive); + MinCompressSize:=ReadInteger(Section,'MinCompressSize',MinCompressSize); + end; +end; + +procedure TFileAction.Assign(Source: TPersistent); + +Var + A : TFileAction; + +begin + if (Source is TFileAction) then + begin + A:=TFileAction(Source); + LocationName:=A.LocationName; + Location:=A.Location; + Extensions:=A.Extensions; + Delete:=A.Delete; + Compress:=A.Compress; + CaseSensitive:=A.CaseSensitive; + MinCompressSize:=A.MinCompressSize; + end + else + inherited Assign(Source); +end; + +{ TFileActions } + +function TFileActions.GetAction(Index : Integer): TFileAction; +begin + Result:=TFileAction(Items[Index]); +end; + +procedure TFileActions.SetAction(Index : Integer; const AValue: TFileAction); +begin + Items[Index]:=AValue; +end; + +constructor TFileActions.Create; +begin + Inherited Create(TFileAction); + FPrefix:='Action'; + FSectionPrefix:='Action'; +end; + +procedure TFileActions.Prepare; + +Var + I : Integer; + +begin + For I:=0 to Count-1 do + GetAction(I).Prepare; +end; + +function TFileActions.AddFileAction: TFileAction; + +Var + I : Integer; + N : String; + +begin + Result:=Add as TFileAction; + I:=1; + N:=SNewFileAction; + While Self.IndexOfName(N)<>-1 do + begin + Inc(I); + N:=SNewFileAction+IntToStr(I); + end; + Result.Name:=N; +end; + +procedure TFileActions.BindLocations(Locations: TLocations); + +Var + I : Integer; + A : TFileAction; + +begin + For I:=0 to Count-1 do + begin + A:=GetAction(I); + If (A.LocationName<>'') then + A.Location:=Locations.LocationByName(A.LocationName); + end; +end; + +{ TDirectory } + +procedure TDirectory.Assign(Source: TPersistent); + +Var + D : TDirectory; + +begin + If (Source is TDirectory) then + begin + D:=TDirectory(Source); + Path:=D.Path; + Enabled:=D.Enabled; + Recurse:=D.Recurse; + end + else + inherited Assign(Source); +end; + +procedure TDirectory.SaveToIni(Ini: TCustomInifile; Section: String); +begin + With Ini do + begin + WriteString(Section,'Path',Path); + WriteBool(Section,'Enabled',Enabled); + WriteBool(Section,'Recurse',Recurse); + end; +end; + +procedure TDirectory.LoadFromIni(Ini: TCustomInifile; Section: String); +begin + With Ini do + begin + Path:=ReadString(Section,'Path',Path); + Enabled:=ReadBool(Section,'Enabled',Enabled); + recurse:=ReadBool(Section,'Recurse',Recurse); + end; +end; + +{ TDirectories } + +function TDirectories.GetDir(Index : Integer): TDirectory; +begin + Result:=TDirectory(Items[Index]) +end; + +procedure TDirectories.SetDir(Index : Integer; const AValue: TDirectory); +begin + Items[Index]:=AVAlue; +end; + +constructor TDirectories.Create; +begin + FPrefix:='Directory'; + FSectionPrefix:='Directory'; + Inherited Create(TDirectory); +end; + +function TDirectories.AddDirectory: TDirectory; + +Var + I : Integer; + N : String; + +begin + Result:=Add as TDirectory; + I:=1; + N:=SNewDirectory; + While Self.IndexOfName(N)<>-1 do + begin + Inc(I); + N:=SNewDirectory+IntToStr(I); + end; + Result.Name:=N; +end; + +{ TCleanDirs } + +procedure TCleanDirs.SetDirectories(const AValue: TDirectories); +begin + if FDirectories=AValue then + exit; + If AValue=Nil then + FDirectories.Clear + else + FDirectories.Assign(AValue); +end; + +procedure TCleanDirs.SetFileActions(const AValue: TFileActions); +begin + if FFileActions=AValue then + exit; + if (AValue=Nil) then + FFileActions.Clear + else + FFileActions.Assign(AValue); +end; + +procedure TCleanDirs.SetLocations(const AValue: TLocations); +begin + if FLocations=AValue then exit; + If (AValue=Nil) then + FLocations.Clear + else + FLocations.Assign(AValue); +end; + +Function TCleanDirs.NeedDirectory(D : String) : Boolean; + +Var + L : TStringList; + +begin + Result:=Not DirectoryExists(D); + If Result and LogOnly then + begin + If (FCreatedDirs=Nil) then + begin + L:=TStringList.Create; + L.Sorted:=True; + FCreatedDirs:=L; + end; + Result:=FCreatedDirs.IndexOf(D)=-1; + end; +end; + +Function TCleanDirs.CreateLocation(L: TLocation; AExtension: String) : Boolean; + +Var + D,Msg : String; + +begin + if Cancelled then + Exit; + Result:=True; + D:=L.GetLocation(AExtension,FStartTime); + If NeedDirectory(D) then + begin + LogAction(SCreatingDir,[D]); + If LogOnly then + FCreatedDirs.Add(D) + else + begin + Result:=ForceDirectories(D); + If Not Result then + begin + Msg:=Format(SErrCreateDir,[D]); + LogAction(Msg); + if StopOnError then + Raise EDiskClean.Create(Msg) + end; + end; + end; +end; + +Function TCleanDirs.DoDeleteFile(Const AFileName : String) : Boolean; + +Var + Msg : String; + +begin + LogAction(SDeletingFile,[AFileName]); + if Cancelled then + Exit; + Result:=LogOnly; + If Result then + Exit; + Result:=DeleteFile(AFileName); + If Not Result then + begin + Msg:=Format(SDeleteFailed,[AFileName]); + LogAction(Msg); + If StopOnError then + Raise EDiskClean.Create(Msg); + end; +end; + +Function TCleanDirs.DoCompressFile(Const AFileName,ADestDir : String) : Boolean; + +Var + DestFile : String; + F1 : TFileStream; + F2 : TGZFileStream; + +begin + LogAction(SCompressingFile,[AFileName,ADestDir]); + if Cancelled then + Exit; + Result:=LogOnly; + If Result then + Exit; + DestFile:=IncludeTrailingPathDelimiter(ADestDir)+ExtractFileName(AFileName)+'.gz'; + Try + F1:=TFileStream.Create(AFileName,fmOpenRead); + Try + F2:=TGZFileStream.Create(DestFile,gzOpenWrite); + Try + F2.CopyFrom(F1,0); + Finally + F2.Free; + end; + finally + F1.Free; + end; + Result:=True; + except + On E : Exception do + begin + If StopOnError then + Raise + Else + LogAction(SCompressFailed,[AFileName,ADestDir,E.Message]); + end; + end; +end; + +Function TCleanDirs.DoCopyFile(Const AFileName,ADestDir : String) : Boolean; + +Var + DestFile : String; + F1,F2 : TFileStream; + +begin + LogAction(SCopyingFile,[AFileName,ADestDir]); + if Cancelled then + Exit; + Result:=LogOnly; + If Result then + Exit; + DestFile:=IncludeTrailingPathDelimiter(ADestDir)+ExtractFileName(AFileName); + Try + F1:=TFileStream.Create(AFileName,fmOpenRead); + Try + F2:=TFileStream.Create(DestFile,fmCreate); + Try + F2.CopyFrom(F1,0); + Finally + F2.Free; + end; + finally + F1.Free; + end; + Result:=True; + except + On E : Exception do + begin + If StopOnError then + Raise + Else + LogAction(SCopyFailed,[AFileName,ADestDir,E.Message]); + end; + end; +end; + + +Function TCleanDirs.DoFileAction(F: TFileAction; Const AFileName : String) : Boolean; + + Function NeedCompress : boolean; + + Var + Info : TSearchRec; + + begin + Result:=F.Compress; + If Result and (F.MinCompressSize>0) then + begin + Result:=FindFirst(AFileName,faAnyFile,Info)=0; + If Result then + Result:=Info.Size>(F.MinCompressSize*1024); + end; + end; + +Var + Ext : String; + Dir : String; + +begin + if Cancelled then + Exit; + Ext:=ExtractFileExt(AFileName); + If (F.Location<>Nil) and CreateLocation(F.Location,Ext) then + begin + Dir:=F.Location.GetLocation(Ext,FStartTime); + If NeedCompress then + Result:=DoCompressFile(AFileName,Dir) + else + Result:=DoCopyFile(AfileName,Dir); + end; +end; + +Function TCleanDirs.CleanFile(Const AFileName : String) : Boolean; + +Var + I : Integer; + F : TFileAction; + D : Boolean; + +begin + if Cancelled then + Exit; + if LogAllFiles then + LogAction(SConsideringFile,[AFileName]); + I:=0; + D:=False; + While (I<FileActions.Count) do + begin + F:=FileActions[i]; + if F.FileNameFits(AFileName) then + begin + if LogAllFiles then + LogAction(SFileFitsAction,[AFileName,F.Name]); + Result:=True; + if (F.Location=Nil) or DoFileAction(F,AFileName) then + D:=D or F.Delete; // Do not delete yet. Allow all actions to be done. + If Not FAllFileActions then + I:=FFileActions.Count; + end; + Inc(I); + end; + // After all actions are done, delete file if this was specified. + If D then + DoDeleteFile(AFileName); +end; + +procedure TCleanDirs.DoCleanDir(Dir: String; Recurse: Boolean); + +Var + Info : TSearchRec; + +begin + if Cancelled then + Exit; + LogAction(SCleaningDir,[Dir]); + Dir:=IncludeTrailingPathDelimiter(Dir); + If FindFirst(Dir+'*',faAnyFile and not faDirectory,Info)=0 then + try + repeat + CleanFile(Dir+Info.Name); + until (FindNext(Info)<>0); + finally + FindClose(Info); + end; + If Recurse then + If FindFirst(Dir+'*',faDirectory,Info)=0 then + try + repeat + If (Info.Attr=faDirectory) and + Not ((info.Name='.') or (Info.Name='..')) then + DoCleanDir(Dir+Info.Name,Recurse); + until (FindNext(Info)<>0); + finally + FindClose(Info); + end; +end; + +constructor TCleanDirs.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FLocations:=TLocations.Create; + FDirectories:=TDirectories.Create; + FFileActions:=TFileActions.Create; +end; + +destructor TCleanDirs.Destroy; +begin + FreeAndNil(FLocations); + FreeAndNil(FDirectories); + FreeAndNIl(FFileActions); + inherited Destroy; +end; + +procedure TCleanDirs.CleanDirectory(D : TDirectory); + +Var + Dir : String; + Msg : String; + +begin + Dir:=D.Path; + If Not DirectoryExists(Dir) then + begin + Msg:=format(SNoSuchDir,[Dir]); + LogAction(Msg); + If StopOnError then + Raise EDiskClean.Create(Msg); + end + else + DoCleanDir(Dir,D.Recurse); +end; + +procedure TCleanDirs.Execute; + +Var + I : Integer; + D : TDirectory; + +begin + FStartTime:=Now; + Try + FileActions.Prepare; + FileActions.BindLocations(FLocations); + I:=0; + While (I<Directories.Count) and Not Cancelled do + begin + D:=Directories[i]; + If D.Enabled then + CleanDirectory(D) + else + LogAction(SSkippingDir,[D.Name,D.Path]); + Inc(I); + end; + If Cancelled then + LogAction(SUsercancelled); + Finally + FEndTime:=Now; + end; +end; + +procedure TCleanDirs.Cancel; +begin + FCancelled:=True; +end; + +procedure TCleanDirs.LoadFromIni(Ini: TCustomInifile); +Var + SD : TScheduleDay; + O : Integer; +begin + FLocations.LoadFromIni(Ini,'Locations'); + FDirectories.LoadFromIni(Ini,'Directories'); + FFileActions.LoadFromIni(Ini,'FileActions'); + With Ini do + begin + LogAllFiles:=ReadBool('Global','LogAllFiles',LogAllFiles); + StopOnError:=ReadBool('Global','StopOnError',StopOnError); + LogOnly:=ReadBool('Global','LogOnly',LogOnly); + ScheduleMode:=TScheduleMode(ReadInteger('Schedule','Mode',Ord(ScheduleMode))); + O:=ReadInteger('Schedule','Days',0); + For sd:=Low(TScheduleDay) to High(TScheduleDay) do + if ((O and (1 shl Ord(sd)))<>0) then + ScheduleDays:=ScheduleDays + [Sd]; + DailyAt:=ReadTime('Schedule','DailyAt',DailyAt); + HourlyAt:=ReadInteger('Schedule','HourlyAt',HourlyAt); + end; +end; + +procedure TCleanDirs.SaveToIni(Ini: TCustomInifile); + +Var + SD : TScheduleDay; + O : Integer; + +begin + FLocations.SaveToIni(Ini,'Locations'); + FDirectories.SaveToIni(Ini,'Directories'); + FFileActions.SaveToIni(Ini,'FileActions'); + With Ini do + begin + WriteBool('Global','LogAllFiles',LogAllFiles); + WriteBool('Global','StopOnError',StopOnError); + WriteBool('Global','LogOnly',LogOnly); + WriteInteger('Schedule','Mode',Ord(ScheduleMode)); + O:=0; + For sd:=Low(TScheduleDay) to High(TScheduleDay) do + if sd in ScheduleDays then + O:=O or (1 shl ord(sd)); + WriteInteger('Schedule','Days',O); + WriteTime('Schedule','DailyAt',DailyAt); + WriteInteger('Schedule','HourlyAt',HourlyAt); + end; +end; + + +procedure TCleanDirs.LoadFromFile(AFileName: String); + +Var + Ini : TMemIniFile; + +begin + Ini:=TMemInifile.Create(AFileName); + try + LoadFromIni(Ini); + FConfigFile:=AFileName; + finally + Ini.Free; + end; +end; + +procedure TCleanDirs.SaveToFile(AFileName: String); +Var + Ini : TMemIniFile; + +begin + Ini:=TMemInifile.Create(AFileName); + try + Ini.CacheUpdates:=True; + SaveToIni(Ini); + Ini.UpdateFile; + FConfigFile:=AFileName; + finally + Ini.Free; + end; +end; + +Procedure TCleanDirs.LogAction(Const Msg: String); +begin + If Assigned(FLogEvent) then + FLogEvent(Msg); +end; + + +Procedure TCleanDirs.LogAction(Const Fmt: String; Args : Array of const); + +begin + LogAction(Format(Fmt,Args)); +end; + +Function CleanDirApp : String; + +begin + Result:=SCleanDirApp; +end; + +end. + diff --git a/examples/cleandir/frmlog.lfm b/examples/cleandir/frmlog.lfm new file mode 100644 index 0000000000..7465a93460 --- /dev/null +++ b/examples/cleandir/frmlog.lfm @@ -0,0 +1,61 @@ +object LogForm: TLogForm + Left = 426 + Height = 351 + Top = 183 + Width = 460 + HorzScrollBar.Page = 459 + VertScrollBar.Page = 350 + ActiveControl = BClose + Caption = 'Output of execution' + ClientHeight = 351 + ClientWidth = 460 + OnShow = FormShow + object Label1: TLabel + Left = 8 + Height = 16 + Top = 8 + Width = 312 + AutoSize = False + Caption = 'Actions:' + ParentColor = False + end + object BClose: TButton + Left = 373 + Height = 25 + Top = 318 + Width = 75 + Anchors = [akRight, akBottom] + BorderSpacing.InnerBorder = 4 + Caption = '&Cancel' + OnClick = BCloseClick + TabOrder = 0 + end + object LBLog: TListBox + Left = 8 + Height = 280 + Top = 32 + Width = 440 + Anchors = [akTop, akLeft, akRight, akBottom] + TabOrder = 1 + TopIndex = -1 + end + object BSave: TButton + Left = 8 + Height = 25 + Top = 318 + Width = 75 + Anchors = [akLeft, akBottom] + BorderSpacing.InnerBorder = 4 + Caption = '&Save' + OnClick = BSaveClick + TabOrder = 2 + end + object SDlog: TSaveDialog + Title = 'Save file as' + Filter = 'Log files|*.log|Text files|*.txt|All files|*.*' + FilterIndex = 0 + Options = [ofPathMustExist, ofEnableSizing, ofViewDetail] + left = 96 + top = 320 + end +end diff --git a/examples/cleandir/frmlog.lrs b/examples/cleandir/frmlog.lrs new file mode 100644 index 0000000000..86172d1401 --- /dev/null +++ b/examples/cleandir/frmlog.lrs @@ -0,0 +1,20 @@ +LazarusResources.Add('TLogForm','FORMDATA',[ + 'TPF0'#8'TLogForm'#7'LogForm'#4'Left'#3#170#1#6'Height'#3'_'#1#3'Top'#3#183#0 + +#5'Width'#3#204#1#18'HorzScrollBar.Page'#3#203#1#18'VertScrollBar.Page'#3'^' + +#1#13'ActiveControl'#7#6'BClose'#7'Caption'#6#19'Output of execution'#12'Cli' + +'entHeight'#3'_'#1#11'ClientWidth'#3#204#1#6'OnShow'#7#8'FormShow'#0#6'TLabe' + +'l'#6'Label1'#4'Left'#2#8#6'Height'#2#16#3'Top'#2#8#5'Width'#3'8'#1#8'AutoSi' + +'ze'#8#7'Caption'#6#8'Actions:'#11'ParentColor'#8#0#0#7'TButton'#6'BClose'#4 + +'Left'#3'u'#1#6'Height'#2#25#3'Top'#3'>'#1#5'Width'#2'K'#7'Anchors'#11#7'akR' + +'ight'#8'akBottom'#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#7'&Cance' + +'l'#7'OnClick'#7#11'BCloseClick'#8'TabOrder'#2#0#0#0#8'TListBox'#5'LBLog'#4 + +'Left'#2#8#6'Height'#3#24#1#3'Top'#2' '#5'Width'#3#184#1#7'Anchors'#11#5'akT' + +'op'#6'akLeft'#7'akRight'#8'akBottom'#0#8'TabOrder'#2#1#8'TopIndex'#2#255#0#0 + +#7'TButton'#5'BSave'#4'Left'#2#8#6'Height'#2#25#3'Top'#3'>'#1#5'Width'#2'K'#7 + +'Anchors'#11#6'akLeft'#8'akBottom'#0#25'BorderSpacing.InnerBorder'#2#4#7'Cap' + +'tion'#6#5'&Save'#7'OnClick'#7#10'BSaveClick'#8'TabOrder'#2#2#0#0#11'TSaveDi' + +'alog'#5'SDlog'#5'Title'#6#12'Save file as'#6'Filter'#6'.Log files|*.log|Tex' + +'t files|*.txt|All files|*.*'#11'FilterIndex'#2#0#7'Options'#11#15'ofPathMus' + +'tExist'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2'`'#3'top'#3'@'#1#0#0 + +#0 +]); diff --git a/examples/cleandir/frmlog.pp b/examples/cleandir/frmlog.pp new file mode 100644 index 0000000000..f381d25fe1 --- /dev/null +++ b/examples/cleandir/frmlog.pp @@ -0,0 +1,118 @@ +{ Directory cleaning component logging window + + Copyright (C) 2007 Michael Van Canneyt michael@freepascal.org + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} + +unit frmlog; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, + StdCtrls, dircleaner; + +type + + { TLogForm } + + TLogForm = class(TForm) + BClose: TButton; + BSave: TButton; + Label1: TLabel; + LBLog: TListBox; + SDlog: TSaveDialog; + procedure BCloseClick(Sender: TObject); + procedure BSaveClick(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FCleaner: TCleanDirs; + FRunning : Boolean; + procedure SetCleaner(const AValue: TCleanDirs); + { private declarations } + public + { public declarations } + Procedure OnLog(Msg : String); + Property Cleaner : TCleanDirs Read FCleaner Write SetCleaner; + end; + +var + LogForm: TLogForm; + +implementation + +resourcestring + SClose = '&Close'; + + { TLogForm } + +procedure TLogForm.BSaveClick(Sender: TObject); +begin + If SDLog.execute then + LBLog.Items.SaveToFile(SDLog.FileName); +end; + +procedure TLogForm.BCloseClick(Sender: TObject); +begin + if FRunning then + FCleaner.Cancel + else + Close; +end; + +procedure TLogForm.FormShow(Sender: TObject); +begin + FRunning:=True; + Try + FCleaner.execute; + BClose.Caption:=SClose; + Finally + FRunning:=False; + end; +end; + +procedure TLogForm.SetCleaner(const AValue: TCleanDirs); +begin + if FCleaner=AValue then exit; + FCleaner:=AValue; + If Assigned(FCleaner) then + FCleaner.OnLog:=@Self.OnLog; +end; + +procedure TLogForm.OnLog(Msg: String); +begin + LBLog.Items.Add(Msg); + Application.ProcessMessages; +end; + +initialization + {$I frmlog.lrs} + +end. + diff --git a/examples/cleandir/frmmain.lfm b/examples/cleandir/frmmain.lfm new file mode 100644 index 0000000000..ee62f85a2f --- /dev/null +++ b/examples/cleandir/frmmain.lfm @@ -0,0 +1,1966 @@ +object MainForm: TMainForm + Left = 635 + Height = 432 + Top = 338 + Width = 571 + HorzScrollBar.Page = 570 + VertScrollBar.Page = 405 + ActiveControl = EDailyAt + Caption = 'Configure Directory Cleaner' + ClientHeight = 406 + ClientWidth = 571 + Menu = MMMain + OnCloseQuery = FormCloseQuery + OnShow = FormShow + object TBMain: TToolBar + Height = 26 + Width = 571 + Caption = 'TBMain' + Images = ILMain + TabOrder = 0 + object TBQuit: TToolButton + Left = 1 + Top = 2 + Action = AQuit + end + object ToolButton2: TToolButton + Left = 24 + Top = 2 + Width = 23 + Caption = 'ToolButton2' + Style = tbsSeparator + end + object TBNew: TToolButton + Left = 47 + Top = 2 + Action = ANew + end + object TBOpen: TToolButton + Left = 70 + Top = 2 + Action = AOpen + end + object TBSave: TToolButton + Left = 93 + Top = 2 + Action = ASave + end + object ToolButton1: TToolButton + Left = 116 + Top = 2 + Width = 23 + Caption = 'ToolButton1' + Style = tbsSeparator + end + object TBNewItem: TToolButton + Left = 139 + Top = 2 + Action = ANewItem + end + object TBDeleteItem: TToolButton + Left = 162 + Top = 2 + Action = ADeleteItem + end + end + object PCConfig: TPageControl + Height = 380 + Top = 26 + Width = 571 + ActivePage = TSScheduling + Align = alClient + TabIndex = 3 + TabOrder = 1 + OnChange = PCConfigChange + OnPageChanged = PCConfigChange + object TSOptions: TTabSheet + Caption = 'Options' + ClientHeight = 380 + ClientWidth = 571 + object LVDirectories: TListView + Height = 214 + Top = 50 + Width = 571 + Align = alClient + Columns = < + item + Caption = 'Enabled' + end + item + Caption = 'Recurse' + end + item + Caption = 'Name' + Width = 120 + end + item + Caption = 'Path' + end> + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnSelectItem = LVDirectoriesSelectItem + end + object PDirectories: TPanel + Height = 116 + Top = 264 + Width = 571 + Align = alBottom + BevelOuter = bvLowered + ClientHeight = 116 + ClientWidth = 571 + TabOrder = 1 + object Label1: TLabel + Left = 4 + Height = 21 + Top = 10 + Width = 80 + Alignment = taRightJustify + AutoSize = False + Caption = '&Name' + FocusControl = EDirName + Layout = tlCenter + ParentColor = False + end + object Label2: TLabel + Left = 4 + Height = 19 + Top = 44 + Width = 80 + Alignment = taRightJustify + AutoSize = False + Caption = '&Path' + FocusControl = EDirPath + Layout = tlCenter + ParentColor = False + end + object SBDirPath: TSpeedButton + Left = 533 + Height = 22 + Top = 41 + Width = 23 + Anchors = [akTop, akRight] + Color = clBtnFace + Glyph.Data = { + 610C00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203135392032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023363336433735222C0A222E2D2063202335373546 + 3638222C0A222E2A20632023354236333643222C0A222E612063202333413346 + 3435222C0A222E6220632023383038433938222C0A222E632063202338333846 + 3943222C0A222E6420632023343734443534222C0A222E652063202337343746 + 3841222C0A222E6620632023333233373342222C0A222E672063202335363545 + 3636222C0A222E6820632023364637383835222C0A222E692063202333393346 + 3438222C0A222E6A20632023373137443842222C0A222E6B2063202334303441 + 3536222C0A222E6C20632023373438333932222C0A222E6D2063202334303437 + 3446222C0A222E6E20632023333433393345222C0A222E6F2063202334443534 + 3542222C0A222E7020632023393041304230222C0A222E712063202335313544 + 3639222C0A222E7220632023363537343836222C0A222E732063202334453538 + 3633222C0A222E7420632023383839384141222C0A222E752063202334413531 + 3541222C0A222E7620632023313131333136222C0A222E772063202335383631 + 3639222C0A222E7820632023343834463536222C0A222E792063202332433246 + 3332222C0A222E7A20632023324433303334222C0A222E412063202333433432 + 3436222C0A222E4220632023333333383344222C0A222E432063202330383039 + 3041222C0A222E4420632023443942343334222C0A222E452063202345314332 + 3545222C0A222E4620632023453243333630222C0A222E472063202345324333 + 3546222C0A222E4820632023444242363343222C0A222E492063202341464239 + 4334222C0A222E4A20632023384439414137222C0A222E4B2063202334303435 + 3437222C0A222E4C20632023353535423633222C0A222E4D2063202341344146 + 4242222C0A222E4E20632023384239384136222C0A222E4F2063202332313234 + 3237222C0A222E5020632023444142333336222C0A222E512063202346454645 + 4644222C0A222E5220632023464646464645222C0A222E532063202346464645 + 4645222C0A222E5420632023464646454644222C0A222E552063202346424637 + 4541222C0A222E5620632023354636383731222C0A222E572063202341424236 + 4331222C0A222E5820632023363637303739222C0A222E592063202335343534 + 3441222C0A222E5A20632023413639353543222C0A222E302063202335443636 + 3645222C0A222E3120632023413542314244222C0A222E322063202336413734 + 3745222C0A222E3320632023314231443230222C0A222E342063202344414146 + 3335222C0A222E3520632023464546434637222C0A222E362063202346384534 + 3845222C0A222E3720632023463544453931222C0A222E382063202346354530 + 3946222C0A222E3920632023463645314143222C0A222E402063202346454642 + 4546222C0A222E2320632023353435423633222C0A222E3B2063202335453637 + 3730222C0A222E3A20632023334234303434222C0A222E3D2063202341434141 + 4133222C0A222E2B20632023344535353543222C0A222E252063202337463841 + 3936222C0A222E2420632023313331343136222C0A222E282063202344414141 + 3336222C0A222E2920632023464446414631222C0A222E5B2063202346354445 + 3934222C0A222E5D20632023463444433933222C0A222C2E2063202346324435 + 3831222C0A222C2C20632023453943303630222C0A222C2D2063202345314145 + 3446222C0A222C2A20632023444139343335222C0A222C612063202331313133 + 3135222C0A222C6220632023303330343034222C0A222C632063202344414142 + 3335222C0A222C6420632023464246364538222C0A222C652063202345414335 + 3745222C0A222C6620632023453341453542222C0A222C672063202345314138 + 3531222C0A222C6820632023453441463630222C0A222C692063202346444641 + 4542222C0A222C6A20632023464546414543222C0A222C6B2063202346434635 + 4535222C0A222C6C20632023464346364535222C0A222C6D2063202346434635 + 4534222C0A222C6E20632023444141363337222C0A222C6F2063202346464644 + 4638222C0A222C7020632023464646444636222C0A222C712063202346464643 + 4635222C0A222C7220632023464546414538222C0A222C732063202346414543 + 4146222C0A222C7420632023463845333837222C0A222C752063202346374530 + 3744222C0A222C7620632023463644443732222C0A222C772063202346354442 + 3638222C0A222C7820632023464446394539222C0A222C792063202344414131 + 3336222C0A222C7A20632023464546434636222C0A222C412063202346434632 + 4338222C0A222C4220632023464245464239222C0A222C432063202346414543 + 4143222C0A222C4420632023463845343843222C0A222C452063202346384533 + 3841222C0A222C4620632023463745313832222C0A222C472063202346374446 + 3739222C0A222C4820632023463644443644222C0A222C492063202346354441 + 3631222C0A222C4A20632023463444373537222C0A222C4B2063202346444638 + 4537222C0A222C4C20632023444139413336222C0A222C4D2063202346444641 + 4632222C0A222C4E20632023464145444233222C0A222C4F2063202346394539 + 4134222C0A222C5020632023463845363935222C0A222C512063202346374532 + 3835222C0A222C5220632023463745313831222C0A222C532063202346374530 + 3741222C0A222C5420632023463644443646222C0A222C552063202346354441 + 3632222C0A222C5620632023463344363534222C0A222C572063202346324433 + 3437222C0A222C5820632023464446394538222C0A222C592063202346454641 + 4546222C0A222C5A20632023463945394131222C0A222C302063202346384535 + 3931222C0A222C3120632023463644453732222C0A222C322063202346354441 + 3633222C0A222C3320632023463444373534222C0A222C342063202346334433 + 3437222C0A222C3520632023463244303339222C0A222C362063202346314344 + 3245222C0A222C3720632023463043423236222C0A222C382063202346424632 + 4341222C0A222C3920632023443938453333222C0A222C402063202346414630 + 4443222C0A222C2320632023463444444137222C0A222C3B2063202346344442 + 3945222C0A222C3A20632023463344413936222C0A222C3D2063202346334438 + 3845222C0A222C2B20632023463344373836222C0A222C252063202346324434 + 3746222C0A222C2420632023463244333739222C0A222C282063202346314432 + 3732222C0A222C2920632023463144303643222C0A222C5B2063202346314346 + 3639222C0A222C5D20632023463845414332222C0A222D2E2063202344383838 + 3244222C0A222D2C20632023443838373244222C0A222D2D2063202344383836 + 3243222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2E2E2A + 2E612E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E622E632E61 + 2E2E2E642E652E662E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E67 + 2E682E692E6A2E6B2E6C2E6D2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E6E2E6F2E702E712E722E732E742E752E76222C0A222E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E672E772E782E792E2E2E7A2E412E422E43222C0A222E442E452E46 + 2E462E462E472E482E2C2E492E4A2E4B2E2E2E4C2E4D2E4E2E4F222C0A222E50 + 2E512E522E532E542E522E552E562E572E582E592E5A2E302E312E322E33222C + 0A222E342E352E362E372E382E392E402E232E4A2E3B2E3A2E3D2E2B2E252E67 + 2E24222C0A222E282E292E5B2E5D2C2E2C2C2C2D2C2A2C2A2C2A2C2A2C2A2C2A + 2C2A2C612C62222C0A222C632C642C652C662C672C682C692C6A2C6B2C6C2C6D + 2C6D2E522C2A2E2E2E2E222C0A222C6E2E522C6F2C702C712C722C732E362C74 + 2C752C762C772C782C2A2E2E2E2E222C0A222C792C7A2C412C422C432C442C45 + 2C462C472C482C492C4A2C4B2C2A2E2E2E2E222C0A222C4C2C4D2C4E2C4F2C50 + 2C512C522C532C542C552C562C572C582C2A2E2E2E2E222C0A222C2A2C592C5A + 2C302C522C312C322C332C342C352C362C372C382C2A2E2E2E2E222C0A222C39 + 2C402C232C3B2C3A2C3D2C2B2C252C242C282C292C5B2C5D2C392E2E2E2E222C + 0A222E2E2D2E2D2C2D2E2D2E2D2E2D2E2D2E2D2E2D2E2D2E2D2C2D2E2D2D2E2E + 2E2E227D0A + } + NumGlyphs = 0 + OnClick = SBDirPathClick + end + object CBDirEnabled: TTICheckBox + Left = 94 + Height = 22 + Top = 72 + Width = 70 + Caption = '&Enabled' + Link.TIPropertyName = 'Enabled' + OnEditingDone = DirectoryChanged + TabOrder = 0 + end + object CBDirRecurse: TTICheckBox + Left = 94 + Height = 22 + Top = 96 + Width = 70 + Caption = '&Recurse' + Link.TIPropertyName = 'Recurse' + OnEditingDone = DirectoryChanged + TabOrder = 1 + end + object EDirName: TTIEdit + Left = 94 + Height = 23 + Top = 8 + Width = 200 + Link.TIPropertyName = 'Name' + OnEditingDone = DirectoryChanged + TabOrder = 2 + end + object EDirPath: TTIEdit + Left = 94 + Height = 23 + Top = 40 + Width = 437 + Anchors = [akTop, akLeft, akRight] + Link.TIPropertyName = 'Path' + OnEditingDone = DirectoryChanged + TabOrder = 3 + end + end + object POptions: TPanel + Height = 50 + Width = 571 + Align = alTop + BevelOuter = bvNone + ClientHeight = 50 + ClientWidth = 571 + TabOrder = 2 + object Label3: TLabel + Height = 24 + Top = 26 + Width = 571 + Align = alBottom + Alignment = taCenter + AutoSize = False + Caption = 'Directories to clean:' + Layout = tlCenter + ParentColor = False + end + object CBStopOnError: TTICheckBox + Left = 14 + Height = 20 + Top = 2 + Width = 103 + Caption = 'Stop on errors' + Link.TIPropertyName = 'StopOnError' + OnChange = OptionsChanged + TabOrder = 0 + end + object CBAllFileActions: TTICheckBox + Left = 190 + Height = 20 + Top = 2 + Width = 184 + Caption = 'Execute all matching actions' + Link.TIPropertyName = 'AllFileActions' + OnChange = OptionsChanged + TabOrder = 1 + end + object CBLogAllFiles: TTICheckBox + Left = 406 + Height = 20 + Top = 2 + Width = 88 + Caption = 'Log all files' + Link.TIPropertyName = 'LogAllFiles' + OnChange = OptionsChanged + TabOrder = 2 + end + end + end + object TSLocations: TTabSheet + Caption = 'Locations' + ClientHeight = 380 + ClientWidth = 571 + object PLocation: TPanel + Height = 188 + Top = 192 + Width = 571 + Align = alBottom + BevelOuter = bvLowered + ClientHeight = 188 + ClientWidth = 571 + TabOrder = 0 + object LELocationName: TLabel + Left = 4 + Height = 21 + Top = 13 + Width = 76 + Alignment = taRightJustify + AutoSize = False + Caption = '&Name' + Layout = tlCenter + ParentColor = False + end + object Label4: TLabel + Left = 4 + Height = 23 + Top = 48 + Width = 76 + Alignment = taRightJustify + AutoSize = False + Caption = '&Path' + Layout = tlCenter + ParentColor = False + end + object SBLocationPath: TSpeedButton + Left = 524 + Height = 22 + Top = 49 + Width = 23 + Anchors = [akTop, akRight] + Color = clBtnFace + Glyph.Data = { + 610C00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203135392032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023363336433735222C0A222E2D2063202335373546 + 3638222C0A222E2A20632023354236333643222C0A222E612063202333413346 + 3435222C0A222E6220632023383038433938222C0A222E632063202338333846 + 3943222C0A222E6420632023343734443534222C0A222E652063202337343746 + 3841222C0A222E6620632023333233373342222C0A222E672063202335363545 + 3636222C0A222E6820632023364637383835222C0A222E692063202333393346 + 3438222C0A222E6A20632023373137443842222C0A222E6B2063202334303441 + 3536222C0A222E6C20632023373438333932222C0A222E6D2063202334303437 + 3446222C0A222E6E20632023333433393345222C0A222E6F2063202334443534 + 3542222C0A222E7020632023393041304230222C0A222E712063202335313544 + 3639222C0A222E7220632023363537343836222C0A222E732063202334453538 + 3633222C0A222E7420632023383839384141222C0A222E752063202334413531 + 3541222C0A222E7620632023313131333136222C0A222E772063202335383631 + 3639222C0A222E7820632023343834463536222C0A222E792063202332433246 + 3332222C0A222E7A20632023324433303334222C0A222E412063202333433432 + 3436222C0A222E4220632023333333383344222C0A222E432063202330383039 + 3041222C0A222E4420632023443942343334222C0A222E452063202345314332 + 3545222C0A222E4620632023453243333630222C0A222E472063202345324333 + 3546222C0A222E4820632023444242363343222C0A222E492063202341464239 + 4334222C0A222E4A20632023384439414137222C0A222E4B2063202334303435 + 3437222C0A222E4C20632023353535423633222C0A222E4D2063202341344146 + 4242222C0A222E4E20632023384239384136222C0A222E4F2063202332313234 + 3237222C0A222E5020632023444142333336222C0A222E512063202346454645 + 4644222C0A222E5220632023464646464645222C0A222E532063202346464645 + 4645222C0A222E5420632023464646454644222C0A222E552063202346424637 + 4541222C0A222E5620632023354636383731222C0A222E572063202341424236 + 4331222C0A222E5820632023363637303739222C0A222E592063202335343534 + 3441222C0A222E5A20632023413639353543222C0A222E302063202335443636 + 3645222C0A222E3120632023413542314244222C0A222E322063202336413734 + 3745222C0A222E3320632023314231443230222C0A222E342063202344414146 + 3335222C0A222E3520632023464546434637222C0A222E362063202346384534 + 3845222C0A222E3720632023463544453931222C0A222E382063202346354530 + 3946222C0A222E3920632023463645314143222C0A222E402063202346454642 + 4546222C0A222E2320632023353435423633222C0A222E3B2063202335453637 + 3730222C0A222E3A20632023334234303434222C0A222E3D2063202341434141 + 4133222C0A222E2B20632023344535353543222C0A222E252063202337463841 + 3936222C0A222E2420632023313331343136222C0A222E282063202344414141 + 3336222C0A222E2920632023464446414631222C0A222E5B2063202346354445 + 3934222C0A222E5D20632023463444433933222C0A222C2E2063202346324435 + 3831222C0A222C2C20632023453943303630222C0A222C2D2063202345314145 + 3446222C0A222C2A20632023444139343335222C0A222C612063202331313133 + 3135222C0A222C6220632023303330343034222C0A222C632063202344414142 + 3335222C0A222C6420632023464246364538222C0A222C652063202345414335 + 3745222C0A222C6620632023453341453542222C0A222C672063202345314138 + 3531222C0A222C6820632023453441463630222C0A222C692063202346444641 + 4542222C0A222C6A20632023464546414543222C0A222C6B2063202346434635 + 4535222C0A222C6C20632023464346364535222C0A222C6D2063202346434635 + 4534222C0A222C6E20632023444141363337222C0A222C6F2063202346464644 + 4638222C0A222C7020632023464646444636222C0A222C712063202346464643 + 4635222C0A222C7220632023464546414538222C0A222C732063202346414543 + 4146222C0A222C7420632023463845333837222C0A222C752063202346374530 + 3744222C0A222C7620632023463644443732222C0A222C772063202346354442 + 3638222C0A222C7820632023464446394539222C0A222C792063202344414131 + 3336222C0A222C7A20632023464546434636222C0A222C412063202346434632 + 4338222C0A222C4220632023464245464239222C0A222C432063202346414543 + 4143222C0A222C4420632023463845343843222C0A222C452063202346384533 + 3841222C0A222C4620632023463745313832222C0A222C472063202346374446 + 3739222C0A222C4820632023463644443644222C0A222C492063202346354441 + 3631222C0A222C4A20632023463444373537222C0A222C4B2063202346444638 + 4537222C0A222C4C20632023444139413336222C0A222C4D2063202346444641 + 4632222C0A222C4E20632023464145444233222C0A222C4F2063202346394539 + 4134222C0A222C5020632023463845363935222C0A222C512063202346374532 + 3835222C0A222C5220632023463745313831222C0A222C532063202346374530 + 3741222C0A222C5420632023463644443646222C0A222C552063202346354441 + 3632222C0A222C5620632023463344363534222C0A222C572063202346324433 + 3437222C0A222C5820632023464446394538222C0A222C592063202346454641 + 4546222C0A222C5A20632023463945394131222C0A222C302063202346384535 + 3931222C0A222C3120632023463644453732222C0A222C322063202346354441 + 3633222C0A222C3320632023463444373534222C0A222C342063202346334433 + 3437222C0A222C3520632023463244303339222C0A222C362063202346314344 + 3245222C0A222C3720632023463043423236222C0A222C382063202346424632 + 4341222C0A222C3920632023443938453333222C0A222C402063202346414630 + 4443222C0A222C2320632023463444444137222C0A222C3B2063202346344442 + 3945222C0A222C3A20632023463344413936222C0A222C3D2063202346334438 + 3845222C0A222C2B20632023463344373836222C0A222C252063202346324434 + 3746222C0A222C2420632023463244333739222C0A222C282063202346314432 + 3732222C0A222C2920632023463144303643222C0A222C5B2063202346314346 + 3639222C0A222C5D20632023463845414332222C0A222D2E2063202344383838 + 3244222C0A222D2C20632023443838373244222C0A222D2D2063202344383836 + 3243222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2E2E2A + 2E612E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E622E632E61 + 2E2E2E642E652E662E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E67 + 2E682E692E6A2E6B2E6C2E6D2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E6E2E6F2E702E712E722E732E742E752E76222C0A222E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E672E772E782E792E2E2E7A2E412E422E43222C0A222E442E452E46 + 2E462E462E472E482E2C2E492E4A2E4B2E2E2E4C2E4D2E4E2E4F222C0A222E50 + 2E512E522E532E542E522E552E562E572E582E592E5A2E302E312E322E33222C + 0A222E342E352E362E372E382E392E402E232E4A2E3B2E3A2E3D2E2B2E252E67 + 2E24222C0A222E282E292E5B2E5D2C2E2C2C2C2D2C2A2C2A2C2A2C2A2C2A2C2A + 2C2A2C612C62222C0A222C632C642C652C662C672C682C692C6A2C6B2C6C2C6D + 2C6D2E522C2A2E2E2E2E222C0A222C6E2E522C6F2C702C712C722C732E362C74 + 2C752C762C772C782C2A2E2E2E2E222C0A222C792C7A2C412C422C432C442C45 + 2C462C472C482C492C4A2C4B2C2A2E2E2E2E222C0A222C4C2C4D2C4E2C4F2C50 + 2C512C522C532C542C552C562C572C582C2A2E2E2E2E222C0A222C2A2C592C5A + 2C302C522C312C322C332C342C352C362C372C382C2A2E2E2E2E222C0A222C39 + 2C402C232C3B2C3A2C3D2C2B2C252C242C282C292C5B2C5D2C392E2E2E2E222C + 0A222E2E2D2E2D2C2D2E2D2E2D2E2D2E2D2E2D2E2D2E2D2E2D2C2D2E2D2D2E2E + 2E2E227D0A + } + NumGlyphs = 0 + OnClick = SBLocationPathClick + end + object ELocationBaseDir: TTIEdit + Left = 86 + Height = 23 + Top = 48 + Width = 432 + Link.TIPropertyName = 'BasePath' + OnEditingDone = LocationChanged + TabOrder = 1 + end + object ELocationName: TTIEdit + Left = 86 + Height = 23 + Top = 13 + Width = 184 + Link.TIPropertyName = 'Name' + OnEditingDone = LocationChanged + TabOrder = 0 + end + object CGLocationSubdirs: TTICheckGroup + Left = 86 + Height = 100 + Top = 80 + Width = 344 + Caption = 'Create subdirectories from' + ColumnLayout = clVerticalThenHorizontal + Columns = 2 + Link.TIPropertyName = 'SubDirs' + Link.AliasValuesStrings = ( + 'sdExtension=Extension' + 'sdYear=Year' + 'sdMonth=Month' + 'sdDay=Day' + 'sdDate=Date' + 'sdHour=Hour' + 'sdMin=Min' + 'sdTime=Time' + ) + OnEditingDone = LocationChanged + end + end + object LVLocations: TListView + Height = 192 + Width = 571 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 120 + end + item + Caption = 'Path' + Width = 200 + end + item + Caption = 'Subdirs' + end> + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnSelectItem = LVLocationsSelectItem + end + end + object TSFileActions: TTabSheet + Caption = 'Actions' + ClientHeight = 380 + ClientWidth = 571 + object LVFileActions: TListView + Height = 216 + Width = 571 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 100 + end + item + Caption = 'Extensions' + Width = 100 + end + item + Caption = 'Location' + end + item + Caption = 'Delete' + end + item + Caption = 'Compress' + end + item + Caption = 'MinCompressSize' + end + item + Caption = 'Case sensitive' + end> + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnSelectItem = LVFileActionsSelectItem + end + object PFileAction: TPanel + Height = 164 + Top = 216 + Width = 571 + Align = alBottom + BevelOuter = bvLowered + ClientHeight = 164 + ClientWidth = 571 + TabOrder = 1 + object LSEFileActionMinCompressSize: TLabel + Left = 214 + Height = 20 + Top = 131 + Width = 85 + Alignment = taRightJustify + AutoSize = False + Caption = '&Minimum size' + FocusControl = SEFileActionMinCompressSize + Layout = tlCenter + ParentColor = False + end + object Label5: TLabel + Left = 15 + Height = 23 + Top = 8 + Width = 70 + Alignment = taRightJustify + AutoSize = False + Caption = '&Name' + Layout = tlCenter + ParentColor = False + end + object Label6: TLabel + Left = 15 + Height = 23 + Top = 40 + Width = 70 + Alignment = taRightJustify + AutoSize = False + Caption = '&Extensions' + Layout = tlCenter + ParentColor = False + end + object Label7: TLabel + Left = 13 + Height = 25 + Top = 72 + Width = 72 + Alignment = taRightJustify + AutoSize = False + Caption = 'Location' + Layout = tlCenter + ParentColor = False + end + object EFileActionName: TTIEdit + Left = 92 + Height = 23 + Top = 8 + Width = 178 + Link.TIPropertyName = 'Name' + OnEditingDone = ActionChanged + TabOrder = 0 + end + object EFileActionExtensions: TTIEdit + Left = 92 + Height = 23 + Top = 40 + Width = 178 + Link.TIPropertyName = 'Extensions' + OnEditingDone = ActionChanged + TabOrder = 1 + end + object CBFileActionDelete: TTICheckBox + Left = 92 + Height = 22 + Top = 104 + Width = 60 + Caption = '&Delete' + Link.TIPropertyName = 'Delete' + OnEditingDone = ActionChanged + TabOrder = 2 + end + object CBFileActionCompress: TTICheckBox + Left = 92 + Height = 22 + Top = 131 + Width = 79 + Caption = '&Compress' + Link.TIPropertyName = 'Compress' + OnChange = CBFileActionCompressChange + TabOrder = 3 + end + object SEFileActionMinCompressSize: TTISpinEdit + Left = 302 + Height = 23 + Top = 128 + Width = 50 + Link.TIElementName = 'MinCompressSize' + MaxValue = 10000 + OnEditingDone = ActionChanged + TabOrder = 4 + UseRTTIMinMax = False + end + object CBFileActionLocationName: TTIComboBox + Left = 92 + Height = 25 + Top = 72 + Width = 100 + AutoDropDown = True + Link.TIPropertyName = 'LocationName' + MaxLength = 0 + OnEditingDone = ActionChanged + Sorted = True + Style = csDropDownList + TabOrder = 5 + end + end + end + object TSScheduling: TTabSheet + Caption = 'Scheduling' + ClientHeight = 350 + ClientWidth = 567 + object LEDailyAt: TLabel + Left = 14 + Height = 23 + Top = 130 + Width = 56 + Alignment = taRightJustify + AutoSize = False + Caption = 'Daily at' + Layout = tlCenter + ParentColor = False + end + object LSEHourlyAt: TLabel + Left = 14 + Height = 23 + Top = 170 + Width = 56 + Alignment = taRightJustify + AutoSize = False + Caption = 'Hourly at' + Layout = tlCenter + ParentColor = False + end + object RGScheduleMode: TTIRadioGroup + Left = 14 + Height = 108 + Top = 10 + Width = 168 + Caption = 'Schedule service' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.TopBottomSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 1 + Link.TIPropertyName = 'ScheduleMode' + Link.AliasValuesStrings = ( + 'smDaily=Daily' + 'smHourly=Hourly' + ) + OnEditingDone = ScheduleModeChanged + end + object EDailyAt: TTIEdit + Left = 86 + Height = 23 + Top = 130 + Width = 80 + Link.TIPropertyName = 'DailyAt' + OnEditingDone = OptionsChanged + TabOrder = 1 + end + object SEHourlyAt: TTISpinEdit + Left = 86 + Height = 23 + Top = 170 + Width = 50 + Link.TIPropertyName = 'HourlyAt' + MaxValue = 59 + OnEditingDone = OptionsChanged + TabOrder = 2 + end + object CGScheduleDays: TTICheckGroup + Left = 198 + Height = 108 + Top = 10 + Width = 312 + Caption = 'Days of week to run service' + ColumnLayout = clVerticalThenHorizontal + Columns = 2 + Link.TIPropertyName = 'ScheduleDays' + Link.AliasValuesStrings = ( + 'sdMonday=Monday' + 'sdTuesday=Tuesday' + 'sdWednesday=Wednesday' + 'sdThursday=Thursday' + 'sdFriday=Friday' + 'sdSaturday=Saturday' + 'sdSunday=Sunday' + ) + OnEditingDone = OptionsChanged + end + end + end + object MMMain: TMainMenu + Images = ILMain + left = 80 + top = 64 + object MFile: TMenuItem + Caption = '&File' + object MNew: TMenuItem + Action = ANew + Bitmap.Data = { + E10C00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203136372032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023344438424338222C0A222E2D2063202334463843 + 4338222C0A222E2A20632023344638444338222C0A222E612063202334463843 + 4339222C0A222E6220632023344638424337222C0A222E632063202334423839 + 4335222C0A222E6420632023334237364334222C0A222E652063202334393835 + 4334222C0A222E6620632023454346324637222C0A222E672063202345454634 + 4638222C0A222E6820632023454446344638222C0A222E692063202345444633 + 4638222C0A222E6A20632023454346324638222C0A222E6B2063202344374536 + 4632222C0A222E6C20632023374442324532222C0A222E6D2063202336353934 + 4442222C0A222E6E20632023344238384335222C0A222E6F2063202346324636 + 4641222C0A222E7020632023433745304641222C0A222E712063202343394531 + 4642222C0A222E7220632023433945324642222C0A222E732063202343384530 + 4642222C0A222E7420632023433544464639222C0A222E752063202343314442 + 4638222C0A222E7620632023423844364634222C0A222E772063202346384642 + 4646222C0A222E7820632023423444384636222C0A222E792063202337444230 + 4531222C0A222E7A20632023363439324442222C0A222E412063202334433839 + 4336222C0A222E4220632023463146354639222C0A222E432063202343444533 + 4643222C0A222E4420632023434545334642222C0A222E452063202343444533 + 4642222C0A222E4620632023434245324642222C0A222E472063202343384530 + 4639222C0A222E4820632023433244434638222C0A222E492063202342414436 + 4635222C0A222E4A20632023463846424644222C0A222E4B2063202343444536 + 4643222C0A222E4C20632023433945354641222C0A222E4D2063202338344236 + 4532222C0A222E4E20632023343237394246222C0A222E4F2063202334423839 + 4336222C0A222E5020632023434645334643222C0A222E512063202344304534 + 4642222C0A222E5220632023434645344643222C0A222E532063202343414531 + 4641222C0A222E5420632023433444444639222C0A222E552063202342434439 + 4636222C0A222E5620632023444645394634222C0A222E572063202346334637 + 4642222C0A222E5820632023453945464635222C0A222E592063202334353745 + 4332222C0A222E5A20632023463046344639222C0A222E302063202344334536 + 4643222C0A222E3120632023443445364643222C0A222E322063202344334537 + 4644222C0A222E3320632023443145344643222C0A222E342063202343384530 + 4641222C0A222E3520632023424244364635222C0A222E362063202342354434 + 4633222C0A222E3720632023423344324631222C0A222E382063202346304634 + 4638222C0A222E3920632023343638324334222C0A222E402063202334413838 + 4336222C0A222E2320632023454646344639222C0A222E3B2063202344374537 + 4645222C0A222E3A20632023443645374644222C0A222E3D2063202344354537 + 4644222C0A222E2B20632023443445364644222C0A222E252063202344324536 + 4643222C0A222E2420632023434345314642222C0A222E282063202343374446 + 4641222C0A222E2920632023424444414636222C0A222E5B2063202342424438 + 4636222C0A222E5D20632023454646344641222C0A222C2E2063202334363833 + 4336222C0A222C2C20632023343938384336222C0A222C2D2063202345444634 + 4639222C0A222C2A20632023443845384645222C0A222C612063202344374538 + 4645222C0A222C6220632023443645374645222C0A222C632063202344334535 + 4644222C0A222C6420632023433344444639222C0A222C652063202345444634 + 4641222C0A222C6620632023343538324336222C0A222C672063202334373834 + 4336222C0A222C6820632023454346334639222C0A222C692063202344364538 + 4645222C0A222C6A20632023434345334642222C0A222C6B2063202343364446 + 4641222C0A222C6C20632023454146324641222C0A222C6D2063202334323830 + 4336222C0A222C6E20632023343538324335222C0A222C6F2063202345424632 + 4638222C0A222C7020632023443545364644222C0A222C712063202343444532 + 4643222C0A222C7220632023434245314642222C0A222C732063202346324637 + 4642222C0A222C7420632023334637434335222C0A222C752063202334323830 + 4335222C0A222C7620632023453846314638222C0A222C772063202344354535 + 4645222C0A222C7820632023443345354643222C0A222C792063202343454532 + 4643222C0A222C7A20632023434345324643222C0A222C412063202343394530 + 4642222C0A222C4220632023433845314642222C0A222C432063202346374641 + 4644222C0A222C4420632023334237364331222C0A222C452063202334303743 + 4334222C0A222C4620632023453646304637222C0A222C472063202335354234 + 4638222C0A222C4820632023353642344637222C0A222C492063202335344235 + 4637222C0A222C4A20632023353342344638222C0A222C4B2063202335334232 + 4638222C0A222C4C20632023353242334637222C0A222C4D2063202335314232 + 4637222C0A222C4E20632023344642324637222C0A222C4F2063202346354639 + 4643222C0A222C5020632023333636464246222C0A222C512063202333433738 + 4331222C0A222C5220632023453345444637222C0A222C532063202336454332 + 4644222C0A222C5420632023413044384646222C0A222C552063202339454437 + 4646222C0A222C5620632023394244364646222C0A222C572063202339384437 + 4646222C0A222C5820632023393644364646222C0A222C592063202339354436 + 4646222C0A222C5A20632023393444354646222C0A222C302063202339334434 + 4646222C0A222C3120632023363542454642222C0A222C322063202346344637 + 4642222C0A222C3320632023333136374242222C0A222C342063202333383731 + 4246222C0A222C3520632023444645424635222C0A222C362063202336384246 + 4644222C0A222C3720632023363742444643222C0A222C382063202336344245 + 4643222C0A222C3920632023363242444643222C0A222C402063202336334244 + 4642222C0A222C2320632023363142434642222C0A222C3B2063202336304245 + 4643222C0A222C3A20632023363242434643222C0A222C3D2063202332443634 + 4239222C0A222C2B20632023333336394243222C0A222C252063202345414631 + 4638222C0A222C2420632023444645434637222C0A222C282063202344454542 + 4636222C0A222C2920632023444545414636222C0A222C5B2063202344434541 + 4636222C0A222C5D20632023454246334641222C0A222D2E2063202346334637 + 4643222C0A222D2C20632023463446384643222C0A222D2D2063202346444645 + 4645222C0A222D2A20632023324136304237222C0A222D612063202333303635 + 4241222C0A222D6220632023333136364242222C0A222D632063202333303636 + 4241222C0A222D6420632023324636354241222C0A222D652063202332453635 + 4239222C0A222D6620632023324536344239222C0A222D672063202332433632 + 4237222C0A222E2E2E2E2E2C2E2D2E2D2E2D2E2D2E2A2E612E622E632E642E2E + 2E2E2E2E2E2E222C0A222E2E2E652E662E672E682E692E692E692E6A2E662E6B + 2E6C2E6D2E2E2E2E2E2E222C0A222E2E2E6E2E6F2E702E712E722E732E742E75 + 2E762E772E782E792E7A2E2E2E2E222C0A222E2E2E412E422E432E442E452E46 + 2E472E482E492E4A2E4B2E4C2E4D2E4E2E2E222C0A222E2E2E4F2E422E502E51 + 2E522E432E532E542E552E562E662E572E582E592E2E222C0A222E2E2E4F2E5A + 2E302E312E322E332E452E342E482E352E362E372E382E392E2E222C0A222E2E + 2E402E232E3B2E3A2E3D2E2B2E252E242E282E482E292E5B2E5D2C2E2E2E222C + 0A222E2E2C2C2C2D2C2A2C2A2C612C622C632E332E242E702C642E482C652C66 + 2E2E222C0A222E2E2C672C682C692C612E3A2E3A2E3D2C632E512C6A2E282C6B + 2C6C2C6D2E2E222C0A222E2E2C6E2C6F2C622E3A2E3A2E3A2C702C632E332C71 + 2C722E712C732C742E2E222C0A222E2E2C752C762C772C632C632C782C782E33 + 2C792C7A2C412C422C432C442E2E222C0A222E2E2C452C462C472C482C492C4A + 2C4B2C4C2C4C2C4D2C4E2C4E2C4F2C502E2E222C0A222E2E2C512C522C532C54 + 2C552C562C572C582C592C5A2C302C312C322C332E2E222C0A222E2E2C342C35 + 2C362C372C312C382C382C392C402C232C3B2C3A2E4A2C3D2E2E222C0A222E2E + 2C2B2C252C242C282C292C5B2C5B2C5D2C5D2C6C2D2E2D2C2D2D2D2A2E2E222C + 0A222E2E2E2E2D612D622D632D632D632D612D642D652D652D662D662D672E2E + 2E2E227D0A + } + OnClick = ANewExecute + end + object MIOpen: TMenuItem + Action = AOpen + Bitmap.Data = { + 610D00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203137352032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023394443334541222C0A222E2D2063202339364246 + 4536222C0A222E2A20632023393242424534222C0A222E612063202336434130 + 4431222C0A222E6220632023364439454430222C0A222E632063202335463936 + 4343222C0A222E6420632023393642454535222C0A222E652063202346454646 + 4646222C0A222E6620632023453946334644222C0A222E672063202345414633 + 4644222C0A222E6820632023453846324643222C0A222E692063202345334546 + 4641222C0A222E6A20632023453746324641222C0A222E6B2063202338384242 + 4541222C0A222E6C20632023353538354346222C0A222E6D2063202339334242 + 4534222C0A222E6E20632023454446354645222C0A222E6F2063202343354445 + 4643222C0A222E7020632023433745304642222C0A222E712063202343324443 + 4639222C0A222E7220632023423444334635222C0A222E732063202346334639 + 4645222C0A222E7420632023433445324641222C0A222E752063202339334331 + 4543222C0A222E7620632023343837444333222C0A222E772063202346304636 + 4645222C0A222E7820632023434445324643222C0A222E792063202343444533 + 4643222C0A222E7A20632023433844464641222C0A222E412063202342434439 + 4637222C0A222E4220632023444445394635222C0A222E432063202345424633 + 4641222C0A222E4420632023463346384642222C0A222E452063202335333833 + 4341222C0A222E4620632023463146374645222C0A222E472063202344324535 + 4643222C0A222E4820632023443145344643222C0A222E492063202343434532 + 4642222C0A222E4A20632023433444444639222C0A222E4B2063202342424437 + 4636222C0A222E4C20632023414644314633222C0A222E4D2063202345344546 + 4641222C0A222E4E20632023353838374343222C0A222E4F2063202344394234 + 3334222C0A222E5020632023453143323545222C0A222E512063202345324333 + 3630222C0A222E5220632023453243333546222C0A222E532063202339314242 + 4534222C0A222E5420632023463246374646222C0A222E552063202344354537 + 4645222C0A222E5620632023443145354644222C0A222E572063202343414530 + 4641222C0A222E5820632023433444454639222C0A222E592063202345374632 + 4644222C0A222E5A20632023353738374343222C0A222E302063202344414233 + 3336222C0A222E3120632023464546454644222C0A222E322063202346464646 + 4645222C0A222E3320632023464646454645222C0A222E342063202346464645 + 4644222C0A222E3520632023393142414534222C0A222E362063202346304637 + 4646222C0A222E3720632023443545374646222C0A222E382063202344364537 + 4644222C0A222E3920632023443445364644222C0A222E402063202344304534 + 4643222C0A222E2320632023434245334642222C0A222E3B2063202343324443 + 4641222C0A222E3A20632023453846334645222C0A222E3D2063202335363836 + 4343222C0A222E2B20632023444141463335222C0A222E252063202346454643 + 4637222C0A222E2420632023463845343845222C0A222E282063202346354445 + 3931222C0A222E2920632023463545303946222C0A222E5B2063202346364531 + 4143222C0A222E5D20632023353238344341222C0A222C2E2063202346314637 + 4646222C0A222C2C20632023443945394646222C0A222C2D2063202344424541 + 4646222C0A222C2A20632023443745374646222C0A222C612063202344324535 + 4646222C0A222C6220632023434245324646222C0A222C632063202335353835 + 4342222C0A222C6420632023444141413336222C0A222C652063202346444641 + 4631222C0A222C6620632023463544453934222C0A222C672063202346344443 + 3933222C0A222C6820632023453942433634222C0A222C692063202344413934 + 3335222C0A222C6A20632023454646364642222C0A222C6B2063202335353833 + 4343222C0A222C6C20632023444141423335222C0A222C6D2063202346424636 + 4538222C0A222C6E20632023453742433730222C0A222C6F2063202345324141 + 3535222C0A222C7020632023453041353444222C0A222C712063202345424339 + 3931222C0A222C7220632023454646334641222C0A222C732063202346444645 + 4644222C0A222C7420632023464346444646222C0A222C752063202346434644 + 4645222C0A222C7620632023464246434645222C0A222C772063202346444645 + 4645222C0A222C7820632023453846324546222C0A222C792063202335363831 + 4345222C0A222C7A20632023444141363337222C0A222C412063202346464644 + 4638222C0A222C4220632023464646444636222C0A222C432063202346464643 + 4635222C0A222C4420632023464546434633222C0A222C452063202346344534 + 3941222C0A222C4620632023463745363941222C0A222C472063202346364536 + 3942222C0A222C4820632023463545353944222C0A222C492063202346354535 + 3945222C0A222C4A20632023463445353946222C0A222C4B2063202346384633 + 4441222C0A222C4C20632023454546344644222C0A222C4D2063202335343830 + 4341222C0A222C4E20632023444141313336222C0A222C4F2063202346454643 + 4636222C0A222C5020632023463845353934222C0A222C512063202346384535 + 3933222C0A222C5220632023463845353931222C0A222C532063202345394442 + 3933222C0A222C5420632023453344373933222C0A222C552063202344434432 + 3933222C0A222C5620632023443743453930222C0A222C572063202343464338 + 3843222C0A222C5820632023433643313836222C0A222C592063202344364438 + 4339222C0A222C5A20632023343437344335222C0A222C302063202335333746 + 4341222C0A222C3120632023444139413336222C0A222C322063202346444641 + 4632222C0A222C3320632023463845363934222C0A222C342063202346384535 + 3932222C0A222C3520632023463845353930222C0A222C362063202346384533 + 3842222C0A222C3720632023463745323836222C0A222C382063202346374531 + 3746222C0A222C3920632023463644453737222C0A222C402063202346364443 + 3643222C0A222C2320632023463444393545222C0A222C3B2063202346334435 + 3446222C0A222C3A20632023464246324343222C0A222C3D2063202346454641 + 4546222C0A222C2B20632023463845343846222C0A222C252063202346384533 + 3839222C0A222C2420632023463745313832222C0A222C282063202346374446 + 3741222C0A222C2920632023463644453731222C0A222C5B2063202346354442 + 3637222C0A222C5D20632023463444383542222C0A222D2E2063202346334434 + 3444222C0A222D2C20632023463244313430222C0A222D2D2063202346424632 + 4341222C0A222D2A20632023443938453333222C0A222D612063202346414630 + 4443222C0A222D6220632023463645313938222C0A222D632063202346364530 + 3935222C0A222D6420632023463644463932222C0A222D652063202346354445 + 3845222C0A222D6620632023463544433839222C0A222D672063202346344441 + 3835222C0A222D6820632023463444393830222C0A222D692063202346334437 + 3741222C0A222D6A20632023463344353734222C0A222D6B2063202346324433 + 3730222C0A222D6C20632023463845414332222C0A222D6D2063202344383836 + 3243222C0A222D6E20632023443838383244222C0A222D6F2063202344383837 + 3244222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2A2E2A2E612E622E63 + 2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E642E652E662E672E68 + 2E692E6A2E6B2E6C2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E6D2E6E2E6F + 2E702E712E722E732E742E752E76222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2A + 2E772E782E792E7A2E412E422E432E442E45222C0A222E2E2E2E2E2E2E2E2E2E + 2E2E2E2A2E462E472E482E492E4A2E4B2E4C2E4D2E4E222C0A222E4F2E502E51 + 2E512E512E522E532E542E552E552E562E572E582E412E592E5A222C0A222E30 + 2E312E322E332E342E322E352E362E372E382E392E402E232E3B2E3A2E3D222C + 0A222E2B2E252E242E282E292E5B2E5D2C2E2C2C2C2D2C2C2C2A2C612C622C2E + 2C63222C0A222C642C652C662C672C682C692C692C692C692C692C692C692C69 + 2C692C6A2C6B222C0A222C6C2C6D2C6E2C6F2C702C712C722C732C742C742C75 + 2C762C772C692C782C79222C0A222C7A2E322C412C422C432C442C452C462C47 + 2C482C492C4A2C4B2C692C4C2C4D222C0A222C4E2C4F2C502C512C512C522C53 + 2C542C552C562C572C582C592C692C5A2C30222C0A222C312C322C332C342C35 + 2C362C372C382C392C402C232C3B2C3A2C692E2E2E2E222C0A222C692C3D2C51 + 2C2B2C252C242C282C292C5B2C5D2D2E2D2C2D2D2C692E2E2E2E222C0A222D2A + 2D612D622D632D642D652D662D672D682D692D6A2D6B2D6C2C692E2E2E2E222C + 0A222D6D2D6E2D6F2D6E2D6E2D6E2D6E2D6E2D6E2D6E2D6E2D6F2D6E2D6D2E2E + 2E2E227D0A + } + OnClick = AOpenExecute + end + object MISave: TMenuItem + Action = ASave + Bitmap.Data = { + 010C00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203135332032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023333636424243222C0A222E2D2063202333363642 + 4242222C0A222E2A20632023333636414242222C0A222E612063202333393643 + 4243222C0A222E6220632023334236454244222C0A222E632063202333413644 + 4242222C0A222E6420632023333836424242222C0A222E652063202333453730 + 4242222C0A222E6620632023443145304636222C0A222E672063202344314530 + 4637222C0A222E6820632023463846424645222C0A222E692063202346374642 + 4645222C0A222E6A20632023463646394644222C0A222E6B2063202346304635 + 4643222C0A222E6C20632023454146304641222C0A222E6D2063202345444632 + 4642222C0A222E6E20632023463746414644222C0A222E6F2063202345424631 + 4642222C0A222E7020632023444645394638222C0A222E712063202342444430 + 4543222C0A222E7220632023354538394339222C0A222E732063202344314446 + 4636222C0A222E7420632023383041414539222C0A222E752063202346364641 + 4645222C0A222E7620632023463646414644222C0A222E772063202336343843 + 4338222C0A222E7820632023454546334642222C0A222E792063202345414631 + 4642222C0A222E7A20632023463246364643222C0A222E412063202346314636 + 4643222C0A222E4220632023453245434639222C0A222E432063202344424537 + 4638222C0A222E4420632023424144304545222C0A222E452063202344304446 + 4636222C0A222E4620632023374541384538222C0A222E472063202345394631 + 4641222C0A222E4820632023454546344642222C0A222E492063202345384630 + 4641222C0A222E4A20632023444445384638222C0A222E4B2063202344424536 + 4637222C0A222E4C20632023374141334531222C0A222E4D2063202343334435 + 4546222C0A222E4E20632023333536394237222C0A222E4F2063202343434444 + 4635222C0A222E5020632023374541384537222C0A222E512063202336363844 + 4339222C0A222E5220632023453946304641222C0A222E532063202346334638 + 4644222C0A222E5420632023463846414645222C0A222E552063202345464634 + 4643222C0A222E5620632023444645394639222C0A222E572063202344424537 + 4637222C0A222E5820632023443945354637222C0A222E592063202337384132 + 4530222C0A222E5A20632023413943324537222C0A222E302063202333353638 + 4236222C0A222E3120632023433944434634222C0A222E322063202337444137 + 4537222C0A222E3320632023453145434639222C0A222E342063202345334544 + 4639222C0A222E3520632023454546344643222C0A222E362063202346334637 + 4644222C0A222E3720632023453545444641222C0A222E382063202344384535 + 4636222C0A222E3920632023373741304445222C0A222E402063202341344245 + 4534222C0A222E2320632023333436374234222C0A222E3B2063202343374439 + 4634222C0A222E3A20632023374441364536222C0A222E3D2063202336353844 + 4339222C0A222E2B20632023363738454339222C0A222E252063202336433932 + 4342222C0A222E2420632023364439324342222C0A222E282063202336393930 + 4341222C0A222E2920632023363538434338222C0A222E5B2063202337343943 + 4441222C0A222E5D20632023394642414531222C0A222C2E2063202333343636 + 4233222C0A222C2C20632023433544384632222C0A222C2D2063202337424134 + 4533222C0A222C2A20632023374141334533222C0A222C612063202337414134 + 4533222C0A222C6220632023374241344532222C0A222C632063202337424133 + 4532222C0A222C6420632023374241334531222C0A222C652063202337394132 + 4531222C0A222C6620632023373741304446222C0A222C672063202337363946 + 4445222C0A222C6820632023373439454444222C0A222C692063202337323943 + 4442222C0A222C6A20632023373439444443222C0A222C6B2063202339414235 + 4444222C0A222C6C20632023333436354231222C0A222C6D2063202343324435 + 4632222C0A222C6E20632023373841314530222C0A222C6F2063202337353945 + 4445222C0A222C7020632023373339424441222C0A222C712063202337333942 + 4439222C0A222C7220632023393542304441222C0A222C732063202333333634 + 4146222C0A222C7420632023424544324630222C0A222C752063202337414133 + 4532222C0A222C7620632023373739464445222C0A222C772063202337363946 + 4444222C0A222C7820632023373239424439222C0A222C792063202337313939 + 4438222C0A222C7A20632023373039394436222C0A222C412063202338454142 + 4435222C0A222C4220632023333336334144222C0A222C432063202333363641 + 4241222C0A222C4420632023424244304546222C0A222C452063202337414132 + 4532222C0A222C4620632023364439364433222C0A222C472063202338414137 + 4432222C0A222C4820632023333236324142222C0A222C492063202342384345 + 4546222C0A222C4A20632023463746414645222C0A222C4B2063202338384330 + 3632222C0A222C4C20632023364139334346222C0A222C4D2063202338344133 + 4345222C0A222C4E20632023333236314141222C0A222C4F2063202333383643 + 4242222C0A222C5020632023423643434545222C0A222C512063202337414132 + 4531222C0A222C5220632023433244434246222C0A222C532063202336383930 + 4344222C0A222C5420632023383139454343222C0A222C552063202333323631 + 4138222C0A222C5620632023333736424241222C0A222C572063202342334341 + 4544222C0A222C5820632023374141324530222C0A222C592063202336353844 + 4341222C0A222C5A20632023374339424339222C0A222C302063202333313630 + 4137222C0A222C3120632023333536414241222C0A222C322063202341444336 + 4542222C0A222C3320632023414443354541222C0A222C342063202337433941 + 4338222C0A222C3520632023373939384337222C0A222C362063202333353639 + 4239222C0A222C3720632023333536394238222C0A222C382063202333353638 + 4237222C0A222C3920632023333536384235222C0A222C402063202333343636 + 4232222C0A222C2320632023333336354230222C0A222C3B2063202333333634 + 4145222C0A222C3A20632023333236334143222C0A222C3D2063202333323632 + 4141222C0A222C2B20632023333236314139222C0A222C252063202333313630 + 4138222C0A222C2420632023333136304136222C0A222C282063202333313631 + 4138222C0A222E2E2E2C2E2C2E2C2E2C2E2D2E2D2E2A2E2A2E612E622E632E64 + 2E652E2E2E2E222C0A222E2C2E662E672E682E692E6A2E6B2E6C2E6D2E6A2E6E + 2E6F2E702E712E722E2E222C0A222E2C2E732E742E752E762E772E782E792E7A + 2E682E412E422E432E442E712E65222C0A222E2C2E452E462E412E412E772E47 + 2E482E6E2E6A2E492E4A2E4B2E4C2E4D2E4E222C0A222E2C2E4F2E502E492E49 + 2E512E522E532E542E552E562E572E582E592E5A2E30222C0A222E2D2E312E32 + 2E332E332E342E352E6E2E362E372E572E582E382E392E402E23222C0A222E2D + 2E3B2E3A2E772E3D2E2B2E252E242E282E292E772E772E772E5B2E5D2C2E222C + 0A222E2A2C2C2C2D2C2A2C612C622C632C642C652C662C672C682C692C6A2C6B + 2C6C222C0A222E2A2C6D2C2A2C2A2C632C632C622C652C6E2E392C6F2C6A2C70 + 2C712C722C73222C0A222E2A2C742C752C752E4C2C632C642C6E2C762C772C6A + 2C782C792C7A2C412C42222C0A222C432C442C452E682E682E682E682E682E68 + 2E682E682E682E682C462C472C48222C0A222E642C492C652C4A2C4B2C4B2C4B + 2C4B2C4B2C4B2C4B2C4B2E6A2C4C2C4D2C4E222C0A222C4F2C502C512C4A2C52 + 2C522C522C522C522C522C522C522E6A2C532C542C55222C0A222C562C572C58 + 2C4A2C4B2C4B2C4B2C4B2C4B2C4B2C4B2C4B2E6A2C592C5A2C30222C0A222C31 + 2C322C332E682E682E682E682E682E682E682E682E682E682C342C352C30222C + 0A222C432C362C372C382C392E232C402C232C3B2C3A2C3D2C2B2C252C302C24 + 2C28227D0A + } + OnClick = ASaveExecute + end + object MISaveAs: TMenuItem + Action = ASaveAs + OnClick = ASaveAsExecute + end + object MISep1: TMenuItem + Caption = '-' + end + object MIQuit: TMenuItem + Action = AQuit + Bitmap.Data = { + 910D00002F2A2058504D202A2F0A7374617469632063686172202A6772617068 + 69635B5D203D207B0A223136203136203137382032222C0A222E2E2063204E6F + 6E65222C0A222E2C20632023443439433644222C0A222E2D2063202344323941 + 3641222C0A222E2A20632023434639373636222C0A222E612063202344363945 + 3730222C0A222E6220632023444142313835222C0A222E632063202342393931 + 3541222C0A222E6420632023434239333630222C0A222E652063202338303830 + 3830222C0A222E6620632023374537453745222C0A222E672063202337433743 + 3743222C0A222E6820632023374137413741222C0A222E692063202337373737 + 3737222C0A222E6A20632023373537353735222C0A222E6B2063202337323732 + 3732222C0A222E6C20632023443439453731222C0A222E6D2063202344363945 + 3646222C0A222E6E20632023444342323837222C0A222E6F2063202345384433 + 4142222C0A222E7020632023453644304139222C0A222E712063202342383930 + 3538222C0A222E7220632023433638453539222C0A222E732063202337443744 + 3744222C0A222E7420632023393939393939222C0A222E752063202339413941 + 3941222C0A222E7620632023394239423942222C0A222E772063202344333944 + 3646222C0A222E7820632023453744314141222C0A222E792063202345374431 + 4142222C0A222E7A20632023453143373938222C0A222E412063202344454332 + 3931222C0A222E4220632023423738463536222C0A222E432063202343313839 + 3532222C0A222E4420632023353939313532222C0A222E452063202339393941 + 3939222C0A222E4620632023394339433943222C0A222E472063202344303941 + 3643222C0A222E4820632023453543454137222C0A222E492063202344464331 + 3846222C0A222E4A20632023444342443839222C0A222E4B2063202344434244 + 3842222C0A222E4C20632023423638443533222C0A222E4D2063202342433834 + 3442222C0A222E4E20632023343538413344222C0A222E4F2063202334463841 + 3439222C0A222E5020632023394439443944222C0A222E512063202343433936 + 3636222C0A222E5220632023453343424132222C0A222E532063202344414239 + 3833222C0A222E5420632023444142393834222C0A222E552063202342353842 + 3531222C0A222E5620632023423637453433222C0A222E572063202334443934 + 3434222C0A222E5820632023344239313432222C0A222E592063202334383844 + 3346222C0A222E5A20632023343538393344222C0A222E302063202336354134 + 3544222C0A222E3120632023363141303541222C0A222E322063202334423833 + 3435222C0A222E3320632023394539453945222C0A222E342063202343393932 + 3630222C0A222E3520632023453243373945222C0A222E362063202344414238 + 3833222C0A222E3720632023443742343744222C0A222E382063202344374233 + 3745222C0A222E3920632023423438393446222C0A222E402063202342313739 + 3342222C0A222E2320632023344139303431222C0A222E3B2063202339464432 + 3934222C0A222E3A20632023394144303931222C0A222E3D2063202339364344 + 3844222C0A222E2B20632023393243423839222C0A222E252063202338444338 + 3834222C0A222E2420632023353839383531222C0A222E282063202334363743 + 3431222C0A222E2920632023394639463946222C0A222E5B2063202343343845 + 3541222C0A222E5D20632023453043333938222C0A222C2E2063202344374233 + 3743222C0A222C2C20632023443641463734222C0A222C2D2063202345444334 + 3545222C0A222C2A20632023423338383442222C0A222C612063202341423733 + 3334222C0A222C6220632023343638423345222C0A222C632063202339394345 + 3846222C0A222C6420632023383743363744222C0A222C652063202338314333 + 3738222C0A222C6620632023374343303733222C0A222C672063202337434330 + 3734222C0A222C6820632023383143323739222C0A222C692063202334463930 + 3439222C0A222C6A20632023353737463534222C0A222C6B2063202342463839 + 3534222C0A222C6C20632023444442463934222C0A222C6D2063202344344144 + 3735222C0A222C6E20632023453142383633222C0A222C6F2063202346464434 + 3442222C0A222C7020632023423838423432222C0A222C712063202341363645 + 3243222C0A222C7220632023343238373342222C0A222C732063202338384336 + 3830222C0A222C7420632023383343333742222C0A222C752063202337464331 + 3737222C0A222C7620632023344438463437222C0A222C772063202333463734 + 3342222C0A222C7820632023413141314131222C0A222C792063202342413834 + 3443222C0A222C7A20632023444242423844222C0A222C412063202344314138 + 3645222C0A222C4220632023443141363636222C0A222C432063202344464234 + 3546222C0A222C4420632023423138353437222C0A222C452063202341313639 + 3235222C0A222C4620632023334538323337222C0A222C472063202333423745 + 3334222C0A222C4820632023333737393331222C0A222C492063202333343735 + 3245222C0A222C4A20632023353039313439222C0A222C4B2063202334433846 + 3436222C0A222C4C20632023334437333339222C0A222C4D2063202341324132 + 4132222C0A222C4E20632023423437453435222C0A222C4F2063202344394237 + 3838222C0A222C5020632023434641333637222C0A222C512063202343433945 + 3631222C0A222C5220632023434339463633222C0A222C532063202342313833 + 3435222C0A222C5420632023394336343146222C0A222C552063202336303630 + 3630222C0A222C5620632023413041304130222C0A222C572063202334313736 + 3344222C0A222C5820632023333937313336222C0A222C592063202341334133 + 4133222C0A222C5A20632023423037393344222C0A222C302063202344374233 + 3832222C0A222C3120632023434339463632222C0A222C322063202343393941 + 3541222C0A222C3320632023434139423545222C0A222C342063202341463831 + 3433222C0A222C3520632023393836303139222C0A222C362063202335433543 + 3543222C0A222C3720632023343037333343222C0A222C382063202341314131 + 4130222C0A222C3920632023413441344134222C0A222C402063202341413734 + 3336222C0A222C2320632023443441463744222C0A222C3B2063202343393941 + 3542222C0A222C3A20632023433739353534222C0A222C3D2063202343383936 + 3538222C0A222C2B20632023414538303431222C0A222C252063202339343543 + 3133222C0A222C2420632023353835383538222C0A222C282063202341354135 + 4135222C0A222C2920632023413536463246222C0A222C5B2063202344324142 + 3738222C0A222C5D20632023443341423738222C0A222D2E2063202344314137 + 3733222C0A222D2C20632023434441303639222C0A222D2D2063202341453746 + 3430222C0A222D2A20632023393135393046222C0A222D612063202337313731 + 3731222C0A222D6220632023353435343534222C0A222D632063202335313531 + 3531222C0A222D6420632023344634463446222C0A222D652063202334433443 + 3443222C0A222D6620632023344134413441222C0A222D672063202334373437 + 3437222C0A222D6820632023343534353435222C0A222D692063202339443637 + 3235222C0A222D6A20632023413837343332222C0A222D6B2063202341463743 + 3344222C0A222D6C20632023423538343437222C0A222D6D2063202342413841 + 3445222C0A222D6E20632023414437453345222C0A222D6F2063202338463537 + 3043222C0A222D7020632023393235413130222C0A222D712063202339303538 + 3044222C0A222D7220632023393235433133222C0A222E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2A222C0A222E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E612E2C2E622E632E64222C0A222E2E + 2E2E2E652E662E672E682E692E6A2E6B2E6C2E6D2E6E2E6F2E702E712E72222C + 0A222E2E2E2E2E732E742E742E752E752E762E762E772E782E792E7A2E412E42 + 2E43222C0A222E2E2E2E2E682E742E442E452E762E462E462E472E482E492E4A + 2E4B2E4C2E4D222C0A222E2E2E2E2E692E752E4E2E4F2E462E502E502E512E52 + 2E4A2E532E542E552E56222C0A222E572E582E592E5A2E302E312E322E332E33 + 2E342E352E362E372E382E392E40222C0A222E232E3B2E3A2E3D2E2B2E252E24 + 2E282E292E5B2E5D2C2E2C2C2C2D2C2A2C61222C0A222C622C632C642C652C66 + 2C672C682C692C6A2C6B2C6C2C6D2C6E2C6F2C702C71222C0A222C722E2B2E25 + 2C732C742C752C762C772C782C792C7A2C412C422C432C442C45222C0A222C46 + 2C472C482C492C4A2C4B2C4C2C782C4D2C4E2C4F2C502C512C522C532C54222C + 0A222E2E2E2E2C552C562C572C582C4D2C4D2C592C5A2C302C312C322C332C34 + 2C35222C0A222E2E2E2E2C362C782C372C382C592C592C392C402C232C3B2C3A + 2C3D2C2B2C25222C0A222E2E2E2E2C242C4D2C4D2C592C392C392C282C292C5B + 2C5D2D2E2D2C2D2D2D2A222C0A222E742D612D622D632D642D652D662D672D68 + 2D692D6A2D6B2D6C2D6D2D6E2D6F222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2D702D712D722D6F227D0A + } + OnClick = AQuitExecute + end + end + object MItems: TMenuItem + Caption = '&Items' + object MINewItem: TMenuItem + Action = ANewItem + Bitmap.Data = { + 36050000424D3605000000000000360400002800000010000000100000000100 + 0800000000000001000000000000000000000000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A6000020400000206000002080000020A0000020C0000020E000004000000040 + 20000040400000406000004080000040A0000040C0000040E000006000000060 + 20000060400000606000006080000060A0000060C0000060E000008000000080 + 20000080400000806000008080000080A0000080C0000080E00000A0000000A0 + 200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0 + 200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0 + 200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000 + 20004000400040006000400080004000A0004000C0004000E000402000004020 + 20004020400040206000402080004020A0004020C0004020E000404000004040 + 20004040400040406000404080004040A0004040C0004040E000406000004060 + 20004060400040606000406080004060A0004060C0004060E000408000004080 + 20004080400040806000408080004080A0004080C0004080E00040A0000040A0 + 200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0 + 200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0 + 200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000 + 20008000400080006000800080008000A0008000C0008000E000802000008020 + 20008020400080206000802080008020A0008020C0008020E000804000008040 + 20008040400080406000804080008040A0008040C0008040E000806000008060 + 20008060400080606000806080008060A0008060C0008060E000808000008080 + 20008080400080806000808080008080A0008080C0008080E00080A0000080A0 + 200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0 + 200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0 + 200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000 + 2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020 + 2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040 + 2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060 + 2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080 + 2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0 + 2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0 + 2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F6F6F6F6F6F6 + F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F618181800F6F6F6F6F6F6F6F6F6F6F6 + 181802180010F6F6F6F6F6F6F6F6F61802022828181800F6F6F6F6F6F6F60202 + 2828302802181800F6F6F6F6F6F600022830BA3028021800F6F6F6F6F6F6FB28 + 30BAFA2828280218F6F6F600F6F60030BA00BABA28282802F6F6F6FB00F6FB28 + 00FBBABABABA2828F6F6F6F6FB000000FBBABABABABABA78F6F6F600F6FBFBFB + 7800000079B9B9F6F6F6F6FBF6FBFBFBB9FBFBFBFA79F6F6F6F6F6F600FBFBFB + 00F6B9B9F6F6F6F6F6F6F600FBF600F6FB00F6F6F6F6F6F6F6F6F6FBF6F6FBF6 + F6FBF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + } + OnClick = ANewItemExecute + end + object MIDeleteItem: TMenuItem + Action = ADeleteItem + Bitmap.Data = { + 36050000424D3605000000000000360400002800000010000000100000000100 + 0800000000000001000000000000000000000000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A6000020400000206000002080000020A0000020C0000020E000004000000040 + 20000040400000406000004080000040A0000040C0000040E000006000000060 + 20000060400000606000006080000060A0000060C0000060E000008000000080 + 20000080400000806000008080000080A0000080C0000080E00000A0000000A0 + 200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0 + 200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0 + 200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000 + 20004000400040006000400080004000A0004000C0004000E000402000004020 + 20004020400040206000402080004020A0004020C0004020E000404000004040 + 20004040400040406000404080004040A0004040C0004040E000406000004060 + 20004060400040606000406080004060A0004060C0004060E000408000004080 + 20004080400040806000408080004080A0004080C0004080E00040A0000040A0 + 200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0 + 200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0 + 200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000 + 20008000400080006000800080008000A0008000C0008000E000802000008020 + 20008020400080206000802080008020A0008020C0008020E000804000008040 + 20008040400080406000804080008040A0008040C0008040E000806000008060 + 20008060400080606000806080008060A0008060C0008060E000808000008080 + 20008080400080806000808080008080A0008080C0008080E00080A0000080A0 + 200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0 + 200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0 + 200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000 + 2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020 + 2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040 + 2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060 + 2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080 + 2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0 + 2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0 + 2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F6F6F6F6F6F6 + F6F6F6F6F6F6F6F6F6F6F6F6F9F9010A00F6F6F600F9F900F6F6F6F6F6F9F9F9 + 0100F6000DF900F6F6F6F6F6F6F6F9F9F90100F9F953F6F6F6F6F6F6F6F6F65C + F9F9F9F954F6F6F6F6F6F6F6F6F65C00F9F9F9F90052F6F6F6F6F6F6F65D00F9 + F91266F9F90049F6F6F6F6F6F600F9F967BF675EF9F900F6F6F6F6F600F9F967 + BF6F66665EF9F9F6F6F6F6F6F9F967BF67BFBF665E66F9F6F6F6F6F6F65D5D6F + BFBFBFBFBF5E66F6F6F6F6F6F66FBFBFBFBFBFBFBFBF6FF6F6F6F6F6F6F66F6F + 777777777777F6F6F6F6F6F6F6F6F677776F6F6F77F6F6F6F6F6F6F6F6F6F6F6 + F67777F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + } + OnClick = ADeleteItemExecute + end + end + object MRun: TMenuItem + Caption = '&Run' + object MITest: TMenuItem + Action = ATest + OnClick = ATestExecute + end + object MIRun: TMenuItem + Action = AExecute + OnClick = ATestExecute + end + end + end + object ALMain: TActionList + Images = ILMain + left = 80 + top = 96 + object ANew: TAction + Category = 'File' + Caption = '&New' + DisableIfNoHandler = True + ImageIndex = 0 + OnExecute = ANewExecute + ShortCut = 16462 + end + object AOpen: TAction + Category = 'File' + Caption = '&Open' + DisableIfNoHandler = True + ImageIndex = 1 + OnExecute = AOpenExecute + ShortCut = 16463 + end + object ASave: TAction + Category = 'File' + Caption = '&Save' + DisableIfNoHandler = True + ImageIndex = 2 + OnExecute = ASaveExecute + OnUpdate = ASaveUpdate + ShortCut = 16467 + end + object ASaveAs: TAction + Category = 'File' + Caption = 'Save &as' + DisableIfNoHandler = True + OnExecute = ASaveAsExecute + end + object AQuit: TAction + Category = 'File' + Caption = '&Quit' + DisableIfNoHandler = True + ImageIndex = 3 + OnExecute = AQuitExecute + ShortCut = 16465 + end + object ANewItem: TAction + Category = 'Items' + Caption = '&New' + DisableIfNoHandler = True + ImageIndex = 4 + OnExecute = ANewItemExecute + ShortCut = 16449 + end + object ADeleteItem: TAction + Category = 'Items' + Caption = '&Delete' + DisableIfNoHandler = True + ImageIndex = 5 + OnExecute = ADeleteItemExecute + OnUpdate = ADeleteItemUpdate + ShortCut = 16452 + end + object ATest: TAction + Category = 'Execute' + Caption = '&Test configuration' + DisableIfNoHandler = True + OnExecute = ATestExecute + ShortCut = 16468 + end + object AExecute: TAction + Category = 'Execute' + Caption = '&Run with configuration' + DisableIfNoHandler = True + OnExecute = ATestExecute + OnUpdate = AExecuteUpdate + ShortCut = 16453 + end + end + object SDConfig: TSaveDialog + Title = 'Save configuration file as' + Filter = 'Configuration files|*.cfg|All files|*.*' + FilterIndex = 0 + Options = [ofOverwritePrompt, ofPathMustExist, ofEnableSizing, ofViewDetail] + left = 120 + top = 64 + end + object ODConfig: TOpenDialog + Title = 'Open existing configuration file' + Filter = 'Configuration files|*.cfg|All files|*.*' + FilterIndex = 0 + Options = [ofFileMustExist, ofEnableSizing, ofViewDetail] + left = 120 + top = 96 + end + object ILMain: TImageList + left = 42 + top = 66 + Bitmap = { + 6C69060000001000000010000000E10C00002F2A2058504D202A2F0A73746174 + 69632063686172202A677261706869635B5D203D207B0A223136203136203136 + 372032222C0A222E2E2063204E6F6E65222C0A222E2C20632023344438424338 + 222C0A222E2D20632023344638434338222C0A222E2A20632023344638444338 + 222C0A222E6120632023344638434339222C0A222E6220632023344638424337 + 222C0A222E6320632023344238394335222C0A222E6420632023334237364334 + 222C0A222E6520632023343938354334222C0A222E6620632023454346324637 + 222C0A222E6720632023454546344638222C0A222E6820632023454446344638 + 222C0A222E6920632023454446334638222C0A222E6A20632023454346324638 + 222C0A222E6B20632023443745364632222C0A222E6C20632023374442324532 + 222C0A222E6D20632023363539344442222C0A222E6E20632023344238384335 + 222C0A222E6F20632023463246364641222C0A222E7020632023433745304641 + 222C0A222E7120632023433945314642222C0A222E7220632023433945324642 + 222C0A222E7320632023433845304642222C0A222E7420632023433544464639 + 222C0A222E7520632023433144424638222C0A222E7620632023423844364634 + 222C0A222E7720632023463846424646222C0A222E7820632023423444384636 + 222C0A222E7920632023374442304531222C0A222E7A20632023363439324442 + 222C0A222E4120632023344338394336222C0A222E4220632023463146354639 + 222C0A222E4320632023434445334643222C0A222E4420632023434545334642 + 222C0A222E4520632023434445334642222C0A222E4620632023434245324642 + 222C0A222E4720632023433845304639222C0A222E4820632023433244434638 + 222C0A222E4920632023424144364635222C0A222E4A20632023463846424644 + 222C0A222E4B20632023434445364643222C0A222E4C20632023433945354641 + 222C0A222E4D20632023383442364532222C0A222E4E20632023343237394246 + 222C0A222E4F20632023344238394336222C0A222E5020632023434645334643 + 222C0A222E5120632023443045344642222C0A222E5220632023434645344643 + 222C0A222E5320632023434145314641222C0A222E5420632023433444444639 + 222C0A222E5520632023424344394636222C0A222E5620632023444645394634 + 222C0A222E5720632023463346374642222C0A222E5820632023453945464635 + 222C0A222E5920632023343537454332222C0A222E5A20632023463046344639 + 222C0A222E3020632023443345364643222C0A222E3120632023443445364643 + 222C0A222E3220632023443345374644222C0A222E3320632023443145344643 + 222C0A222E3420632023433845304641222C0A222E3520632023424244364635 + 222C0A222E3620632023423544344633222C0A222E3720632023423344324631 + 222C0A222E3820632023463046344638222C0A222E3920632023343638324334 + 222C0A222E4020632023344138384336222C0A222E2320632023454646344639 + 222C0A222E3B20632023443745374645222C0A222E3A20632023443645374644 + 222C0A222E3D20632023443545374644222C0A222E2B20632023443445364644 + 222C0A222E2520632023443245364643222C0A222E2420632023434345314642 + 222C0A222E2820632023433744464641222C0A222E2920632023424444414636 + 222C0A222E5B20632023424244384636222C0A222E5D20632023454646344641 + 222C0A222C2E20632023343638334336222C0A222C2C20632023343938384336 + 222C0A222C2D20632023454446344639222C0A222C2A20632023443845384645 + 222C0A222C6120632023443745384645222C0A222C6220632023443645374645 + 222C0A222C6320632023443345354644222C0A222C6420632023433344444639 + 222C0A222C6520632023454446344641222C0A222C6620632023343538324336 + 222C0A222C6720632023343738344336222C0A222C6820632023454346334639 + 222C0A222C6920632023443645384645222C0A222C6A20632023434345334642 + 222C0A222C6B20632023433644464641222C0A222C6C20632023454146324641 + 222C0A222C6D20632023343238304336222C0A222C6E20632023343538324335 + 222C0A222C6F20632023454246324638222C0A222C7020632023443545364644 + 222C0A222C7120632023434445324643222C0A222C7220632023434245314642 + 222C0A222C7320632023463246374642222C0A222C7420632023334637434335 + 222C0A222C7520632023343238304335222C0A222C7620632023453846314638 + 222C0A222C7720632023443545354645222C0A222C7820632023443345354643 + 222C0A222C7920632023434545324643222C0A222C7A20632023434345324643 + 222C0A222C4120632023433945304642222C0A222C4220632023433845314642 + 222C0A222C4320632023463746414644222C0A222C4420632023334237364331 + 222C0A222C4520632023343037434334222C0A222C4620632023453646304637 + 222C0A222C4720632023353542344638222C0A222C4820632023353642344637 + 222C0A222C4920632023353442354637222C0A222C4A20632023353342344638 + 222C0A222C4B20632023353342324638222C0A222C4C20632023353242334637 + 222C0A222C4D20632023353142324637222C0A222C4E20632023344642324637 + 222C0A222C4F20632023463546394643222C0A222C5020632023333636464246 + 222C0A222C5120632023334337384331222C0A222C5220632023453345444637 + 222C0A222C5320632023364543324644222C0A222C5420632023413044384646 + 222C0A222C5520632023394544374646222C0A222C5620632023394244364646 + 222C0A222C5720632023393844374646222C0A222C5820632023393644364646 + 222C0A222C5920632023393544364646222C0A222C5A20632023393444354646 + 222C0A222C3020632023393344344646222C0A222C3120632023363542454642 + 222C0A222C3220632023463446374642222C0A222C3320632023333136374242 + 222C0A222C3420632023333837314246222C0A222C3520632023444645424635 + 222C0A222C3620632023363842464644222C0A222C3720632023363742444643 + 222C0A222C3820632023363442454643222C0A222C3920632023363242444643 + 222C0A222C4020632023363342444642222C0A222C2320632023363142434642 + 222C0A222C3B20632023363042454643222C0A222C3A20632023363242434643 + 222C0A222C3D20632023324436344239222C0A222C2B20632023333336394243 + 222C0A222C2520632023454146314638222C0A222C2420632023444645434637 + 222C0A222C2820632023444545424636222C0A222C2920632023444545414636 + 222C0A222C5B20632023444345414636222C0A222C5D20632023454246334641 + 222C0A222D2E20632023463346374643222C0A222D2C20632023463446384643 + 222C0A222D2D20632023464446454645222C0A222D2A20632023324136304237 + 222C0A222D6120632023333036354241222C0A222D6220632023333136364242 + 222C0A222D6320632023333036364241222C0A222D6420632023324636354241 + 222C0A222D6520632023324536354239222C0A222D6620632023324536344239 + 222C0A222D6720632023324336324237222C0A222E2E2E2E2E2C2E2D2E2D2E2D + 2E2D2E2A2E612E622E632E642E2E2E2E2E2E2E2E222C0A222E2E2E652E662E67 + 2E682E692E692E692E6A2E662E6B2E6C2E6D2E2E2E2E2E2E222C0A222E2E2E6E + 2E6F2E702E712E722E732E742E752E762E772E782E792E7A2E2E2E2E222C0A22 + 2E2E2E412E422E432E442E452E462E472E482E492E4A2E4B2E4C2E4D2E4E2E2E + 222C0A222E2E2E4F2E422E502E512E522E432E532E542E552E562E662E572E58 + 2E592E2E222C0A222E2E2E4F2E5A2E302E312E322E332E452E342E482E352E36 + 2E372E382E392E2E222C0A222E2E2E402E232E3B2E3A2E3D2E2B2E252E242E28 + 2E482E292E5B2E5D2C2E2E2E222C0A222E2E2C2C2C2D2C2A2C2A2C612C622C63 + 2E332E242E702C642E482C652C662E2E222C0A222E2E2C672C682C692C612E3A + 2E3A2E3D2C632E512C6A2E282C6B2C6C2C6D2E2E222C0A222E2E2C6E2C6F2C62 + 2E3A2E3A2E3A2C702C632E332C712C722E712C732C742E2E222C0A222E2E2C75 + 2C762C772C632C632C782C782E332C792C7A2C412C422C432C442E2E222C0A22 + 2E2E2C452C462C472C482C492C4A2C4B2C4C2C4C2C4D2C4E2C4E2C4F2C502E2E + 222C0A222E2E2C512C522C532C542C552C562C572C582C592C5A2C302C312C32 + 2C332E2E222C0A222E2E2C342C352C362C372C312C382C382C392C402C232C3B + 2C3A2E4A2C3D2E2E222C0A222E2E2C2B2C252C242C282C292C5B2C5B2C5D2C5D + 2C6C2D2E2D2C2D2D2D2A2E2E222C0A222E2E2E2E2D612D622D632D632D632D61 + 2D642D652D652D662D662D672E2E2E2E227D0A610D00002F2A2058504D202A2F + 0A7374617469632063686172202A677261706869635B5D203D207B0A22313620 + 3136203137352032222C0A222E2E2063204E6F6E65222C0A222E2C2063202339 + 4443334541222C0A222E2D20632023393642464536222C0A222E2A2063202339 + 3242424534222C0A222E6120632023364341304431222C0A222E622063202336 + 4439454430222C0A222E6320632023354639364343222C0A222E642063202339 + 3642454535222C0A222E6520632023464546464646222C0A222E662063202345 + 3946334644222C0A222E6720632023454146334644222C0A222E682063202345 + 3846324643222C0A222E6920632023453345464641222C0A222E6A2063202345 + 3746324641222C0A222E6B20632023383842424541222C0A222E6C2063202335 + 3538354346222C0A222E6D20632023393342424534222C0A222E6E2063202345 + 4446354645222C0A222E6F20632023433544454643222C0A222E702063202343 + 3745304642222C0A222E7120632023433244434639222C0A222E722063202342 + 3444334635222C0A222E7320632023463346394645222C0A222E742063202343 + 3445324641222C0A222E7520632023393343314543222C0A222E762063202334 + 3837444333222C0A222E7720632023463046364645222C0A222E782063202343 + 4445324643222C0A222E7920632023434445334643222C0A222E7A2063202343 + 3844464641222C0A222E4120632023424344394637222C0A222E422063202344 + 4445394635222C0A222E4320632023454246334641222C0A222E442063202346 + 3346384642222C0A222E4520632023353338334341222C0A222E462063202346 + 3146374645222C0A222E4720632023443245354643222C0A222E482063202344 + 3145344643222C0A222E4920632023434345324642222C0A222E4A2063202343 + 3444444639222C0A222E4B20632023424244374636222C0A222E4C2063202341 + 4644314633222C0A222E4D20632023453445464641222C0A222E4E2063202335 + 3838374343222C0A222E4F20632023443942343334222C0A222E502063202345 + 3143323545222C0A222E5120632023453243333630222C0A222E522063202345 + 3243333546222C0A222E5320632023393142424534222C0A222E542063202346 + 3246374646222C0A222E5520632023443545374645222C0A222E562063202344 + 3145354644222C0A222E5720632023434145304641222C0A222E582063202343 + 3444454639222C0A222E5920632023453746324644222C0A222E5A2063202335 + 3738374343222C0A222E3020632023444142333336222C0A222E312063202346 + 4546454644222C0A222E3220632023464646464645222C0A222E332063202346 + 4646454645222C0A222E3420632023464646454644222C0A222E352063202339 + 3142414534222C0A222E3620632023463046374646222C0A222E372063202344 + 3545374646222C0A222E3820632023443645374644222C0A222E392063202344 + 3445364644222C0A222E4020632023443045344643222C0A222E232063202343 + 4245334642222C0A222E3B20632023433244434641222C0A222E3A2063202345 + 3846334645222C0A222E3D20632023353638364343222C0A222E2B2063202344 + 4141463335222C0A222E2520632023464546434637222C0A222E242063202346 + 3845343845222C0A222E2820632023463544453931222C0A222E292063202346 + 3545303946222C0A222E5B20632023463645314143222C0A222E5D2063202335 + 3238344341222C0A222C2E20632023463146374646222C0A222C2C2063202344 + 3945394646222C0A222C2D20632023444245414646222C0A222C2A2063202344 + 3745374646222C0A222C6120632023443245354646222C0A222C622063202343 + 4245324646222C0A222C6320632023353538354342222C0A222C642063202344 + 4141413336222C0A222C6520632023464446414631222C0A222C662063202346 + 3544453934222C0A222C6720632023463444433933222C0A222C682063202345 + 3942433634222C0A222C6920632023444139343335222C0A222C6A2063202345 + 4646364642222C0A222C6B20632023353538334343222C0A222C6C2063202344 + 4141423335222C0A222C6D20632023464246364538222C0A222C6E2063202345 + 3742433730222C0A222C6F20632023453241413535222C0A222C702063202345 + 3041353444222C0A222C7120632023454243393931222C0A222C722063202345 + 4646334641222C0A222C7320632023464446454644222C0A222C742063202346 + 4346444646222C0A222C7520632023464346444645222C0A222C762063202346 + 4246434645222C0A222C7720632023464446454645222C0A222C782063202345 + 3846324546222C0A222C7920632023353638314345222C0A222C7A2063202344 + 4141363337222C0A222C4120632023464646444638222C0A222C422063202346 + 4646444636222C0A222C4320632023464646434635222C0A222C442063202346 + 4546434633222C0A222C4520632023463445343941222C0A222C462063202346 + 3745363941222C0A222C4720632023463645363942222C0A222C482063202346 + 3545353944222C0A222C4920632023463545353945222C0A222C4A2063202346 + 3445353946222C0A222C4B20632023463846334441222C0A222C4C2063202345 + 4546344644222C0A222C4D20632023353438304341222C0A222C4E2063202344 + 4141313336222C0A222C4F20632023464546434636222C0A222C502063202346 + 3845353934222C0A222C5120632023463845353933222C0A222C522063202346 + 3845353931222C0A222C5320632023453944423933222C0A222C542063202345 + 3344373933222C0A222C5520632023444344323933222C0A222C562063202344 + 3743453930222C0A222C5720632023434643383843222C0A222C582063202343 + 3643313836222C0A222C5920632023443644384339222C0A222C5A2063202334 + 3437344335222C0A222C3020632023353337464341222C0A222C312063202344 + 4139413336222C0A222C3220632023464446414632222C0A222C332063202346 + 3845363934222C0A222C3420632023463845353932222C0A222C352063202346 + 3845353930222C0A222C3620632023463845333842222C0A222C372063202346 + 3745323836222C0A222C3820632023463745313746222C0A222C392063202346 + 3644453737222C0A222C4020632023463644433643222C0A222C232063202346 + 3444393545222C0A222C3B20632023463344353446222C0A222C3A2063202346 + 4246324343222C0A222C3D20632023464546414546222C0A222C2B2063202346 + 3845343846222C0A222C2520632023463845333839222C0A222C242063202346 + 3745313832222C0A222C2820632023463744463741222C0A222C292063202346 + 3644453731222C0A222C5B20632023463544423637222C0A222C5D2063202346 + 3444383542222C0A222D2E20632023463344343444222C0A222D2C2063202346 + 3244313430222C0A222D2D20632023464246324341222C0A222D2A2063202344 + 3938453333222C0A222D6120632023464146304443222C0A222D622063202346 + 3645313938222C0A222D6320632023463645303935222C0A222D642063202346 + 3644463932222C0A222D6520632023463544453845222C0A222D662063202346 + 3544433839222C0A222D6720632023463444413835222C0A222D682063202346 + 3444393830222C0A222D6920632023463344373741222C0A222D6A2063202346 + 3344353734222C0A222D6B20632023463244333730222C0A222D6C2063202346 + 3845414332222C0A222D6D20632023443838363243222C0A222D6E2063202344 + 3838383244222C0A222D6F20632023443838373244222C0A222E2E2E2E2E2E2E + 2E2E2E2E2E2E2C2E2D2E2A2E2A2E612E622E632E2E2E2E2E2E222C0A222E2E2E + 2E2E2E2E2E2E2E2E2E2E642E652E662E672E682E692E6A2E6B2E6C2E2E222C0A + 222E2E2E2E2E2E2E2E2E2E2E2E2E6D2E6E2E6F2E702E712E722E732E742E752E + 76222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2A2E772E782E792E7A2E412E422E + 432E442E45222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2A2E462E472E482E492E + 4A2E4B2E4C2E4D2E4E222C0A222E4F2E502E512E512E512E522E532E542E552E + 552E562E572E582E412E592E5A222C0A222E302E312E322E332E342E322E352E + 362E372E382E392E402E232E3B2E3A2E3D222C0A222E2B2E252E242E282E292E + 5B2E5D2C2E2C2C2C2D2C2C2C2A2C612C622C2E2C63222C0A222C642C652C662C + 672C682C692C692C692C692C692C692C692C692C692C6A2C6B222C0A222C6C2C + 6D2C6E2C6F2C702C712C722C732C742C742C752C762C772C692C782C79222C0A + 222C7A2E322C412C422C432C442C452C462C472C482C492C4A2C4B2C692C4C2C + 4D222C0A222C4E2C4F2C502C512C512C522C532C542C552C562C572C582C592C + 692C5A2C30222C0A222C312C322C332C342C352C362C372C382C392C402C232C + 3B2C3A2C692E2E2E2E222C0A222C692C3D2C512C2B2C252C242C282C292C5B2C + 5D2D2E2D2C2D2D2C692E2E2E2E222C0A222D2A2D612D622D632D642D652D662D + 672D682D692D6A2D6B2D6C2C692E2E2E2E222C0A222D6D2D6E2D6F2D6E2D6E2D + 6E2D6E2D6E2D6E2D6E2D6E2D6F2D6E2D6D2E2E2E2E227D0A010C00002F2A2058 + 504D202A2F0A7374617469632063686172202A677261706869635B5D203D207B + 0A223136203136203135332032222C0A222E2E2063204E6F6E65222C0A222E2C + 20632023333636424243222C0A222E2D20632023333636424242222C0A222E2A + 20632023333636414242222C0A222E6120632023333936434243222C0A222E62 + 20632023334236454244222C0A222E6320632023334136444242222C0A222E64 + 20632023333836424242222C0A222E6520632023334537304242222C0A222E66 + 20632023443145304636222C0A222E6720632023443145304637222C0A222E68 + 20632023463846424645222C0A222E6920632023463746424645222C0A222E6A + 20632023463646394644222C0A222E6B20632023463046354643222C0A222E6C + 20632023454146304641222C0A222E6D20632023454446324642222C0A222E6E + 20632023463746414644222C0A222E6F20632023454246314642222C0A222E70 + 20632023444645394638222C0A222E7120632023424444304543222C0A222E72 + 20632023354538394339222C0A222E7320632023443144464636222C0A222E74 + 20632023383041414539222C0A222E7520632023463646414645222C0A222E76 + 20632023463646414644222C0A222E7720632023363438434338222C0A222E78 + 20632023454546334642222C0A222E7920632023454146314642222C0A222E7A + 20632023463246364643222C0A222E4120632023463146364643222C0A222E42 + 20632023453245434639222C0A222E4320632023444245374638222C0A222E44 + 20632023424144304545222C0A222E4520632023443044464636222C0A222E46 + 20632023374541384538222C0A222E4720632023453946314641222C0A222E48 + 20632023454546344642222C0A222E4920632023453846304641222C0A222E4A + 20632023444445384638222C0A222E4B20632023444245364637222C0A222E4C + 20632023374141334531222C0A222E4D20632023433344354546222C0A222E4E + 20632023333536394237222C0A222E4F20632023434344444635222C0A222E50 + 20632023374541384537222C0A222E5120632023363638444339222C0A222E52 + 20632023453946304641222C0A222E5320632023463346384644222C0A222E54 + 20632023463846414645222C0A222E5520632023454646344643222C0A222E56 + 20632023444645394639222C0A222E5720632023444245374637222C0A222E58 + 20632023443945354637222C0A222E5920632023373841324530222C0A222E5A + 20632023413943324537222C0A222E3020632023333536384236222C0A222E31 + 20632023433944434634222C0A222E3220632023374441374537222C0A222E33 + 20632023453145434639222C0A222E3420632023453345444639222C0A222E35 + 20632023454546344643222C0A222E3620632023463346374644222C0A222E37 + 20632023453545444641222C0A222E3820632023443845354636222C0A222E39 + 20632023373741304445222C0A222E4020632023413442454534222C0A222E23 + 20632023333436374234222C0A222E3B20632023433744394634222C0A222E3A + 20632023374441364536222C0A222E3D20632023363538444339222C0A222E2B + 20632023363738454339222C0A222E2520632023364339324342222C0A222E24 + 20632023364439324342222C0A222E2820632023363939304341222C0A222E29 + 20632023363538434338222C0A222E5B20632023373439434441222C0A222E5D + 20632023394642414531222C0A222C2E20632023333436364233222C0A222C2C + 20632023433544384632222C0A222C2D20632023374241344533222C0A222C2A + 20632023374141334533222C0A222C6120632023374141344533222C0A222C62 + 20632023374241344532222C0A222C6320632023374241334532222C0A222C64 + 20632023374241334531222C0A222C6520632023373941324531222C0A222C66 + 20632023373741304446222C0A222C6720632023373639464445222C0A222C68 + 20632023373439454444222C0A222C6920632023373239434442222C0A222C6A + 20632023373439444443222C0A222C6B20632023394142354444222C0A222C6C + 20632023333436354231222C0A222C6D20632023433244354632222C0A222C6E + 20632023373841314530222C0A222C6F20632023373539454445222C0A222C70 + 20632023373339424441222C0A222C7120632023373339424439222C0A222C72 + 20632023393542304441222C0A222C7320632023333336344146222C0A222C74 + 20632023424544324630222C0A222C7520632023374141334532222C0A222C76 + 20632023373739464445222C0A222C7720632023373639464444222C0A222C78 + 20632023373239424439222C0A222C7920632023373139394438222C0A222C7A + 20632023373039394436222C0A222C4120632023384541424435222C0A222C42 + 20632023333336334144222C0A222C4320632023333636414241222C0A222C44 + 20632023424244304546222C0A222C4520632023374141324532222C0A222C46 + 20632023364439364433222C0A222C4720632023384141374432222C0A222C48 + 20632023333236324142222C0A222C4920632023423843454546222C0A222C4A + 20632023463746414645222C0A222C4B20632023383843303632222C0A222C4C + 20632023364139334346222C0A222C4D20632023383441334345222C0A222C4E + 20632023333236314141222C0A222C4F20632023333836434242222C0A222C50 + 20632023423643434545222C0A222C5120632023374141324531222C0A222C52 + 20632023433244434246222C0A222C5320632023363839304344222C0A222C54 + 20632023383139454343222C0A222C5520632023333236314138222C0A222C56 + 20632023333736424241222C0A222C5720632023423343414544222C0A222C58 + 20632023374141324530222C0A222C5920632023363538444341222C0A222C5A + 20632023374339424339222C0A222C3020632023333136304137222C0A222C31 + 20632023333536414241222C0A222C3220632023414443364542222C0A222C33 + 20632023414443354541222C0A222C3420632023374339414338222C0A222C35 + 20632023373939384337222C0A222C3620632023333536394239222C0A222C37 + 20632023333536394238222C0A222C3820632023333536384237222C0A222C39 + 20632023333536384235222C0A222C4020632023333436364232222C0A222C23 + 20632023333336354230222C0A222C3B20632023333336344145222C0A222C3A + 20632023333236334143222C0A222C3D20632023333236324141222C0A222C2B + 20632023333236314139222C0A222C2520632023333136304138222C0A222C24 + 20632023333136304136222C0A222C2820632023333136314138222C0A222E2E + 2E2C2E2C2E2C2E2C2E2D2E2D2E2A2E2A2E612E622E632E642E652E2E2E2E222C + 0A222E2C2E662E672E682E692E6A2E6B2E6C2E6D2E6A2E6E2E6F2E702E712E72 + 2E2E222C0A222E2C2E732E742E752E762E772E782E792E7A2E682E412E422E43 + 2E442E712E65222C0A222E2C2E452E462E412E412E772E472E482E6E2E6A2E49 + 2E4A2E4B2E4C2E4D2E4E222C0A222E2C2E4F2E502E492E492E512E522E532E54 + 2E552E562E572E582E592E5A2E30222C0A222E2D2E312E322E332E332E342E35 + 2E6E2E362E372E572E582E382E392E402E23222C0A222E2D2E3B2E3A2E772E3D + 2E2B2E252E242E282E292E772E772E772E5B2E5D2C2E222C0A222E2A2C2C2C2D + 2C2A2C612C622C632C642C652C662C672C682C692C6A2C6B2C6C222C0A222E2A + 2C6D2C2A2C2A2C632C632C622C652C6E2E392C6F2C6A2C702C712C722C73222C + 0A222E2A2C742C752C752E4C2C632C642C6E2C762C772C6A2C782C792C7A2C41 + 2C42222C0A222C432C442C452E682E682E682E682E682E682E682E682E682E68 + 2C462C472C48222C0A222E642C492C652C4A2C4B2C4B2C4B2C4B2C4B2C4B2C4B + 2C4B2E6A2C4C2C4D2C4E222C0A222C4F2C502C512C4A2C522C522C522C522C52 + 2C522C522C522E6A2C532C542C55222C0A222C562C572C582C4A2C4B2C4B2C4B + 2C4B2C4B2C4B2C4B2C4B2E6A2C592C5A2C30222C0A222C312C322C332E682E68 + 2E682E682E682E682E682E682E682E682C342C352C30222C0A222C432C362C37 + 2C382C392E232C402C232C3B2C3A2C3D2C2B2C252C302C242C28227D0A910D00 + 002F2A2058504D202A2F0A7374617469632063686172202A677261706869635B + 5D203D207B0A223136203136203137382032222C0A222E2E2063204E6F6E6522 + 2C0A222E2C20632023443439433644222C0A222E2D2063202344323941364122 + 2C0A222E2A20632023434639373636222C0A222E612063202344363945373022 + 2C0A222E6220632023444142313835222C0A222E632063202342393931354122 + 2C0A222E6420632023434239333630222C0A222E652063202338303830383022 + 2C0A222E6620632023374537453745222C0A222E672063202337433743374322 + 2C0A222E6820632023374137413741222C0A222E692063202337373737373722 + 2C0A222E6A20632023373537353735222C0A222E6B2063202337323732373222 + 2C0A222E6C20632023443439453731222C0A222E6D2063202344363945364622 + 2C0A222E6E20632023444342323837222C0A222E6F2063202345384433414222 + 2C0A222E7020632023453644304139222C0A222E712063202342383930353822 + 2C0A222E7220632023433638453539222C0A222E732063202337443744374422 + 2C0A222E7420632023393939393939222C0A222E752063202339413941394122 + 2C0A222E7620632023394239423942222C0A222E772063202344333944364622 + 2C0A222E7820632023453744314141222C0A222E792063202345374431414222 + 2C0A222E7A20632023453143373938222C0A222E412063202344454332393122 + 2C0A222E4220632023423738463536222C0A222E432063202343313839353222 + 2C0A222E4420632023353939313532222C0A222E452063202339393941393922 + 2C0A222E4620632023394339433943222C0A222E472063202344303941364322 + 2C0A222E4820632023453543454137222C0A222E492063202344464331384622 + 2C0A222E4A20632023444342443839222C0A222E4B2063202344434244384222 + 2C0A222E4C20632023423638443533222C0A222E4D2063202342433834344222 + 2C0A222E4E20632023343538413344222C0A222E4F2063202334463841343922 + 2C0A222E5020632023394439443944222C0A222E512063202343433936363622 + 2C0A222E5220632023453343424132222C0A222E532063202344414239383322 + 2C0A222E5420632023444142393834222C0A222E552063202342353842353122 + 2C0A222E5620632023423637453433222C0A222E572063202334443934343422 + 2C0A222E5820632023344239313432222C0A222E592063202334383844334622 + 2C0A222E5A20632023343538393344222C0A222E302063202336354134354422 + 2C0A222E3120632023363141303541222C0A222E322063202334423833343522 + 2C0A222E3320632023394539453945222C0A222E342063202343393932363022 + 2C0A222E3520632023453243373945222C0A222E362063202344414238383322 + 2C0A222E3720632023443742343744222C0A222E382063202344374233374522 + 2C0A222E3920632023423438393446222C0A222E402063202342313739334222 + 2C0A222E2320632023344139303431222C0A222E3B2063202339464432393422 + 2C0A222E3A20632023394144303931222C0A222E3D2063202339364344384422 + 2C0A222E2B20632023393243423839222C0A222E252063202338444338383422 + 2C0A222E2420632023353839383531222C0A222E282063202334363743343122 + 2C0A222E2920632023394639463946222C0A222E5B2063202343343845354122 + 2C0A222E5D20632023453043333938222C0A222C2E2063202344374233374322 + 2C0A222C2C20632023443641463734222C0A222C2D2063202345444334354522 + 2C0A222C2A20632023423338383442222C0A222C612063202341423733333422 + 2C0A222C6220632023343638423345222C0A222C632063202339394345384622 + 2C0A222C6420632023383743363744222C0A222C652063202338314333373822 + 2C0A222C6620632023374343303733222C0A222C672063202337434330373422 + 2C0A222C6820632023383143323739222C0A222C692063202334463930343922 + 2C0A222C6A20632023353737463534222C0A222C6B2063202342463839353422 + 2C0A222C6C20632023444442463934222C0A222C6D2063202344344144373522 + 2C0A222C6E20632023453142383633222C0A222C6F2063202346464434344222 + 2C0A222C7020632023423838423432222C0A222C712063202341363645324322 + 2C0A222C7220632023343238373342222C0A222C732063202338384336383022 + 2C0A222C7420632023383343333742222C0A222C752063202337464331373722 + 2C0A222C7620632023344438463437222C0A222C772063202333463734334222 + 2C0A222C7820632023413141314131222C0A222C792063202342413834344322 + 2C0A222C7A20632023444242423844222C0A222C412063202344314138364522 + 2C0A222C4220632023443141363636222C0A222C432063202344464234354622 + 2C0A222C4420632023423138353437222C0A222C452063202341313639323522 + 2C0A222C4620632023334538323337222C0A222C472063202333423745333422 + 2C0A222C4820632023333737393331222C0A222C492063202333343735324522 + 2C0A222C4A20632023353039313439222C0A222C4B2063202334433846343622 + 2C0A222C4C20632023334437333339222C0A222C4D2063202341324132413222 + 2C0A222C4E20632023423437453435222C0A222C4F2063202344394237383822 + 2C0A222C5020632023434641333637222C0A222C512063202343433945363122 + 2C0A222C5220632023434339463633222C0A222C532063202342313833343522 + 2C0A222C5420632023394336343146222C0A222C552063202336303630363022 + 2C0A222C5620632023413041304130222C0A222C572063202334313736334422 + 2C0A222C5820632023333937313336222C0A222C592063202341334133413322 + 2C0A222C5A20632023423037393344222C0A222C302063202344374233383222 + 2C0A222C3120632023434339463632222C0A222C322063202343393941354122 + 2C0A222C3320632023434139423545222C0A222C342063202341463831343322 + 2C0A222C3520632023393836303139222C0A222C362063202335433543354322 + 2C0A222C3720632023343037333343222C0A222C382063202341314131413022 + 2C0A222C3920632023413441344134222C0A222C402063202341413734333622 + 2C0A222C2320632023443441463744222C0A222C3B2063202343393941354222 + 2C0A222C3A20632023433739353534222C0A222C3D2063202343383936353822 + 2C0A222C2B20632023414538303431222C0A222C252063202339343543313322 + 2C0A222C2420632023353835383538222C0A222C282063202341354135413522 + 2C0A222C2920632023413536463246222C0A222C5B2063202344324142373822 + 2C0A222C5D20632023443341423738222C0A222D2E2063202344314137373322 + 2C0A222D2C20632023434441303639222C0A222D2D2063202341453746343022 + 2C0A222D2A20632023393135393046222C0A222D612063202337313731373122 + 2C0A222D6220632023353435343534222C0A222D632063202335313531353122 + 2C0A222D6420632023344634463446222C0A222D652063202334433443344322 + 2C0A222D6620632023344134413441222C0A222D672063202334373437343722 + 2C0A222D6820632023343534353435222C0A222D692063202339443637323522 + 2C0A222D6A20632023413837343332222C0A222D6B2063202341463743334422 + 2C0A222D6C20632023423538343437222C0A222D6D2063202342413841344522 + 2C0A222D6E20632023414437453345222C0A222D6F2063202338463537304322 + 2C0A222D7020632023393235413130222C0A222D712063202339303538304422 + 2C0A222D7220632023393235433133222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2A222C0A222E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E612E2C2E622E632E64222C0A222E2E2E2E2E + 652E662E672E682E692E6A2E6B2E6C2E6D2E6E2E6F2E702E712E72222C0A222E + 2E2E2E2E732E742E742E752E752E762E762E772E782E792E7A2E412E422E4322 + 2C0A222E2E2E2E2E682E742E442E452E762E462E462E472E482E492E4A2E4B2E + 4C2E4D222C0A222E2E2E2E2E692E752E4E2E4F2E462E502E502E512E522E4A2E + 532E542E552E56222C0A222E572E582E592E5A2E302E312E322E332E332E342E + 352E362E372E382E392E40222C0A222E232E3B2E3A2E3D2E2B2E252E242E282E + 292E5B2E5D2C2E2C2C2C2D2C2A2C61222C0A222C622C632C642C652C662C672C + 682C692C6A2C6B2C6C2C6D2C6E2C6F2C702C71222C0A222C722E2B2E252C732C + 742C752C762C772C782C792C7A2C412C422C432C442C45222C0A222C462C472C + 482C492C4A2C4B2C4C2C782C4D2C4E2C4F2C502C512C522C532C54222C0A222E + 2E2E2E2C552C562C572C582C4D2C4D2C592C5A2C302C312C322C332C342C3522 + 2C0A222E2E2E2E2C362C782C372C382C592C592C392C402C232C3B2C3A2C3D2C + 2B2C25222C0A222E2E2E2E2C242C4D2C4D2C592C392C392C282C292C5B2C5D2D + 2E2D2C2D2D2D2A222C0A222E742D612D622D632D642D652D662D672D682D692D + 6A2D6B2D6C2D6D2D6E2D6F222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2D702D712D722D6F227D0A36050000424D3605000000000000 + 3604000028000000100000001000000001000800000000000001000000000000 + 0000000000000000000000000000000000008000008000000080800080000000 + 8000800080800000C0C0C000C0DCC000F0CAA600002040000020600000208000 + 0020A0000020C0000020E0000040000000402000004040000040600000408000 + 0040A0000040C0000040E0000060000000602000006040000060600000608000 + 0060A0000060C0000060E0000080000000802000008040000080600000808000 + 0080A0000080C0000080E00000A0000000A0200000A0400000A0600000A08000 + 00A0A00000A0C00000A0E00000C0000000C0200000C0400000C0600000C08000 + 00C0A00000C0C00000C0E00000E0000000E0200000E0400000E0600000E08000 + 00E0A00000E0C00000E0E0004000000040002000400040004000600040008000 + 4000A0004000C0004000E0004020000040202000402040004020600040208000 + 4020A0004020C0004020E0004040000040402000404040004040600040408000 + 4040A0004040C0004040E0004060000040602000406040004060600040608000 + 4060A0004060C0004060E0004080000040802000408040004080600040808000 + 4080A0004080C0004080E00040A0000040A0200040A0400040A0600040A08000 + 40A0A00040A0C00040A0E00040C0000040C0200040C0400040C0600040C08000 + 40C0A00040C0C00040C0E00040E0000040E0200040E0400040E0600040E08000 + 40E0A00040E0C00040E0E0008000000080002000800040008000600080008000 + 8000A0008000C0008000E0008020000080202000802040008020600080208000 + 8020A0008020C0008020E0008040000080402000804040008040600080408000 + 8040A0008040C0008040E0008060000080602000806040008060600080608000 + 8060A0008060C0008060E0008080000080802000808040008080600080808000 + 8080A0008080C0008080E00080A0000080A0200080A0400080A0600080A08000 + 80A0A00080A0C00080A0E00080C0000080C0200080C0400080C0600080C08000 + 80C0A00080C0C00080C0E00080E0000080E0200080E0400080E0600080E08000 + 80E0A00080E0C00080E0E000C0000000C0002000C0004000C0006000C0008000 + C000A000C000C000C000E000C0200000C0202000C0204000C0206000C0208000 + C020A000C020C000C020E000C0400000C0402000C0404000C0406000C0408000 + C040A000C040C000C040E000C0600000C0602000C0604000C0606000C0608000 + C060A000C060C000C060E000C0800000C0802000C0804000C0806000C0808000 + C080A000C080C000C080E000C0A00000C0A02000C0A04000C0A06000C0A08000 + C0A0A000C0A0C000C0A0E000C0C00000C0C02000C0C04000C0C06000C0C08000 + C0C0A000F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000 + FF00FF00FFFF0000FFFFFF00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + F6F6F618181800F6F6F6F6F6F6F6F6F6F6F6181802180010F6F6F6F6F6F6F6F6 + F61802022828181800F6F6F6F6F6F6F602022828302802181800F6F6F6F6F6F6 + 00022830BA3028021800F6F6F6F6F6F6FB2830BAFA2828280218F6F6F600F6F6 + 0030BA00BABA28282802F6F6F6FB00F6FB2800FBBABABABA2828F6F6F6F6FB00 + 0000FBBABABABABABA78F6F6F600F6FBFBFB7800000079B9B9F6F6F6F6FBF6FB + FBFBB9FBFBFBFA79F6F6F6F6F6F600FBFBFB00F6B9B9F6F6F6F6F6F6F600FBF6 + 00F6FB00F6F6F6F6F6F6F6F6F6FBF6F6FBF6F6FBF6F6F6F6F6F6F6F6F6F6F6F6 + F6F6F6F6F6F6F6F6F6F6F6F636050000424D3605000000000000360400002800 + 0000100000001000000001000800000000000001000000000000000000000000 + 0000000000000000000000008000008000000080800080000000800080008080 + 0000C0C0C000C0DCC000F0CAA6000020400000206000002080000020A0000020 + C0000020E00000400000004020000040400000406000004080000040A0000040 + C0000040E00000600000006020000060400000606000006080000060A0000060 + C0000060E00000800000008020000080400000806000008080000080A0000080 + C0000080E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0 + C00000A0E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0 + C00000C0E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0 + C00000E0E00040000000400020004000400040006000400080004000A0004000 + C0004000E00040200000402020004020400040206000402080004020A0004020 + C0004020E00040400000404020004040400040406000404080004040A0004040 + C0004040E00040600000406020004060400040606000406080004060A0004060 + C0004060E00040800000408020004080400040806000408080004080A0004080 + C0004080E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0 + C00040A0E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0 + C00040C0E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0 + C00040E0E00080000000800020008000400080006000800080008000A0008000 + C0008000E00080200000802020008020400080206000802080008020A0008020 + C0008020E00080400000804020008040400080406000804080008040A0008040 + C0008040E00080600000806020008060400080606000806080008060A0008060 + C0008060E00080800000808020008080400080806000808080008080A0008080 + C0008080E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0 + C00080A0E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0 + C00080C0E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0 + C00080E0E000C0000000C0002000C0004000C0006000C0008000C000A000C000 + C000C000E000C0200000C0202000C0204000C0206000C0208000C020A000C020 + C000C020E000C0400000C0402000C0404000C0406000C0408000C040A000C040 + C000C040E000C0600000C0602000C0604000C0606000C0608000C060A000C060 + C000C060E000C0800000C0802000C0804000C0806000C0808000C080A000C080 + C000C080E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0 + C000C0A0E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FB + FF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF + 0000FFFFFF00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F9F9010A00F6F6F6 + 00F9F900F6F6F6F6F6F9F9F90100F6000DF900F6F6F6F6F6F6F6F9F9F90100F9 + F953F6F6F6F6F6F6F6F6F65CF9F9F9F954F6F6F6F6F6F6F6F6F65C00F9F9F9F9 + 0052F6F6F6F6F6F6F65D00F9F91266F9F90049F6F6F6F6F6F600F9F967BF675E + F9F900F6F6F6F6F600F9F967BF6F66665EF9F9F6F6F6F6F6F9F967BF67BFBF66 + 5E66F9F6F6F6F6F6F65D5D6FBFBFBFBFBF5E66F6F6F6F6F6F66FBFBFBFBFBFBF + BFBF6FF6F6F6F6F6F6F66F6F777777777777F6F6F6F6F6F6F6F6F677776F6F6F + 77F6F6F6F6F6F6F6F6F6F6F6F67777F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + F6F6F6F6F6F6 + } + end + object SDDir: TSelectDirectoryDialog + Title = 'Select Directory' + FilterIndex = 0 + left = 162 + top = 66 + end +end diff --git a/examples/cleandir/frmmain.lrs b/examples/cleandir/frmmain.lrs new file mode 100644 index 0000000000..f2ce11b911 --- /dev/null +++ b/examples/cleandir/frmmain.lrs @@ -0,0 +1,953 @@ +LazarusResources.Add('TMainForm','FORMDATA',[ + 'TPF0'#9'TMainForm'#8'MainForm'#4'Left'#3'{'#2#6'Height'#3#176#1#3'Top'#3'R'#1 + +#5'Width'#3';'#2#18'HorzScrollBar.Page'#3':'#2#18'VertScrollBar.Page'#3#149#1 + +#13'ActiveControl'#7#8'EDailyAt'#7'Caption'#6#27'Configure Directory Cleaner' + +#12'ClientHeight'#3#150#1#11'ClientWidth'#3';'#2#4'Menu'#7#6'MMMain'#12'OnCl' + +'oseQuery'#7#14'FormCloseQuery'#6'OnShow'#7#8'FormShow'#0#8'TToolBar'#6'TBMa' + +'in'#6'Height'#2#26#5'Width'#3';'#2#7'Caption'#6#6'TBMain'#6'Images'#7#6'ILM' + +'ain'#8'TabOrder'#2#0#0#11'TToolButton'#6'TBQuit'#4'Left'#2#1#3'Top'#2#2#6'A' + +'ction'#7#5'AQuit'#0#0#11'TToolButton'#11'ToolButton2'#4'Left'#2#24#3'Top'#2 + +#2#5'Width'#2#23#7'Caption'#6#11'ToolButton2'#5'Style'#7#12'tbsSeparator'#0#0 + +#11'TToolButton'#5'TBNew'#4'Left'#2'/'#3'Top'#2#2#6'Action'#7#4'ANew'#0#0#11 + +'TToolButton'#6'TBOpen'#4'Left'#2'F'#3'Top'#2#2#6'Action'#7#5'AOpen'#0#0#11 + +'TToolButton'#6'TBSave'#4'Left'#2']'#3'Top'#2#2#6'Action'#7#5'ASave'#0#0#11 + +'TToolButton'#11'ToolButton1'#4'Left'#2't'#3'Top'#2#2#5'Width'#2#23#7'Captio' + +'n'#6#11'ToolButton1'#5'Style'#7#12'tbsSeparator'#0#0#11'TToolButton'#9'TBNe' + +'wItem'#4'Left'#3#139#0#3'Top'#2#2#6'Action'#7#8'ANewItem'#0#0#11'TToolButto' + +'n'#12'TBDeleteItem'#4'Left'#3#162#0#3'Top'#2#2#6'Action'#7#11'ADeleteItem'#0 + +#0#0#12'TPageControl'#8'PCConfig'#6'Height'#3'|'#1#3'Top'#2#26#5'Width'#3';' + +#2#10'ActivePage'#7#12'TSScheduling'#5'Align'#7#8'alClient'#8'TabIndex'#2#3#8 + +'TabOrder'#2#1#8'OnChange'#7#14'PCConfigChange'#13'OnPageChanged'#7#14'PCCon' + +'figChange'#0#9'TTabSheet'#9'TSOptions'#7'Caption'#6#7'Options'#12'ClientHei' + +'ght'#3'|'#1#11'ClientWidth'#3';'#2#0#9'TListView'#13'LVDirectories'#6'Heigh' + +'t'#3#214#0#3'Top'#2'2'#5'Width'#3';'#2#5'Align'#7#8'alClient'#7'Columns'#14 + +#1#7'Caption'#6#7'Enabled'#0#1#7'Caption'#6#7'Recurse'#0#1#7'Caption'#6#4'Na' + +'me'#5'Width'#2'x'#0#1#7'Caption'#6#4'Path'#0#0#8'ReadOnly'#9#9'RowSelect'#9 + +#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsReport'#12'OnSelectItem'#7#23'LVDirector' + +'iesSelectItem'#0#0#6'TPanel'#12'PDirectories'#6'Height'#2't'#3'Top'#3#8#1#5 + +'Width'#3';'#2#5'Align'#7#8'alBottom'#10'BevelOuter'#7#9'bvLowered'#12'Clien' + +'tHeight'#2't'#11'ClientWidth'#3';'#2#8'TabOrder'#2#1#0#6'TLabel'#6'Label1'#4 + +'Left'#2#4#6'Height'#2#21#3'Top'#2#10#5'Width'#2'P'#9'Alignment'#7#14'taRigh' + +'tJustify'#8'AutoSize'#8#7'Caption'#6#5'&Name'#12'FocusControl'#7#8'EDirName' + +#6'Layout'#7#8'tlCenter'#11'ParentColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'#2 + +#4#6'Height'#2#19#3'Top'#2','#5'Width'#2'P'#9'Alignment'#7#14'taRightJustify' + +#8'AutoSize'#8#7'Caption'#6#5'&Path'#12'FocusControl'#7#8'EDirPath'#6'Layout' + +#7#8'tlCenter'#11'ParentColor'#8#0#0#12'TSpeedButton'#9'SBDirPath'#4'Left'#3 + +#21#2#6'Height'#2#22#3'Top'#2')'#5'Width'#2#23#7'Anchors'#11#5'akTop'#7'akRi' + +'ght'#0#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10'e'#12#0#0'a'#12#0#0'/* XPM' + +' */'#10'static char *graphic[] = {'#10'"16 16 159 2",'#10'".. c None",'#10 + +'"., c #636C75",'#10'".- c #575F68",'#10'".* c #5B636C",'#10'".a c #3A3F45",' + +#10'".b c #808C98",'#10'".c c #838F9C",'#10'".d c #474D54",'#10'".e c #747F8' + +'A",'#10'".f c #32373B",'#10'".g c #565E66",'#10'".h c #6F7885",'#10'".i c #' + +'393F48",'#10'".j c #717D8B",'#10'".k c #404A56",'#10'".l c #748392",'#10'".' + +'m c #40474F",'#10'".n c #34393E",'#10'".o c #4D545B",'#10'".p c #90A0B0",' + +#10'".q c #515D69",'#10'".r c #657486",'#10'".s c #4E5863",'#10'".t c #8898A' + +'A",'#10'".u c #4A515A",'#10'".v c #111316",'#10'".w c #586169",'#10'".x c #' + +'484F56",'#10'".y c #2C2F32",'#10'".z c #2D3034",'#10'".A c #3C4246",'#10'".' + +'B c #33383D",'#10'".C c #08090A",'#10'".D c #D9B434",'#10'".E c #E1C25E",' + +#10'".F c #E2C360",'#10'".G c #E2C35F",'#10'".H c #DBB63C",'#10'".I c #AFB9C' + +'4",'#10'".J c #8D9AA7",'#10'".K c #404547",'#10'".L c #555B63",'#10'".M c #' + +'A4AFBB",'#10'".N c #8B98A6",'#10'".O c #212427",'#10'".P c #DAB336",'#10'".' + +'Q c #FEFEFD",'#10'".R c #FFFFFE",'#10'".S c #FFFEFE",'#10'".T c #FFFEFD",' + +#10'".U c #FBF7EA",'#10'".V c #5F6871",'#10'".W c #ABB6C1",'#10'".X c #66707' + +'9",'#10'".Y c #54544A",'#10'".Z c #A6955C",'#10'".0 c #5D666E",'#10'".1 c #' + +'A5B1BD",'#10'".2 c #6A747E",'#10'".3 c #1B1D20",'#10'".4 c #DAAF35",'#10'".' + +'5 c #FEFCF7",'#10'".6 c #F8E48E",'#10'".7 c #F5DE91",'#10'".8 c #F5E09F",' + +#10'".9 c #F6E1AC",'#10'".@ c #FEFBEF",'#10'".# c #545B63",'#10'".; c #5E677' + +'0",'#10'".: c #3B4044",'#10'".= c #ACAAA3",'#10'".+ c #4E555C",'#10'".% c #' + +'7F8A96",'#10'".$ c #131416",'#10'".( c #DAAA36",'#10'".) c #FDFAF1",'#10'".' + +'[ c #F5DE94",'#10'".] c #F4DC93",'#10'",. c #F2D581",'#10'",, c #E9C060",' + +#10'",- c #E1AE4F",'#10'",* c #DA9435",'#10'",a c #111315",'#10'",b c #03040' + +'4",'#10'",c c #DAAB35",'#10'",d c #FBF6E8",'#10'",e c #EAC57E",'#10'",f c #' + +'E3AE5B",'#10'",g c #E1A851",'#10'",h c #E4AF60",'#10'",i c #FDFAEB",'#10'",' + +'j c #FEFAEC",'#10'",k c #FCF5E5",'#10'",l c #FCF6E5",'#10'",m c #FCF5E4",' + +#10'",n c #DAA637",'#10'",o c #FFFDF8",'#10'",p c #FFFDF6",'#10'",q c #FFFCF' + +'5",'#10'",r c #FEFAE8",'#10'",s c #FAECAF",'#10'",t c #F8E387",'#10'",u c #' + ,'F7E07D",'#10'",v c #F6DD72",'#10'",w c #F5DB68",'#10'",x c #FDF9E9",'#10'",' + +'y c #DAA136",'#10'",z c #FEFCF6",'#10'",A c #FCF2C8",'#10'",B c #FBEFB9",' + +#10'",C c #FAECAC",'#10'",D c #F8E48C",'#10'",E c #F8E38A",'#10'",F c #F7E18' + +'2",'#10'",G c #F7DF79",'#10'",H c #F6DD6D",'#10'",I c #F5DA61",'#10'",J c #' + +'F4D757",'#10'",K c #FDF8E7",'#10'",L c #DA9A36",'#10'",M c #FDFAF2",'#10'",' + +'N c #FAEDB3",'#10'",O c #F9E9A4",'#10'",P c #F8E695",'#10'",Q c #F7E285",' + +#10'",R c #F7E181",'#10'",S c #F7E07A",'#10'",T c #F6DD6F",'#10'",U c #F5DA6' + +'2",'#10'",V c #F3D654",'#10'",W c #F2D347",'#10'",X c #FDF9E8",'#10'",Y c #' + +'FEFAEF",'#10'",Z c #F9E9A1",'#10'",0 c #F8E591",'#10'",1 c #F6DE72",'#10'",' + +'2 c #F5DA63",'#10'",3 c #F4D754",'#10'",4 c #F3D347",'#10'",5 c #F2D039",' + +#10'",6 c #F1CD2E",'#10'",7 c #F0CB26",'#10'",8 c #FBF2CA",'#10'",9 c #D98E3' + +'3",'#10'",@ c #FAF0DC",'#10'",# c #F4DDA7",'#10'",; c #F4DB9E",'#10'",: c #' + +'F3DA96",'#10'",= c #F3D88E",'#10'",+ c #F3D786",'#10'",% c #F2D47F",'#10'",' + +'$ c #F2D379",'#10'",( c #F1D272",'#10'",) c #F1D06C",'#10'",[ c #F1CF69",' + +#10'",] c #F8EAC2",'#10'"-. c #D8882D",'#10'"-, c #D8872D",'#10'"-- c #D8862' + +'C",'#10'"...................,.-...*.a....",'#10'".................b.c.a...d' + +'.e.f..",'#10'".................g.h.i.j.k.l.m..",'#10'"...............n.o.p.' + +'q.r.s.t.u.v",'#10'"...............g.w.x.y...z.A.B.C",'#10'".D.E.F.F.F.G.H.,' + +'.I.J.K...L.M.N.O",'#10'".P.Q.R.S.T.R.U.V.W.X.Y.Z.0.1.2.3",'#10'".4.5.6.7.8.' + +'9.@.#.J.;.:.=.+.%.g.$",'#10'".(.).[.],.,,,-,*,*,*,*,*,*,*,a,b",'#10'",c,d,e' + +',f,g,h,i,j,k,l,m,m.R,*....",'#10'",n.R,o,p,q,r,s.6,t,u,v,w,x,*....",'#10'",' + +'y,z,A,B,C,D,E,F,G,H,I,J,K,*....",'#10'",L,M,N,O,P,Q,R,S,T,U,V,W,X,*....",' + +#10'",*,Y,Z,0,R,1,2,3,4,5,6,7,8,*....",'#10'",9,@,#,;,:,=,+,%,$,(,),[,],9...' + +'.",'#10'"..-.-,-.-.-.-.-.-.-.-.-,-.--...."}'#10#9'NumGlyphs'#2#0#7'OnClick' + +#7#14'SBDirPathClick'#0#0#11'TTICheckBox'#12'CBDirEnabled'#4'Left'#2'^'#6'He' + +'ight'#2#22#3'Top'#2'H'#5'Width'#2'F'#7'Caption'#6#8'&Enabled'#19'Link.TIPro' + +'pertyName'#6#7'Enabled'#13'OnEditingDone'#7#16'DirectoryChanged'#8'TabOrder' + +#2#0#0#0#11'TTICheckBox'#12'CBDirRecurse'#4'Left'#2'^'#6'Height'#2#22#3'Top' + +#2'`'#5'Width'#2'F'#7'Caption'#6#8'&Recurse'#19'Link.TIPropertyName'#6#7'Rec' + +'urse'#13'OnEditingDone'#7#16'DirectoryChanged'#8'TabOrder'#2#1#0#0#7'TTIEdi' + +'t'#8'EDirName'#4'Left'#2'^'#6'Height'#2#23#3'Top'#2#8#5'Width'#3#200#0#19'L' + +'ink.TIPropertyName'#6#4'Name'#13'OnEditingDone'#7#16'DirectoryChanged'#8'Ta' + +'bOrder'#2#2#0#0#7'TTIEdit'#8'EDirPath'#4'Left'#2'^'#6'Height'#2#23#3'Top'#2 + +'('#5'Width'#3#181#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#19'Link.T' + +'IPropertyName'#6#4'Path'#13'OnEditingDone'#7#16'DirectoryChanged'#8'TabOrde' + +'r'#2#3#0#0#0#6'TPanel'#8'POptions'#6'Height'#2'2'#5'Width'#3';'#2#5'Align'#7 + +#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'2'#11'ClientWidth'#3 + +';'#2#8'TabOrder'#2#2#0#6'TLabel'#6'Label3'#6'Height'#2#24#3'Top'#2#26#5'Wid' + +'th'#3';'#2#5'Align'#7#8'alBottom'#9'Alignment'#7#8'taCenter'#8'AutoSize'#8#7 + +'Caption'#6#21'Directories to clean:'#6'Layout'#7#8'tlCenter'#11'ParentColor' + +#8#0#0#11'TTICheckBox'#13'CBStopOnError'#4'Left'#2#14#6'Height'#2#20#3'Top'#2 + +#2#5'Width'#2'g'#7'Caption'#6#14'Stop on errors'#19'Link.TIPropertyName'#6#11 + +'StopOnError'#8'OnChange'#7#14'OptionsChanged'#8'TabOrder'#2#0#0#0#11'TTIChe' + +'ckBox'#16'CBAllFileActions'#4'Left'#3#190#0#6'Height'#2#20#3'Top'#2#2#5'Wid' + +'th'#3#184#0#7'Caption'#6#28'Execute all matching actions'#19'Link.TIPropert' + +'yName'#6#14'AllFileActions'#8'OnChange'#7#14'OptionsChanged'#8'TabOrder'#2#1 + +#0#0#11'TTICheckBox'#13'CBLogAllFiles'#4'Left'#3#150#1#6'Height'#2#20#3'Top' + +#2#2#5'Width'#2'X'#7'Caption'#6#13'Log all files'#19'Link.TIPropertyName'#6 + +#11'LogAllFiles'#8'OnChange'#7#14'OptionsChanged'#8'TabOrder'#2#2#0#0#0#0#9 + +'TTabSheet'#11'TSLocations'#7'Caption'#6#9'Locations'#12'ClientHeight'#3'|'#1 + +#11'ClientWidth'#3';'#2#0#6'TPanel'#9'PLocation'#6'Height'#3#188#0#3'Top'#3 + +#192#0#5'Width'#3';'#2#5'Align'#7#8'alBottom'#10'BevelOuter'#7#9'bvLowered' + +#12'ClientHeight'#3#188#0#11'ClientWidth'#3';'#2#8'TabOrder'#2#0#0#6'TLabel' + +#14'LELocationName'#4'Left'#2#4#6'Height'#2#21#3'Top'#2#13#5'Width'#2'L'#9'A' + +'lignment'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#5'&Name'#6'Layout' + +#7#8'tlCenter'#11'ParentColor'#8#0#0#6'TLabel'#6'Label4'#4'Left'#2#4#6'Heigh' + +'t'#2#23#3'Top'#2'0'#5'Width'#2'L'#9'Alignment'#7#14'taRightJustify'#8'AutoS' + +'ize'#8#7'Caption'#6#5'&Path'#6'Layout'#7#8'tlCenter'#11'ParentColor'#8#0#0 + +#12'TSpeedButton'#14'SBLocationPath'#4'Left'#3#12#2#6'Height'#2#22#3'Top'#2 + +'1'#5'Width'#2#23#7'Anchors'#11#5'akTop'#7'akRight'#0#5'Color'#7#9'clBtnFace' + +#10'Glyph.Data'#10'e'#12#0#0'a'#12#0#0'/* XPM */'#10'static char *graphic[] ' + +'= {'#10'"16 16 159 2",'#10'".. c None",'#10'"., c #636C75",'#10'".- c #575F' + +'68",'#10'".* c #5B636C",'#10'".a c #3A3F45",'#10'".b c #808C98",'#10'".c c ' + +'#838F9C",'#10'".d c #474D54",'#10'".e c #747F8A",'#10'".f c #32373B",'#10'"' + ,'.g c #565E66",'#10'".h c #6F7885",'#10'".i c #393F48",'#10'".j c #717D8B",' + +#10'".k c #404A56",'#10'".l c #748392",'#10'".m c #40474F",'#10'".n c #34393' + +'E",'#10'".o c #4D545B",'#10'".p c #90A0B0",'#10'".q c #515D69",'#10'".r c #' + +'657486",'#10'".s c #4E5863",'#10'".t c #8898AA",'#10'".u c #4A515A",'#10'".' + +'v c #111316",'#10'".w c #586169",'#10'".x c #484F56",'#10'".y c #2C2F32",' + +#10'".z c #2D3034",'#10'".A c #3C4246",'#10'".B c #33383D",'#10'".C c #08090' + +'A",'#10'".D c #D9B434",'#10'".E c #E1C25E",'#10'".F c #E2C360",'#10'".G c #' + +'E2C35F",'#10'".H c #DBB63C",'#10'".I c #AFB9C4",'#10'".J c #8D9AA7",'#10'".' + +'K c #404547",'#10'".L c #555B63",'#10'".M c #A4AFBB",'#10'".N c #8B98A6",' + +#10'".O c #212427",'#10'".P c #DAB336",'#10'".Q c #FEFEFD",'#10'".R c #FFFFF' + +'E",'#10'".S c #FFFEFE",'#10'".T c #FFFEFD",'#10'".U c #FBF7EA",'#10'".V c #' + +'5F6871",'#10'".W c #ABB6C1",'#10'".X c #667079",'#10'".Y c #54544A",'#10'".' + +'Z c #A6955C",'#10'".0 c #5D666E",'#10'".1 c #A5B1BD",'#10'".2 c #6A747E",' + +#10'".3 c #1B1D20",'#10'".4 c #DAAF35",'#10'".5 c #FEFCF7",'#10'".6 c #F8E48' + +'E",'#10'".7 c #F5DE91",'#10'".8 c #F5E09F",'#10'".9 c #F6E1AC",'#10'".@ c #' + +'FEFBEF",'#10'".# c #545B63",'#10'".; c #5E6770",'#10'".: c #3B4044",'#10'".' + +'= c #ACAAA3",'#10'".+ c #4E555C",'#10'".% c #7F8A96",'#10'".$ c #131416",' + +#10'".( c #DAAA36",'#10'".) c #FDFAF1",'#10'".[ c #F5DE94",'#10'".] c #F4DC9' + +'3",'#10'",. c #F2D581",'#10'",, c #E9C060",'#10'",- c #E1AE4F",'#10'",* c #' + +'DA9435",'#10'",a c #111315",'#10'",b c #030404",'#10'",c c #DAAB35",'#10'",' + +'d c #FBF6E8",'#10'",e c #EAC57E",'#10'",f c #E3AE5B",'#10'",g c #E1A851",' + +#10'",h c #E4AF60",'#10'",i c #FDFAEB",'#10'",j c #FEFAEC",'#10'",k c #FCF5E' + +'5",'#10'",l c #FCF6E5",'#10'",m c #FCF5E4",'#10'",n c #DAA637",'#10'",o c #' + +'FFFDF8",'#10'",p c #FFFDF6",'#10'",q c #FFFCF5",'#10'",r c #FEFAE8",'#10'",' + +'s c #FAECAF",'#10'",t c #F8E387",'#10'",u c #F7E07D",'#10'",v c #F6DD72",' + +#10'",w c #F5DB68",'#10'",x c #FDF9E9",'#10'",y c #DAA136",'#10'",z c #FEFCF' + +'6",'#10'",A c #FCF2C8",'#10'",B c #FBEFB9",'#10'",C c #FAECAC",'#10'",D c #' + +'F8E48C",'#10'",E c #F8E38A",'#10'",F c #F7E182",'#10'",G c #F7DF79",'#10'",' + +'H c #F6DD6D",'#10'",I c #F5DA61",'#10'",J c #F4D757",'#10'",K c #FDF8E7",' + +#10'",L c #DA9A36",'#10'",M c #FDFAF2",'#10'",N c #FAEDB3",'#10'",O c #F9E9A' + +'4",'#10'",P c #F8E695",'#10'",Q c #F7E285",'#10'",R c #F7E181",'#10'",S c #' + +'F7E07A",'#10'",T c #F6DD6F",'#10'",U c #F5DA62",'#10'",V c #F3D654",'#10'",' + +'W c #F2D347",'#10'",X c #FDF9E8",'#10'",Y c #FEFAEF",'#10'",Z c #F9E9A1",' + +#10'",0 c #F8E591",'#10'",1 c #F6DE72",'#10'",2 c #F5DA63",'#10'",3 c #F4D75' + +'4",'#10'",4 c #F3D347",'#10'",5 c #F2D039",'#10'",6 c #F1CD2E",'#10'",7 c #' + +'F0CB26",'#10'",8 c #FBF2CA",'#10'",9 c #D98E33",'#10'",@ c #FAF0DC",'#10'",' + +'# c #F4DDA7",'#10'",; c #F4DB9E",'#10'",: c #F3DA96",'#10'",= c #F3D88E",' + +#10'",+ c #F3D786",'#10'",% c #F2D47F",'#10'",$ c #F2D379",'#10'",( c #F1D27' + +'2",'#10'",) c #F1D06C",'#10'",[ c #F1CF69",'#10'",] c #F8EAC2",'#10'"-. c #' + +'D8882D",'#10'"-, c #D8872D",'#10'"-- c #D8862C",'#10'"...................,.' + +'-...*.a....",'#10'".................b.c.a...d.e.f..",'#10'"................' + +'.g.h.i.j.k.l.m..",'#10'"...............n.o.p.q.r.s.t.u.v",'#10'"...........' + +'....g.w.x.y...z.A.B.C",'#10'".D.E.F.F.F.G.H.,.I.J.K...L.M.N.O",'#10'".P.Q.R' + +'.S.T.R.U.V.W.X.Y.Z.0.1.2.3",'#10'".4.5.6.7.8.9.@.#.J.;.:.=.+.%.g.$",'#10'".' + +'(.).[.],.,,,-,*,*,*,*,*,*,*,a,b",'#10'",c,d,e,f,g,h,i,j,k,l,m,m.R,*....",' + +#10'",n.R,o,p,q,r,s.6,t,u,v,w,x,*....",'#10'",y,z,A,B,C,D,E,F,G,H,I,J,K,*...' + +'.",'#10'",L,M,N,O,P,Q,R,S,T,U,V,W,X,*....",'#10'",*,Y,Z,0,R,1,2,3,4,5,6,7,8' + +',*....",'#10'",9,@,#,;,:,=,+,%,$,(,),[,],9....",'#10'"..-.-,-.-.-.-.-.-.-.-' + +'.-,-.--...."}'#10#9'NumGlyphs'#2#0#7'OnClick'#7#19'SBLocationPathClick'#0#0 + +#7'TTIEdit'#16'ELocationBaseDir'#4'Left'#2'V'#6'Height'#2#23#3'Top'#2'0'#5'W' + +'idth'#3#176#1#19'Link.TIPropertyName'#6#8'BasePath'#13'OnEditingDone'#7#15 + +'LocationChanged'#8'TabOrder'#2#1#0#0#7'TTIEdit'#13'ELocationName'#4'Left'#2 + +'V'#6'Height'#2#23#3'Top'#2#13#5'Width'#3#184#0#19'Link.TIPropertyName'#6#4 + +'Name'#13'OnEditingDone'#7#15'LocationChanged'#8'TabOrder'#2#0#0#0#13'TTIChe' + +'ckGroup'#17'CGLocationSubdirs'#4'Left'#2'V'#6'Height'#2'd'#3'Top'#2'P'#5'Wi' + +'dth'#3'X'#1#7'Caption'#6#26'Create subdirectories from'#12'ColumnLayout'#7 + +#24'clVerticalThenHorizontal'#7'Columns'#2#2#19'Link.TIPropertyName'#6#7'Sub' + +'Dirs'#23'Link.AliasValuesStrings'#1#6#21'sdExtension=Extension'#6#11'sdYear' + +'=Year'#6#13'sdMonth=Month'#6#9'sdDay=Day'#6#11'sdDate=Date'#6#11'sdHour=Hou' + +'r'#6#9'sdMin=Min'#6#11'sdTime=Time'#0#13'OnEditingDone'#7#15'LocationChange' + +'d'#0#0#0#9'TListView'#11'LVLocations'#6'Height'#3#192#0#5'Width'#3';'#2#5'A' + +'lign'#7#8'alClient'#7'Columns'#14#1#7'Caption'#6#4'Name'#5'Width'#2'x'#0#1#7 + +'Caption'#6#4'Path'#5'Width'#3#200#0#0#1#7'Caption'#6#7'Subdirs'#0#0#8'ReadO' + +'nly'#9#9'RowSelect'#9#8'TabOrder'#2#1#9'ViewStyle'#7#8'vsReport'#12'OnSelec' + ,'tItem'#7#21'LVLocationsSelectItem'#0#0#0#9'TTabSheet'#13'TSFileActions'#7'C' + +'aption'#6#7'Actions'#12'ClientHeight'#3'|'#1#11'ClientWidth'#3';'#2#0#9'TLi' + +'stView'#13'LVFileActions'#6'Height'#3#216#0#5'Width'#3';'#2#5'Align'#7#8'al' + +'Client'#7'Columns'#14#1#7'Caption'#6#4'Name'#5'Width'#2'd'#0#1#7'Caption'#6 + +#10'Extensions'#5'Width'#2'd'#0#1#7'Caption'#6#8'Location'#0#1#7'Caption'#6#6 + +'Delete'#0#1#7'Caption'#6#8'Compress'#0#1#7'Caption'#6#15'MinCompressSize'#0 + +#1#7'Caption'#6#14'Case sensitive'#0#0#8'ReadOnly'#9#9'RowSelect'#9#8'TabOrd' + +'er'#2#0#9'ViewStyle'#7#8'vsReport'#12'OnSelectItem'#7#23'LVFileActionsSelec' + +'tItem'#0#0#6'TPanel'#11'PFileAction'#6'Height'#3#164#0#3'Top'#3#216#0#5'Wid' + +'th'#3';'#2#5'Align'#7#8'alBottom'#10'BevelOuter'#7#9'bvLowered'#12'ClientHe' + +'ight'#3#164#0#11'ClientWidth'#3';'#2#8'TabOrder'#2#1#0#6'TLabel'#28'LSEFile' + +'ActionMinCompressSize'#4'Left'#3#214#0#6'Height'#2#20#3'Top'#3#131#0#5'Widt' + +'h'#2'U'#9'Alignment'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#13'&Mi' + +'nimum size'#12'FocusControl'#7#27'SEFileActionMinCompressSize'#6'Layout'#7#8 + +'tlCenter'#11'ParentColor'#8#0#0#6'TLabel'#6'Label5'#4'Left'#2#15#6'Height'#2 + +#23#3'Top'#2#8#5'Width'#2'F'#9'Alignment'#7#14'taRightJustify'#8'AutoSize'#8 + +#7'Caption'#6#5'&Name'#6'Layout'#7#8'tlCenter'#11'ParentColor'#8#0#0#6'TLabe' + +'l'#6'Label6'#4'Left'#2#15#6'Height'#2#23#3'Top'#2'('#5'Width'#2'F'#9'Alignm' + +'ent'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#11'&Extensions'#6'Layo' + +'ut'#7#8'tlCenter'#11'ParentColor'#8#0#0#6'TLabel'#6'Label7'#4'Left'#2#13#6 + +'Height'#2#25#3'Top'#2'H'#5'Width'#2'H'#9'Alignment'#7#14'taRightJustify'#8 + +'AutoSize'#8#7'Caption'#6#8'Location'#6'Layout'#7#8'tlCenter'#11'ParentColor' + +#8#0#0#7'TTIEdit'#15'EFileActionName'#4'Left'#2'\'#6'Height'#2#23#3'Top'#2#8 + +#5'Width'#3#178#0#19'Link.TIPropertyName'#6#4'Name'#13'OnEditingDone'#7#13'A' + +'ctionChanged'#8'TabOrder'#2#0#0#0#7'TTIEdit'#21'EFileActionExtensions'#4'Le' + +'ft'#2'\'#6'Height'#2#23#3'Top'#2'('#5'Width'#3#178#0#19'Link.TIPropertyName' + +#6#10'Extensions'#13'OnEditingDone'#7#13'ActionChanged'#8'TabOrder'#2#1#0#0 + +#11'TTICheckBox'#18'CBFileActionDelete'#4'Left'#2'\'#6'Height'#2#22#3'Top'#2 + +'h'#5'Width'#2'<'#7'Caption'#6#7'&Delete'#19'Link.TIPropertyName'#6#6'Delete' + +#13'OnEditingDone'#7#13'ActionChanged'#8'TabOrder'#2#2#0#0#11'TTICheckBox'#20 + +'CBFileActionCompress'#4'Left'#2'\'#6'Height'#2#22#3'Top'#3#131#0#5'Width'#2 + +'O'#7'Caption'#6#9'&Compress'#19'Link.TIPropertyName'#6#8'Compress'#8'OnChan' + +'ge'#7#26'CBFileActionCompressChange'#8'TabOrder'#2#3#0#0#11'TTISpinEdit'#27 + +'SEFileActionMinCompressSize'#4'Left'#3'.'#1#6'Height'#2#23#3'Top'#3#128#0#5 + +'Width'#2'2'#18'Link.TIElementName'#6#15'MinCompressSize'#8'MaxValue'#3#16 + +''''#13'OnEditingDone'#7#13'ActionChanged'#8'TabOrder'#2#4#13'UseRTTIMinMax' + +#8#0#0#11'TTIComboBox'#24'CBFileActionLocationName'#4'Left'#2'\'#6'Height'#2 + +#25#3'Top'#2'H'#5'Width'#2'd'#12'AutoDropDown'#9#19'Link.TIPropertyName'#6#12 + +'LocationName'#9'MaxLength'#2#0#13'OnEditingDone'#7#13'ActionChanged'#6'Sort' + +'ed'#9#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#5#0#0#0#0#9'TTabSheet'#12 + +'TSScheduling'#7'Caption'#6#10'Scheduling'#12'ClientHeight'#3'^'#1#11'Client' + +'Width'#3'7'#2#0#6'TLabel'#9'LEDailyAt'#4'Left'#2#14#6'Height'#2#23#3'Top'#3 + +#130#0#5'Width'#2'8'#9'Alignment'#7#14'taRightJustify'#8'AutoSize'#8#7'Capti' + +'on'#6#8'Daily at'#6'Layout'#7#8'tlCenter'#11'ParentColor'#8#0#0#6'TLabel'#11 + +'LSEHourlyAt'#4'Left'#2#14#6'Height'#2#23#3'Top'#3#170#0#5'Width'#2'8'#9'Ali' + +'gnment'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#9'Hourly at'#6'Layo' + +'ut'#7#8'tlCenter'#11'ParentColor'#8#0#0#13'TTIRadioGroup'#14'RGScheduleMode' + +#4'Left'#2#14#6'Height'#2'l'#3'Top'#2#10#5'Width'#3#168#0#7'Caption'#6#16'Sc' + +'hedule service'#28'ChildSizing.LeftRightSpacing'#2#6#28'ChildSizing.TopBott' + +'omSpacing'#2#6#29'ChildSizing.EnlargeHorizontal'#7#24'crsHomogenousChildRes' + +'ize'#27'ChildSizing.EnlargeVertical'#7#24'crsHomogenousChildResize'#28'Chil' + +'dSizing.ShrinkHorizontal'#7#14'crsScaleChilds'#26'ChildSizing.ShrinkVertica' + +'l'#7#14'crsScaleChilds'#18'ChildSizing.Layout'#7#29'cclLeftToRightThenTopTo' + +'Bottom'#27'ChildSizing.ControlsPerLine'#2#1#19'Link.TIPropertyName'#6#12'Sc' + +'heduleMode'#23'Link.AliasValuesStrings'#1#6#13'smDaily=Daily'#6#15'smHourly' + +'=Hourly'#0#13'OnEditingDone'#7#19'ScheduleModeChanged'#0#0#7'TTIEdit'#8'EDa' + +'ilyAt'#4'Left'#2'V'#6'Height'#2#23#3'Top'#3#130#0#5'Width'#2'P'#19'Link.TIP' + +'ropertyName'#6#7'DailyAt'#13'OnEditingDone'#7#14'OptionsChanged'#8'TabOrder' + +#2#1#0#0#11'TTISpinEdit'#10'SEHourlyAt'#4'Left'#2'V'#6'Height'#2#23#3'Top'#3 + +#170#0#5'Width'#2'2'#19'Link.TIPropertyName'#6#8'HourlyAt'#8'MaxValue'#2';' + +#13'OnEditingDone'#7#14'OptionsChanged'#8'TabOrder'#2#2#0#0#13'TTICheckGroup' + +#14'CGScheduleDays'#4'Left'#3#198#0#6'Height'#2'l'#3'Top'#2#10#5'Width'#3'8' + +#1#7'Caption'#6#27'Days of week to run service'#12'ColumnLayout'#7#24'clVert' + +'icalThenHorizontal'#7'Columns'#2#2#19'Link.TIPropertyName'#6#12'ScheduleDay' + ,'s'#23'Link.AliasValuesStrings'#1#6#15'sdMonday=Monday'#6#17'sdTuesday=Tuesd' + +'ay'#6#21'sdWednesday=Wednesday'#6#19'sdThursday=Thursday'#6#15'sdFriday=Fri' + +'day'#6#19'sdSaturday=Saturday'#6#15'sdSunday=Sunday'#0#13'OnEditingDone'#7 + +#14'OptionsChanged'#0#0#0#0#9'TMainMenu'#6'MMMain'#6'Images'#7#6'ILMain'#4'l' + +'eft'#2'P'#3'top'#2'@'#0#9'TMenuItem'#5'MFile'#7'Caption'#6#5'&File'#0#9'TMe' + +'nuItem'#4'MNew'#6'Action'#7#4'ANew'#11'Bitmap.Data'#10#229#12#0#0#225#12#0#0 + +'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 167 2",'#10'".. c None"' + +','#10'"., c #4D8BC8",'#10'".- c #4F8CC8",'#10'".* c #4F8DC8",'#10'".a c #4F' + +'8CC9",'#10'".b c #4F8BC7",'#10'".c c #4B89C5",'#10'".d c #3B76C4",'#10'".e ' + +'c #4985C4",'#10'".f c #ECF2F7",'#10'".g c #EEF4F8",'#10'".h c #EDF4F8",'#10 + +'".i c #EDF3F8",'#10'".j c #ECF2F8",'#10'".k c #D7E6F2",'#10'".l c #7DB2E2",' + +#10'".m c #6594DB",'#10'".n c #4B88C5",'#10'".o c #F2F6FA",'#10'".p c #C7E0F' + +'A",'#10'".q c #C9E1FB",'#10'".r c #C9E2FB",'#10'".s c #C8E0FB",'#10'".t c #' + +'C5DFF9",'#10'".u c #C1DBF8",'#10'".v c #B8D6F4",'#10'".w c #F8FBFF",'#10'".' + +'x c #B4D8F6",'#10'".y c #7DB0E1",'#10'".z c #6492DB",'#10'".A c #4C89C6",' + +#10'".B c #F1F5F9",'#10'".C c #CDE3FC",'#10'".D c #CEE3FB",'#10'".E c #CDE3F' + +'B",'#10'".F c #CBE2FB",'#10'".G c #C8E0F9",'#10'".H c #C2DCF8",'#10'".I c #' + +'BAD6F5",'#10'".J c #F8FBFD",'#10'".K c #CDE6FC",'#10'".L c #C9E5FA",'#10'".' + +'M c #84B6E2",'#10'".N c #4279BF",'#10'".O c #4B89C6",'#10'".P c #CFE3FC",' + +#10'".Q c #D0E4FB",'#10'".R c #CFE4FC",'#10'".S c #CAE1FA",'#10'".T c #C4DDF' + +'9",'#10'".U c #BCD9F6",'#10'".V c #DFE9F4",'#10'".W c #F3F7FB",'#10'".X c #' + +'E9EFF5",'#10'".Y c #457EC2",'#10'".Z c #F0F4F9",'#10'".0 c #D3E6FC",'#10'".' + +'1 c #D4E6FC",'#10'".2 c #D3E7FD",'#10'".3 c #D1E4FC",'#10'".4 c #C8E0FA",' + +#10'".5 c #BBD6F5",'#10'".6 c #B5D4F3",'#10'".7 c #B3D2F1",'#10'".8 c #F0F4F' + +'8",'#10'".9 c #4682C4",'#10'".@ c #4A88C6",'#10'".# c #EFF4F9",'#10'".; c #' + +'D7E7FE",'#10'".: c #D6E7FD",'#10'".= c #D5E7FD",'#10'".+ c #D4E6FD",'#10'".' + +'% c #D2E6FC",'#10'".$ c #CCE1FB",'#10'".( c #C7DFFA",'#10'".) c #BDDAF6",' + +#10'".[ c #BBD8F6",'#10'".] c #EFF4FA",'#10'",. c #4683C6",'#10'",, c #4988C' + +'6",'#10'",- c #EDF4F9",'#10'",* c #D8E8FE",'#10'",a c #D7E8FE",'#10'",b c #' + +'D6E7FE",'#10'",c c #D3E5FD",'#10'",d c #C3DDF9",'#10'",e c #EDF4FA",'#10'",' + +'f c #4582C6",'#10'",g c #4784C6",'#10'",h c #ECF3F9",'#10'",i c #D6E8FE",' + +#10'",j c #CCE3FB",'#10'",k c #C6DFFA",'#10'",l c #EAF2FA",'#10'",m c #4280C' + +'6",'#10'",n c #4582C5",'#10'",o c #EBF2F8",'#10'",p c #D5E6FD",'#10'",q c #' + +'CDE2FC",'#10'",r c #CBE1FB",'#10'",s c #F2F7FB",'#10'",t c #3F7CC5",'#10'",' + +'u c #4280C5",'#10'",v c #E8F1F8",'#10'",w c #D5E5FE",'#10'",x c #D3E5FC",' + +#10'",y c #CEE2FC",'#10'",z c #CCE2FC",'#10'",A c #C9E0FB",'#10'",B c #C8E1F' + +'B",'#10'",C c #F7FAFD",'#10'",D c #3B76C1",'#10'",E c #407CC4",'#10'",F c #' + +'E6F0F7",'#10'",G c #55B4F8",'#10'",H c #56B4F7",'#10'",I c #54B5F7",'#10'",' + +'J c #53B4F8",'#10'",K c #53B2F8",'#10'",L c #52B3F7",'#10'",M c #51B2F7",' + +#10'",N c #4FB2F7",'#10'",O c #F5F9FC",'#10'",P c #366FBF",'#10'",Q c #3C78C' + +'1",'#10'",R c #E3EDF7",'#10'",S c #6EC2FD",'#10'",T c #A0D8FF",'#10'",U c #' + +'9ED7FF",'#10'",V c #9BD6FF",'#10'",W c #98D7FF",'#10'",X c #96D6FF",'#10'",' + +'Y c #95D6FF",'#10'",Z c #94D5FF",'#10'",0 c #93D4FF",'#10'",1 c #65BEFB",' + +#10'",2 c #F4F7FB",'#10'",3 c #3167BB",'#10'",4 c #3871BF",'#10'",5 c #DFEBF' + +'5",'#10'",6 c #68BFFD",'#10'",7 c #67BDFC",'#10'",8 c #64BEFC",'#10'",9 c #' + +'62BDFC",'#10'",@ c #63BDFB",'#10'",# c #61BCFB",'#10'",; c #60BEFC",'#10'",' + +': c #62BCFC",'#10'",= c #2D64B9",'#10'",+ c #3369BC",'#10'",% c #EAF1F8",' + +#10'",$ c #DFECF7",'#10'",( c #DEEBF6",'#10'",) c #DEEAF6",'#10'",[ c #DCEAF' + +'6",'#10'",] c #EBF3FA",'#10'"-. c #F3F7FC",'#10'"-, c #F4F8FC",'#10'"-- c #' + +'FDFEFE",'#10'"-* c #2A60B7",'#10'"-a c #3065BA",'#10'"-b c #3166BB",'#10'"-' + +'c c #3066BA",'#10'"-d c #2F65BA",'#10'"-e c #2E65B9",'#10'"-f c #2E64B9",' + +#10'"-g c #2C62B7",'#10'".....,.-.-.-.-.*.a.b.c.d........",'#10'"...e.f.g.h.' + +'i.i.i.j.f.k.l.m......",'#10'"...n.o.p.q.r.s.t.u.v.w.x.y.z....",'#10'"...A.B' + +'.C.D.E.F.G.H.I.J.K.L.M.N..",'#10'"...O.B.P.Q.R.C.S.T.U.V.f.W.X.Y..",'#10'".' + +'..O.Z.0.1.2.3.E.4.H.5.6.7.8.9..",'#10'"...@.#.;.:.=.+.%.$.(.H.).[.],...",' + +#10'"..,,,-,*,*,a,b,c.3.$.p,d.H,e,f..",'#10'"..,g,h,i,a.:.:.=,c.Q,j.(,k,l,m.' + +'.",'#10'"..,n,o,b.:.:.:,p,c.3,q,r.q,s,t..",'#10'"..,u,v,w,c,c,x,x.3,y,z,A,B' + +',C,D..",'#10'"..,E,F,G,H,I,J,K,L,L,M,N,N,O,P..",'#10'"..,Q,R,S,T,U,V,W,X,Y,' + +'Z,0,1,2,3..",'#10'"..,4,5,6,7,1,8,8,9,@,#,;,:.J,=..",'#10'"..,+,%,$,(,),[,[' + +',],],l-.-,---*..",'#10'"....-a-b-c-c-c-a-d-e-e-f-f-g...."}'#10#7'OnClick'#7 + +#11'ANewExecute'#0#0#9'TMenuItem'#6'MIOpen'#6'Action'#7#5'AOpen'#11'Bitmap.D' + +'ata'#10'e'#13#0#0'a'#13#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"1' + +'6 16 175 2",'#10'".. c None",'#10'"., c #9DC3EA",'#10'".- c #96BFE6",'#10'"' + +'.* c #92BBE4",'#10'".a c #6CA0D1",'#10'".b c #6D9ED0",'#10'".c c #5F96CC",' + ,#10'".d c #96BEE5",'#10'".e c #FEFFFF",'#10'".f c #E9F3FD",'#10'".g c #EAF3F' + +'D",'#10'".h c #E8F2FC",'#10'".i c #E3EFFA",'#10'".j c #E7F2FA",'#10'".k c #' + +'88BBEA",'#10'".l c #5585CF",'#10'".m c #93BBE4",'#10'".n c #EDF5FE",'#10'".' + +'o c #C5DEFC",'#10'".p c #C7E0FB",'#10'".q c #C2DCF9",'#10'".r c #B4D3F5",' + +#10'".s c #F3F9FE",'#10'".t c #C4E2FA",'#10'".u c #93C1EC",'#10'".v c #487DC' + +'3",'#10'".w c #F0F6FE",'#10'".x c #CDE2FC",'#10'".y c #CDE3FC",'#10'".z c #' + +'C8DFFA",'#10'".A c #BCD9F7",'#10'".B c #DDE9F5",'#10'".C c #EBF3FA",'#10'".' + +'D c #F3F8FB",'#10'".E c #5383CA",'#10'".F c #F1F7FE",'#10'".G c #D2E5FC",' + +#10'".H c #D1E4FC",'#10'".I c #CCE2FB",'#10'".J c #C4DDF9",'#10'".K c #BBD7F' + +'6",'#10'".L c #AFD1F3",'#10'".M c #E4EFFA",'#10'".N c #5887CC",'#10'".O c #' + +'D9B434",'#10'".P c #E1C25E",'#10'".Q c #E2C360",'#10'".R c #E2C35F",'#10'".' + +'S c #91BBE4",'#10'".T c #F2F7FF",'#10'".U c #D5E7FE",'#10'".V c #D1E5FD",' + +#10'".W c #CAE0FA",'#10'".X c #C4DEF9",'#10'".Y c #E7F2FD",'#10'".Z c #5787C' + +'C",'#10'".0 c #DAB336",'#10'".1 c #FEFEFD",'#10'".2 c #FFFFFE",'#10'".3 c #' + +'FFFEFE",'#10'".4 c #FFFEFD",'#10'".5 c #91BAE4",'#10'".6 c #F0F7FF",'#10'".' + +'7 c #D5E7FF",'#10'".8 c #D6E7FD",'#10'".9 c #D4E6FD",'#10'".@ c #D0E4FC",' + +#10'".# c #CBE3FB",'#10'".; c #C2DCFA",'#10'".: c #E8F3FE",'#10'".= c #5686C' + +'C",'#10'".+ c #DAAF35",'#10'".% c #FEFCF7",'#10'".$ c #F8E48E",'#10'".( c #' + +'F5DE91",'#10'".) c #F5E09F",'#10'".[ c #F6E1AC",'#10'".] c #5284CA",'#10'",' + +'. c #F1F7FF",'#10'",, c #D9E9FF",'#10'",- c #DBEAFF",'#10'",* c #D7E7FF",' + +#10'",a c #D2E5FF",'#10'",b c #CBE2FF",'#10'",c c #5585CB",'#10'",d c #DAAA3' + +'6",'#10'",e c #FDFAF1",'#10'",f c #F5DE94",'#10'",g c #F4DC93",'#10'",h c #' + +'E9BC64",'#10'",i c #DA9435",'#10'",j c #EFF6FB",'#10'",k c #5583CC",'#10'",' + +'l c #DAAB35",'#10'",m c #FBF6E8",'#10'",n c #E7BC70",'#10'",o c #E2AA55",' + +#10'",p c #E0A54D",'#10'",q c #EBC991",'#10'",r c #EFF3FA",'#10'",s c #FDFEF' + +'D",'#10'",t c #FCFDFF",'#10'",u c #FCFDFE",'#10'",v c #FBFCFE",'#10'",w c #' + +'FDFEFE",'#10'",x c #E8F2EF",'#10'",y c #5681CE",'#10'",z c #DAA637",'#10'",' + +'A c #FFFDF8",'#10'",B c #FFFDF6",'#10'",C c #FFFCF5",'#10'",D c #FEFCF3",' + +#10'",E c #F4E49A",'#10'",F c #F7E69A",'#10'",G c #F6E69B",'#10'",H c #F5E59' + +'D",'#10'",I c #F5E59E",'#10'",J c #F4E59F",'#10'",K c #F8F3DA",'#10'",L c #' + +'EEF4FD",'#10'",M c #5480CA",'#10'",N c #DAA136",'#10'",O c #FEFCF6",'#10'",' + +'P c #F8E594",'#10'",Q c #F8E593",'#10'",R c #F8E591",'#10'",S c #E9DB93",' + +#10'",T c #E3D793",'#10'",U c #DCD293",'#10'",V c #D7CE90",'#10'",W c #CFC88' + +'C",'#10'",X c #C6C186",'#10'",Y c #D6D8C9",'#10'",Z c #4474C5",'#10'",0 c #' + +'537FCA",'#10'",1 c #DA9A36",'#10'",2 c #FDFAF2",'#10'",3 c #F8E694",'#10'",' + +'4 c #F8E592",'#10'",5 c #F8E590",'#10'",6 c #F8E38B",'#10'",7 c #F7E286",' + +#10'",8 c #F7E17F",'#10'",9 c #F6DE77",'#10'",@ c #F6DC6C",'#10'",# c #F4D95' + +'E",'#10'",; c #F3D54F",'#10'",: c #FBF2CC",'#10'",= c #FEFAEF",'#10'",+ c #' + +'F8E48F",'#10'",% c #F8E389",'#10'",$ c #F7E182",'#10'",( c #F7DF7A",'#10'",' + +') c #F6DE71",'#10'",[ c #F5DB67",'#10'",] c #F4D85B",'#10'"-. c #F3D44D",' + +#10'"-, c #F2D140",'#10'"-- c #FBF2CA",'#10'"-* c #D98E33",'#10'"-a c #FAF0D' + +'C",'#10'"-b c #F6E198",'#10'"-c c #F6E095",'#10'"-d c #F6DF92",'#10'"-e c #' + +'F5DE8E",'#10'"-f c #F5DC89",'#10'"-g c #F4DA85",'#10'"-h c #F4D980",'#10'"-' + +'i c #F3D77A",'#10'"-j c #F3D574",'#10'"-k c #F2D370",'#10'"-l c #F8EAC2",' + +#10'"-m c #D8862C",'#10'"-n c #D8882D",'#10'"-o c #D8872D",'#10'"...........' + +'..,.-.*.*.a.b.c......",'#10'".............d.e.f.g.h.i.j.k.l..",'#10'"......' + +'.......m.n.o.p.q.r.s.t.u.v",'#10'".............*.w.x.y.z.A.B.C.D.E",'#10'".' + +'............*.F.G.H.I.J.K.L.M.N",'#10'".O.P.Q.Q.Q.R.S.T.U.U.V.W.X.A.Y.Z",' + +#10'".0.1.2.3.4.2.5.6.7.8.9.@.#.;.:.=",'#10'".+.%.$.(.).[.],.,,,-,,,*,a,b,.,' + +'c",'#10'",d,e,f,g,h,i,i,i,i,i,i,i,i,i,j,k",'#10'",l,m,n,o,p,q,r,s,t,t,u,v,w' + +',i,x,y",'#10'",z.2,A,B,C,D,E,F,G,H,I,J,K,i,L,M",'#10'",N,O,P,Q,Q,R,S,T,U,V,' + +'W,X,Y,i,Z,0",'#10'",1,2,3,4,5,6,7,8,9,@,#,;,:,i....",'#10'",i,=,Q,+,%,$,(,)' + +',[,]-.-,--,i....",'#10'"-*-a-b-c-d-e-f-g-h-i-j-k-l,i....",'#10'"-m-n-o-n-n-' + +'n-n-n-n-n-n-o-n-m...."}'#10#7'OnClick'#7#12'AOpenExecute'#0#0#9'TMenuItem'#6 + +'MISave'#6'Action'#7#5'ASave'#11'Bitmap.Data'#10#5#12#0#0#1#12#0#0'/* XPM */' + +#10'static char *graphic[] = {'#10'"16 16 153 2",'#10'".. c None",'#10'"., c' + +' #366BBC",'#10'".- c #366BBB",'#10'".* c #366ABB",'#10'".a c #396CBC",'#10 + +'".b c #3B6EBD",'#10'".c c #3A6DBB",'#10'".d c #386BBB",'#10'".e c #3E70BB",' + +#10'".f c #D1E0F6",'#10'".g c #D1E0F7",'#10'".h c #F8FBFE",'#10'".i c #F7FBF' + +'E",'#10'".j c #F6F9FD",'#10'".k c #F0F5FC",'#10'".l c #EAF0FA",'#10'".m c #' + +'EDF2FB",'#10'".n c #F7FAFD",'#10'".o c #EBF1FB",'#10'".p c #DFE9F8",'#10'".' + +'q c #BDD0EC",'#10'".r c #5E89C9",'#10'".s c #D1DFF6",'#10'".t c #80AAE9",' + +#10'".u c #F6FAFE",'#10'".v c #F6FAFD",'#10'".w c #648CC8",'#10'".x c #EEF3F' + +'B",'#10'".y c #EAF1FB",'#10'".z c #F2F6FC",'#10'".A c #F1F6FC",'#10'".B c #' + ,'E2ECF9",'#10'".C c #DBE7F8",'#10'".D c #BAD0EE",'#10'".E c #D0DFF6",'#10'".' + +'F c #7EA8E8",'#10'".G c #E9F1FA",'#10'".H c #EEF4FB",'#10'".I c #E8F0FA",' + +#10'".J c #DDE8F8",'#10'".K c #DBE6F7",'#10'".L c #7AA3E1",'#10'".M c #C3D5E' + +'F",'#10'".N c #3569B7",'#10'".O c #CCDDF5",'#10'".P c #7EA8E7",'#10'".Q c #' + +'668DC9",'#10'".R c #E9F0FA",'#10'".S c #F3F8FD",'#10'".T c #F8FAFE",'#10'".' + +'U c #EFF4FC",'#10'".V c #DFE9F9",'#10'".W c #DBE7F7",'#10'".X c #D9E5F7",' + +#10'".Y c #78A2E0",'#10'".Z c #A9C2E7",'#10'".0 c #3568B6",'#10'".1 c #C9DCF' + +'4",'#10'".2 c #7DA7E7",'#10'".3 c #E1ECF9",'#10'".4 c #E3EDF9",'#10'".5 c #' + +'EEF4FC",'#10'".6 c #F3F7FD",'#10'".7 c #E5EDFA",'#10'".8 c #D8E5F6",'#10'".' + +'9 c #77A0DE",'#10'".@ c #A4BEE4",'#10'".# c #3467B4",'#10'".; c #C7D9F4",' + +#10'".: c #7DA6E6",'#10'".= c #658DC9",'#10'".+ c #678EC9",'#10'".% c #6C92C' + +'B",'#10'".$ c #6D92CB",'#10'".( c #6990CA",'#10'".) c #658CC8",'#10'".[ c #' + +'749CDA",'#10'".] c #9FBAE1",'#10'",. c #3466B3",'#10'",, c #C5D8F2",'#10'",' + +'- c #7BA4E3",'#10'",* c #7AA3E3",'#10'",a c #7AA4E3",'#10'",b c #7BA4E2",' + +#10'",c c #7BA3E2",'#10'",d c #7BA3E1",'#10'",e c #79A2E1",'#10'",f c #77A0D' + +'F",'#10'",g c #769FDE",'#10'",h c #749EDD",'#10'",i c #729CDB",'#10'",j c #' + +'749DDC",'#10'",k c #9AB5DD",'#10'",l c #3465B1",'#10'",m c #C2D5F2",'#10'",' + +'n c #78A1E0",'#10'",o c #759EDE",'#10'",p c #739BDA",'#10'",q c #739BD9",' + +#10'",r c #95B0DA",'#10'",s c #3364AF",'#10'",t c #BED2F0",'#10'",u c #7AA3E' + +'2",'#10'",v c #779FDE",'#10'",w c #769FDD",'#10'",x c #729BD9",'#10'",y c #' + +'7199D8",'#10'",z c #7099D6",'#10'",A c #8EABD5",'#10'",B c #3363AD",'#10'",' + +'C c #366ABA",'#10'",D c #BBD0EF",'#10'",E c #7AA2E2",'#10'",F c #6D96D3",' + +#10'",G c #8AA7D2",'#10'",H c #3262AB",'#10'",I c #B8CEEF",'#10'",J c #F7FAF' + +'E",'#10'",K c #88C062",'#10'",L c #6A93CF",'#10'",M c #84A3CE",'#10'",N c #' + +'3261AA",'#10'",O c #386CBB",'#10'",P c #B6CCEE",'#10'",Q c #7AA2E1",'#10'",' + +'R c #C2DCBF",'#10'",S c #6890CD",'#10'",T c #819ECC",'#10'",U c #3261A8",' + +#10'",V c #376BBA",'#10'",W c #B3CAED",'#10'",X c #7AA2E0",'#10'",Y c #658DC' + +'A",'#10'",Z c #7C9BC9",'#10'",0 c #3160A7",'#10'",1 c #356ABA",'#10'",2 c #' + +'ADC6EB",'#10'",3 c #ADC5EA",'#10'",4 c #7C9AC8",'#10'",5 c #7998C7",'#10'",' + +'6 c #3569B9",'#10'",7 c #3569B8",'#10'",8 c #3568B7",'#10'",9 c #3568B5",' + +#10'",@ c #3466B2",'#10'",# c #3365B0",'#10'",; c #3364AE",'#10'",: c #3263A' + +'C",'#10'",= c #3262AA",'#10'",+ c #3261A9",'#10'",% c #3160A8",'#10'",$ c #' + +'3160A6",'#10'",( c #3161A8",'#10'"...,.,.,.,.-.-.*.*.a.b.c.d.e....",'#10'".' + +',.f.g.h.i.j.k.l.m.j.n.o.p.q.r..",'#10'".,.s.t.u.v.w.x.y.z.h.A.B.C.D.q.e",' + +#10'".,.E.F.A.A.w.G.H.n.j.I.J.K.L.M.N",'#10'".,.O.P.I.I.Q.R.S.T.U.V.W.X.Y.Z.' + +'0",'#10'".-.1.2.3.3.4.5.n.6.7.W.X.8.9.@.#",'#10'".-.;.:.w.=.+.%.$.(.).w.w.w' + +'.[.],.",'#10'".*,,,-,*,a,b,c,d,e,f,g,h,i,j,k,l",'#10'".*,m,*,*,c,c,b,e,n.9,' + +'o,j,p,q,r,s",'#10'".*,t,u,u.L,c,d,n,v,w,j,x,y,z,A,B",'#10'",C,D,E.h.h.h.h.h' + +'.h.h.h.h.h,F,G,H",'#10'".d,I,e,J,K,K,K,K,K,K,K,K.j,L,M,N",'#10'",O,P,Q,J,R,' + +'R,R,R,R,R,R,R.j,S,T,U",'#10'",V,W,X,J,K,K,K,K,K,K,K,K.j,Y,Z,0",'#10'",1,2,3' + +'.h.h.h.h.h.h.h.h.h.h,4,5,0",'#10'",C,6,7,8,9.#,@,#,;,:,=,+,%,0,$,("}'#10#7 + +'OnClick'#7#12'ASaveExecute'#0#0#9'TMenuItem'#8'MISaveAs'#6'Action'#7#7'ASav' + +'eAs'#7'OnClick'#7#14'ASaveAsExecute'#0#0#9'TMenuItem'#6'MISep1'#7'Caption'#6 + +#1'-'#0#0#9'TMenuItem'#6'MIQuit'#6'Action'#7#5'AQuit'#11'Bitmap.Data'#10#149 + +#13#0#0#145#13#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 178 2' + +'",'#10'".. c None",'#10'"., c #D49C6D",'#10'".- c #D29A6A",'#10'".* c #CF97' + +'66",'#10'".a c #D69E70",'#10'".b c #DAB185",'#10'".c c #B9915A",'#10'".d c ' + +'#CB9360",'#10'".e c #808080",'#10'".f c #7E7E7E",'#10'".g c #7C7C7C",'#10'"' + +'.h c #7A7A7A",'#10'".i c #777777",'#10'".j c #757575",'#10'".k c #727272",' + +#10'".l c #D49E71",'#10'".m c #D69E6F",'#10'".n c #DCB287",'#10'".o c #E8D3A' + +'B",'#10'".p c #E6D0A9",'#10'".q c #B89058",'#10'".r c #C68E59",'#10'".s c #' + +'7D7D7D",'#10'".t c #999999",'#10'".u c #9A9A9A",'#10'".v c #9B9B9B",'#10'".' + +'w c #D39D6F",'#10'".x c #E7D1AA",'#10'".y c #E7D1AB",'#10'".z c #E1C798",' + +#10'".A c #DEC291",'#10'".B c #B78F56",'#10'".C c #C18952",'#10'".D c #59915' + +'2",'#10'".E c #999A99",'#10'".F c #9C9C9C",'#10'".G c #D09A6C",'#10'".H c #' + +'E5CEA7",'#10'".I c #DFC18F",'#10'".J c #DCBD89",'#10'".K c #DCBD8B",'#10'".' + +'L c #B68D53",'#10'".M c #BC844B",'#10'".N c #458A3D",'#10'".O c #4F8A49",' + +#10'".P c #9D9D9D",'#10'".Q c #CC9666",'#10'".R c #E3CBA2",'#10'".S c #DAB98' + +'3",'#10'".T c #DAB984",'#10'".U c #B58B51",'#10'".V c #B67E43",'#10'".W c #' + +'4D9444",'#10'".X c #4B9142",'#10'".Y c #488D3F",'#10'".Z c #45893D",'#10'".' + +'0 c #65A45D",'#10'".1 c #61A05A",'#10'".2 c #4B8345",'#10'".3 c #9E9E9E",' + +#10'".4 c #C99260",'#10'".5 c #E2C79E",'#10'".6 c #DAB883",'#10'".7 c #D7B47' + +'D",'#10'".8 c #D7B37E",'#10'".9 c #B4894F",'#10'".@ c #B1793B",'#10'".# c #' + +'4A9041",'#10'".; c #9FD294",'#10'".: c #9AD091",'#10'".= c #96CD8D",'#10'".' + ,'+ c #92CB89",'#10'".% c #8DC884",'#10'".$ c #589851",'#10'".( c #467C41",' + +#10'".) c #9F9F9F",'#10'".[ c #C48E5A",'#10'".] c #E0C398",'#10'",. c #D7B37' + +'C",'#10'",, c #D6AF74",'#10'",- c #EDC45E",'#10'",* c #B3884B",'#10'",a c #' + +'AB7334",'#10'",b c #468B3E",'#10'",c c #99CE8F",'#10'",d c #87C67D",'#10'",' + +'e c #81C378",'#10'",f c #7CC073",'#10'",g c #7CC074",'#10'",h c #81C279",' + +#10'",i c #4F9049",'#10'",j c #577F54",'#10'",k c #BF8954",'#10'",l c #DDBF9' + +'4",'#10'",m c #D4AD75",'#10'",n c #E1B863",'#10'",o c #FFD44B",'#10'",p c #' + +'B88B42",'#10'",q c #A66E2C",'#10'",r c #42873B",'#10'",s c #88C680",'#10'",' + +'t c #83C37B",'#10'",u c #7FC177",'#10'",v c #4D8F47",'#10'",w c #3F743B",' + +#10'",x c #A1A1A1",'#10'",y c #BA844C",'#10'",z c #DBBB8D",'#10'",A c #D1A86' + +'E",'#10'",B c #D1A666",'#10'",C c #DFB45F",'#10'",D c #B18547",'#10'",E c #' + +'A16925",'#10'",F c #3E8237",'#10'",G c #3B7E34",'#10'",H c #377931",'#10'",' + +'I c #34752E",'#10'",J c #509149",'#10'",K c #4C8F46",'#10'",L c #3D7339",' + +#10'",M c #A2A2A2",'#10'",N c #B47E45",'#10'",O c #D9B788",'#10'",P c #CFA36' + +'7",'#10'",Q c #CC9E61",'#10'",R c #CC9F63",'#10'",S c #B18345",'#10'",T c #' + +'9C641F",'#10'",U c #606060",'#10'",V c #A0A0A0",'#10'",W c #41763D",'#10'",' + +'X c #397136",'#10'",Y c #A3A3A3",'#10'",Z c #B0793D",'#10'",0 c #D7B382",' + +#10'",1 c #CC9F62",'#10'",2 c #C99A5A",'#10'",3 c #CA9B5E",'#10'",4 c #AF814' + +'3",'#10'",5 c #986019",'#10'",6 c #5C5C5C",'#10'",7 c #40733C",'#10'",8 c #' + +'A1A1A0",'#10'",9 c #A4A4A4",'#10'",@ c #AA7436",'#10'",# c #D4AF7D",'#10'",' + +'; c #C99A5B",'#10'",: c #C79554",'#10'",= c #C89658",'#10'",+ c #AE8041",' + +#10'",% c #945C13",'#10'",$ c #585858",'#10'",( c #A5A5A5",'#10'",) c #A56F2' + +'F",'#10'",[ c #D2AB78",'#10'",] c #D3AB78",'#10'"-. c #D1A773",'#10'"-, c #' + +'CDA069",'#10'"-- c #AE7F40",'#10'"-* c #91590F",'#10'"-a c #717171",'#10'"-' + +'b c #545454",'#10'"-c c #515151",'#10'"-d c #4F4F4F",'#10'"-e c #4C4C4C",' + +#10'"-f c #4A4A4A",'#10'"-g c #474747",'#10'"-h c #454545",'#10'"-i c #9D672' + +'5",'#10'"-j c #A87432",'#10'"-k c #AF7C3D",'#10'"-l c #B58447",'#10'"-m c #' + +'BA8A4E",'#10'"-n c #AD7E3E",'#10'"-o c #8F570C",'#10'"-p c #925A10",'#10'"-' + +'q c #90580D",'#10'"-r c #925C13",'#10'"...........................,.-.*",' + +#10'".......................a.,.b.c.d",'#10'".....e.f.g.h.i.j.k.l.m.n.o.p.q.' + +'r",'#10'".....s.t.t.u.u.v.v.w.x.y.z.A.B.C",'#10'".....h.t.D.E.v.F.F.G.H.I.J' + +'.K.L.M",'#10'".....i.u.N.O.F.P.P.Q.R.J.S.T.U.V",'#10'".W.X.Y.Z.0.1.2.3.3.4.' + +'5.6.7.8.9.@",'#10'".#.;.:.=.+.%.$.(.).[.],.,,,-,*,a",'#10'",b,c,d,e,f,g,h,i' + +',j,k,l,m,n,o,p,q",'#10'",r.+.%,s,t,u,v,w,x,y,z,A,B,C,D,E",'#10'",F,G,H,I,J,' + +'K,L,x,M,N,O,P,Q,R,S,T",'#10'"....,U,V,W,X,M,M,Y,Z,0,1,2,3,4,5",'#10'"....,6' + +',x,7,8,Y,Y,9,@,#,;,:,=,+,%",'#10'"....,$,M,M,Y,9,9,(,),[,]-.-,---*",'#10'".' + +'t-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o",'#10'"........................-p-q-r-o"}' + +#10#7'OnClick'#7#12'AQuitExecute'#0#0#0#9'TMenuItem'#6'MItems'#7'Caption'#6#6 + +'&Items'#0#9'TMenuItem'#9'MINewItem'#6'Action'#7#8'ANewItem'#11'Bitmap.Data' + +#10':'#5#0#0'6'#5#0#0'BM6'#5#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#16#0#0#0#16#0#0#0 + +#1#0#8#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 + +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#192#220 + +#192#0#240#202#166#0#0' @'#0#0' `'#0#0' '#128#0#0' '#160#0#0' '#192#0#0' ' + +#224#0#0'@'#0#0#0'@ '#0#0'@@'#0#0'@`'#0#0'@'#128#0#0'@'#160#0#0'@'#192#0#0'@' + +#224#0#0'`'#0#0#0'` '#0#0'`@'#0#0'``'#0#0'`'#128#0#0'`'#160#0#0'`'#192#0#0'`' + +#224#0#0#128#0#0#0#128' '#0#0#128'@'#0#0#128'`'#0#0#128#128#0#0#128#160#0#0 + +#128#192#0#0#128#224#0#0#160#0#0#0#160' '#0#0#160'@'#0#0#160'`'#0#0#160#128#0 + +#0#160#160#0#0#160#192#0#0#160#224#0#0#192#0#0#0#192' '#0#0#192'@'#0#0#192'`' + +#0#0#192#128#0#0#192#160#0#0#192#192#0#0#192#224#0#0#224#0#0#0#224' '#0#0#224 + +'@'#0#0#224'`'#0#0#224#128#0#0#224#160#0#0#224#192#0#0#224#224#0'@'#0#0#0'@' + +#0' '#0'@'#0'@'#0'@'#0'`'#0'@'#0#128#0'@'#0#160#0'@'#0#192#0'@'#0#224#0'@ '#0 + +#0'@ '#0'@ @'#0'@ `'#0'@ '#128#0'@ '#160#0'@ '#192#0'@ '#224#0'@@'#0#0'@@ ' + +#0'@@@'#0'@@`'#0'@@'#128#0'@@'#160#0'@@'#192#0'@@'#224#0'@`'#0#0'@` '#0'@`@' + +#0'@``'#0'@`'#128#0'@`'#160#0'@`'#192#0'@`'#224#0'@'#128#0#0'@'#128' '#0'@' + +#128'@'#0'@'#128'`'#0'@'#128#128#0'@'#128#160#0'@'#128#192#0'@'#128#224#0'@' + +#160#0#0'@'#160' '#0'@'#160'@'#0'@'#160'`'#0'@'#160#128#0'@'#160#160#0'@'#160 + +#192#0'@'#160#224#0'@'#192#0#0'@'#192' '#0'@'#192'@'#0'@'#192'`'#0'@'#192#128 + +#0'@'#192#160#0'@'#192#192#0'@'#192#224#0'@'#224#0#0'@'#224' '#0'@'#224'@'#0 + +'@'#224'`'#0'@'#224#128#0'@'#224#160#0'@'#224#192#0'@'#224#224#0#128#0#0#0 + +#128#0' '#0#128#0'@'#0#128#0'`'#0#128#0#128#0#128#0#160#0#128#0#192#0#128#0 + +#224#0#128' '#0#0#128' '#0#128' @'#0#128' `'#0#128' '#128#0#128' '#160#0#128 + +' '#192#0#128' '#224#0#128'@'#0#0#128'@ '#0#128'@@'#0#128'@`'#0#128'@'#128#0 + +#128'@'#160#0#128'@'#192#0#128'@'#224#0#128'`'#0#0#128'` '#0#128'`@'#0#128'`' + +'`'#0#128'`'#128#0#128'`'#160#0#128'`'#192#0#128'`'#224#0#128#128#0#0#128#128 + ,' '#0#128#128'@'#0#128#128'`'#0#128#128#128#0#128#128#160#0#128#128#192#0#128 + +#128#224#0#128#160#0#0#128#160' '#0#128#160'@'#0#128#160'`'#0#128#160#128#0 + +#128#160#160#0#128#160#192#0#128#160#224#0#128#192#0#0#128#192' '#0#128#192 + +'@'#0#128#192'`'#0#128#192#128#0#128#192#160#0#128#192#192#0#128#192#224#0 + +#128#224#0#0#128#224' '#0#128#224'@'#0#128#224'`'#0#128#224#128#0#128#224#160 + +#0#128#224#192#0#128#224#224#0#192#0#0#0#192#0' '#0#192#0'@'#0#192#0'`'#0#192 + +#0#128#0#192#0#160#0#192#0#192#0#192#0#224#0#192' '#0#0#192' '#0#192' @'#0 + +#192' `'#0#192' '#128#0#192' '#160#0#192' '#192#0#192' '#224#0#192'@'#0#0#192 + +'@ '#0#192'@@'#0#192'@`'#0#192'@'#128#0#192'@'#160#0#192'@'#192#0#192'@'#224 + +#0#192'`'#0#0#192'` '#0#192'`@'#0#192'``'#0#192'`'#128#0#192'`'#160#0#192'`' + +#192#0#192'`'#224#0#192#128#0#0#192#128' '#0#192#128'@'#0#192#128'`'#0#192 + +#128#128#0#192#128#160#0#192#128#192#0#192#128#224#0#192#160#0#0#192#160' '#0 + +#192#160'@'#0#192#160'`'#0#192#160#128#0#192#160#160#0#192#160#192#0#192#160 + +#224#0#192#192#0#0#192#192' '#0#192#192'@'#0#192#192'`'#0#192#192#128#0#192 + +#192#160#0#240#251#255#0#164#160#160#0#128#128#128#0#0#0#255#0#0#255#0#0#0 + +#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#246#246#246#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246 + +#24#24#24#0#246#246#246#246#246#246#246#246#246#246#246#24#24#2#24#0#16#246 + +#246#246#246#246#246#246#246#246#24#2#2'(('#24#24#0#246#246#246#246#246#246 + +#246#2#2'((0('#2#24#24#0#246#246#246#246#246#246#0#2'(0'#186'0('#2#24#0#246 + +#246#246#246#246#246#251'(0'#186#250'((('#2#24#246#246#246#0#246#246#0'0'#186 + +#0#186#186'((('#2#246#246#246#251#0#246#251'('#0#251#186#186#186#186'(('#246 + +#246#246#246#251#0#0#0#251#186#186#186#186#186#186'x'#246#246#246#0#246#251 + +#251#251'x'#0#0#0'y'#185#185#246#246#246#246#251#246#251#251#251#185#251#251 + +#251#250'y'#246#246#246#246#246#246#0#251#251#251#0#246#185#185#246#246#246 + +#246#246#246#246#0#251#246#0#246#251#0#246#246#246#246#246#246#246#246#246 + +#251#246#246#251#246#246#251#246#246#246#246#246#246#246#246#246#246#246#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#7'OnClick'#7#15'ANewItemExe' + +'cute'#0#0#9'TMenuItem'#12'MIDeleteItem'#6'Action'#7#11'ADeleteItem'#11'Bitm' + +'ap.Data'#10':'#5#0#0'6'#5#0#0'BM6'#5#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#16#0#0#0 + +#16#0#0#0#1#0#8#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#128#0#0#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0 + +#192#220#192#0#240#202#166#0#0' @'#0#0' `'#0#0' '#128#0#0' '#160#0#0' '#192#0 + +#0' '#224#0#0'@'#0#0#0'@ '#0#0'@@'#0#0'@`'#0#0'@'#128#0#0'@'#160#0#0'@'#192#0 + +#0'@'#224#0#0'`'#0#0#0'` '#0#0'`@'#0#0'``'#0#0'`'#128#0#0'`'#160#0#0'`'#192#0 + +#0'`'#224#0#0#128#0#0#0#128' '#0#0#128'@'#0#0#128'`'#0#0#128#128#0#0#128#160 + +#0#0#128#192#0#0#128#224#0#0#160#0#0#0#160' '#0#0#160'@'#0#0#160'`'#0#0#160 + +#128#0#0#160#160#0#0#160#192#0#0#160#224#0#0#192#0#0#0#192' '#0#0#192'@'#0#0 + +#192'`'#0#0#192#128#0#0#192#160#0#0#192#192#0#0#192#224#0#0#224#0#0#0#224' ' + +#0#0#224'@'#0#0#224'`'#0#0#224#128#0#0#224#160#0#0#224#192#0#0#224#224#0'@'#0 + +#0#0'@'#0' '#0'@'#0'@'#0'@'#0'`'#0'@'#0#128#0'@'#0#160#0'@'#0#192#0'@'#0#224 + +#0'@ '#0#0'@ '#0'@ @'#0'@ `'#0'@ '#128#0'@ '#160#0'@ '#192#0'@ '#224#0'@@'#0 + +#0'@@ '#0'@@@'#0'@@`'#0'@@'#128#0'@@'#160#0'@@'#192#0'@@'#224#0'@`'#0#0'@` ' + +#0'@`@'#0'@``'#0'@`'#128#0'@`'#160#0'@`'#192#0'@`'#224#0'@'#128#0#0'@'#128' ' + +#0'@'#128'@'#0'@'#128'`'#0'@'#128#128#0'@'#128#160#0'@'#128#192#0'@'#128#224 + +#0'@'#160#0#0'@'#160' '#0'@'#160'@'#0'@'#160'`'#0'@'#160#128#0'@'#160#160#0 + +'@'#160#192#0'@'#160#224#0'@'#192#0#0'@'#192' '#0'@'#192'@'#0'@'#192'`'#0'@' + +#192#128#0'@'#192#160#0'@'#192#192#0'@'#192#224#0'@'#224#0#0'@'#224' '#0'@' + +#224'@'#0'@'#224'`'#0'@'#224#128#0'@'#224#160#0'@'#224#192#0'@'#224#224#0#128 + +#0#0#0#128#0' '#0#128#0'@'#0#128#0'`'#0#128#0#128#0#128#0#160#0#128#0#192#0 + +#128#0#224#0#128' '#0#0#128' '#0#128' @'#0#128' `'#0#128' '#128#0#128' '#160 + +#0#128' '#192#0#128' '#224#0#128'@'#0#0#128'@ '#0#128'@@'#0#128'@`'#0#128'@' + +#128#0#128'@'#160#0#128'@'#192#0#128'@'#224#0#128'`'#0#0#128'` '#0#128'`@'#0 + +#128'``'#0#128'`'#128#0#128'`'#160#0#128'`'#192#0#128'`'#224#0#128#128#0#0 + +#128#128' '#0#128#128'@'#0#128#128'`'#0#128#128#128#0#128#128#160#0#128#128 + +#192#0#128#128#224#0#128#160#0#0#128#160' '#0#128#160'@'#0#128#160'`'#0#128 + +#160#128#0#128#160#160#0#128#160#192#0#128#160#224#0#128#192#0#0#128#192' '#0 + +#128#192'@'#0#128#192'`'#0#128#192#128#0#128#192#160#0#128#192#192#0#128#192 + +#224#0#128#224#0#0#128#224' '#0#128#224'@'#0#128#224'`'#0#128#224#128#0#128 + +#224#160#0#128#224#192#0#128#224#224#0#192#0#0#0#192#0' '#0#192#0'@'#0#192#0 + +'`'#0#192#0#128#0#192#0#160#0#192#0#192#0#192#0#224#0#192' '#0#0#192' '#0 + +#192' @'#0#192' `'#0#192' '#128#0#192' '#160#0#192' '#192#0#192' '#224#0#192 + +'@'#0#0#192'@ '#0#192'@@'#0#192'@`'#0#192'@'#128#0#192'@'#160#0#192'@'#192#0 + +#192'@'#224#0#192'`'#0#0#192'` '#0#192'`@'#0#192'``'#0#192'`'#128#0#192'`' + ,#160#0#192'`'#192#0#192'`'#224#0#192#128#0#0#192#128' '#0#192#128'@'#0#192 + +#128'`'#0#192#128#128#0#192#128#160#0#192#128#192#0#192#128#224#0#192#160#0#0 + +#192#160' '#0#192#160'@'#0#192#160'`'#0#192#160#128#0#192#160#160#0#192#160 + +#192#0#192#160#224#0#192#192#0#0#192#192' '#0#192#192'@'#0#192#192'`'#0#192 + +#192#128#0#192#192#160#0#240#251#255#0#164#160#160#0#128#128#128#0#0#0#255#0 + +#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#249#249 + +#1#10#0#246#246#246#0#249#249#0#246#246#246#246#246#249#249#249#1#0#246#0#13 + +#249#0#246#246#246#246#246#246#246#249#249#249#1#0#249#249'S'#246#246#246#246 + +#246#246#246#246#246'\'#249#249#249#249'T'#246#246#246#246#246#246#246#246 + +#246'\'#0#249#249#249#249#0'R'#246#246#246#246#246#246#246']'#0#249#249#18'f' + +#249#249#0'I'#246#246#246#246#246#246#0#249#249'g'#191'g^'#249#249#0#246#246 + +#246#246#246#0#249#249'g'#191'off^'#249#249#246#246#246#246#246#249#249'g' + +#191'g'#191#191'f^f'#249#246#246#246#246#246#246']]o'#191#191#191#191#191'^f' + +#246#246#246#246#246#246'o'#191#191#191#191#191#191#191#191'o'#246#246#246 + +#246#246#246#246'oowwwwww'#246#246#246#246#246#246#246#246#246'wwooow'#246 + +#246#246#246#246#246#246#246#246#246#246#246'ww'#246#246#246#246#246#246#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#7'OnClick'#7 + +#18'ADeleteItemExecute'#0#0#0#9'TMenuItem'#4'MRun'#7'Caption'#6#4'&Run'#0#9 + +'TMenuItem'#6'MITest'#6'Action'#7#5'ATest'#7'OnClick'#7#12'ATestExecute'#0#0 + +#9'TMenuItem'#5'MIRun'#6'Action'#7#8'AExecute'#7'OnClick'#7#12'ATestExecute' + +#0#0#0#0#11'TActionList'#6'ALMain'#6'Images'#7#6'ILMain'#4'left'#2'P'#3'top' + +#2'`'#0#7'TAction'#4'ANew'#8'Category'#6#4'File'#7'Caption'#6#4'&New'#18'Dis' + +'ableIfNoHandler'#9#10'ImageIndex'#2#0#9'OnExecute'#7#11'ANewExecute'#8'Shor' + +'tCut'#3'N@'#0#0#7'TAction'#5'AOpen'#8'Category'#6#4'File'#7'Caption'#6#5'&O' + +'pen'#18'DisableIfNoHandler'#9#10'ImageIndex'#2#1#9'OnExecute'#7#12'AOpenExe' + +'cute'#8'ShortCut'#3'O@'#0#0#7'TAction'#5'ASave'#8'Category'#6#4'File'#7'Cap' + +'tion'#6#5'&Save'#18'DisableIfNoHandler'#9#10'ImageIndex'#2#2#9'OnExecute'#7 + +#12'ASaveExecute'#8'OnUpdate'#7#11'ASaveUpdate'#8'ShortCut'#3'S@'#0#0#7'TAct' + +'ion'#7'ASaveAs'#8'Category'#6#4'File'#7'Caption'#6#8'Save &as'#18'DisableIf' + +'NoHandler'#9#9'OnExecute'#7#14'ASaveAsExecute'#0#0#7'TAction'#5'AQuit'#8'Ca' + +'tegory'#6#4'File'#7'Caption'#6#5'&Quit'#18'DisableIfNoHandler'#9#10'ImageIn' + +'dex'#2#3#9'OnExecute'#7#12'AQuitExecute'#8'ShortCut'#3'Q@'#0#0#7'TAction'#8 + +'ANewItem'#8'Category'#6#5'Items'#7'Caption'#6#4'&New'#18'DisableIfNoHandler' + +#9#10'ImageIndex'#2#4#9'OnExecute'#7#15'ANewItemExecute'#8'ShortCut'#3'A@'#0 + +#0#7'TAction'#11'ADeleteItem'#8'Category'#6#5'Items'#7'Caption'#6#7'&Delete' + +#18'DisableIfNoHandler'#9#10'ImageIndex'#2#5#9'OnExecute'#7#18'ADeleteItemEx' + +'ecute'#8'OnUpdate'#7#17'ADeleteItemUpdate'#8'ShortCut'#3'D@'#0#0#7'TAction' + +#5'ATest'#8'Category'#6#7'Execute'#7'Caption'#6#19'&Test configuration'#18'D' + +'isableIfNoHandler'#9#9'OnExecute'#7#12'ATestExecute'#8'ShortCut'#3'T@'#0#0#7 + +'TAction'#8'AExecute'#8'Category'#6#7'Execute'#7'Caption'#6#23'&Run with con' + +'figuration'#18'DisableIfNoHandler'#9#9'OnExecute'#7#12'ATestExecute'#8'OnUp' + +'date'#7#14'AExecuteUpdate'#8'ShortCut'#3'E@'#0#0#0#11'TSaveDialog'#8'SDConf' + +'ig'#5'Title'#6#26'Save configuration file as'#6'Filter'#6'''Configuration f' + +'iles|*.cfg|All files|*.*'#11'FilterIndex'#2#0#7'Options'#11#17'ofOverwriteP' + +'rompt'#15'ofPathMustExist'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2 + +'x'#3'top'#2'@'#0#0#11'TOpenDialog'#8'ODConfig'#5'Title'#6' Open existing co' + +'nfiguration file'#6'Filter'#6'''Configuration files|*.cfg|All files|*.*'#11 + +'FilterIndex'#2#0#7'Options'#11#15'ofFileMustExist'#14'ofEnableSizing'#12'of' + +'ViewDetail'#0#4'left'#2'x'#3'top'#2'`'#0#0#10'TImageList'#6'ILMain'#4'left' + +#2'*'#3'top'#2'B'#6'Bitmap'#10'f>'#0#0'li'#6#0#0#0#16#0#0#0#16#0#0#0#225#12#0 + +#0'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 167 2",'#10'".. c Non' + +'e",'#10'"., c #4D8BC8",'#10'".- c #4F8CC8",'#10'".* c #4F8DC8",'#10'".a c #' + +'4F8CC9",'#10'".b c #4F8BC7",'#10'".c c #4B89C5",'#10'".d c #3B76C4",'#10'".' + +'e c #4985C4",'#10'".f c #ECF2F7",'#10'".g c #EEF4F8",'#10'".h c #EDF4F8",' + +#10'".i c #EDF3F8",'#10'".j c #ECF2F8",'#10'".k c #D7E6F2",'#10'".l c #7DB2E' + +'2",'#10'".m c #6594DB",'#10'".n c #4B88C5",'#10'".o c #F2F6FA",'#10'".p c #' + +'C7E0FA",'#10'".q c #C9E1FB",'#10'".r c #C9E2FB",'#10'".s c #C8E0FB",'#10'".' + +'t c #C5DFF9",'#10'".u c #C1DBF8",'#10'".v c #B8D6F4",'#10'".w c #F8FBFF",' + +#10'".x c #B4D8F6",'#10'".y c #7DB0E1",'#10'".z c #6492DB",'#10'".A c #4C89C' + +'6",'#10'".B c #F1F5F9",'#10'".C c #CDE3FC",'#10'".D c #CEE3FB",'#10'".E c #' + +'CDE3FB",'#10'".F c #CBE2FB",'#10'".G c #C8E0F9",'#10'".H c #C2DCF8",'#10'".' + +'I c #BAD6F5",'#10'".J c #F8FBFD",'#10'".K c #CDE6FC",'#10'".L c #C9E5FA",' + +#10'".M c #84B6E2",'#10'".N c #4279BF",'#10'".O c #4B89C6",'#10'".P c #CFE3F' + ,'C",'#10'".Q c #D0E4FB",'#10'".R c #CFE4FC",'#10'".S c #CAE1FA",'#10'".T c #' + +'C4DDF9",'#10'".U c #BCD9F6",'#10'".V c #DFE9F4",'#10'".W c #F3F7FB",'#10'".' + +'X c #E9EFF5",'#10'".Y c #457EC2",'#10'".Z c #F0F4F9",'#10'".0 c #D3E6FC",' + +#10'".1 c #D4E6FC",'#10'".2 c #D3E7FD",'#10'".3 c #D1E4FC",'#10'".4 c #C8E0F' + +'A",'#10'".5 c #BBD6F5",'#10'".6 c #B5D4F3",'#10'".7 c #B3D2F1",'#10'".8 c #' + +'F0F4F8",'#10'".9 c #4682C4",'#10'".@ c #4A88C6",'#10'".# c #EFF4F9",'#10'".' + +'; c #D7E7FE",'#10'".: c #D6E7FD",'#10'".= c #D5E7FD",'#10'".+ c #D4E6FD",' + +#10'".% c #D2E6FC",'#10'".$ c #CCE1FB",'#10'".( c #C7DFFA",'#10'".) c #BDDAF' + +'6",'#10'".[ c #BBD8F6",'#10'".] c #EFF4FA",'#10'",. c #4683C6",'#10'",, c #' + +'4988C6",'#10'",- c #EDF4F9",'#10'",* c #D8E8FE",'#10'",a c #D7E8FE",'#10'",' + +'b c #D6E7FE",'#10'",c c #D3E5FD",'#10'",d c #C3DDF9",'#10'",e c #EDF4FA",' + +#10'",f c #4582C6",'#10'",g c #4784C6",'#10'",h c #ECF3F9",'#10'",i c #D6E8F' + +'E",'#10'",j c #CCE3FB",'#10'",k c #C6DFFA",'#10'",l c #EAF2FA",'#10'",m c #' + +'4280C6",'#10'",n c #4582C5",'#10'",o c #EBF2F8",'#10'",p c #D5E6FD",'#10'",' + +'q c #CDE2FC",'#10'",r c #CBE1FB",'#10'",s c #F2F7FB",'#10'",t c #3F7CC5",' + +#10'",u c #4280C5",'#10'",v c #E8F1F8",'#10'",w c #D5E5FE",'#10'",x c #D3E5F' + +'C",'#10'",y c #CEE2FC",'#10'",z c #CCE2FC",'#10'",A c #C9E0FB",'#10'",B c #' + +'C8E1FB",'#10'",C c #F7FAFD",'#10'",D c #3B76C1",'#10'",E c #407CC4",'#10'",' + +'F c #E6F0F7",'#10'",G c #55B4F8",'#10'",H c #56B4F7",'#10'",I c #54B5F7",' + +#10'",J c #53B4F8",'#10'",K c #53B2F8",'#10'",L c #52B3F7",'#10'",M c #51B2F' + +'7",'#10'",N c #4FB2F7",'#10'",O c #F5F9FC",'#10'",P c #366FBF",'#10'",Q c #' + +'3C78C1",'#10'",R c #E3EDF7",'#10'",S c #6EC2FD",'#10'",T c #A0D8FF",'#10'",' + +'U c #9ED7FF",'#10'",V c #9BD6FF",'#10'",W c #98D7FF",'#10'",X c #96D6FF",' + +#10'",Y c #95D6FF",'#10'",Z c #94D5FF",'#10'",0 c #93D4FF",'#10'",1 c #65BEF' + +'B",'#10'",2 c #F4F7FB",'#10'",3 c #3167BB",'#10'",4 c #3871BF",'#10'",5 c #' + +'DFEBF5",'#10'",6 c #68BFFD",'#10'",7 c #67BDFC",'#10'",8 c #64BEFC",'#10'",' + +'9 c #62BDFC",'#10'",@ c #63BDFB",'#10'",# c #61BCFB",'#10'",; c #60BEFC",' + +#10'",: c #62BCFC",'#10'",= c #2D64B9",'#10'",+ c #3369BC",'#10'",% c #EAF1F' + +'8",'#10'",$ c #DFECF7",'#10'",( c #DEEBF6",'#10'",) c #DEEAF6",'#10'",[ c #' + +'DCEAF6",'#10'",] c #EBF3FA",'#10'"-. c #F3F7FC",'#10'"-, c #F4F8FC",'#10'"-' + +'- c #FDFEFE",'#10'"-* c #2A60B7",'#10'"-a c #3065BA",'#10'"-b c #3166BB",' + +#10'"-c c #3066BA",'#10'"-d c #2F65BA",'#10'"-e c #2E65B9",'#10'"-f c #2E64B' + +'9",'#10'"-g c #2C62B7",'#10'".....,.-.-.-.-.*.a.b.c.d........",'#10'"...e.f' + +'.g.h.i.i.i.j.f.k.l.m......",'#10'"...n.o.p.q.r.s.t.u.v.w.x.y.z....",'#10'".' + +'..A.B.C.D.E.F.G.H.I.J.K.L.M.N..",'#10'"...O.B.P.Q.R.C.S.T.U.V.f.W.X.Y..",' + +#10'"...O.Z.0.1.2.3.E.4.H.5.6.7.8.9..",'#10'"...@.#.;.:.=.+.%.$.(.H.).[.],..' + +'.",'#10'"..,,,-,*,*,a,b,c.3.$.p,d.H,e,f..",'#10'"..,g,h,i,a.:.:.=,c.Q,j.(,k' + +',l,m..",'#10'"..,n,o,b.:.:.:,p,c.3,q,r.q,s,t..",'#10'"..,u,v,w,c,c,x,x.3,y,' + +'z,A,B,C,D..",'#10'"..,E,F,G,H,I,J,K,L,L,M,N,N,O,P..",'#10'"..,Q,R,S,T,U,V,W' + +',X,Y,Z,0,1,2,3..",'#10'"..,4,5,6,7,1,8,8,9,@,#,;,:.J,=..",'#10'"..,+,%,$,(,' + +'),[,[,],],l-.-,---*..",'#10'"....-a-b-c-c-c-a-d-e-e-f-f-g...."}'#10'a'#13#0 + +#0'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 175 2",'#10'".. c Non' + +'e",'#10'"., c #9DC3EA",'#10'".- c #96BFE6",'#10'".* c #92BBE4",'#10'".a c #' + +'6CA0D1",'#10'".b c #6D9ED0",'#10'".c c #5F96CC",'#10'".d c #96BEE5",'#10'".' + +'e c #FEFFFF",'#10'".f c #E9F3FD",'#10'".g c #EAF3FD",'#10'".h c #E8F2FC",' + +#10'".i c #E3EFFA",'#10'".j c #E7F2FA",'#10'".k c #88BBEA",'#10'".l c #5585C' + +'F",'#10'".m c #93BBE4",'#10'".n c #EDF5FE",'#10'".o c #C5DEFC",'#10'".p c #' + +'C7E0FB",'#10'".q c #C2DCF9",'#10'".r c #B4D3F5",'#10'".s c #F3F9FE",'#10'".' + +'t c #C4E2FA",'#10'".u c #93C1EC",'#10'".v c #487DC3",'#10'".w c #F0F6FE",' + +#10'".x c #CDE2FC",'#10'".y c #CDE3FC",'#10'".z c #C8DFFA",'#10'".A c #BCD9F' + +'7",'#10'".B c #DDE9F5",'#10'".C c #EBF3FA",'#10'".D c #F3F8FB",'#10'".E c #' + +'5383CA",'#10'".F c #F1F7FE",'#10'".G c #D2E5FC",'#10'".H c #D1E4FC",'#10'".' + +'I c #CCE2FB",'#10'".J c #C4DDF9",'#10'".K c #BBD7F6",'#10'".L c #AFD1F3",' + +#10'".M c #E4EFFA",'#10'".N c #5887CC",'#10'".O c #D9B434",'#10'".P c #E1C25' + +'E",'#10'".Q c #E2C360",'#10'".R c #E2C35F",'#10'".S c #91BBE4",'#10'".T c #' + +'F2F7FF",'#10'".U c #D5E7FE",'#10'".V c #D1E5FD",'#10'".W c #CAE0FA",'#10'".' + +'X c #C4DEF9",'#10'".Y c #E7F2FD",'#10'".Z c #5787CC",'#10'".0 c #DAB336",' + +#10'".1 c #FEFEFD",'#10'".2 c #FFFFFE",'#10'".3 c #FFFEFE",'#10'".4 c #FFFEF' + +'D",'#10'".5 c #91BAE4",'#10'".6 c #F0F7FF",'#10'".7 c #D5E7FF",'#10'".8 c #' + +'D6E7FD",'#10'".9 c #D4E6FD",'#10'".@ c #D0E4FC",'#10'".# c #CBE3FB",'#10'".' + +'; c #C2DCFA",'#10'".: c #E8F3FE",'#10'".= c #5686CC",'#10'".+ c #DAAF35",' + +#10'".% c #FEFCF7",'#10'".$ c #F8E48E",'#10'".( c #F5DE91",'#10'".) c #F5E09' + +'F",'#10'".[ c #F6E1AC",'#10'".] c #5284CA",'#10'",. c #F1F7FF",'#10'",, c #' + +'D9E9FF",'#10'",- c #DBEAFF",'#10'",* c #D7E7FF",'#10'",a c #D2E5FF",'#10'",' + ,'b c #CBE2FF",'#10'",c c #5585CB",'#10'",d c #DAAA36",'#10'",e c #FDFAF1",' + +#10'",f c #F5DE94",'#10'",g c #F4DC93",'#10'",h c #E9BC64",'#10'",i c #DA943' + +'5",'#10'",j c #EFF6FB",'#10'",k c #5583CC",'#10'",l c #DAAB35",'#10'",m c #' + +'FBF6E8",'#10'",n c #E7BC70",'#10'",o c #E2AA55",'#10'",p c #E0A54D",'#10'",' + +'q c #EBC991",'#10'",r c #EFF3FA",'#10'",s c #FDFEFD",'#10'",t c #FCFDFF",' + +#10'",u c #FCFDFE",'#10'",v c #FBFCFE",'#10'",w c #FDFEFE",'#10'",x c #E8F2E' + +'F",'#10'",y c #5681CE",'#10'",z c #DAA637",'#10'",A c #FFFDF8",'#10'",B c #' + +'FFFDF6",'#10'",C c #FFFCF5",'#10'",D c #FEFCF3",'#10'",E c #F4E49A",'#10'",' + +'F c #F7E69A",'#10'",G c #F6E69B",'#10'",H c #F5E59D",'#10'",I c #F5E59E",' + +#10'",J c #F4E59F",'#10'",K c #F8F3DA",'#10'",L c #EEF4FD",'#10'",M c #5480C' + +'A",'#10'",N c #DAA136",'#10'",O c #FEFCF6",'#10'",P c #F8E594",'#10'",Q c #' + +'F8E593",'#10'",R c #F8E591",'#10'",S c #E9DB93",'#10'",T c #E3D793",'#10'",' + +'U c #DCD293",'#10'",V c #D7CE90",'#10'",W c #CFC88C",'#10'",X c #C6C186",' + +#10'",Y c #D6D8C9",'#10'",Z c #4474C5",'#10'",0 c #537FCA",'#10'",1 c #DA9A3' + +'6",'#10'",2 c #FDFAF2",'#10'",3 c #F8E694",'#10'",4 c #F8E592",'#10'",5 c #' + +'F8E590",'#10'",6 c #F8E38B",'#10'",7 c #F7E286",'#10'",8 c #F7E17F",'#10'",' + +'9 c #F6DE77",'#10'",@ c #F6DC6C",'#10'",# c #F4D95E",'#10'",; c #F3D54F",' + +#10'",: c #FBF2CC",'#10'",= c #FEFAEF",'#10'",+ c #F8E48F",'#10'",% c #F8E38' + +'9",'#10'",$ c #F7E182",'#10'",( c #F7DF7A",'#10'",) c #F6DE71",'#10'",[ c #' + +'F5DB67",'#10'",] c #F4D85B",'#10'"-. c #F3D44D",'#10'"-, c #F2D140",'#10'"-' + +'- c #FBF2CA",'#10'"-* c #D98E33",'#10'"-a c #FAF0DC",'#10'"-b c #F6E198",' + +#10'"-c c #F6E095",'#10'"-d c #F6DF92",'#10'"-e c #F5DE8E",'#10'"-f c #F5DC8' + +'9",'#10'"-g c #F4DA85",'#10'"-h c #F4D980",'#10'"-i c #F3D77A",'#10'"-j c #' + +'F3D574",'#10'"-k c #F2D370",'#10'"-l c #F8EAC2",'#10'"-m c #D8862C",'#10'"-' + +'n c #D8882D",'#10'"-o c #D8872D",'#10'".............,.-.*.*.a.b.c......",' + +#10'".............d.e.f.g.h.i.j.k.l..",'#10'".............m.n.o.p.q.r.s.t.u.' + +'v",'#10'".............*.w.x.y.z.A.B.C.D.E",'#10'".............*.F.G.H.I.J.K' + +'.L.M.N",'#10'".O.P.Q.Q.Q.R.S.T.U.U.V.W.X.A.Y.Z",'#10'".0.1.2.3.4.2.5.6.7.8.' + +'9.@.#.;.:.=",'#10'".+.%.$.(.).[.],.,,,-,,,*,a,b,.,c",'#10'",d,e,f,g,h,i,i,i' + +',i,i,i,i,i,i,j,k",'#10'",l,m,n,o,p,q,r,s,t,t,u,v,w,i,x,y",'#10'",z.2,A,B,C,' + +'D,E,F,G,H,I,J,K,i,L,M",'#10'",N,O,P,Q,Q,R,S,T,U,V,W,X,Y,i,Z,0",'#10'",1,2,3' + +',4,5,6,7,8,9,@,#,;,:,i....",'#10'",i,=,Q,+,%,$,(,),[,]-.-,--,i....",'#10'"-' + +'*-a-b-c-d-e-f-g-h-i-j-k-l,i....",'#10'"-m-n-o-n-n-n-n-n-n-n-n-o-n-m...."}' + +#10#1#12#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 153 2",'#10 + +'".. c None",'#10'"., c #366BBC",'#10'".- c #366BBB",'#10'".* c #366ABB",'#10 + +'".a c #396CBC",'#10'".b c #3B6EBD",'#10'".c c #3A6DBB",'#10'".d c #386BBB",' + +#10'".e c #3E70BB",'#10'".f c #D1E0F6",'#10'".g c #D1E0F7",'#10'".h c #F8FBF' + +'E",'#10'".i c #F7FBFE",'#10'".j c #F6F9FD",'#10'".k c #F0F5FC",'#10'".l c #' + +'EAF0FA",'#10'".m c #EDF2FB",'#10'".n c #F7FAFD",'#10'".o c #EBF1FB",'#10'".' + +'p c #DFE9F8",'#10'".q c #BDD0EC",'#10'".r c #5E89C9",'#10'".s c #D1DFF6",' + +#10'".t c #80AAE9",'#10'".u c #F6FAFE",'#10'".v c #F6FAFD",'#10'".w c #648CC' + +'8",'#10'".x c #EEF3FB",'#10'".y c #EAF1FB",'#10'".z c #F2F6FC",'#10'".A c #' + +'F1F6FC",'#10'".B c #E2ECF9",'#10'".C c #DBE7F8",'#10'".D c #BAD0EE",'#10'".' + +'E c #D0DFF6",'#10'".F c #7EA8E8",'#10'".G c #E9F1FA",'#10'".H c #EEF4FB",' + +#10'".I c #E8F0FA",'#10'".J c #DDE8F8",'#10'".K c #DBE6F7",'#10'".L c #7AA3E' + +'1",'#10'".M c #C3D5EF",'#10'".N c #3569B7",'#10'".O c #CCDDF5",'#10'".P c #' + +'7EA8E7",'#10'".Q c #668DC9",'#10'".R c #E9F0FA",'#10'".S c #F3F8FD",'#10'".' + +'T c #F8FAFE",'#10'".U c #EFF4FC",'#10'".V c #DFE9F9",'#10'".W c #DBE7F7",' + +#10'".X c #D9E5F7",'#10'".Y c #78A2E0",'#10'".Z c #A9C2E7",'#10'".0 c #3568B' + +'6",'#10'".1 c #C9DCF4",'#10'".2 c #7DA7E7",'#10'".3 c #E1ECF9",'#10'".4 c #' + +'E3EDF9",'#10'".5 c #EEF4FC",'#10'".6 c #F3F7FD",'#10'".7 c #E5EDFA",'#10'".' + +'8 c #D8E5F6",'#10'".9 c #77A0DE",'#10'".@ c #A4BEE4",'#10'".# c #3467B4",' + +#10'".; c #C7D9F4",'#10'".: c #7DA6E6",'#10'".= c #658DC9",'#10'".+ c #678EC' + +'9",'#10'".% c #6C92CB",'#10'".$ c #6D92CB",'#10'".( c #6990CA",'#10'".) c #' + +'658CC8",'#10'".[ c #749CDA",'#10'".] c #9FBAE1",'#10'",. c #3466B3",'#10'",' + +', c #C5D8F2",'#10'",- c #7BA4E3",'#10'",* c #7AA3E3",'#10'",a c #7AA4E3",' + +#10'",b c #7BA4E2",'#10'",c c #7BA3E2",'#10'",d c #7BA3E1",'#10'",e c #79A2E' + +'1",'#10'",f c #77A0DF",'#10'",g c #769FDE",'#10'",h c #749EDD",'#10'",i c #' + +'729CDB",'#10'",j c #749DDC",'#10'",k c #9AB5DD",'#10'",l c #3465B1",'#10'",' + +'m c #C2D5F2",'#10'",n c #78A1E0",'#10'",o c #759EDE",'#10'",p c #739BDA",' + +#10'",q c #739BD9",'#10'",r c #95B0DA",'#10'",s c #3364AF",'#10'",t c #BED2F' + +'0",'#10'",u c #7AA3E2",'#10'",v c #779FDE",'#10'",w c #769FDD",'#10'",x c #' + +'729BD9",'#10'",y c #7199D8",'#10'",z c #7099D6",'#10'",A c #8EABD5",'#10'",' + +'B c #3363AD",'#10'",C c #366ABA",'#10'",D c #BBD0EF",'#10'",E c #7AA2E2",' + ,#10'",F c #6D96D3",'#10'",G c #8AA7D2",'#10'",H c #3262AB",'#10'",I c #B8CEE' + +'F",'#10'",J c #F7FAFE",'#10'",K c #88C062",'#10'",L c #6A93CF",'#10'",M c #' + +'84A3CE",'#10'",N c #3261AA",'#10'",O c #386CBB",'#10'",P c #B6CCEE",'#10'",' + +'Q c #7AA2E1",'#10'",R c #C2DCBF",'#10'",S c #6890CD",'#10'",T c #819ECC",' + +#10'",U c #3261A8",'#10'",V c #376BBA",'#10'",W c #B3CAED",'#10'",X c #7AA2E' + +'0",'#10'",Y c #658DCA",'#10'",Z c #7C9BC9",'#10'",0 c #3160A7",'#10'",1 c #' + +'356ABA",'#10'",2 c #ADC6EB",'#10'",3 c #ADC5EA",'#10'",4 c #7C9AC8",'#10'",' + +'5 c #7998C7",'#10'",6 c #3569B9",'#10'",7 c #3569B8",'#10'",8 c #3568B7",' + +#10'",9 c #3568B5",'#10'",@ c #3466B2",'#10'",# c #3365B0",'#10'",; c #3364A' + +'E",'#10'",: c #3263AC",'#10'",= c #3262AA",'#10'",+ c #3261A9",'#10'",% c #' + +'3160A8",'#10'",$ c #3160A6",'#10'",( c #3161A8",'#10'"...,.,.,.,.-.-.*.*.a.' + +'b.c.d.e....",'#10'".,.f.g.h.i.j.k.l.m.j.n.o.p.q.r..",'#10'".,.s.t.u.v.w.x.y' + +'.z.h.A.B.C.D.q.e",'#10'".,.E.F.A.A.w.G.H.n.j.I.J.K.L.M.N",'#10'".,.O.P.I.I.' + +'Q.R.S.T.U.V.W.X.Y.Z.0",'#10'".-.1.2.3.3.4.5.n.6.7.W.X.8.9.@.#",'#10'".-.;.:' + +'.w.=.+.%.$.(.).w.w.w.[.],.",'#10'".*,,,-,*,a,b,c,d,e,f,g,h,i,j,k,l",'#10'".' + +'*,m,*,*,c,c,b,e,n.9,o,j,p,q,r,s",'#10'".*,t,u,u.L,c,d,n,v,w,j,x,y,z,A,B",' + +#10'",C,D,E.h.h.h.h.h.h.h.h.h.h,F,G,H",'#10'".d,I,e,J,K,K,K,K,K,K,K,K.j,L,M,' + +'N",'#10'",O,P,Q,J,R,R,R,R,R,R,R,R.j,S,T,U",'#10'",V,W,X,J,K,K,K,K,K,K,K,K.j' + +',Y,Z,0",'#10'",1,2,3.h.h.h.h.h.h.h.h.h.h,4,5,0",'#10'",C,6,7,8,9.#,@,#,;,:,' + +'=,+,%,0,$,("}'#10#145#13#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"' + +'16 16 178 2",'#10'".. c None",'#10'"., c #D49C6D",'#10'".- c #D29A6A",'#10 + +'".* c #CF9766",'#10'".a c #D69E70",'#10'".b c #DAB185",'#10'".c c #B9915A",' + +#10'".d c #CB9360",'#10'".e c #808080",'#10'".f c #7E7E7E",'#10'".g c #7C7C7' + +'C",'#10'".h c #7A7A7A",'#10'".i c #777777",'#10'".j c #757575",'#10'".k c #' + +'727272",'#10'".l c #D49E71",'#10'".m c #D69E6F",'#10'".n c #DCB287",'#10'".' + +'o c #E8D3AB",'#10'".p c #E6D0A9",'#10'".q c #B89058",'#10'".r c #C68E59",' + +#10'".s c #7D7D7D",'#10'".t c #999999",'#10'".u c #9A9A9A",'#10'".v c #9B9B9' + +'B",'#10'".w c #D39D6F",'#10'".x c #E7D1AA",'#10'".y c #E7D1AB",'#10'".z c #' + +'E1C798",'#10'".A c #DEC291",'#10'".B c #B78F56",'#10'".C c #C18952",'#10'".' + +'D c #599152",'#10'".E c #999A99",'#10'".F c #9C9C9C",'#10'".G c #D09A6C",' + +#10'".H c #E5CEA7",'#10'".I c #DFC18F",'#10'".J c #DCBD89",'#10'".K c #DCBD8' + +'B",'#10'".L c #B68D53",'#10'".M c #BC844B",'#10'".N c #458A3D",'#10'".O c #' + +'4F8A49",'#10'".P c #9D9D9D",'#10'".Q c #CC9666",'#10'".R c #E3CBA2",'#10'".' + +'S c #DAB983",'#10'".T c #DAB984",'#10'".U c #B58B51",'#10'".V c #B67E43",' + +#10'".W c #4D9444",'#10'".X c #4B9142",'#10'".Y c #488D3F",'#10'".Z c #45893' + +'D",'#10'".0 c #65A45D",'#10'".1 c #61A05A",'#10'".2 c #4B8345",'#10'".3 c #' + +'9E9E9E",'#10'".4 c #C99260",'#10'".5 c #E2C79E",'#10'".6 c #DAB883",'#10'".' + +'7 c #D7B47D",'#10'".8 c #D7B37E",'#10'".9 c #B4894F",'#10'".@ c #B1793B",' + +#10'".# c #4A9041",'#10'".; c #9FD294",'#10'".: c #9AD091",'#10'".= c #96CD8' + +'D",'#10'".+ c #92CB89",'#10'".% c #8DC884",'#10'".$ c #589851",'#10'".( c #' + +'467C41",'#10'".) c #9F9F9F",'#10'".[ c #C48E5A",'#10'".] c #E0C398",'#10'",' + +'. c #D7B37C",'#10'",, c #D6AF74",'#10'",- c #EDC45E",'#10'",* c #B3884B",' + +#10'",a c #AB7334",'#10'",b c #468B3E",'#10'",c c #99CE8F",'#10'",d c #87C67' + +'D",'#10'",e c #81C378",'#10'",f c #7CC073",'#10'",g c #7CC074",'#10'",h c #' + +'81C279",'#10'",i c #4F9049",'#10'",j c #577F54",'#10'",k c #BF8954",'#10'",' + +'l c #DDBF94",'#10'",m c #D4AD75",'#10'",n c #E1B863",'#10'",o c #FFD44B",' + +#10'",p c #B88B42",'#10'",q c #A66E2C",'#10'",r c #42873B",'#10'",s c #88C68' + +'0",'#10'",t c #83C37B",'#10'",u c #7FC177",'#10'",v c #4D8F47",'#10'",w c #' + +'3F743B",'#10'",x c #A1A1A1",'#10'",y c #BA844C",'#10'",z c #DBBB8D",'#10'",' + +'A c #D1A86E",'#10'",B c #D1A666",'#10'",C c #DFB45F",'#10'",D c #B18547",' + +#10'",E c #A16925",'#10'",F c #3E8237",'#10'",G c #3B7E34",'#10'",H c #37793' + +'1",'#10'",I c #34752E",'#10'",J c #509149",'#10'",K c #4C8F46",'#10'",L c #' + +'3D7339",'#10'",M c #A2A2A2",'#10'",N c #B47E45",'#10'",O c #D9B788",'#10'",' + +'P c #CFA367",'#10'",Q c #CC9E61",'#10'",R c #CC9F63",'#10'",S c #B18345",' + +#10'",T c #9C641F",'#10'",U c #606060",'#10'",V c #A0A0A0",'#10'",W c #41763' + +'D",'#10'",X c #397136",'#10'",Y c #A3A3A3",'#10'",Z c #B0793D",'#10'",0 c #' + +'D7B382",'#10'",1 c #CC9F62",'#10'",2 c #C99A5A",'#10'",3 c #CA9B5E",'#10'",' + +'4 c #AF8143",'#10'",5 c #986019",'#10'",6 c #5C5C5C",'#10'",7 c #40733C",' + +#10'",8 c #A1A1A0",'#10'",9 c #A4A4A4",'#10'",@ c #AA7436",'#10'",# c #D4AF7' + +'D",'#10'",; c #C99A5B",'#10'",: c #C79554",'#10'",= c #C89658",'#10'",+ c #' + +'AE8041",'#10'",% c #945C13",'#10'",$ c #585858",'#10'",( c #A5A5A5",'#10'",' + +') c #A56F2F",'#10'",[ c #D2AB78",'#10'",] c #D3AB78",'#10'"-. c #D1A773",' + +#10'"-, c #CDA069",'#10'"-- c #AE7F40",'#10'"-* c #91590F",'#10'"-a c #71717' + +'1",'#10'"-b c #545454",'#10'"-c c #515151",'#10'"-d c #4F4F4F",'#10'"-e c #' + ,'4C4C4C",'#10'"-f c #4A4A4A",'#10'"-g c #474747",'#10'"-h c #454545",'#10'"-' + +'i c #9D6725",'#10'"-j c #A87432",'#10'"-k c #AF7C3D",'#10'"-l c #B58447",' + +#10'"-m c #BA8A4E",'#10'"-n c #AD7E3E",'#10'"-o c #8F570C",'#10'"-p c #925A1' + +'0",'#10'"-q c #90580D",'#10'"-r c #925C13",'#10'"..........................' + +'.,.-.*",'#10'".......................a.,.b.c.d",'#10'".....e.f.g.h.i.j.k.l.' + +'m.n.o.p.q.r",'#10'".....s.t.t.u.u.v.v.w.x.y.z.A.B.C",'#10'".....h.t.D.E.v.F' + +'.F.G.H.I.J.K.L.M",'#10'".....i.u.N.O.F.P.P.Q.R.J.S.T.U.V",'#10'".W.X.Y.Z.0.' + +'1.2.3.3.4.5.6.7.8.9.@",'#10'".#.;.:.=.+.%.$.(.).[.],.,,,-,*,a",'#10'",b,c,d' + +',e,f,g,h,i,j,k,l,m,n,o,p,q",'#10'",r.+.%,s,t,u,v,w,x,y,z,A,B,C,D,E",'#10'",' + +'F,G,H,I,J,K,L,x,M,N,O,P,Q,R,S,T",'#10'"....,U,V,W,X,M,M,Y,Z,0,1,2,3,4,5",' + +#10'"....,6,x,7,8,Y,Y,9,@,#,;,:,=,+,%",'#10'"....,$,M,M,Y,9,9,(,),[,]-.-,---' + +'*",'#10'".t-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o",'#10'"........................-p' + +'-q-r-o"}'#10'6'#5#0#0'BM6'#5#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#16#0#0#0#16#0#0#0 + +#1#0#8#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 + +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#192#220 + +#192#0#240#202#166#0#0' @'#0#0' `'#0#0' '#128#0#0' '#160#0#0' '#192#0#0' ' + +#224#0#0'@'#0#0#0'@ '#0#0'@@'#0#0'@`'#0#0'@'#128#0#0'@'#160#0#0'@'#192#0#0'@' + +#224#0#0'`'#0#0#0'` '#0#0'`@'#0#0'``'#0#0'`'#128#0#0'`'#160#0#0'`'#192#0#0'`' + +#224#0#0#128#0#0#0#128' '#0#0#128'@'#0#0#128'`'#0#0#128#128#0#0#128#160#0#0 + +#128#192#0#0#128#224#0#0#160#0#0#0#160' '#0#0#160'@'#0#0#160'`'#0#0#160#128#0 + +#0#160#160#0#0#160#192#0#0#160#224#0#0#192#0#0#0#192' '#0#0#192'@'#0#0#192'`' + +#0#0#192#128#0#0#192#160#0#0#192#192#0#0#192#224#0#0#224#0#0#0#224' '#0#0#224 + +'@'#0#0#224'`'#0#0#224#128#0#0#224#160#0#0#224#192#0#0#224#224#0'@'#0#0#0'@' + +#0' '#0'@'#0'@'#0'@'#0'`'#0'@'#0#128#0'@'#0#160#0'@'#0#192#0'@'#0#224#0'@ '#0 + +#0'@ '#0'@ @'#0'@ `'#0'@ '#128#0'@ '#160#0'@ '#192#0'@ '#224#0'@@'#0#0'@@ ' + +#0'@@@'#0'@@`'#0'@@'#128#0'@@'#160#0'@@'#192#0'@@'#224#0'@`'#0#0'@` '#0'@`@' + +#0'@``'#0'@`'#128#0'@`'#160#0'@`'#192#0'@`'#224#0'@'#128#0#0'@'#128' '#0'@' + +#128'@'#0'@'#128'`'#0'@'#128#128#0'@'#128#160#0'@'#128#192#0'@'#128#224#0'@' + +#160#0#0'@'#160' '#0'@'#160'@'#0'@'#160'`'#0'@'#160#128#0'@'#160#160#0'@'#160 + +#192#0'@'#160#224#0'@'#192#0#0'@'#192' '#0'@'#192'@'#0'@'#192'`'#0'@'#192#128 + +#0'@'#192#160#0'@'#192#192#0'@'#192#224#0'@'#224#0#0'@'#224' '#0'@'#224'@'#0 + +'@'#224'`'#0'@'#224#128#0'@'#224#160#0'@'#224#192#0'@'#224#224#0#128#0#0#0 + +#128#0' '#0#128#0'@'#0#128#0'`'#0#128#0#128#0#128#0#160#0#128#0#192#0#128#0 + +#224#0#128' '#0#0#128' '#0#128' @'#0#128' `'#0#128' '#128#0#128' '#160#0#128 + +' '#192#0#128' '#224#0#128'@'#0#0#128'@ '#0#128'@@'#0#128'@`'#0#128'@'#128#0 + +#128'@'#160#0#128'@'#192#0#128'@'#224#0#128'`'#0#0#128'` '#0#128'`@'#0#128'`' + +'`'#0#128'`'#128#0#128'`'#160#0#128'`'#192#0#128'`'#224#0#128#128#0#0#128#128 + +' '#0#128#128'@'#0#128#128'`'#0#128#128#128#0#128#128#160#0#128#128#192#0#128 + +#128#224#0#128#160#0#0#128#160' '#0#128#160'@'#0#128#160'`'#0#128#160#128#0 + +#128#160#160#0#128#160#192#0#128#160#224#0#128#192#0#0#128#192' '#0#128#192 + +'@'#0#128#192'`'#0#128#192#128#0#128#192#160#0#128#192#192#0#128#192#224#0 + +#128#224#0#0#128#224' '#0#128#224'@'#0#128#224'`'#0#128#224#128#0#128#224#160 + +#0#128#224#192#0#128#224#224#0#192#0#0#0#192#0' '#0#192#0'@'#0#192#0'`'#0#192 + +#0#128#0#192#0#160#0#192#0#192#0#192#0#224#0#192' '#0#0#192' '#0#192' @'#0 + +#192' `'#0#192' '#128#0#192' '#160#0#192' '#192#0#192' '#224#0#192'@'#0#0#192 + +'@ '#0#192'@@'#0#192'@`'#0#192'@'#128#0#192'@'#160#0#192'@'#192#0#192'@'#224 + +#0#192'`'#0#0#192'` '#0#192'`@'#0#192'``'#0#192'`'#128#0#192'`'#160#0#192'`' + +#192#0#192'`'#224#0#192#128#0#0#192#128' '#0#192#128'@'#0#192#128'`'#0#192 + +#128#128#0#192#128#160#0#192#128#192#0#192#128#224#0#192#160#0#0#192#160' '#0 + +#192#160'@'#0#192#160'`'#0#192#160#128#0#192#160#160#0#192#160#192#0#192#160 + +#224#0#192#192#0#0#192#192' '#0#192#192'@'#0#192#192'`'#0#192#192#128#0#192 + +#192#160#0#240#251#255#0#164#160#160#0#128#128#128#0#0#0#255#0#0#255#0#0#0 + +#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#246#246#246#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246 + +#24#24#24#0#246#246#246#246#246#246#246#246#246#246#246#24#24#2#24#0#16#246 + +#246#246#246#246#246#246#246#246#24#2#2'(('#24#24#0#246#246#246#246#246#246 + +#246#2#2'((0('#2#24#24#0#246#246#246#246#246#246#0#2'(0'#186'0('#2#24#0#246 + +#246#246#246#246#246#251'(0'#186#250'((('#2#24#246#246#246#0#246#246#0'0'#186 + +#0#186#186'((('#2#246#246#246#251#0#246#251'('#0#251#186#186#186#186'(('#246 + +#246#246#246#251#0#0#0#251#186#186#186#186#186#186'x'#246#246#246#0#246#251 + +#251#251'x'#0#0#0'y'#185#185#246#246#246#246#251#246#251#251#251#185#251#251 + +#251#250'y'#246#246#246#246#246#246#0#251#251#251#0#246#185#185#246#246#246 + +#246#246#246#246#0#251#246#0#246#251#0#246#246#246#246#246#246#246#246#246 + +#251#246#246#251#246#246#251#246#246#246#246#246#246#246#246#246#246#246#246 + ,#246#246#246#246#246#246#246#246#246#246#246#246'6'#5#0#0'BM6'#5#0#0#0#0#0#0 + +'6'#4#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0#8#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0#0#0#128#0#128 + +#0#128#128#0#0#192#192#192#0#192#220#192#0#240#202#166#0#0' @'#0#0' `'#0#0' ' + +#128#0#0' '#160#0#0' '#192#0#0' '#224#0#0'@'#0#0#0'@ '#0#0'@@'#0#0'@`'#0#0'@' + +#128#0#0'@'#160#0#0'@'#192#0#0'@'#224#0#0'`'#0#0#0'` '#0#0'`@'#0#0'``'#0#0'`' + +#128#0#0'`'#160#0#0'`'#192#0#0'`'#224#0#0#128#0#0#0#128' '#0#0#128'@'#0#0#128 + +'`'#0#0#128#128#0#0#128#160#0#0#128#192#0#0#128#224#0#0#160#0#0#0#160' '#0#0 + +#160'@'#0#0#160'`'#0#0#160#128#0#0#160#160#0#0#160#192#0#0#160#224#0#0#192#0 + +#0#0#192' '#0#0#192'@'#0#0#192'`'#0#0#192#128#0#0#192#160#0#0#192#192#0#0#192 + +#224#0#0#224#0#0#0#224' '#0#0#224'@'#0#0#224'`'#0#0#224#128#0#0#224#160#0#0 + +#224#192#0#0#224#224#0'@'#0#0#0'@'#0' '#0'@'#0'@'#0'@'#0'`'#0'@'#0#128#0'@'#0 + +#160#0'@'#0#192#0'@'#0#224#0'@ '#0#0'@ '#0'@ @'#0'@ `'#0'@ '#128#0'@ '#160#0 + +'@ '#192#0'@ '#224#0'@@'#0#0'@@ '#0'@@@'#0'@@`'#0'@@'#128#0'@@'#160#0'@@'#192 + +#0'@@'#224#0'@`'#0#0'@` '#0'@`@'#0'@``'#0'@`'#128#0'@`'#160#0'@`'#192#0'@`' + +#224#0'@'#128#0#0'@'#128' '#0'@'#128'@'#0'@'#128'`'#0'@'#128#128#0'@'#128#160 + +#0'@'#128#192#0'@'#128#224#0'@'#160#0#0'@'#160' '#0'@'#160'@'#0'@'#160'`'#0 + +'@'#160#128#0'@'#160#160#0'@'#160#192#0'@'#160#224#0'@'#192#0#0'@'#192' '#0 + +'@'#192'@'#0'@'#192'`'#0'@'#192#128#0'@'#192#160#0'@'#192#192#0'@'#192#224#0 + +'@'#224#0#0'@'#224' '#0'@'#224'@'#0'@'#224'`'#0'@'#224#128#0'@'#224#160#0'@' + +#224#192#0'@'#224#224#0#128#0#0#0#128#0' '#0#128#0'@'#0#128#0'`'#0#128#0#128 + +#0#128#0#160#0#128#0#192#0#128#0#224#0#128' '#0#0#128' '#0#128' @'#0#128' `' + +#0#128' '#128#0#128' '#160#0#128' '#192#0#128' '#224#0#128'@'#0#0#128'@ '#0 + +#128'@@'#0#128'@`'#0#128'@'#128#0#128'@'#160#0#128'@'#192#0#128'@'#224#0#128 + +'`'#0#0#128'` '#0#128'`@'#0#128'``'#0#128'`'#128#0#128'`'#160#0#128'`'#192#0 + +#128'`'#224#0#128#128#0#0#128#128' '#0#128#128'@'#0#128#128'`'#0#128#128#128 + +#0#128#128#160#0#128#128#192#0#128#128#224#0#128#160#0#0#128#160' '#0#128#160 + +'@'#0#128#160'`'#0#128#160#128#0#128#160#160#0#128#160#192#0#128#160#224#0 + +#128#192#0#0#128#192' '#0#128#192'@'#0#128#192'`'#0#128#192#128#0#128#192#160 + +#0#128#192#192#0#128#192#224#0#128#224#0#0#128#224' '#0#128#224'@'#0#128#224 + +'`'#0#128#224#128#0#128#224#160#0#128#224#192#0#128#224#224#0#192#0#0#0#192#0 + +' '#0#192#0'@'#0#192#0'`'#0#192#0#128#0#192#0#160#0#192#0#192#0#192#0#224#0 + +#192' '#0#0#192' '#0#192' @'#0#192' `'#0#192' '#128#0#192' '#160#0#192' ' + +#192#0#192' '#224#0#192'@'#0#0#192'@ '#0#192'@@'#0#192'@`'#0#192'@'#128#0#192 + +'@'#160#0#192'@'#192#0#192'@'#224#0#192'`'#0#0#192'` '#0#192'`@'#0#192'``'#0 + +#192'`'#128#0#192'`'#160#0#192'`'#192#0#192'`'#224#0#192#128#0#0#192#128' '#0 + +#192#128'@'#0#192#128'`'#0#192#128#128#0#192#128#160#0#192#128#192#0#192#128 + +#224#0#192#160#0#0#192#160' '#0#192#160'@'#0#192#160'`'#0#192#160#128#0#192 + +#160#160#0#192#160#192#0#192#160#224#0#192#192#0#0#192#192' '#0#192#192'@'#0 + +#192#192'`'#0#192#192#128#0#192#192#160#0#240#251#255#0#164#160#160#0#128#128 + +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 + +#255#255#0#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246 + +#246#246#249#249#1#10#0#246#246#246#0#249#249#0#246#246#246#246#246#249#249 + +#249#1#0#246#0#13#249#0#246#246#246#246#246#246#246#249#249#249#1#0#249#249 + +'S'#246#246#246#246#246#246#246#246#246'\'#249#249#249#249'T'#246#246#246#246 + +#246#246#246#246#246'\'#0#249#249#249#249#0'R'#246#246#246#246#246#246#246']' + +#0#249#249#18'f'#249#249#0'I'#246#246#246#246#246#246#0#249#249'g'#191'g^' + +#249#249#0#246#246#246#246#246#0#249#249'g'#191'off^'#249#249#246#246#246#246 + +#246#249#249'g'#191'g'#191#191'f^f'#249#246#246#246#246#246#246']]o'#191#191 + +#191#191#191'^f'#246#246#246#246#246#246'o'#191#191#191#191#191#191#191#191 + +'o'#246#246#246#246#246#246#246'oowwwwww'#246#246#246#246#246#246#246#246#246 + +'wwooow'#246#246#246#246#246#246#246#246#246#246#246#246'ww'#246#246#246#246 + +#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246#246 + +#0#0#22'TSelectDirectoryDialog'#5'SDDir'#5'Title'#6#16'Select Directory'#11 + +'FilterIndex'#2#0#4'left'#3#162#0#3'top'#2'B'#0#0#0 +]); diff --git a/examples/cleandir/frmmain.pp b/examples/cleandir/frmmain.pp new file mode 100644 index 0000000000..dede1291ee --- /dev/null +++ b/examples/cleandir/frmmain.pp @@ -0,0 +1,1047 @@ +{ Directory cleaning component configuration window + + Copyright (C) 2007 Michael Van Canneyt michael@freepascal.org + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} + + +unit frmmain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus, + ActnList, ComCtrls, ExtDlgs, ExtCtrls, RTTICtrls, StdCtrls, Buttons, dircleaner, + RTTIGrids; + +type + + { TMainForm } + + TMainForm = class(TForm) + AExecute: TAction; + ATest: TAction; + ADeleteItem: TAction; + ANewItem: TAction; + AQuit: TAction; + ASaveAs: TAction; + ASave: TAction; + AOpen: TAction; + ANew: TAction; + ALMain: TActionList; + ILMain: TImageList; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + Label7: TLabel; + LEDailyAt: TLabel; + LSEHourlyAt: TLabel; + LSEFileActionMinCompressSize: TLabel; + LELocationName: TLabel; + LVFileActions: TListView; + LVLocations: TListView; + LVDirectories: TListView; + MIRun: TMenuItem; + MITest: TMenuItem; + MRun: TMenuItem; + MIDeleteItem: TMenuItem; + MINewItem: TMenuItem; + MItems: TMenuItem; + MIQuit: TMenuItem; + MISep1: TMenuItem; + MISaveAs: TMenuItem; + MISave: TMenuItem; + MIOpen: TMenuItem; + MNew: TMenuItem; + MFile: TMenuItem; + MMMain: TMainMenu; + ODConfig: TOpenDialog; + PFileAction: TPanel; + PLocation: TPanel; + PCConfig: TPageControl; + POptions: TPanel; + PDirectories: TPanel; + SBLocationPath: TSpeedButton; + SDConfig: TSaveDialog; + SDDir: TSelectDirectoryDialog; + SBDirPath: TSpeedButton; + CBDirEnabled: TTICheckBox; + CBDirRecurse: TTICheckBox; + CBStopOnError: TTICheckBox; + CBAllFileActions: TTICheckBox; + EDirName: TTIEdit; + EDirPath: TTIEdit; + ELocationName: TTIEdit; + ELocationBaseDir: TTIEdit; + CGLocationSubdirs: TTICheckGroup; + CBFileActionDelete: TTICheckBox; + CBFileActionCompress: TTICheckBox; + CBFileActionLocationName: TTIComboBox; + EFileActionName: TTIEdit; + EFileActionExtensions: TTIEdit; + SEFileActionMinCompressSize: TTISpinEdit; + CBLogAllFiles: TTICheckBox; + CGScheduleDays: TTICheckGroup; + EDailyAt: TTIEdit; + RGScheduleMode: TTIRadioGroup; + SEHourlyAt: TTISpinEdit; + TSScheduling: TTabSheet; + ToolButton1: TToolButton; + TBNewItem: TToolButton; + TBDeleteItem: TToolButton; + TSLocations: TTabSheet; + TSFileActions: TTabSheet; + TSOptions: TTabSheet; + TBMain: TToolBar; + TBQuit: TToolButton; + ToolButton2: TToolButton; + TBNew: TToolButton; + TBOpen: TToolButton; + TBSave: TToolButton; + procedure ADeleteItemExecute(Sender: TObject); + procedure ADeleteItemUpdate(Sender: TObject); + procedure AExecuteUpdate(Sender: TObject); + procedure ANewExecute(Sender: TObject); + procedure ANewItemExecute(Sender: TObject); + procedure AOpenExecute(Sender: TObject); + procedure AQuitExecute(Sender: TObject); + procedure ASaveAsExecute(Sender: TObject); + procedure ASaveExecute(Sender: TObject); + procedure ASaveUpdate(Sender: TObject); + procedure ATestExecute(Sender: TObject); + procedure ActionChanged(Sender: TObject); + procedure CBFileActionCompressChange(Sender: TObject); + procedure DirectoryChanged(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); + procedure FormShow(Sender: TObject); + procedure LocationChanged(Sender: TObject); + procedure LVDirectoriesSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure LVFileActionsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure LVLocationsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure OptionsChanged(Sender: TObject); + procedure PCConfigChange(Sender: TObject); + procedure RGScheduleModeClick(Sender: TObject); + procedure SBDirPathClick(Sender: TObject); + procedure SBLocationPathClick(Sender: TObject); + procedure ScheduleModeChanged(Sender: TObject); + private + { private declarations } + FCleaner : TCleanDirs; + // For easy access + FLocations : TLocations; + FDirectories : TDirectories; + FFileActions : TFileActions; + // Currently shown + FLocation : TLocation; + FDirectory : TDirectory; + FFileAction : TFileAction; + // Tracking changes + FLocationChanged, + FDirectoryChanged, + FFileActionChanged, + FOptionChanged : Boolean; + procedure CheckScheduleMode; + procedure RunConfig(ACleaner: TCleanDirs; TestOnly: Boolean); + Procedure SaveCurrentRTTI; + procedure CheckInit; + procedure ClearChanged; + Function DataModified : Boolean; + procedure CheckCompressMinSize; + function CheckSave: Boolean; + procedure DeleteDirectory; + procedure DeleteFileAction; + procedure DeleteItem; + function DeleteListItem(LV: TListView): TListItem; + procedure DeleteLocation; + function HaveDirectory: Boolean; + function HaveFileAction: Boolean; + function HaveItem: Boolean; + function HaveLocation: Boolean; + procedure LoadFile(AFileName: String); + procedure NewConfig; + procedure NewItem; + procedure NewDirectory; + procedure NewFileAction; + procedure NewLocation; + function OpenFile: Boolean; + procedure RefreshDirectoryItem(LI: TListItem); + procedure RefreshFileActionItem(LI: TListItem); + procedure RefreshLocationItem(LI: TListItem); + function SaveData: Boolean; + function SaveDataAs: Boolean; + Function Selectdir(Current : String) : String; + procedure ShowDirectoryItem(LI: TListItem); + procedure ShowFileActionItem(LI: TListItem); + procedure ShowLocationItem(LI: TListItem); + procedure UpdateActionLocations(Loc: TLocations); + public + { public declarations } + Procedure ShowDiskCleaner(ACleaner : TCleanDirs); + Procedure ShowLocations(ALocations : TLocations); + Procedure ShowDirectories(ADirectories : TDirectories); + Procedure ShowFileActions(AFileActions : TFileActions); + end; + +var + MainForm: TMainForm; + +implementation + +uses + frmLog, + typinfo; + +ResourceString + SYes = 'Yes'; + SNo = 'No'; + SSubdirExtension = 'Extension'; + SSubdirYear = 'Year'; + SSubdirMonth = 'Month'; + SSubdirDay = 'Day'; + SSubdirDate = 'Date'; + SSubdirHour = 'Hour'; + SSubdirMin = 'Min'; + SSubdirTime = 'Time'; + SDataChanged = 'The configuration has changed. Save changes ?'; + + +Function BoolStr(B : Boolean) : String; + +begin + if B then + Result:=SYes + else + Result:=SNo; +end; + +Function SubdirsToStr(S : TSubDirs) : String; + + Procedure AddToResult(Const ToAdd: String); + + begin + If (Result<>'') then + Result:=Result+','; + Result:=Result+ToAdd + + end; + +Var + D : TSubDir; + A : String; + +begin + Result:=''; + For D:=Low(TSubDir) to High(TSubDir) do + If D in S then + begin + case D of + sdExtension : A:=SSubDirExtension; + sdYear : A:=SSubDirYear; + sdMonth : A:=SSubDirMonth; + sdDay : A:=SSubDirDay; + sdDate : A:=SSubDirDate; + sdHour : A:=SSubDirHour; + sdMin : A:=SSubDirMin; + sdTime : A:=SSubDirTime; + else + A:='?'; + end; + AddToResult(A); + end; +end; + +{ TMainForm } + +procedure TMainForm.ANewExecute(Sender: TObject); +begin + NewConfig; +end; + +procedure TMainForm.ADeleteItemExecute(Sender: TObject); +begin + DeleteItem; +end; + +procedure TMainForm.ADeleteItemUpdate(Sender: TObject); +begin + (Sender as Taction).Enabled:=HaveItem; +end; + +procedure TMainForm.AExecuteUpdate(Sender: TObject); +begin + (Sender as Taction).Enabled:=(FCleaner<>Nil) and (FFileActions.Count>0); +end; + +procedure TMainForm.ANewItemExecute(Sender: TObject); +begin + NewItem; +end; + +procedure TMainForm.AOpenExecute(Sender: TObject); +begin + OpenFile; +end; + +procedure TMainForm.AQuitExecute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.ASaveAsExecute(Sender: TObject); +begin + SaveDataAs; +end; + +procedure TMainForm.ASaveExecute(Sender: TObject); +begin + SaveData; +end; + +procedure TMainForm.ASaveUpdate(Sender: TObject); +begin + (Sender as Taction).Enabled:=DataModified; +end; + +procedure TMainForm.ATestExecute(Sender: TObject); +begin + RunConfig(FCleaner,(Sender=ATest)); +end; + +procedure TMainForm.ActionChanged(Sender: TObject); +begin + FFileActionChanged:=True; +end; + + +procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean); +begin + CanClose:=CheckSave; +end; + +procedure TMainForm.FormShow(Sender: TObject); +begin + CheckInit; +end; + +Function TMainForm.Selectdir(Current : String) : String; + +begin + With SDDir do + begin + If (Current<>'') then + InitialDir:=Current + else + InitialDir:=UserDir; + If Execute then + Result:=FileName + else + Result:=Current; + end; +end; + +{ --------------------------------------------------------------------- + Config file management; + ---------------------------------------------------------------------} + +procedure TMainForm.NewConfig; + +begin + If Not CheckSave Then + Exit; + FreeAndNil(FCleaner); + ShowDiskCleaner(TCleanDirs.Create(Self)); +end; + +procedure TMainForm.ShowDiskCleaner(ACleaner: TCleanDirs); +begin + FCleaner:=ACleaner; + CBStopOnError.Link.TIObject:=FCleaner; + CBAllFileActions.Link.TIObject:=FCleaner; + CBLogAllFiles.Link.TIObject:=FCleaner; + RGScheduleMode.link.TIObject:=FCLeaner; + CGScheduleDays.link.TIObject:=FCLeaner; + EDailyAt.Link.TIObject:=FCleaner; + SEHourlyAt.Link.TIObject:=FCleaner; + ShowDirectories(FCleaner.Directories); + ShowLocations(FCleaner.Locations); + ShowFileActions(FCleaner.FileActions); + ClearChanged; +end; + +Procedure TMainForm.ClearChanged; + +begin + FLocationChanged:=False; + FDirectoryChanged:=False; + FFileActionChanged:=False; + FOptionChanged:=False; +end; + +procedure TMainForm.SaveCurrentRTTI; + +Var + C : TWinControl; + L : TPropertyLink; + +begin + C:=Self.ActiveControl; + If Assigned(C) then + begin + If IsPublishedProp(C,'Link') then + begin + L:=GetObjectProp(C,'Link',TPropertyLink) as TPropertyLink; + L.SaveToProperty; + end; + end; +end; + +function TMainForm.DataModified: Boolean; +begin + Result:=FOptionChanged + or FDirectoryChanged + or FFileActionChanged + or FLocationChanged; +end; + + +Function TMainForm.CheckSave : Boolean; // Return true if all OK, false if cancelled + +begin + SaveCurrentRTTI; + Result:=Not DataModified; + If Not Result then + begin + Result:=True; + case MessageDlg(SDataChanged,mtWarning,[mbYes,mbNo,mbCancel],0) of + mrYes : Result:=SaveData; + mrCancel : Result:=False; + end; + end; +end; + +Function TMainForm.SaveData : Boolean; + +begin + If (FCleaner.ConfigFile<>'') then + begin + FCleaner.SaveToFile(FCleaner.ConfigFile); + ClearChanged; + end + else + Result:=SaveDataAs; +end; + +Function TMainForm.SaveDataAs : Boolean; + +begin + With SDConfig do + begin + FileName:=FCleaner.ConfigFile; + Result:=Execute; + If Result then + begin + FCleaner.SaveToFile(FileName); + ClearChanged; + end; + end; +end; + +Function TMainForm.OpenFile : Boolean; + +begin + Result:=CheckSave; + If Result then + With ODConfig do + begin + Result:=Execute; + If Result then + LoadFile(FileName); + end; +end; + +procedure TMainForm.LoadFile(AFileName : String); + +Var + D : TCleanDirs; + +begin + D:=TCleanDirs.Create(Self); + Try + D.LoadFromFile(AFileName); + except + D.Free; + Raise; + end; + FreeAndNil(FCleaner); + ShowDiskCleaner(D); +end; + +procedure TMainForm.CheckInit; + +begin + If (Application.ParamCount>0) and FileExists(Application.Params[1]) then + LoadFile(Application.Params[1]) + else + NewConfig; +end; + +procedure TMainForm.NewItem; + +Var + TS : TTabSheet; + +begin + SaveCurrentRTTI; + TS:=PCConfig.ActivePage; + If (TS=TSOptions) then + NewDirectory + else If (TS=TSLocations) then + NewLocation + else if (TS=TSFileActions) then + NewFileAction; +end; + +procedure TMainForm.DeleteItem; + +Var + TS : TTabSheet; + +begin + TS:=PCConfig.ActivePage; + If (TS=TSOptions) then + DeleteDirectory + else If (TS=TSLocations) then + DeleteLocation + else if (TS=TSFileActions) then + DeleteFileAction; +end; + +Function TMainForm.HaveItem : Boolean; + +Var + TS : TTabSheet; + +begin + Result:=False; + TS:=PCConfig.ActivePage; + If (TS=TSOptions) then + Result:=HaveDirectory + else If (TS=TSLocations) then + Result:=HaveLocation + else if (TS=TSFileActions) then + Result:=HaveFileAction +end; + +procedure TMainForm.OptionsChanged(Sender: TObject); +begin + FOptionChanged:=True; +end; + +procedure TMainForm.PCConfigChange(Sender: TObject); +begin + If (PCConfig.ActivePage=TSFileActions) and Assigned(FLocations) then + UpdateActionLocations(FLocations); +end; + +procedure TMainForm.RGScheduleModeClick(Sender: TObject); +begin + +end; + +procedure TMainForm.RunConfig(ACleaner : TCleanDirs; TestOnly : Boolean); + +Var + LO : Boolean; + F : TLogForm; + +begin + LO:=ACleaner.LogOnly; + try + ACleaner.LogOnly:=TestOnly; + F:=TLogForm.Create(Self); + try + F.Cleaner:=ACleaner; + F.ShowModal; + finally + F.Free; + end; + finally + ACleaner.LogOnly:=LO; + end; +end; + +procedure TMainForm.ScheduleModeChanged(Sender: TObject); +begin + CheckScheduleMode; + OptionsChanged(Sender); +end; + +procedure TMainForm.CheckScheduleMode; + +Var + D : Boolean; + + +begin + D:=(RGScheduleMode.ItemIndex=0); + EDailyAt.Enabled:=D; + SEHourlyAt.Enabled:=Not D; +end; + + +{ --------------------------------------------------------------------- + Directories + ---------------------------------------------------------------------} + + +procedure TMainForm.ShowDirectories(ADirectories: TDirectories); + +Var + LI : TListItem; + D : TDirectory; + I : Integer; + +begin + FDirectories:=ADirectories; + With LVDirectories do + begin + BeginUpdate; + Try + Items.Clear; + For I:=0 to FDirectories.Count-1 do + begin + D:=FDirectories[i]; + LI:=LVDirectories.Items.Add; + LI.Data:=D; + RefreshDirectoryItem(LI); + end; + If (LVDirectories.Items.Count>0) then + ShowDirectoryItem(LVDirectories.Items[i]) + else + ShowDirectoryItem(Nil) + Finally + EndUpdate; + end; + end; +end; + + +procedure TMainForm.LVDirectoriesSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); +begin + If Selected then + ShowDirectoryItem(Item) + else + ShowDirectoryItem(Nil); +end; + + + +procedure TMainForm.RefreshDirectoryItem(LI: TListItem); + +Var + D : TDirectory; + +begin + If Not Assigned(Li) then + Exit; + D:=TDirectory(LI.Data); + LI.Caption:=BoolStr(D.Enabled); + LI.SubItems.Clear; + LI.SubItems.Add(BoolStr(D.Recurse)); + LI.SubItems.Add(D.Name); + LI.SubItems.Add(D.Path); +end; + + +procedure TMainForm.ShowDirectoryItem(LI: TListItem); + +begin + If (LI=Nil) then + FDirectory:=Nil + else + FDirectory:=TDirectory(LI.Data); + EDirName.Link.TIObject:=FDirectory; + EDirPath.Link.TIObject:=FDirectory; + CBDirEnabled.Link.TIObject:=FDirectory; + CBDirRecurse.link.TIOBject:=FDirectory; +end; + + +procedure TMainForm.NewDirectory; + +Var + D : TDirectory; + LI : TListItem; + +begin + RefreshDirectoryItem(LVDirectories.Selected); + D:=FDirectories.AddDirectory; + LI:=LVDirectories.Items.Add; + LI.Data:=D; + LVDirectories.Selected:=LI; + RefreshDirectoryItem(LI); + ShowDirectoryItem(LI); + FDirectoryChanged:=True; +end; + + +Function TMainForm.DeleteListItem(LV : TListView) : TListItem; + +Var + LI : TListItem; + I : Integer; + +begin + Result:=Nil; + LI:=LV.Selected; + if (Li<>Nil) then + begin + I:=LI.Index; + LI.Free; + If (I>=LV.Items.Count) then + Dec(I); + If (I<LV.Items.Count) then + Result:=LV.Items[I]; + end; +end; + +procedure TMainForm.DeleteDirectory; + +begin + FreeAndNil(FDirectory); + ShowDirectoryItem(DeleteListItem(LVDirectories)); + FDirectoryChanged:=True; +end; + +Function TMainForm.HaveDirectory : Boolean; + +begin + Result:=(FDirectory<>Nil); +end; + +procedure TMainForm.DirectoryChanged(Sender: TObject); +begin + RefreshDirectoryItem(LVDirectories.Selected); + FDirectoryChanged:=True; +end; + + +procedure TMainForm.SBDirPathClick(Sender: TObject); + +begin + If Assigned(FDirectory) then + begin + FDirectory.Path:=SelectDir(FDirectory.Path); + EDirPath.Link.LoadFromProperty; + end; +end; + +{ --------------------------------------------------------------------- + Locations + ---------------------------------------------------------------------} + +procedure TMainForm.LVLocationsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); +begin + If Selected then + ShowLocationItem(Item) + else + ShowLocationItem(Nil) +end; + +procedure TMainForm.LocationChanged(Sender: TObject); +begin + RefreshLocationItem(LVLocations.Selected); + FLocationChanged:=True; +end; + + +procedure TMainForm.SBLocationPathClick(Sender: TObject); +begin + If Assigned(FLocation) then + begin + FLocation.BasePath:=SelectDir(FLocation.BasePath); + ELocationBaseDir.Link.LoadFromProperty; + end; +end; + + + +procedure TMainForm.ShowLocations(ALocations: TLocations); + +Var + LI : TListItem; + L : TLocation; + I : Integer; + +begin + FLocations:=ALocations; + With LVLocations do + begin + BeginUpdate; + Try + Items.Clear; + For I:=0 to FLocations.Count-1 do + begin + L:=FLocations[i]; + LI:=LVLocations.Items.Add; + LI.Data:=L; + RefreshLocationItem(LI); + end; + If (LVLocations.Items.Count>0) then + ShowLocationItem(LVLocations.Items[i]) + else + ShowLocationItem(Nil) + Finally + EndUpdate; + end; + end; + UpdateActionLocations(ALocations); +end; + +procedure TMainForm.RefreshLocationItem(LI: TListItem); + +Var + L : TLocation; + +begin + If Not Assigned(Li) then + Exit; + L:=TLocation(LI.Data); + LI.Caption:=L.Name; + LI.SubItems.Clear; + LI.SubItems.Add(L.BasePath); + LI.SubItems.Add(SubdirsToStr(L.SubDirs)); +end; + + +procedure TMainForm.ShowLocationItem(LI: TListItem); + +begin + If (LI=Nil) then + FLocation:=Nil + else + FLocation:=TLocation(LI.Data); + ELocationName.Link.TIObject:=FLocation; + ELocationBaseDir.Link.TIObject:=FLocation; + CGLocationSubdirs.Link.TIObject:=FLocation; +end; + +procedure TMainForm.UpdateActionLocations(Loc : TLocations); + +Var + I,J : Integer; + +begin + With CBFileActionLocationName.Items do + begin + BeginUpdate; + Try + Clear; + For I:=0 to Loc.Count-1 do + begin + Writeln('Adding ',Loc[i].Name); + J:=Add(Loc[i].Name); + Objects[J]:=Loc[i]; + end; + Finally + EndUpdate; + end; + end; +end; + +procedure TMainForm.NewLocation; + +Var + D : TLocation; + LI : TListItem; + +begin + RefreshLocationItem(LVLocations.Selected); + D:=FLocations.AddLocation; + LI:=LVLocations.Items.Add; + LI.Data:=D; + LVLocations.Selected:=LI; + ShowLocationItem(LI); +end; + +procedure TMainForm.DeleteLocation; + +begin + FreeAndNil(FLocation); + ShowDirectoryItem(DeleteListItem(LVLocations)); +end; + +Function TMainForm.HaveLocation : Boolean; + +begin + Result:=(FLocation<>Nil) +end; + +{ --------------------------------------------------------------------- + FileActions + ---------------------------------------------------------------------} + +procedure TMainForm.LVFileActionsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); +begin + If Selected then + ShowFileActionItem(Item) + else + ShowFileActionItem(Nil) +end; + +procedure TMainForm.CBFileActionCompressChange(Sender: TObject); +begin + ActionChanged(Sender); + CheckCompressMinSize; +end; + + +procedure TMainForm.ShowFileActions(AFileActions: TFileActions); + +Var + LI : TListItem; + A : TFileAction; + I : Integer; + +begin + FFileActions:=AFileActions; + With LVFileActions do + begin + BeginUpdate; + Try + Items.Clear; + For I:=0 to FFileActions.Count-1 do + begin + A:=FFileActions[i]; + LI:=LVFileActions.Items.Add; + LI.Data:=A; + RefreshFileActionItem(LI); + end; + If (LVFileActions.Items.Count>0) then + ShowFileActionItem(LVFileActions.Items[i]) + else + ShowFileActionItem(Nil) + Finally + EndUpdate; + end; + end; +end; + +procedure TMainForm.RefreshFileActionItem(LI: TListItem); + +Var + A : TFileAction; + +begin + If Not Assigned(Li) then + Exit; + A:=TFileAction(LI.Data); + LI.Caption:=A.Name; + LI.SubItems.Clear; + LI.SubItems.Add(A.Extensions); + LI.SubItems.Add(A.LocationName); + LI.SubItems.Add(BoolStr(A.Delete)); + LI.SubItems.Add(BoolStr(A.Compress)); + LI.SubItems.Add(IntToStr(A.MinCompressSize)); + LI.SubItems.Add(BoolStr(A.CaseSensitive)); +end; + + +procedure TMainForm.ShowFileActionItem(LI: TListItem); + +begin + If (LI=Nil) then + FFileAction:=Nil + else + FFileAction:=TFileAction(LI.Data); + EFileActionName.Link.TIObject:=FFileAction; + EFileActionExtensions.Link.TIObject:=FFileAction; + CBFileActionLocationName.Link.TIObject:=FFileAction; + // Bug in control: the items list is cleared !! +// UpdateActionLocations(FLocations); + CBFileActionDelete.Link.TIObject:=FFileAction; + CBFileActionCompress.Link.TIObject:=FFileAction; + SEFileActionMinCompressSize.Link.TIObject:=FFileAction; + CheckCompressMinSize; +end; + +procedure TMainForm.CheckCompressMinSize; + +begin + With SEFileActionMinCompressSize do + begin + Enabled:=CBFileActionCompress.State=cbChecked; + If Not enabled then + SEFileActionMinCompressSize.Value:=0; + LSEFileActionMinCompressSize.Enabled:=Enabled; + end; +end; + +procedure TMainForm.NewFileAction; + +Var + D : TFileAction; + LI : TListItem; + +begin + RefreshFileActionItem(LVFileActions.Selected); + D:=FFileActions.AddFileAction; + LI:=LVFileActions.Items.Add; + LI.Data:=D; + LVFileActions.Selected:=LI; + ShowFileActionItem(LI); +end; + +procedure TMainForm.DeleteFileAction; + +begin + FreeAndNil(FFileAction); + ShowDirectoryItem(DeleteListItem(LVFileActions)); +end; + +Function TMainForm.HaveFileAction : Boolean; + +begin + Result:=(FFileAction<>Nil) +end; + +initialization + {$I frmmain.lrs} + +end. + diff --git a/examples/cleandir/svccleandirs.lfm b/examples/cleandir/svccleandirs.lfm new file mode 100644 index 0000000000..37b31e530a --- /dev/null +++ b/examples/cleandir/svccleandirs.lfm @@ -0,0 +1,12 @@ +object CleanDirsDaemon: TCleanDirsDaemon + OnCreate = CleanDirsDaemonCreate + OnStart = CleanDirsDaemonStart + OnStop = CleanDirsDaemonStop + OnExecute = CleanDirsDaemonExecute + left = 604 + top = 402 + Height = 0 + HorizontalOffset = 0 + VerticalOffset = 0 + Width = 0 +end diff --git a/examples/cleandir/svccleandirs.lrs b/examples/cleandir/svccleandirs.lrs new file mode 100644 index 0000000000..13fac2e029 --- /dev/null +++ b/examples/cleandir/svccleandirs.lrs @@ -0,0 +1,9 @@ +{ This is an automatically generated lazarus resource file } + +LazarusResources.Add('TCleanDirsDaemon','FORMDATA',[ + 'TPF0'#16'TCleanDirsDaemon'#15'CleanDirsDaemon'#8'OnCreate'#7#21'CleanDirsDae' + +'monCreate'#7'OnStart'#7#20'CleanDirsDaemonStart'#6'OnStop'#7#19'CleanDirsDa' + +'emonStop'#9'OnExecute'#7#22'CleanDirsDaemonExecute'#4'left'#3'\'#2#3'top'#3 + +#146#1#6'Height'#2#0#16'HorizontalOffset'#2#0#14'VerticalOffset'#2#0#5'Width' + +#2#0#0#0 +]); diff --git a/examples/cleandir/svccleandirs.pp b/examples/cleandir/svccleandirs.pp new file mode 100644 index 0000000000..cf0a323dc6 --- /dev/null +++ b/examples/cleandir/svccleandirs.pp @@ -0,0 +1,326 @@ +{ Directory cleaning service - service module + + Copyright (C) 2007 Michael Van Canneyt + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit svccleandirs; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, daemonapp, eventlog, dircleaner; + +type + { TCleanDirsThread } + + TCleanDirsThread = Class(TThread) + Private + FConfigFile : String; + FLog : TEventLog; + FCleaner : TCleanDirs; + procedure DoClean(T: TDateTime); + procedure DoLog(Msg: String); + function GetNextTime(LastTime: TDateTime): TDateTime; + procedure SetupCleaner; + Public + Constructor Create(AConfigFile : String; ALog : TEventLog; ATerminate : TNotifyEvent); + Procedure Execute; override; + end; + + { TCleanDirsDaemon } + + TCleanDirsDaemon = class(TDaemon) + procedure CleanDirsDaemonCreate(Sender: TObject); + procedure CleanDirsDaemonExecute(Sender: TCustomDaemon); + procedure CleanDirsDaemonStart(Sender: TCustomDaemon; var OK: Boolean); + procedure CleanDirsDaemonStop(Sender: TCustomDaemon; var OK: Boolean); + private + { private declarations } + FConfigFile : String; + FThread : TCleanDirsThread; + FLog : TEventLog; + procedure StartLog; + procedure ThreadStopped(Sender: TObject); + public + { public declarations } + end; + + +var + CleanDirsDaemon: TCleanDirsDaemon; + +implementation + +uses dateutils; + +resourcestring + SStartExecute = 'Start cleaning directories for schedule time: %s'; + SEndExecute = 'End of cleaning directories for schedule time: %s. Duration: %s'; + SErrCleaning = 'An error occurred when cleaning: %s'; + SNextCleanTime = 'Next cleaning run: %s'; + SRunningDailyAt = 'Running in daily mode, clean time: %s'; + SRunningHourlyAt = 'Running in hourly mode, at minute: %d'; + SErrNoConfigFile = 'No configuration file found !'; + +// Include windows messages for eventlog component. +{$ifdef mswindows} +{$r fclel.res} +{$endif} + +procedure RegisterDaemon; +begin + RegisterDaemonClass(TCleanDirsDaemon) +end; + +{ TCleanDirsDaemon } + +procedure TCleanDirsDaemon.StartLog; +begin + FLog:=Self.Logger; + If (FConfigFile='') then + Flog.Error(SErrNoConfigFile); +end; + + +procedure TCleanDirsDaemon.CleanDirsDaemonCreate(Sender: TObject); +begin + If Application.Hasoption('c','config') then + begin + FConfigFile:=Application.GetOptionValue('c','config'); + end + else + begin + FConfigFile:=GetAppConfigFile(false,false); + If Not FileExists(FConfigFile) then + begin + FConfigFile:=GetAppConfigFile(True,false); + If Not FileExists(FConfigFile) then + FConfigFile:=''; + end; + end; +end; + +procedure TCleanDirsDaemon.CleanDirsDaemonExecute(Sender: TCustomDaemon); +begin + +end; + +procedure TCleanDirsDaemon.ThreadStopped(Sender : TObject); + +begin + FThread:=Nil; +end; + +procedure TCleanDirsDaemon.CleanDirsDaemonStart(Sender: TCustomDaemon; + var OK: Boolean); + +begin + StartLog; + { Start should return immediatly. Therefor, a thread is started if + one is not yet running. Usually, here one opens a TCP/IP socket + and starts listening } + OK:=(FThread=Nil) and (FConfigFile<>''); + If OK then + FThread:=TCleanDirsThread.Create(FConfigFile,FLog,@ThreadStopped); +end; + +procedure TCleanDirsDaemon.CleanDirsDaemonStop(Sender: TCustomDaemon; + var OK: Boolean); + +Var + I : Integer; + +begin + If Assigned(FThread) then + begin + FThread.Terminate; + I:=0; + // Wait at most 5 seconds. + While (FThread<>Nil) and (I<50) do + begin + Sleep(100); + ReportStatus; + end; + // Let the thread die silently. + If (FThread<>Nil) then + FThread.OnTerminate:=Nil; + end; + OK:=FThread=Nil; +end; + +{ TCleanDirsThread } + +constructor TCleanDirsThread.Create(AConfigFile: String; ALog: TEventLog; ATerminate : TNotifyEvent); +begin + FConfigFile:=AConfigFile; + FLog:=Alog; + FreeOnTerminate:=False; + OnTerminate:=ATerminate; + Inherited Create(False); +end; + +procedure TCleanDirsThread.DoLog(Msg : String); + +begin + If Assigned(FLog) then + FLog.Info(Msg); + If Terminated then + FCleaner.Cancel; +end; + +Function TCleanDirsThread.GetNextTime (LastTime : TDateTime) : TDateTime; + + + // Number of days to add till day is in allowed days. + Function NextOKDay(D : TDateTime) : Integer; + + Const + ScheduleDays : array [1..7] of TScheduleDay + = (sdMonday,sdTuesday,sdwednesday,sdThursday, + sdFriday,sdSaturday,sdSunday); + + begin + Result:=0; + If FCleaner.ScheduleDays<>[] then + While Not (ScheduleDays[DayOfTheWeek(D+Result)] in FCleaner.ScheduleDays) do + Inc(Result); + end; + +Var + DT : TDateTime; + h,m,s,ms : Word; + +begin + Case FCleaner.ScheduleMode of + smDaily: begin + Result:=Date; + // Too late for today. + if (Time>FCleaner.DailyAt) then + Result:=Result+1; + Result:=Result+NextOKDay(Result)+FCleaner.DailyAt + end; + smHourly : begin + DT:=Now; + H:=NextOKDay(DT); + If (H<>0) then + Result:=Date+H+EncodeTime(0,FCleaner.HourlyAt,0,0) + else + begin // Still today + DecodeTime(DT,H,M,S,MS); + Result:=Date; + If (M>=FCleaner.HourlyAt) then + begin // Next hour + H:=H+1; + If (H=24) then + begin + H:=0; // Tomorrow, check next day OK. + Result:=Result+1+NextOKDay(Result+1); + end; + end; + DT:=EncodeTime(H,FCleaner.HourlyAt,0,0); + Result:=Result+DT; + end; + end; + end; + DoLog(Format(SNextCleanTime,[DateTimeToStr(Result)])); +end; + +procedure TCleanDirsThread.DoClean(T : TDateTime); + +Var + S,ST : String; + DT : TDateTime; + +begin + try + S:=DateTimeToStr(T); + DoLog(Format(SStartExecute,[S])); + // FCleaner.Execute; + DT:=FCleaner.EndTime-FCleaner.StartTime; + ST:=TimeToStr(DT); + DoLog(Format(SEndExecute,[S,ST])); + except + On E : Exception do + If Assigned(FLog) then + FLog.Error(SErrCleaning,[E.Message]); + end; +end; + +procedure TCleanDirsThread.SetupCleaner; + +begin + FCleaner.OnLog:=@Self.DoLog; + FCleaner.LoadFromFile(FConfigFile); + If FCleaner.ScheduleMode=smDaily then + DoLog(Format(SRunningDailyAt,[TimeToStr(FCleaner.DailyAt)])) + else + DoLog(Format(SRunningHourlyAt,[FCleaner.HourlyAt])); +end; + +procedure TCleanDirsThread.Execute; + + Function GetDelta (T : TDateTime) : Int64; + + begin + Result:=SecondsBetween(Now,T)*1000; + If (Result>3000) then + Result:=3000; + end; + +Var + T : TDateTime; + Delta : Int64; + +begin + FCleaner:=TCleanDirs.Create(Nil); + try + SetupCleaner; + T:=Now; + Repeat + T:=GetNextTime(T); + Repeat + Delta:=GetDelta(T); // 3 seconds or less + If Not Terminated then + Sleep(Delta); + Until (Now>=T) or Terminated; + If Not Terminated then + DoClean(T); + Until Terminated; + finally + FreeAndNil(FCleaner); + end; +end; + +initialization + {$I svccleandirs.lrs} + + + RegisterDaemon; +end. + diff --git a/examples/cleandir/svcmap.lfm b/examples/cleandir/svcmap.lfm new file mode 100644 index 0000000000..5709269099 --- /dev/null +++ b/examples/cleandir/svcmap.lfm @@ -0,0 +1,13 @@ +object CleanDirServiceMapper: TCleanDirServiceMapper + DaemonDefs = < + item + DaemonClassName = 'TCleanDirsDaemon' + Name = 'CleanDirs' + DisplayName = 'Clean directories service' + Options = [doAllowPause] + WinBindings.Dependencies = <> + WinBindings.StartType = stAuto + end> + left = 426 + top = 183 +end diff --git a/examples/cleandir/svcmap.lrs b/examples/cleandir/svcmap.lrs new file mode 100644 index 0000000000..78b9621092 --- /dev/null +++ b/examples/cleandir/svcmap.lrs @@ -0,0 +1,9 @@ +{ This is an automatically generated lazarus resource file } + +LazarusResources.Add('TCleanDirServiceMapper','FORMDATA',[ + 'TPF0'#22'TCleanDirServiceMapper'#21'CleanDirServiceMapper'#10'DaemonDefs'#14 + +#1#15'DaemonClassName'#6#16'TCleanDirsDaemon'#4'Name'#6#9'CleanDirs'#11'Disp' + +'layName'#6#25'Clean directories service'#7'Options'#11#12'doAllowPause'#0#24 + +'WinBindings.Dependencies'#14#0#21'WinBindings.StartType'#7#6'stAuto'#0#0#4 + +'left'#3#170#1#3'top'#3#183#0#0#0 +]); diff --git a/examples/cleandir/svcmap.pp b/examples/cleandir/svcmap.pp new file mode 100644 index 0000000000..924cca883a --- /dev/null +++ b/examples/cleandir/svcmap.pp @@ -0,0 +1,63 @@ +{ Directory cleaning service - Service mapper. + + Copyright (C) 2007 Michael Van Canneyt + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit svcmap; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, daemonapp; + +type + TCleanDirServiceMapper = class(TDaemonMapper) + private + { private declarations } + public + { public declarations } + end; + +var + CleanDirServiceMapper: TCleanDirServiceMapper; + +implementation + +procedure RegisterMapper; +begin + RegisterDaemonMapper(TCleanDirServiceMapper) +end; + +initialization + {$I svcmap.lrs} + + + RegisterMapper; +end. +