├── .gitignore ├── LICENSE ├── README.md ├── boss-lock.json ├── boss.json ├── horse_wizard.dpk ├── horse_wizard.dproj ├── img ├── Horse-New-Controller-2.png ├── Horse-New-Controller.png ├── Horse-New-Project-2.png ├── Horse-New-Project.png ├── Horse-Wizard-Demo.png ├── Horse-Wizard.png ├── Screenshot_1.png ├── install.png └── title.png └── src ├── HashloadIcon.ico ├── HashloadSplash.bmp ├── Horse.Boss.Initializer.pas ├── Horse.CodeGen.SourceFile.pas ├── Horse.Middlewares.pas ├── Horse.NewController.Binding.pas ├── Horse.NewController.Creator.pas ├── Horse.NewController.Model.pas ├── Horse.NewController.View.dfm ├── Horse.NewController.View.pas ├── Horse.NewController.Wizard.pas ├── Horse.NewController.pas ├── Horse.NewProject.Creator.Apache.pas ├── Horse.NewProject.Creator.Vcl.NewForm.Main.Templates.pas ├── Horse.NewProject.Creator.Vcl.NewForm.Main.pas ├── Horse.NewProject.Creator.Vcl.pas ├── Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates.pas ├── Horse.NewProject.Creator.WinSvc.NewForm.Main.pas ├── Horse.NewProject.Creator.WinSvc.pas ├── Horse.NewProject.Creator.pas ├── Horse.NewProject.Templates.pas ├── Horse.NewProject.View.dfm ├── Horse.NewProject.View.pas ├── Horse.NewProject.Wizard.pas ├── Horse.NewProject.pas ├── Horse.Registration.pas ├── Horse.Splash.Registration.pas ├── Horse.Views.Boss.dfm ├── Horse.Views.Boss.pas ├── Horse.Views.Wizard.dfm ├── Horse.Views.Wizard.pas ├── Horse.Wizard.Types.pas └── Horse.Wizard.Utils.pas /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | *.res 7 | 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Vinicius Sanchez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Horse Wizard 2 | 3 | Horse-wizard is a wizard for creating new [Horse](https://github.com/HashLoad/horse) applications. Easy, fast and simple. A tool to make your work easier! 4 |
We created a channel on Telegram for questions and support:

5 | 6 | 7 | 8 | 9 | ## ✔️ Compatibility 10 | This Wizard is compatible with projects developed in: 11 | - [X] Delphi 12 | - [ ] Lazarus 13 | 14 | 15 | ## ⚙️ Demo and Installation 16 | Demo and Installation Horse Wizard 19 | 20 | 21 | 22 | ## Wizard 23 | ![horse-wizard](img/Horse-Wizard.png) 24 | 25 | ## ⚡️ Horse Project 26 | The Horse Project option is to create a new project using horse and its official middlewares. The project can be created for both Windows (Apache, CGI, Console, IIS, VCL and WinService) and Linux (Apache, Console and Daemon) platforms. 27 | 28 | ![horse-new-project](img/Horse-New-Project.png) 29 | ![horse-new-project](img/Horse-New-Project-2.png) 30 | 31 | ## ⚡️ Horse Controller 32 | The Horse Controller option is to create a new Controller where you can map your routes for each respective Verb. 33 | 34 | ![horse-new-controller](img/Horse-New-Controller.png) 35 | ![horse-new-controller](img/Horse-New-Controller-2.png) 36 | 37 | ## ⚠️ License 38 | `Horse-Wizard` is free and open-source middleware licensed under the [MIT License](https://github.com/HashLoad/horse-wizard/blob/master/LICENSE). 39 | -------------------------------------------------------------------------------- /boss-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d41d8cd98f00b204e9800998ecf8427e", 3 | "updated": "2019-10-01T21:15:07.2665862-03:00", 4 | "installedModules": { 5 | "github.com/hashload/doscommand": { 6 | "name": "doscommand", 7 | "version": "1.0.3", 8 | "hash": "f52bdae34873ac6da67a7665dfa8cbe3", 9 | "artifacts": { 10 | "dcp": [ 11 | "DOSCommandDD.bpi", 12 | "DOSCommandDD.dcp", 13 | "DOSCommandDD.lib", 14 | "DOSCommandDR.bpi", 15 | "DOSCommandDR.dcp", 16 | "DOSCommandDR.lib" 17 | ], 18 | "dcu": [ 19 | "DosCommand.Register.dcu", 20 | "DosCommand.dcu" 21 | ], 22 | "bpl": [ 23 | "DOSCommandDD260.bpl", 24 | "DOSCommandDR260.bpl" 25 | ] 26 | }, 27 | "failed": false, 28 | "changed": false 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /boss.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "horse-wizard", 3 | "description": "", 4 | "version": "1.0.0", 5 | "homepage": "", 6 | "mainsrc": "src/", 7 | "projects": [], 8 | "dependencies": { 9 | "github.com/hashload/doscommand": "^1.0.3" 10 | } 11 | } -------------------------------------------------------------------------------- /horse_wizard.dpk: -------------------------------------------------------------------------------- 1 | package horse_wizard; 2 | 3 | {$R *.res} 4 | {$R *.dres} 5 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 6 | {$ALIGN 8} 7 | {$ASSERTIONS ON} 8 | {$BOOLEVAL OFF} 9 | {$DEBUGINFO OFF} 10 | {$EXTENDEDSYNTAX ON} 11 | {$IMPORTEDDATA ON} 12 | {$IOCHECKS ON} 13 | {$LOCALSYMBOLS OFF} 14 | {$LONGSTRINGS ON} 15 | {$OPENSTRINGS ON} 16 | {$OPTIMIZATION ON} 17 | {$OVERFLOWCHECKS OFF} 18 | {$RANGECHECKS OFF} 19 | {$REFERENCEINFO OFF} 20 | {$SAFEDIVIDE OFF} 21 | {$STACKFRAMES OFF} 22 | {$TYPEDADDRESS OFF} 23 | {$VARSTRINGCHECKS ON} 24 | {$WRITEABLECONST OFF} 25 | {$MINENUMSIZE 1} 26 | {$IMAGEBASE $400000} 27 | {$DEFINE RELEASE} 28 | {$ENDIF IMPLICITBUILDING} 29 | {$DESCRIPTION 'Horse IDE Expert'} 30 | {$IMPLICITBUILD ON} 31 | 32 | requires 33 | rtl, 34 | designide, 35 | ExpertsCreators, 36 | IndySystem, 37 | IndyProtocols, 38 | IndyCore, 39 | dbrtl, 40 | DOSCommandDD, 41 | DOSCommandDR; 42 | 43 | contains 44 | Horse.Boss.Initializer in 'src\Horse.Boss.Initializer.pas', 45 | Horse.CodeGen.SourceFile in 'src\Horse.CodeGen.SourceFile.pas', 46 | Horse.Middlewares in 'src\Horse.Middlewares.pas', 47 | Horse.NewController.Binding in 'src\Horse.NewController.Binding.pas', 48 | Horse.NewController.Creator in 'src\Horse.NewController.Creator.pas', 49 | Horse.NewController.Model in 'src\Horse.NewController.Model.pas', 50 | Horse.NewController in 'src\Horse.NewController.pas', 51 | Horse.NewController.View in 'src\Horse.NewController.View.pas' {HorseViewsNewController}, 52 | Horse.NewController.Wizard in 'src\Horse.NewController.Wizard.pas', 53 | Horse.NewProject.Creator.Apache in 'src\Horse.NewProject.Creator.Apache.pas', 54 | Horse.NewProject.Creator in 'src\Horse.NewProject.Creator.pas', 55 | Horse.NewProject.Creator.Vcl.NewForm.Main in 'src\Horse.NewProject.Creator.Vcl.NewForm.Main.pas', 56 | Horse.NewProject.Creator.Vcl.NewForm.Main.Templates in 'src\Horse.NewProject.Creator.Vcl.NewForm.Main.Templates.pas', 57 | Horse.NewProject.Creator.Vcl in 'src\Horse.NewProject.Creator.Vcl.pas', 58 | Horse.NewProject.Creator.WinSvc.NewForm.Main in 'src\Horse.NewProject.Creator.WinSvc.NewForm.Main.pas', 59 | Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates in 'src\Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates.pas', 60 | Horse.NewProject.Creator.WinSvc in 'src\Horse.NewProject.Creator.WinSvc.pas', 61 | Horse.NewProject in 'src\Horse.NewProject.pas', 62 | Horse.NewProject.Templates in 'src\Horse.NewProject.Templates.pas', 63 | Horse.NewProject.View in 'src\Horse.NewProject.View.pas' {HorseViewsNewProject}, 64 | Horse.NewProject.Wizard in 'src\Horse.NewProject.Wizard.pas', 65 | Horse.Registration in 'src\Horse.Registration.pas', 66 | Horse.Splash.Registration in 'src\Horse.Splash.Registration.pas', 67 | Horse.Views.Boss in 'src\Horse.Views.Boss.pas' {FrmBoss}, 68 | Horse.Views.Wizard in 'src\Horse.Views.Wizard.pas' {FrmNewProject}, 69 | Horse.Wizard.Types in 'src\Horse.Wizard.Types.pas', 70 | Horse.Wizard.Utils in 'src\Horse.Wizard.Utils.pas'; 71 | 72 | end. 73 | -------------------------------------------------------------------------------- /horse_wizard.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {84344511-1DC2-41BA-8689-9F36C1D475BE} 4 | horse_wizard.dpk 5 | 19.3 6 | VCL 7 | True 8 | Release 9 | Win32 10 | 1 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | .\$(Platform)\$(Config) 50 | .\$(Platform)\$(Config) 51 | false 52 | false 53 | false 54 | false 55 | false 56 | true 57 | true 58 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 59 | All 60 | horse_wizard 61 | 1040 62 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 63 | Horse IDE Expert 64 | modules\.dcp;modules\.dcu;modules;modules\doscommand\Source;$(DCC_UnitSearchPath) 65 | 66 | 67 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 68 | Debug 69 | true 70 | 1033 71 | rtl;IndySystem;IndyProtocols;IndyCore;dbrtl;dmvcframeworkRT;dxCoreRS26;dxGDIPlusRS26;DOSCommandDR;$(DCC_UsePackage) 72 | Horse IDE Expert 73 | 74 | 75 | rtl;IndySystem;IndyProtocols;IndyCore;dbrtl;dxCoreRS26;dxGDIPlusRS26;DOSCommandDR;$(DCC_UsePackage) 76 | 77 | 78 | DEBUG;$(DCC_Define) 79 | true 80 | false 81 | true 82 | true 83 | true 84 | Horse IDE Expert 85 | 86 | 87 | false 88 | true 89 | 1033 90 | Horse 91 | CompanyName=Hashload;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 92 | .\$(Platform)\$(Config) 93 | C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\bds.exe 94 | 95 | 96 | false 97 | RELEASE;$(DCC_Define) 98 | 0 99 | 0 100 | Horse IDE Expert 101 | 102 | 103 | true 104 | 1033 105 | Horse IDE Expert 106 | 107 | 108 | 109 | MainSource 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 |
HorseViewsNewController
129 | dfm 130 |
131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
HorseViewsNewProject
144 | dfm 145 |
146 | 147 | 148 | 149 | 150 |
FrmBoss
151 | dfm 152 |
153 | 154 |
FrmNewProject
155 | dfm 156 |
157 | 158 | 159 | 160 | ICON 161 | HashloadIcon 162 | 163 | 164 | BITMAP 165 | HashloadSplash 166 | 167 | 168 | Base 169 | 170 | 171 | Cfg_1 172 | Base 173 | 174 | 175 | Cfg_2 176 | Base 177 | 178 |
179 | 180 | Delphi.Personality.12 181 | Package 182 | 183 | 184 | 185 | horse_wizard.dpk 186 | 187 | 188 | Microsoft Office 2000 Sample Automation Server Wrapper Components 189 | Microsoft Office XP Sample Automation Server Wrapper Components 190 | 191 | 192 | 193 | 194 | 195 | horse_wizard.bpl 196 | true 197 | 198 | 199 | 200 | 201 | true 202 | 203 | 204 | 205 | 206 | 0 207 | 208 | 209 | 210 | 211 | 0 212 | 213 | 214 | 215 | 216 | 0 217 | .dll;.bpl 218 | 219 | 220 | 221 | 222 | 0 223 | .bpl 224 | 225 | 226 | 227 | 228 | 0 229 | 230 | 231 | 232 | 233 | 0 234 | 235 | 236 | 237 | 238 | 1 239 | 240 | 241 | 1 242 | 243 | 244 | 245 | 246 | Assets 247 | 1 248 | 249 | 250 | Assets 251 | 1 252 | 253 | 254 | 255 | 256 | Assets 257 | 1 258 | 259 | 260 | Assets 261 | 1 262 | 263 | 264 | 265 | 266 | 267 | 268 | True 269 | False 270 | 271 | 272 | 12 273 | 274 | 275 | 276 | 277 |
278 | -------------------------------------------------------------------------------- /img/Horse-New-Controller-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-New-Controller-2.png -------------------------------------------------------------------------------- /img/Horse-New-Controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-New-Controller.png -------------------------------------------------------------------------------- /img/Horse-New-Project-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-New-Project-2.png -------------------------------------------------------------------------------- /img/Horse-New-Project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-New-Project.png -------------------------------------------------------------------------------- /img/Horse-Wizard-Demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-Wizard-Demo.png -------------------------------------------------------------------------------- /img/Horse-Wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Horse-Wizard.png -------------------------------------------------------------------------------- /img/Screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/Screenshot_1.png -------------------------------------------------------------------------------- /img/install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/install.png -------------------------------------------------------------------------------- /img/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/img/title.png -------------------------------------------------------------------------------- /src/HashloadIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/src/HashloadIcon.ico -------------------------------------------------------------------------------- /src/HashloadSplash.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLoad/horse-wizard/413b760c8a90a57543257061ab319d66e736d809/src/HashloadSplash.bmp -------------------------------------------------------------------------------- /src/Horse.Boss.Initializer.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Boss.Initializer; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.Middlewares, System.Generics.Collections, System.Classes, 6 | Horse.Views.Boss, DosCommand; 7 | 8 | type 9 | THorseBossInitializer = class 10 | private 11 | FProject: IOTAProject; 12 | FModules: TList; 13 | FLocked: Boolean; 14 | LBossView : TFrmBoss; 15 | LDosCommand: TDosCommand; 16 | 17 | function GetDependencies: string; 18 | procedure RunBossInstall; 19 | procedure ReloadProject; 20 | procedure OnNewLineEvent(ASender: TObject; const ANewLine: string; 21 | AOutputType: TOutputType); 22 | procedure OnTerminatedEvent(ASender: TObject); 23 | public 24 | constructor Create(const AProject: IOTAProject; const AModules: TList); 25 | procedure Generate; 26 | procedure Wait; 27 | end; 28 | 29 | implementation 30 | 31 | uses System.SysUtils, System.IOUtils, Vcl.Forms; 32 | 33 | const 34 | HORSE_MODULE = 'github.com/HashLoad/horse'; 35 | BOSS_COMMAND = 'boss install'; 36 | BOSS_MODULE_DEFAULT = '"%s": ">0.0.0"'; 37 | BOSS_NAME = 'boss.json'; 38 | BOSS_BASE = 39 | '{' + sLineBreak + 40 | ' "name": "%s",' + sLineBreak + 41 | ' "description": "",' + sLineBreak + 42 | ' "version": "1.0.0",' + sLineBreak + 43 | ' "homepage": "",' + sLineBreak + 44 | ' "mainsrc": "./",' + sLineBreak + 45 | ' "projects": [],' + sLineBreak + 46 | ' "dependencies": {' + sLineBreak + 47 | ' %s' + sLineBreak + 48 | ' }' + sLineBreak + 49 | '}'; 50 | 51 | { THorseBossInitializer } 52 | 53 | constructor THorseBossInitializer.Create(const AProject: IOTAProject; const AModules: TList); 54 | begin 55 | FProject := AProject; 56 | FModules := AModules; 57 | end; 58 | 59 | procedure THorseBossInitializer.Generate; 60 | var 61 | LContent: string; 62 | LName: string; 63 | LFile: TStringList; 64 | begin 65 | FLocked := True; 66 | LName := ExtractFileName(TPath.GetFileNameWithoutExtension(FProject.FileName)); 67 | LContent := Format(BOSS_BASE, [LName, GetDependencies]); 68 | 69 | LFile := TStringList.Create(); 70 | try 71 | LFile.Text := LContent; 72 | LFile.SaveToFile(TPath.Combine(ExtractFilePath(FProject.FileName), BOSS_NAME)); 73 | finally 74 | LFile.Free; 75 | end; 76 | 77 | RunBossInstall; 78 | end; 79 | 80 | function THorseBossInitializer.GetDependencies: string; 81 | var 82 | LList: string; 83 | I: Integer; 84 | begin 85 | LList := EmptyStr; 86 | 87 | for I := 0 to Pred(FModules.Count) do 88 | LList := LList + Format(BOSS_MODULE_DEFAULT, [FModules[I].Url]) + ',' + sLineBreak; 89 | 90 | LList := LList + Format(BOSS_MODULE_DEFAULT, [HORSE_MODULE]); 91 | Result := LList; 92 | end; 93 | 94 | procedure THorseBossInitializer.ReloadProject; 95 | begin 96 | FProject.Refresh(False); 97 | end; 98 | 99 | procedure THorseBossInitializer.OnNewLineEvent(ASender: TObject; const ANewLine: string; AOutputType: TOutputType); 100 | begin 101 | LBossView.AppendText(ANewLine); 102 | end; 103 | 104 | procedure THorseBossInitializer.OnTerminatedEvent(ASender: TObject); 105 | begin 106 | LDosCommand.Free; 107 | 108 | TThread.Queue(nil, 109 | procedure 110 | begin 111 | LBossView.Close; 112 | LBossView.Free; 113 | end); 114 | ReloadProject; 115 | FLocked := False; 116 | end; 117 | 118 | procedure THorseBossInitializer.RunBossInstall; 119 | begin 120 | LDosCommand := TDosCommand.Create(nil); 121 | LBossView := TFrmBoss.Create(nil); 122 | 123 | LDosCommand.OnNewLine := OnNewLineEvent; 124 | LDosCommand.OnTerminated := OnTerminatedEvent; 125 | 126 | LDosCommand.InputToOutput := False; 127 | LDosCommand.CurrentDir := ExtractFilePath(FProject.FileName); 128 | LDosCommand.CommandLine := BOSS_COMMAND; 129 | LDosCommand.Execute; 130 | LBossView.Show; 131 | end; 132 | 133 | procedure THorseBossInitializer.Wait; 134 | begin 135 | while FLocked do 136 | Application.ProcessMessages; 137 | end; 138 | 139 | end. 140 | -------------------------------------------------------------------------------- /src/Horse.CodeGen.SourceFile.pas: -------------------------------------------------------------------------------- 1 | unit Horse.CodeGen.SourceFile; 2 | 3 | interface 4 | 5 | uses System.SysUtils, System.Classes, ToolsAPI; 6 | 7 | type 8 | TSourceFile = class(TInterfacedObject, IOTAFile) 9 | private 10 | FSource: string; 11 | public 12 | function GetSource: string; 13 | function GetAge: TDateTime; 14 | constructor Create(const ASource: string; const AArgs: array of const); 15 | class function New(const ASource: string; const AArgs: array of const): IOTAFile; 16 | end; 17 | 18 | implementation 19 | 20 | { TSourceFile } 21 | 22 | constructor TSourceFile.Create(const ASource: string; const AArgs: array of const); 23 | begin 24 | FSource := Format(ASource, AArgs); 25 | end; 26 | 27 | function TSourceFile.GetAge: TDateTime; 28 | begin 29 | Result := Now; 30 | end; 31 | 32 | function TSourceFile.GetSource: string; 33 | begin 34 | Result := FSource; 35 | end; 36 | 37 | class function TSourceFile.New(const ASource: string; const AArgs: array of const): IOTAFile; 38 | begin 39 | Result := Self.Create(ASource, AArgs); 40 | end; 41 | 42 | end. 43 | -------------------------------------------------------------------------------- /src/Horse.Middlewares.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Middlewares; 2 | 3 | interface 4 | 5 | type 6 | IHorseMiddleware = interface 7 | ['{095E9FE2-785D-4296-84DE-BF7B0D1B44E8}'] 8 | function Name: string; 9 | function Url: string; 10 | function &Uses: string; 11 | function Declaration: string; 12 | end; 13 | 14 | THorseMiddlewareBasicAuth = class(TInterfacedObject, IHorseMiddleware) 15 | public 16 | function Name: string; 17 | function Url: string; 18 | function &Uses: string; 19 | function Declaration: string; 20 | class function New: IHorseMiddleware; 21 | end; 22 | 23 | THorseMiddlewareCompression = class(TInterfacedObject, IHorseMiddleware) 24 | public 25 | function Name: string; 26 | function Url: string; 27 | function &Uses: string; 28 | function Declaration: string; 29 | class function New: IHorseMiddleware; 30 | end; 31 | 32 | THorseMiddlewareCORS = class(TInterfacedObject, IHorseMiddleware) 33 | public 34 | function Name: string; 35 | function Url: string; 36 | function &Uses: string; 37 | function Declaration: string; 38 | class function New: IHorseMiddleware; 39 | end; 40 | 41 | THorseMiddlewareHandleException = class(TInterfacedObject, IHorseMiddleware) 42 | public 43 | function Name: string; 44 | function Url: string; 45 | function &Uses: string; 46 | function Declaration: string; 47 | class function New: IHorseMiddleware; 48 | end; 49 | 50 | THorseMiddlewareJohnson = class(TInterfacedObject, IHorseMiddleware) 51 | public 52 | function Name: string; 53 | function Url: string; 54 | function &Uses: string; 55 | function Declaration: string; 56 | class function New: IHorseMiddleware; 57 | end; 58 | 59 | THorseMiddlewareJWT = class(TInterfacedObject, IHorseMiddleware) 60 | public 61 | function Name: string; 62 | function Url: string; 63 | function &Uses: string; 64 | function Declaration: string; 65 | class function New: IHorseMiddleware; 66 | end; 67 | 68 | THorseMiddlewareLogger = class(TInterfacedObject, IHorseMiddleware) 69 | public 70 | function Name: string; 71 | function Url: string; 72 | function &Uses: string; 73 | function Declaration: string; 74 | class function New: IHorseMiddleware; 75 | end; 76 | 77 | THorseMiddlewareOctetStream = class(TInterfacedObject, IHorseMiddleware) 78 | public 79 | function Name: string; 80 | function Url: string; 81 | function &Uses: string; 82 | function Declaration: string; 83 | class function New: IHorseMiddleware; 84 | end; 85 | 86 | implementation 87 | 88 | { THorseMiddlewareJohnson } 89 | 90 | function THorseMiddlewareJohnson.&Uses: string; 91 | begin 92 | Result := 'Horse.Jhonson'; 93 | end; 94 | 95 | function THorseMiddlewareJohnson.Declaration: string; 96 | begin 97 | Result := 'Use(Jhonson())'; 98 | end; 99 | 100 | function THorseMiddlewareJohnson.Name: string; 101 | begin 102 | Result := 'Jhonson'; 103 | end; 104 | 105 | class function THorseMiddlewareJohnson.New: IHorseMiddleware; 106 | begin 107 | Result := Self.Create; 108 | end; 109 | 110 | function THorseMiddlewareJohnson.Url: string; 111 | begin 112 | Result := 'github.com/HashLoad/jhonson'; 113 | end; 114 | 115 | { THorseMiddlewareCORS } 116 | 117 | function THorseMiddlewareCORS.&Uses: string; 118 | begin 119 | Result := 'Horse.CORS'; 120 | end; 121 | 122 | function THorseMiddlewareCORS.Declaration: string; 123 | begin 124 | Result := 'Use(CORS)'; 125 | end; 126 | 127 | function THorseMiddlewareCORS.Name: string; 128 | begin 129 | Result := 'CORS'; 130 | end; 131 | 132 | class function THorseMiddlewareCORS.New: IHorseMiddleware; 133 | begin 134 | Result := Self.Create; 135 | end; 136 | 137 | function THorseMiddlewareCORS.Url: string; 138 | begin 139 | Result := 'github.com/HashLoad/horse-cors'; 140 | end; 141 | 142 | { THorseMiddlewareOctetStream } 143 | 144 | function THorseMiddlewareOctetStream.&Uses: string; 145 | begin 146 | Result := 'Horse.OctetStream'; 147 | end; 148 | 149 | function THorseMiddlewareOctetStream.Declaration: string; 150 | begin 151 | Result := 'Use(OctetStream)'; 152 | end; 153 | 154 | function THorseMiddlewareOctetStream.Name: string; 155 | begin 156 | Result := 'Horse-Octet-Stream'; 157 | end; 158 | 159 | class function THorseMiddlewareOctetStream.New: IHorseMiddleware; 160 | begin 161 | Result := Self.Create; 162 | end; 163 | 164 | function THorseMiddlewareOctetStream.Url: string; 165 | begin 166 | Result := 'github.com/HashLoad/horse-octet-stream'; 167 | end; 168 | 169 | { THorseMiddlewareJWT } 170 | 171 | function THorseMiddlewareJWT.&Uses: string; 172 | begin 173 | Result := 'Horse.JWT'; 174 | end; 175 | 176 | function THorseMiddlewareJWT.Declaration: string; 177 | begin 178 | Result := 'Use(HorseJWT(''MY-PASSWORD''))'; 179 | end; 180 | 181 | function THorseMiddlewareJWT.Name: string; 182 | begin 183 | Result := 'Horse-JWT'; 184 | end; 185 | 186 | class function THorseMiddlewareJWT.New: IHorseMiddleware; 187 | begin 188 | Result := Self.Create; 189 | end; 190 | 191 | function THorseMiddlewareJWT.Url: string; 192 | begin 193 | Result := 'github.com/HashLoad/horse-jwt'; 194 | end; 195 | 196 | { THorseMiddlewareBasicAuth } 197 | 198 | function THorseMiddlewareBasicAuth.&Uses: string; 199 | begin 200 | Result := 'Horse.BasicAuthentication'; 201 | end; 202 | 203 | function THorseMiddlewareBasicAuth.Declaration: string; 204 | begin 205 | Result := 206 | 'Use(HorseBasicAuthentication(' + Chr(13) + 207 | ' function(const AUsername, APassword: string): Boolean' + Chr(13) + 208 | ' begin ' + Chr(13) + 209 | ' Result := AUsername.Equals(''user'') and APassword.Equals(''password'');' + Chr(13) + 210 | ' end))'; 211 | end; 212 | 213 | function THorseMiddlewareBasicAuth.Name: string; 214 | begin 215 | Result := 'Basic-Auth'; 216 | end; 217 | 218 | class function THorseMiddlewareBasicAuth.New: IHorseMiddleware; 219 | begin 220 | Result := Self.Create; 221 | end; 222 | 223 | function THorseMiddlewareBasicAuth.Url: string; 224 | begin 225 | Result := 'github.com/HashLoad/horse-basic-auth'; 226 | end; 227 | 228 | { THorseMiddlewareCompression } 229 | 230 | function THorseMiddlewareCompression.&Uses: string; 231 | begin 232 | Result := 'Horse.Compression'; 233 | end; 234 | 235 | function THorseMiddlewareCompression.Declaration: string; 236 | begin 237 | Result := 'Use(Compression()) // Must come before Jhonson middleware'; 238 | end; 239 | 240 | function THorseMiddlewareCompression.Name: string; 241 | begin 242 | Result := 'Horse-Compression'; 243 | end; 244 | 245 | class function THorseMiddlewareCompression.New: IHorseMiddleware; 246 | begin 247 | Result := Self.Create; 248 | end; 249 | 250 | function THorseMiddlewareCompression.Url: string; 251 | begin 252 | Result := 'github.com/HashLoad/horse-compression'; 253 | end; 254 | 255 | { THorseMiddlewareHandleException } 256 | 257 | function THorseMiddlewareHandleException.&Uses: string; 258 | begin 259 | Result := 'Horse.HandleException'; 260 | end; 261 | 262 | function THorseMiddlewareHandleException.Declaration: string; 263 | begin 264 | Result := 'Use(HandleException)'; 265 | end; 266 | 267 | function THorseMiddlewareHandleException.Name: string; 268 | begin 269 | Result := 'Handle-Exception'; 270 | end; 271 | 272 | class function THorseMiddlewareHandleException.New: IHorseMiddleware; 273 | begin 274 | Result := Self.Create; 275 | end; 276 | 277 | function THorseMiddlewareHandleException.Url: string; 278 | begin 279 | Result := 'github.com/HashLoad/handle-exception'; 280 | end; 281 | 282 | { THorseMiddlewareLogger } 283 | 284 | function THorseMiddlewareLogger.&Uses: string; 285 | begin 286 | Result := 'Horse.Logger'; 287 | end; 288 | 289 | function THorseMiddlewareLogger.Declaration: string; 290 | begin 291 | Result := 'Use(THorseLoggerManager.HorseCallback())'; 292 | end; 293 | 294 | function THorseMiddlewareLogger.Name: string; 295 | begin 296 | Result := 'Horse-Logger'; 297 | end; 298 | 299 | class function THorseMiddlewareLogger.New: IHorseMiddleware; 300 | begin 301 | Result := Self.Create; 302 | end; 303 | 304 | function THorseMiddlewareLogger.Url: string; 305 | begin 306 | Result := 'github.com/HashLoad/horse-logger'; 307 | end; 308 | 309 | end. 310 | -------------------------------------------------------------------------------- /src/Horse.NewController.Binding.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController.Binding; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.NewController, System.SysUtils, System.Classes, Vcl.Dialogs, Vcl.Menus; 6 | 7 | type 8 | THorseNewControllerBinding = class(TNotifierObject, IOTAKeyboardBinding) 9 | private 10 | procedure Execute(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult); 11 | protected 12 | function GetBindingType: TBindingType; 13 | function GetDisplayName: string; 14 | function GetName: string; 15 | procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices); 16 | public 17 | class function New: IOTAKeyboardBinding; 18 | end; 19 | 20 | var 21 | IndexNewControllerBinding: Integer = -1; 22 | 23 | procedure RegisterNewControllerBinding; 24 | 25 | implementation 26 | 27 | procedure RegisterNewControllerBinding; 28 | begin 29 | IndexNewControllerBinding := (BorlandIDEServices as IOTAKeyboardServices).AddKeyboardBinding(THorseNewControllerBinding.New); 30 | end; 31 | 32 | { THorseNewControllerBinding } 33 | 34 | procedure THorseNewControllerBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices); 35 | begin 36 | BindingServices.AddKeyBinding([TextToShortCut('Ctrl+Shift+H')], Execute, nil); 37 | end; 38 | 39 | procedure THorseNewControllerBinding.Execute(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult); 40 | begin 41 | BindingResult := krHandled; 42 | THorseNewController.CreateController; 43 | end; 44 | 45 | function THorseNewControllerBinding.GetBindingType: TBindingType; 46 | begin 47 | Result := btPartial; 48 | end; 49 | 50 | function THorseNewControllerBinding.GetDisplayName: string; 51 | begin 52 | Result := Self.ClassName; 53 | end; 54 | 55 | function THorseNewControllerBinding.GetName: string; 56 | begin 57 | Result := Self.ClassName; 58 | end; 59 | 60 | class function THorseNewControllerBinding.New: IOTAKeyboardBinding; 61 | begin 62 | Result := Self.Create; 63 | end; 64 | 65 | initialization 66 | 67 | finalization 68 | if IndexNewControllerBinding >= 0 then 69 | (BorlandIDEServices as IOTAKeyboardServices).RemoveKeyboardBinding(IndexNewControllerBinding); 70 | 71 | end. 72 | -------------------------------------------------------------------------------- /src/Horse.NewController.Creator.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController.Creator; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.CodeGen.SourceFile, Horse.NewController.Model, Vcl.Dialogs, System.SysUtils; 6 | 7 | type 8 | THorseNewControllerCreator = class(TNotifierObject, IOTACreator, IOTAModuleCreator) 9 | private 10 | FModel: THorseNewControllerModel; 11 | protected 12 | // IOTACreator 13 | function GetCreatorType: string; 14 | function GetExisting: Boolean; 15 | function GetFileSystem: string; 16 | function GetOwner: IOTAModule; 17 | function GetUnnamed: Boolean; 18 | 19 | // IOTAModuleCreator 20 | function GetAncestorName: string; 21 | function GetImplFileName: string; 22 | function GetIntfFileName: string; 23 | function GetFormName: string; 24 | function GetMainForm: Boolean; 25 | function GetShowForm: Boolean; 26 | function GetShowSource: Boolean; 27 | function NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 28 | function NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 29 | function NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 30 | procedure FormCreated(const AFormEditor: IOTAFormEditor); 31 | public 32 | constructor Create(const AModel: THorseNewControllerModel); 33 | class function New(const AModel: THorseNewControllerModel): IOTACreator; 34 | end; 35 | 36 | implementation 37 | 38 | { THorseNewControllerCreator } 39 | 40 | constructor THorseNewControllerCreator.Create(const AModel: THorseNewControllerModel); 41 | begin 42 | FModel := AModel; 43 | end; 44 | 45 | procedure THorseNewControllerCreator.FormCreated(const AFormEditor: IOTAFormEditor); 46 | begin 47 | 48 | end; 49 | 50 | function THorseNewControllerCreator.GetAncestorName: string; 51 | begin 52 | Result := EmptyStr; 53 | end; 54 | 55 | function THorseNewControllerCreator.GetCreatorType: string; 56 | begin 57 | Result := sUnit; 58 | end; 59 | 60 | function THorseNewControllerCreator.GetExisting: Boolean; 61 | begin 62 | Result := False; 63 | end; 64 | 65 | function THorseNewControllerCreator.GetFileSystem: string; 66 | begin 67 | Result := EmptyStr; 68 | end; 69 | 70 | function THorseNewControllerCreator.GetFormName: string; 71 | begin 72 | Result := EmptyStr; 73 | end; 74 | 75 | function THorseNewControllerCreator.GetImplFileName: string; 76 | begin 77 | Result := EmptyStr; 78 | end; 79 | 80 | function THorseNewControllerCreator.GetIntfFileName: string; 81 | begin 82 | Result := EmptyStr; 83 | end; 84 | 85 | function THorseNewControllerCreator.GetMainForm: Boolean; 86 | begin 87 | Result := False; 88 | end; 89 | 90 | function THorseNewControllerCreator.GetOwner: IOTAModule; 91 | begin 92 | Result := GetActiveProject; 93 | end; 94 | 95 | function THorseNewControllerCreator.GetShowForm: Boolean; 96 | begin 97 | Result := False; 98 | end; 99 | 100 | function THorseNewControllerCreator.GetShowSource: Boolean; 101 | begin 102 | Result := True; 103 | end; 104 | 105 | function THorseNewControllerCreator.GetUnnamed: Boolean; 106 | begin 107 | Result := True; 108 | end; 109 | 110 | class function THorseNewControllerCreator.New(const AModel: THorseNewControllerModel): IOTACreator; 111 | begin 112 | Result := Self.Create(AModel); 113 | end; 114 | 115 | function THorseNewControllerCreator.NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 116 | begin 117 | Result := nil; 118 | end; 119 | 120 | function THorseNewControllerCreator.NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 121 | var 122 | LUnitIdent: string; 123 | LClassName: string; 124 | LFileName: string; 125 | begin 126 | (BorlandIDEServices as IOTAModuleServices).GetNewModuleAndClassName('', LUnitIdent, LClassName, LFileName); 127 | Result := TSourceFile.New(FModel.UnitContent(LUnitIdent), []); 128 | end; 129 | 130 | function THorseNewControllerCreator.NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 131 | begin 132 | Result := nil; 133 | end; 134 | 135 | end. 136 | -------------------------------------------------------------------------------- /src/Horse.NewController.Model.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController.Model; 2 | 3 | interface 4 | 5 | uses System.SysUtils; 6 | 7 | type THorseNewControllerModel = class 8 | private 9 | FRoute: string; 10 | FGet: Boolean; 11 | FGetById: Boolean; 12 | FPost: Boolean; 13 | FPut: Boolean; 14 | FDelete: Boolean; 15 | FControllerName: string; 16 | public 17 | property ControllerName: string read FControllerName write FControllerName; 18 | property Route: string read FRoute write FRoute; 19 | property Get: Boolean read FGet write FGet; 20 | property GetById: Boolean read FGetById write FGetById; 21 | property Post: Boolean read FPost write FPost; 22 | property Put: Boolean read FPut write FPut; 23 | property Delete: Boolean read FDelete write FDelete; 24 | function UnitContent(const AUnitName: string): string; 25 | end; 26 | 27 | implementation 28 | 29 | { THorseNewControllerModel } 30 | 31 | function THorseNewControllerModel.UnitContent(const AUnitName: string): string; 32 | begin 33 | Result := 34 | 'unit %2:s;' + sLineBreak + 35 | '' + sLineBreak + 36 | 'interface' + sLineBreak + 37 | '' + sLineBreak + 38 | 'uses' + sLineBreak + 39 | ' Horse;' + sLineBreak + 40 | '' + sLineBreak; 41 | 42 | Result := Result + 43 | 'procedure Registry;' + sLineBreak + 44 | '' + sLineBreak + 45 | 'implementation' + sLineBreak + 46 | '' + sLineBreak; 47 | 48 | if Self.Get then 49 | begin 50 | Result := Result + 51 | 'procedure DoGet%0:s(Req: THorseRequest; Res: THorseResponse; Next: TProc);' + sLineBreak + 52 | 'begin' + sLineBreak + 53 | '' + sLineBreak + 54 | 'end;' + sLineBreak + 55 | '' + sLineBreak; 56 | end; 57 | 58 | if Self.GetById then 59 | begin 60 | Result := Result + 61 | 'procedure DoGetById%0:s(Req: THorseRequest; Res: THorseResponse; Next: TProc);' + sLineBreak + 62 | 'var' + sLineBreak + 63 | ' id: string;' + sLineBreak + 64 | 'begin' + sLineBreak + 65 | ' id := Req.Params[''id''];' + sLineBreak + 66 | '' + sLineBreak + 67 | 'end;' + sLineBreak + 68 | '' + sLineBreak; 69 | end; 70 | 71 | if Self.Post then 72 | begin 73 | Result := Result + 74 | 'procedure DoPost%0:s(Req: THorseRequest; Res: THorseResponse; Next: TProc);' + sLineBreak + 75 | 'begin' + sLineBreak + 76 | '' + sLineBreak + 77 | 'end;' + sLineBreak + 78 | '' + sLineBreak; 79 | end; 80 | 81 | if Self.Put then 82 | begin 83 | Result := Result + 84 | 'procedure DoPut%0:s(Req: THorseRequest; Res: THorseResponse; Next: TProc);' + sLineBreak + 85 | 'var' + sLineBreak + 86 | ' id: string;' + sLineBreak + 87 | 'begin' + sLineBreak + 88 | ' id := Req.Params[''id''];' + sLineBreak + 89 | '' + sLineBreak + 90 | 'end;' + sLineBreak + 91 | '' + sLineBreak; 92 | end; 93 | 94 | if Self.Delete then 95 | begin 96 | Result := Result + 97 | 'procedure DoDelete%0:s(Req: THorseRequest; Res: THorseResponse; Next: TProc);' + sLineBreak + 98 | 'var' + sLineBreak + 99 | ' id: string;' + sLineBreak + 100 | 'begin' + sLineBreak + 101 | ' id := Req.Params[''id''];' + sLineBreak + 102 | '' + sLineBreak + 103 | 'end;' + sLineBreak + 104 | '' + sLineBreak; 105 | end; 106 | 107 | Result := result + 108 | 'procedure Registry;' + sLineBreak + 109 | 'begin' + sLineBreak + 110 | ' THorse' + sLineBreak; 111 | 112 | if Self.Get then 113 | Result := Result + ' .Get(''%1:s'', DoGet%0:s)' + sLineBreak; 114 | 115 | if Self.Post then 116 | Result := Result + ' .Post(''%1:s'', DoPost%0:s)' + sLineBreak; 117 | 118 | if Self.GetById then 119 | Result := Result + ' .Get(''%1:s/:id'', DoGetById%0:s)' + sLineBreak; 120 | 121 | if Self.Put then 122 | Result := Result + ' .Put(''%1:s/:id'', DoPut%0:s)' + sLineBreak; 123 | 124 | if Self.Delete then 125 | Result := Result + ' .Delete(''%1:s/:id'', DoDelete%0:s)' + sLineBreak; 126 | 127 | Result := Result + 128 | 'end;' + sLineBreak + 129 | '' + sLineBreak; 130 | 131 | Result := Result + 'end.'; 132 | Result := Format(Result, [ControllerName, Route, AUnitName]); 133 | end; 134 | 135 | end. 136 | -------------------------------------------------------------------------------- /src/Horse.NewController.View.dfm: -------------------------------------------------------------------------------- 1 | object HorseViewsNewController: THorseViewsNewController 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Horse - New Controller' 6 | ClientHeight = 395 7 | ClientWidth = 447 8 | Color = clWhite 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -13 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | OldCreateOrder = False 15 | Position = poMainFormCenter 16 | DesignSize = ( 17 | 447 18 | 395) 19 | PixelsPerInch = 96 20 | TextHeight = 17 21 | object imgHeader: TImage 22 | Left = 0 23 | Top = 0 24 | Width = 447 25 | Height = 134 26 | Align = alTop 27 | AutoSize = True 28 | Center = True 29 | Picture.Data = { 30 | 0954506E67496D61676589504E470D0A1A0A0000000D494844520000018E0000 31 | 00860806000000CA206DA5000000017352474200AECE1CE90000000467414D41 32 | 0000B18F0BFC6105000000097048597300000EC300000EC301C76FA86400002D 33 | 264944415478DAED9D0B541457BAEFFFE7E60AC7E0230F8DC90575A51317A883 34 | 8FC1233E2E3EC6D611CC04650811D00163448D30198C06C6070EF808243E0714 35 | ED8408477C8428912488493AA3C2324AA21395516125D3B9519848F44451192F 36 | 70987B773D1AFA51555DD574374ABEDF5A33C1EEEA5D55BB767DFFFDF8BE6FFF 37 | DBFF63802008822054F26F241C04411084164838088220084D9070100441109A 38 | 20E1200882203441C24110044168828483200882D0040907E126EA51FCFA22AC 39 | A9E4FE0E45E189040CD7F2F3EB657825D2800AEEEFE80C542D0AECEC1B220842 40 | 8484837013241C04D15521E120DC0409074174554838083741C241105D15120E 41 | C24D907010445785848370131E168ED65B30551A71E088119517EA616A103EEE 42 | 39A01F82C787237EA61EC39FECA6F29C13B0E3B3648478091FDFA82A43FE7B45 43 | 28AEB8853BDC07BD83B0257F15F48F393E3F7A3F82C14FF6C788C9633165FC58 44 | 040F78C4C17DD4E3FCA765D8673C818A33E6F3B132868DC2EC17231111D8CF33 45 | 8F8F201420E120DC84E784E3CEA5BD484E3D88CA06A502BB61F07309D8B2540F 46 | DF871C9DD31FE9073311F1D82D54EC4C4572513D9AAC0ED4E39DBF2C41B0584E 47 | D37725487D351F46C5F30BE85ECA44519C3FBC9DBC8F9EA32291B72E1683BB3B 48 | F75408C2159070106EC233C2D15465405462194CFCBFBAA1CFB8B148D04F80AE 49 | 37F7EF46D45D2847F1E1B3382F1A63EF71092859172A2D1E6DE7EC87157B3661 50 | C89144CCD97F8B2F77F8B489087E4A1CB1741F86E8E831E8C3FDDD508E9417B7 51 | E0C83DE1FCC1E1518898F0341E3797D9FC23AA4F9F42F1F12A360AF1C38A7DD9 52 | 88F6757C1F56E5B0322A0EED46C19916E11E9E0D475E6E3C867B75F633267EAE 53 | 9070106EC203C26169B4BBFB6345CE6A443FEB637F5C6B3D2A7252F14AF12DFE 54 | 9FBA05992899E3AF78CE88283D2A8B8CB811C88C742633D23DA42FB3AE2409D3 55 | 37D7B2BF1E415C4E0E9605FA408E3B75F5F0F2ED673FDAB8771A1B666561BF78 56 | 1FE9796CB463272E8D301D5A8BA83FD7F0A31FD97B20080F40C241B809F70BC7 57 | E58239887AB7115C0F3DFACDDD58112C6FB439F128FEA3F97AC4A9A8BE0AE7E4 58 | 18C0AEDBC0AE5B615AE8FCCE596C54C215198B124324744ED4D4E5C279887A9B 59 | 13351FC46DDD85652365EEA3B516FB1393B0E112F78F206C295D057D0F0D2722 60 | 081741C241B8094BE1E82052C2D1CC7AE9CF8BBDF421F1389A1B0E5F07C5349D 61 | D982F1AF95F33DF6C1BFCF46D16FFDAC0FB0120E1F24190A91E0A053DF261C18 62 | 831D475310A275EDA1B50A1B67A4A140E57DDC284BC5E4CC1AFEEFB0F442644D 63 | F251751A827025241C849B70B3705C3260D4E23279119082139BA94C6CB8BF83 64 | 1370ECCD50619DC28CA570A81C41DC39BE0EE3D69CE5FFF61E178B3D2B233158 65 | CB28E0DB7C4C9F5F823AB5F76171BC775C06CEBC446ECA84E721E120DC84A570 66 | F8212C2E102A4C7B3B774C282DAEE10DA49470DCF894F5BCD70B3DEFE8378BB0 67 | 22B89B8A421D4C9F5908876AA3CC4D81AD4AC29A2F84856B74F741C8CC582C54 68 | E3FE6B731F715B3FC0B2910E7E60296EE12938B3748CA4871641B813120EC24D 69 | B8778DA3EEE3D730FD2DC107292E87195C951DEFCAEDB3F07211F797C43A87C5 70 | 394352776247A8CA9889D65A1CD9BC0E691F5BBBEDF61C12848573631011AC43 71 | 4F191760CBA927CD488D9A08C2039070106EC2BDC2D1BEB6A04D38DA7FE742E1 72 | 1069BA761607F2F2B1EBD35A2170CF4C6F3F442F4E46D2347B01B1BC0FCD9070 73 | 109D040907E126DC2B1C963DF54E1F71D8D25C8FF39F1FC4AEBC13A8B8DED2F6 74 | 31B706529416099DC502BAE5C829FA8D42240DD5709E87BCD0B3879A293A8270 75 | 2D241C849B70B370B8798DA343C261799D67F2919A51D2160DEECBEEA584DD8B 76 | 795DC24A00D5AC7110C47D000907E126DC1CC761E15DE4BB201347D504C3597A 77 | 558D8CC7D1AD36AEAF6E100E9E7B55D8989086822BDC3FACF36039E51D46109D 78 | 0C0907E126DC2C1CAD3530C4A422FB1AFBDB3F1225B9B1D03DA45CA4651C87A4 79 | D8B84B3860392565334566198FA2F23E08A2B321E120DC84FB23C74D879210FE 80 | 672EDD473784A51B90354921F3AC55E4B84CCE280F0947D6079908B3C8AC6B19 81 | 011F929AEDD2F312843B20E120DC84077255594E0175D721697306128648E5AA 82 | BA858A9CE4F65C557119287A29D03EFEC15DC271F72C362E5E275CA75474B865 83 | AE2A3C8288D4D558364DDE855748E17E15DEE3021D46CB13843B20E120DC8487 84 | B2E3D6E463FEAB25382F66A71D3C250CB3F5CCA08A6B08FF55578E8FF79C6AF3 85 | 6E52971D57BD709C2F9887F5DF0C4388AE3F9E19C665B3F542DF813AF46DAEC5 86 | A51FEAF9ECBC078ACEE2B2280A728910B9ECB873979789C7B1EBECEB8F88B051 87 | 1831AC3D436E757535CE9D3C8B8A6F1BD1E44C9D12848B20E120DC84073772AA 88 | 33624D9A01C5DFB62814A8653F0E0DC2A1360EA37B3F36924847FA24F9329BBE 89 | 2BC38675BB1DDC87B93C56A747493888CE81848370139EDE01B011A6CA329B1D 90 | F8BAA1CFB3FD317ABC1E31615A7600D43055D56042E517A7F0F9C90A9CFBE12E 91 | 4CFC684084DBB96FD03308D18723624AFB2848F93E5A5077C988E20F8DA8F8FA 92 | 2A2EB7C58170F7F218460C0D41C884B1983A52612A8B20DC0C0907411004A109 93 | 120E8220084213241C04411084264838088220084D9070100441109A20E12008 94 | 82203441C24110044168828483200882D0040907411004A109120E8220084213 95 | 241C04411084264838088220084D9070100441109A20E1200882203441C24110 96 | 044168828483200882D0040907411004A109120E8220084213241C0441108426 97 | 4838088220084D9070100441109A20E1200882203441C24110F70BD7CBF04AE4 98 | 09E80F6622A26F675F0CE1143F9367E832E138BF7316E6EC57776C5CCE075816 99 | D8D9B7DE05A92BC1CB8BCB1196BB0911BE2E2EFAE3D7F0827102DEDF1A0E1717 100 | 4D9879D08C4EF3596C8CCC02D2F762D9C86E0F4ED9EE44F619B6A0727B2C9291 101 | 82634B82E0DDD9D7D9415C2B1C4DC9F8223EC8E1B15E3D7CE0FD5027DDF1D7DB 102 | F1CAB548EC08EDD74917E046AA0C084C2C738B300B1D8350149E48C0F0CEBE4F 103 | 17C389E2FE819B3ABF33F3A009077FBD062075A7EBDF277796EDF63A917A86F5 104 | 287E7D11D62001C7DE0C459F0E9F8895F787123CB3B573DE47D70A073250B5A8 105 | B3DF3E653823B1FEA1D71FACC6A8FAE6B811C72944E46522CCC586871F719CD4 106 | E3C3375CD1E8EF2F2AB7CF42C584FB6014FCA009073F2AC88177A6014943DC31 107 | E27053D9EEC4C1886343F7D5287A29B0E3238E56563FBF3A8BA99DD491FB9909 108 | 470B2A364761FFE007AC1743B8915AEC4F48425D120907E1023CF50CAF1C44D4 109 | DC9FB09284C30334D7A020311595B3483808910623D63CBF1D3DEF877537128E 110 | 071F0F3DC33BC7B3306ECDA39D36757C5F0847D3B51A7C5E79049F955E4065CD 111 | 2DDCE13EECFD088283F55890108B60B90770B716151FE5A3C0588D73DF36A289 112 | FBACBB0F060FD061C4E4B19831598FE14FB261EEDDB3C84EDD82822AF1185B82 113 | 5D35EF2870A3AA0CF9EF95A0E2423D4C0DE2350D0DC08CE805983DB29FCCFA4E 114 | 15364EDC0B1DD7E01E6B84A9F230761D32A2E28C757DC4CD9D8990013ED22796 115 | 6DB4526557E0CB8BF5B8714FBCBE5163313B261611431E91BEA7B2544C3E3651 116 | B19EEE5C2947F19E12947E7D1597AFB7B04FBA41E71F80901763B170923F7ACA 117 | AC6B716D67D74041CCA5CAE8F32CABBBC817103F2D107DE4D6C65A6FC1F4F529 118 | 947EC2EACCF6B731F1ECFC3AEBF3D795213975378C575AA4CB8B966ECBE6EB2B 119 | AE3409CF564D3B3573D7842345FB507C8CB5F32BEDD737F5F970243C17843E3F 120 | B9D6E8F0CFECFB58FE3EB8EBDE6FD887FD678467EEDDB71F42F4914898A3C7E0 121 | 1EE6F65385E243EFA3E048557BBB65ED223E3E1E61CF4AB539AE5DA50112A26B 122 | 796E73B9074E56E3B258DF3DD93B1A12168EDFCF9C00DFEED054B6657BB95155 123 | 0243FE617C2CBE2742B931581E15D4D6568467F63EF22B6A85F6AEE699B5B6A0 124 | EEDB13282F2DC7075FDB5EB775F956280887928DB4B319FCB9FA61484020A64C 125 | 0EC573C142FBAD2B4BC32BB9556DC7D8E229C7A3CE178EBA12CC89D90B4C0B43 126 | 0433F6C143FDD08BFB9CBD649F1DCEC786A29F303B278755864DC3BDC61E50BC 127 | 01E786EAB1ECB7133062900E7DBD80DBD7AA613255E1E35266400625E2D8AB63 128 | E0CD1AC19DBBCDEC474C409EDF02D3EF37618BDE62C4F190177AF670C13C6A6B 129 | 3D8C6FA522F9B837C2E22211333E10BADE3DD0D460C297274B905F7016B5C1F1 130 | 284C0D87CEEE65E15E94B5F0CEC9C633079390563B0C4931A1181D1000BF1EDC 131 | 7D9D45E5B1126CDC7F15BA056B9137C7DF7E9E545138D84BB87527744549D8F0 132 | A37CD92352B3254763CAC2D188CB856998FB36FB7DF43CC44D0EC488271FE585 133 | FDDC05230A728D38D7578F2D6F2D41C863726D67158E0E7C1FE1DB6E610AABBB 134 | 885F0660886D19431350B22E14BE762F6C0B2AB7C56249850E1173F5983152A8 135 | 77F6635CBF684476EE4154F8D9FCD6DC26589D25CF67A2FA462192865A14E9E5 136 | 839EDDADEFD1549285399BAB3184DDE382B05F6208FF6CABF1D97B6F63D3C74D 137 | 98BD95B5D391D2A2DE5465C0DCE565A8E5DBAB5E6CE737517BB10AA51FED45F1 138 | 8F1390BBAA3F76C5BB5838CA27A270F2292CCE6944C4E270CC1816C49E39AB97 139 | 2B5530E61B90FD4D00B2F23230E51ABBBE95E5E813168B68F1F971F756FED13E 140 | F977D09170B0F65232F72A92138DE8CBB58BF1FEAC53C73A4ECDCC385E38857D 141 | FB4A70A4598F4203EB354BBE0FF2C231DF2B0579C8C7E2937E5818138E9061DC 142 | FBCFD5E7591CC8DB8B5284212F371E7D8EA7E1859C9B08890E6F7B1F6F5F3B05 143 | E39EBDD878A61FD2F3595D3F695F77752549989E0784CD0CC373E3C5F6CCB8CD 144 | 09F0AEDD286890B96ECDC2D1C83E4FC49CC382CD686BF75C1D7D6FC2A5F2721C 145 | 387E13B373B311CDB933DE6BC41DD66C6B8D6988FAB31F767C98801196CDD643 146 | 8E479D2F1C8C265611DE5ED2DF5D2E9C87A893337134D7D20DF4168EAC99873F 147 | 3FB10A254AAE6DADEC7F5695283446935B3C35C406707218766C4B963490DCC8 148 | 67E3E27538C08CD851BB4566E1DA2A06B01EFFF844142E0892ECA1DFF9DA8039 149 | 7F3022F8CDDD58116CF3223B108EE2DEDDD0372C45B6ECA6CA2D18FFFA4D647C 150 | 9881B0DED6DF2909471DFB2E7C1BF05AEE6A443F2D61385B6B51BC6A29D6D4B2 151 | 972D8FBD6C36CF9A6F3B47BAA1676F262EB90908EE615F04EE9DC6865959B8BE 152 | 7C37B64C91181535B31EA1978CF8379423E5C51CF45EB7172B46D91C237AEFE8 153 | 1CF4D46E7C9A8AE9EBEB65C5C15C07197B241C13B873CC35A06E66068A16492F 154 | 8CD67D9C8A174A1BE177C907B35D291CDB4CE8E9AB476E8E8491631D9DE23F2E 155 | C286870231FAEB6684E4650AC6C906D3A124841705A1685F3C064BBC4FB2C2C1 156 | 9DDB4B8765B999D2EEE1AC5DEC4F4C42C1984C1C8DF3B7F9525938B8F6D267E8 157 | 3C144A7524EEB1F72C7E1DCEB1DEFA9DEA7E5891B744A24D35A262F33CBCD290 158 | 802FD2F5E869776D2D686223424923DC5A03437C2ACA23B35118EE67FFACB508 159 | 474D3EA6275423E13D690113CE071B3B26D66FA6EEE73D55A588F8209EFB80BD 160 | 906DC6586854CD9B3E6086404B616E148E6FF3113EFF0466E4ED46C2B30AC75D 161 | 398839738B306493AD1113AEADE0C95014EEB137AE965C2E9883A8D32FD88829 162 | 1C0A47C193E1122FBF25C2427145E46EEC98666D9C65854334CA4835206BD223 163 | 904534FC9716DBBF6C82ABAF0F920C8548F0972FC2746811C2CF84E398139E5D 164 | E77746B15EEA6A9C79C9A67DAA118E6676EDCFB36B5FC0AEFDB77E3207B1BA5B 165 | 9C844DC33370C6E61D109ED74C94E44442275BF7A2BB66A53FD25D291C992644 166 | 6F92104C11AEB330EAF572F8BE2465BC45EEB2673CC38067F20A6DDAB603E1C8 167 | AC813E4D46E82DCFBFC60785476D0DA003E1D8EF8715FBB225858E836F2B7FAE 168 | 573E3F7B67A7CFAFC5B2D255D0F78026CCA339BBB6A85138F8724AC7E2688EB6 169 | F828120E87483520E12533E83250B2488B6B9BFB8483334C734CF354AC95089E 170 | 5DAF200567968EB1B876E1DA8C0BD80B3CC75FF9647C833F8DB83D3B113DC0E2 171 | 7307C2A1A66CCE35F5E587EC9FA39C70083D4BD6804B5903763044E65FE64FF4 172 | 283130036A5577ACED1C63A2F61E1335A502BEDE8EC03F7473EA6591153E15C2 173 | 71E7F83A8C5BD38C2C899198DD39B8BAB03482ADACEE67A4A16EB9B2016DFB7D 174 | 265C2C1CFDB0E333360296EB88F0DE394508C92D42D210B992AA903D3D0D4D6F 175 | D9D69123E1E8812D8E8CF2B512BCFCE22984C94DAFCA09C75F63EDDA91258220 176 | D623CBAAC36903B7A634CBC9A9413E660AF66D51EB888395332AD184151AAFA1 177 | 6B09879AC871CD0BD1D20D889B338E4A34A2675C0AB6C605C92F9A4A94E57AE1 178 | E0827116E14048368A647BA4ED70D31E9337DB1818F3B5ADB4EFEDDBC1FB70AF 179 | C3F5F442D6CBB7983671201C76C74B20D7019033BCBCD034D98AA00C97D84BB2 180 | D8840C9B97993FE78FC9F8226D82FD9481D56DC8BCAC2AE88870F0F7F84D3C8E 181 | 3A8A9AE705BD1A0996F5CF1BC6324CB1157985FAD16A4414EFF983518A06569D 182 | 1790D051334EB67D6F1C08477E80E3CE80A3753939E1F8A78336A7AAADC89FC3 183 | 21AE120E6EBA705512D6D406217D4D22229EF55173F62E261C6A22C7A516A2CD 184 | 1E0CC6D3F8FC7C2D6EDFFBA9CD8BC18C94B740D37765D8B06E378AEBBC103233 185 | 160B7FA3C7705FA5456E7709877AC32C1CCE353A934D6F484B2316A7946CDD8A 186 | 9D78096DD1261CE2C86F988A5152DBF5EDC6609BDEADEAD1AA2363D06042E517 187 | A7F0F9C90A9CFB919DEE8AE8356646AAD3E25038C429249D8AEBE3CBDA8B1196 188 | 533AFC35FFE8B8E7ADF8FC9C438D279C5B85C3D1B915CFEF40381CB517570847 189 | 733D2E5754A0F4F4297CF97D239AAED5DB783385765C38385A6FA1B2702D92DF 190 | 35014382B0706E0C668CD2A18FC27475D7120E27A6AA9ABE2B41EAABF9A8F0F2 191 | C394C9133131F8693CFD94E0ED2320784279294D2588EE76BB3EAD45735F7F24 192 | 2C4D4474B09FC402B07B854375CF45140EEB29092D65C8BCC89D241CF6064506 193 | 1923DD61E1602F5EC5CE542417FD04DF90B188181F84003F3F3CC379F08887F0 194 | 5E28957AE785A352C57315B1EAE46819259170A82ADBFDC2D1EE41E71D380C33 195 | A68E41886F7FF80D123D3E392E1A30EE8F3EAE110E334CA8CE7F7E10BBF24EA0 196 | E23A303C3C16CBE78663B8C473F9790B07EF52BB1B589089AC993A193F7F0D06 197 | 951990CBC7F762D33639F74F1A7174BD11878537DBE66484C8183FE7A7AA847B 198 | 3C126CE3C2AD80954B247FCD2D78E72F4B10EC683A95844355D9EE168E362FC1 199 | 9CD588969B3A72D554950C4DD7CEE280E16D647FFE1342966622335C67352DF7 200 | B3168EF3EF4661CE57B1F6DE4196701E2D53B314471C7698DD3F6FD996DDB5D6 201 | 389ADF2CC28A608BA9398F0B870BD7389C150E7E817337FC143C8738F885F9CA 202 | 70278443746678D849C70FA9750F571CAB02120E6784437004A894F0FEB34458 203 | 7C77F188438236F77B9BF6FD33160E9573C7BC9F7309F45A17B0786F9133363E 204 | F1EEF3AABA5C380751275F5016411E65AFAA03D1F6EE9CD2752261603A413878 205 | 8FA34C1FBCF3613282BD94CB56F4AA72563824A7FD6C11E27E52EE39B3C6A172 206 | 91590EB1E3035B919740F0DEBAEB5AAF2A120E6DC2A132AE8777B17E7782DB85 207 | 43AEE3F233168E461833E620F9F155A85A12247B0C1FA453D2A23D945ED2CDAF 208 | 06861753712EDE0D711C7C04FCFB1891B39B5DA78281E8701C875827DFC46A8E 209 | E370877098631C6A5F7550A78EE2389C150EBE975E8584F736C90750F175BE17 210 | E7A516C7F918852DE8AB54377CAC8A017DDFD8251B192E8F10D5FEF24F328166 211 | 6D88E276DCC5711C241CDA84C3DC1EB6B2CF46CAFC4C6CCBFBEFB96871DC0152 212 | 2EF24227E3899FA3708861FDB93AECF820192112F96AB868DAF0F7EAE17BE516 213 | 422C1FEEBD5BB8E3F5886CEEA3F6796FD6BBDD136BD14B14C5AA7589E24B2CB8 214 | 1607A9F38469A305E7DF4DC09C6301D8F2560AF452464C75E4F852D908E31B6C 215 | 883CFFF50BD0E74AA49BEE0CE1801855BDB90509DB3290E0EF64E4B8B3C2E128 216 | 388FAFF32C54C00BA6A76225AE5FE84C14872904C0A17DDE7B455EA6F2265912 217 | 51BEE6CE422F99742EE6F25F286D81AEAA1B222447920698D4C4F8A87C66D665 218 | 9370B49F430CE41C94829352D3AF625B2EA8F581E9CAD80E0A470BEE34003D7B 219 | 2B7434C575E0BE2B77233DC4E2DDE23B4C464438089A75179DBB38DE5C85ECF9 220 | 69608F18CBE263A11FE5875E5C8E966F6AF0D9A1DD38706B2233C2A1A84D7DCD 221 | 3AED35D728969723645A28F46302F08C9F9F9883A61AB5B5D5283E588223DFE9 222 | B042220546D32503A21673F11F89C8F84D109FDFAAA9A11E4D4FEAE0CB1B34D6 223 | F3FB23EBF9B53A91F8D0ECDDF3D15D8C9E6999F3476DAE2A219FD490C3495877 224 | 77A2454E23219F54F987FBF89C4833D233913E49C200759270587AA1E8A68523 225 | E6F9B118CD793469CA55E5BC5795900EC48480A87948FA8D90438A6B0BE7FF5A 226 | C6EAFC027C176762E59325987C28405EF8D6D763C6D2A54898A413EBBB1EBDFC 227 | 75169D8B465CDE9F86F93BAF6248781422260462F820F3B3E1DADD77F8DC7818 228 | C5035324A71A6F546EC72B6B4E00E3C2113F4BAC1F0839A32A3E38885DDFFF12 229 | B93961B8F46A0EBCD7DB3C3F7E6DC888D939459A46DD241CCE2D8E0B36A20C08 230 | 89C4C2B9131122BEC3972F96B3B67C02B77FBD143BC26A994197486BAE493884 231 | 7ADD78270811D32D3CB7F83C55B5F8FB9923C83E5C835EA129C84B1C6313AB56 232 | CFEC5412526A83B0E2F5583C3780CBA57513B53FF5C0E0A71DAC91BA804E77C7 233 | E502602A8BDE46F6A10B386F95D1D49C515518259C9B65F170B94CA895461C38 234 | C20C52F54F622654C09C8D3578861EB3A74C804E66B470E3EB7CACCF31A282CF 235 | A8CB9D6F2232B631A3C61D2F2E3C9F5BAABC38A6C49D1A2376ED39689D1D7754 236 | 1066CD8C41F428B9E91C8B463C443E3BAE6246CF4E130E01DE13246F9F7576DC 237 | 51C3A00F8B41FC249D6276DC8EC671DCF996D579FE5E1457D8D4D7FC28047319 238 | 92B91E9AA11F0AE584AFCC800DFB4EB565ADD58D8AC2964DF66B1ADC3D16EF2B 239 | B1CA98CA9D6BF0A06710A20F47C49440B10322F57C6CB3C4DA66FEE5DAFA5ADC 240 | 5E6CFDFCB84DB4A6E7F8A95A47D2FACC483864DE8BEB675160C86FCFA86BCE14 241 | 3C371661FE8F88535AD588E9E05455D3B52A941E611DDDD37FC72573667008D9 242 | 8B478C1C83B0E7431111286333EE99509CBB1D05C72D3235C7ADC63BBFD5BC12 243 | A71997094797815F543F81590A7970DC4307A258892E8CB0389AFC500A4EBEAA 244 | C2738D203C0009870DFCA2D3912097EECFA10E120E420A6E0D66356EAFD2364D 245 | 4510EE8484C306CE83E14080E38474AE8784839080F30E7CF5265E53CC6A4C10 246 | 9E8584C30AD6BB9B7B04C3F3B4CD25BB860E0887A7B61CE572EA14E558AD47E9 247 | FC2762D966717D887039DC08787143BCD3EB6D5A50BD2EE1044DDF19919DD7BE 248 | 06C5CFE147BFEE91F978C2F59070DC37DCEFC2710BC68C04247F138415AFBE80 249 | A983C49DDCBE6981EF387F0F4FEB11EEC06DC2C1EF5573043DE312B0F2D763C5 250 | 5D27AB51DB3D00C103B4C6C510F703241CF70DF7B970F0018E46CCD893ED383D 251 | 38F140E21EE110B7F56D5D2A1D17413C909070DC37DCDFC2C13B0DE4FA39DE5F 252 | 817860718F700801967F5FAC320128F14040C2D115F08070B873FE9BB83F70CF 253 | 3326A78FAE08094757C003C2C107A195EB4938BA306E110E31A09684A36B41C2 254 | A109154912C53DA6BF5CA090629D37F446E8A512F3DDAD45C547F9283872C122 255 | 8A791822A217204E2EEADC52381EABC7F94F0F22FFE02931325EF060E1A29AE3 256 | 7F1B2AB9298C2C7546A46C3E882F2FDAECA427D29E7892EB55EE854E14AE1B67 257 | F2B17EDB1118C5C8EA9EE129F864E998F6F41DE61D1F4BCBAD22B07B0ED02124 258 | 2C06CBA364B602E6EFF32A1672D1BA5C3D1D3220FBA36A214ADD1CD91B1F8F30 259 | F31E0AAD625DEC3B215E8B392B413C162A44B25BFDB6AD1E157ECB4711E7A0AF 260 | 524A1031DF949F52965C7EFFE9166C97D8BB43D8ACACC43A2ADF3F00212F9A33 261 | 2C4817C98BC1F7B142B4F25D138A0D5B90FDA9391ADA0F2B0CED6B560E85E31E 262 | 7BCE096BF1E5E4D5D8F352A0C27A4523CE176661FD27D5763B79F248259B34D7 263 | F70767505963E1793532A43DFA5FBAD2B4B53DC225907068E4FCCE28CCF93151 264 | 7E7F6CFEE52F43D39078D914EB72EB05E6DD102B07E9B12C3A141344CFA54B5F 265 | BC8F4DB9A7D13473150A1704D91B09B370E4C7A26EDD5A540C0CC36CFD5831CF 266 | D54DD45EAC42E9A1DD2838E38308B93C575230037FE76E33FF27BF835EC55814 267 | A587C22C87ED1B16995FDED578E65022E67FF50C92625EE0738F793798F0F7D6 268 | FE08B6C89FC327B7CC03C26686E1B9F1423E2F8EDBCC38EEDFC5AEB3418F4203 269 | 1307DB7C5EE6FBCC99888A95BB71276C1EE22CF3811DCBC7BA77AF22382D1B5B 270 | C6FD88ECC4B5287E6222927E23E6FCE2EAF24C19B2B719716766866C2249FC74 271 | 1A1B976FC6010C6BBB0FBE1ECF18B1695B09CE0D8D47C93AF66CDB9E83E30DAD 272 | 8434D835F08E908F00E753F39B126CDA5623FB3C0D73DFBE8A11D1EDF70B9579 273 | C0DA8463662D9F2CAF79E63C2C08E3F279B5A0F69B9BE835AC3D458AA27030D1 274 | E0EAD3F81FABE5EBCDB22DDF6D443397F051DCC1136F142269A8F8A5EDF6D1D7 275 | CAB166F916947A05B1FA0E47C8301DFA7AB5E7F192DBCC48405BDB235C030987 276 | 46840D5C801D9F25234422D683139614E831617F159E964C5B22A69078D866DF 277 | 0DCE28CE35A04E4E1CCCBB252ECDC68E6936865FDCEBBA6E40337C631432B072 278 | D986DF6AC46B4E784629F746B997772D9AA327A2F27B3FECB032AA123041E27A 279 | F0DE52C7B4B2515D7C2ACA23257285893B089EEBFD1822D66F62BD7BFBC556EE 280 | 1EA7E700FA9126348DD98C1D52F10F7CB6DAC398209559544CBC59E0672B0E22 281 | 7CAF3B0D159399F058F4BAE5F61A111084A552178AEF0EB3FA97CC3925BDAB63 282 | DB6E7412093B85FA52CE3C2C3C371DE2700A88CE514C0B2FFB8CD968A0785512 283 | 367ACDC3FB69A1CACF56B26D28AC7198EB739454223F01F36646BE2B25DABED6 284 | B647B804120EAD284D4BF0D35459E8B52D07BAF7E6A1F83FA4A6B484E9AE1B4B 285 | 2DA72CC43D1BAAA35092C30C8F4CC317D2D007A2B0941908CB63C469908A6047 286 | 197D0503B6C1577BDE23C7C2C18C2D0291F56106C27A77AC8AF97395B373BD21 287 | BDE9D2970ABD76F3C649FB9F0C47916CB4B5903873A3CE7E84E028D53F47D399 288 | 2D18FF5A3D5658AE2929EDDEC75FF7293CF7612C6A1364D287F0ED6A1F46ECD9 289 | D92EEAFC3E204C05530DC89AA4D06B56D8EBC43CD2F17D49396DBCEC33E6323E 290 | E72423F91A6B9BEBB48A0687B2705C2E9C87A84F26A2285F3932DE742809E16F 291 | EB24123DBAB6ED11EA20E1D08CBCD1E1A7A9960379CCB0FB7E2A6368F9248ACC 292 | C058EEF5216E1ED39CE620D589CC9EDD66830A153B1B3A1A31C9A146380E44B8 293 | 28119FE27ECE0ED609C49EFBA6316C44F792FC6A2CBF6D71F36A9B0CABEAF6E6 294 | 30AF6399965A6EF32BEF766A5977756C443A1FABED52AFF3CF65F3A356D397FC 295 | EFB6E9EC3B0A12C88D7804E168C40A15493BED9FB1B0AFCDFCAFC6222F4762EA 296 | 50DDC394170E733D3ADA048C4376274517B73D4215241C4E20B795E8794BA3C0 297 | 07CC9DB2DB9447D2007FBD1D817F30215D69173B1E99C57995DB5DF2F03B23BE 298 | 8FD17985487856E33D3B100E55FBA5AB4151384A1062D92BB7432E05B88AFBE1 299 | EB261F014ABBBFF1881B823D619D229B5FFFFAE7529B2D81ADAF871FADACF2E1 300 | 3B179662705E42505CB19F7B9BF81C75BC539C6D9DF0D364FB74C833382B1AFC 301 | C394170EBEBECB3045F1799A11F6C9491B64DB217071DB235441C2E10C52FB99 302 | F33BD16D86D75BE669086127B12F232D471182C1310CB5F6B852BF7FB0CC22AC 303 | 16775CB1E7E6A5D13D528D706872B96CAEC7E58A0A949E3E852FBF6F44D33571 304 | EF9236B46DCB695B474E0987AAFDCB05F8BD157E4CB65AC8E6470D6B7CAC4708 305 | B61D08BE9DE4A0CF36CBF515A9E94BC70BEE56C88C46B5B8D85A1EDBC4894666 306 | 0D66BC5188F4711D09DC53681B7C7DFFA87AA74DBECEBF4FB099C2A43891CE80 307 | 84C329ECA725A47A92FCF4C185C8F66D6AF9A1F95AE02DEB396EF33CB46AA26D 308 | 36B1D114C7E1DC8BE63AE168DF2DD03B7018664CB5D8F9CC7CC84503C6FDD1A7 309 | 9384A34C7DA5D8AE29F1538E063C63319AE3D74C4E86591C273847AC7FDC623A 310 | 4CF2BED4DD8775DDD88F3A9D118E92B95791BCDC841193D8355C1C2BEDE1A61A 311 | 47C2E168B3A57678E130D9AEE391707406241C4E623D2D21E6E3F1B699BBB65D 312 | CFE017506F62A5CDFA02FFC27E32CACAD555112F1FF4B47C911FA011479B9750 313 | CE6A443F2BD393559CAA72B7703462C7870918A1A6526CDD4AC5731F08368F28 314 | 855167C5F3D6D762BB9EC1BB67EF0BB099FAECA411477E3D743D0290B43E05FA 315 | BEECFA1393B0E9A9641C93733F77088D38BA22241C4E62F5F2CB8C24CC0BB5E7 316 | 628491093F02B918631703222C58FBA8EE79D921B7682E85A679E5765C231C55 317 | C89E9E86CAC5CADBF2CAD687BB85436A0A522356CF58EE7A79F1CE411F7E6422 318 | 8E409EB0170897AD7168128EFE78276F0982CD86DCEC06FE6AB6BA918F1D9E59 319 | E320E1F02C241CCE62E93ED9D0EE4D65EBFDC21B92EFE3D9CB1F888A8C39D22E 320 | BAAA167D15D0E05575E7F3348C7BCB4F95A78E252E110E958BF8970BE620EADD 321 | 099E170ED1CBA7395DC96BCB0116A3CAC19FCBD5992016D903B99149A3EC0E7F 322 | FC4824D347D55EE38A5E554EAC71581ECB5DC7E435F54EC5FF28B70D61CAB73C 323 | 26DBF17E230EBCAA48383C0B0987D388415D618558F85FAF21EAFA123B174B1E 324 | CE90243623AB34089FFDEA6DF84A8A83B0D7C5C6C75350B22448BB4BA1398E63 325 | D292F6F514295AC5A98700F7C471387C7945B7E3BE4A5E4B624CC2FE7B9DB038 326 | 0E31AEE0C24C1C7DC3C94032732C4F0E1B017E1885FD83A5AFA36D8BE2A5CD48 327 | 7DD1843829F7687E213D0BB58EDC551DC571745038CC6EB9734E3AB3DEA1DC36 328 | F835A07D8128DC631FBC6889A3380E120ECF42C2D101B85E5E5443385654EF86 329 | 69AE5C9E22AE57B516889F0963FE5DA4CBA525374F09246EC68EE7147A5F5C1A 330 | 07C9942347703BB01EBD66C84D2934B2EB5D8BA8B7818C3D9908D33815E39AA9 331 | 2A61CE7FD3A014E9BD19C428E8825A1F98AE8CED14E1688B641E2F13C1EFE859 332 | 88A389FD8313A0DB7602BA3D32D7CA8B683982537DB0E6AB20D91436373E4DC5 333 | F4CD2D48D89681047F6723C73B2A1C688BE82F1D9FA12AE5483B0EDA8618A96F 334 | 1C9A8C1DCB27488AB5E3C871120E4F43C2D111B8D1C44A23D030818D28E4A77E 335 | B81C44C91FB1DE5570A2E27C7553CD5E2C597E1097064D4052D8048C0808E077 336 | 4BE3F2125DFAE12A4CE546183ED561EB510983BAB211CB363F8DD257B3503130 337 | 1CF1B3C662F4807EEC5C7771FD9BBFA278FF6E145CEC8F243903E400572D8E37 338 | 5D32206A71191012898573272244CC3375F962390A724FE0F6AF976247189757 339 | E927ACEC0CE1E0E07227ADCC412986212E7202260CF587AE770FDE85D8F47D2D 340 | FE7EA11CC587EF22224FFA3A845C64D5F01D188B4259832D06925EF441AFA84C 341 | F98498165E68BA69E188795E7CAE5A7255B94238F87A51487B238B8AB661CE0D 342 | D6A0C3ECF96198312C88B57B2DB9AA48383C0D09478710E6680D9333A4A7A9CC 343 | F0F3DE25189EAE62331B669C2ACBF6E140E985B62CA14226D4FE0818A3474C98 344 | 1EC36D3385720675CFA3D8C28952AB7D765C3EEBECE450C447E931D8C9BDC15D 345 | 1AC771FD2C0A0CF9C8AF3067691533DBCE8D4598FF23626FBC1A319D251C1CAD 346 | B770F9F861E41F396D911D98CB90FB18460CD52322528F9001320167E294DC1D 347 | 076B4EBCC0ACA946928A60CCA66B6771206F9F7576DC51C3A00F8B41BC42A65F 348 | 970A07CC232060457EA6836055332ADB065FDF7B6178CF3A3B6EC8383D66CF8D 349 | 4470DF0E964FB814120E8220084213241C04411084264838088220084D907010 350 | 3F5FAE1D01D67C09A4FF0950355F7F9F944D109D0C0907E15978835A22F36537 351 | E0D1EE806F30A01F0FF83F05FC0F775FCBFD2A1C2DC0CE64F6DFDF018B46BBB1 352 | 1208423B241C8467E10DEA4960690AF094CD7775D5EC7F57802FD9F7DFFF13F0 353 | 6607BCBC1418D6CBA953A9BB96FB55387E60BF67BF45382B23CC3DF74F104E42 354 | C2417816B506F5261391DDBB801AD6F39EB912087D4AED195C7F2D9D52B638E2 355 | F05E04CCFB85EBEF9D203A000907E15934195436EA3030D138CBFE5CF2261B79 356 | 38993FCA25D7721F954D109D0C0907E159B41AD47FFD201CDB32155817E9DA35 357 | 0F120E82700A120EC2B3386350FFF69F40F64960D12E402E39E2EDABC0C7FBD8 358 | E884FDF7AE10598D27FB03A1F381313271D0B2D7F235B0B044F8FC89DBC0C952 359 | C0C88EBBF64FE1EB6E0F030347035133D87F7B392E9B2BE32FEF03157FB32F63 360 | 7638D0FF61E9320C0BD9FF2D021214F7B125088F43C2417816A77AE2D540F216 361 | 202819981360FFF5B70781AD9F018F3303FBDC34C09F09C5FFBDC10C3533FE46 362 | F6DB914C3C5E1E6D3F5A51148E9DCC66B3CFCBD603379900FD7A322B979DBB37 363 | FBBAAE8A95CDCE77968D864292D83549AC4198CB5ECE8461172BEB61766DFAFF 364 | CDCA1800FC7B33F07FD839CA3E054CFFCDCEC3CE3152423C483888FB14120EC2 365 | B338251C6C04919D08343023BC2ACCBEBCF4127971F807FB7E2DFBFEF93FD92F 366 | B03B128E1ECC98FB474B97CBF1153BE61D766C1C13B5710F4B94CDC4A507BBF6 367 | 8929ECFCFDA56FEDFD95C017FEC0A6DFD99F838483B84F21E1203C8BB373FF85 368 | 6CB4719619D02DBFB3F89019E5ED4C50EA1CAC7F1C62C6D9C80CF7F645D6C738 369 | 120E6E9490C97EA39443BC805D57CD786043A4C47D32C11AC83E5F3155FEF74D 370 | 2781DFFF27B0641730CCE63B120EE23E858483F02CCE0A47293BFE43F6835D8B 371 | DA3FBB7D1C58BE1F78E12D40AF10EB6136E2B6C6D9917084C84C8D59729919FD 372 | AD55400ABB069DC43967B3CF272BC5A1FC00AC66E71FC3FE37C3664444C241DC 373 | A79070109EC595C2C14F155D65E5AD07FE97D28FC53512FD9FAC8DB323E198C9 374 | CA0D75908CFC5FECF78BF3EC05C23C55F50776DEC14A0588817EA3FF44C2413C 375 | 309070109EC559E1D8CD8C68CD5420D3624A484A4C24118DF3209B1184C3C571 376 | 052FAE364C406A161B9DFC49A528C95C1B0907F10041C2417816A784E336F0D6 377 | 72F6DF6860F9A4F68F79E1F841FDB9836C8CB04B8443C6F09370105D18120EC2 378 | B338231CFF62867C0933E4BF4A015EB05848E084E3F42F98984C5357CEFFEC0E 379 | 3C6C117D4E230E82700A120EC2B338231CA7B381DDD78055EB014BAFD62FD8E7 380 | 05DD544C5569BD1627D638E27280716A44C916120EE2C1838483F02C9A538E54 381 | B311C51676ACCD34555B59C7EC3D9A3A7C2DA27004A930DA7C54BBC9BE0C120E 382 | A20B43C24178162DC2F1AF1B402EEBF5FFED7160F52A09CF2971EDA3E77CE7F6 383 | ACE8701CC73F99682433DB3F55268E838483E89A9070109E45AD41FD073B6617 384 | EBCDFFD81B58B212F8854C3E27736478E82AF9E86C8E7F417BCA113E72FC77F2 385 | 869B9F2A334967EE25E120BA30241C846791DDC8A901A86146F4CA5F81AFFE06 386 | DC6C61238CF1402233DC8F3B28F36FFB819DC7D971BF004282DB734A35FC839D 387 | EF2A709A9DEF12B3DEB98B24AE4541385E669F7FC6463C4DAC5CFD2460B838E4 388 | E172557D7218B8FCDFC0ECD781C9127B859070105D18120EC2B3286D1DEBDD0B 389 | 78B40FEBBDFF12183B89098786FD379A9801FEF820131D3602B82966A0E5B7A2 390 | 65E5F98F067E3DD5BE3C355E55C315B2E3C645024FC85C230907D18521E12008 391 | 3BB4B8E312C4CF0F120E82B0838483209420E120083B4838084209120E82B083 392 | 8483209420E120083B4838084209120E82B0838483209420E120083B48380842 393 | 09120E8220084213241C04411084264838088220084D9070100441109A20E120 394 | 08822034F1FF0160616E4FB1E68DCD0000000049454E44AE426082} 395 | ExplicitLeft = -1 396 | end 397 | object Label3: TLabel 398 | Left = 16 399 | Top = 152 400 | Width = 97 401 | Height = 17 402 | Caption = 'Controller Name' 403 | Font.Charset = DEFAULT_CHARSET 404 | Font.Color = clWindowText 405 | Font.Height = -13 406 | Font.Name = 'Segoe UI' 407 | Font.Style = [] 408 | ParentFont = False 409 | end 410 | object lblMiddlewares: TLabel 411 | Left = 16 412 | Top = 203 413 | Width = 28 414 | Height = 13 415 | Caption = 'Verbs' 416 | Font.Charset = DEFAULT_CHARSET 417 | Font.Color = clWindowText 418 | Font.Height = -11 419 | Font.Name = 'Segoe UI' 420 | Font.Style = [fsBold] 421 | ParentFont = False 422 | end 423 | object Label1: TLabel 424 | Left = 175 425 | Top = 152 426 | Width = 34 427 | Height = 17 428 | Caption = 'Route' 429 | Font.Charset = DEFAULT_CHARSET 430 | Font.Color = clWindowText 431 | Font.Height = -13 432 | Font.Name = 'Segoe UI' 433 | Font.Style = [] 434 | ParentFont = False 435 | end 436 | object edtControllerName: TEdit 437 | Left = 16 438 | Top = 172 439 | Width = 153 440 | Height = 25 441 | TabOrder = 0 442 | OnChange = edtControllerNameChange 443 | end 444 | object Button2: TButton 445 | Left = 8 446 | Top = 350 447 | Width = 109 448 | Height = 37 449 | Anchors = [akLeft, akBottom] 450 | Caption = 'DONE' 451 | Default = True 452 | ModalResult = 1 453 | TabOrder = 7 454 | end 455 | object Button1: TButton 456 | Left = 123 457 | Top = 350 458 | Width = 109 459 | Height = 37 460 | Anchors = [akLeft, akBottom] 461 | Caption = 'CANCEL' 462 | ModalResult = 2 463 | TabOrder = 8 464 | end 465 | object chkGET: TCheckBox 466 | Left = 16 467 | Top = 222 468 | Width = 171 469 | Height = 17 470 | Anchors = [akLeft, akTop, akRight] 471 | Caption = 'GET' 472 | Checked = True 473 | Font.Charset = DEFAULT_CHARSET 474 | Font.Color = clWindowText 475 | Font.Height = -11 476 | Font.Name = 'Segoe UI' 477 | Font.Style = [] 478 | ParentFont = False 479 | State = cbChecked 480 | TabOrder = 2 481 | end 482 | object chkGETID: TCheckBox 483 | Left = 16 484 | Top = 245 485 | Width = 171 486 | Height = 17 487 | Anchors = [akLeft, akTop, akRight] 488 | Caption = 'GET BY ID' 489 | Checked = True 490 | Font.Charset = DEFAULT_CHARSET 491 | Font.Color = clWindowText 492 | Font.Height = -11 493 | Font.Name = 'Segoe UI' 494 | Font.Style = [] 495 | ParentFont = False 496 | State = cbChecked 497 | TabOrder = 3 498 | end 499 | object chkPOST: TCheckBox 500 | Left = 16 501 | Top = 267 502 | Width = 171 503 | Height = 17 504 | Anchors = [akLeft, akTop, akRight] 505 | Caption = 'POST' 506 | Checked = True 507 | Font.Charset = DEFAULT_CHARSET 508 | Font.Color = clWindowText 509 | Font.Height = -11 510 | Font.Name = 'Segoe UI' 511 | Font.Style = [] 512 | ParentFont = False 513 | State = cbChecked 514 | TabOrder = 4 515 | end 516 | object chkPUT: TCheckBox 517 | Left = 16 518 | Top = 290 519 | Width = 171 520 | Height = 17 521 | Anchors = [akLeft, akTop, akRight] 522 | Caption = 'PUT' 523 | Checked = True 524 | Font.Charset = DEFAULT_CHARSET 525 | Font.Color = clWindowText 526 | Font.Height = -11 527 | Font.Name = 'Segoe UI' 528 | Font.Style = [] 529 | ParentFont = False 530 | State = cbChecked 531 | TabOrder = 5 532 | end 533 | object chkDELETE: TCheckBox 534 | Left = 16 535 | Top = 314 536 | Width = 171 537 | Height = 17 538 | Anchors = [akLeft, akTop, akRight] 539 | Caption = 'DELETE' 540 | Checked = True 541 | Font.Charset = DEFAULT_CHARSET 542 | Font.Color = clWindowText 543 | Font.Height = -11 544 | Font.Name = 'Segoe UI' 545 | Font.Style = [] 546 | ParentFont = False 547 | State = cbChecked 548 | TabOrder = 6 549 | end 550 | object edtRoute: TEdit 551 | Left = 175 552 | Top = 172 553 | Width = 255 554 | Height = 25 555 | TabOrder = 1 556 | end 557 | end 558 | -------------------------------------------------------------------------------- /src/Horse.NewController.View.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController.View; 2 | 3 | interface 4 | 5 | uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, 6 | Vcl.Dialogs, Vcl.Imaging.pngimage, Vcl.ExtCtrls, Vcl.StdCtrls, Horse.NewController.Model; 7 | 8 | type 9 | THorseViewsNewController = class(TForm) 10 | imgHeader: TImage; 11 | Label3: TLabel; 12 | edtControllerName: TEdit; 13 | Button2: TButton; 14 | Button1: TButton; 15 | lblMiddlewares: TLabel; 16 | chkGET: TCheckBox; 17 | chkGETID: TCheckBox; 18 | chkPOST: TCheckBox; 19 | chkPUT: TCheckBox; 20 | chkDELETE: TCheckBox; 21 | edtRoute: TEdit; 22 | Label1: TLabel; 23 | procedure edtControllerNameChange(Sender: TObject); 24 | public 25 | { Public declarations } 26 | function GetController: THorseNewControllerModel; 27 | end; 28 | 29 | var 30 | HorseViewsNewController: THorseViewsNewController; 31 | 32 | implementation 33 | 34 | {$R *.dfm} 35 | 36 | { THorseViewsNewController } 37 | 38 | procedure THorseViewsNewController.edtControllerNameChange(Sender: TObject); 39 | begin 40 | edtRoute.Text := edtControllerName.Text; 41 | end; 42 | 43 | function THorseViewsNewController.GetController: THorseNewControllerModel; 44 | begin 45 | Result := THorseNewControllerModel.Create; 46 | try 47 | Result.ControllerName := edtControllerName.Text; 48 | Result.Route := edtRoute.Text; 49 | Result.Get := chkGET.Checked; 50 | Result.GetById := chkGETID.Checked; 51 | Result.Post := chkPOST.Checked; 52 | Result.Delete := chkDELETE.Checked; 53 | Result.Put := chkPUT.Checked; 54 | except 55 | Result.Free; 56 | raise; 57 | end; 58 | end; 59 | 60 | end. 61 | -------------------------------------------------------------------------------- /src/Horse.NewController.Wizard.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController.Wizard; 2 | 3 | interface 4 | 5 | uses Horse.NewController, System.SysUtils, System.Classes, ToolsAPI, Winapi.Windows; 6 | 7 | type 8 | THorseNewControllerWizard = class(TNotifierObject, IOTAWizard, IOTAProjectWizard, IOTARepositoryWizard) 9 | protected 10 | // IOTAWizard 11 | function GetIDString: string; 12 | function GetName: string; 13 | function GetState: TWizardState; 14 | procedure Execute; 15 | 16 | // IOTARepositoryWizard 17 | function GetAuthor: string; 18 | function GetComment: string; 19 | function GetPage: string; 20 | function GetGlyph: Cardinal; 21 | public 22 | class function New: IOTAWizard; 23 | end; 24 | 25 | implementation 26 | 27 | { THorseNewControllerWizard } 28 | 29 | procedure THorseNewControllerWizard.Execute; 30 | begin 31 | THorseNewController.CreateController; 32 | end; 33 | 34 | function THorseNewControllerWizard.GetAuthor: string; 35 | begin 36 | Result := 'Horse - https://github.com/HashLoad/horse'; 37 | end; 38 | 39 | function THorseNewControllerWizard.GetComment: string; 40 | begin 41 | Result := 'Create a new Horse Controller'; 42 | end; 43 | 44 | function THorseNewControllerWizard.GetGlyph: Cardinal; 45 | begin 46 | Result := LoadIcon(HInstance, 'HashloadIcon'); 47 | end; 48 | 49 | function THorseNewControllerWizard.GetIDString: string; 50 | begin 51 | Result := Self.ClassName; 52 | end; 53 | 54 | function THorseNewControllerWizard.GetName: string; 55 | begin 56 | Result := 'Horse Controller'; 57 | end; 58 | 59 | function THorseNewControllerWizard.GetPage: string; 60 | begin 61 | Result := 'Horse'; 62 | end; 63 | 64 | function THorseNewControllerWizard.GetState: TWizardState; 65 | begin 66 | Result := [wsEnabled]; 67 | end; 68 | 69 | class function THorseNewControllerWizard.New: IOTAWizard; 70 | begin 71 | Result := Self.Create; 72 | end; 73 | 74 | end. 75 | -------------------------------------------------------------------------------- /src/Horse.NewController.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewController; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.Wizard.Utils, Horse.NewController.Model, Horse.NewController.View, Horse.NewController.Creator, 6 | System.Classes, System.SysUtils, Vcl.Controls; 7 | 8 | type 9 | THorseNewController = class 10 | private 11 | class procedure RegisterController(const AController: THorseNewControllerModel; const AModule: IOTAModule); 12 | public 13 | class procedure CreateController; 14 | end; 15 | 16 | implementation 17 | 18 | class procedure THorseNewController.CreateController; 19 | var 20 | LForm: THorseViewsNewController; 21 | LController: THorseNewControllerModel; 22 | LCreator: IOTACreator; 23 | LModule: IOTAModule; 24 | begin 25 | LForm := THorseViewsNewController.Create(nil); 26 | try 27 | LForm.ShowModal; 28 | if LForm.ModalResult = mrOK then 29 | begin 30 | LController := LForm.GetController; 31 | try 32 | LCreator := THorseNewControllerCreator.New(LController); 33 | LModule := (BorlandIDEServices as IOTAModuleServices).CreateModule(LCreator); 34 | 35 | LModule.FileName := Format('%sControllers.%s.pas', 36 | [ExtractFilePath(GetActiveProject.FileName), 37 | LController.ControllerName]); 38 | 39 | if LModule.Save(True, True) then 40 | RegisterController(LController, LModule); 41 | finally 42 | LController.Free; 43 | end; 44 | end; 45 | finally 46 | LForm.Free; 47 | end; 48 | end; 49 | 50 | class procedure THorseNewController.RegisterController(const AController: THorseNewControllerModel; const AModule: IOTAModule); 51 | var 52 | LEditorList: TStringList; 53 | I: Integer; 54 | LListenPosition: Integer; 55 | LEditView: IOTAEditView; 56 | LUnitName: String; 57 | begin 58 | LListenPosition := 0; 59 | GetActiveProject.ShowFilename(GetActiveProject.FileName); 60 | LUnitName := ChangeFileExt(ExtractFileName(AModule.FileName), EmptyStr); 61 | 62 | LEditorList := EditorAsStringList; 63 | try 64 | LEditView := (BorlandIDEServices as IOTAEditorServices).TopView; 65 | for I := 0 to Pred(LEditorList.Count) do 66 | begin 67 | if LEditorList[I].Trim.ToLower.StartsWith('thorse.listen') then 68 | begin 69 | LListenPosition := I; 70 | Break; 71 | end; 72 | end; 73 | 74 | if LListenPosition > 0 then 75 | begin 76 | LEditView.Buffer.EditPosition.GotoLine(LListenPosition + 1); 77 | LEditView.Buffer.EditPosition.Tab(1); 78 | LEditView.Buffer.EditPosition.InsertText(LUnitName + '.Registry;' + Chr(13)); 79 | end; 80 | 81 | AModule.Show; 82 | finally 83 | LEditorList.Free; 84 | end; 85 | end; 86 | 87 | end. 88 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.Apache.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.Apache; 2 | 3 | interface 4 | 5 | uses Horse.NewProject.Creator, Horse.Wizard.Types, System.SysUtils, DCCStrs, ToolsAPI; 6 | 7 | type 8 | THorseNewProjectCreatorApache = class(THorseNewProjectCreator, IOTACreator, 9 | IOTAProjectCreator80, 10 | IOTAProjectCreator160, 11 | {$IF CompilerVersion >= 32.0} 12 | IOTAProjectCreator190, 13 | {$ENDIF} 14 | IOTAProjectCreator) 15 | protected 16 | procedure SetInitialOptions(const ANewProject: IOTAProject); override; 17 | end; 18 | 19 | implementation 20 | 21 | { THorseNewProjectCreatorApache } 22 | 23 | procedure THorseNewProjectCreatorApache.SetInitialOptions(const ANewProject: IOTAProject); 24 | var 25 | LBuild: IOTABuildConfiguration; 26 | begin 27 | inherited; 28 | if FPlatform = hpLinux64 then 29 | begin 30 | LBuild := (ANewProject.ProjectOptions as IOTAProjectOptionsConfigurations).BaseConfiguration; 31 | LBuild.SetValue('DCC_AllowUndefined', 'true'); 32 | end; 33 | end; 34 | 35 | end. 36 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.Vcl.NewForm.Main.Templates.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.Vcl.NewForm.Main.Templates; 2 | 3 | interface 4 | 5 | resourcestring 6 | sHorseVCLMainFormPAS = 7 | 'unit %0:s;' + sLineBreak + 8 | '' + sLineBreak + 9 | 'interface' + sLineBreak + 10 | '' + sLineBreak + 11 | 'uses' + sLineBreak + 12 | ' Winapi.Windows,' + sLineBreak + 13 | ' System.Variants,' + sLineBreak + 14 | ' System.Classes,' + sLineBreak + 15 | ' System.SysUtils,' + sLineBreak + 16 | ' Vcl.Graphics,' + sLineBreak + 17 | ' Vcl.Controls,' + sLineBreak + 18 | ' Vcl.Forms,' + sLineBreak + 19 | ' Vcl.Dialogs,' + sLineBreak + 20 | ' Vcl.StdCtrls,' + sLineBreak + 21 | ' Vcl.Buttons;' + sLineBreak + 22 | '' + sLineBreak + 23 | 'type' + sLineBreak + 24 | ' TFrmMain = class(TForm)' + sLineBreak + 25 | ' btnStop: TBitBtn;' + sLineBreak + 26 | ' btnStart: TBitBtn;' + sLineBreak + 27 | ' Label1: TLabel;' + sLineBreak + 28 | ' edtPort: TEdit;' + sLineBreak + 29 | ' procedure btnStopClick(Sender: TObject);' + sLineBreak + 30 | ' procedure FormClose(Sender: TObject; var Action: TCloseAction);' + sLineBreak + 31 | ' procedure btnStartClick(Sender: TObject);' + sLineBreak + 32 | ' private' + sLineBreak + 33 | ' procedure Status;' + sLineBreak + 34 | ' procedure Start;' + sLineBreak + 35 | ' procedure Stop;' + sLineBreak + 36 | ' end;' + sLineBreak + 37 | '' + sLineBreak + 38 | 'var' + sLineBreak + 39 | ' FrmMain: TFrmMain;' + sLineBreak + 40 | '' + sLineBreak + 41 | 'implementation' + sLineBreak + 42 | '' + sLineBreak + 43 | 'uses Horse;' + sLineBreak + 44 | '' + sLineBreak + 45 | '{$R *.dfm}' + sLineBreak + 46 | '' + sLineBreak + 47 | 'procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);' + sLineBreak + 48 | 'begin' + sLineBreak + 49 | ' if THorse.IsRunning then' + sLineBreak + 50 | ' Stop;' + sLineBreak + 51 | 'end;' + sLineBreak + 52 | '' + sLineBreak + 53 | 'procedure TFrmMain.Start;' + sLineBreak + 54 | 'begin' + sLineBreak + 55 | ' THorse.Get(''ping'',' + sLineBreak + 56 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 57 | ' begin' + sLineBreak + 58 | ' Res.Send(''pong'');' + sLineBreak + 59 | ' end);' + sLineBreak + 60 | '' + sLineBreak + 61 | ' THorse.Listen(StrToInt(edtPort.Text));' + sLineBreak + 62 | 'end;' + sLineBreak + 63 | '' + sLineBreak + 64 | 'procedure TFrmMain.Status;' + sLineBreak + 65 | 'begin' + sLineBreak + 66 | ' btnStop.Enabled := THorse.IsRunning;' + sLineBreak + 67 | ' btnStart.Enabled := not THorse.IsRunning;' + sLineBreak + 68 | ' edtPort.Enabled := not THorse.IsRunning;' + sLineBreak + 69 | 'end;' + sLineBreak + 70 | '' + sLineBreak + 71 | 'procedure TFrmMain.Stop;' + sLineBreak + 72 | 'begin' + sLineBreak + 73 | ' THorse.StopListen;' + sLineBreak + 74 | 'end;' + sLineBreak + 75 | '' + sLineBreak + 76 | 'procedure TFrmMain.btnStartClick(Sender: TObject);' + sLineBreak + 77 | 'begin' + sLineBreak + 78 | ' Start;' + sLineBreak + 79 | ' Status;' + sLineBreak + 80 | 'end;' + sLineBreak + 81 | '' + sLineBreak + 82 | 'procedure TFrmMain.btnStopClick(Sender: TObject);' + sLineBreak + 83 | 'begin' + sLineBreak + 84 | ' Stop;' + sLineBreak + 85 | ' Status;' + sLineBreak + 86 | 'end;' + sLineBreak + 87 | '' + sLineBreak + 88 | 'end.'; 89 | 90 | sHorseVCLMainFormDFM = 91 | 'object FrmMain: TFrmMain' + sLineBreak + 92 | ' Left = 0' + sLineBreak + 93 | ' Top = 0' + sLineBreak + 94 | ' BorderIcons = [biSystemMenu]' + sLineBreak + 95 | ' BorderStyle = bsSingle' + sLineBreak + 96 | ' Caption = ''Main'' ' + sLineBreak + 97 | ' ClientHeight = 82' + sLineBreak + 98 | ' ClientWidth = 201' + sLineBreak + 99 | ' Color = clBtnFace' + sLineBreak + 100 | ' Font.Charset = DEFAULT_CHARSET' + sLineBreak + 101 | ' Font.Color = clWindowText' + sLineBreak + 102 | ' Font.Height = -11' + sLineBreak + 103 | ' Font.Name = ''Tahoma'' ' + sLineBreak + 104 | ' Font.Style = []' + sLineBreak + 105 | ' OldCreateOrder = False' + sLineBreak + 106 | ' Position = poScreenCenter' + sLineBreak + 107 | ' OnClose = FormClose' + sLineBreak + 108 | ' PixelsPerInch = 96' + sLineBreak + 109 | ' TextHeight = 13' + sLineBreak + 110 | ' object Label1: TLabel' + sLineBreak + 111 | ' Left = 8' + sLineBreak + 112 | ' Top = 19' + sLineBreak + 113 | ' Width = 24' + sLineBreak + 114 | ' Height = 13' + sLineBreak + 115 | ' Caption = ''Port:'' ' + sLineBreak + 116 | ' end' + sLineBreak + 117 | ' object btnStop: TBitBtn' + sLineBreak + 118 | ' Left = 104' + sLineBreak + 119 | ' Top = 50' + sLineBreak + 120 | ' Width = 90' + sLineBreak + 121 | ' Height = 25' + sLineBreak + 122 | ' Caption = ''Stop'' ' + sLineBreak + 123 | ' Enabled = False' + sLineBreak + 124 | ' TabOrder = 0' + sLineBreak + 125 | ' OnClick = btnStopClick' + sLineBreak + 126 | ' end' + sLineBreak + 127 | ' object btnStart: TBitBtn' + sLineBreak + 128 | ' Left = 8' + sLineBreak + 129 | ' Top = 50' + sLineBreak + 130 | ' Width = 90' + sLineBreak + 131 | ' Height = 25' + sLineBreak + 132 | ' Caption = ''Start'' ' + sLineBreak + 133 | ' TabOrder = 1' + sLineBreak + 134 | ' OnClick = btnStartClick' + sLineBreak + 135 | ' end' + sLineBreak + 136 | ' object edtPort: TEdit' + sLineBreak + 137 | ' Left = 38' + sLineBreak + 138 | ' Top = 16' + sLineBreak + 139 | ' Width = 156' + sLineBreak + 140 | ' Height = 21' + sLineBreak + 141 | ' NumbersOnly = True' + sLineBreak + 142 | ' TabOrder = 2' + sLineBreak + 143 | ' Text = ''%0:s'' ' + sLineBreak + 144 | ' end' + sLineBreak + 145 | 'end'; 146 | 147 | implementation 148 | 149 | end. 150 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.Vcl.NewForm.Main.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.Vcl.NewForm.Main; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.CodeGen.SourceFile, Horse.NewProject.Creator.Vcl.NewForm.Main.Templates, System.SysUtils; 6 | 7 | type 8 | THorseNewProjectVclNewFormMain = class(TNotifierObject, IOTACreator, IOTAModuleCreator) 9 | protected 10 | FPort: Integer; 11 | function GetCreatorType: string; 12 | function GetExisting: Boolean; 13 | function GetFileSystem: string; 14 | function GetOwner: IOTAModule; 15 | function GetUnnamed: Boolean; 16 | function GetAncestorName: string; 17 | { Return the implementation filename, or blank to have the IDE create a new 18 | unique one. (C++ .cpp file or Delphi unit) NOTE: If a value is returned then it *must* be a 19 | fully qualified filename. This also applies to GetIntfFileName and 20 | GetAdditionalFileName on the IOTAAdditionalFilesModuleCreator interface. } 21 | function GetImplFileName: string; 22 | { Return the interface filename, or blank to have the IDE create a new 23 | unique one. (C++ header) } 24 | function GetIntfFileName: string; 25 | { Return the form name } 26 | function GetFormName: string; 27 | { Return True to Make this module the main form of the given Owner/Project } 28 | function GetMainForm: Boolean; 29 | { Return True to show the form } 30 | function GetShowForm: Boolean; 31 | { Return True to show the source } 32 | function GetShowSource: Boolean; 33 | { Create and return the Form resource for this new module if applicable } 34 | function NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 35 | { Create and return the Implementation source for this module. (C++ .cpp 36 | file or Delphi unit) } 37 | function NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 38 | { Create and return the Interface (C++ header) source for this module } 39 | function NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 40 | { Called when the new form/datamodule/custom module is created } 41 | procedure FormCreated(const AFormEditor: IOTAFormEditor); 42 | public 43 | constructor Create(const APort: Integer); 44 | class function New(const APort: Integer): IOTACreator; 45 | end; 46 | 47 | implementation 48 | 49 | { THorseNewProjectVclNewFormMain } 50 | 51 | constructor THorseNewProjectVclNewFormMain.create(const APort: Integer); 52 | begin 53 | FPort := APort; 54 | (BorlandIDEServices as IOTAModuleServices).CreateModule(Self); 55 | end; 56 | 57 | procedure THorseNewProjectVclNewFormMain.FormCreated(const AFormEditor: IOTAFormEditor); 58 | begin 59 | 60 | end; 61 | 62 | function THorseNewProjectVclNewFormMain.GetAncestorName: string; 63 | begin 64 | Result := 'TForm'; 65 | end; 66 | 67 | function THorseNewProjectVclNewFormMain.GetCreatorType: string; 68 | begin 69 | Result := sForm; 70 | end; 71 | 72 | function THorseNewProjectVclNewFormMain.GetExisting: Boolean; 73 | begin 74 | Result := False; 75 | end; 76 | 77 | function THorseNewProjectVclNewFormMain.GetFileSystem: string; 78 | begin 79 | Result := EmptyStr; 80 | end; 81 | 82 | function THorseNewProjectVclNewFormMain.GetFormName: string; 83 | begin 84 | Result := EmptyStr; 85 | end; 86 | 87 | function THorseNewProjectVclNewFormMain.GetImplFileName: string; 88 | begin 89 | Result := EmptyStr; 90 | end; 91 | 92 | function THorseNewProjectVclNewFormMain.GetIntfFileName: string; 93 | begin 94 | Result := EmptyStr; 95 | end; 96 | 97 | function THorseNewProjectVclNewFormMain.GetMainForm: Boolean; 98 | begin 99 | Result := True; 100 | end; 101 | 102 | function THorseNewProjectVclNewFormMain.GetOwner: IOTAModule; 103 | begin 104 | Result := GetActiveProject; 105 | end; 106 | 107 | function THorseNewProjectVclNewFormMain.GetShowForm: Boolean; 108 | begin 109 | Result := True; 110 | end; 111 | 112 | function THorseNewProjectVclNewFormMain.GetShowSource: Boolean; 113 | begin 114 | Result := True; 115 | end; 116 | 117 | function THorseNewProjectVclNewFormMain.GetUnnamed: Boolean; 118 | begin 119 | Result := True; 120 | end; 121 | 122 | class function THorseNewProjectVclNewFormMain.New(const APort: Integer): IOTACreator; 123 | begin 124 | Result := Self.create(APort); 125 | end; 126 | 127 | function THorseNewProjectVclNewFormMain.NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 128 | begin 129 | Result := TSourceFile.Create(sHorseVCLMainFormDFM, [FPort.ToString]); 130 | end; 131 | 132 | function THorseNewProjectVclNewFormMain.NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 133 | begin 134 | Result := TSourceFile.Create(sHorseVCLMainFormPAS, [AModuleIdent]); 135 | end; 136 | 137 | function THorseNewProjectVclNewFormMain.NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 138 | begin 139 | Result := nil; 140 | end; 141 | 142 | end. 143 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.Vcl.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.Vcl; 2 | 3 | interface 4 | 5 | uses Horse.NewProject.Creator, Horse.NewProject.Creator.Vcl.NewForm.Main, ToolsAPI; 6 | 7 | type 8 | THorseNewProjectCreatorVcl = class(THorseNewProjectCreator, IOTACreator, 9 | IOTAProjectCreator80, 10 | IOTAProjectCreator160, 11 | {$IF CompilerVersion >= 32.0} 12 | IOTAProjectCreator190, 13 | {$ENDIF} 14 | IOTAProjectCreator) 15 | protected 16 | procedure SetInitialOptions(const ANewProject: IOTAProject); override; 17 | end; 18 | 19 | implementation 20 | 21 | { THorseNewProjectCreatorVcl } 22 | 23 | procedure THorseNewProjectCreatorVcl.SetInitialOptions(const ANewProject: IOTAProject); 24 | begin 25 | inherited; 26 | THorseNewProjectVclNewFormMain.New(FPort); 27 | end; 28 | 29 | end. 30 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates; 2 | 3 | interface 4 | 5 | resourcestring 6 | sHorseWinSvcMainFormPAS = 7 | 'unit %0:s;' + sLineBreak + 8 | '' + sLineBreak + 9 | 'interface' + sLineBreak + 10 | '' + sLineBreak + 11 | 'uses' + sLineBreak + 12 | ' Winapi.Windows,' + sLineBreak + 13 | ' Winapi.Messages,' + sLineBreak + 14 | ' System.SysUtils,' + sLineBreak + 15 | ' System.Classes,' + sLineBreak + 16 | ' Vcl.Graphics,' + sLineBreak + 17 | ' Vcl.Controls,' + sLineBreak + 18 | ' Vcl.SvcMgr,' + sLineBreak + 19 | ' Vcl.Dialogs;' + sLineBreak + 20 | '' + sLineBreak + 21 | 'type' + sLineBreak + 22 | ' TMainService = class(TService)' + sLineBreak + 23 | ' procedure ServiceCreate(Sender: TObject);' + sLineBreak + 24 | ' procedure ServiceStart(Sender: TService; var Started: Boolean);' + sLineBreak + 25 | ' procedure ServiceStop(Sender: TService; var Stopped: Boolean);' + sLineBreak + 26 | ' public' + sLineBreak + 27 | ' function GetServiceController: TServiceController; override;' + sLineBreak + 28 | ' end;' + sLineBreak + 29 | '' + sLineBreak + 30 | 'var' + sLineBreak + 31 | ' MainService: TMainService;' + sLineBreak + 32 | '' + sLineBreak + 33 | 'implementation' + sLineBreak + 34 | '' + sLineBreak + 35 | 'uses' + sLineBreak + 36 | ' Horse;' + sLineBreak + 37 | '' + sLineBreak + 38 | '{$R *.dfm}' + sLineBreak + 39 | '' + sLineBreak + 40 | 'procedure ServiceController(CtrlCode: DWord); stdcall;' + sLineBreak + 41 | 'begin' + sLineBreak + 42 | ' MainService.Controller(CtrlCode);' + sLineBreak + 43 | 'end;' + sLineBreak + 44 | '' + sLineBreak + 45 | 'function TMainService.GetServiceController: TServiceController;' + sLineBreak + 46 | 'begin' + sLineBreak + 47 | ' Result := ServiceController;' + sLineBreak + 48 | 'end;' + sLineBreak + 49 | '' + sLineBreak + 50 | 'procedure TMainService.ServiceCreate(Sender: TObject);' + sLineBreak + 51 | 'begin' + sLineBreak + 52 | ' THorse.Get(''ping'',' + sLineBreak + 53 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 54 | ' begin' + sLineBreak + 55 | ' Res.Send(''pong'');' + sLineBreak + 56 | ' end);' + sLineBreak + 57 | 'end;' + sLineBreak + 58 | '' + sLineBreak + 59 | 'procedure TMainService.ServiceStart(Sender: TService; var Started: Boolean);' + sLineBreak + 60 | 'begin' + sLineBreak + 61 | ' THorse.Listen(%1:s);' + sLineBreak + 62 | ' Started := True;' + sLineBreak + 63 | 'end;' + sLineBreak + 64 | '' + sLineBreak + 65 | 'procedure TMainService.ServiceStop(Sender: TService; var Stopped: Boolean);' + sLineBreak + 66 | 'begin' + sLineBreak + 67 | ' THorse.StopListen;' + sLineBreak + 68 | ' Stopped := True;' + sLineBreak + 69 | 'end;' + sLineBreak + 70 | '' + sLineBreak + 71 | 'end.'; 72 | 73 | sHorseWinSvcMainFormDFM = 74 | 'object MainService: TMainService' + sLineBreak + 75 | ' OldCreateOrder = False' + sLineBreak + 76 | ' OnCreate = ServiceCreate' + sLineBreak + 77 | ' DisplayName = ''MainService'' ' + sLineBreak + 78 | ' StartType = stManual' + sLineBreak + 79 | ' OnStart = ServiceStart' + sLineBreak + 80 | ' OnStop = ServiceStop' + sLineBreak + 81 | ' Height = 150' + sLineBreak + 82 | ' Width = 215' + sLineBreak + 83 | 'end'; 84 | 85 | implementation 86 | 87 | end. 88 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.WinSvc.NewForm.Main.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.WinSvc.NewForm.Main; 2 | 3 | interface 4 | 5 | uses ToolsAPI, Horse.CodeGen.SourceFile, Horse.NewProject.Creator.WinSvc.NewForm.Main.Templates, System.SysUtils; 6 | 7 | type 8 | THorseNewProjectWinSvcNewFormMain = class(TNotifierObject, IOTACreator, IOTAModuleCreator) 9 | protected 10 | FPort: Integer; 11 | function GetCreatorType: string; 12 | function GetExisting: Boolean; 13 | function GetFileSystem: string; 14 | function GetOwner: IOTAModule; 15 | function GetUnnamed: Boolean; 16 | function GetAncestorName: string; 17 | { Return the implementation filename, or blank to have the IDE create a new 18 | unique one. (C++ .cpp file or Delphi unit) NOTE: If a value is returned then it *must* be a 19 | fully qualified filename. This also applies to GetIntfFileName and 20 | GetAdditionalFileName on the IOTAAdditionalFilesModuleCreator interface. } 21 | function GetImplFileName: string; 22 | { Return the interface filename, or blank to have the IDE create a new 23 | unique one. (C++ header) } 24 | function GetIntfFileName: string; 25 | { Return the form name } 26 | function GetFormName: string; 27 | { Return True to Make this module the main form of the given Owner/Project } 28 | function GetMainForm: Boolean; 29 | { Return True to show the form } 30 | function GetShowForm: Boolean; 31 | { Return True to show the source } 32 | function GetShowSource: Boolean; 33 | { Create and return the Form resource for this new module if applicable } 34 | function NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 35 | { Create and return the Implementation source for this module. (C++ .cpp 36 | file or Delphi unit) } 37 | function NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 38 | { Create and return the Interface (C++ header) source for this module } 39 | function NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 40 | { Called when the new form/datamodule/custom module is created } 41 | procedure FormCreated(const AFormEditor: IOTAFormEditor); 42 | public 43 | constructor Create(const APort: Integer); 44 | class function New(const APort: Integer): IOTACreator; 45 | end; 46 | 47 | implementation 48 | 49 | { THorseNewProjectWinSvcNewFormMain } 50 | 51 | constructor THorseNewProjectWinSvcNewFormMain.Create(const APort: Integer); 52 | begin 53 | FPort := APort; 54 | (BorlandIDEServices as IOTAModuleServices).CreateModule(Self); 55 | end; 56 | 57 | procedure THorseNewProjectWinSvcNewFormMain.FormCreated(const AFormEditor: IOTAFormEditor); 58 | begin 59 | 60 | end; 61 | 62 | function THorseNewProjectWinSvcNewFormMain.GetAncestorName: string; 63 | begin 64 | Result := 'TForm'; 65 | end; 66 | 67 | function THorseNewProjectWinSvcNewFormMain.GetCreatorType: string; 68 | begin 69 | Result := sForm; 70 | end; 71 | 72 | function THorseNewProjectWinSvcNewFormMain.GetExisting: Boolean; 73 | begin 74 | Result := False; 75 | end; 76 | 77 | function THorseNewProjectWinSvcNewFormMain.GetFileSystem: string; 78 | begin 79 | Result := EmptyStr; 80 | end; 81 | 82 | function THorseNewProjectWinSvcNewFormMain.GetFormName: string; 83 | begin 84 | Result := EmptyStr; 85 | end; 86 | 87 | function THorseNewProjectWinSvcNewFormMain.GetImplFileName: string; 88 | begin 89 | Result := EmptyStr; 90 | end; 91 | 92 | function THorseNewProjectWinSvcNewFormMain.GetIntfFileName: string; 93 | begin 94 | Result := EmptyStr; 95 | end; 96 | 97 | function THorseNewProjectWinSvcNewFormMain.GetMainForm: Boolean; 98 | begin 99 | Result := True; 100 | end; 101 | 102 | function THorseNewProjectWinSvcNewFormMain.GetOwner: IOTAModule; 103 | begin 104 | Result := GetActiveProject; 105 | end; 106 | 107 | function THorseNewProjectWinSvcNewFormMain.GetShowForm: Boolean; 108 | begin 109 | Result := True; 110 | end; 111 | 112 | function THorseNewProjectWinSvcNewFormMain.GetShowSource: Boolean; 113 | begin 114 | Result := True; 115 | end; 116 | 117 | function THorseNewProjectWinSvcNewFormMain.GetUnnamed: Boolean; 118 | begin 119 | Result := True; 120 | end; 121 | 122 | class function THorseNewProjectWinSvcNewFormMain.New(const APort: Integer): IOTACreator; 123 | begin 124 | Result := Self.create(APort); 125 | end; 126 | 127 | function THorseNewProjectWinSvcNewFormMain.NewFormFile(const AFormIdent, AAncestorIdent: string): IOTAFile; 128 | begin 129 | Result := TSourceFile.Create(sHorseWinSvcMainFormDFM, []); 130 | end; 131 | 132 | function THorseNewProjectWinSvcNewFormMain.NewImplSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 133 | begin 134 | Result := TSourceFile.Create(sHorseWinSvcMainFormPAS, [AModuleIdent, FPort.ToString]); 135 | end; 136 | 137 | function THorseNewProjectWinSvcNewFormMain.NewIntfSource(const AModuleIdent, AFormIdent, AAncestorIdent: string): IOTAFile; 138 | begin 139 | Result := nil; 140 | end; 141 | 142 | end. 143 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.WinSvc.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator.WinSvc; 2 | 3 | interface 4 | 5 | uses Horse.NewProject.Creator, Horse.NewProject.Creator.WinSvc.NewForm.Main, ToolsAPI; 6 | 7 | type 8 | THorseNewProjectCreatorWinSvc = class(THorseNewProjectCreator, IOTACreator, 9 | IOTAProjectCreator80, 10 | IOTAProjectCreator160, 11 | {$IF CompilerVersion >= 32.0} 12 | IOTAProjectCreator190, 13 | {$ENDIF} 14 | IOTAProjectCreator) 15 | protected 16 | procedure SetInitialOptions(const ANewProject: IOTAProject); override; 17 | end; 18 | 19 | implementation 20 | 21 | { THorseNewProjectCreatorWinSvc } 22 | 23 | procedure THorseNewProjectCreatorWinSvc.SetInitialOptions(const ANewProject: IOTAProject); 24 | begin 25 | inherited; 26 | THorseNewProjectWinSvcNewFormMain.New(FPort); 27 | end; 28 | 29 | end. 30 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Creator.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Creator; 2 | 3 | interface 4 | 5 | uses DCCStrs, Horse.Wizard.Types, Horse.CodeGen.SourceFile, ToolsAPI, System.SysUtils; 6 | 7 | type 8 | THorseNewProjectCreator = class(TNotifierObject, IOTACreator, 9 | IOTAProjectCreator80, 10 | IOTAProjectCreator160, 11 | {$IF CompilerVersion >= 32.0} 12 | IOTAProjectCreator190, 13 | {$ENDIF} 14 | IOTAProjectCreator) 15 | protected 16 | FPlatform: THorsePlatform; 17 | FFramework: THorseFramework; 18 | FPort: Integer; 19 | 20 | // IOTACreator 21 | function GetCreatorType: string; 22 | function GetExisting: Boolean; 23 | function GetFileSystem: string; 24 | function GetOwner: IOTAModule; 25 | function GetUnnamed: Boolean; 26 | 27 | // IOTAProjectCreator 28 | function GetFileName: string; 29 | function GetOptionFileName: string; 30 | function GetShowSource: Boolean; 31 | procedure NewDefaultModule; 32 | function NewOptionSource(const AProjectName: string): IOTAFile; 33 | procedure NewProjectResource(const AProject: IOTAProject); 34 | procedure NewDefaultProjectModule(const AProject: IOTAProject); 35 | 36 | { Create and return the Project source file } 37 | function NewProjectSource(const AProjectName: string): IOTAFile; 38 | 39 | function GetProjectPersonality: string; 40 | function GetFrameworkType: string; 41 | function GetPlatforms: TArray; 42 | function GetSupportedPlatforms: TArray; 43 | function GetPreferredPlatform: string; 44 | procedure SetInitialOptions(const ANewProject: IOTAProject); virtual; 45 | public 46 | constructor Create(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer); 47 | class function New(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer): IOTACreator; 48 | end; 49 | 50 | implementation 51 | 52 | { THorseNewProjectCreator } 53 | 54 | constructor THorseNewProjectCreator.Create(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer); 55 | begin 56 | FPlatform := APlatform; 57 | FFramework := AFramework; 58 | FPort := APort; 59 | end; 60 | 61 | function THorseNewProjectCreator.GetCreatorType: string; 62 | begin 63 | Result := FFramework.ProjectType; 64 | end; 65 | 66 | function THorseNewProjectCreator.GetExisting: Boolean; 67 | begin 68 | Result := False; 69 | end; 70 | 71 | function THorseNewProjectCreator.GetFileName: string; 72 | begin 73 | Result := EmptyStr; 74 | end; 75 | 76 | function THorseNewProjectCreator.GetFileSystem: string; 77 | begin 78 | Result := EmptyStr; 79 | end; 80 | 81 | function THorseNewProjectCreator.GetFrameworkType: string; 82 | begin 83 | Result := FFramework.ToString; 84 | end; 85 | 86 | function THorseNewProjectCreator.GetOptionFileName: string; 87 | begin 88 | Result := EmptyStr; 89 | end; 90 | 91 | function THorseNewProjectCreator.GetOwner: IOTAModule; 92 | begin 93 | Result := (BorlandIDEServices as IOTAModuleServices).MainProjectGroup; 94 | end; 95 | 96 | function THorseNewProjectCreator.GetPlatforms: TArray; 97 | begin 98 | Result := [GetPreferredPlatform]; 99 | end; 100 | 101 | function THorseNewProjectCreator.GetPreferredPlatform: string; 102 | begin 103 | Result := FPlatform.ToString; 104 | end; 105 | 106 | function THorseNewProjectCreator.GetProjectPersonality: string; 107 | begin 108 | Result := sDelphiPersonality; 109 | end; 110 | 111 | function THorseNewProjectCreator.GetShowSource: Boolean; 112 | begin 113 | Result := True; 114 | end; 115 | 116 | function THorseNewProjectCreator.GetSupportedPlatforms: TArray; 117 | begin 118 | Result := [GetPreferredPlatform]; 119 | end; 120 | 121 | function THorseNewProjectCreator.GetUnnamed: Boolean; 122 | begin 123 | Result := True; 124 | end; 125 | 126 | class function THorseNewProjectCreator.New(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer): IOTACreator; 127 | begin 128 | Result := Self.create(APlatform, AFramework, APort); 129 | end; 130 | 131 | procedure THorseNewProjectCreator.NewDefaultModule; 132 | begin 133 | 134 | end; 135 | 136 | procedure THorseNewProjectCreator.NewDefaultProjectModule(const AProject: IOTAProject); 137 | begin 138 | 139 | end; 140 | 141 | function THorseNewProjectCreator.NewOptionSource(const AProjectName: string): IOTAFile; 142 | begin 143 | Result := nil; 144 | end; 145 | 146 | procedure THorseNewProjectCreator.NewProjectResource(const AProject: IOTAProject); 147 | begin 148 | 149 | end; 150 | 151 | function THorseNewProjectCreator.NewProjectSource(const AProjectName: string): IOTAFile; 152 | begin 153 | Result := TSourceFile.Create(FFramework.DprContent, [AProjectName, FPort.ToString]); 154 | end; 155 | 156 | procedure THorseNewProjectCreator.SetInitialOptions(const ANewProject: IOTAProject); 157 | var 158 | LBuild: IOTABuildConfiguration; 159 | begin 160 | LBuild := (ANewProject.ProjectOptions as IOTAProjectOptionsConfigurations).BaseConfiguration; 161 | LBuild.SetValue(sDefine, FFramework.Define); 162 | end; 163 | 164 | end. 165 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Templates.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Templates; 2 | 3 | interface 4 | 5 | resourcestring 6 | sHorseDPRApache = 7 | 'library %0:s;' + sLineBreak + 8 | '' + sLineBreak + 9 | '(*' + sLineBreak + 10 | ' httpd.conf entries:' + sLineBreak + 11 | ' LoadModule apache_horse_module modules/%0:s.dll' + sLineBreak + 12 | ' ' + sLineBreak + 13 | ' SetHandler apache_horse_module-handle' + sLineBreak + 14 | ' ' + sLineBreak + 15 | ' To use the feature:' + sLineBreak + 16 | ' http://localhost/apache_horse/ping' + sLineBreak + 17 | ' These entries assume that the output directory for this project is the apache/modules directory.' + sLineBreak + 18 | ' httpd.conf entries should be different if the project is changed in these ways:' + sLineBreak + 19 | ' 1. The TApacheModuleData variable name is changed.' + sLineBreak + 20 | ' 2. The project is renamed.' + sLineBreak + 21 | ' 3. The output directory is not the apache/modules directory.' + sLineBreak + 22 | ' 4. The dynamic library extension depends on a platform. Use .dll on Windows and .so on Linux.' + sLineBreak + 23 | '*)' + sLineBreak + 24 | '' + sLineBreak + 25 | '// Declare exported variable so that Apache can access this module.' + sLineBreak + 26 | '' + sLineBreak + 27 | 'uses' + sLineBreak + 28 | ' Horse,' + sLineBreak + 29 | ' Web.HTTPD24Impl;' + sLineBreak + 30 | '' + sLineBreak + 31 | 'var' + sLineBreak + 32 | ' ApacheModuleData: TApacheModuleData;' + sLineBreak + 33 | '' + sLineBreak + 34 | 'exports' + sLineBreak + 35 | ' ApacheModuleData name ''apache_horse_module'';' + sLineBreak + 36 | '' + sLineBreak + 37 | 'begin' + sLineBreak + 38 | ' THorse.DefaultModule := @ApacheModuleData;' + sLineBreak + 39 | ' THorse.HandlerName := ''apache_horse_module-handle'';' + sLineBreak + 40 | '' + sLineBreak + 41 | ' THorse.Get(''/ping'',' + sLineBreak + 42 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 43 | ' begin' + sLineBreak + 44 | ' Res.Send(''pong'');' + sLineBreak + 45 | ' end);' + sLineBreak + 46 | '' + sLineBreak + 47 | ' THorse.Listen;' + sLineBreak + 48 | 'end.'; 49 | 50 | sHorseDPRCGI = 51 | 'program %0:s;' + sLineBreak + 52 | '' + sLineBreak + 53 | '{$APPTYPE CONSOLE}' + sLineBreak + 54 | '' + sLineBreak + 55 | 'uses' + sLineBreak + 56 | ' Horse;' + sLineBreak + 57 | '' + sLineBreak + 58 | 'begin' + sLineBreak + 59 | ' THorse.Get(''/ping'',' + sLineBreak + 60 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 61 | ' begin' + sLineBreak + 62 | ' Res.Send(''pong'');' + sLineBreak + 63 | ' end);' + sLineBreak + 64 | '' + sLineBreak + 65 | ' THorse.Listen;' + sLineBreak + 66 | 'end.'; 67 | 68 | sHorseDPRConsole = 69 | 'program %0:s;' + sLineBreak + 70 | '' + sLineBreak + 71 | '{$APPTYPE CONSOLE}' + sLineBreak + 72 | '' + sLineBreak + 73 | 'uses' + sLineBreak + 74 | ' Horse,' + sLineBreak + 75 | ' System.SysUtils;' + sLineBreak + 76 | '' + sLineBreak + 77 | 'begin' + sLineBreak + 78 | ' THorse.Get(''/ping'',' + sLineBreak + 79 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 80 | ' begin' + sLineBreak + 81 | ' Res.Send(''pong'');' + sLineBreak + 82 | ' end);' + sLineBreak + 83 | '' + sLineBreak + 84 | ' THorse.Listen(%1:s, ' + sLineBreak + 85 | ' procedure' + sLineBreak + 86 | ' begin' + sLineBreak + 87 | ' Writeln(''Server is runing on port '' + IntToStr(THorse.Port));' + sLineBreak + 88 | ' Readln;' + sLineBreak + 89 | ' end);' + sLineBreak + 90 | 'end.'; 91 | 92 | sHorseDPRISAPI = 93 | 'library %0:s;' + sLineBreak + 94 | '' + sLineBreak + 95 | 'uses' + sLineBreak + 96 | ' Horse;' + sLineBreak + 97 | '' + sLineBreak + 98 | 'begin' + sLineBreak + 99 | ' THorse.Get(''/ping'',' + sLineBreak + 100 | ' procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)' + sLineBreak + 101 | ' begin' + sLineBreak + 102 | ' Res.Send(''pong'');' + sLineBreak + 103 | ' end);' + sLineBreak + 104 | '' + sLineBreak + 105 | ' THorse.Listen;' + sLineBreak + 106 | 'end.'; 107 | 108 | sHorseDPRVCL = 109 | 'program %0:s;' + sLineBreak + 110 | '' + sLineBreak + 111 | 'uses' + sLineBreak + 112 | ' Vcl.Forms;' + sLineBreak + 113 | '' + sLineBreak + 114 | 'begin' + sLineBreak + 115 | ' Application.Initialize;' + sLineBreak + 116 | ' Application.MainFormOnTaskbar := True;' + sLineBreak + 117 | ' Application.Run;' + sLineBreak + 118 | 'end.'; 119 | 120 | sHorseDPRWinSvc = 121 | 'program %0:s;' + sLineBreak + 122 | '' + sLineBreak + 123 | 'uses' + sLineBreak + 124 | ' Vcl.Forms,' + sLineBreak + 125 | ' Vcl.SvcMgr;' + sLineBreak + 126 | '' + sLineBreak + 127 | 'begin' + sLineBreak + 128 | ' if not Application.DelayInitialize or Application.Installing then' + sLineBreak + 129 | ' Application.Initialize;' + sLineBreak + 130 | ' Application.Run;' + sLineBreak + 131 | 'end.'; 132 | 133 | implementation 134 | 135 | end. 136 | -------------------------------------------------------------------------------- /src/Horse.NewProject.View.dfm: -------------------------------------------------------------------------------- 1 | object HorseViewsNewProject: THorseViewsNewProject 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Horse - New Project' 6 | ClientHeight = 492 7 | ClientWidth = 501 8 | Color = clWhite 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -13 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | OldCreateOrder = True 15 | Position = poMainFormCenter 16 | OnCreate = FormCreate 17 | DesignSize = ( 18 | 501 19 | 492) 20 | PixelsPerInch = 96 21 | TextHeight = 17 22 | object imgHeader: TImage 23 | Left = 0 24 | Top = 0 25 | Width = 501 26 | Height = 134 27 | Align = alTop 28 | AutoSize = True 29 | Center = True 30 | Picture.Data = { 31 | 0954506E67496D61676589504E470D0A1A0A0000000D494844520000018E0000 32 | 00860806000000CA206DA5000000017352474200AECE1CE90000000467414D41 33 | 0000B18F0BFC6105000000097048597300000EC300000EC301C76FA86400002D 34 | 264944415478DAED9D0B541457BAEFFFE7E60AC7E0230F8DC90575A51317A883 35 | 8FC1233E2E3EC6D611CC04650811D00163448D30198C06C6070EF808243E0714 36 | ED8408477C8428912488493AA3C2324AA21395516125D3B9519848F44451192F 37 | 70987B773D1AFA51555DD574374ABEDF5A33C1EEEA5D55BB767DFFFDF8BE6FFF 38 | DBFF63802008822054F26F241C04411084164838088220084D9070100441109A 39 | 20E1200882203441C24110044168828483200882D0040907E126EA51FCFA22AC 40 | A9E4FE0E45E189040CD7F2F3EB657825D2800AEEEFE80C542D0AECEC1B220842 41 | 8484837013241C04D15521E120DC0409074174554838083741C241105D15120E 42 | C24D907010445785848370131E168ED65B30551A71E088119517EA616A103EEE 43 | 39A01F82C787237EA61EC39FECA6F29C13B0E3B3648478091FDFA82A43FE7B45 44 | 28AEB8853BDC07BD83B0257F15F48F393E3F7A3F82C14FF6C788C9633165FC58 45 | 040F78C4C17DD4E3FCA765D8673C818A33E6F3B132868DC2EC17231111D8CF33 46 | 8F8F201420E120DC84E784E3CEA5BD484E3D88CA06A502BB61F07309D8B2540F 47 | DF871C9DD31FE9073311F1D82D54EC4C4572513D9AAC0ED4E39DBF2C41B0584E 48 | D37725487D351F46C5F30BE85ECA44519C3FBC9DBC8F9EA32291B72E1683BB3B 49 | F75408C2159070106EC233C2D15465405462194CFCBFBAA1CFB8B148D04F80AE 50 | 37F7EF46D45D2847F1E1B3382F1A63EF71092859172A2D1E6DE7EC87157B3661 51 | C89144CCD97F8B2F77F8B489087E4A1CB1741F86E8E831E8C3FDDD508E9417B7 52 | E0C83DE1FCC1E1518898F0341E3797D9FC23AA4F9F42F1F12A360AF1C38A7DD9 53 | 88F6757C1F56E5B0322A0EED46C19916E11E9E0D475E6E3C867B75F633267EAE 54 | 9070106EC203C26169B4BBFB6345CE6A443FEB637F5C6B3D2A7252F14AF12DFE 55 | 9FBA05992899E3AF78CE88283D2A8B8CB811C88C742633D23DA42FB3AE2409D3 56 | 37D7B2BF1E415C4E0E9605FA408E3B75F5F0F2ED673FDAB8771A1B666561BF78 57 | 1FE9796CB463272E8D301D5A8BA83FD7F0A31FD97B20080F40C241B809F70BC7 58 | E58239887AB7115C0F3DFACDDD58112C6FB439F128FEA3F97AC4A9A8BE0AE7E4 59 | 18C0AEDBC0AE5B615AE8FCCE596C54C215198B124324744ED4D4E5C279887A9B 60 | 13351FC46DDD85652365EEA3B516FB1393B0E112F78F206C295D057D0F0D2722 61 | 081741C241B8094BE1E82052C2D1CC7AE9CF8BBDF421F1389A1B0E5F07C5349D 62 | D982F1AF95F33DF6C1BFCF46D16FFDAC0FB0120E1F24190A91E0A053DF261C18 63 | 831D475310A275EDA1B50A1B67A4A140E57DDC284BC5E4CC1AFEEFB0F442644D 64 | F251751A827025241C849B70B3705C3260D4E23279119082139BA94C6CB8BF83 65 | 1370ECCD50619DC28CA570A81C41DC39BE0EE3D69CE5FFF61E178B3D2B233158 66 | CB28E0DB7C4C9F5F823AB5F76171BC775C06CEBC446ECA84E721E120DC84A570 67 | F8212C2E102A4C7B3B774C282DAEE10DA49470DCF894F5BCD70B3DEFE8378BB0 68 | 22B89B8A421D4C9F5908876AA3CC4D81AD4AC29A2F84856B74F741C8CC582C54 69 | E3FE6B731F715B3FC0B2910E7E60296EE12938B3748CA4871641B813120EC24D 70 | B8778DA3EEE3D730FD2DC107292E87195C951DEFCAEDB3F07211F797C43A87C5 71 | 394352776247A8CA9889D65A1CD9BC0E691F5BBBEDF61C12848573631011AC43 72 | 4F191760CBA927CD488D9A08C2039070106EC2BDC2D1BEB6A04D38DA7FE742E1 73 | 1069BA761607F2F2B1EBD35A2170CF4C6F3F442F4E46D2347B01B1BC0FCD9070 74 | 109D040907E126DC2B1C963DF54E1F71D8D25C8FF39F1FC4AEBC13A8B8DED2F6 75 | 31B706529416099DC502BAE5C829FA8D42240DD5709E87BCD0B3879A293A8270 76 | 2D241C849B70B370B8798DA343C261799D67F2919A51D2160DEECBEEA584DD8B 77 | 795DC24A00D5AC7110C47D000907E126DC1CC761E15DE4BB201347D504C3597A 78 | 558D8CC7D1AD36AEAF6E100E9E7B55D8989086822BDC3FACF36039E51D46109D 79 | 0C0907E126DC2C1CAD3530C4A422FB1AFBDB3F1225B9B1D03DA45CA4651C87A4 80 | D8B84B3860392565334566198FA2F23E08A2B321E120DC84FB23C74D879210FE 81 | 672EDD473784A51B90354921F3AC55E4B84CCE280F0947D6079908B3C8AC6B19 82 | 011F929AEDD2F312843B20E120DC84077255594E0175D721697306128648E5AA 83 | BA858A9CE4F65C557119287A29D03EFEC15DC271F72C362E5E275CA75474B865 84 | AE2A3C8288D4D558364DDE855748E17E15DEE3021D46CB13843B20E120DC8487 85 | B2E3D6E463FEAB25382F66A71D3C250CB3F5CCA08A6B08FF55578E8FF79C6AF3 86 | 6E52971D57BD709C2F9887F5DF0C4388AE3F9E19C665B3F542DF813AF46DAEC5 87 | A51FEAF9ECBC078ACEE2B2280A728910B9ECB873979789C7B1EBECEB8F88B051 88 | 1831AC3D436E757535CE9D3C8B8A6F1BD1E44C9D12848B20E120DC84073772AA 89 | 33624D9A01C5DFB62814A8653F0E0DC2A1360EA37B3F36924847FA24F9329BBE 90 | 2BC38675BB1DDC87B93C56A747493888CE81848370139EDE01B011A6CA329B1D 91 | F8BAA1CFB3FD317ABC1E31615A7600D43055D56042E517A7F0F9C90A9CFBE12E 92 | 4CFC684084DBB96FD03308D18723624AFB2848F93E5A5077C988E20F8DA8F8FA 93 | 2A2EB7C58170F7F218460C0D41C884B1983A52612A8B20DC0C0907411004A109 94 | 120E8220084213241C04411084264838088220084D9070100441109A20E12008 95 | 82203441C24110044168828483200882D0040907411004A109120E8220084213 96 | 241C04411084264838088220084D9070100441109A20E1200882203441C24110 97 | 044168828483200882D0040907411004A109120E8220084213241C0441108426 98 | 4838088220084D9070100441109A20E1200882203441C24110F70BD7CBF04AE4 99 | 09E80F6622A26F675F0CE1143F9367E832E138BF7316E6EC57776C5CCE075816 100 | D8D9B7DE05A92BC1CB8BCB1196BB0911BE2E2EFAE3D7F0827102DEDF1A0E1717 101 | 4D9879D08C4EF3596C8CCC02D2F762D9C86E0F4ED9EE44F619B6A0727B2C9291 102 | 82634B82E0DDD9D7D9415C2B1C4DC9F8223EC8E1B15E3D7CE0FD5027DDF1D7DB 103 | F1CAB548EC08EDD74917E046AA0C084C2C738B300B1D8350149E48C0F0CEBE4F 104 | 17C389E2FE819B3ABF33F3A009077FBD062075A7EBDF277796EDF63A917A86F5 105 | 287E7D11D62001C7DE0C459F0E9F8895F787123CB3B573DE47D70A073250B5A8 106 | B3DF3E653823B1FEA1D71FACC6A8FAE6B811C72944E46522CCC586871F719CD4 107 | E3C3375CD1E8EF2F2AB7CF42C584FB6014FCA009073F2AC88177A6014943DC31 108 | E27053D9EEC4C1886343F7D5287A29B0E3238E56563FBF3A8BA99DD491FB9909 109 | 470B2A364761FFE007AC1743B8915AEC4F48425D120907E1023CF50CAF1C44D4 110 | DC9FB09284C30334D7A020311595B3483808910623D63CBF1D3DEF877537128E 111 | 071F0F3DC33BC7B3306ECDA39D36757C5F0847D3B51A7C5E79049F955E4065CD 112 | 2DDCE13EECFD088283F55890108B60B90770B716151FE5A3C0588D73DF36A289 113 | FBACBB0F060FD061C4E4B19831598FE14FB261EEDDB3C84EDD82822AF1185B82 114 | 5D35EF2870A3AA0CF9EF95A0E2423D4C0DE2350D0DC08CE805983DB29FCCFA4E 115 | 15364EDC0B1DD7E01E6B84A9F230761D32A2E28C757DC4CD9D8990013ED22796 116 | 6DB4526557E0CB8BF5B8714FBCBE5163313B261611431E91BEA7B2544C3E3651 117 | B19EEE5C2947F19E12947E7D1597AFB7B04FBA41E71F80901763B170923F7ACA 118 | AC6B716D67D74041CCA5CAE8F32CABBBC817103F2D107DE4D6C65A6FC1F4F529 119 | 947EC2EACCF6B731F1ECFC3AEBF3D795213975378C575AA4CB8B966ECBE6EB2B 120 | AE3409CF564D3B3573D7842345FB507C8CB5F32BEDD737F5F970243C17843E3F 121 | B9D6E8F0CFECFB58FE3EB8EBDE6FD887FD678467EEDDB71F42F4914898A3C7E0 122 | 1EE6F65385E243EFA3E048557BBB65ED223E3E1E61CF4AB539AE5DA50112A26B 123 | 796E73B9074E56E3B258DF3DD93B1A12168EDFCF9C00DFEED054B6657BB95155 124 | 0243FE617C2CBE2742B931581E15D4D6568467F63EF22B6A85F6AEE699B5B6A0 125 | EEDB13282F2DC7075FDB5EB775F956280887928DB4B319FCB9FA61484020A64C 126 | 0EC573C142FBAD2B4BC32BB9556DC7D8E229C7A3CE178EBA12CC89D90B4C0B43 127 | 0433F6C143FDD08BFB9CBD649F1DCEC786A29F303B278755864DC3BDC61E50BC 128 | 01E786EAB1ECB7133062900E7DBD80DBD7AA613255E1E35266400625E2D8AB63 129 | E0CD1AC19DBBCDEC474C409EDF02D3EF37618BDE62C4F190177AF670C13C6A6B 130 | 3D8C6FA522F9B837C2E22211333E10BADE3DD0D460C297274B905F7016B5C1F1 131 | 284C0D87CEEE65E15E94B5F0CEC9C633079390563B0C4931A1181D1000BF1EDC 132 | 7D9D45E5B1126CDC7F15BA056B9137C7DF7E9E545138D84BB87527744549D8F0 133 | A37CD92352B3254763CAC2D188CB856998FB36FB7DF43CC44D0EC488271FE585 134 | FDDC05230A728D38D7578F2D6F2D41C863726D67158E0E7C1FE1DB6E610AABBB 135 | 885F0660886D19431350B22E14BE762F6C0B2AB7C56249850E1173F5983152A8 136 | 77F6635CBF684476EE4154F8D9FCD6DC26589D25CF67A2FA462192865A14E9E5 137 | 839EDDADEFD1549285399BAB3184DDE382B05F6208FF6CABF1D97B6F63D3C74D 138 | 98BD95B5D391D2A2DE5465C0DCE565A8E5DBAB5E6CE737517BB10AA51FED45F1 139 | 8F1390BBAA3F76C5BB5838CA27A270F2292CCE6944C4E270CC1816C49E39AB97 140 | 2B5530E61B90FD4D00B2F23230E51ABBBE95E5E813168B68F1F971F756FED13E 141 | F977D09170B0F65232F72A92138DE8CBB58BF1FEAC53C73A4ECDCC385E38857D 142 | FB4A70A4598F4203EB354BBE0FF2C231DF2B0579C8C7E2937E5818138E9061DC 143 | FBCFD5E7591CC8DB8B5284212F371E7D8EA7E1859C9B08890E6F7B1F6F5F3B05 144 | E39EBDD878A61FD2F3595D3F695F77752549989E0784CD0CC373E3C5F6CCB8CD 145 | 09F0AEDD286890B96ECDC2D1C83E4FC49CC382CD686BF75C1D7D6FC2A5F2721C 146 | 387E13B373B311CDB933DE6BC41DD66C6B8D6988FAB31F767C98801196CDD643 147 | 8E479D2F1C8C265611DE5ED2DF5D2E9C87A893337134D7D20DF4168EAC99873F 148 | 3FB10A254AAE6DADEC7F5695283446935B3C35C406707218766C4B963490DCC8 149 | 67E3E27538C08CD851BB4566E1DA2A06B01EFFF844142E0892ECA1DFF9DA8039 150 | 7F3022F8CDDD58116CF3223B108EE2DEDDD0372C45B6ECA6CA2D18FFFA4D647C 151 | 9881B0DED6DF2909471DFB2E7C1BF05AEE6A443F2D61385B6B51BC6A29D6D4B2 152 | 972D8FBD6C36CF9A6F3B47BAA1676F262EB90908EE615F04EE9DC6865959B8BE 153 | 7C37B64C91181535B31EA1978CF8379423E5C51CF45EB7172B46D91C237AEFE8 154 | 1CF4D46E7C9A8AE9EBEB65C5C15C07197B241C13B873CC35A06E66068A16492F 155 | 8CD67D9C8A174A1BE177C907B35D291CDB4CE8E9AB476E8E8491631D9DE23F2E 156 | C286870231FAEB6684E4650AC6C906D3A124841705A1685F3C064BBC4FB2C2C1 157 | 9DDB4B8765B999D2EEE1AC5DEC4F4C42C1984C1C8DF3B7F9525938B8F6D267E8 158 | 3C144A7524EEB1F72C7E1DCEB1DEFA9DEA7E5891B744A24D35A262F33CBCD290 159 | 802FD2F5E869776D2D686223424923DC5A03437C2ACA23B35118EE67FFACB508 160 | 474D3EA6275423E13D690113CE071B3B26D66FA6EEE73D55A588F8209EFB80BD 161 | 906DC6586854CD9B3E6086404B616E148E6FF3113EFF0466E4ED46C2B30AC75D 162 | 398839738B306493AD1113AEADE0C95014EEB137AE965C2E9883A8D32FD88829 163 | 1C0A47C193E1122FBF25C2427145E46EEC98666D9C65854334CA4835206BD223 164 | 904534FC9716DBBF6C82ABAF0F920C8548F0972FC2746811C2CF84E398139E5D 165 | E77746B15EEA6A9C79C9A67DAA118E6676EDCFB36B5FC0AEFDB77E3207B1BA5B 166 | 9C844DC33370C6E61D109ED74C94E44442275BF7A2BB66A53FD25D291C992644 167 | 6F92104C11AEB330EAF572F8BE2465BC45EEB2673CC38067F20A6DDAB603E1C8 168 | AC813E4D46E82DCFBFC60785476D0DA003E1D8EF8715FBB225858E836F2B7FAE 169 | 573E3F7B67A7CFAFC5B2D255D0F78026CCA339BBB6A85138F8724AC7E2688EB6 170 | F828120E87483520E12533E83250B2488B6B9BFB8483334C734CF354AC95089E 171 | 5DAF200567968EB1B876E1DA8C0BD80B3CC75FF9647C833F8DB83D3B113DC0E2 172 | 7307C2A1A66CCE35F5E587EC9FA39C70083D4BD6804B5903763044E65FE64FF4 173 | 283130036A5577ACED1C63A2F61E1335A502BEDE8EC03F7473EA6591153E15C2 174 | 71E7F83A8C5BD38C2C899198DD39B8BAB03482ADACEE67A4A16EB9B2016DFB7D 175 | 265C2C1CFDB0E333360296EB88F0DE394508C92D42D210B992AA903D3D0D4D6F 176 | D9D69123E1E8812D8E8CF2B512BCFCE22984C94DAFCA09C75F63EDDA91258220 177 | D623CBAAC36903B7A634CBC9A9413E660AF66D51EB888395332AD184151AAFA1 178 | 6B09879AC871CD0BD1D20D889B338E4A34A2675C0AB6C605C92F9A4A94E57AE1 179 | E0827116E14048368A647BA4ED70D31E9337DB1818F3B5ADB4EFEDDBC1FB70AF 180 | C3F5F442D6CBB7983671201C76C74B20D7019033BCBCD034D98AA00C97D84BB2 181 | D8840C9B97993FE78FC9F8226D82FD9481D56DC8BCAC2AE88870F0F7F84D3C8E 182 | 3A8A9AE705BD1A0996F5CF1BC6324CB1157985FAD16A4414EFF983518A06569D 183 | 1790D051334EB67D6F1C08477E80E3CE80A3753939E1F8A78336A7AAADC89FC3 184 | 21AE120E6EBA705512D6D406217D4D22229EF55173F62E261C6A22C7A516A2CD 185 | 1E0CC6D3F8FC7C2D6EDFFBA9CD8BC18C94B740D37765D8B06E378AEBBC103233 186 | 160B7FA3C7705FA5456E7709877AC32C1CCE353A934D6F484B2316A7946CDD8A 187 | 9D78096DD1261CE2C86F988A5152DBF5EDC6609BDEADEAD1AA2363D06042E517 188 | A7F0F9C90A9CFB919DEE8AE8356646AAD3E25038C429249D8AEBE3CBDA8B1196 189 | 533AFC35FFE8B8E7ADF8FC9C438D279C5B85C3D1B915CFEF40381CB517570847 190 | 733D2E5754A0F4F4297CF97D239AAED5DB783385765C38385A6FA1B2702D92DF 191 | 35014382B0706E0C668CD2A18FC27475D7120E27A6AA9ABE2B41EAABF9A8F0F2 192 | C394C9133131F8693CFD94E0ED2320784279294D2588EE76BB3EAD45735F7F24 193 | 2C4D4474B09FC402B07B854375CF45140EEB29092D65C8BCC89D241CF6064506 194 | 1923DD61E1602F5EC5CE542417FD04DF90B188181F84003F3F3CC379F08887F0 195 | 5E28957AE785A352C57315B1EAE46819259170A82ADBFDC2D1EE41E71D380C33 196 | A68E41886F7FF80D123D3E392E1A30EE8F3EAE110E334CA8CE7F7E10BBF24EA0 197 | E23A303C3C16CBE78663B8C473F9790B07EF52BB1B589089AC993A193F7F0D06 198 | 951990CBC7F762D33639F74F1A7174BD11878537DBE66484C8183FE7A7AA847B 199 | 3C126CE3C2AD80954B247FCD2D78E72F4B10EC683A95844355D9EE168E362FC1 200 | 9CD588969B3A72D554950C4DD7CEE280E16D647FFE1342966622335C67352DF7 201 | B3168EF3EF4661CE57B1F6DE4196701E2D53B314471C7698DD3F6FD996DDB5D6 202 | 389ADF2CC28A608BA9398F0B870BD7389C150E7E817337FC143C8738F885F9CA 203 | 70278443746678D849C70FA9750F571CAB02120E6784437004A894F0FEB34458 204 | 7C77F188438236F77B9BF6FD33160E9573C7BC9F7309F45A17B0786F9133363E 205 | F1EEF3AABA5C380751275F5016411E65AFAA03D1F6EE9CD2752261603A413878 206 | 8FA34C1FBCF3613282BD94CB56F4AA72563824A7FD6C11E27E52EE39B3C6A172 207 | 91590EB1E3035B919740F0DEBAEB5AAF2A120E6DC2A132AE8777B17E7782DB85 208 | 43AEE3F233168E461833E620F9F155A85A12247B0C1FA453D2A23D945ED2CDAF 209 | 06861753712EDE0D711C7C04FCFB1891B39B5DA78281E8701C875827DFC46A8E 210 | E370877098631C6A5F7550A78EE2389C150EBE975E8584F736C90750F175BE17 211 | E7A516C7F918852DE8AB54377CAC8A017DDFD8251B192E8F10D5FEF24F328166 212 | 6D88E276DCC5711C241CDA84C3DC1EB6B2CF46CAFC4C6CCBFBEFB96871DC0152 213 | 2EF24227E3899FA3708861FDB93AECF820192112F96AB868DAF0F7EAE17BE516 214 | 422C1FEEBD5BB8E3F5886CEEA3F6796FD6BBDD136BD14B14C5AA7589E24B2CB8 215 | 1607A9F38469A305E7DF4DC09C6301D8F2560AF452464C75E4F852D908E31B6C 216 | 883CFFF50BD0E74AA49BEE0CE1801855BDB90509DB3290E0EF64E4B8B3C2E128 217 | 388FAFF32C54C00BA6A76225AE5FE84C14872904C0A17DDE7B455EA6F2265912 218 | 51BEE6CE422F99742EE6F25F286D81AEAA1B222447920698D4C4F8A87C66D665 219 | 9370B49F430CE41C94829352D3AF625B2EA8F581E9CAD80E0A470BEE34003D7B 220 | 2B7434C575E0BE2B77233DC4E2DDE23B4C464438089A75179DBB38DE5C85ECF9 221 | 69608F18CBE263A11FE5875E5C8E966F6AF0D9A1DD38706B2233C2A1A84D7DCD 222 | 3AED35D728969723645A28F46302F08C9F9F9883A61AB5B5D5283E588223DFE9 223 | B042220546D32503A21673F11F89C8F84D109FDFAAA9A11E4D4FEAE0CB1B34D6 224 | F3FB23EBF9B53A91F8D0ECDDF3D15D8C9E6999F3476DAE2A219FD490C3495877 225 | 77A2454E23219F54F987FBF89C4833D233913E49C200759270587AA1E8A68523 226 | E6F9B118CD793469CA55E5BC5795900EC48480A87948FA8D90438A6B0BE7FF5A 227 | C6EAFC027C176762E59325987C28405EF8D6D763C6D2A54898A413EBBB1EBDFC 228 | 75169D8B465CDE9F86F93BAF6248781422260462F820F3B3E1DADD77F8DC7818 229 | C5035324A71A6F546EC72B6B4E00E3C2113F4BAC1F0839A32A3E38885DDFFF12 230 | B93961B8F46A0EBCD7DB3C3F7E6DC888D939459A46DD241CCE2D8E0B36A20C08 231 | 89C4C2B9131122BEC3972F96B3B67C02B77FBD143BC26A994197486BAE493884 232 | 7ADD78270811D32D3CB7F83C55B5F8FB9923C83E5C835EA129C84B1C6313AB56 233 | CFEC5412526A83B0E2F5583C3780CBA57513B53FF5C0E0A71DAC91BA804E77C7 234 | E502602A8BDE46F6A10B386F95D1D49C515518259C9B65F170B94CA895461C38 235 | C20C52F54F622654C09C8D3578861EB3A74C804E66B470E3EB7CACCF31A282CF 236 | A8CB9D6F2232B631A3C61D2F2E3C9F5BAABC38A6C49D1A2376ED39689D1D7754 237 | 1066CD8C41F428B9E91C8B463C443E3BAE6246CF4E130E01DE13246F9F7576DC 238 | 51C3A00F8B41FC249D6276DC8EC671DCF996D579FE5E1457D8D4D7FC28047319 239 | 92B91E9AA11F0AE584AFCC800DFB4EB565ADD58D8AC2964DF66B1ADC3D16EF2B 240 | B1CA98CA9D6BF0A06710A20F47C49440B10322F57C6CB3C4DA66FEE5DAFA5ADC 241 | 5E6CFDFCB84DB4A6E7F8A95A47D2FACC483864DE8BEB675160C86FCFA86BCE14 242 | 3C371661FE8F88535AD588E9E05455D3B52A941E611DDDD37FC72573667008D9 243 | 8B478C1C83B0E7431111286333EE99509CBB1D05C72D3235C7ADC63BBFD5BC12 244 | A71997094797815F543F81590A7970DC4307A258892E8CB0389AFC500A4EBEAA 245 | C2738D203C0009870DFCA2D3912097EECFA10E120E420A6E0D66356EAFD2364D 246 | 4510EE8484C306CE83E14080E38474AE8784839080F30E7CF5265E53CC6A4C10 247 | 9E8584C30AD6BB9B7B04C3F3B4CD25BB860E0887A7B61CE572EA14E558AD47E9 248 | FC2762D966717D887039DC08787143BCD3EB6D5A50BD2EE1044DDF19919DD7BE 249 | 06C5CFE147BFEE91F978C2F59070DC37DCEFC2710BC68C04247F138415AFBE80 250 | A983C49DDCBE6981EF387F0F4FEB11EEC06DC2C1EF5573043DE312B0F2D763C5 251 | 5D27AB51DB3D00C103B4C6C510F703241CF70DF7B970F0018E46CCD893ED383D 252 | 38F140E21EE110B7F56D5D2A1D17413C909070DC37DCDFC2C13B0DE4FA39DE5F 253 | 817860718F700801967F5FAC320128F14040C2D115F08070B873FE9BB83F70CF 254 | 3326A78FAE08094757C003C2C107A195EB4938BA306E110E31A09684A36B41C2 255 | A109154912C53DA6BF5CA090629D37F446E8A512F3DDAD45C547F9283872C122 256 | 8A791822A217204E2EEADC52381EABC7F94F0F22FFE02931325EF060E1A29AE3 257 | 7F1B2AB9298C2C7546A46C3E882F2FDAECA427D29E7892EB55EE854E14AE1B67 258 | F2B17EDB1118C5C8EA9EE129F864E998F6F41DE61D1F4BCBAD22B07B0ED02124 259 | 2C06CBA364B602E6EFF32A1672D1BA5C3D1D3220FBA36A214ADD1CD91B1F8F30 260 | F31E0AAD625DEC3B215E8B392B413C162A44B25BFDB6AD1E157ECB4711E7A0AF 261 | 524A1031DF949F52965C7EFFE9166C97D8BB43D8ACACC43A2ADF3F00212F9A33 262 | 2C4817C98BC1F7B142B4F25D138A0D5B90FDA9391ADA0F2B0CED6B560E85E31E 263 | 7BCE096BF1E5E4D5D8F352A0C27A4523CE176661FD27D5763B79F248259B34D7 264 | F70767505963E1793532A43DFA5FBAD2B4B53DC225907068E4FCCE28CCF93151 265 | 7E7F6CFEE52F43D39078D914EB72EB05E6DD102B07E9B12C3A141344CFA54B5F 266 | BC8F4DB9A7D13473150A1704D91B09B370E4C7A26EDD5A540C0CC36CFD5831CF 267 | D54DD45EAC42E9A1DD2838E38308B93C575230037FE76E33FF27BF835EC55814 268 | A587C22C87ED1B16995FDED578E65022E67FF50C92625EE0738F793798F0F7D6 269 | FE08B6C89FC327B7CC03C26686E1B9F1423E2F8EDBCC38EEDFC5AEB3418F4203 270 | 1307DB7C5EE6FBCC99888A95BB71276C1EE22CF3811DCBC7BA77AF22382D1B5B 271 | C6FD88ECC4B5287E6222927E23E6FCE2EAF24C19B2B719716766866C2249FC74 272 | 1A1B976FC6010C6BBB0FBE1ECF18B1695B09CE0D8D47C93AF66CDB9E83E30DAD 273 | 8434D835F08E908F00E753F39B126CDA5623FB3C0D73DFBE8A11D1EDF70B9579 274 | C0DA8463662D9F2CAF79E63C2C08E3F279B5A0F69B9BE835AC3D458AA27030D1 275 | E0EAD3F81FABE5EBCDB22DDF6D443397F051DCC1136F142269A8F8A5EDF6D1D7 276 | CAB166F916947A05B1FA0E47C8301DFA7AB5E7F192DBCC48405BDB235C030987 277 | 46840D5C801D9F25234422D683139614E831617F159E964C5B22A69078D866DF 278 | 0DCE28CE35A04E4E1CCCBB252ECDC68E6936865FDCEBBA6E40337C631432B072 279 | D986DF6AC46B4E784629F746B997772D9AA327A2F27B3FECB032AA123041E27A 280 | F0DE52C7B4B2515D7C2ACA23257285893B089EEBFD1822D66F62BD7BFBC556EE 281 | 1EA7E700FA9126348DD98C1D52F10F7CB6DAC398209559544CBC59E0672B0E22 282 | 7CAF3B0D159399F058F4BAE5F61A111084A552178AEF0EB3FA97CC3925BDAB63 283 | DB6E7412093B85FA52CE3C2C3C371DE2700A88CE514C0B2FFB8CD968A0785512 284 | 367ACDC3FB69A1CACF56B26D28AC7198EB739454223F01F36646BE2B25DABED6 285 | B647B804120EAD284D4BF0D35459E8B52D07BAF7E6A1F83FA4A6B484E9AE1B4B 286 | 2DA72CC43D1BAAA35092C30C8F4CC317D2D007A2B0941908CB63C469908A6047 287 | 197D0503B6C1577BDE23C7C2C18C2D0291F56106C27A77AC8AF97395B373BD21 288 | BDE9D2970ABD76F3C649FB9F0C47916CB4B5903873A3CE7E84E028D53F47D399 289 | 2D18FF5A3D5658AE2929EDDEC75FF7293CF7612C6A1364D287F0ED6A1F46ECD9 290 | D92EEAFC3E204C05530DC89AA4D06B56D8EBC43CD2F17D49396DBCEC33E6323E 291 | E72423F91A6B9BEBB48A0687B2705C2E9C87A84F26A2285F3932DE742809E16F 292 | EB24123DBAB6ED11EA20E1D08CBCD1E1A7A9960379CCB0FB7E2A6368F9248ACC 293 | C058EEF5216E1ED39CE620D589CC9EDD66830A153B1B3A1A31C9A146380E44B8 294 | 28119FE27ECE0ED609C49EFBA6316C44F792FC6A2CBF6D71F36A9B0CABEAF6E6 295 | 30AF6399965A6EF32BEF766A5977756C443A1FABED52AFF3CF65F3A356D397FC 296 | EFB6E9EC3B0A12C88D7804E168C40A15493BED9FB1B0AFCDFCAFC6222F4762EA 297 | 50DDC394170E733D3ADA048C4376274517B73D4215241C4E20B795E8794BA3C0 298 | 07CC9DB2DB9447D2007FBD1D817F30215D69173B1E99C57995DB5DF2F03B23BE 299 | 8FD17985487856E33D3B100E55FBA5AB4151384A1062D92BB7432E05B88AFBE1 300 | EB261F014ABBBFF1881B823D619D229B5FFFFAE7529B2D81ADAF871FADACF2E1 301 | 3B179662705E42505CB19F7B9BF81C75BC539C6D9DF0D364FB74C833382B1AFC 302 | C394170EBEBECB3045F1799A11F6C9491B64DB217071DB235441C2E10C52FB99 303 | F33BD16D86D75BE669086127B12F232D471182C1310CB5F6B852BF7FB0CC22AC 304 | 16775CB1E7E6A5D13D528D706872B96CAEC7E58A0A949E3E852FBF6F44D33571 305 | EF9236B46DCB695B474E0987AAFDCB05F8BD157E4CB65AC8E6470D6B7CAC4708 306 | B61D08BE9DE4A0CF36CBF515A9E94BC70BEE56C88C46B5B8D85A1EDBC4894666 307 | 0D66BC5188F4711D09DC53681B7C7DFFA87AA74DBECEBF4FB099C2A43891CE80 308 | 84C329ECA725A47A92FCF4C185C8F66D6AF9A1F95AE02DEB396EF33CB46AA26D 309 | 36B1D114C7E1DC8BE63AE168DF2DD03B7018664CB5D8F9CC7CC84503C6FDD1A7 310 | 9384A34C7DA5D8AE29F1538E063C63319AE3D74C4E86591C273847AC7FDC623A 311 | 4CF2BED4DD8775DDD88F3A9D118E92B95791BCDC841193D8355C1C2BEDE1A61A 312 | 47C2E168B3A57678E130D9AEE391707406241C4E623D2D21E6E3F1B699BBB65D 313 | CFE017506F62A5CDFA02FFC27E32CACAD555112F1FF4B47C911FA011479B9750 314 | CE6A443F2BD393559CAA72B7703462C7870918A1A6526CDD4AC5731F08368F28 315 | 855167C5F3D6D762BB9EC1BB67EF0BB099FAECA411477E3D743D0290B43E05FA 316 | BEECFA1393B0E9A9641C93733F77088D38BA22241C4E62F5F2CB8C24CC0BB5E7 317 | 628491093F02B918631703222C58FBA8EE79D921B7682E85A679E5765C231C55 318 | C89E9E86CAC5CADBF2CAD687BB85436A0A522356CF58EE7A79F1CE411F7E6422 319 | 8E409EB0170897AD7168128EFE78276F0982CD86DCEC06FE6AB6BA918F1D9E59 320 | E320E1F02C241CCE62E93ED9D0EE4D65EBFDC21B92EFE3D9CB1F888A8C39D22E 321 | BAAA167D15D0E05575E7F3348C7BCB4F95A78E252E110E958BF8970BE620EADD 322 | 099E170ED1CBA7395DC96BCB0116A3CAC19FCBD5992016D903B99149A3EC0E7F 323 | FC4824D347D55EE38A5E554EAC71581ECB5DC7E435F54EC5FF28B70D61CAB73C 324 | 26DBF17E230EBCAA48383C0B0987D388415D618558F85FAF21EAFA123B174B1E 325 | CE90243623AB34089FFDEA6DF84A8A83B0D7C5C6C75350B22448BB4BA1398E63 326 | D292F6F514295AC5A98700F7C471387C7945B7E3BE4A5E4B624CC2FE7B9DB038 327 | 0E31AEE0C24C1C7DC3C94032732C4F0E1B017E1885FD83A5AFA36D8BE2A5CD48 328 | 7DD1843829F7687E213D0BB58EDC551DC571745038CC6EB9734E3AB3DEA1DC36 329 | F835A07D8128DC631FBC6889A3380E120ECF42C2D101B85E5E5443385654EF86 330 | 69AE5C9E22AE57B516889F0963FE5DA4CBA525374F09246EC68EE7147A5F5C1A 331 | 07C9942347703BB01EBD66C84D2934B2EB5D8BA8B7818C3D9908D33815E39AA9 332 | 2A61CE7FD3A014E9BD19C428E8825A1F98AE8CED14E1688B641E2F13C1EFE859 333 | 88A389FD8313A0DB7602BA3D32D7CA8B683982537DB0E6AB20D91436373E4DC5 334 | F4CD2D48D89681047F6723C73B2A1C688BE82F1D9FA12AE5483B0EDA8618A96F 335 | 1C9A8C1DCB27488AB5E3C871120E4F43C2D111B8D1C44A23D030818D28E4A77E 336 | B81C44C91FB1DE5570A2E27C7553CD5E2C597E1097064D4052D8048C0808E077 337 | 4BE3F2125DFAE12A4CE546183ED561EB510983BAB211CB363F8DD257B3503130 338 | 1CF1B3C662F4807EEC5C7771FD9BBFA278FF6E145CEC8F243903E400572D8E37 339 | 5D32206A71191012898573272244CC3375F962390A724FE0F6AF976247189757 340 | E927ACEC0CE1E0E07227ADCC412986212E7202260CF587AE770FDE85D8F47D2D 341 | FE7EA11CC587EF22224FFA3A845C64D5F01D188B4259832D06925EF441AFA84C 342 | F98498165E68BA69E188795E7CAE5A7255B94238F87A51487B238B8AB661CE0D 343 | D6A0C3ECF96198312C88B57B2DB9AA48383C0D09478710E6680D9333A4A7A9CC 344 | F0F3DE25189EAE62331B669C2ACBF6E140E985B62CA14226D4FE0818A3474C98 345 | 1EC36D3385720675CFA3D8C28952AB7D765C3EEBECE450C447E931D8C9BDC15D 346 | 1AC771FD2C0A0CF9C8AF3067691533DBCE8D4598FF23626FBC1A319D251C1CAD 347 | B770F9F861E41F396D911D98CB90FB18460CD52322528F9001320167E294DC1D 348 | 076B4EBCC0ACA946928A60CCA66B6771206F9F7576DC51C3A00F8B41BC42A65F 349 | 970A07CC232060457EA6836055332ADB065FDF7B6178CF3A3B6EC8383D66CF8D 350 | 4470DF0E964FB814120E8220084213241C04411084264838088220084D907010 351 | 3F5FAE1D01D67C09A4FF0950355F7F9F944D109D0C0907E15978835A22F36537 352 | E0D1EE806F30A01F0FF83F05FC0F775FCBFD2A1C2DC0CE64F6DFDF018B46BBB1 353 | 1208423B241C8467E10DEA4960690AF094CD7775D5EC7F57802FD9F7DFFF13F0 354 | 6607BCBC1418D6CBA953A9BB96FB55387E60BF67BF45382B23CC3DF74F104E42 355 | C2417816B506F5261391DDBB801AD6F39EB912087D4AED195C7F2D9D52B638E2 356 | F05E04CCFB85EBEF9D203A000907E15934195436EA3030D138CBFE5CF2261B79 357 | 38993FCA25D7721F954D109D0C0907E159B41AD47FFD201CDB32155817E9DA35 358 | 0F120E82700A120EC2B3386350FFF69F40F64960D12E402E39E2EDABC0C7FBD8 359 | E884FDF7AE10598D27FB03A1F381313271D0B2D7F235B0B044F8FC89DBC0C952 360 | C0C88EBBF64FE1EB6E0F030347035133D87F7B392E9B2BE32FEF03157FB32F63 361 | 7638D0FF61E9320C0BD9FF2D021214F7B125088F43C2417816A77AE2D540F216 362 | 202819981360FFF5B70781AD9F018F3303FBDC34C09F09C5FFBDC10C3533FE46 363 | F6DB914C3C5E1E6D3F5A51148E9DCC66B3CFCBD603379900FD7A322B979DBB37 364 | FBBAAE8A95CDCE77968D864292D83549AC4198CB5ECE8461172BEB61766DFAFF 365 | CDCA1800FC7B33F07FD839CA3E054CFFCDCEC3CE3152423C483888FB14120EC2 366 | B338251C6C04919D08343023BC2ACCBEBCF4127971F807FB7E2DFBFEF93FD92F 367 | B03B128E1ECC98FB474B97CBF1153BE61D766C1C13B5710F4B94CDC4A507BBF6 368 | 8929ECFCFDA56FEDFD95C017FEC0A6DFD99F838483B84F21E1203C8BB373FF85 369 | 6CB4719619D02DBFB3F89019E5ED4C50EA1CAC7F1C62C6D9C80CF7F645D6C738 370 | 120E6E9490C97EA39443BC805D57CD786043A4C47D32C11AC83E5F3155FEF74D 371 | 2781DFFF27B0641730CCE63B120EE23E858483F02CCE0A47293BFE43F6835D8B 372 | DA3FBB7D1C58BE1F78E12D40AF10EB6136E2B6C6D9917084C84C8D59729919FD 373 | AD55400ABB069DC43967B3CF272BC5A1FC00AC66E71FC3FE37C3664444C241DC 374 | A79070109EC595C2C14F155D65E5AD07FE97D28FC53512FD9FAC8DB323E198C9 375 | CA0D75908CFC5FECF78BF3EC05C23C55F50776DEC14A0588817EA3FF44C2413C 376 | 309070109EC559E1D8CD8C68CD5420D3624A484A4C24118DF3209B1184C3C571 377 | 052FAE364C406A161B9DFC49A528C95C1B0907F10041C2417816A784E336F0D6 378 | 72F6DF6860F9A4F68F79E1F841FDB9836C8CB04B8443C6F09370105D18120EC2 379 | B338231CFF62867C0933E4BF4A015EB05848E084E3F42F98984C5357CEFFEC0E 380 | 3C6C117D4E230E82700A120EC2B338231CA7B381DDD78055EB014BAFD62FD8E7 381 | 05DD544C5569BD1627D638E27280716A44C916120EE2C1838483F02C9A538E54 382 | B311C51676ACCD34555B59C7EC3D9A3A7C2DA27004A930DA7C54BBC9BE0C120E 383 | A20B43C24178162DC2F1AF1B402EEBF5FFED7160F52A09CF2971EDA3E77CE7F6 384 | ACE8701CC73F99682433DB3F55268E838483E89A9070109E45AD41FD073B6617 385 | EBCDFFD81B58B212F8854C3E27736478E82AF9E86C8E7F417BCA113E72FC77F2 386 | 869B9F2A334967EE25E120BA30241C846791DDC8A901A86146F4CA5F81AFFE06 387 | DC6C61238CF1402233DC8F3B28F36FFB819DC7D971BF004282DB734A35FC839D 388 | EF2A709A9DEF12B3DEB98B24AE4541385E669F7FC6463C4DAC5CFD2460B838E4 389 | E172557D7218B8FCDFC0ECD781C9127B859070105D18120EC2B3286D1DEBDD0B 390 | 78B40FEBBDFF12183B89098786FD379A9801FEF820131D3602B82966A0E5B7A2 391 | 65E5F98F067E3DD5BE3C355E55C315B2E3C645024FC85C230907D18521E12008 392 | 3BB4B8E312C4CF0F120E82B0838483209420E120083B4838084209120E82B083 393 | 8483209420E120083B4838084209120E82B0838483209420E120083B48380842 394 | 09120E8220084213241C04411084264838088220084D9070100441109A20E120 395 | 08822034F1FF0160616E4FB1E68DCD0000000049454E44AE426082} 396 | ExplicitWidth = 631 397 | end 398 | object Label1: TLabel 399 | Left = 8 400 | Top = 160 401 | Width = 90 402 | Height = 17 403 | Caption = 'Target Platform' 404 | Font.Charset = DEFAULT_CHARSET 405 | Font.Color = clWindowText 406 | Font.Height = -13 407 | Font.Name = 'Segoe UI' 408 | Font.Style = [] 409 | ParentFont = False 410 | end 411 | object Label2: TLabel 412 | Left = 191 413 | Top = 160 414 | Width = 64 415 | Height = 17 416 | Caption = 'Framework' 417 | Font.Charset = DEFAULT_CHARSET 418 | Font.Color = clWindowText 419 | Font.Height = -13 420 | Font.Name = 'Segoe UI' 421 | Font.Style = [] 422 | ParentFont = False 423 | end 424 | object Label3: TLabel 425 | Left = 398 426 | Top = 160 427 | Width = 24 428 | Height = 17 429 | Caption = 'Port' 430 | Font.Charset = DEFAULT_CHARSET 431 | Font.Color = clWindowText 432 | Font.Height = -13 433 | Font.Name = 'Segoe UI' 434 | Font.Style = [] 435 | ParentFont = False 436 | end 437 | object lblMiddlewares: TLabel 438 | Left = 10 439 | Top = 224 440 | Width = 67 441 | Height = 13 442 | Caption = 'Middlewares' 443 | Font.Charset = DEFAULT_CHARSET 444 | Font.Color = clWindowText 445 | Font.Height = -11 446 | Font.Name = 'Segoe UI' 447 | Font.Style = [fsBold] 448 | ParentFont = False 449 | end 450 | object edtTarget: TComboBox 451 | Left = 8 452 | Top = 180 453 | Width = 177 454 | Height = 25 455 | Style = csDropDownList 456 | Font.Charset = DEFAULT_CHARSET 457 | Font.Color = clWindowText 458 | Font.Height = -13 459 | Font.Name = 'Segoe UI' 460 | Font.Style = [] 461 | ItemIndex = 0 462 | ParentFont = False 463 | TabOrder = 0 464 | Text = 'Windows' 465 | OnChange = edtTargetChange 466 | Items.Strings = ( 467 | 'Windows' 468 | 'Linux') 469 | end 470 | object edtFramework: TComboBox 471 | Left = 191 472 | Top = 180 473 | Width = 201 474 | Height = 25 475 | Style = csDropDownList 476 | Font.Charset = DEFAULT_CHARSET 477 | Font.Color = clWindowText 478 | Font.Height = -13 479 | Font.Name = 'Segoe UI' 480 | Font.Style = [] 481 | ItemIndex = 2 482 | ParentFont = False 483 | TabOrder = 1 484 | Text = 'Console' 485 | Items.Strings = ( 486 | 'Apache' 487 | 'CGI' 488 | 'Console' 489 | 'Daemon' 490 | 'Isapi' 491 | 'VCL' 492 | 'WinService' 493 | '') 494 | end 495 | object Button2: TButton 496 | Left = 8 497 | Top = 447 498 | Width = 109 499 | Height = 37 500 | Anchors = [akLeft, akBottom] 501 | Caption = 'DONE' 502 | Default = True 503 | ModalResult = 1 504 | TabOrder = 3 505 | end 506 | object Button1: TButton 507 | Left = 123 508 | Top = 447 509 | Width = 109 510 | Height = 37 511 | Anchors = [akLeft, akBottom] 512 | Caption = 'CANCEL' 513 | ModalResult = 2 514 | TabOrder = 4 515 | end 516 | object edtPort: TEdit 517 | Left = 398 518 | Top = 180 519 | Width = 93 520 | Height = 25 521 | TabOrder = 2 522 | Text = '9000' 523 | end 524 | object chkJhonson: TCheckBox 525 | Left = 10 526 | Top = 243 527 | Width = 230 528 | Height = 17 529 | Anchors = [akLeft, akTop, akRight] 530 | Caption = 'jhonson - JSON parser' 531 | Font.Charset = DEFAULT_CHARSET 532 | Font.Color = clWindowText 533 | Font.Height = -11 534 | Font.Name = 'Segoe UI' 535 | Font.Style = [] 536 | ParentFont = False 537 | TabOrder = 5 538 | end 539 | object chkHorseCORS: TCheckBox 540 | Left = 10 541 | Top = 266 542 | Width = 230 543 | Height = 17 544 | Anchors = [akLeft, akTop, akRight] 545 | Caption = 'horse-cors - Inject CORS headers' 546 | Font.Charset = DEFAULT_CHARSET 547 | Font.Color = clWindowText 548 | Font.Height = -11 549 | Font.Name = 'Segoe UI' 550 | Font.Style = [] 551 | ParentFont = False 552 | TabOrder = 6 553 | end 554 | object chkHorseOctetStream: TCheckBox 555 | Left = 10 556 | Top = 289 557 | Width = 230 558 | Height = 17 559 | Anchors = [akLeft, akTop, akRight] 560 | Caption = 'horse-octet-stream - Support stream' 561 | Font.Charset = DEFAULT_CHARSET 562 | Font.Color = clWindowText 563 | Font.Height = -11 564 | Font.Name = 'Segoe UI' 565 | Font.Style = [] 566 | ParentFont = False 567 | TabOrder = 7 568 | end 569 | object chkHorseJWT: TCheckBox 570 | Left = 10 571 | Top = 312 572 | Width = 230 573 | Height = 17 574 | Anchors = [akLeft, akTop, akRight] 575 | Caption = 'horse-jwt - JSON Web Token' 576 | Font.Charset = DEFAULT_CHARSET 577 | Font.Color = clWindowText 578 | Font.Height = -11 579 | Font.Name = 'Segoe UI' 580 | Font.Style = [] 581 | ParentFont = False 582 | TabOrder = 8 583 | end 584 | object chkHorseBasicAuth: TCheckBox 585 | Left = 10 586 | Top = 335 587 | Width = 230 588 | Height = 17 589 | Anchors = [akLeft, akTop, akRight] 590 | Caption = 'horse-basic-auth - Basic authentication' 591 | Font.Charset = DEFAULT_CHARSET 592 | Font.Color = clWindowText 593 | Font.Height = -11 594 | Font.Name = 'Segoe UI' 595 | Font.Style = [] 596 | ParentFont = False 597 | TabOrder = 9 598 | end 599 | object chkHorseCompression: TCheckBox 600 | Left = 10 601 | Top = 358 602 | Width = 230 603 | Height = 17 604 | Anchors = [akLeft, akTop, akRight] 605 | Caption = 'horse-compression - Compression' 606 | Font.Charset = DEFAULT_CHARSET 607 | Font.Color = clWindowText 608 | Font.Height = -11 609 | Font.Name = 'Segoe UI' 610 | Font.Style = [] 611 | ParentFont = False 612 | TabOrder = 10 613 | end 614 | object chkHandleException: TCheckBox 615 | Left = 10 616 | Top = 381 617 | Width = 230 618 | Height = 17 619 | Anchors = [akLeft, akTop, akRight] 620 | Caption = 'handle-exception - Handler exceptions' 621 | Font.Charset = DEFAULT_CHARSET 622 | Font.Color = clWindowText 623 | Font.Height = -11 624 | Font.Name = 'Segoe UI' 625 | Font.Style = [] 626 | ParentFont = False 627 | TabOrder = 11 628 | end 629 | object chkLogger: TCheckBox 630 | Left = 10 631 | Top = 404 632 | Width = 230 633 | Height = 17 634 | Anchors = [akLeft, akTop, akRight] 635 | Caption = 'Logger - Access logging' 636 | Font.Charset = DEFAULT_CHARSET 637 | Font.Color = clWindowText 638 | Font.Height = -11 639 | Font.Name = 'Segoe UI' 640 | Font.Style = [] 641 | ParentFont = False 642 | TabOrder = 12 643 | end 644 | object chkUseBoss: TCheckBox 645 | Left = 430 646 | Top = 223 647 | Width = 61 648 | Height = 17 649 | Anchors = [akLeft, akTop, akRight] 650 | Caption = 'Use Boss' 651 | Checked = True 652 | Font.Charset = DEFAULT_CHARSET 653 | Font.Color = clWindowText 654 | Font.Height = -11 655 | Font.Name = 'Segoe UI' 656 | Font.Style = [] 657 | ParentFont = False 658 | State = cbChecked 659 | TabOrder = 13 660 | end 661 | end 662 | -------------------------------------------------------------------------------- /src/Horse.NewProject.View.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.View; 2 | 3 | interface 4 | 5 | uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 6 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.pngimage, Vcl.ExtCtrls, Horse.Wizard.Types, 7 | Horse.Middlewares, System.Generics.Collections; 8 | 9 | type 10 | THorseViewsNewProject = class(TForm) 11 | imgHeader: TImage; 12 | Label1: TLabel; 13 | edtTarget: TComboBox; 14 | edtFramework: TComboBox; 15 | Label2: TLabel; 16 | Button2: TButton; 17 | Button1: TButton; 18 | Label3: TLabel; 19 | edtPort: TEdit; 20 | chkJhonson: TCheckBox; 21 | chkHorseCORS: TCheckBox; 22 | chkHorseOctetStream: TCheckBox; 23 | chkHorseJWT: TCheckBox; 24 | lblMiddlewares: TLabel; 25 | chkHorseBasicAuth: TCheckBox; 26 | chkHorseCompression: TCheckBox; 27 | chkHandleException: TCheckBox; 28 | chkLogger: TCheckBox; 29 | chkUseBoss: TCheckBox; 30 | procedure edtTargetChange(Sender: TObject); 31 | procedure FormCreate(Sender: TObject); 32 | private 33 | { Private declarations } 34 | procedure SetFrameworks; 35 | public 36 | { Public declarations } 37 | function Port: Integer; 38 | function HorseFramework: THorseFramework; 39 | function HorsePlatform: THorsePlatform; 40 | function GetMiddlewares: TList; 41 | function UseBoss: Boolean; 42 | end; 43 | 44 | var 45 | HorseViewsNewProject: THorseViewsNewProject; 46 | 47 | implementation 48 | 49 | {$R *.dfm} 50 | 51 | { THorseViewsNewProject } 52 | 53 | procedure THorseViewsNewProject.edtTargetChange(Sender: TObject); 54 | begin 55 | SetFrameworks; 56 | end; 57 | 58 | procedure THorseViewsNewProject.FormCreate(Sender: TObject); 59 | begin 60 | SetFrameworks; 61 | end; 62 | 63 | function THorseViewsNewProject.GetMiddlewares: TList; 64 | begin 65 | Result := TList.Create; 66 | try 67 | if chkHorseCORS.Checked then 68 | Result.Add(THorseMiddlewareCORS.New); 69 | 70 | if chkHorseCompression.Checked then 71 | Result.Add(THorseMiddlewareCompression.New); 72 | 73 | if chkJhonson.Checked then 74 | Result.Add(THorseMiddlewareJohnson.New); 75 | 76 | if chkHorseOctetStream.Checked then 77 | Result.Add(THorseMiddlewareOctetStream.New); 78 | 79 | if chkHorseJWT.Checked then 80 | Result.Add(THorseMiddlewareJWT.New); 81 | 82 | if chkHandleException.Checked then 83 | Result.Add(THorseMiddlewareHandleException.New); 84 | 85 | if chkLogger.Checked then 86 | Result.Add(THorseMiddlewareLogger.New); 87 | 88 | if chkHorseBasicAuth.Checked then 89 | Result.Add(THorseMiddlewareBasicAuth.New); 90 | except 91 | Result.Free; 92 | raise; 93 | end; 94 | end; 95 | 96 | function THorseViewsNewProject.HorseFramework: THorseFramework; 97 | begin 98 | Result.FromString(edtFramework.Text); 99 | end; 100 | 101 | function THorseViewsNewProject.HorsePlatform: THorsePlatform; 102 | begin 103 | Result.FromString(edtTarget.Text); 104 | end; 105 | 106 | function THorseViewsNewProject.Port: Integer; 107 | begin 108 | Result := StrToIntDef(edtPort.Text, 9000); 109 | end; 110 | 111 | procedure THorseViewsNewProject.SetFrameworks; 112 | begin 113 | edtFramework.Clear; 114 | edtFramework.Items.Add('Apache'); 115 | edtFramework.Items.Add('CGI'); 116 | edtFramework.Items.Add('Console'); 117 | edtFramework.Items.Add('Daemon'); 118 | edtFramework.Items.Add('Isapi'); 119 | edtFramework.Items.Add('Vcl'); 120 | edtFramework.Items.Add('WinService'); 121 | 122 | if edtTarget.Text = 'Windows' then 123 | begin 124 | edtFramework.Items.Delete(3); 125 | edtFramework.ItemIndex := 2; 126 | end 127 | else 128 | begin 129 | edtFramework.Items.Delete(6); 130 | edtFramework.Items.Delete(5); 131 | edtFramework.Items.Delete(4); 132 | edtFramework.Items.Delete(1); 133 | edtFramework.ItemIndex := 1; 134 | end; 135 | end; 136 | 137 | function THorseViewsNewProject.UseBoss: Boolean; 138 | begin 139 | Result := chkUseBoss.Checked; 140 | end; 141 | 142 | end. 143 | -------------------------------------------------------------------------------- /src/Horse.NewProject.Wizard.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject.Wizard; 2 | 3 | interface 4 | 5 | uses Horse.NewProject, Horse.NewProject.View, Horse.Middlewares, System.Generics.Collections, ToolsAPI, Winapi.Windows, 6 | Vcl.Controls; 7 | 8 | type 9 | THorseNewProjectWizard = class(TNotifierObject, IOTAWizard, IOTAProjectWizard, IOTARepositoryWizard) 10 | protected 11 | // IOTAWizard 12 | function GetIDString: string; 13 | function GetName: string; 14 | function GetState: TWizardState; 15 | procedure Execute; 16 | 17 | // IOTARepositoryWizard 18 | function GetAuthor: string; 19 | function GetComment: string; 20 | function GetPage: string; 21 | function GetGlyph: Cardinal; 22 | public 23 | class function New: IOTAWizard; 24 | end; 25 | 26 | implementation 27 | 28 | { THorseNewProjectWizard } 29 | 30 | procedure THorseNewProjectWizard.Execute; 31 | var 32 | LForm: THorseViewsNewProject; 33 | LMiddlewares: TList; 34 | begin 35 | LForm := THorseViewsNewProject.Create(nil); 36 | try 37 | LForm.ShowModal; 38 | if LForm.ModalResult = mrOK then 39 | begin 40 | LMiddlewares := LForm.GetMiddlewares; 41 | try 42 | THorseNewProject.UseBoss(LForm.UseBoss); 43 | THorseNewProject.Port(LForm.Port); 44 | THorseNewProject.Framework(LForm.HorseFramework); 45 | THorseNewProject.&Platform(LForm.HorsePlatform); 46 | THorseNewProject.Middlewares(LMiddlewares); 47 | THorseNewProject.Execute; 48 | finally 49 | LMiddlewares.Free; 50 | end; 51 | end; 52 | finally 53 | LForm.Free; 54 | end; 55 | end; 56 | 57 | function THorseNewProjectWizard.GetAuthor: string; 58 | begin 59 | Result := 'Horse - https://github.com/HashLoad/horse'; 60 | end; 61 | 62 | function THorseNewProjectWizard.GetComment: string; 63 | begin 64 | Result := 'Create a new Horse Project'; 65 | end; 66 | 67 | function THorseNewProjectWizard.GetGlyph: Cardinal; 68 | begin 69 | Result := LoadIcon(HInstance, 'HashloadIcon'); 70 | end; 71 | 72 | function THorseNewProjectWizard.GetIDString: string; 73 | begin 74 | Result := Self.ClassName; 75 | end; 76 | 77 | function THorseNewProjectWizard.GetName: string; 78 | begin 79 | Result := 'Horse Project'; 80 | end; 81 | 82 | function THorseNewProjectWizard.GetPage: string; 83 | begin 84 | Result := 'Horse'; 85 | end; 86 | 87 | function THorseNewProjectWizard.GetState: TWizardState; 88 | begin 89 | Result := [wsEnabled]; 90 | end; 91 | 92 | class function THorseNewProjectWizard.New: IOTAWizard; 93 | begin 94 | Result := Self.Create; 95 | end; 96 | 97 | end. 98 | -------------------------------------------------------------------------------- /src/Horse.NewProject.pas: -------------------------------------------------------------------------------- 1 | unit Horse.NewProject; 2 | 3 | interface 4 | 5 | uses ToolsAPI, System.Generics.Collections, System.SysUtils, System.StrUtils, System.Classes, Horse.Boss.Initializer, 6 | Horse.Middlewares, Horse.Wizard.Utils, Horse.Wizard.Types, Horse.NewProject.Creator, Horse.NewProject.Creator.Apache, 7 | Horse.NewProject.Creator.Vcl, Horse.NewProject.Creator.WinSvc, System.Math; 8 | 9 | type 10 | THorseNewProject = class 11 | 12 | private 13 | class var FUseBoss: Boolean; 14 | class var FPort: Integer; 15 | class var FPlatform: THorsePlatform; 16 | class var FFramework: THorseFramework; 17 | class var FMiddlewares: TList; 18 | class function GetCreator(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer): IOTACreator; 19 | class procedure AddMiddlewaresUses(const AProject: IOTAProject; const AMiddlewares: TList); 20 | class procedure AddMiddlewares(const AProject: IOTAProject; const AMiddlewares: TList); 21 | public 22 | class procedure Execute; 23 | class procedure Port(const AValue: Integer); 24 | class procedure UseBoss(const AValue: Boolean); 25 | class procedure &Platform(const AValue: THorsePlatform); 26 | class procedure Framework(const AValue: THorseFramework); 27 | class procedure Middlewares(const AValue: TList); 28 | end; 29 | 30 | implementation 31 | 32 | { THorseNewProject } 33 | 34 | class procedure THorseNewProject.AddMiddlewares(const AProject: IOTAProject; const AMiddlewares: TList); 35 | var 36 | LUnitText: TStringList; 37 | LEditView: IOTAEditView; 38 | I: Integer; 39 | LLinePosition: Integer; 40 | LHorseUse: string; 41 | begin 42 | LLinePosition := 0; 43 | LUnitText := EditorAsStringList; 44 | try 45 | LEditView := (BorlandIDEServices as IOTAEditorServices).TopView; 46 | for I := 0 to Pred(LUnitText.Count) do 47 | begin 48 | if LUnitText[I].Trim.StartsWith('THorse.Get') then 49 | begin 50 | LLinePosition := I + 1; 51 | Break; 52 | end; 53 | end; 54 | 55 | LEditView.Buffer.EditPosition.GotoLine(LLinePosition); 56 | LEditView.Buffer.EditPosition.InsertText(Chr(13)); 57 | 58 | for I := 0 to Pred(AMiddlewares.Count) do 59 | begin 60 | LEditView.Buffer.EditPosition.GotoLine(LLinePosition); 61 | LEditView.Buffer.EditPosition.Tab(1); 62 | 63 | if I = 0 then 64 | LEditView.Buffer.EditPosition.InsertText('THorse' + Chr(13)); 65 | 66 | LHorseUse := '.' + AMiddlewares[I].Declaration; 67 | LHorseUse := LHorseUse + IfThen(I = Pred(AMiddlewares.Count), ';', '') + Chr(13); 68 | 69 | LEditView.Buffer.EditPosition.Tab(1); 70 | LEditView.Buffer.EditPosition.InsertText(LHorseUse); 71 | LLinePosition := LLinePosition + IfThen(I = 0, 2, 1); 72 | end; 73 | finally 74 | LUnitText.Free; 75 | end; 76 | end; 77 | 78 | class procedure THorseNewProject.AddMiddlewaresUses(const AProject: IOTAProject; const AMiddlewares: TList); 79 | var 80 | LUnitText: TStringList; 81 | LEditView: IOTAEditView; 82 | I: Integer; 83 | LUsesPosition: Integer; 84 | begin 85 | LUsesPosition := 0; 86 | LUnitText := EditorAsStringList; 87 | try 88 | LEditView := (BorlandIDEServices as IOTAEditorServices).TopView; 89 | for I := 0 to Pred(LUnitText.Count) do 90 | begin 91 | if LUnitText[I].Trim.Equals('uses') then 92 | begin 93 | LUsesPosition := I + 2; 94 | Break; 95 | end; 96 | end; 97 | 98 | for I := 0 to Pred(AMiddlewares.Count) do 99 | begin 100 | LEditView.Buffer.EditPosition.GotoLine(LUsesPosition + 1); 101 | LEditView.Buffer.EditPosition.Tab(1); 102 | LEditView.Buffer.EditPosition.InsertText(AMiddlewares[I].&Uses + ',' + Chr(13)); 103 | LUsesPosition := LUsesPosition + 1; 104 | end; 105 | finally 106 | LUnitText.Free; 107 | end; 108 | end; 109 | 110 | class procedure THorseNewProject.Execute; 111 | var 112 | LCreator: IOTACreator; 113 | LProject: IOTAProject; 114 | LBoss: THorseBossInitializer; 115 | begin 116 | LCreator := GetCreator(FPlatform, FFramework, FPort); 117 | (BorlandIDEServices as IOTAModuleServices).CreateModule(LCreator); 118 | 119 | LProject := GetActiveProject; 120 | AddMiddlewares(LProject, FMiddlewares); 121 | AddMiddlewaresUses(LProject, FMiddlewares); 122 | 123 | if (LProject.Save(True, True)) and (FUseBoss) then 124 | begin 125 | LBoss := THorseBossInitializer.Create(LProject, FMiddlewares); 126 | try 127 | LBoss.Generate; 128 | LBoss.Wait; 129 | finally 130 | LBoss.Free; 131 | end; 132 | end; 133 | end; 134 | 135 | class procedure THorseNewProject.Framework(const AValue: THorseFramework); 136 | begin 137 | FFramework := AValue; 138 | end; 139 | 140 | class function THorseNewProject.GetCreator(const APlatform: THorsePlatform; const AFramework: THorseFramework; const APort: Integer): IOTACreator; 141 | begin 142 | if AFramework = hfApache then 143 | Result := THorseNewProjectCreatorApache.New(APlatform, AFramework, APort) 144 | else if AFramework = hfVcl then 145 | Result := THorseNewProjectCreatorVcl.New(APlatform, AFramework, APort) 146 | else if AFramework = hfWinSvc then 147 | Result := THorseNewProjectCreatorWinSvc.New(APlatform, AFramework, APort) 148 | else 149 | Result := THorseNewProjectCreator.New(APlatform, AFramework, APort); 150 | end; 151 | 152 | class procedure THorseNewProject.Middlewares(const AValue: TList); 153 | begin 154 | FMiddlewares := AValue; 155 | end; 156 | 157 | class procedure THorseNewProject.&Platform(const AValue: THorsePlatform); 158 | begin 159 | FPlatform := AValue; 160 | end; 161 | 162 | class procedure THorseNewProject.Port(const AValue: Integer); 163 | begin 164 | FPort := AValue; 165 | end; 166 | 167 | class procedure THorseNewProject.UseBoss(const AValue: Boolean); 168 | begin 169 | FUseBoss := AValue; 170 | end; 171 | 172 | end. 173 | -------------------------------------------------------------------------------- /src/Horse.Registration.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Registration; 2 | 3 | interface 4 | 5 | uses ToolsApi, DesignIntf, System.SysUtils, Horse.NewController.Wizard, Horse.NewController.Binding, 6 | Horse.NewProject.Wizard; 7 | 8 | procedure register; 9 | 10 | implementation 11 | 12 | procedure Register; 13 | begin 14 | ForceDemandLoadState(dlDisable); 15 | RegisterPackageWizard(THorseNewProjectWizard.New); 16 | RegisterPackageWizard(THorseNewControllerWizard.New); 17 | RegisterNewControllerBinding; 18 | end; 19 | 20 | end. 21 | -------------------------------------------------------------------------------- /src/Horse.Splash.Registration.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Splash.Registration; 2 | 3 | interface 4 | 5 | uses Winapi.Windows; 6 | 7 | var 8 | bmSplashScreen: HBITMAP; 9 | 10 | implementation 11 | 12 | uses ToolsAPI, System.SysUtils, Vcl.Dialogs; 13 | 14 | resourcestring 15 | resPackageName = 'Horse'; 16 | resLicense = 'MIT License'; 17 | 18 | initialization 19 | bmSplashScreen := LoadBitmap(HInstance, 'HashloadSplash'); 20 | (SplashScreenServices as IOTASplashScreenServices).AddPluginBitmap(resPackageName, bmSplashScreen); 21 | 22 | end. 23 | -------------------------------------------------------------------------------- /src/Horse.Views.Boss.dfm: -------------------------------------------------------------------------------- 1 | object FrmBoss: TFrmBoss 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu, biMaximize] 5 | BorderStyle = bsNone 6 | Caption = 'Boss' 7 | ClientHeight = 400 8 | ClientWidth = 700 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -11 13 | Font.Name = 'Tahoma' 14 | Font.Style = [] 15 | OldCreateOrder = False 16 | Position = poMainFormCenter 17 | Visible = True 18 | PixelsPerInch = 96 19 | TextHeight = 13 20 | object MemoOut: TMemo 21 | Left = 0 22 | Top = 0 23 | Width = 700 24 | Height = 400 25 | Align = alClient 26 | Color = 986895 27 | Font.Charset = ANSI_CHARSET 28 | Font.Color = 15790320 29 | Font.Height = -13 30 | Font.Name = 'Script' 31 | Font.Style = [] 32 | ParentFont = False 33 | TabOrder = 0 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /src/Horse.Views.Boss.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Views.Boss; 2 | 3 | interface 4 | 5 | uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 6 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 7 | 8 | type 9 | TFrmBoss = class(TForm) 10 | MemoOut: TMemo; 11 | public 12 | procedure AppendText(const AText: string); 13 | end; 14 | 15 | implementation 16 | 17 | {$R *.dfm} 18 | 19 | procedure TFrmBoss.AppendText(const AText: string); 20 | begin 21 | TThread.Synchronize(nil, 22 | procedure 23 | begin 24 | MemoOut.Lines.Append(AText); 25 | end); 26 | end; 27 | 28 | end. 29 | -------------------------------------------------------------------------------- /src/Horse.Views.Wizard.dfm: -------------------------------------------------------------------------------- 1 | object FrmNewProject: TFrmNewProject 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'New project' 6 | ClientHeight = 546 7 | ClientWidth = 441 8 | Color = clBtnFace 9 | Constraints.MinHeight = 145 10 | Constraints.MinWidth = 250 11 | Font.Charset = DEFAULT_CHARSET 12 | Font.Color = clWindowText 13 | Font.Height = -11 14 | Font.Name = 'Tahoma' 15 | Font.Style = [] 16 | OldCreateOrder = False 17 | Position = poMainFormCenter 18 | PixelsPerInch = 96 19 | TextHeight = 13 20 | object pnlContent: TPanel 21 | Left = 0 22 | Top = 0 23 | Width = 441 24 | Height = 546 25 | Align = alClient 26 | Color = clWhite 27 | ParentBackground = False 28 | TabOrder = 0 29 | DesignSize = ( 30 | 441 31 | 546) 32 | object imgHeader: TImage 33 | Left = 22 34 | Top = 12 35 | Width = 398 36 | Height = 134 37 | Anchors = [akLeft, akTop, akRight] 38 | AutoSize = True 39 | Picture.Data = { 40 | 0954506E67496D61676589504E470D0A1A0A0000000D494844520000018E0000 41 | 00860806000000CA206DA5000000017352474200AECE1CE90000000467414D41 42 | 0000B18F0BFC6105000000097048597300000EC300000EC301C76FA86400002D 43 | 264944415478DAED9D0B541457BAEFFFE7E60AC7E0230F8DC90575A51317A883 44 | 8FC1233E2E3EC6D611CC04650811D00163448D30198C06C6070EF808243E0714 45 | ED8408477C8428912488493AA3C2324AA21395516125D3B9519848F44451192F 46 | 70987B773D1AFA51555DD574374ABEDF5A33C1EEEA5D55BB767DFFFDF8BE6FFF 47 | DBFF63802008822054F26F241C04411084164838088220084D9070100441109A 48 | 20E1200882203441C24110044168828483200882D0040907E126EA51FCFA22AC 49 | A9E4FE0E45E189040CD7F2F3EB657825D2800AEEEFE80C542D0AECEC1B220842 50 | 8484837013241C04D15521E120DC0409074174554838083741C241105D15120E 51 | C24D907010445785848370131E168ED65B30551A71E088119517EA616A103EEE 52 | 39A01F82C787237EA61EC39FECA6F29C13B0E3B3648478091FDFA82A43FE7B45 53 | 28AEB8853BDC07BD83B0257F15F48F393E3F7A3F82C14FF6C788C9633165FC58 54 | 040F78C4C17DD4E3FCA765D8673C818A33E6F3B132868DC2EC17231111D8CF33 55 | 8F8F201420E120DC84E784E3CEA5BD484E3D88CA06A502BB61F07309D8B2540F 56 | DF871C9DD31FE9073311F1D82D54EC4C4572513D9AAC0ED4E39DBF2C41B0584E 57 | D37725487D351F46C5F30BE85ECA44519C3FBC9DBC8F9EA32291B72E1683BB3B 58 | F75408C2159070106EC233C2D15465405462194CFCBFBAA1CFB8B148D04F80AE 59 | 37F7EF46D45D2847F1E1B3382F1A63EF71092859172A2D1E6DE7EC87157B3661 60 | C89144CCD97F8B2F77F8B489087E4A1CB1741F86E8E831E8C3FDDD508E9417B7 61 | E0C83DE1FCC1E1518898F0341E3797D9FC23AA4F9F42F1F12A360AF1C38A7DD9 62 | 88F6757C1F56E5B0322A0EED46C19916E11E9E0D475E6E3C867B75F633267EAE 63 | 9070106EC203C26169B4BBFB6345CE6A443FEB637F5C6B3D2A7252F14AF12DFE 64 | 9FBA05992899E3AF78CE88283D2A8B8CB811C88C742633D23DA42FB3AE2409D3 65 | 37D7B2BF1E415C4E0E9605FA408E3B75F5F0F2ED673FDAB8771A1B666561BF78 66 | 1FE9796CB463272E8D301D5A8BA83FD7F0A31FD97B20080F40C241B809F70BC7 67 | E58239887AB7115C0F3DFACDDD58112C6FB439F128FEA3F97AC4A9A8BE0AE7E4 68 | 18C0AEDBC0AE5B615AE8FCCE596C54C215198B124324744ED4D4E5C279887A9B 69 | 13351FC46DDD85652365EEA3B516FB1393B0E112F78F206C295D057D0F0D2722 70 | 081741C241B8094BE1E82052C2D1CC7AE9CF8BBDF421F1389A1B0E5F07C5349D 71 | D982F1AF95F33DF6C1BFCF46D16FFDAC0FB0120E1F24190A91E0A053DF261C18 72 | 831D475310A275EDA1B50A1B67A4A140E57DDC284BC5E4CC1AFEEFB0F442644D 73 | F251751A827025241C849B70B3705C3260D4E23279119082139BA94C6CB8BF83 74 | 1370ECCD50619DC28CA570A81C41DC39BE0EE3D69CE5FFF61E178B3D2B233158 75 | CB28E0DB7C4C9F5F823AB5F76171BC775C06CEBC446ECA84E721E120DC84A570 76 | F8212C2E102A4C7B3B774C282DAEE10DA49470DCF894F5BCD70B3DEFE8378BB0 77 | 22B89B8A421D4C9F5908876AA3CC4D81AD4AC29A2F84856B74F741C8CC582C54 78 | E3FE6B731F715B3FC0B2910E7E60296EE12938B3748CA4871641B813120EC24D 79 | B8778DA3EEE3D730FD2DC107292E87195C951DEFCAEDB3F07211F797C43A87C5 80 | 394352776247A8CA9889D65A1CD9BC0E691F5BBBEDF61C12848573631011AC43 81 | 4F191760CBA927CD488D9A08C2039070106EC2BDC2D1BEB6A04D38DA7FE742E1 82 | 1069BA761607F2F2B1EBD35A2170CF4C6F3F442F4E46D2347B01B1BC0FCD9070 83 | 109D040907E126DC2B1C963DF54E1F71D8D25C8FF39F1FC4AEBC13A8B8DED2F6 84 | 31B706529416099DC502BAE5C829FA8D42240DD5709E87BCD0B3879A293A8270 85 | 2D241C849B70B370B8798DA343C261799D67F2919A51D2160DEECBEEA584DD8B 86 | 795DC24A00D5AC7110C47D000907E126DC1CC761E15DE4BB201347D504C3597A 87 | 558D8CC7D1AD36AEAF6E100E9E7B55D8989086822BDC3FACF36039E51D46109D 88 | 0C0907E126DC2C1CAD3530C4A422FB1AFBDB3F1225B9B1D03DA45CA4651C87A4 89 | D8B84B3860392565334566198FA2F23E08A2B321E120DC84FB23C74D879210FE 90 | 672EDD473784A51B90354921F3AC55E4B84CCE280F0947D6079908B3C8AC6B19 91 | 011F929AEDD2F312843B20E120DC84077255594E0175D721697306128648E5AA 92 | BA858A9CE4F65C557119287A29D03EFEC15DC271F72C362E5E275CA75474B865 93 | AE2A3C8288D4D558364DDE855748E17E15DEE3021D46CB13843B20E120DC8487 94 | B2E3D6E463FEAB25382F66A71D3C250CB3F5CCA08A6B08FF55578E8FF79C6AF3 95 | 6E52971D57BD709C2F9887F5DF0C4388AE3F9E19C665B3F542DF813AF46DAEC5 96 | A51FEAF9ECBC078ACEE2B2280A728910B9ECB873979789C7B1EBECEB8F88B051 97 | 1831AC3D436E757535CE9D3C8B8A6F1BD1E44C9D12848B20E120DC84073772AA 98 | 33624D9A01C5DFB62814A8653F0E0DC2A1360EA37B3F36924847FA24F9329BBE 99 | 2BC38675BB1DDC87B93C56A747493888CE81848370139EDE01B011A6CA329B1D 100 | F8BAA1CFB3FD317ABC1E31615A7600D43055D56042E517A7F0F9C90A9CFBE12E 101 | 4CFC684084DBB96FD03308D18723624AFB2848F93E5A5077C988E20F8DA8F8FA 102 | 2A2EB7C58170F7F218460C0D41C884B1983A52612A8B20DC0C0907411004A109 103 | 120E8220084213241C04411084264838088220084D9070100441109A20E12008 104 | 82203441C24110044168828483200882D0040907411004A109120E8220084213 105 | 241C04411084264838088220084D9070100441109A20E1200882203441C24110 106 | 044168828483200882D0040907411004A109120E8220084213241C0441108426 107 | 4838088220084D9070100441109A20E1200882203441C24110F70BD7CBF04AE4 108 | 09E80F6622A26F675F0CE1143F9367E832E138BF7316E6EC57776C5CCE075816 109 | D8D9B7DE05A92BC1CB8BCB1196BB0911BE2E2EFAE3D7F0827102DEDF1A0E1717 110 | 4D9879D08C4EF3596C8CCC02D2F762D9C86E0F4ED9EE44F619B6A0727B2C9291 111 | 82634B82E0DDD9D7D9415C2B1C4DC9F8223EC8E1B15E3D7CE0FD5027DDF1D7DB 112 | F1CAB548EC08EDD74917E046AA0C084C2C738B300B1D8350149E48C0F0CEBE4F 113 | 17C389E2FE819B3ABF33F3A009077FBD062075A7EBDF277796EDF63A917A86F5 114 | 287E7D11D62001C7DE0C459F0E9F8895F787123CB3B573DE47D70A073250B5A8 115 | B3DF3E653823B1FEA1D71FACC6A8FAE6B811C72944E46522CCC586871F719CD4 116 | E3C3375CD1E8EF2F2AB7CF42C584FB6014FCA009073F2AC88177A6014943DC31 117 | E27053D9EEC4C1886343F7D5287A29B0E3238E56563FBF3A8BA99DD491FB9909 118 | 470B2A364761FFE007AC1743B8915AEC4F48425D120907E1023CF50CAF1C44D4 119 | DC9FB09284C30334D7A020311595B3483808910623D63CBF1D3DEF877537128E 120 | 071F0F3DC33BC7B3306ECDA39D36757C5F0847D3B51A7C5E79049F955E4065CD 121 | 2DDCE13EECFD088283F55890108B60B90770B716151FE5A3C0588D73DF36A289 122 | FBACBB0F060FD061C4E4B19831598FE14FB261EEDDB3C84EDD82822AF1185B82 123 | 5D35EF2870A3AA0CF9EF95A0E2423D4C0DE2350D0DC08CE805983DB29FCCFA4E 124 | 15364EDC0B1DD7E01E6B84A9F230761D32A2E28C757DC4CD9D8990013ED22796 125 | 6DB4526557E0CB8BF5B8714FBCBE5163313B261611431E91BEA7B2544C3E3651 126 | B19EEE5C2947F19E12947E7D1597AFB7B04FBA41E71F80901763B170923F7ACA 127 | AC6B716D67D74041CCA5CAE8F32CABBBC817103F2D107DE4D6C65A6FC1F4F529 128 | 947EC2EACCF6B731F1ECFC3AEBF3D795213975378C575AA4CB8B966ECBE6EB2B 129 | AE3409CF564D3B3573D7842345FB507C8CB5F32BEDD737F5F970243C17843E3F 130 | B9D6E8F0CFECFB58FE3EB8EBDE6FD887FD678467EEDDB71F42F4914898A3C7E0 131 | 1EE6F65385E243EFA3E048557BBB65ED223E3E1E61CF4AB539AE5DA50112A26B 132 | 796E73B9074E56E3B258DF3DD93B1A12168EDFCF9C00DFEED054B6657BB95155 133 | 0243FE617C2CBE2742B931581E15D4D6568467F63EF22B6A85F6AEE699B5B6A0 134 | EEDB13282F2DC7075FDB5EB775F956280887928DB4B319FCB9FA61484020A64C 135 | 0EC573C142FBAD2B4BC32BB9556DC7D8E229C7A3CE178EBA12CC89D90B4C0B43 136 | 0433F6C143FDD08BFB9CBD649F1DCEC786A29F303B278755864DC3BDC61E50BC 137 | 01E786EAB1ECB7133062900E7DBD80DBD7AA613255E1E35266400625E2D8AB63 138 | E0CD1AC19DBBCDEC474C409EDF02D3EF37618BDE62C4F190177AF670C13C6A6B 139 | 3D8C6FA522F9B837C2E22211333E10BADE3DD0D460C297274B905F7016B5C1F1 140 | 284C0D87CEEE65E15E94B5F0CEC9C633079390563B0C4931A1181D1000BF1EDC 141 | 7D9D45E5B1126CDC7F15BA056B9137C7DF7E9E545138D84BB87527744549D8F0 142 | A37CD92352B3254763CAC2D188CB856998FB36FB7DF43CC44D0EC488271FE585 143 | FDDC05230A728D38D7578F2D6F2D41C863726D67158E0E7C1FE1DB6E610AABBB 144 | 885F0660886D19431350B22E14BE762F6C0B2AB7C56249850E1173F5983152A8 145 | 77F6635CBF684476EE4154F8D9FCD6DC26589D25CF67A2FA462192865A14E9E5 146 | 839EDDADEFD1549285399BAB3184DDE382B05F6208FF6CABF1D97B6F63D3C74D 147 | 98BD95B5D391D2A2DE5465C0DCE565A8E5DBAB5E6CE737517BB10AA51FED45F1 148 | 8F1390BBAA3F76C5BB5838CA27A270F2292CCE6944C4E270CC1816C49E39AB97 149 | 2B5530E61B90FD4D00B2F23230E51ABBBE95E5E813168B68F1F971F756FED13E 150 | F977D09170B0F65232F72A92138DE8CBB58BF1FEAC53C73A4ECDCC385E38857D 151 | FB4A70A4598F4203EB354BBE0FF2C231DF2B0579C8C7E2937E5818138E9061DC 152 | FBCFD5E7591CC8DB8B5284212F371E7D8EA7E1859C9B08890E6F7B1F6F5F3B05 153 | E39EBDD878A61FD2F3595D3F695F77752549989E0784CD0CC373E3C5F6CCB8CD 154 | 09F0AEDD286890B96ECDC2D1C83E4FC49CC382CD686BF75C1D7D6FC2A5F2721C 155 | 387E13B373B311CDB933DE6BC41DD66C6B8D6988FAB31F767C98801196CDD643 156 | 8E479D2F1C8C265611DE5ED2DF5D2E9C87A893337134D7D20DF4168EAC99873F 157 | 3FB10A254AAE6DADEC7F5695283446935B3C35C406707218766C4B963490DCC8 158 | 67E3E27538C08CD851BB4566E1DA2A06B01EFFF844142E0892ECA1DFF9DA8039 159 | 7F3022F8CDDD58116CF3223B108EE2DEDDD0372C45B6ECA6CA2D18FFFA4D647C 160 | 9881B0DED6DF2909471DFB2E7C1BF05AEE6A443F2D61385B6B51BC6A29D6D4B2 161 | 972D8FBD6C36CF9A6F3B47BAA1676F262EB90908EE615F04EE9DC6865959B8BE 162 | 7C37B64C91181535B31EA1978CF8379423E5C51CF45EB7172B46D91C237AEFE8 163 | 1CF4D46E7C9A8AE9EBEB65C5C15C07197B241C13B873CC35A06E66068A16492F 164 | 8CD67D9C8A174A1BE177C907B35D291CDB4CE8E9AB476E8E8491631D9DE23F2E 165 | C286870231FAEB6684E4650AC6C906D3A124841705A1685F3C064BBC4FB2C2C1 166 | 9DDB4B8765B999D2EEE1AC5DEC4F4C42C1984C1C8DF3B7F9525938B8F6D267E8 167 | 3C144A7524EEB1F72C7E1DCEB1DEFA9DEA7E5891B744A24D35A262F33CBCD290 168 | 802FD2F5E869776D2D686223424923DC5A03437C2ACA23B35118EE67FFACB508 169 | 474D3EA6275423E13D690113CE071B3B26D66FA6EEE73D55A588F8209EFB80BD 170 | 906DC6586854CD9B3E6086404B616E148E6FF3113EFF0466E4ED46C2B30AC75D 171 | 398839738B306493AD1113AEADE0C95014EEB137AE965C2E9883A8D32FD88829 172 | 1C0A47C193E1122FBF25C2427145E46EEC98666D9C65854334CA4835206BD223 173 | 904534FC9716DBBF6C82ABAF0F920C8548F0972FC2746811C2CF84E398139E5D 174 | E77746B15EEA6A9C79C9A67DAA118E6676EDCFB36B5FC0AEFDB77E3207B1BA5B 175 | 9C844DC33370C6E61D109ED74C94E44442275BF7A2BB66A53FD25D291C992644 176 | 6F92104C11AEB330EAF572F8BE2465BC45EEB2673CC38067F20A6DDAB603E1C8 177 | AC813E4D46E82DCFBFC60785476D0DA003E1D8EF8715FBB225858E836F2B7FAE 178 | 573E3F7B67A7CFAFC5B2D255D0F78026CCA339BBB6A85138F8724AC7E2688EB6 179 | F828120E87483520E12533E83250B2488B6B9BFB8483334C734CF354AC95089E 180 | 5DAF200567968EB1B876E1DA8C0BD80B3CC75FF9647C833F8DB83D3B113DC0E2 181 | 7307C2A1A66CCE35F5E587EC9FA39C70083D4BD6804B5903763044E65FE64FF4 182 | 283130036A5577ACED1C63A2F61E1335A502BEDE8EC03F7473EA6591153E15C2 183 | 71E7F83A8C5BD38C2C899198DD39B8BAB03482ADACEE67A4A16EB9B2016DFB7D 184 | 265C2C1CFDB0E333360296EB88F0DE394508C92D42D210B992AA903D3D0D4D6F 185 | D9D69123E1E8812D8E8CF2B512BCFCE22984C94DAFCA09C75F63EDDA91258220 186 | D623CBAAC36903B7A634CBC9A9413E660AF66D51EB888395332AD184151AAFA1 187 | 6B09879AC871CD0BD1D20D889B338E4A34A2675C0AB6C605C92F9A4A94E57AE1 188 | E0827116E14048368A647BA4ED70D31E9337DB1818F3B5ADB4EFEDDBC1FB70AF 189 | C3F5F442D6CBB7983671201C76C74B20D7019033BCBCD034D98AA00C97D84BB2 190 | D8840C9B97993FE78FC9F8226D82FD9481D56DC8BCAC2AE88870F0F7F84D3C8E 191 | 3A8A9AE705BD1A0996F5CF1BC6324CB1157985FAD16A4414EFF983518A06569D 192 | 1790D051334EB67D6F1C08477E80E3CE80A3753939E1F8A78336A7AAADC89FC3 193 | 21AE120E6EBA705512D6D406217D4D22229EF55173F62E261C6A22C7A516A2CD 194 | 1E0CC6D3F8FC7C2D6EDFFBA9CD8BC18C94B740D37765D8B06E378AEBBC103233 195 | 160B7FA3C7705FA5456E7709877AC32C1CCE353A934D6F484B2316A7946CDD8A 196 | 9D78096DD1261CE2C86F988A5152DBF5EDC6609BDEADEAD1AA2363D06042E517 197 | A7F0F9C90A9CFB919DEE8AE8356646AAD3E25038C429249D8AEBE3CBDA8B1196 198 | 533AFC35FFE8B8E7ADF8FC9C438D279C5B85C3D1B915CFEF40381CB517570847 199 | 733D2E5754A0F4F4297CF97D239AAED5DB783385765C38385A6FA1B2702D92DF 200 | 35014382B0706E0C668CD2A18FC27475D7120E27A6AA9ABE2B41EAABF9A8F0F2 201 | C394C9133131F8693CFD94E0ED2320784279294D2588EE76BB3EAD45735F7F24 202 | 2C4D4474B09FC402B07B854375CF45140EEB29092D65C8BCC89D241CF6064506 203 | 1923DD61E1602F5EC5CE542417FD04DF90B188181F84003F3F3CC379F08887F0 204 | 5E28957AE785A352C57315B1EAE46819259170A82ADBFDC2D1EE41E71D380C33 205 | A68E41886F7FF80D123D3E392E1A30EE8F3EAE110E334CA8CE7F7E10BBF24EA0 206 | E23A303C3C16CBE78663B8C473F9790B07EF52BB1B589089AC993A193F7F0D06 207 | 951990CBC7F762D33639F74F1A7174BD11878537DBE66484C8183FE7A7AA847B 208 | 3C126CE3C2AD80954B247FCD2D78E72F4B10EC683A95844355D9EE168E362FC1 209 | 9CD588969B3A72D554950C4DD7CEE280E16D647FFE1342966622335C67352DF7 210 | B3168EF3EF4661CE57B1F6DE4196701E2D53B314471C7698DD3F6FD996DDB5D6 211 | 389ADF2CC28A608BA9398F0B870BD7389C150E7E817337FC143C8738F885F9CA 212 | 70278443746678D849C70FA9750F571CAB02120E6784437004A894F0FEB34458 213 | 7C77F188438236F77B9BF6FD33160E9573C7BC9F7309F45A17B0786F9133363E 214 | F1EEF3AABA5C380751275F5016411E65AFAA03D1F6EE9CD2752261603A413878 215 | 8FA34C1FBCF3613282BD94CB56F4AA72563824A7FD6C11E27E52EE39B3C6A172 216 | 91590EB1E3035B919740F0DEBAEB5AAF2A120E6DC2A132AE8777B17E7782DB85 217 | 43AEE3F233168E461833E620F9F155A85A12247B0C1FA453D2A23D945ED2CDAF 218 | 06861753712EDE0D711C7C04FCFB1891B39B5DA78281E8701C875827DFC46A8E 219 | E370877098631C6A5F7550A78EE2389C150EBE975E8584F736C90750F175BE17 220 | E7A516C7F918852DE8AB54377CAC8A017DDFD8251B192E8F10D5FEF24F328166 221 | 6D88E276DCC5711C241CDA84C3DC1EB6B2CF46CAFC4C6CCBFBEFB96871DC0152 222 | 2EF24227E3899FA3708861FDB93AECF820192112F96AB868DAF0F7EAE17BE516 223 | 422C1FEEBD5BB8E3F5886CEEA3F6796FD6BBDD136BD14B14C5AA7589E24B2CB8 224 | 1607A9F38469A305E7DF4DC09C6301D8F2560AF452464C75E4F852D908E31B6C 225 | 883CFFF50BD0E74AA49BEE0CE1801855BDB90509DB3290E0EF64E4B8B3C2E128 226 | 388FAFF32C54C00BA6A76225AE5FE84C14872904C0A17DDE7B455EA6F2265912 227 | 51BEE6CE422F99742EE6F25F286D81AEAA1B222447920698D4C4F8A87C66D665 228 | 9370B49F430CE41C94829352D3AF625B2EA8F581E9CAD80E0A470BEE34003D7B 229 | 2B7434C575E0BE2B77233DC4E2DDE23B4C464438089A75179DBB38DE5C85ECF9 230 | 69608F18CBE263A11FE5875E5C8E966F6AF0D9A1DD38706B2233C2A1A84D7DCD 231 | 3AED35D728969723645A28F46302F08C9F9F9883A61AB5B5D5283E588223DFE9 232 | B042220546D32503A21673F11F89C8F84D109FDFAAA9A11E4D4FEAE0CB1B34D6 233 | F3FB23EBF9B53A91F8D0ECDDF3D15D8C9E6999F3476DAE2A219FD490C3495877 234 | 77A2454E23219F54F987FBF89C4833D233913E49C200759270587AA1E8A68523 235 | E6F9B118CD793469CA55E5BC5795900EC48480A87948FA8D90438A6B0BE7FF5A 236 | C6EAFC027C176762E59325987C28405EF8D6D763C6D2A54898A413EBBB1EBDFC 237 | 75169D8B465CDE9F86F93BAF6248781422260462F820F3B3E1DADD77F8DC7818 238 | C5035324A71A6F546EC72B6B4E00E3C2113F4BAC1F0839A32A3E38885DDFFF12 239 | B93961B8F46A0EBCD7DB3C3F7E6DC888D939459A46DD241CCE2D8E0B36A20C08 240 | 89C4C2B9131122BEC3972F96B3B67C02B77FBD143BC26A994197486BAE493884 241 | 7ADD78270811D32D3CB7F83C55B5F8FB9923C83E5C835EA129C84B1C6313AB56 242 | CFEC5412526A83B0E2F5583C3780CBA57513B53FF5C0E0A71DAC91BA804E77C7 243 | E502602A8BDE46F6A10B386F95D1D49C515518259C9B65F170B94CA895461C38 244 | C20C52F54F622654C09C8D3578861EB3A74C804E66B470E3EB7CACCF31A282CF 245 | A8CB9D6F2232B631A3C61D2F2E3C9F5BAABC38A6C49D1A2376ED39689D1D7754 246 | 1066CD8C41F428B9E91C8B463C443E3BAE6246CF4E130E01DE13246F9F7576DC 247 | 51C3A00F8B41FC249D6276DC8EC671DCF996D579FE5E1457D8D4D7FC28047319 248 | 92B91E9AA11F0AE584AFCC800DFB4EB565ADD58D8AC2964DF66B1ADC3D16EF2B 249 | B1CA98CA9D6BF0A06710A20F47C49440B10322F57C6CB3C4DA66FEE5DAFA5ADC 250 | 5E6CFDFCB84DB4A6E7F8A95A47D2FACC483864DE8BEB675160C86FCFA86BCE14 251 | 3C371661FE8F88535AD588E9E05455D3B52A941E611DDDD37FC72573667008D9 252 | 8B478C1C83B0E7431111286333EE99509CBB1D05C72D3235C7ADC63BBFD5BC12 253 | A71997094797815F543F81590A7970DC4307A258892E8CB0389AFC500A4EBEAA 254 | C2738D203C0009870DFCA2D3912097EECFA10E120E420A6E0D66356EAFD2364D 255 | 4510EE8484C306CE83E14080E38474AE8784839080F30E7CF5265E53CC6A4C10 256 | 9E8584C30AD6BB9B7B04C3F3B4CD25BB860E0887A7B61CE572EA14E558AD47E9 257 | FC2762D966717D887039DC08787143BCD3EB6D5A50BD2EE1044DDF19919DD7BE 258 | 06C5CFE147BFEE91F978C2F59070DC37DCEFC2710BC68C04247F138415AFBE80 259 | A983C49DDCBE6981EF387F0F4FEB11EEC06DC2C1EF5573043DE312B0F2D763C5 260 | 5D27AB51DB3D00C103B4C6C510F703241CF70DF7B970F0018E46CCD893ED383D 261 | 38F140E21EE110B7F56D5D2A1D17413C909070DC37DCDFC2C13B0DE4FA39DE5F 262 | 817860718F700801967F5FAC320128F14040C2D115F08070B873FE9BB83F70CF 263 | 3326A78FAE08094757C003C2C107A195EB4938BA306E110E31A09684A36B41C2 264 | A109154912C53DA6BF5CA090629D37F446E8A512F3DDAD45C547F9283872C122 265 | 8A791822A217204E2EEADC52381EABC7F94F0F22FFE02931325EF060E1A29AE3 266 | 7F1B2AB9298C2C7546A46C3E882F2FDAECA427D29E7892EB55EE854E14AE1B67 267 | F2B17EDB1118C5C8EA9EE129F864E998F6F41DE61D1F4BCBAD22B07B0ED02124 268 | 2C06CBA364B602E6EFF32A1672D1BA5C3D1D3220FBA36A214ADD1CD91B1F8F30 269 | F31E0AAD625DEC3B215E8B392B413C162A44B25BFDB6AD1E157ECB4711E7A0AF 270 | 524A1031DF949F52965C7EFFE9166C97D8BB43D8ACACC43A2ADF3F00212F9A33 271 | 2C4817C98BC1F7B142B4F25D138A0D5B90FDA9391ADA0F2B0CED6B560E85E31E 272 | 7BCE096BF1E5E4D5D8F352A0C27A4523CE176661FD27D5763B79F248259B34D7 273 | F70767505963E1793532A43DFA5FBAD2B4B53DC225907068E4FCCE28CCF93151 274 | 7E7F6CFEE52F43D39078D914EB72EB05E6DD102B07E9B12C3A141344CFA54B5F 275 | BC8F4DB9A7D13473150A1704D91B09B370E4C7A26EDD5A540C0CC36CFD5831CF 276 | D54DD45EAC42E9A1DD2838E38308B93C575230037FE76E33FF27BF835EC55814 277 | A587C22C87ED1B16995FDED578E65022E67FF50C92625EE0738F793798F0F7D6 278 | FE08B6C89FC327B7CC03C26686E1B9F1423E2F8EDBCC38EEDFC5AEB3418F4203 279 | 1307DB7C5EE6FBCC99888A95BB71276C1EE22CF3811DCBC7BA77AF22382D1B5B 280 | C6FD88ECC4B5287E6222927E23E6FCE2EAF24C19B2B719716766866C2249FC74 281 | 1A1B976FC6010C6BBB0FBE1ECF18B1695B09CE0D8D47C93AF66CDB9E83E30DAD 282 | 8434D835F08E908F00E753F39B126CDA5623FB3C0D73DFBE8A11D1EDF70B9579 283 | C0DA8463662D9F2CAF79E63C2C08E3F279B5A0F69B9BE835AC3D458AA27030D1 284 | E0EAD3F81FABE5EBCDB22DDF6D443397F051DCC1136F142269A8F8A5EDF6D1D7 285 | CAB166F916947A05B1FA0E47C8301DFA7AB5E7F192DBCC48405BDB235C030987 286 | 46840D5C801D9F25234422D683139614E831617F159E964C5B22A69078D866DF 287 | 0DCE28CE35A04E4E1CCCBB252ECDC68E6936865FDCEBBA6E40337C631432B072 288 | D986DF6AC46B4E784629F746B997772D9AA327A2F27B3FECB032AA123041E27A 289 | F0DE52C7B4B2515D7C2ACA23257285893B089EEBFD1822D66F62BD7BFBC556EE 290 | 1EA7E700FA9126348DD98C1D52F10F7CB6DAC398209559544CBC59E0672B0E22 291 | 7CAF3B0D159399F058F4BAE5F61A111084A552178AEF0EB3FA97CC3925BDAB63 292 | DB6E7412093B85FA52CE3C2C3C371DE2700A88CE514C0B2FFB8CD968A0785512 293 | 367ACDC3FB69A1CACF56B26D28AC7198EB739454223F01F36646BE2B25DABED6 294 | B647B804120EAD284D4BF0D35459E8B52D07BAF7E6A1F83FA4A6B484E9AE1B4B 295 | 2DA72CC43D1BAAA35092C30C8F4CC317D2D007A2B0941908CB63C469908A6047 296 | 197D0503B6C1577BDE23C7C2C18C2D0291F56106C27A77AC8AF97395B373BD21 297 | BDE9D2970ABD76F3C649FB9F0C47916CB4B5903873A3CE7E84E028D53F47D399 298 | 2D18FF5A3D5658AE2929EDDEC75FF7293CF7612C6A1364D287F0ED6A1F46ECD9 299 | D92EEAFC3E204C05530DC89AA4D06B56D8EBC43CD2F17D49396DBCEC33E6323E 300 | E72423F91A6B9BEBB48A0687B2705C2E9C87A84F26A2285F3932DE742809E16F 301 | EB24123DBAB6ED11EA20E1D08CBCD1E1A7A9960379CCB0FB7E2A6368F9248ACC 302 | C058EEF5216E1ED39CE620D589CC9EDD66830A153B1B3A1A31C9A146380E44B8 303 | 28119FE27ECE0ED609C49EFBA6316C44F792FC6A2CBF6D71F36A9B0CABEAF6E6 304 | 30AF6399965A6EF32BEF766A5977756C443A1FABED52AFF3CF65F3A356D397FC 305 | EFB6E9EC3B0A12C88D7804E168C40A15493BED9FB1B0AFCDFCAFC6222F4762EA 306 | 50DDC394170E733D3ADA048C4376274517B73D4215241C4E20B795E8794BA3C0 307 | 07CC9DB2DB9447D2007FBD1D817F30215D69173B1E99C57995DB5DF2F03B23BE 308 | 8FD17985487856E33D3B100E55FBA5AB4151384A1062D92BB7432E05B88AFBE1 309 | EB261F014ABBBFF1881B823D619D229B5FFFFAE7529B2D81ADAF871FADACF2E1 310 | 3B179662705E42505CB19F7B9BF81C75BC539C6D9DF0D364FB74C833382B1AFC 311 | C394170EBEBECB3045F1799A11F6C9491B64DB217071DB235441C2E10C52FB99 312 | F33BD16D86D75BE669086127B12F232D471182C1310CB5F6B852BF7FB0CC22AC 313 | 16775CB1E7E6A5D13D528D706872B96CAEC7E58A0A949E3E852FBF6F44D33571 314 | EF9236B46DCB695B474E0987AAFDCB05F8BD157E4CB65AC8E6470D6B7CAC4708 315 | B61D08BE9DE4A0CF36CBF515A9E94BC70BEE56C88C46B5B8D85A1EDBC4894666 316 | 0D66BC5188F4711D09DC53681B7C7DFFA87AA74DBECEBF4FB099C2A43891CE80 317 | 84C329ECA725A47A92FCF4C185C8F66D6AF9A1F95AE02DEB396EF33CB46AA26D 318 | 36B1D114C7E1DC8BE63AE168DF2DD03B7018664CB5D8F9CC7CC84503C6FDD1A7 319 | 9384A34C7DA5D8AE29F1538E063C63319AE3D74C4E86591C273847AC7FDC623A 320 | 4CF2BED4DD8775DDD88F3A9D118E92B95791BCDC841193D8355C1C2BEDE1A61A 321 | 47C2E168B3A57678E130D9AEE391707406241C4E623D2D21E6E3F1B699BBB65D 322 | CFE017506F62A5CDFA02FFC27E32CACAD555112F1FF4B47C911FA011479B9750 323 | CE6A443F2BD393559CAA72B7703462C7870918A1A6526CDD4AC5731F08368F28 324 | 855167C5F3D6D762BB9EC1BB67EF0BB099FAECA411477E3D743D0290B43E05FA 325 | BEECFA1393B0E9A9641C93733F77088D38BA22241C4E62F5F2CB8C24CC0BB5E7 326 | 628491093F02B918631703222C58FBA8EE79D921B7682E85A679E5765C231C55 327 | C89E9E86CAC5CADBF2CAD687BB85436A0A522356CF58EE7A79F1CE411F7E6422 328 | 8E409EB0170897AD7168128EFE78276F0982CD86DCEC06FE6AB6BA918F1D9E59 329 | E320E1F02C241CCE62E93ED9D0EE4D65EBFDC21B92EFE3D9CB1F888A8C39D22E 330 | BAAA167D15D0E05575E7F3348C7BCB4F95A78E252E110E958BF8970BE620EADD 331 | 099E170ED1CBA7395DC96BCB0116A3CAC19FCBD5992016D903B99149A3EC0E7F 332 | FC4824D347D55EE38A5E554EAC71581ECB5DC7E435F54EC5FF28B70D61CAB73C 333 | 26DBF17E230EBCAA48383C0B0987D388415D618558F85FAF21EAFA123B174B1E 334 | CE90243623AB34089FFDEA6DF84A8A83B0D7C5C6C75350B22448BB4BA1398E63 335 | D292F6F514295AC5A98700F7C471387C7945B7E3BE4A5E4B624CC2FE7B9DB038 336 | 0E31AEE0C24C1C7DC3C94032732C4F0E1B017E1885FD83A5AFA36D8BE2A5CD48 337 | 7DD1843829F7687E213D0BB58EDC551DC571745038CC6EB9734E3AB3DEA1DC36 338 | F835A07D8128DC631FBC6889A3380E120ECF42C2D101B85E5E5443385654EF86 339 | 69AE5C9E22AE57B516889F0963FE5DA4CBA525374F09246EC68EE7147A5F5C1A 340 | 07C9942347703BB01EBD66C84D2934B2EB5D8BA8B7818C3D9908D33815E39AA9 341 | 2A61CE7FD3A014E9BD19C428E8825A1F98AE8CED14E1688B641E2F13C1EFE859 342 | 88A389FD8313A0DB7602BA3D32D7CA8B683982537DB0E6AB20D91436373E4DC5 343 | F4CD2D48D89681047F6723C73B2A1C688BE82F1D9FA12AE5483B0EDA8618A96F 344 | 1C9A8C1DCB27488AB5E3C871120E4F43C2D111B8D1C44A23D030818D28E4A77E 345 | B81C44C91FB1DE5570A2E27C7553CD5E2C597E1097064D4052D8048C0808E077 346 | 4BE3F2125DFAE12A4CE546183ED561EB510983BAB211CB363F8DD257B3503130 347 | 1CF1B3C662F4807EEC5C7771FD9BBFA278FF6E145CEC8F243903E400572D8E37 348 | 5D32206A71191012898573272244CC3375F962390A724FE0F6AF976247189757 349 | E927ACEC0CE1E0E07227ADCC412986212E7202260CF587AE770FDE85D8F47D2D 350 | FE7EA11CC587EF22224FFA3A845C64D5F01D188B4259832D06925EF441AFA84C 351 | F98498165E68BA69E188795E7CAE5A7255B94238F87A51487B238B8AB661CE0D 352 | D6A0C3ECF96198312C88B57B2DB9AA48383C0D09478710E6680D9333A4A7A9CC 353 | F0F3DE25189EAE62331B669C2ACBF6E140E985B62CA14226D4FE0818A3474C98 354 | 1EC36D3385720675CFA3D8C28952AB7D765C3EEBECE450C447E931D8C9BDC15D 355 | 1AC771FD2C0A0CF9C8AF3067691533DBCE8D4598FF23626FBC1A319D251C1CAD 356 | B770F9F861E41F396D911D98CB90FB18460CD52322528F9001320167E294DC1D 357 | 076B4EBCC0ACA946928A60CCA66B6771206F9F7576DC51C3A00F8B41BC42A65F 358 | 970A07CC232060457EA6836055332ADB065FDF7B6178CF3A3B6EC8383D66CF8D 359 | 4470DF0E964FB814120E8220084213241C04411084264838088220084D907010 360 | 3F5FAE1D01D67C09A4FF0950355F7F9F944D109D0C0907E15978835A22F36537 361 | E0D1EE806F30A01F0FF83F05FC0F775FCBFD2A1C2DC0CE64F6DFDF018B46BBB1 362 | 1208423B241C8467E10DEA4960690AF094CD7775D5EC7F57802FD9F7DFFF13F0 363 | 6607BCBC1418D6CBA953A9BB96FB55387E60BF67BF45382B23CC3DF74F104E42 364 | C2417816B506F5261391DDBB801AD6F39EB912087D4AED195C7F2D9D52B638E2 365 | F05E04CCFB85EBEF9D203A000907E15934195436EA3030D138CBFE5CF2261B79 366 | 38993FCA25D7721F954D109D0C0907E159B41AD47FFD201CDB32155817E9DA35 367 | 0F120E82700A120EC2B3386350FFF69F40F64960D12E402E39E2EDABC0C7FBD8 368 | E884FDF7AE10598D27FB03A1F381313271D0B2D7F235B0B044F8FC89DBC0C952 369 | C0C88EBBF64FE1EB6E0F030347035133D87F7B392E9B2BE32FEF03157FB32F63 370 | 7638D0FF61E9320C0BD9FF2D021214F7B125088F43C2417816A77AE2D540F216 371 | 202819981360FFF5B70781AD9F018F3303FBDC34C09F09C5FFBDC10C3533FE46 372 | F6DB914C3C5E1E6D3F5A51148E9DCC66B3CFCBD603379900FD7A322B979DBB37 373 | FBBAAE8A95CDCE77968D864292D83549AC4198CB5ECE8461172BEB61766DFAFF 374 | CDCA1800FC7B33F07FD839CA3E054CFFCDCEC3CE3152423C483888FB14120EC2 375 | B338251C6C04919D08343023BC2ACCBEBCF4127971F807FB7E2DFBFEF93FD92F 376 | B03B128E1ECC98FB474B97CBF1153BE61D766C1C13B5710F4B94CDC4A507BBF6 377 | 8929ECFCFDA56FEDFD95C017FEC0A6DFD99F838483B84F21E1203C8BB373FF85 378 | 6CB4719619D02DBFB3F89019E5ED4C50EA1CAC7F1C62C6D9C80CF7F645D6C738 379 | 120E6E9490C97EA39443BC805D57CD786043A4C47D32C11AC83E5F3155FEF74D 380 | 2781DFFF27B0641730CCE63B120EE23E858483F02CCE0A47293BFE43F6835D8B 381 | DA3FBB7D1C58BE1F78E12D40AF10EB6136E2B6C6D9917084C84C8D59729919FD 382 | AD55400ABB069DC43967B3CF272BC5A1FC00AC66E71FC3FE37C3664444C241DC 383 | A79070109EC595C2C14F155D65E5AD07FE97D28FC53512FD9FAC8DB323E198C9 384 | CA0D75908CFC5FECF78BF3EC05C23C55F50776DEC14A0588817EA3FF44C2413C 385 | 309070109EC559E1D8CD8C68CD5420D3624A484A4C24118DF3209B1184C3C571 386 | 052FAE364C406A161B9DFC49A528C95C1B0907F10041C2417816A784E336F0D6 387 | 72F6DF6860F9A4F68F79E1F841FDB9836C8CB04B8443C6F09370105D18120EC2 388 | B338231CFF62867C0933E4BF4A015EB05848E084E3F42F98984C5357CEFFEC0E 389 | 3C6C117D4E230E82700A120EC2B338231CA7B381DDD78055EB014BAFD62FD8E7 390 | 05DD544C5569BD1627D638E27280716A44C916120EE2C1838483F02C9A538E54 391 | B311C51676ACCD34555B59C7EC3D9A3A7C2DA27004A930DA7C54BBC9BE0C120E 392 | A20B43C24178162DC2F1AF1B402EEBF5FFED7160F52A09CF2971EDA3E77CE7F6 393 | ACE8701CC73F99682433DB3F55268E838483E89A9070109E45AD41FD073B6617 394 | EBCDFFD81B58B212F8854C3E27736478E82AF9E86C8E7F417BCA113E72FC77F2 395 | 869B9F2A334967EE25E120BA30241C846791DDC8A901A86146F4CA5F81AFFE06 396 | DC6C61238CF1402233DC8F3B28F36FFB819DC7D971BF004282DB734A35FC839D 397 | EF2A709A9DEF12B3DEB98B24AE4541385E669F7FC6463C4DAC5CFD2460B838E4 398 | E172557D7218B8FCDFC0ECD781C9127B859070105D18120EC2B3286D1DEBDD0B 399 | 78B40FEBBDFF12183B89098786FD379A9801FEF820131D3602B82966A0E5B7A2 400 | 65E5F98F067E3DD5BE3C355E55C315B2E3C645024FC85C230907D18521E12008 401 | 3BB4B8E312C4CF0F120E82B0838483209420E120083B4838084209120E82B083 402 | 8483209420E120083B4838084209120E82B0838483209420E120083B48380842 403 | 09120E8220084213241C04411084264838088220084D9070100441109A20E120 404 | 08822034F1FF0160616E4FB1E68DCD0000000049454E44AE426082} 405 | end 406 | object Image1: TImage 407 | AlignWithMargins = True 408 | Left = 1 409 | Top = 435 410 | Width = 439 411 | Height = 40 412 | Margins.Left = 0 413 | Margins.Top = 0 414 | Margins.Right = 0 415 | Margins.Bottom = 70 416 | Align = alBottom 417 | AutoSize = True 418 | Center = True 419 | Picture.Data = { 420 | 0954506E67496D61676589504E470D0A1A0A0000000D49484452000001530000 421 | 0028080600000043D919C2000000017352474200AECE1CE90000000467414D41 422 | 0000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000006 423 | 7B4944415478DAED9DBB4E1C491486CF0CE3C168853763E54D967D00A4110E08 424 | 2D92954672E0900C5F1EC0DA0C3232C8AC7D80B54D46486009C9894548606B24 425 | 1E6021590BB2355A31333BC056DFAB4E5DBA9BA99EE6F27F1232E3EEAE3E7DEA 426 | D45FE75435D0B81210000080B168404C0100607C20A60000E001882900007800 427 | 620A00001E80980200800720A60000E001882900007800620A00001E80980200 428 | 80074A8BE9C5C545F8050D0600DC651A8D064D4D4D855F85CE2F2BA6C3E11042 429 | 0A00B8170482DA6EB78B9D5B564C078341DDCF07000013637A7ABAD079105300 430 | 007000310500000FD426A6834F5B34EAACD10F7375BB0080FA38DF5EA1CBEE0E 431 | C681C46DF5490D627A42FF6EFE42A3D3E4F306B5DFAED14C4E7BE7DB0F69D82B 432 | 766E6D9CEED0F73F8553D757A8985BAB67F06985FA7BBBE2BBE7D45AE7012AF5 433 | C5DC077A5885DDD7F1C9E116FDF36E839AAFFA34BB50F27EE35C3B6902DFECFD 434 | 4A8F569748EE8B46F7981EFD764467BF3FA54B4A3EFF34C68DE2B6C9D2C7811D 435 | 9B2F281DE055C5428C732C9B7C42D5DAE38B898B6930B8878F77E2400F9CF59E 436 | 9AEBC504F27C7B8B68F5068B69550881F8FEEDE55803CA5D09887ED8FE4CADD5 437 | C906AC1A0BC58F15F1D719ADDD7831D532304548020EE86CF32F6A7B1192FCB6 438 | 26592DDAC6B29E95FAF441B5D420A6D7EFB0B003BAF3F45F3A8BF2D98D65BD9D 439 | 7DFA310D4C4AB3168AAF6D767AD44C3B4EBDB6D109CE5B9602DB8523C34B32A5 440 | EE07BADA8BEDD666FE83340B09688A7B5F3D8EC4339AC5D9ED94E762CF6CC92A 441 | AA1153C96E71DFF6935D1AEE519C01BBB25E5E9DC43E9732B0504C4536ADFB8C 442 | 652B695625C54228A62FA9F931BB47B94C95C582E8BBC617CA06B4124749C61F 443 | FB42F45D53645D97813DAF8886C179A63ED18493F2C59465907AC66A8FA3A4AD 444 | E6CF2F68D433FB2437461C634B8D533DEB948F07763FF8F65E1753934F0AD86D 445 | EE0FD5E6E09AD6D7D806D976A726E43F974C0D657ED2E1E54B76AD3C504AC8C8 446 | 7197CF3247070372407FC4C1C404230CCC5D9A4A1CCFB299F05EC4C438178B28 447 | 851D46A9DD3CEB5283387A8E8B27D2407166A627747E4834B3E03ED7BF980676 448 | BE217A9DF9CF5C5EDBDBCECB4CFB7B1D8BCF78B6C22A1CCD16666B81381B2DF6 449 | D558F83B16C4A0ED8FF3923806F12C9E2FB433F8FEADB043DCE7243B8F0CBE37 450 | AE0BF2723B4016E2D3033AA7259A9933B7E18EA368DC5D758F157195333E7B8C 451 | E48D2D61CBE18188C1A5EC392451D4CEB594F9E6B5D21CBB9DFD21C7D26E3AF9 452 | 0C84AD246C9D2EA009CA580A8F1FD1038B6ED5B79B6FCA287230393B0D00DAA1 453 | B3DE32CD2A22A23A2B5B3F8C5007BE3AAB5F6FDDC82EA64AD969EC2469101932 454 | 6A9798F22CCFB4C6E65D4C0D590417A1BCB64B95F98A0FF2C554F3D7A9293E4C 455 | 88B6B789662D93A8B13C4DFB57BA56B241F7BDA5742D99996AEBE0CE38CAF199 456 | 2B464EF3C7965641A5F736F5BF6979CF56CEBBED76F747B138B36982B12A34EE 457 | 3D444C584C4B74A08171C554B7C591AD0433DED7656F99A9534CB9EFD84CEE3A 458 | 5F0B148B684C424CCD410B31E5BEB73EB7534CCB8F1D358ECA8B69E1B1A5F95B 459 | F6613131B5C742B562AAA26A42D9B70A6A1053B656D6295E4A2BE596E668C36C 460 | 270F202D50731C37313135079622A6861DCEA4E452ED362C11A46D5651E6CB76 461 | 47993D9528F335814C4AE4B902622A95725AD91896F93D2583306E6C18979B0C 462 | 93AC5CDE19843A1BD045C4D4B1A1E2145353962A95A4B971348698CEB9C716EF 463 | 2BBE4466EA4B79D9CBBDC9547EE2E4025B7CF2627D6F5CC3B5535B995F76673E 464 | 1D30C9A27E484E99436C7D95AD473953FA3265BEB288CDDAA7EC98F1F3429109 465 | 866F881C5B9708928D2E62AFD72824EDBBEC2EB259A3DCFB39353BE29FC53868 466 | 0BB5CD364C9263E9B571FF9E709FA9E559A3BB4F535F9E469B52CF8EA81FAE97 467 | EE13BDCBDAB66FD6989699D8920F3B87C70A7F9529F4EFE2E7D0E6E0D834BD11 468 | B6461B73AD9E2303535E8562ED89FE524BD20D6A757B34326DF86971241D0BFF 469 | 6F5EDD1C7C2DFCC9D76AE33E4DC7976B6C317F851B7622062F4DF7A7E89EAD70 470 | 43296AA369CD1C73EC5E372F31A47D6D5A832EA109017C19E00695F919F7F635 471 | A73BCC6D7DD97A72DC9ED77C26C7DDF1097E9C148C01CF48C67DB91C80DB0BC4 472 | 1400003C00310500000F404C0100C0039589297ED33E00E0BE50E96FDAC7DF80 473 | 0200DC072AFF1B500000007420A60000E001882900007800620A00001E809802 474 | 00800720A60000E001882900007800620A00001E809802008007FE0700743DF2 475 | 476B0E020000000049454E44AE426082} 476 | ExplicitTop = 416 477 | ExplicitWidth = 339 478 | end 479 | object lblMiddlewares: TLabel 480 | Left = 22 481 | Top = 211 482 | Width = 67 483 | Height = 13 484 | Caption = 'Middlewares' 485 | Font.Charset = DEFAULT_CHARSET 486 | Font.Color = clWindowText 487 | Font.Height = -11 488 | Font.Name = 'Segoe UI' 489 | Font.Style = [fsBold] 490 | ParentFont = False 491 | end 492 | object chkAddToProjectGroup: TCheckBox 493 | Left = 22 494 | Top = 174 495 | Width = 230 496 | Height = 17 497 | Anchors = [akLeft, akTop, akRight] 498 | Caption = 'Add to existing project group' 499 | Checked = True 500 | Font.Charset = DEFAULT_CHARSET 501 | Font.Color = clWindowText 502 | Font.Height = -11 503 | Font.Name = 'Segoe UI' 504 | Font.Style = [] 505 | ParentFont = False 506 | State = cbChecked 507 | TabOrder = 0 508 | end 509 | object chkJhonson: TCheckBox 510 | Left = 22 511 | Top = 230 512 | Width = 230 513 | Height = 17 514 | Anchors = [akLeft, akTop, akRight] 515 | Caption = 'jhonson - JSON parser' 516 | Font.Charset = DEFAULT_CHARSET 517 | Font.Color = clWindowText 518 | Font.Height = -11 519 | Font.Name = 'Segoe UI' 520 | Font.Style = [] 521 | ParentFont = False 522 | TabOrder = 1 523 | end 524 | object chkHorseCORS: TCheckBox 525 | Left = 22 526 | Top = 253 527 | Width = 230 528 | Height = 17 529 | Anchors = [akLeft, akTop, akRight] 530 | Caption = 'horse-cors - Inject CORS headers' 531 | Font.Charset = DEFAULT_CHARSET 532 | Font.Color = clWindowText 533 | Font.Height = -11 534 | Font.Name = 'Segoe UI' 535 | Font.Style = [] 536 | ParentFont = False 537 | TabOrder = 2 538 | end 539 | object chkHorseOctetStream: TCheckBox 540 | Left = 22 541 | Top = 276 542 | Width = 230 543 | Height = 17 544 | Anchors = [akLeft, akTop, akRight] 545 | Caption = 'horse-octet-stream - Support stream' 546 | Font.Charset = DEFAULT_CHARSET 547 | Font.Color = clWindowText 548 | Font.Height = -11 549 | Font.Name = 'Segoe UI' 550 | Font.Style = [] 551 | ParentFont = False 552 | TabOrder = 3 553 | end 554 | object chkHorseJWT: TCheckBox 555 | Left = 22 556 | Top = 299 557 | Width = 230 558 | Height = 17 559 | Anchors = [akLeft, akTop, akRight] 560 | Caption = 'horse-jwt - JSON Web Token' 561 | Font.Charset = DEFAULT_CHARSET 562 | Font.Color = clWindowText 563 | Font.Height = -11 564 | Font.Name = 'Segoe UI' 565 | Font.Style = [] 566 | ParentFont = False 567 | TabOrder = 4 568 | end 569 | object chkHorseBasicAuth: TCheckBox 570 | Left = 22 571 | Top = 322 572 | Width = 230 573 | Height = 17 574 | Anchors = [akLeft, akTop, akRight] 575 | Caption = 'horse-basic-auth - Basic authentication' 576 | Font.Charset = DEFAULT_CHARSET 577 | Font.Color = clWindowText 578 | Font.Height = -11 579 | Font.Name = 'Segoe UI' 580 | Font.Style = [] 581 | ParentFont = False 582 | TabOrder = 5 583 | end 584 | object chkHorseCompression: TCheckBox 585 | Left = 22 586 | Top = 345 587 | Width = 230 588 | Height = 17 589 | Anchors = [akLeft, akTop, akRight] 590 | Caption = 'horse-compression - Compression' 591 | Font.Charset = DEFAULT_CHARSET 592 | Font.Color = clWindowText 593 | Font.Height = -11 594 | Font.Name = 'Segoe UI' 595 | Font.Style = [] 596 | ParentFont = False 597 | TabOrder = 6 598 | end 599 | object chkHandleException: TCheckBox 600 | Left = 22 601 | Top = 368 602 | Width = 230 603 | Height = 17 604 | Anchors = [akLeft, akTop, akRight] 605 | Caption = 'handle-exception - Handler exceptions' 606 | Font.Charset = DEFAULT_CHARSET 607 | Font.Color = clWindowText 608 | Font.Height = -11 609 | Font.Name = 'Segoe UI' 610 | Font.Style = [] 611 | ParentFont = False 612 | TabOrder = 7 613 | end 614 | object Button1: TButton 615 | Left = 220 616 | Top = 488 617 | Width = 109 618 | Height = 37 619 | Caption = 'CANCEL' 620 | ModalResult = 2 621 | TabOrder = 8 622 | end 623 | object Button2: TButton 624 | Left = 105 625 | Top = 488 626 | Width = 109 627 | Height = 37 628 | Caption = 'DONE' 629 | Default = True 630 | ModalResult = 1 631 | TabOrder = 9 632 | end 633 | object chkLogger: TCheckBox 634 | Left = 22 635 | Top = 391 636 | Width = 230 637 | Height = 17 638 | Anchors = [akLeft, akTop, akRight] 639 | Caption = 'Logger - Access logging' 640 | Font.Charset = DEFAULT_CHARSET 641 | Font.Color = clWindowText 642 | Font.Height = -11 643 | Font.Name = 'Segoe UI' 644 | Font.Style = [] 645 | ParentFont = False 646 | TabOrder = 10 647 | end 648 | end 649 | end 650 | -------------------------------------------------------------------------------- /src/Horse.Views.Wizard.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Views.Wizard; 2 | 3 | interface 4 | 5 | uses WinAPI.Windows, WinAPI.Messages, WinAPI.ShellAPI, System.SysUtils, System.Variants, System.Classes, VCL.Graphics, 6 | VCL.Controls, VCL.Forms, VCL.Dialogs, VCL.StdCtrls, VCL.Imaging.pngimage, VCL.ExtCtrls; 7 | 8 | type 9 | TFrmNewProject = class(TForm) 10 | pnlContent: TPanel; 11 | chkAddToProjectGroup: TCheckBox; 12 | imgHeader: TImage; 13 | Image1: TImage; 14 | lblMiddlewares: TLabel; 15 | chkJhonson: TCheckBox; 16 | chkHorseCORS: TCheckBox; 17 | chkHorseOctetStream: TCheckBox; 18 | chkHorseJWT: TCheckBox; 19 | chkHorseBasicAuth: TCheckBox; 20 | chkHorseCompression: TCheckBox; 21 | chkHandleException: TCheckBox; 22 | Button1: TButton; 23 | Button2: TButton; 24 | chkLogger: TCheckBox; 25 | private 26 | function GetAddToProjectGroup: Boolean; 27 | function GetMiddlewareList: TStringList; 28 | public 29 | property AddToProjectGroup: Boolean read GetAddToProjectGroup; 30 | property MiddlewareList: TStringList read GetMiddlewareList; 31 | end; 32 | 33 | implementation 34 | 35 | {$R *.dfm} 36 | 37 | function TFrmNewProject.GetAddToProjectGroup: Boolean; 38 | begin 39 | Result := chkAddToProjectGroup.Checked; 40 | end; 41 | 42 | function TFrmNewProject.GetMiddlewareList: TStringList; 43 | var 44 | LList: TStringList; 45 | begin 46 | LList := TStringList.Create; 47 | 48 | if chkJhonson.Checked then 49 | LList.Add('github.com/HashLoad/jhonson'); 50 | 51 | if chkHorseCORS.Checked then 52 | LList.Add('github.com/HashLoad/horse-cors'); 53 | 54 | if chkHorseOctetStream.Checked then 55 | LList.Add('github.com/HashLoad/horse-octet-stream'); 56 | 57 | if chkHorseJWT.Checked then 58 | LList.Add('github.com/HashLoad/horse-jwt'); 59 | 60 | if chkHorseBasicAuth.Checked then 61 | LList.Add('github.com/HashLoad/horse-basic-auth'); 62 | 63 | if chkHorseCompression.Checked then 64 | LList.Add('github.com/HashLoad/horse-compression'); 65 | 66 | if chkHandleException.Checked then 67 | LList.Add('github.com/HashLoad/handle-exception'); 68 | 69 | if chkLogger.Checked then 70 | LList.Add('github.com/HashLoad/horse-logger'); 71 | 72 | Result := LList; 73 | end; 74 | 75 | end. 76 | -------------------------------------------------------------------------------- /src/Horse.Wizard.Types.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Wizard.Types; 2 | 3 | interface 4 | 5 | uses System.SysUtils, Horse.NewProject.Templates, ToolsAPI; 6 | 7 | type 8 | THorsePlatform = (hpWin32, hpWin64, hpLinux64); 9 | THorseFramework = (hfApache, hfCGI, hfConsole, hfDaemon, hfIsapi, hfVcl, hfWinSvc); 10 | 11 | THorsePlatformHelper = record helper for THorsePlatform 12 | public 13 | procedure FromString(const AValue: string); 14 | function ToString: string; 15 | end; 16 | 17 | THorseFrameworkHelper = record helper for THorseFramework 18 | public 19 | procedure FromString(const AValue: string); 20 | function ToString: string; 21 | function ProjectType: string; 22 | function Define: string; 23 | function DprContent: string; 24 | end; 25 | 26 | implementation 27 | 28 | { THorsePlatformHelper } 29 | 30 | procedure THorsePlatformHelper.FromString(const AValue: string); 31 | var 32 | LValue: string; 33 | begin 34 | Self := hpWin32; 35 | LValue := AValue.ToLower.Replace(' ', ''); 36 | if LValue.Equals('windows64') then 37 | Self := hpWin64; 38 | if LValue.Contains('linux') then 39 | Self := hpLinux64; 40 | end; 41 | 42 | function THorsePlatformHelper.ToString: string; 43 | begin 44 | case Self of 45 | hpWin32: 46 | Result := 'Win32'; 47 | hpWin64: 48 | Result := 'Win64'; 49 | hpLinux64: 50 | Result := 'Linux64'; 51 | end; 52 | end; 53 | 54 | { THorseFrameworkHelper } 55 | 56 | function THorseFrameworkHelper.Define: string; 57 | begin 58 | case Self of 59 | hfApache: 60 | Result := 'HORSE_APACHE'; 61 | hfCGI: 62 | Result := 'HORSE_CGI'; 63 | hfConsole: 64 | Result := 'HORSE_CONSOLE'; 65 | hfDaemon: 66 | Result := 'HORSE_DAEMON'; 67 | hfIsapi: 68 | Result := 'HORSE_ISAPI'; 69 | hfVcl: 70 | Result := 'HORSE_VCL'; 71 | hfWinSvc: 72 | Result := 'HORSE_VCL'; 73 | end; 74 | end; 75 | 76 | function THorseFrameworkHelper.DprContent: string; 77 | begin 78 | case Self of 79 | hfApache: 80 | Result := sHorseDPRApache; 81 | hfCGI: 82 | Result := sHorseDPRCGI; 83 | hfConsole: 84 | Result := sHorseDPRConsole; 85 | hfDaemon: 86 | Result := sHorseDPRConsole; 87 | hfIsapi: 88 | Result := sHorseDPRISAPI; 89 | hfVcl: 90 | Result := sHorseDPRVCL; 91 | hfWinSvc: 92 | Result := sHorseDPRWinSvc; 93 | end; 94 | end; 95 | 96 | procedure THorseFrameworkHelper.FromString(const AValue: string); 97 | var 98 | LValue: string; 99 | begin 100 | Self := hfConsole; 101 | LValue := AValue.ToLower.Replace(' ', ''); 102 | if LValue.Equals('apache') then 103 | Self := hfApache; 104 | if LValue.Equals('cgi') then 105 | Self := hfCGI; 106 | if LValue.Equals('daemon') then 107 | Self := hfDaemon; 108 | if LValue.Equals('isapi') then 109 | Self := hfIsapi; 110 | if LValue.Equals('vcl') then 111 | Self := hfVcl; 112 | if (LValue.Equals('winservice')) or (LValue.Equals('winsvc')) then 113 | Self := hfWinSvc; 114 | end; 115 | 116 | function THorseFrameworkHelper.ProjectType: string; 117 | begin 118 | case Self of 119 | hfApache: 120 | Result := sLibrary; 121 | hfCGI: 122 | Result := sConsole; 123 | hfConsole: 124 | Result := sConsole; 125 | hfDaemon: 126 | Result := sConsole; 127 | hfIsapi: 128 | Result := sLibrary; 129 | hfVcl: 130 | Result := sApplication; 131 | hfWinSvc: 132 | Result := sApplication; 133 | end; 134 | end; 135 | 136 | function THorseFrameworkHelper.ToString: string; 137 | begin 138 | case Self of 139 | hfApache: 140 | Result := sFrameworkTypeNone; 141 | hfCGI: 142 | Result := sFrameworkTypeNone; 143 | hfConsole: 144 | Result := sFrameworkTypeNone; 145 | hfDaemon: 146 | Result := sFrameworkTypeNone; 147 | hfIsapi: 148 | Result := sFrameworkTypeNone; 149 | hfVcl: 150 | Result := sFrameworkTypeVCL; 151 | hfWinSvc: 152 | Result := sFrameworkTypeVCL; 153 | end; 154 | end; 155 | 156 | end. 157 | -------------------------------------------------------------------------------- /src/Horse.Wizard.Utils.pas: -------------------------------------------------------------------------------- 1 | unit Horse.Wizard.Utils; 2 | 3 | interface 4 | 5 | uses System.SysUtils, System.Classes, ToolsAPI, Vcl.Dialogs; 6 | 7 | function UnitEditor: IOTASourceEditor; 8 | function EditorAsString: string; 9 | function EditorAsStringList: TStringList; 10 | 11 | implementation 12 | 13 | function EditorAsStringList: TStringList; 14 | begin 15 | Result := TStringList.Create; 16 | try 17 | Result.Text := EditorAsString; 18 | except 19 | Result.Free; 20 | raise; 21 | end; 22 | end; 23 | 24 | function EditorAsString: string; 25 | const 26 | iBufferSize: Integer = 1024; 27 | var 28 | LEditReader: IOTAEditReader; 29 | LRead: Integer; 30 | LPosition: Integer; 31 | LStringBuffer: AnsiString; 32 | begin 33 | Result := EmptyStr; 34 | LEditReader := UnitEditor.CreateReader; 35 | try 36 | LPosition := 0; 37 | repeat 38 | SetLength(LStringBuffer, iBufferSize); 39 | LRead := LEditReader.GetText(LPosition, PAnsiChar(LStringBuffer), iBufferSize); 40 | SetLength(LStringBuffer, LRead); 41 | Result := Result + string(LStringBuffer); 42 | Inc(LPosition, LRead); 43 | until LRead < iBufferSize; 44 | finally 45 | LEditReader := nil; 46 | end; 47 | end; 48 | 49 | function UnitEditor: IOTASourceEditor; 50 | var 51 | LModule: IOTAModule; 52 | I: Integer; 53 | begin 54 | LModule := (BorlandIDEServices as IOTAModuleServices).CurrentModule; 55 | for I := 0 to Pred(LModule.ModuleFileCount) do 56 | begin 57 | if LModule.ModuleFileEditors[I].QueryInterface(IOTASourceEditor, Result) = S_OK then 58 | Break; 59 | end; 60 | end; 61 | 62 | end. 63 | --------------------------------------------------------------------------------