Repository: HemulGM/ChatGPT Branch: main Commit: 97ad2e8d3d6e Files: 80 Total size: 1.2 MB Directory structure: gitextract_yo52volr/ ├── .gitattributes ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── .gitmodules ├── AndroidManifest.template.xml ├── ChatGPT.About.fmx ├── ChatGPT.About.pas ├── ChatGPT.Android.pas ├── ChatGPT.ChatSettings.fmx ├── ChatGPT.ChatSettings.pas ├── ChatGPT.Classes.pas ├── ChatGPT.Code.pas ├── ChatGPT.FrameChat.fmx ├── ChatGPT.FrameChat.pas ├── ChatGPT.FrameCode.fmx ├── ChatGPT.FrameCode.pas ├── ChatGPT.FrameImage.fmx ├── ChatGPT.FrameImage.pas ├── ChatGPT.FrameImagePreview.fmx ├── ChatGPT.FrameImagePreview.pas ├── ChatGPT.FrameMessage.fmx ├── ChatGPT.FrameMessage.pas ├── ChatGPT.FramePlainText.fmx ├── ChatGPT.FramePlainText.pas ├── ChatGPT.FrameSVG.fmx ├── ChatGPT.FrameSVG.pas ├── ChatGPT.FrameUIMessage.fmx ├── ChatGPT.FrameUIMessage.pas ├── ChatGPT.Functions.External.Intf.pas ├── ChatGPT.Functions.External.pas ├── ChatGPT.Functions.pas ├── ChatGPT.ImportExport.fmx ├── ChatGPT.ImportExport.pas ├── ChatGPT.LoadedFunctions.fmx ├── ChatGPT.LoadedFunctions.pas ├── ChatGPT.Main.fmx ├── ChatGPT.Main.pas ├── ChatGPT.Manager.dfm ├── ChatGPT.Manager.pas ├── ChatGPT.Overlay.fmx ├── ChatGPT.Overlay.pas ├── ChatGPT.Settings.fmx ├── ChatGPT.Settings.pas ├── ChatGPT.SoundRecorder.pas ├── ChatGPT.TextEditor.fmx ├── ChatGPT.TextEditor.pas ├── ChatGPT.deployproj ├── ChatGPT.dpr ├── ChatGPT.dproj ├── ChatGPT.res ├── ChatGPTGroup.groupproj ├── ChatGPT_Console.dpr ├── ChatGPT_Console.dproj ├── ChatGPT_Console.res ├── Code/ │ ├── ChatGPT.Code.JSON.pas │ ├── ChatGPT.Code.MarkDown.pas │ ├── ChatGPT.Code.Pascal.pas │ ├── ChatGPT.Code.Python.pas │ └── ChatGPT.Code.SQL.pas ├── FMX.Media.Win.pas ├── FunctionsLib/ │ ├── func_cmd.pas │ ├── func_weather.pas │ ├── gpt_function_cmd.dpr │ ├── gpt_function_cmd.dproj │ ├── gpt_function_cmd.res │ ├── gpt_function_owm.deployproj │ ├── gpt_function_owm.dpr │ ├── gpt_function_owm.dproj │ └── gpt_function_owm.res ├── HGM.FMX.Ani.pas ├── HGM.FMX.Image.pas ├── LICENSE ├── LaunchScreen.TemplateiOS/ │ ├── Assets/ │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── LaunchScreenBackgroundColor.colorset/ │ │ │ └── Contents.json │ │ └── LaunchScreenImage.imageset/ │ │ └── Contents.json │ └── LaunchScreen.storyboard ├── README.md └── Res/ ├── chatgptfmx/ │ └── res/ │ └── mipmap-anydpi-v26/ │ └── chatgptfmx.xml └── preview.psd ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: hemulgm open_collective: hemulgm ================================================ FILE: .gitignore ================================================ # Uncomment these types if you want even more clean repository. But be careful. # It can make harm to an existing project source. Read explanations below. # # Resource files are binaries containing manifest, project icon and version info. # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. #*.res # # Type library file (binary). In old Delphi versions it should be stored. # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. #*.tlb # # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. # Uncomment this if you are not using diagrams or use newer Delphi version. #*.ddp # # Visual LiveBindings file. Added in Delphi XE2. # Uncomment this if you are not using LiveBindings Designer. #*.vlb # # Deployment Manager configuration file for your project. Added in Delphi XE2. # Uncomment this if it is not mobile development and you do not use remote debug feature. #*.deployproj # # C++ object files produced when C/C++ Output file generation is configured. # Uncomment this if you are not using external objects (zlib library for example). #*.obj # # Delphi compiler-generated binaries (safe to delete) *.exe *.dll *.bpl *.bpi *.dcp *.so *.apk *.drc *.map *.dres *.rsm *.tds *.dcu *.lib *.a *.o *.ocx # Delphi autogenerated files (duplicated info) *.cfg *.hpp *Resource.rc # Delphi local files (user-specific info) *.local *.identcache *.projdata *.tvsconfig *.dsk # Delphi history and backups __history/ __recovery/ Win32/ Win64/ Android/ Android64/ *.~* # Castalia statistics file (since XE7 Castalia is distributed with Delphi) *.stat # Boss dependency manager vendor folder https://github.com/HashLoad/boss modules/ MY_TOKEN.txt /Linux64/Release/ChatGPT /FMX.Memo.Style.1.pas /Linux64/Release/ChatGPT_Linux64.zip /Linux64/Debug/ChatGPT /MacOS/ChatGPT_MacOSarm64.zip /MacOS/ChatGPT_MacOSi64.zip /iOSDevice64/* /Keys/* ================================================ FILE: .gitmodules ================================================ [submodule "DelphiOpenAI"] path = DelphiOpenAI url = https://github.com/HemulGM/DelphiOpenAI [submodule "WindowDarkMode"] path = WindowDarkMode url = https://github.com/HemulGM/WindowDarkMode [submodule "OWM_API"] path = OWM_API url = https://github.com/HemulGM/OWM_API [submodule "TProcessDelphi"] path = TProcessDelphi url = https://github.com/HemulGM/TProcessDelphi [submodule "FMXRichMemo"] path = FMXRichMemo url = https://github.com/HemulGM/FMXRichMemo ================================================ FILE: AndroidManifest.template.xml ================================================ <%uses-permission%> <%queries-child-elements%> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <%activity%> <%receivers%> ================================================ FILE: ChatGPT.About.fmx ================================================ inherited FrameAbout: TFrameAbout Size.Width = 944.000000000000000000 Size.Height = 703.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 944.000000000000000000 Size.Height = 703.000000000000000000 OnClick = ButtonOkClick end object LayoutClient: TLayout Align = Center Padding.Left = 20.000000000000000000 Padding.Top = 20.000000000000000000 Padding.Right = 20.000000000000000000 Padding.Bottom = 20.000000000000000000 Size.Width = 635.000000000000000000 Size.Height = 641.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 635.000000000000000000 Size.Height = 641.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object VertScrollBoxContent: TVertScrollBox Align = Client Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 595.000000000000000000 Size.Height = 555.000000000000000000 Size.PlatformDefault = False TabOrder = 1 Viewport.Width = 579.000000000000000000 Viewport.Height = 555.000000000000000000 object Label1: TLabel Align = Top AutoSize = True StyledSettings = [] Margins.Top = 10.000000000000000000 Margins.Bottom = 10.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 27.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 20.000000000000000000 TextSettings.Font.StyleExt = {00070000000000000004000000} TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'About' TabOrder = 10 end object Label5: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 57.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 38.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'The ChatGPT client is an amazing open source cross-platform appl' + 'ication that allows you to play with the OpenAI ChatGPT API for ' + 'free!' TabOrder = 8 TabStop = False end object LabelAppearance: TLabel Align = Top AutoSize = True StyledSettings = [] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 220.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 18.000000000000000000 TextSettings.Font.StyleExt = {00070000000000000004000000} TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Support' TabOrder = 2 TabStop = False end object LabelVersion: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 780.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'HemulGM' TabOrder = 9 TabStop = False end object Label34: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 110.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Check out the source code on GitHub and give it a '#11088'!' TabOrder = 4 TabStop = False end object Label2: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 259.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 149.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'At ChatGPT, we strive to bring you useful and amazing features e' + 'very time. And just like any other project, your support and mot' + 'ivation will help us move forward!'#13#10#13#10'If you liked our applicati' + 'on, we ask you to give this project a '#11088#65039'. Your approval means a ' + 'lot to us and encourages us to work harder to deliver the best p' + 'ossible experience.'#13#10#13#10'Thank you for being a part of our communi' + 'ty and we look forward to serving you better in the future.' TabOrder = 7 TabStop = False end object Label3: TLabel Align = Top AutoSize = True StyledSettings = [] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 499.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 18.000000000000000000 TextSettings.Font.StyleExt = {00070000000000000004000000} TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Privacy Statement' TabOrder = 1 TabStop = False end object Label4: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 538.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 168.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'We value your privacy and are committed to protecting the privac' + 'y of our users. We do not collect or store the text you enter or' + ' receive from the OpenAI server in any form on third party serve' + 'rs. All history is stored only on your computer and nowhere else' + '. Our source code is available for review to verify this claim.'#13 + #10#13#10'We prioritize the security of your API key and handle it with' + ' the utmost care. If you use your own API key, your key is store' + 'd solely on your computer and is never shared with any third par' + 'ty. It is used solely for its intended purpose to access the Ope' + 'nAI API and not for any other unauthorized use.' TabOrder = 3 TabStop = False end object Label6: TLabel Align = Top AutoSize = True StyledSettings = [] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 741.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Segoe UI Emoji' TextSettings.Font.Size = 18.000000000000000000 TextSettings.Font.StyleExt = {00070000000000000004000000} TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Autor' TabOrder = 0 TabStop = False end object Layout4: TLayout Align = Top Margins.Top = 10.000000000000000000 Position.Y = 144.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 6 TabStop = False object ButtonGitHub: TButton OnTap = ButtonGitHubTap Align = Left ImageIndex = 9 Size.Width = 289.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'Open GitHub page' TextSettings.HorzAlign = Leading ParentShowHint = False ShowHint = True OnClick = ButtonGitHubClick end end object Layout1: TLayout Align = Top Margins.Top = 10.000000000000000000 Position.Y = 423.000000000000000000 Size.Width = 569.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 5 TabStop = False object ButtonReport: TButton OnTap = ButtonReportTap Align = Left ImageIndex = 9 Size.Width = 289.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'Report a problem' TextSettings.HorzAlign = Leading ParentShowHint = False ShowHint = True OnClick = ButtonReportClick end end end object Layout2: TLayout Align = Bottom Position.X = 20.000000000000000000 Position.Y = 575.000000000000000000 Size.Width = 595.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object ButtonOk: TButton Align = Right Cancel = True Position.X = 515.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 2 Text = 'OK' OnClick = ButtonOkClick end end end end ================================================ FILE: ChatGPT.About.pas ================================================ unit ChatGPT.About; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Objects, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.ComboEdit, FMX.Edit, FMX.Controls.Presentation, FMX.Layouts, ChatGPT.Classes; {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} type TFrameAbout = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; VertScrollBoxContent: TVertScrollBox; Label1: TLabel; Label5: TLabel; LabelAppearance: TLabel; LabelVersion: TLabel; Layout2: TLayout; ButtonOk: TButton; Label34: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label6: TLabel; Layout4: TLayout; ButtonGitHub: TButton; Layout1: TLayout; ButtonReport: TButton; procedure ButtonOkClick(Sender: TObject); procedure FrameResize(Sender: TObject); procedure ButtonGitHubClick(Sender: TObject); procedure ButtonReportClick(Sender: TObject); procedure ButtonGitHubTap(Sender: TObject; const Point: TPointF); procedure ButtonReportTap(Sender: TObject; const Point: TPointF); private FProcCallback: TProc; FLayoutClientWidth, FLayoutClientHeight: Single; protected procedure SetMode(const Value: TWindowMode); override; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); end; var FrameAbout: TFrameAbout; implementation uses System.Math; {$R *.fmx} procedure TFrameAbout.ButtonGitHubClick(Sender: TObject); begin OpenUrl('https://github.com/HemulGM/ChatGPT'); end; procedure TFrameAbout.ButtonGitHubTap(Sender: TObject; const Point: TPointF); begin ButtonGitHubClick(nil); end; procedure TFrameAbout.ButtonOkClick(Sender: TObject); begin Cancel; end; procedure TFrameAbout.ButtonReportClick(Sender: TObject); begin OpenUrl('https://github.com/HemulGM/ChatGPT/issues'); end; procedure TFrameAbout.ButtonReportTap(Sender: TObject; const Point: TPointF); begin ButtonReportClick(nil); end; procedure TFrameAbout.Cancel; begin if Assigned(FProcCallback) then FProcCallback(Self, True); Release; end; constructor TFrameAbout.Create(AOwner: TComponent); begin inherited; Name := ''; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; VertScrollBoxContent.AniCalculations.Animation := True; //VertScrollBoxContent.AniCalculations.Interval := 1; VertScrollBoxContent.AniCalculations.Averaging := True; VertScrollBoxContent.ViewportPosition := TPoint.Zero; {$IFDEF MOBILE} ButtonReport.OnClick := nil; ButtonGitHub.OnClick := nil; {$ENDIF} end; class procedure TFrameAbout.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); begin var Frame := TFrameAbout.Create(AParent); Frame.Parent := AParent; Frame.FProcCallback := ProcExecuted; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; if Assigned(ProcSet) then ProcSet(Frame); Frame.ButtonOk.SetFocus; end; procedure TFrameAbout.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameAbout.SetMode(const Value: TWindowMode); begin inherited; if Mode = TWindowMode.Compact then begin LayoutClient.Align := TAlignLayout.Client; RectangleFrame.Corners := []; end else begin LayoutClient.Align := TAlignLayout.Center; RectangleFrame.Corners := AllCorners; end; FrameResize(nil); end; end. ================================================ FILE: ChatGPT.Android.pas ================================================ unit ChatGPT.Android; {$IFDEF ANDROID} interface uses System.SysUtils, System.Types, System.IOUtils, System.Messaging, FMX.Dialogs; type TDialog = class private FProc: TProc; FRequestCode: Integer; procedure ResultCallback(const Sender: TObject; const M: TMessage); public constructor Create; destructor Destroy; override; procedure Show(const MimeType: string; Proc: TProc); end; procedure OpenFileDialog(const MimeType: string; Proc: TProc); implementation uses System.Permissions,Androidapi.Helpers, Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.JNI.Webkit, Androidapi.JNI.Net, Androidapi.JNI.App, Androidapi.JNI.Support, FMX.Platform.Android; constructor TDialog.Create; begin FRequestCode := Random(9999999); TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, ResultCallback); end; destructor TDialog.Destroy; begin TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, ResultCallback); end; function GetRealPathFromURI(Uri: Jnet_Uri): string; var Cursor: JCursor; ColumnIndex: Integer; begin Cursor := TAndroidHelper.Context.getContentResolver.query(Uri, nil, nil, nil, nil); ColumnIndex := Cursor.getColumnIndexOrThrow(StringToJString('_data')); Cursor.moveToFirst; Result := JStringToString(Cursor.getString(ColumnIndex)); Cursor.close; end; procedure TDialog.ResultCallback(const Sender: TObject; const M: TMessage); begin try if TMessageResultNotification(M).RequestCode = FRequestCode then if TMessageResultNotification(M).ResultCode = TJActivity.JavaClass.RESULT_OK then try FProc(GetRealPathFromURI(TMessageResultNotification(M).Value.getData)); except on E: Exception do ShowMessage(E.Message); end; finally Free; end; end; procedure TDialog.Show(const MimeType: string; Proc: TProc); begin FProc := Proc; var Intent: JIntent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_PICK); Intent.setType(StringToJString(MimeType)); //Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE, False); MainActivity.startActivityForResult(Intent, FRequestCode); end; procedure OpenFileDialog(const MimeType: string; Proc: TProc); begin PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)], procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray) begin if (Length(AGrantResults) > 0) and (AGrantResults[0] = TPermissionStatus.Granted) then TDialog.Create.Show(MimeType, Proc); end); end; {$ELSE} interface implementation {$ENDIF} end. ================================================ FILE: ChatGPT.ChatSettings.fmx ================================================ inherited FrameChatSettings: TFrameChatSettings Size.Width = 729.000000000000000000 Size.Height = 719.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 729.000000000000000000 Size.Height = 719.000000000000000000 OnClick = RectangleBGClick end object LayoutClient: TLayout Align = Center Padding.Left = 10.000000000000000000 Padding.Top = 10.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 440.000000000000000000 Size.Height = 644.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 440.000000000000000000 Size.Height = 644.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object LayoutActs: TLayout Align = Bottom Position.X = 10.000000000000000000 Position.Y = 588.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 1 TabStop = False object ButtonCancel: TButton Align = Right Cancel = True Position.X = 340.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'CANCEL' ParentShowHint = False ShowHint = True OnClick = ButtonCancelClick end object ButtonOk: TButton Align = Right Position.X = 260.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 1 Text = 'OK' OnClick = ButtonOkClick end end object VertScrollBox: TVertScrollBox Align = Client Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Margins.Right = -10.000000000000000000 Size.Width = 430.000000000000000000 Size.Height = 578.000000000000000000 Size.PlatformDefault = False TabOrder = 21 Viewport.Width = 414.000000000000000000 Viewport.Height = 578.000000000000000000 object ComboEditModel: TComboEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'combo_style' TabOrder = 3 ItemHeight = 36.000000000000000000 Items.Strings = ( 'gpt-3.5-turbo' 'gpt-3.5-turbo-0613' 'gpt-3.5-turbo-16k' 'gpt-4' 'gpt-4-turbo' 'gpt-4-0613' 'gpt-4-32k') ItemIndex = 0 Text = 'gpt-3.5-turbo' Position.Y = 134.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False OnMouseWheel = ComboEditModelMouseWheel end object EditMaxTokens: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 4 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 382.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'Example: 4096' object ClearEditButton3: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path2: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object EditQueryMaxToken: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 5 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 492.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'Example: 1024' object ClearEditButton4: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path3: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label1: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 10.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 25.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 20.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Chat Settings' TabOrder = 21 TabStop = False end object Label16: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 465.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Query max tokens (default: 1024)' TabOrder = 24 TabStop = False end object Label17: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 425.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Limit of the selected model' TabOrder = 13 TabStop = False end object Label18: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 535.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Max number of tokens per request' TabOrder = 10 TabStop = False end object Label19: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 177.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'GPT-4 is currently in a limited beta and only accessible to thos' + 'e who have been granted access' TabOrder = 12 TabStop = False end object Label3: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 575.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Temperature (default: 1.0)' TabOrder = 14 TabStop = False end object Label4: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 627.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'The higher, the more creativity will be in the answers (less acc' + 'urate)' TabOrder = 11 TabStop = False end object Label8: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 112.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Model (default: gpt-3.5-turbo)' TabOrder = 26 TabStop = False end object Label9: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 355.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Model max tokens (default: 4096)' TabOrder = 28 TabStop = False end object Layout3: TLayout Align = Top Position.Y = 597.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 6 TabStop = False object TrackBarTemp: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Value = 10.000000000000000000 OnTracking = TrackBarTempTracking end object LabelTemp: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '2.0' TabOrder = 71 TabStop = False end end object Layout1: TLayout Align = Top Position.Y = 689.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 7 TabStop = False object TrackBarPP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Min = -20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnTracking = TrackBarPPTracking end object LabelPP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 71 TabStop = False end end object Label12: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 667.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Presence penalty (default: 0.0)' TabOrder = 23 TabStop = False end object Label11: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 719.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Number between -2.0 and 2.0. Positive values penalize new tokens' + ' based on whether they appear in the text so far, increasing the' + ' model'#39's likelihood to talk about new topics.' TabOrder = 19 TabStop = False end object Label15: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 788.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Frequency penalty (default: 0.0)' TabOrder = 20 TabStop = False end object Layout5: TLayout Align = Top Position.Y = 810.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 8 TabStop = False object TrackBarFP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Min = -20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnTracking = TrackBarFPTracking end object LabelFP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 71 TabStop = False end end object Label13: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 840.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Number between -2.0 and 2.0. Positive values penalize new tokens' + ' based on their existing frequency in the text so far, decreasin' + 'g the model'#39's likelihood to repeat the same line verbatim.' TabOrder = 16 TabStop = False end object Label28: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 961.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 73.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'An alternative to sampling with temperature, called nucleus samp' + 'ling, where the model considers the results of the tokens with t' + 'op_p probability mass. So 0.1 means only the tokens comprising t' + 'he top 10% probability mass are considered.'#13#10'We generally recomm' + 'end altering this or temperature but not both.' TabOrder = 15 TabStop = False end object Layout6: TLayout Align = Top Position.Y = 931.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 9 TabStop = False object TrackBarTopP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 10.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Value = 10.000000000000000000 OnTracking = TrackBarTopPTracking end object LabelTopP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 71 TabStop = False end end object Label30: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 909.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Top P (default: 1.0)' TabOrder = 18 TabStop = False end object LabelAppearance: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 75.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'General settings' TabOrder = 0 TabStop = False end object Layout7: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Margins.Top = 20.000000000000000000 Position.Y = 231.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 2 TabStop = False object SwitchUseFunctions: TSwitch Align = Right IsChecked = False Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label34: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Use functions' TabOrder = 0 TabStop = False end end object Label35: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 301.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'In an API call, you can describe functions to gpt-3.5-turbo-0613' + ', gpt-3.5-turbo-16k and gpt-4-0613' TabOrder = 17 TabStop = False end object Layout9: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Position.Y = 261.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 1 TabStop = False object SwitchAutoExecFuncs: TSwitch Align = Right IsChecked = False Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label37: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Auto execution of functions' TabOrder = 0 TabStop = False end end object Layout2: TLayout Align = Top Position.Y = 1039.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 30 end end end end ================================================ FILE: ChatGPT.ChatSettings.pas ================================================ unit ChatGPT.ChatSettings; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Objects, FMX.Edit, FMX.Controls.Presentation, FMX.Layouts, ChatGPT.Classes, FMX.ComboEdit; type TFrameChatSettings = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; LayoutActs: TLayout; ButtonCancel: TButton; ButtonOk: TButton; VertScrollBox: TVertScrollBox; ComboEditModel: TComboEdit; EditMaxTokens: TEdit; ClearEditButton3: TClearEditButton; Path2: TPath; EditQueryMaxToken: TEdit; ClearEditButton4: TClearEditButton; Path3: TPath; Label1: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label3: TLabel; Label4: TLabel; Label8: TLabel; Label9: TLabel; Layout3: TLayout; TrackBarTemp: TTrackBar; LabelTemp: TLabel; Layout1: TLayout; TrackBarPP: TTrackBar; LabelPP: TLabel; Label12: TLabel; Label11: TLabel; Label15: TLabel; Layout5: TLayout; TrackBarFP: TTrackBar; LabelFP: TLabel; Label13: TLabel; Label28: TLabel; Layout6: TLayout; TrackBarTopP: TTrackBar; LabelTopP: TLabel; Label30: TLabel; LabelAppearance: TLabel; Layout7: TLayout; SwitchUseFunctions: TSwitch; Label34: TLabel; Label35: TLabel; Layout9: TLayout; SwitchAutoExecFuncs: TSwitch; Label37: TLabel; Layout2: TLayout; procedure TrackBarTempTracking(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure ButtonOkClick(Sender: TObject); procedure FrameResize(Sender: TObject); procedure RectangleBGClick(Sender: TObject); procedure TrackBarPPTracking(Sender: TObject); procedure TrackBarFPTracking(Sender: TObject); procedure TrackBarTopPTracking(Sender: TObject); procedure ComboEditModelMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); private FProcCallback: TProc; FLayoutClientWidth: Single; FLayoutClientHeight: Single; protected procedure SetMode(const Value: TWindowMode); override; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); end; var FrameChatSettings: TFrameChatSettings; implementation uses System.Math, FMX.Ani, HGM.FMX.Ani, ChatGPT.Manager; {$R *.fmx} { TFrameChatSettings } procedure TFrameChatSettings.Cancel; begin if Assigned(FProcCallback) then FProcCallback(Self, False); Release; end; procedure TFrameChatSettings.ComboEditModelMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin Handled := True; VertScrollBox.AniCalculations.MouseWheel(0, -WheelDelta); end; procedure TFrameChatSettings.ButtonCancelClick(Sender: TObject); begin Cancel; end; procedure TFrameChatSettings.ButtonOkClick(Sender: TObject); begin if Assigned(FProcCallback) then FProcCallback(Self, True); Release; end; constructor TFrameChatSettings.Create(AOwner: TComponent); begin inherited; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; VertScrollBox.AniCalculations.Animation := True; //VertScrollBox.AniCalculations.Interval := 1; VertScrollBox.AniCalculations.Averaging := True; VertScrollBox.ViewportPosition := TPoint.Zero; ComboEditModel.Items.Clear; ComboEditModel.Items.AddStrings(ActualModels); Name := ''; end; class procedure TFrameChatSettings.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); begin var Frame := TFrameChatSettings.Create(AParent); Frame.Parent := AParent; Frame.FProcCallback := ProcExecuted; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; if Assigned(ProcSet) then ProcSet(Frame); Frame.TrackBarTempTracking(nil); Frame.TrackBarPPTracking(nil); Frame.TrackBarFPTracking(nil); Frame.TrackBarTopPTracking(nil); Frame.ButtonCancel.SetFocus; end; procedure TFrameChatSettings.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameChatSettings.RectangleBGClick(Sender: TObject); begin Cancel; end; procedure TFrameChatSettings.SetMode(const Value: TWindowMode); begin inherited; if Mode = TWindowMode.Compact then begin LayoutClient.Align := TAlignLayout.Client; RectangleFrame.Corners := []; end else begin LayoutClient.Align := TAlignLayout.Center; RectangleFrame.Corners := AllCorners; end; FrameResize(nil); end; procedure TFrameChatSettings.TrackBarFPTracking(Sender: TObject); begin LabelFP.Text := FormatFloat('0.0', TrackBarFP.Value / 10); end; procedure TFrameChatSettings.TrackBarPPTracking(Sender: TObject); begin LabelPP.Text := FormatFloat('0.0', TrackBarPP.Value / 10); end; procedure TFrameChatSettings.TrackBarTempTracking(Sender: TObject); begin LabelTemp.Text := FormatFloat('0.0', TrackBarTemp.Value / 10); end; procedure TFrameChatSettings.TrackBarTopPTracking(Sender: TObject); begin LabelTopP.Text := FormatFloat('0.0', TrackBarTopP.Value / 10); end; end. ================================================ FILE: ChatGPT.Classes.pas ================================================ unit ChatGPT.Classes; interface uses System.SysUtils, OpenAI.Chat.Functions; {$SCOPEDENUMS ON} type TWindowMode = (Compact, Full); TPartType = (Text, Code); TMessageKind = (User, Assistant, System, Error, Func); TMessageKindHelper = record helper for TMessageKind function ToString: string; class function FromString(const Value: string): TMessageKind; static; end; TMessageFuncState = (Wait, Success, Error, Executing); TPart = record PartType: TPartType; Content: string; Language: string; end; TUnderMouse = record WordStart: Int64; WordLength: Int64; WordLine: Int64; Text: string; end; TOnFuncExecute = procedure(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc) of object; TOnNeedFuncList = procedure(Sender: TObject; out Items: TArray) of object; TOnTextUpdated = procedure(Sender: TObject; const MessageId, Text: string) of object; const MaxMessageWidth = 850; procedure OpenUrl(const URL: string); implementation uses {$IFDEF ANDROID} Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.NET, {$ENDIF} {$IF DEFINED(IOS) OR DEFINED(IOS64)} MacApi.Helpers, iOSApi.Foundation, FMX.Helpers.iOS, {$ENDIF} {$IFDEF POSIX} Posix.Stdlib, {$ENDIF POSIX} {$IFDEF MSWINDOWS} ShellAPI, DarkModeApi.FMX, FMX.Platform.Win, {$ENDIF} FMX.Platform; procedure OpenUrl(const URL: string); begin {$IFDEF ANDROID} TAndroidHelper.Context.startActivity(TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, StrToJURI(URL))); {$ENDIF} {$IF DEFINED(IOS) OR DEFINED(IOS64)} SharedApplication.OpenURL(StrToNSUrl(URL)); {$ENDIF} {$IFDEF POSIX} _system(PAnsiChar('open ' + AnsiString(URL))); {$ENDIF POSIX} {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(URL), nil, nil, 1); {$ENDIF} end; { TMessageKindHelper } class function TMessageKindHelper.FromString(const Value: string): TMessageKind; begin if Value = 'system' then Exit(TMessageKind.System) else if Value = 'user' then Exit(TMessageKind.User) else if Value = 'assistant' then Exit(TMessageKind.Assistant) else if Value = 'error' then Exit(TMessageKind.Error) else if Value = 'function' then Exit(TMessageKind.Func) else Result := TMessageKind.User; end; function TMessageKindHelper.ToString: string; begin case Self of TMessageKind.System: Result := 'system'; TMessageKind.User: Result := 'user'; TMessageKind.Assistant: Result := 'assistant'; TMessageKind.Error: Result := 'error'; TMessageKind.Func: Result := 'function'; end; end; end. ================================================ FILE: ChatGPT.Code.pas ================================================ unit ChatGPT.Code; interface uses System.SysUtils, FMX.Graphics, System.UITypes, System.Generics.Collections, FMX.TextLayout; type TKeyWord = class Word: TArray; Font: TFont; Color: TAlphaColor; constructor Create; destructor Destroy; override; end; TKeyWords = class(TObjectList) function FindWord(const Value: string; out Key: TKeyWord): Boolean; end; TTextAttributedRangeData = record public Range: TTextRange; Attribute: TTextAttribute; constructor Create(const ARange: TTextRange; const AAttribute: TTextAttribute); end; TLineTextAttributedRange = class(TList) private FText: string; public property Text: string read FText write FText; end; TCodeSyntaxClass = class of TCodeSyntax; TRegisteredSyntax = record SyntaxClass: TCodeSyntaxClass; Languages: TArray; end; TCachedAttributes = TDictionary>; TCodeSyntax = class abstract private class var FRegitered: TList; protected FCached: TCachedAttributes; FDefaultFont: TFont; FDefaultColor: TAlphaColor; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); virtual; destructor Destroy; override; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; virtual; abstract; procedure DropCache; virtual; class function FindSyntax(const Language: string; DefaultFont: TFont; DefaultColor: TAlphaColor): TCodeSyntax; class procedure RegisterSyntax(Languages: TArray; CodeSyntaxClass: TCodeSyntaxClass); end; implementation { TKeyWord } constructor TKeyWord.Create; begin inherited; Font := TFont.Create; end; destructor TKeyWord.Destroy; begin Font.Free; inherited; end; { TKeyWords } function TKeyWords.FindWord(const Value: string; out Key: TKeyWord): Boolean; begin var LowValue := Value.ToLower; for var KeyWord in Self do for var Word in KeyWord.Word do begin if Word = LowValue then begin Key := KeyWord; Exit(True); end; end; Result := False; end; { TTextAttributedRangeData } constructor TTextAttributedRangeData.Create(const ARange: TTextRange; const AAttribute: TTextAttribute); begin Self.Range := ARange; Self.Attribute := AAttribute; end; { TCodeSyntax } constructor TCodeSyntax.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited Create; FCached := TCachedAttributes.Create; FDefaultFont := DefaultFont; FDefaultColor := DefaultColor; end; destructor TCodeSyntax.Destroy; begin FCached.Free; inherited; end; procedure TCodeSyntax.DropCache; begin FCached.Clear; end; class function TCodeSyntax.FindSyntax(const Language: string; DefaultFont: TFont; DefaultColor: TAlphaColor): TCodeSyntax; begin if not Assigned(FRegitered) then Exit(nil); for var Item in FRegitered do for var Lang in Item.Languages do if Lang = Language.ToLower then Exit(Item.SyntaxClass.Create(DefaultFont, DefaultColor)); Result := nil; end; class procedure TCodeSyntax.RegisterSyntax(Languages: TArray; CodeSyntaxClass: TCodeSyntaxClass); begin if not Assigned(FRegitered) then FRegitered := TList.Create; var Reg: TRegisteredSyntax; Reg.SyntaxClass := CodeSyntaxClass; Reg.Languages := Languages; FRegitered.Add(Reg); end; initialization finalization TCodeSyntax.FRegitered.Free; end. ================================================ FILE: ChatGPT.FrameChat.fmx ================================================ object FrameChat: TFrameChat Align = Contents Size.Width = 1006.000000000000000000 Size.Height = 786.000000000000000000 Size.PlatformDefault = False object RectangleBG: TRectangle Align = Contents Fill.Color = xFF343541 Locked = True HitTest = False Size.Width = 1006.000000000000000000 Size.Height = 786.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None end object VertScrollBoxChat: TVertScrollBox Align = Contents Padding.Bottom = 160.000000000000000000 Size.Width = 1006.000000000000000000 Size.Height = 786.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnViewportPositionChange = VertScrollBoxChatViewportPositionChange Viewport.Width = 990.000000000000000000 Viewport.Height = 786.000000000000000000 object LayoutTyping: TLayout Align = Top Padding.Left = 16.000000000000000000 Padding.Top = 16.000000000000000000 Padding.Right = 16.000000000000000000 Padding.Bottom = 16.000000000000000000 Size.Width = 990.000000000000000000 Size.Height = 62.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnResize = LayoutTypingResize OnResized = LayoutTypingResize object RectangleTypeBG: TRectangle Align = Contents Fill.Color = x14FFFFFF Locked = True Size.Width = 990.000000000000000000 Size.Height = 62.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None end object LayoutTypingContent: TLayout Align = HorzCenter Locked = True Position.X = 117.000000000000000000 Position.Y = 16.000000000000000000 Size.Width = 755.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object Layout3: TLayout Align = Left Margins.Right = 14.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object RectangleBot: TRectangle Align = Top Fill.Color = xFF10A37F Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path3: TPath Align = Center Data.Path = { 0F010000000000002D21164232F786410200000057EC1742B762784102000000 928B1842F38E61410200000054F4174272F94A4102000000155D1742F1633441 02000000D792154279921E410200000039B41242C2FA0A41020000004D730E42 75B0DA4002000000EBF3074261C3AB400200000032260042B6F38F4002000000 F2B0F04141486840020000004547DF4109C45940020000006F92CE412E737640 020000006C09C741E48332400200000074C6BD41E17AF83F02000000D567B341 3884AE3F020000003709A941711B493F0200000098CC9D419C87FB3E02000000 47729241E90C003F02000000CC5D81416876FD3E02000000C66D61410282953F 020000004BC8454157041B4002000000D1222A4184476B400200000094931541 0A4BAE400200000034110B41014DEF400200000090A0E9405969F84002000000 5B94BF40607605410200000070CE9A4001CD1241020000000A116C40A3232041 0200000048C42E404F4031410200000024D10140F4FD444102000000D3DA743F AC8B6241020000007A70FF3EF16382410200000033C1383FE561934102000000 3ACA713FA45FA44102000000FB05EB3FF55BB44102000000E9265140CE08C141 020000004F753440A5CECB41020000001B812A408638D74102000000DCF43340 4783E241020000009D683D4007CEED4102000000740C5A40AEB6F84102000000 D7FA834055410142020000005C03A640E2A90842020000005DFED9405F870E42 020000001C360C415501124202000000F46C2B414A7B1542020000004F404E41 A36316420200000093A96F41C89814420200000099BB7E41C2D7184202000000 F9A088411C3C1C420200000063FF9241E18B1E4202000000015E9D418CDB2042 02000000A09AA841E908224202000000F1F4B341CCFF214202000000AC0BC541 8805224202000000D7B4D54112541F4202000000CE88E3410E4F1A4202000000 FB5CF141094A15420200000012A5FB41D0330E42020000009672004254120642 02000000C4020642CCEE0442020000004D440B426A9E02420200000015DD0F42 6891FE4102000000C375144232E6F741020000008C4A1842A857EF4102000000 CE191B42D578E5410200000019621F4261B2D641020000008E3521424D95C541 02000000CB5020423199B44102000000226C1F42159DA3410200000009DB1B42 9CA29341020000002D21164232F78641030000002D21164232F7864100000000 7FFBB341238A17420200000054F4A541B38C174202000000015E9841DC171542 020000005F988D41B499104202000000AF148E41CF77104202000000CCEE8E41 023C104202000000EE7C8F417D101042010000000534CF412653FB4102000000 6ACDD0414B6AFA41020000006221D2419318F94102000000E70CD3419D80F741 02000000A1F8D341A7E8F541020000004D73D4416519F441020000006F70D441 8F42F241010000006F70D441006F984101000000D35EEF41E7FBA74102000000 DE82EF41ED0DA84102000000FFA1EF418D28A841020000008CB9EF418649A841 02000000E5D0EF417F6AA84102000000A4DFEF41CB90A84102000000C3E4EF41 BBB8A84101000000C3E4EF41781CF34102000000A4DFEF410080014202000000 8A8EE941CC1D094202000000C353DE4185BC0E4202000000FC18D341575B1442 02000000D3DEC341BC851742020000007FFBB341238A1742030000007FFBB341 238A1742000000007A8DCC401B0DF841020000007172B04010E9EB4102000000 4451A64083AFDD4102000000F2EFAF4098DDCF41020000006BD4B1404C26D041 02000000A722B54087A7D04102000000ED81B740C5FED041010000001B2F5B41 64CCF54102000000295C5E41F5B9F6410200000009F961414C37F74102000000 B5A665414C37F74102000000F85369414C37F74102000000D8F06C41F5B9F641 02000000E71D704164CCF5410100000017D9C541E5E1C8410100000017D9C541 B3FBE7410200000057DBC5414024E841020000008FD3C541014DE84102000000 5BC2C541DE71E8410200000027B1C541BC96E841020000002497C541E3B6E841 020000009476C54142CFE84101000000B90D8541B1FF064202000000B98D6E41 66F70A42020000002CD44D41EF090C42020000007E1D2F414AFB094202000000 A5661041A5EC0742020000004469EC40BBE70242020000007A8DCC401B0DF841 030000007A8DCC401B0DF841000000009981894010E95941020000006B7DA540 C89841410200000075B0D1407FFB2E41020000007D2E0341BD52254102000000 7D2E0341BA6B2641020000005A1E0341645D2841020000005A1E0341AEB62941 010000005A1E0341C9769E41020000009E1803416A4DA04102000000AE0D0441 431CA2410200000045E4054105B4A34102000000DCBA0741924BA54102000000 04620A41159DA64102000000FD930D41F085A7410100000012949441006FD441 01000000C74B7341B3FBE34102000000C80773413A12E441020000008CB97241 BE1FE44102000000736872416E23E44102000000591772411E27E44102000000 6DC57141C520E44102000000787A7141CB10E44101000000734BE14079D8BE41 020000008048AA407CE1B641020000002D268240BAC9A941020000008D626340 D26F9A4102000000C07842401E168B410200000070995340F775754102000000 9981894010E95941030000009981894010E9594100000000D7A3FF41DE71A041 010000007FD9B141BF0E674101000000E3C7CC4138F8474102000000E2E9CC41 92CB4741020000000011CD4121B04741020000008C39CD41C1A8474102000000 1962CD4162A1474102000000DB8ACD417DAE47410200000055B0CD4170CE4741 010000006A0D074259178941020000009FFC0B42C1CA8E4102000000BE011042 832F97410200000074A41242584AA14102000000114715422C65AB4102000000 366B1642C1CAB64102000000CCEE1542AF25C24102000000617215429D80CD41 02000000515A13427958D84102000000AFE50F423E68E14102000000F2700C42 0378EA410200000019C40742A45FF14102000000366B02421450F54102000000 366B0242F2C1F44102000000366B024252C9F34102000000366B0242781CF341 01000000366B02420681A94102000000296D024236ABA741020000008A300242 C6DCA5410200000099BB01423945A44102000000A8460142ACADA24102000000 B29D0042C05BA14102000000D7A3FF41DE71A04103000000D7A3FF41DE71A041 00000000D5380D426E3470410200000050FC0C42BE9F6F410200000089920C42 90A06E4102000000A8460C427CF26D410100000004D6D841D656244102000000 7D3FD741857C2241020000004171D54141822141020000006B9AD34141822141 02000000CAC3D14141822141020000005AF5CF41857C224102000000D35ECE41 D656244101000000AF9480413D2C7E4101000000AF948041A1F83F4102000000 6F9280411EA73F4102000000379A804104563F41020000006BAB80414A0C3F41 020000009FBC80418FC23E4102000000A1D6804141823E410200000032F78041 83513E41010000000D60C1410C02E840020000000E3ECB41BC3FD14002000000 C286D6414833C640020000000AE8E1417C27C840020000005249ED41C51BCA40 020000008C4AF84111FCD840020000004ED10042E50AF340020000003C7D0542 DD8C0641020000000523094296A118410200000067550B424CA62D4102000000 C8870D42CEAA424102000000832F0E4283C0594102000000D5380D426E347041 03000000D5380D426E34704100000000DFE063410389AF4101000000D2002E41 1CFC9F4102000000BBB82D4116EA9F4102000000107A2D4176CF9F4102000000 5E4B2D417DAE9F4102000000AC1C2D41848D9F4102000000C5FE2C4138679F41 02000000F1F42C41143F9F4101000000F1F42C41AEB6294102000000A1F82C41 5DED124102000000107A33413A3BF94002000000DDB53F4160C8D24002000000 13F24B418655AC400200000038675D41A0A68D40020000003D0A724122A67440 02000000A156834104FF4D4002000000B7D18E412FA83F4002000000841E9A41 0E4F4B4002000000856BA541EDF55640020000003A12B0414B1F7C4002000000 C3D3B841B0389B40020000007357B84102489C4002000000FA7EB74118269E40 0200000035EFB641E8829F40010000003B706E41DB5C194102000000713D6B41 342E1B4102000000EA95684124D11D410200000077BE66416900214102000000 6DE76441832F24410200000013F263419FCD27410200000066F76341E17A2B41 01000000DFE063410389AF4103000000DFE063410389AF410000000068918041 28FE8F4101000000E336A341FDF677410100000029DCC541E1FA8F4101000000 29DCC541EEFCB74101000000E336A34185FCCB410100000068918041EEFCB741 010000006891804128FE8F41030000006891804128FE8F41} Fill.Color = claWhite Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Layout4: TLayout Align = Client Locked = True Size.Width = 711.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object RectangleIndicate: TRectangle Align = Left Fill.Color = xFFE6E6E6 Margins.Top = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.Y = 7.000000000000000000 Size.Width = 10.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFFC4C4C4 end end end end object LayoutWelcome: TLayout Align = Top Locked = True Position.Y = 62.000000000000000000 Size.Width = 990.000000000000000000 Size.Height = 619.000000000000000000 Size.PlatformDefault = False TabOrder = 3 OnResize = LayoutWelcomeResize OnResized = LayoutWelcomeResize object LabelWelcomeTitle: TLabel Align = Top AutoSize = True StyledSettings = [Family] Margins.Top = 188.000000000000000000 Margins.Bottom = 64.000000000000000000 Position.Y = 188.000000000000000000 Size.Width = 990.000000000000000000 Size.Height = 48.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 36.000000000000000000 TextSettings.Font.StyleExt = {00060000000000000004000000} TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'ChatGPT' TabOrder = 2 end object FlowLayoutWelcome: TFlowLayout Align = HorzCenter Locked = True Position.X = 183.000000000000000000 Position.Y = 300.000000000000000000 Size.Width = 624.000000000000000000 Size.Height = 319.000000000000000000 Size.PlatformDefault = False TabOrder = 1 Justify = Left JustifyLastLine = Left FlowDirection = LeftToRight OnResize = FlowLayoutWelcomeResize OnResized = FlowLayoutWelcomeResize object LayoutExampleTitle: TLayout Align = Client Locked = True Size.Width = 208.000000000000000000 Size.Height = 319.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object PathExaFull: TPath Align = MostTop Data.Path = { 9C00000000000000000080430000104302000000004042430000104302000000 0000104300404243020000000000104300008043020000000000104300E09E43 02000000004042430000B84302000000000080430000B8430200000000E09E43 0000B843020000000000B84300E09E43020000000000B8430000804302000000 0000B843004042430200000000E09E4300001043020000000000804300001043 03000000000080430000104300000000000080430000A84302000000DFCF5343 0000A84302000000000030431018964302000000000030430000804302000000 00003043DFCF534302000000DFCF534300003043020000000000804300003043 020000001018964300003043020000000000A843DFCF5343020000000000A843 00008043020000000000A8431018964302000000101896430000A84302000000 000080430000A84303000000000080430000A84300000000000080430000E042 02000000A06A84430000E04202000000000088437FAAD1420200000000008843 0000C042010000000000884300008042020000000000884302AB5C4202000000 A06A84430000404202000000000080430000404202000000C02A774300004042 020000000000704302AB5C420200000000007043000080420100000000007043 0000C04202000000000070437FAAD14202000000C12A77430000E04202000000 000080430000E04203000000000080430000E04200000000000080430000C843 02000000C02A77430000C84302000000000070436095CB430200000000007043 0000D04301000000000070430000E0430200000000007043A06AE44302000000 C02A77430000E84302000000000080430000E84302000000A06A84430000E843 0200000000008843A06AE44302000000000088430000E0430100000000008843 0000D04302000000000088436095CB4302000000A06A84430000C84302000000 000080430000C84303000000000080430000C843000000001038BE43C12A1A43 010000001088C943C18A03430200000010A8CC438295FA420200000010A8CC43 8255E642020000001088C94382D5D942020000001068C6438255CD4202000000 1058C1438255CD42020000001038BE4382D5D9420100000010E8B243C18A0343 0200000010C8AF43C1CA09430200000010C8AF43C1EA13430200000010E8B243 C12A1A43020000001008B643C16A2043020000001018BB43C16A204302000000 1038BE43C12A1A43030000001038BE43C12A1A4300000000DF8F0343C1EAB243 01000000BEDFD942C13ABE4302000000BE5FCD42A05AC14302000000BE5FCD42 A06AC64302000000BEDFD942A08AC94302000000BE5FE642A0AACC4302000000 BE9FFA42A0AACC4302000000DF8F0343A08AC94301000000DF2F1A43C13ABE43 02000000DF6F20431118BB4302000000DF6F2043A00AB64302000000DF2F1A43 C1EAB2430200000021F01343A0CAAF4302000000DFCF0943F0C7AF4302000000 DF8F0343C1EAB24303000000DF8F0343C1EAB243000000000000E04200008043 020000000000E042C02A7743020000007FAAD14200007043020000000000C042 000070430100000000008042000070430200000002AB5C420000704302000000 00004042C02A77430200000000004042000080430200000000004042A06A8443 0200000002AB5C4200008843020000000000804200008843010000000000C042 00008843020000007FAAD14200008843020000000000E042A06A844302000000 0000E04200008043030000000000E04200008043000000000000E04300007043 010000000000D04300007043020000006095CB4300007043020000000000C843 C02A7743020000000000C84300008043020000000000C843A06A844302000000 6095CB4300008843020000000000D04300008843010000000000E04300008843 02000000A06AE44300008843020000000000E843A06A8443020000000000E843 00008043020000000000E843C02A774302000000A06AE4430000704302000000 0000E04300007043030000000000E04300007043000000007F8A0343C12A1A43 02000000C1CA0943C16A204302000000C0EA1343C16A2043020000007F2A1A43 C12A1A4302000000C16A2043C1EA134302000000C16A2043C1CA094302000000 7F2A1A43C18A0343010000007F8A034382D5D94202000000FE94FA428255CD42 020000008155E6428255CD4202000000FED4D94282D5D94202000000FE54CD42 8255E64202000000FE54CD428295FA4202000000FED4D942C18A034301000000 7F8A0343C12A1A43030000007F8A0343C12A1A4300000000C13ABE43F0E7B243 020000001118BB43F0C7AF4302000000A00AB643F0C7AF4302000000C1EAB243 F0E7B24302000000A0CAAF43F007B6430200000011C8AF43F017BB4302000000 C1EAB243F037BE4301000000C13ABE43F087C94302000000A05AC143F0A7CC43 02000000A06AC643F0A7CC4302000000A08AC943F087C94302000000A0AACC43 F067C64302000000A0AACC43F057C14302000000A08AC943F037BE4301000000 C13ABE43F0E7B24303000000C13ABE43F0E7B243} Fill.Color = xFFECECF1 Locked = True Margins.Top = 2.000000000000000000 Margins.Bottom = 4.000000000000000000 Position.Y = 2.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object ButtonExample3: TButton Tag = 1 OnTap = ButtonExample3Tap Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 226.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TabOrder = 0 Text = '"How do I make an HTTP request in Javascript?" '#8594 TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.WordWrap = True OnClick = ButtonExample3Click end object ButtonExample2: TButton Tag = 1 OnTap = ButtonExample2Tap Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 147.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TabOrder = 1 Text = '"Got any creative ideas for a 10 year old'#8217's birthday?" '#8594 TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.WordWrap = True OnClick = ButtonExample2Click end object ButtonExample1: TButton Tag = 1 OnTap = ButtonExample1Tap Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 68.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TabOrder = 2 Text = '"Explain quantum computing in simple terms" '#8594 TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.WordWrap = True OnClick = ButtonExample1Click end object Layout5: TLayout Align = Top Locked = True Position.Y = 30.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 31.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object Label2: TLabel Align = Center AutoSize = True StyledSettings = [Family, Style] Locked = True Size.Width = 75.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Examples' TabOrder = 3 object PathExaCompact: TPath Align = Left Data.Path = { 9C00000000000000000080430000104302000000004042430000104302000000 0000104300404243020000000000104300008043020000000000104300E09E43 02000000004042430000B84302000000000080430000B8430200000000E09E43 0000B843020000000000B84300E09E43020000000000B8430000804302000000 0000B843004042430200000000E09E4300001043020000000000804300001043 03000000000080430000104300000000000080430000A84302000000DFCF5343 0000A84302000000000030431018964302000000000030430000804302000000 00003043DFCF534302000000DFCF534300003043020000000000804300003043 020000001018964300003043020000000000A843DFCF5343020000000000A843 00008043020000000000A8431018964302000000101896430000A84302000000 000080430000A84303000000000080430000A84300000000000080430000E042 02000000A06A84430000E04202000000000088437FAAD1420200000000008843 0000C042010000000000884300008042020000000000884302AB5C4202000000 A06A84430000404202000000000080430000404202000000C02A774300004042 020000000000704302AB5C420200000000007043000080420100000000007043 0000C04202000000000070437FAAD14202000000C12A77430000E04202000000 000080430000E04203000000000080430000E04200000000000080430000C843 02000000C02A77430000C84302000000000070436095CB430200000000007043 0000D04301000000000070430000E0430200000000007043A06AE44302000000 C02A77430000E84302000000000080430000E84302000000A06A84430000E843 0200000000008843A06AE44302000000000088430000E0430100000000008843 0000D04302000000000088436095CB4302000000A06A84430000C84302000000 000080430000C84303000000000080430000C843000000001038BE43C12A1A43 010000001088C943C18A03430200000010A8CC438295FA420200000010A8CC43 8255E642020000001088C94382D5D942020000001068C6438255CD4202000000 1058C1438255CD42020000001038BE4382D5D9420100000010E8B243C18A0343 0200000010C8AF43C1CA09430200000010C8AF43C1EA13430200000010E8B243 C12A1A43020000001008B643C16A2043020000001018BB43C16A204302000000 1038BE43C12A1A43030000001038BE43C12A1A4300000000DF8F0343C1EAB243 01000000BEDFD942C13ABE4302000000BE5FCD42A05AC14302000000BE5FCD42 A06AC64302000000BEDFD942A08AC94302000000BE5FE642A0AACC4302000000 BE9FFA42A0AACC4302000000DF8F0343A08AC94301000000DF2F1A43C13ABE43 02000000DF6F20431118BB4302000000DF6F2043A00AB64302000000DF2F1A43 C1EAB2430200000021F01343A0CAAF4302000000DFCF0943F0C7AF4302000000 DF8F0343C1EAB24303000000DF8F0343C1EAB243000000000000E04200008043 020000000000E042C02A7743020000007FAAD14200007043020000000000C042 000070430100000000008042000070430200000002AB5C420000704302000000 00004042C02A77430200000000004042000080430200000000004042A06A8443 0200000002AB5C4200008843020000000000804200008843010000000000C042 00008843020000007FAAD14200008843020000000000E042A06A844302000000 0000E04200008043030000000000E04200008043000000000000E04300007043 010000000000D04300007043020000006095CB4300007043020000000000C843 C02A7743020000000000C84300008043020000000000C843A06A844302000000 6095CB4300008843020000000000D04300008843010000000000E04300008843 02000000A06AE44300008843020000000000E843A06A8443020000000000E843 00008043020000000000E843C02A774302000000A06AE4430000704302000000 0000E04300007043030000000000E04300007043000000007F8A0343C12A1A43 02000000C1CA0943C16A204302000000C0EA1343C16A2043020000007F2A1A43 C12A1A4302000000C16A2043C1EA134302000000C16A2043C1CA094302000000 7F2A1A43C18A0343010000007F8A034382D5D94202000000FE94FA428255CD42 020000008155E6428255CD4202000000FED4D94282D5D94202000000FE54CD42 8255E64202000000FE54CD428295FA4202000000FED4D942C18A034301000000 7F8A0343C12A1A43030000007F8A0343C12A1A4300000000C13ABE43F0E7B243 020000001118BB43F0C7AF4302000000A00AB643F0C7AF4302000000C1EAB243 F0E7B24302000000A0CAAF43F007B6430200000011C8AF43F017BB4302000000 C1EAB243F037BE4301000000C13ABE43F087C94302000000A05AC143F0A7CC43 02000000A06AC643F0A7CC4302000000A08AC943F087C94302000000A0AACC43 F067C64302000000A0AACC43F057C14302000000A08AC943F037BE4301000000 C13ABE43F0E7B24303000000C13ABE43F0E7B243} Fill.Color = xFFECECF1 Locked = True Margins.Left = -35.000000000000000000 Position.X = -35.000000000000000000 Size.Width = 24.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end end object LayoutCapabilitiesTitle: TLayout Align = Client Locked = True Size.Width = 208.000000000000000000 Size.Height = 319.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object PathCapFull: TPath Align = MostTop Data.Path = { 340000000000000085250B413C4A253D0200000096890E41D32E063E02000000 2E7F1041B0AFB53E02000000F1E30F415A0D153F010000006B7101411500C040 0100000097FF47411500C040020000005F074B411500C04002000000CDCC4D41 A06CC34002000000BB274F4145D8C8400200000041825041E943CE4002000000 B537504183C0D44002000000FE654E419A99D940010000008ECCDC40CDCC6C41 02000000855FD8401AC06F4102000000857CD04007CE70410200000063B4C940 865A6F410200000042ECC2406DE76D41020000001101BF4054526A4102000000 8B37C0404FAF664101000000971CDD40F6FF0F4101000000D6FF1F40F6FF0F41 0200000009E11340F6FF0F41020000004FCC0840B0490E4102000000BF600340 DE930B41020000000CEAFB3F0BDE0841020000000B41FE3FBE9F054102000000 3C66064033330341010000007099014180D64C3E02000000F4CF03410C01803C 0200000074C10741EF264EBD0200000085250B413C4A253D0300000085250B41 3C4A253D00000000D6FF5F400000004101000000ACFFEF400000004102000000 BCB3F4400000004102000000C32AF940D9080141020000000135FC4037D40241 020000003E3FFF408A9F044102000000F1460041DAFE064102000000F7C7FF40 A6500941010000007D91EA401FF448410100000097FF37410000E04001000000 ACFFEF400000E04002000000B24BEB400000E04002000000AAD4E6404EEEDD40 020000006DCAE3409357DA40020000002FC0E040ECC0D640020000008B71DF40 4B02D240020000007637E040B35ECD4001000000F06DF540D72F1C4001000000 D6FF5F400000004103000000D6FF5F4000000041} Fill.Color = xFFECECF1 Locked = True Margins.Top = 2.000000000000000000 Margins.Bottom = 4.000000000000000000 Position.Y = 2.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object Label5: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 68.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'Remembers what user said earlier in the conversation' TabOrder = 3 end object Label6: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 147.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 66.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'Allows user to provide follow-up corrections' TabOrder = 1 end object Label9: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 227.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 64.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'Trained to decline inappropriate requests' TabOrder = 0 end object Layout6: TLayout Align = Top Locked = True Position.Y = 30.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 31.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object Label1: TLabel Align = Center AutoSize = True StyledSettings = [Family, Style] Locked = True Size.Width = 92.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Capabilities' TabOrder = 3 object PathCapCompact: TPath Align = Left Data.Path = { 340000000000000085250B413C4A253D0200000096890E41D32E063E02000000 2E7F1041B0AFB53E02000000F1E30F415A0D153F010000006B7101411500C040 0100000097FF47411500C040020000005F074B411500C04002000000CDCC4D41 A06CC34002000000BB274F4145D8C8400200000041825041E943CE4002000000 B537504183C0D44002000000FE654E419A99D940010000008ECCDC40CDCC6C41 02000000855FD8401AC06F4102000000857CD04007CE70410200000063B4C940 865A6F410200000042ECC2406DE76D41020000001101BF4054526A4102000000 8B37C0404FAF664101000000971CDD40F6FF0F4101000000D6FF1F40F6FF0F41 0200000009E11340F6FF0F41020000004FCC0840B0490E4102000000BF600340 DE930B41020000000CEAFB3F0BDE0841020000000B41FE3FBE9F054102000000 3C66064033330341010000007099014180D64C3E02000000F4CF03410C01803C 0200000074C10741EF264EBD0200000085250B413C4A253D0300000085250B41 3C4A253D00000000D6FF5F400000004101000000ACFFEF400000004102000000 BCB3F4400000004102000000C32AF940D9080141020000000135FC4037D40241 020000003E3FFF408A9F044102000000F1460041DAFE064102000000F7C7FF40 A6500941010000007D91EA401FF448410100000097FF37410000E04001000000 ACFFEF400000E04002000000B24BEB400000E04002000000AAD4E6404EEEDD40 020000006DCAE3409357DA40020000002FC0E040ECC0D640020000008B71DF40 4B02D240020000007637E040B35ECD4001000000F06DF540D72F1C4001000000 D6FF5F400000004103000000D6FF5F4000000041} Fill.Color = xFFECECF1 Locked = True Margins.Left = -35.000000000000000000 Position.X = -35.000000000000000000 Size.Width = 24.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end end object LayoutLimitationsTitle: TLayout Align = Client Locked = True Size.Width = 208.000000000000000000 Size.Height = 319.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object PathLimFull: TPath Align = MostTop Data.Path = { 4E00000000000000000080410000D04102000000AF536E410000D04102000000 0000604129D6C84102000000000060410000C0410200000000006041D729B741 02000000AF536E410000B04102000000000080410000B0410200000028D68841 0000B0410200000000009041D729B74102000000000090410000C04102000000 0000904129D6C8410200000029D688410000D04102000000000080410000D041 03000000000080410000D04100000000000080410000C0410300000000008041 0000C04100000000000080410000A04102000000D72977410000A04102000000 00007041146B9C41020000000000704100009841010000000000704100003041 0200000000007041D729274102000000D8297741000020410200000000008041 0000204102000000146B8441000020410200000000008841D729274102000000 00008841000030410100000000008841000098410200000000008841146B9C41 02000000146B84410000A04102000000000080410000A0410300000000008041 0000A04100000000713DDE410000F041010000003D0A87400000F04102000000 0D4D45400110F0410200000054C20140FC46EB41020000009E99B93FA570E341 0200000060485F3F54C7DB41020000005C6D593FA13BD241020000008AEBB13F 6766CA410100000052B8524148E16A4002000000527A6041A4D9064002000000 3DE77F4148BEC43F0200000093748C41256719400200000035BF9041724A2C40 020000006D479441348C484002000000D7A3964148E16A400100000048E1F441 6666CA41020000009734F941A03BD24102000000BF05F94153C7DB4102000000 6866F441A470E34102000000B7C7EF41FC46EB41020000005F56E7410210F041 02000000703DDE410000F04103000000713DDE410000F0410000000000008041 00008040020000000DD87841545F7F4002000000EB367241287E874002000000 48E16E41F7289440010000009A9949400000D241020000005AC93B4035DAD441 020000005AC93B40796DD841020000009A994940AE47DB4102000000D2ED5640 C222DE410200000038286F402FECDF4102000000CECC84400000E04101000000 713DDE410000E041020000009E8BE1412FECDF4102000000EB92E441C222DE41 02000000713DE641AE47DB410200000079F7E741796DD8410200000079F7E741 35DAD44102000000703DE6410000D241010000005C8F8841F628944002000000 8AE48641287E874002000000F9938341545F7F40020000000000804100008040 030000000000804100008040} Fill.Color = xFFECECF1 Locked = True Margins.Top = 2.000000000000000000 Margins.Bottom = 4.000000000000000000 Position.Y = 2.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object Label8: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 68.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'May occasionally generate incorrect information' TabOrder = 3 end object Label7: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 147.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'May occasionally produce harmful instructions or biased content' TabOrder = 1 end object Label10: TLabel Tag = 1 Align = Top StyledSettings = [Family, Style] Margins.Left = 7.000000000000000000 Margins.Top = 7.000000000000000000 Margins.Right = 7.000000000000000000 Margins.Bottom = 7.000000000000000000 Position.X = 7.000000000000000000 Position.Y = 226.000000000000000000 Size.Width = 194.000000000000000000 Size.Height = 65.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_welcome' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center Text = 'Limited knowledge of world and events after 2021' TabOrder = 0 end object Layout7: TLayout Align = Top Locked = True Position.Y = 30.000000000000000000 Size.Width = 208.000000000000000000 Size.Height = 31.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object Label11: TLabel Align = Center AutoSize = True StyledSettings = [Family, Style] Locked = True Size.Width = 87.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Limitations' TabOrder = 3 object PathLimCompact: TPath Align = Left Data.Path = { 4E00000000000000000080410000D04102000000AF536E410000D04102000000 0000604129D6C84102000000000060410000C0410200000000006041D729B741 02000000AF536E410000B04102000000000080410000B0410200000028D68841 0000B0410200000000009041D729B74102000000000090410000C04102000000 0000904129D6C8410200000029D688410000D04102000000000080410000D041 03000000000080410000D04100000000000080410000C0410300000000008041 0000C04100000000000080410000A04102000000D72977410000A04102000000 00007041146B9C41020000000000704100009841010000000000704100003041 0200000000007041D729274102000000D8297741000020410200000000008041 0000204102000000146B8441000020410200000000008841D729274102000000 00008841000030410100000000008841000098410200000000008841146B9C41 02000000146B84410000A04102000000000080410000A0410300000000008041 0000A04100000000713DDE410000F041010000003D0A87400000F04102000000 0D4D45400110F0410200000054C20140FC46EB41020000009E99B93FA570E341 0200000060485F3F54C7DB41020000005C6D593FA13BD241020000008AEBB13F 6766CA410100000052B8524148E16A4002000000527A6041A4D9064002000000 3DE77F4148BEC43F0200000093748C41256719400200000035BF9041724A2C40 020000006D479441348C484002000000D7A3964148E16A400100000048E1F441 6666CA41020000009734F941A03BD24102000000BF05F94153C7DB4102000000 6866F441A470E34102000000B7C7EF41FC46EB41020000005F56E7410210F041 02000000703DDE410000F04103000000713DDE410000F0410000000000008041 00008040020000000DD87841545F7F4002000000EB367241287E874002000000 48E16E41F7289440010000009A9949400000D241020000005AC93B4035DAD441 020000005AC93B40796DD841020000009A994940AE47DB4102000000D2ED5640 C222DE410200000038286F402FECDF4102000000CECC84400000E04101000000 713DDE410000E041020000009E8BE1412FECDF4102000000EB92E441C222DE41 02000000713DE641AE47DB410200000079F7E741796DD8410200000079F7E741 35DAD44102000000703DE6410000D241010000005C8F8841F628944002000000 8AE48641287E874002000000F9938341545F7F40020000000000804100008040 030000000000804100008040} Fill.Color = xFFECECF1 Locked = True Margins.Left = -35.000000000000000000 Position.X = -35.000000000000000000 Size.Width = 24.000000000000000000 Size.Height = 24.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end end end end end object LayoutSend: TLayout Align = MostBottom Padding.Top = 10.000000000000000000 Padding.Bottom = 40.000000000000000000 Margins.Right = 11.000000000000000000 Position.Y = 686.000000000000000000 Size.Width = 995.000000000000000000 Size.Height = 100.000000000000000000 Size.PlatformDefault = False TabOrder = 1 OnResize = LayoutSendResize OnResized = LayoutSendResize object LineBorder: TLine Align = Contents Locked = True HitTest = False LineType = Top Size.Width = 995.000000000000000000 Size.Height = 100.000000000000000000 Size.PlatformDefault = False Stroke.Color = x33FFFFFF end object RectangleSendBG: TRectangle Align = Contents Fill.Kind = Gradient Fill.Gradient.Points = < item Color = xFF343541 Offset = 0.217391297221183800 end item Color = x00353740 Offset = 1.000000000000000000 end> Fill.Gradient.StartPosition.X = 0.500000000000000000 Fill.Gradient.StartPosition.Y = 1.000000000000000000 Fill.Gradient.StopPosition.X = 0.499999970197677600 Fill.Gradient.StopPosition.Y = 0.000000000000000000 Locked = True HitTest = False Size.Width = 995.000000000000000000 Size.Height = 100.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None object Label12: TLabel Align = Bottom AutoSize = True StyledSettings = [Style] Opacity = 0.699999988079071000 Margins.Bottom = 4.000000000000000000 Position.Y = 82.000000000000000000 Size.Width = 995.000000000000000000 Size.Height = 14.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 11.000000000000000000 TextSettings.FontColor = xAFFFFFFF TextSettings.HorzAlign = Center TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'by HemulGM' TabOrder = 0 end end object LayoutQuery: TLayout Align = HorzCenter Locked = True HitTest = True Padding.Top = 12.000000000000000000 Padding.Right = 16.000000000000000000 Padding.Bottom = 12.000000000000000000 Position.X = 113.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 768.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object RectangleMemoBG: TRectangle Align = Contents Fill.Color = xFF40414F Locked = True HitTest = False Margins.Left = 15.000000000000000000 Size.Width = 753.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False Stroke.Color = x3C000000 XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object MemoQuery: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] DataDetectorTypes = [] StyledSettings = [Style] TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = claWhite TextSettings.WordWrap = True OnChange = MemoQueryChange OnChangeTracking = MemoQueryChange Align = Top Margins.Top = 2.000000000000000000 Position.X = 26.000000000000000000 Position.Y = 14.000000000000000000 Size.Width = 618.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False StyleLookup = 'memostyle_clear' TabOrder = 0 OnEnter = MemoQueryEnter OnKeyUp = MemoQueryKeyUp OnKeyDown = MemoQueryKeyDown OnViewportPositionChange = MemoQueryViewportPositionChange Viewport.Width = 608.000000000000000000 Viewport.Height = 26.000000000000000000 object LabelSendTip: TLabel Align = Contents StyledSettings = [Family, Style] Opacity = 0.800000011920929000 Margins.Right = -200.000000000000000000 Size.Width = 201.000000000000000000 Size.Height = 21.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFACACBE TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'Send a message.' TabOrder = 0 end end object LayoutSendControls: TLayout Align = MostRight Margins.Left = 4.000000000000000000 Position.X = 648.000000000000000000 Position.Y = 12.000000000000000000 Size.Width = 104.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object LayoutSendCommons: TLayout Align = Bottom Size.Width = 104.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonAudio: TButton Align = Right CanFocus = False Hint = 'Submit an audio recording for recognition. Will be taken into ac' + 'count in the context of communication with GPT (Whisper)' Position.X = 26.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 3 ParentShowHint = False ShowHint = True OnClick = ButtonAudioClick object Path8: TPath Align = Center Data.Path = { 19000000000000000000A0400000A84101000000000040400000A84101000000 0000404000003041010000000000A04000003041030000000000A0400000A841 00000000000030410000E04001000000000010410000E0400100000000001041 0000C84101000000000030410000C84103000000000030410000E04000000000 000088410000004001000000000070410000004001000000000070410000F041 01000000000088410000F041030000000000884100000040000000000000B841 00003041010000000000A84100003041010000000000A8410000A84101000000 0000B8410000A841030000000000B84100003041000000000000E8410000E040 010000000000D8410000E040010000000000D8410000C841010000000000E841 0000C841030000000000E8410000E040} Fill.Color = xFFACACBE Locked = True HitTest = False Size.Width = 14.000000000000000000 Size.Height = 14.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object ButtonSend: TButton Align = Right CanFocus = False Hint = 'Send prompt' Position.X = 78.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 5 Text = 'ButtonSend' OnClick = ButtonSendClick object PathSend: TPath Align = Center Data.Path = { 2700000000000000D34D2E415A642340020000003A582A41DFCA034002000000 16BB20419307EE3F02000000B8D418412EDA064002000000CDBE1541CA090D40 02000000143E1341AC0C1740020000002DB211415964234001000000B4C80640 8B6C84410200000068EFED3F116088410200000059C503405D2E8D4102000000 876123407D288F4102000000BBB43140DA0D904102000000B3324240FC3E9041 02000000989951402DB28F41010000006666044195438441020000000F450B41 124883410200000004011041002480410200000000001041D122794101000000 00001041000030410200000000001041D729274102000000D829174100002041 0200000000002041000020410200000028D62841000020410200000000003041 D72927410200000000003041000030410100000000003041D122794102000000 1CFF2F4124248041020000002CBB34412C48834102000000DF993B41A0438441 01000000F0CC85412BB08F4102000000500C8A4189E7904102000000397A8E41 75728E410200000097B18F4114338A4102000000A23E90418646884102000000 EE0D9041FE3686410200000019298F41966C84410100000032522E41B0642340 03000000D34D2E415A64234003000000D34D2E415A642340} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 RotationAngle = 90.000000000000000000 Size.Width = 12.800000190734860000 Size.Height = 12.800000190734860000 Size.PlatformDefault = False Stroke.Kind = None Visible = False WrapMode = Fit end object PathAudio: TPath Align = Center Data.Path = { 4F0000000000000000004041000080410200000039B41C410000804102000000 00000041AE47634102000000000000410000404101000000000000410000C040 020000000000004148E172400200000039B41C41000000400200000000004041 0000004002000000C74B634100000040020000000000804148E1724002000000 000080410000C0400100000000008041000040410200000000008041AE476341 02000000C74B6341000080410200000000004041000080410300000000004041 00008041000000000000404100008040020000001D5A2E410000804002000000 0000204108AC9C4002000000000020410000C040010000000000204100004041 0200000000002041FCA95141020000001D5A2E41000060410200000000004041 0000604102000000E3A55141000060410200000000006041FCA9514102000000 000060410000404101000000000060410000C040020000000000604108AC9C40 02000000E3A55141000080400200000000004041000080400300000000004041 0000804000000000000098410000404101000000000098410000204102000000 00009841EA261741020000008B6C944100001041020000000000904100001041 0200000075938B41000010410200000000008841E92617410200000000008841 000020410100000000008841000040410200000000008841AC1C6C4102000000 AC1C6C41000088410200000000004041000088410200000054E3134100008841 020000000000E040AC1C6C41020000000000E04000004041010000000000E040 00002041020000000000E040EA261741020000002DB2D1400000104102000000 0000C0400000104102000000D34DAE4000001041020000000000A040E9261741 020000000000A04000002041010000000000A04000004041020000000000A040 EC51784102000000B29DF340BC7493410200000000003041295C974101000000 000030410000A04101000000000000410000A04102000000D34DEE400000A041 020000000000E0407593A341020000000000E0400000A841020000000000E040 8B6CAC4102000000D34DEE400000B04102000000000000410000B04101000000 000080410000B041020000008B6C84410000B04102000000000088418B6CAC41 02000000000088410000A84102000000000088417593A341020000008B6C8441 0000A04102000000000080410000A04101000000000050410000A04101000000 00005041295C97410200000093188341BC7493410200000000009841EC517841 020000000000984100004041030000000000984100004041} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 15.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object PathStopRecord: TPath Align = Center Data.Path = { 1200000000000000000080410000C04001000000000000410000C04002000000 CDCCDC400000C040020000000000C040CDCCDC40020000000000C04000000041 010000000000C04000008041020000000000C040CDCC884102000000CDCCDC40 0000904102000000000000410000904101000000000080410000904102000000 CDCC8841000090410200000000009041CDCC8841020000000000904100008041 0100000000009041000000410200000000009041CDCCDC4002000000CDCC8841 0000C04002000000000080410000C04003000000000080410000C040} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 RotationAngle = 90.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object ButtonImage: TButton Align = Right CanFocus = False Hint = 'Image generation mode on demand (DALL-E)' Position.X = 52.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 4 Text = 'ButtonSend' OnClick = ButtonImageClick object RectangleImageMode: TRectangle Align = Client Fill.Kind = None Locked = True HitTest = False Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFFACACBE Stroke.Thickness = 2.000000000000000000 XRadius = 4.000000000000000000 YRadius = 4.000000000000000000 ParentShowHint = False ShowHint = True end object PathImage: TPath Align = Center Data.Path = { 44000000000000000000B84300006043020000000040C5430000604302000000 0000D04300804A43020000000000D04300003043020000000000D04300801543 020000000040C54300000043020000000000B843000000430200000000C0AA43 00000043020000000000A04300801543020000000000A0430000304302000000 0000A04300804A430200000000C0AA4300006043020000000000B84300006043 030000000000B84300006043000000000000E243000080420100000000007042 00008042020000009A9931420000804202000000000000426666994202000000 000000429A99B84201000000000000429AD9D143020000000000004267A6D943 020000009A9931420000E04302000000000070420000E043010000000000E243 0000E04302000000CDCCE9430000E043020000000000F04366A6D94302000000 0000F0439AD9D143010000000000F0439A99B842020000000000F04366669942 02000000CDCCE94300008042020000000000E24300008042030000000000E243 00008042000000003373AE439AD982430200000033F3AC439A19814302000000 66A6AA4301807F4302000000CD0CA84301807F43020000000080A54301807F43 0200000033B3A34334F380430200000067A6A1439A99824301000000CD4C9843 00808A43020000009A59964366E68B4302000000CDCC94439AD98C4302000000 CD8C92439AD98C4302000000676690439AD98C430200000033738E43CD0C8C43 02000000CD0C8D43CDCC8A4302000000CD8C8C439A598A430200000067A68B43 008089430200000067E68A4300C088430100000000006043CD4C574302000000 00005C4333B352430200000000005643CDCC4F4302000000CD4C4F43CDCC4F43 020000009A994843CDCC4F4302000000676642439A1953430200000000803E43 9A99574301000000000080429A19B84301000000000080426666D74202000000 00008242CCCCC942020000009A998C420000C0420200000033339A420000C042 010000006766D9430000C042020000009AD9DC430000C0420200000067A6DF43 3333CA42020000009AD9DF430000D842010000000000E0433333B84301000000 3373AE439AD98243030000003373AE439AD98243} Fill.Color = xFFDDDDE4 Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 12.800000190734860000 Size.Height = 12.800000190734860000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object LabelTyping: TLabel Align = MostLeft StyledSettings = [Style] Margins.Left = 4.000000000000000000 Position.X = 4.000000000000000000 Size.Width = 20.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 20.000000000000000000 TextSettings.FontColor = xFFACACBE TextSettings.HorzAlign = Center TextSettings.WordWrap = False TextSettings.Trimming = None Text = '...' TabOrder = 2 end end end object LayoutChatSettings: TLayout Align = MostLeft Locked = True Margins.Left = -15.000000000000000000 Margins.Right = 15.000000000000000000 Position.X = -15.000000000000000000 Position.Y = 12.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonSettings: TButton Align = Bottom CanFocus = False Hint = 'Current chat settings' Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'ButtonTranslate' OnClick = ButtonSettingsClick object Path9: TPath Align = Center Data.Path = { FF0000000000000098CCA24152C40E41010000009EDE9F41D8810B4102000000 4B6A9F413F000B4102000000F2309F413EBF0A4102000000A1F89E41DD7B0A41 0200000052C99C41CCDD07410200000013F29A411040044102000000029A9941 EDD8FF40020000006677994105FAFE4002000000D65699414D10FE4002000000 121499415B42FC400200000083D19841E674FA4002000000B8AF98411A8BF940 0200000097909841ADA3F84002000000295C97411AA3EF40020000003FB59641 D49AE5400200000036AB9641D864DB400200000030AA96410B5EDA4002000000 65AA96419851D94002000000A5AC9641B83BD7400100000064BB9641FD9FC940 02000000BDD2964117D9B340020000009EDE964114EDA84002000000A01A9641 B41F9F4002000000C06C9541BE6A964002000000BA499441D4658E4002000000 05C592418D97874002000000B90D914164CC7F400200000077AD8E415FD27440 02000000EEEB89418AE55E4001000000A1F885414FAF4C4002000000933A8141 35D2364002000000AEB67D41ACE22B400200000043AD78416BB7274002000000 EF3874413507244002000000BE9F6F41F432244002000000832F6B415A2F2840 02000000A52C664125AF2C4002000000567D614196E73740020000005C205841 5C554E40010000006F125841696F4E40010000004469524187FE5B4002000000 4D84514164235E400200000062105141F4375F4002000000499D504161376040 020000005F294C414F1E6A400200000027314741F6976F400200000065194241 683F704002000000539641414850704002000000621041414850704002000000 530540414850704002000000E7FB3E4148507040020000003B703E4148507040 0200000029ED3D41683F704002000000F2D238414E976F4002000000DCD73341 F4156A40020000004E622F41B32460400200000035EF2E4120245F4002000000 567D2E41450D5E4002000000F6972D41C9E55B400100000060E5274161374E40 02000000AF771E41369337400200000014BF1941C93C2C400200000054B51441 6BB72740020000004F4010416BB72340020000004FA30B41139B234002000000 A42A07416957274002000000261E0241478F2B4002000000A1BEFA409F933640 0200000037C3E740249C4C400100000097ADE7404FAF4C4001000000AE12D840 A3CC5E400100000071E6D740B4025F4002000000DB16C54099D8744002000000 3FA9BB4043CA7F4002000000BADAB440758E87400200000068D0AE40EE5A8E40 02000000984CAA40A75C964002000000C898A740B70B9F4002000000C68AA440 72DCA8400200000078B4A44085CEB34002000000AE12A540B8AFC94001000000 404DA5408846D740020000001956A5404755D940020000008065A540185BDA40 02000000A661A540355EDB4002000000D23AA5408599E540020000006896A240 09A7EF40020000006EC09D40B4ABF840020000000B469D400490F94002000000 27C29C405474FA4002000000B2BA9B40603CFC400200000014B39A40D504FE40 020000005D339A40C0E7FE4002000000B9AA994009C4FF40020000007C449440 793B04410200000055DE8C40A9DE07410200000016138440D47D0A4102000000 6E3483403AC00A4102000000BA49824015000B41020000009A7C8040D67F0B41 0100000067D569408DB40E410200000047554340090A14410200000072163040 5FB516410200000077152240CD811A4102000000D9B1154016DE1D4102000000 04560C4051DA214102000000959F0640F9312641020000006F2A0040371A2B41 02000000BF2B0040D49A30410200000078450040A69B3B4101000000475A0040 6B9A444102000000AC73004066884F410200000092960040C5FE544102000000 7C0F07406ADE5941020000005CC90C40492E5E4102000000A9131640DD246241 020000006B652240B37B6541020000003F5230405B4269410200000018604340 79E96B410200000057956940C139714101000000314280407F6A744102000000 D23582405AF57441020000003C318340C13975410200000029228440AA827541 02000000EDD88C40FF21784102000000403094408FC27B4102000000B18A9940 DB0A804102000000B81E9A40A846804102000000DAAC9A40B684804102000000 1DC99B400601814102000000C6E19C407F7B81410200000061719D40BBB88141 0200000038F39D402BF6814102000000BEA4A240E62E8441020000000F28A540 E9A6864102000000E353A540FC29894102000000A358A540696F894102000000 A054A540A8B58941020000000A4BA540F8428A4101000000AE12A54088858D41 02000000D0B3A440AA02934102000000728AA440F2C19541020000000A9DA740 E937984102000000F354AA402C659A4102000000F8DFAE4066669C4102000000 BBF2B440021A9E410200000014D0BB405906A041020000006154C5406065A141 02000000AF5AD8400523A441010000002827E8407969A64102000000C91FFB40 4625A941020000009F4D0241AA82AA4102000000CB5607413108AB4102000000 53CB0B41287EAB4102000000ED641041A779AB41020000005CD5144110FAAA41 02000000C9D91941E269AA41020000003B8D1E41A301A9410200000041F12741 C431A641010000006B9A2D410080A44102000000CC7F2E41303BA44102000000 1FF42E41C818A44102000000CF662F41D5F8A34102000000BADA334102BCA241 02000000B7D13841E10BA2410200000079E93D41FDF6A141020000008B6C3E41 F1F4A141020000007CF23E41F1F4A141020000008BFD3F41F1F4A14102000000 6C094141F1F4A14102000000F38E4141F1F4A141020000006F124241FDF6A141 02000000A52C4741150CA24102000000D42B4C41D3BCA2410200000062A15041 E1FAA34102000000BC055141F016A441020000007F6A51413F35A44102000000 091B52414B6AA44101000000F31F5841BB38A64102000000B98D6141500DA941 02000000FE436641FD76AA4102000000D34D6B41C807AB41020000008FC26F41 C887AB4102000000AA607441E78CAB41020000007FD978418115AB4102000000 60E57D418A8EAA41020000005B538141432DA941020000009D1186418B6CA641 010000005F078A412720A4410200000002BC8E41F764A14102000000F6179141 5906A04102000000C7CB9241DA1B9E4102000000704E9441DC689C4102000000 D26F9541A7689A4102000000AC1C9641D33C984102000000D3DE964136CD9541 0200000026D396411E16934102000000CDBB9641F9B18D4101000000A5AC9641 E02D8A410200000065AA964130AA89410200000030AA9641A768894102000000 36AB9641F027894102000000D7B49641FC98864102000000235B97414D158441 02000000979098412CD48141020000004FAF9841099B8141020000007DD09841 7C6181410200000006129941D2EF804102000000F8539941F47D804102000000 2B76994105458041020000005F989941ED0D804102000000DEF19A4127C27B41 02000000C7CB9C414F1E784102000000C5FE9E41FA7E754102000000A8359F41 713D754102000000636E9F41C5FE744102000000D3DE9F414182744101000000 B7E29F41917E74410100000011C7A241BA497141020000002497A74188F46B41 020000003400AA4117486941020000004FC0AB41B37B654102000000CD4CAD41 8A1F624102000000CF77AE4174245E4102000000B22EAF4136CD594102000000 1CFCAF4157EC54410200000078FAAF41EB734F410200000066F7AF41DE934441 01000000BCF4AF41F1633B410200000076F1AF418E75304102000000D2EFAF41 97FF2A4102000000C520AF41F31F2641020000007969AE4114D0214102000000 773EAD418AD91D410200000039B4AB4175821A410200000032F7A941DEBC1641 020000007B94A7418C1514410200000048D0A241CEC70E410100000098CCA241 52C40E410300000098CCA24152C40E41000000005A0100410000404102000000 5A0100417958634102000000B7A81C4100008041020000003B01404100008041 020000001D5A634100008041020000009D00804179586341020000009D008041 00004041020000009D00804133A71C41020000001D5A6341ACFFFF4002000000 3B014041ACFFFF4002000000B7A81C41ACFFFF40020000005A01004133A71C41 020000005A01004100004041030000005A01004100004041} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object LayoutAudioRecording: TLayout Align = Contents Margins.Left = 26.000000000000000000 Margins.Top = 12.000000000000000000 Margins.Right = 16.000000000000000000 Margins.Bottom = 12.000000000000000000 Size.Width = 726.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 3 object AnimatedImageRecording: TSkAnimatedImage Align = Left Size.Width = 60.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False Data = { 7B2276223A22352E372E38222C226672223A32392E3937303030313232303730 33312C226970223A302C226F70223A34312E303030303031363639393634322C 2277223A3136302C2268223A36342C226E6D223A22436F6D702031222C226464 64223A302C22617373657473223A5B5D2C226C6179657273223A5B7B22646464 223A302C22696E64223A312C227479223A342C226E6D223A22524543204F7574 6C696E6573222C227372223A312C226B73223A7B226F223A7B2261223A302C22 6B223A3130302C226978223A31317D2C2272223A7B2261223A302C226B223A30 2C226978223A31307D2C2270223A7B2261223A302C226B223A5B3130352E3538 2C33322E3734362C305D2C226978223A322C226C223A327D2C2261223A7B2261 223A302C226B223A5B2D31392E31372C2D362E332C305D2C226978223A312C22 6C223A327D2C2273223A7B2261223A302C226B223A5B3235312C3235312C3130 305D2C226978223A362C226C223A327D7D2C22616F223A302C22736861706573 223A5B7B227479223A226772222C226974223A5B7B22696E64223A302C227479 223A227368222C226978223A312C226B73223A7B2261223A302C226B223A7B22 69223A5B5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B2D302E 3337382C302E3538335D2C5B302C302E3837335D2C5B302E38322C302E363734 5D2C5B312E3531322C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B30 2C305D2C5B302C305D5D2C226F223A5B5B302C305D2C5B302C305D2C5B302C30 5D2C5B302E3736382C2D302E3334365D2C5B302E3337382C2D302E3538335D2C 5B302C2D312E32335D2C5B2D302E38322C2D302E3637345D2C5B302C305D2C5B 302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D5D2C2276 223A5B5B2D32362E30312C305D2C5B2D32332E31382C305D2C5B2D32332E3138 2C2D302E3132335D2C5B2D32352E3934392C2D352E3335335D2C5B2D32342E32 33312C2D362E3734365D2C5B2D32332E3636342C2D382E39335D2C5B2D32342E 3839342C2D31312E3738365D2C5B2D32382E3339322C2D31322E3739375D2C5B 2D33332E3134372C2D31322E3739375D2C5B2D33332E3134372C305D2C5B2D33 302E35312C305D2C5B2D33302E35312C2D342E3638355D2C5B2D32382E34312C 2D342E3638355D5D2C2263223A747275657D2C226978223A327D2C226E6D223A 2252222C226D6E223A224144424520566563746F72205368617065202D204772 6F7570222C226864223A66616C73657D2C7B22696E64223A312C227479223A22 7368222C226978223A322C226B73223A7B2261223A302C226B223A7B2269223A 5B5B302C305D2C5B302C305D2C5B2D302E3334332C2D302E3334365D2C5B302C 2D302E3630335D2C5B302E3336332C2D302E3333375D2C5B302E3636322C305D 2C5B302C305D5D2C226F223A5B5B302C305D2C5B302E3730392C305D2C5B302E 3334332C302E3334365D2C5B302C302E3539325D2C5B2D302E3336332C302E33 33375D2C5B302C305D2C5B302C305D5D2C2276223A5B5B2D33302E35312C2D31 302E3636315D2C5B2D32382E3339322C2D31302E3636315D2C5B2D32362E3831 352C2D31302E3134335D2C5B2D32362E332C2D382E3731395D2C5B2D32362E38 34352C2D372E3332365D2C5B2D32382E3338332C2D362E38325D2C5B2D33302E 35312C2D362E38325D5D2C2263223A747275657D2C226978223A327D2C226E6D 223A2252222C226D6E223A224144424520566563746F72205368617065202D20 47726F7570222C226864223A66616C73657D2C7B227479223A226D6D222C226D 6D223A312C226E6D223A224D657267652050617468732031222C226D6E223A22 4144424520566563746F722046696C746572202D204D65726765222C22686422 3A66616C73657D2C7B227479223A22666C222C2263223A7B2261223A302C226B 223A5B312C302E3239343131373634373035392C302E33363037383433313337 32352C315D2C226978223A347D2C226F223A7B2261223A302C226B223A313030 2C226978223A357D2C2272223A312C22626D223A302C226E6D223A2246696C6C 2031222C226D6E223A224144424520566563746F722047726170686963202D20 46696C6C222C226864223A66616C73657D2C7B227479223A227472222C227022 3A7B2261223A302C226B223A5B302C305D2C226978223A327D2C2261223A7B22 61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A 302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122 3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A 3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269 78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C 226E6D223A225472616E73666F726D227D5D2C226E6D223A2252222C226E7022 3A352C22636978223A322C22626D223A302C226978223A312C226D6E223A2241 44424520566563746F722047726F7570222C226864223A66616C73657D2C7B22 7479223A226772222C226974223A5B7B22696E64223A302C227479223A227368 222C226978223A312C226B73223A7B2261223A302C226B223A7B2269223A5B5B 302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C 305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D 2C5B302C305D5D2C226F223A5B5B302C305D2C5B302C305D2C5B302C305D2C5B 302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C 305D2C5B302C305D2C5B302C305D2C5B302C305D5D2C2276223A5B5B2D31332E 3531312C2D372E3631315D2C5B2D31382E3537332C2D372E3631315D2C5B2D31 382E3537332C2D31302E3636315D2C5B2D31322E3634392C2D31302E3636315D 2C5B2D31322E3634392C2D31322E3739375D2C5B2D32312E32312C2D31322E37 39375D2C5B2D32312E32312C305D2C5B2D31322E3633322C305D2C5B2D31322E 3633322C2D322E3131385D2C5B2D31382E3537332C2D322E3131385D2C5B2D31 382E3537332C2D352E3534365D2C5B2D31332E3531312C2D352E3534365D5D2C 2263223A747275657D2C226978223A327D2C226E6D223A2245222C226D6E223A 224144424520566563746F72205368617065202D2047726F7570222C22686422 3A66616C73657D2C7B227479223A22666C222C2263223A7B2261223A302C226B 223A5B312C302E3239343131373634373035392C302E33363037383433313337 32352C315D2C226978223A347D2C226F223A7B2261223A302C226B223A313030 2C226978223A357D2C2272223A312C22626D223A302C226E6D223A2246696C6C 2031222C226D6E223A224144424520566563746F722047726170686963202D20 46696C6C222C226864223A66616C73657D2C7B227479223A227472222C227022 3A7B2261223A302C226B223A5B302C305D2C226978223A327D2C2261223A7B22 61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A 302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122 3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A 3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269 78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C 226E6D223A225472616E73666F726D227D5D2C226E6D223A2245222C226E7022 3A332C22636978223A322C22626D223A302C226978223A322C226D6E223A2241 44424520566563746F722047726F7570222C226864223A66616C73657D2C7B22 7479223A226772222C226974223A5B7B22696E64223A302C227479223A227368 222C226978223A312C226B73223A7B2261223A302C226B223A7B2269223A5B5B 302C305D2C5B302E3430312C2D302E3337325D2C5B302E3831342C305D2C5B30 2E3431392C302E3633395D2C5B302C312E3338335D2C5B302C305D2C5B2D302E 3433372C302E36335D2C5B2D302E3837392C305D2C5B2D302E3339362C2D302E 3337325D2C5B2D302E3036352C2D302E3832365D2C5B302C305D2C5B302E3930 322C302E3739315D2C5B312E3437372C305D2C5B302E3830362C2D302E353031 5D2C5B302E3433342C2D302E3933375D2C5B302C2D312E32335D2C5B302C305D 2C5B2D302E39342C2D312E3130345D2C5B2D312E3634312C305D2C5B2D302E39 31372C302E3739315D2C5B2D302E312C312E3337375D5D2C226F223A5B5B2D30 2E3035392C302E3737395D2C5B2D302E3430312C302E3337325D2C5B2D302E39 30322C305D2C5B2D302E3431392C2D302E3633395D2C5B302C305D2C5B302E30 31322C2D312E3332345D2C5B302E3433362C2D302E36335D2C5B302E3830392C 305D2C5B302E3339362C302E3337325D2C5B302C305D2C5B2D302E3134312C2D 312E34335D2C5B2D302E3930322C2D302E3739315D2C5B2D312E3036362C305D 2C5B2D302E3830362C302E3530315D2C5B2D302E3433342C302E3933385D2C5B 302C305D2C5B302C312E3932385D2C5B302E39342C312E3130355D2C5B312E35 2C305D2C5B302E3931372C2D302E3739315D2C5B302C305D5D2C2276223A5B5B 2D332E3232362C2D342E3236335D2C5B2D332E3931362C2D322E3533365D2C5B 2D352E3733392C2D312E3937385D2C5B2D372E3732312C2D322E3933365D2C5B 2D382E33352C2D352E3936385D2C5B2D382E33352C2D362E3933355D2C5B2D37 2E3637372C2D392E3836365D2C5B2D352E3730342C2D31302E3831315D2C5B2D 332E3839382C2D31302E3235325D2C5B2D332E3230382C2D382E3435355D2C5B 2D302E3537312C2D382E3435355D2C5B2D322E3133362C2D31312E3738365D2C 5B2D352E3730342C2D31322E3937335D2C5B2D382E3531322C2D31322E323231 5D2C5B2D31302E3337312C2D31302E3036335D2C5B2D31312E3032312C2D362E 3831325D2C5B2D31312E3032312C2D362E3032395D2C5B2D392E3631312C2D31 2E3438315D2C5B2D352E3733392C302E3137365D2C5B2D322E3131342C2D312E 3031315D2C5B2D302E3538392C2D342E3236335D5D2C2263223A747275657D2C 226978223A327D2C226E6D223A2243222C226D6E223A22414442452056656374 6F72205368617065202D2047726F7570222C226864223A66616C73657D2C7B22 7479223A22666C222C2263223A7B2261223A302C226B223A5B312C302E323934 3131373634373035392C302E3336303738343331333732352C315D2C22697822 3A347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D2C22 72223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E223A22 4144424520566563746F722047726170686963202D2046696C6C222C22686422 3A66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C226B 223A5B302C305D2C226978223A327D2C2261223A7B2261223A302C226B223A5B 302C305D2C226978223A317D2C2273223A7B2261223A302C226B223A5B313030 2C3130305D2C226978223A337D2C2272223A7B2261223A302C226B223A302C22 6978223A367D2C226F223A7B2261223A302C226B223A3130302C226978223A37 7D2C22736B223A7B2261223A302C226B223A302C226978223A347D2C22736122 3A7B2261223A302C226B223A302C226978223A357D2C226E6D223A225472616E 73666F726D227D5D2C226E6D223A2243222C226E70223A332C22636978223A32 2C22626D223A302C226978223A332C226D6E223A224144424520566563746F72 2047726F7570222C226864223A66616C73657D5D2C226970223A302C226F7022 3A34312E303030303031363639393634322C227374223A302C22626D223A307D 2C7B22646464223A302C22696E64223A332C227479223A342C226E6D223A2253 68617065204C617965722032222C227372223A312C226B73223A7B226F223A7B 2261223A302C226B223A3130302C226978223A31317D2C2272223A7B2261223A 302C226B223A302C226978223A31307D2C2270223A7B2261223A302C226B223A 5B33312C33322C305D2C226978223A322C226C223A327D2C2261223A7B226122 3A302C226B223A5B302C302C305D2C226978223A312C226C223A327D2C227322 3A7B2261223A312C226B223A5B7B2269223A7B2278223A5B302E3636372C302E 3636372C302E3636375D2C2279223A5B312C312C315D7D2C226F223A7B227822 3A5B302E3333332C302E3333332C302E3333335D2C2279223A5B302C302C305D 7D2C2274223A302C2273223A5B3132372C3132372C3130305D7D2C7B2269223A 7B2278223A5B302E3636372C302E3636372C302E3636375D2C2279223A5B312C 312C315D7D2C226F223A7B2278223A5B302E3333332C302E3333332C302E3333 335D2C2279223A5B302C302C305D7D2C2274223A31302C2273223A5B3134372C 3134372C3130305D7D2C7B2274223A32302E303030303030383134363136372C 2273223A5B3132372C3132372C3130305D7D5D2C226978223A362C226C223A32 7D7D2C22616F223A302C22736861706573223A5B7B227479223A226772222C22 6974223A5B7B2264223A312C227479223A22656C222C2273223A7B2261223A30 2C226B223A5B32362E32352C32362E32355D2C226978223A327D2C2270223A7B 2261223A302C226B223A5B302C305D2C226978223A337D2C226E6D223A22456C 6C6970736520506174682031222C226D6E223A224144424520566563746F7220 5368617065202D20456C6C69707365222C226864223A66616C73657D2C7B2274 79223A22666C222C2263223A7B2261223A302C226B223A5B312C302E32393431 31373634373035392C302E3336303738343331333732352C315D2C226978223A 347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D2C2272 223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E223A2241 44424520566563746F722047726170686963202D2046696C6C222C226864223A 66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C226B22 3A5B302E3337352C302E3337355D2C226978223A327D2C2261223A7B2261223A 302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A302C22 6B223A5B3130302C3130305D2C226978223A337D2C2272223A7B2261223A302C 226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A313030 2C226978223A377D2C22736B223A7B2261223A302C226B223A302C226978223A 347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C226E6D 223A225472616E73666F726D227D5D2C226E6D223A22456C6C69707365203122 2C226E70223A332C22636978223A322C22626D223A302C226978223A312C226D 6E223A224144424520566563746F722047726F7570222C226864223A66616C73 657D5D2C226970223A302C226F70223A34312E30303030303136363939363432 2C227374223A302C22626D223A307D2C7B22646464223A302C22696E64223A34 2C227479223A342C226E6D223A225368617065204C617965722031222C227372 223A312C226B73223A7B226F223A7B2261223A312C226B223A5B7B2269223A7B 2278223A5B302E3636375D2C2279223A5B315D7D2C226F223A7B2278223A5B30 2E3333335D2C2279223A5B305D7D2C2274223A302C2273223A5B3130305D7D2C 7B2274223A34302E303030303031363239323333342C2273223A5B305D7D5D2C 226978223A31317D2C2272223A7B2261223A302C226B223A302C226978223A31 307D2C2270223A7B2261223A302C226B223A5B33312C33322C305D2C22697822 3A322C226C223A327D2C2261223A7B2261223A302C226B223A5B302C302C305D 2C226978223A312C226C223A327D2C2273223A7B2261223A312C226B223A5B7B 2269223A7B2278223A5B302E3636372C302E3636372C302E3636375D2C227922 3A5B312C312C315D7D2C226F223A7B2278223A5B302E3333332C302E3333332C 302E3333335D2C2279223A5B302C302C305D7D2C2274223A302C2273223A5B31 32372C3132372C3130305D7D2C7B2274223A34302E3030303030313632393233 33342C2273223A5B3235302C3235302C3130305D7D5D2C226978223A362C226C 223A327D7D2C22616F223A302C22736861706573223A5B7B227479223A226772 222C226974223A5B7B2264223A312C227479223A22656C222C2273223A7B2261 223A302C226B223A5B32362E32352C32362E32355D2C226978223A327D2C2270 223A7B2261223A302C226B223A5B302C305D2C226978223A337D2C226E6D223A 22456C6C6970736520506174682031222C226D6E223A22414442452056656374 6F72205368617065202D20456C6C69707365222C226864223A66616C73657D2C 7B227479223A22666C222C2263223A7B2261223A302C226B223A5B312C302E32 39343131373634373035392C302E3336303738343331333732352C315D2C2269 78223A347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D 2C2272223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E22 3A224144424520566563746F722047726170686963202D2046696C6C222C2268 64223A66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C 226B223A5B302E3337352C302E3337355D2C226978223A327D2C2261223A7B22 61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A 302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122 3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A 3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269 78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C 226E6D223A225472616E73666F726D227D5D2C226E6D223A22456C6C69707365 2031222C226E70223A332C22636978223A322C22626D223A302C226978223A31 2C226D6E223A224144424520566563746F722047726F7570222C226864223A66 616C73657D5D2C226970223A302C226F70223A34312E30303030303136363939 3634322C227374223A302C22626D223A307D5D2C226D61726B657273223A5B5D 7D} end object LabelRecordingTime: TLabel Align = Left AutoSize = True StyledSettings = [Family, Style] Margins.Left = 10.000000000000000000 Margins.Right = 10.000000000000000000 Position.X = 70.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.WordWrap = False TextSettings.Trimming = None Text = '0:00' TabOrder = 1 end end object LayoutAttachments: TLayout Align = MostTop Position.X = 26.000000000000000000 Position.Y = 12.000000000000000000 Size.Width = 618.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 4 end end end object TimerTyping: TTimer Enabled = False Interval = 800 OnTimer = TimerTypingTimer Left = 64 Top = 80 end object OpenDialogAudio: TOpenDialog Filter = 'Supported formats|*.m4a; *.mp3; *.webm; *.mp4; *.mpga; *.wav; *.' + 'mpeg' Left = 64 Top = 202 end object LayoutButtom: TLayout Align = Bottom Locked = True Position.Y = 636.000000000000000000 Size.Width = 1006.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False TabOrder = 5 object FlowLayoutActions: TFlowLayout Align = Client ClipChildren = True HitTest = False Padding.Left = 40.000000000000000000 Padding.Top = 6.000000000000000000 Padding.Right = 40.000000000000000000 Margins.Left = 20.000000000000000000 Margins.Right = 20.000000000000000000 Size.Width = 966.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False Justify = Center JustifyLastLine = Center FlowDirection = LeftToRight HorizontalGap = 10.000000000000000000 VerticalGap = 10.000000000000000000 object ButtonContinue: TButton Align = Center Hint = 'Continue chat. Request an addition or continuation' Size.Width = 112.000000000000000000 Size.Height = 38.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_continue' TabOrder = 2 Text = 'Continue' TextSettings.HorzAlign = Leading OnClick = ButtonContinueClick object ShadowEffect2: TShadowEffect Distance = 0.001000000047497451 Direction = 45.000000000000000000 Softness = 0.600000023841857900 Opacity = 0.600000023841857900 ShadowColor = xFF343541 end end object ButtonExportImport: TButton Align = Center Hint = 'Import or export chat' Size.Width = 156.000000000000000000 Size.Height = 38.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_import_export' TabOrder = 1 Text = 'Import && Export' OnClick = ButtonExportImportClick object ShadowEffect3: TShadowEffect Distance = 0.001000000047497451 Direction = 45.000000000000000000 Softness = 0.600000023841857900 Opacity = 0.600000023841857900 ShadowColor = xFF343541 end object Rectangle2: TRectangle Anchors = [akTop, akRight] Fill.Color = xFFC40000 HitTest = False Position.X = 127.000000000000000000 Position.Y = -3.000000000000000000 Size.Width = 37.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 4.000000000000000000 YRadius = 4.000000000000000000 object Label3: TLabel Align = Client StyledSettings = [Style] Size.Width = 37.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 9.000000000000000000 TextSettings.FontColor = claWhite TextSettings.HorzAlign = Center TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'beta' TabOrder = 0 end end end object ButtonRetry: TButton Align = Center Hint = 'Resend request' Size.Width = 103.000000000000000000 Size.Height = 38.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_retry' TabOrder = 0 Text = ' Retry' TextSettings.HorzAlign = Leading OnClick = ButtonRetryClick object ShadowEffect1: TShadowEffect Distance = 0.001000000047497451 Direction = 45.000000000000000000 Softness = 0.600000023841857900 Opacity = 0.600000023841857900 ShadowColor = xFF343541 end end end object LayoutScrollDown: TLayout Align = Client Locked = True Padding.Top = 10.000000000000000000 Padding.Right = 30.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 1006.000000000000000000 Size.Height = 50.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object ButtonScrollDown: TButton Align = Right Hint = 'Scroll down' Position.X = 946.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'button_scrolldown' TabOrder = 0 Text = 'button_scrolldown' OnClick = ButtonScrollDownClick end end end object TimerCheckRecording: TTimer Enabled = False OnTimer = TimerCheckRecordingTimer Left = 64 Top = 144 end object Rectangle1: TRectangle Position.X = 20.000000000000000000 Position.Y = 70.000000000000000000 Size.Width = 190.000000000000000000 Size.Height = 97.000000000000000000 Size.PlatformDefault = False Visible = False object LabelTest: TLabel Align = Client Margins.Left = 4.000000000000000000 Margins.Top = 4.000000000000000000 Margins.Right = 4.000000000000000000 Margins.Bottom = 4.000000000000000000 Size.Width = 182.000000000000000000 Size.Height = 89.000000000000000000 Size.PlatformDefault = False TextSettings.VertAlign = Leading TextSettings.Trimming = None Text = 'LabelTest' TabOrder = 0 end end end ================================================ FILE: ChatGPT.FrameChat.pas ================================================ unit ChatGPT.FrameChat; interface {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Layouts, FMX.Memo.Types, FMX.Controls.Presentation, FMX.Memo.Style, FMX.ScrollBox, FMX.Memo, OpenAI, OpenAI.Completions, FMX.Edit.Style, ChatGPT.FrameMessage, ChatGPT.Classes, System.Threading, FMX.Edit, FMX.ImgList, OpenAI.Chat, System.Generics.Collections, OpenAI.Audio, OpenAI.Utils.ChatHistory, OpenAI.Images, ChatGPT.ChatSettings, System.JSON, FMX.Effects, FMX.ListBox, System.Skia, FMX.Skia, ChatGPT.SoundRecorder, FMX.InertialMovement, System.RTLConsts, OpenAI.Chat.Functions; type TButton = class(FMX.StdCtrls.TButton) public procedure SetBounds(X, Y, AWidth, AHeight: Single); override; end; TLabel = class(FMX.StdCtrls.TLabel) public procedure SetBounds(X, Y, AWidth, AHeight: Single); override; end; TFixedScrollCalculations = class(TScrollCalculations) protected procedure DoChanged; override; end; TVertScrollBox = class(FMX.Layouts.TVertScrollBox) private FViewPositionY: Single; procedure SetViewPositionY(const Value: Single); protected function CreateAniCalculations: TScrollCalculations; override; published property ViewPositionY: Single read FViewPositionY write SetViewPositionY; end; TMemo = class(FMX.Memo.TMemo) private FViewPos: Single; procedure SetViewPos(const Value: Single); public property ViewPos: Single read FViewPos write SetViewPos; end; TFrameChat = class(TFrame) VertScrollBoxChat: TVertScrollBox; LayoutSend: TLayout; RectangleSendBG: TRectangle; MemoQuery: TMemo; LayoutQuery: TLayout; RectangleMemoBG: TRectangle; LayoutSendControls: TLayout; LayoutTyping: TLayout; TimerTyping: TTimer; LayoutTypingContent: TLayout; Layout3: TLayout; RectangleBot: TRectangle; Path3: TPath; Layout4: TLayout; RectangleIndicate: TRectangle; LabelTyping: TLabel; LineBorder: TLine; LayoutWelcome: TLayout; RectangleBG: TRectangle; LabelWelcomeTitle: TLabel; FlowLayoutWelcome: TFlowLayout; LayoutExampleTitle: TLayout; PathExaFull: TPath; ButtonExample3: TButton; ButtonExample2: TButton; ButtonExample1: TButton; LayoutCapabilitiesTitle: TLayout; PathCapFull: TPath; Label5: TLabel; Label6: TLabel; Label9: TLabel; LayoutLimitationsTitle: TLayout; PathLimFull: TPath; Label8: TLabel; Label7: TLabel; Label10: TLabel; Label12: TLabel; LayoutSendCommons: TLayout; ButtonAudio: TButton; Path8: TPath; ButtonSend: TButton; PathSend: TPath; OpenDialogAudio: TOpenDialog; ButtonImage: TButton; PathImage: TPath; RectangleImageMode: TRectangle; RectangleTypeBG: TRectangle; LabelSendTip: TLabel; Layout5: TLayout; Label2: TLabel; PathExaCompact: TPath; Layout6: TLayout; Label1: TLabel; PathCapCompact: TPath; Layout7: TLayout; Label11: TLabel; PathLimCompact: TPath; LayoutChatSettings: TLayout; ButtonSettings: TButton; Path9: TPath; LayoutButtom: TLayout; ButtonRetry: TButton; ShadowEffect1: TShadowEffect; LayoutScrollDown: TLayout; ButtonScrollDown: TButton; PathAudio: TPath; LayoutAudioRecording: TLayout; AnimatedImageRecording: TSkAnimatedImage; PathStopRecord: TPath; TimerCheckRecording: TTimer; LabelRecordingTime: TLabel; ButtonContinue: TButton; ShadowEffect2: TShadowEffect; FlowLayoutActions: TFlowLayout; ButtonExportImport: TButton; ShadowEffect3: TShadowEffect; Rectangle1: TRectangle; LabelTest: TLabel; Rectangle2: TRectangle; Label3: TLabel; LayoutAttachments: TLayout; procedure LayoutSendResize(Sender: TObject); procedure MemoQueryChange(Sender: TObject); procedure ButtonSendClick(Sender: TObject); procedure TimerTypingTimer(Sender: TObject); procedure LayoutTypingResize(Sender: TObject); procedure MemoQueryKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure LayoutWelcomeResize(Sender: TObject); procedure FlowLayoutWelcomeResize(Sender: TObject); procedure ButtonExample1Click(Sender: TObject); procedure ButtonExample2Click(Sender: TObject); procedure ButtonExample3Click(Sender: TObject); procedure ButtonAudioClick(Sender: TObject); procedure ButtonImageClick(Sender: TObject); procedure ButtonSettingsClick(Sender: TObject); procedure ButtonRetryClick(Sender: TObject); procedure ButtonScrollDownClick(Sender: TObject); procedure VertScrollBoxChatViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); procedure TimerCheckRecordingTimer(Sender: TObject); procedure ButtonExample1Tap(Sender: TObject; const Point: TPointF); procedure ButtonExample2Tap(Sender: TObject; const Point: TPointF); procedure ButtonExample3Tap(Sender: TObject; const Point: TPointF); procedure MemoQueryKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure MemoQueryEnter(Sender: TObject); procedure MemoQueryViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); procedure ButtonContinueClick(Sender: TObject); procedure ButtonExportImportClick(Sender: TObject); private FAPI: IOpenAI; FChatId: string; FPool: TThreadPool; FTitle: string; FMode: TWindowMode; FIsTyping: Boolean; FBuffer: TChatHistory; FIsImageMode: Boolean; FTemperature: Single; FLastRequest: TProc; FMenuItem: TListBoxItem; FIsFirstMessage: Boolean; FPresencePenalty: Single; FModel: string; FMaxTokens: Integer; FMaxTokensQuery: Integer; FFrequencyPenalty: Single; FTopP: Single; FAudioRecord: TAudioRecord; FRecordingStartTime: TDateTime; FOnNeedFuncList: TOnNeedFuncList; FUseFunctions: Boolean; FAutoExecFuncs: Boolean; FOnTitleChanged: TNotifyEvent; procedure DoOnUpdateChatItems; function NewMessage(const Text: string; Role: TMessageKind; UseBuffer: Boolean = True; IsAudio: Boolean = False): TFrameMessage; function NewMessageImage(Role: TMessageKind; Images: TArray): TFrameMessage; procedure ClearChat; procedure SetTyping(const Value: Boolean); procedure SetAPI(const Value: IOpenAI); procedure SetChatId(const Value: string); procedure ShowError(const Text: string); procedure AppendMessages(Response: TChat); overload; procedure AppendMessages(Response: TImageGenerations); overload; procedure ScrollDown(Animate: Boolean = False); procedure SetTitle(const Value: string); procedure SetMode(const Value: TWindowMode); procedure AppendAudio(Response: TAudioTranscriptionObject); procedure SetIsImageMode(const Value: Boolean); procedure SendRequestImage; procedure SendRequestPrompt; procedure SetTemperature(const Value: Single); procedure RequestPrompt; procedure RequestImage(const Prompt: string); procedure RequestAudio(const AudioFile: string); procedure SetLastRequest(const Value: TProc); procedure SetMenuItem(const Value: TListBoxItem); procedure SetFrequencyPenalty(const Value: Single); procedure SetMaxTokens(const Value: Integer); procedure SetMaxTokensQuery(const Value: Integer); procedure SetModel(const Value: string); procedure SetPresencePenalty(const Value: Single); procedure ChatToUp; procedure SetTopP(const Value: Single); procedure FOnMessageDelete(Sender: TObject); procedure StopRecording; procedure StartRecording; function GenerateAudioFileName: string; procedure FOnStartRecord(Sender: TObject); procedure UpdateSendControls; procedure SetOnNeedFuncList(const Value: TOnNeedFuncList); function GetFuncs: TArray; procedure ProcFunction(Func: TChatFunctionCall); procedure RequestFunc(FuncResult: string); function NewMessageFunc(const FuncName, FuncArgs: string): TFrameMessage; procedure FOnMessageTextUpdated(Sender: TObject; const MessageId, Text: string); procedure FOnExecuteFunc(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc); procedure ExecuteFunc(const FuncName, FuncArgs: string; Callback: TProc); procedure SetUseFunctions(const Value: Boolean); procedure SetAutoExecFuncs(const Value: Boolean); procedure SetOnTitleChanged(const Value: TNotifyEvent); procedure SendText; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function MakeContentScreenshot: TBitmap; function SaveAsJson: TJSONObject; procedure LoadFromJson(JSON: TJSONObject); property API: IOpenAI read FAPI write SetAPI; property ChatId: string read FChatId write SetChatId; property Title: string read FTitle write SetTitle; property Mode: TWindowMode read FMode write SetMode; property Temperature: Single read FTemperature write SetTemperature; property MaxTokens: Integer read FMaxTokens write SetMaxTokens; property MaxTokensQuery: Integer read FMaxTokensQuery write SetMaxTokensQuery; property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty; property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty; property Model: string read FModel write SetModel; property TopP: Single read FTopP write SetTopP; property IsImageMode: Boolean read FIsImageMode write SetIsImageMode; property LastRequest: TProc read FLastRequest write SetLastRequest; property MenuItem: TListBoxItem read FMenuItem write SetMenuItem; property IsFirstMessage: Boolean read FIsFirstMessage write FIsFirstMessage; property OnNeedFuncList: TOnNeedFuncList read FOnNeedFuncList write SetOnNeedFuncList; property UseFunctions: Boolean read FUseFunctions write SetUseFunctions; property AutoExecFuncs: Boolean read FAutoExecFuncs write SetAutoExecFuncs; property OnTitleChanged: TNotifyEvent read FOnTitleChanged write SetOnTitleChanged; procedure Init; end; const MAX_TOKENS = 1024; MODEL_TOKENS_LIMIT = 4096; ErrorHintTimeout = 'If the error is due to a timeout, you can increase the response timeout in the general program settings.'; implementation uses FMX.Ani, System.Math, OpenAI.API, System.IOUtils, ChatGPT.Manager, ChatGPT.Overlay, FMX.BehaviorManager, HGM.FMX.Ani, System.Net.HttpClient, {$IFDEF ANDROID} ChatGPT.Android, FMX.Platform.UI.Android, {$ENDIF} System.DateUtils, ChatGPT.ImportExport, FMX.Text; {$R *.fmx} function HumanTime(Value: TTime): string; var H, M, S, Ms: Word; begin DecodeTime(Value, H, M, S, Ms); Result := ''; if H > 0 then Result := Result + H.ToString + ' ч. '; if M > 0 then Result := Result + M.ToString + ' мин. '; if S > 0 then Result := Result + S.ToString + ' сек. '; if Result.IsEmpty then Result := Result + '< 1 сек. '; end; function SecondsToTime(Value: Double): TTime; begin Result := Value / SecsPerDay; end; procedure TFrameChat.ShowError(const Text: string); begin TThread.Queue(nil, procedure begin var Frame := NewMessage(Text, TMessageKind.Error, False); Frame.IsError := True; end); end; procedure TFrameChat.AppendMessages(Response: TImageGenerations); begin try var Images: TArray; SetLength(Images, Length(Response.Data)); for var i := 0 to High(Response.Data) do Images[i] := Response.Data[i].Url; NewMessageImage(TMessageKind.Assistant, Images); finally Response.Free; end; end; function TFrameChat.NewMessageFunc(const FuncName, FuncArgs: string): TFrameMessage; begin ChatToUp; LayoutWelcome.Visible := False; Result := TFrameMessage.Create(VertScrollBoxChat); Result.SetMode(FMode); Result.Position.Y := VertScrollBoxChat.ContentBounds.Height; Result.Parent := VertScrollBoxChat; Result.Align := TAlignLayout.MostTop; Result.Id := ''; Result.OnDelete := FOnMessageDelete; Result.OnTextUpdated := FOnMessageTextUpdated; TFrameMessage(Result).MessageRole := TMessageKind.Func; TFrameMessage(Result).FuncName := FuncName; TFrameMessage(Result).FuncArgs := FuncArgs; TFrameMessage(Result).FuncState := TMessageFuncState.Wait; TFrameMessage(Result).OnFuncExecute := FOnExecuteFunc; Result.StartAnimate; DoOnUpdateChatItems; if AutoExecFuncs then TFrameMessage(Result).ExecuteFunc; end; function TFrameChat.NewMessageImage(Role: TMessageKind; Images: TArray): TFrameMessage; begin ChatToUp; LayoutWelcome.Visible := False; Result := TFrameMessage.Create(VertScrollBoxChat); Result.SetMode(FMode); Result.Position.Y := VertScrollBoxChat.ContentBounds.Height; Result.Parent := VertScrollBoxChat; Result.Align := TAlignLayout.MostTop; Result.Id := ''; Result.OnDelete := FOnMessageDelete; Result.OnTextUpdated := FOnMessageTextUpdated; TFrameMessage(Result).MessageRole := Role; TFrameMessage(Result).Images := Images; Result.StartAnimate; DoOnUpdateChatItems; end; procedure TFrameChat.ExecuteFunc(const FuncName, FuncArgs: string; Callback: TProc); begin var Funcs := GetFuncs; for var Item in Funcs do if Item.Name = FuncName then begin TTask.Run( procedure begin var FuncResult := ''; var ErrorText: string; try try FuncResult := Item.Execute(FuncArgs); except on E: Exception do begin ErrorText := E.Message; FuncResult := ''; end; end; TThread.Queue(nil, procedure begin Callback(not FuncResult.IsEmpty, ErrorText); if not FuncResult.IsEmpty then begin FBuffer.NewFunc(FuncName, FuncResult, TGUID.NewGuid.ToString); RequestFunc(FuncResult); end; end); finally // end; end); Exit; end; Callback(False, 'Function not found'); end; procedure TFrameChat.ProcFunction(Func: TChatFunctionCall); begin FBuffer.NewAsistantFunc(Func.Name, Func.Arguments, TGUID.NewGuid.ToString); var Funcs := GetFuncs; for var Item in Funcs do if Item.Name = Func.Name then begin NewMessageFunc(Func.Name, Func.Arguments); Exit; end; ShowError('Function with name "' + Func.Name + '" not found'); end; procedure TFrameChat.AppendMessages(Response: TChat); begin try for var Item in Response.Choices do if Item.FinishReason = TFinishReason.FunctionCall then ProcFunction(Item.Message.FunctionCall) else NewMessage(Item.Message.Content, TMessageKind.Assistant); finally Response.Free; end; end; procedure TFrameChat.AppendAudio(Response: TAudioTranscriptionObject); begin try NewMessage(Response.Text, TMessageKind.Assistant, True, True); finally Response.Free; end; end; function TFrameChat.SaveAsJson: TJSONObject; begin Result := TJSONObject.Create; try var JArray := TJSONArray.Create; Result.AddPair('chat_id', FChatId); Result.AddPair('temperature', TJSONNumber.Create(FTemperature)); Result.AddPair('title', FTitle); Result.AddPair('items', JArray); Result.AddPair('frequency_penalty', TJSONNumber.Create(FrequencyPenalty)); Result.AddPair('presence_penalty', TJSONNumber.Create(PresencePenalty)); Result.AddPair('max_tokens', TJSONNumber.Create(MaxTokens)); Result.AddPair('max_tokens_query', TJSONNumber.Create(MaxTokensQuery)); Result.AddPair('top_p', TJSONNumber.Create(TopP)); Result.AddPair('model', Model); Result.AddPair('is_image_mode', IsImageMode); Result.AddPair('draft', MemoQuery.Text); Result.AddPair('use_functions', UseFunctions); Result.AddPair('auto_exec_funcs', AutoExecFuncs); for var Control in VertScrollBoxChat.Content.Controls do if Control is TFrameMessage then if not TFrameMessage(Control).IsError then if not (TFrameMessage(Control).MessageRole in [TMessageKind.Error, TMessageKind.Func]) then JArray.Add(TFrameMessage(Control).ToJsonObject); except // end; end; procedure TFrameChat.FOnExecuteFunc(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc); begin ExecuteFunc(FuncName, FuncArgs, Callback); end; procedure TFrameChat.FOnMessageDelete(Sender: TObject); var Frame: TFrameMessage absolute Sender; begin if not (Sender is TFrameMessage) then Exit; FBuffer.DeleteByTag(Frame.Id); if VertScrollBoxChat.Content.ControlsCount <= 3 then LayoutWelcome.Visible := True; end; procedure TFrameChat.FOnMessageTextUpdated(Sender: TObject; const MessageId, Text: string); var Frame: TFrameMessage absolute Sender; begin if not (Sender is TFrameMessage) then Exit; FBuffer.SetContentByTag(MessageId, Text); end; function TFrameChat.GenerateAudioFileName: string; begin Result := TPath.Combine(Manager.AudioCacheFolder, 'audio_record' + FormatDateTime('DDMMYYYY_HHNNSS', Now) + '.wav'); end; procedure TFrameChat.Init; begin //Opacity := 0; //TAnimator.AnimateFloat(Self, 'Opacity', 1); {$IFNDEF MOBILE} MemoQuery.SetFocus; {$ENDIF} TThread.ForceQueue(nil, procedure begin MemoQuery.PrepareForPaint; MemoQueryChange(nil); end); end; procedure TFrameChat.LoadFromJson(JSON: TJSONObject); begin var ItemCount: Integer := 0; var LastRoleIsUser: Boolean := False; if FChatId.IsEmpty then FChatId := JSON.GetValue('chat_id', TGUID.NewGuid.ToString); Title := JSON.GetValue('title', FTitle); FTemperature := JSON.GetValue('temperature', FTemperature); FrequencyPenalty := JSON.GetValue('frequency_penalty', FrequencyPenalty); PresencePenalty := JSON.GetValue('presence_penalty', PresencePenalty); TopP := JSON.GetValue('top_p', TopP); Model := JSON.GetValue('model', Model); MaxTokens := JSON.GetValue('max_tokens', MaxTokens); MaxTokensQuery := JSON.GetValue('max_tokens_query', MaxTokensQuery); IsImageMode := JSON.GetValue('is_image_mode', IsImageMode); UseFunctions := JSON.GetValue('use_functions', UseFunctions); AutoExecFuncs := JSON.GetValue('auto_exec_funcs', AutoExecFuncs); MemoQuery.Text := JSON.GetValue('draft', MemoQuery.Text); MemoQuery.SelStart := MemoQuery.Text.Length; MemoQuery.SelLength := 0; var JArray: TJSONArray; if JSON.TryGetValue('items', JArray) then for var JItem in JArray do begin var Item: TChatMessageBuild; var IsAudio := JItem.GetValue('is_audio', False); Item.Role := TMessageRole.FromString(JItem.GetValue('role', 'user')); Item.Content := JItem.GetValue('content', ''); Item.Tag := JItem.GetValue('id', TGUID.NewGuid.ToString); Item.Name := JItem.GetValue('name', ''); var Func: TFunctionCallBuild; Func.Name := JItem.GetValue('func_name', ''); Func.Arguments := JItem.GetValue('func_args', ''); Item.FunctionCall := Func; if not (IsAudio and (Item.Role = TMessageRole.User)) then FBuffer.Add(Item); var Frame := TFrameMessage.Create(VertScrollBoxChat); Frame.Position.Y := VertScrollBoxChat.ContentBounds.Height; VertScrollBoxChat.AddObject(Frame); Frame.Align := TAlignLayout.MostTop; case Item.Role of TMessageRole.System: Frame.MessageRole := TMessageKind.System; TMessageRole.User: Frame.MessageRole := TMessageKind.User; TMessageRole.Assistant: Frame.MessageRole := TMessageKind.Assistant; TMessageRole.Func: Frame.MessageRole := TMessageKind.Func; end; Frame.OnDelete := FOnMessageDelete; Frame.OnTextUpdated := FOnMessageTextUpdated; Frame.Id := Item.Tag; Frame.Text := Item.Content; Frame.IsAudio := IsAudio; Frame.Images := JItem.GetValue>('images', []); Frame.FuncName := Item.FunctionCall.Name; Frame.FuncArgs := Item.FunctionCall.Arguments; Frame.FuncState := TMessageFuncState(JItem.GetValue('func_state', 0)); if not Frame.FuncName.IsEmpty then Frame.OnFuncExecute := FOnExecuteFunc; Frame.SetMode(FMode); Frame.UpdateContentSize; Inc(ItemCount); end; DoOnUpdateChatItems; if ItemCount > 0 then begin LayoutWelcome.Visible := False; IsFirstMessage := False; ScrollDown; if LastRoleIsUser then LastRequest := RequestPrompt; end; end; procedure TFrameChat.ScrollDown(Animate: Boolean = False); begin VertScrollBoxChat.RecalcSize; if Animate then TAnimator.AnimateFloat(VertScrollBoxChat, 'ViewPositionY', VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height, 1, TAnimationType.out, TInterpolationType.Circular) else VertScrollBoxChat.ViewportPosition := TPointF.Create(0, VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height); end; function TFrameChat.MakeContentScreenshot: TBitmap; function GetMaxBitmapRect: TRectF; var MaxDimensionSize: Integer; begin MaxDimensionSize := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); Result := TRectF.Create(0, 0, MaxDimensionSize, MaxDimensionSize); end; var SceneScale: Single; BitmapRect: TRectF; begin if Scene <> nil then SceneScale := Scene.GetSceneScale else SceneScale := 1; // TBitmap has limitation of size. It's a max texture size. If we takes screenshot of control, which exceeds this // limitation, we get "Bitmap size to big" exception. So we normalize size for avoiding it. BitmapRect := TRectF.Create(0, 0, VertScrollBoxChat.Content.ScrollBox.ContentBounds.Width * SceneScale, VertScrollBoxChat.Content.ScrollBox.ContentBounds.Height * SceneScale); BitmapRect := BitmapRect.PlaceInto(GetMaxBitmapRect); Result := TBitmap.Create(Round(BitmapRect.Width), Round(BitmapRect.Height)); Result.BitmapScale := SceneScale; Result.Clear(0); if Result.Canvas.BeginScene then try VertScrollBoxChat.Content.PaintTo(Result.Canvas, TRectF.Create(0, 0, Result.Width / SceneScale, Result.Height / SceneScale)); finally Result.Canvas.EndScene; end; end; procedure TFrameChat.ButtonSettingsClick(Sender: TObject); begin TFrameChatSettings.Execute(Self, procedure(Frame: TFrameChatSettings) begin Frame.Mode := FMode; Frame.TrackBarTemp.Value := Temperature * 10; Frame.TrackBarPP.Value := PresencePenalty * 10; Frame.TrackBarFP.Value := FrequencyPenalty * 10; if MaxTokens <> 0 then Frame.EditMaxTokens.Text := MaxTokens.ToString else Frame.EditMaxTokens.Text := ''; if MaxTokensQuery <> 0 then Frame.EditQueryMaxToken.Text := MaxTokensQuery.ToString else Frame.EditQueryMaxToken.Text := ''; Frame.ComboEditModel.Text := Model; Frame.TrackBarTopP.Value := TopP * 10; Frame.SwitchUseFunctions.IsChecked := UseFunctions; Frame.SwitchAutoExecFuncs.IsChecked := AutoExecFuncs; end, procedure(Frame: TFrameChatSettings; Success: Boolean) begin MemoQuery.SetFocus; if not Success then Exit; Temperature := Frame.TrackBarTemp.Value / 10; PresencePenalty := Frame.TrackBarPP.Value / 10; FrequencyPenalty := Frame.TrackBarFP.Value / 10; MaxTokens := StrToIntDef(Frame.EditMaxTokens.Text, 0); MaxTokensQuery := StrToIntDef(Frame.EditQueryMaxToken.Text, 0); TopP := Frame.TrackBarTopP.Value / 10; Model := Frame.ComboEditModel.Text; UseFunctions := Frame.SwitchUseFunctions.IsChecked; AutoExecFuncs := Frame.SwitchAutoExecFuncs.IsChecked; end); end; procedure TFrameChat.ButtonAudioClick(Sender: TObject); begin if FIsTyping then Exit; {$IFNDEF ANDROID} if not OpenDialogAudio.Execute then Exit; var AudioFile := OpenDialogAudio.FileName; //MemoQuery.Text := ''; NewMessage(TPath.GetFileName(AudioFile), TMessageKind.User, False, True); RequestAudio(AudioFile); {$ELSE} try OpenFileDialog('*/*', procedure(FilePath: string) begin //MemoQuery.Text := ''; NewMessage(TPath.GetFileName(FilePath), TMessageKind.User, False, True); RequestAudio(FilePath); end); except on E: Exception do ShowError(E.Message); end; {$ENDIF} end; procedure TFrameChat.ButtonContinueClick(Sender: TObject); begin RequestPrompt; end; procedure TFrameChat.RequestAudio(const AudioFile: string); begin SetTyping(True); ScrollDown; LastRequest := nil; TTask.Run( procedure begin try var Audio := API.Audio.CreateTranscription( procedure(Params: TAudioTranscription) begin Params.&File(AudioFile); Params.Temperature(Temperature / 2); Params.Language('ru'); end); TThread.Queue(nil, procedure begin AppendAudio(Audio); end); except on E: OpenAIException do begin ShowError(E.Message); LastRequest := procedure begin RequestAudio(AudioFile); end; end; on E: Exception do begin ShowError(E.Message); LastRequest := procedure begin RequestAudio(AudioFile); end; end; end; TThread.Queue(nil, procedure begin SetTyping(False); end); end, FPool); end; procedure TFrameChat.ButtonExample1Click(Sender: TObject); begin if MemoQuery.Text.IsEmpty then MemoQuery.Text := 'Explain quantum computing in simple terms'; end; procedure TFrameChat.ButtonExample1Tap(Sender: TObject; const Point: TPointF); begin ButtonExample1Click(Sender); end; procedure TFrameChat.ButtonExample2Click(Sender: TObject); begin if MemoQuery.Text.IsEmpty then MemoQuery.Text := 'Got any creative ideas for a 10 year old’s birthday?'; end; procedure TFrameChat.ButtonExample2Tap(Sender: TObject; const Point: TPointF); begin ButtonExample2Click(Sender); end; procedure TFrameChat.ButtonExample3Click(Sender: TObject); begin if MemoQuery.Text.IsEmpty then MemoQuery.Text := 'How do I make an HTTP request in Javascript?'; end; procedure TFrameChat.ButtonExample3Tap(Sender: TObject; const Point: TPointF); begin ButtonExample3Click(Sender); end; procedure TFrameChat.ButtonExportImportClick(Sender: TObject); begin TFrameImportExport.Execute(Self, procedure(Frame: TFrameImportExport) begin Frame.Mode := FMode; end, procedure(Frame: TFrameImportExport; Success: Boolean) begin MemoQuery.SetFocus; if not Success then Exit; if Frame.RadioButtonExport.IsChecked then begin if Frame.EditExport.Text.EndsWith('.json') then begin var JSON := SaveAsJson; if Assigned(JSON) then try TFile.WriteAllText(Frame.EditExport.Text, JSON.ToJSON, TEncoding.UTF8); finally JSON.Free; end; end else begin var Stream := TFile.Create(Frame.EditExport.Text); try for var Control in VertScrollBoxChat.Content.Controls do if Control is TFrameMessage then if not TFrameMessage(Control).IsError then begin var Buff := TEncoding.UTF8.GetBytes(TFrameMessage(Control).MessageRole.ToString + #13#10 + TFrameMessage(Control).Text + #13#10 + #13#10 + #13#10); Stream.WriteBuffer(Buff, Length(Buff)); end; finally Stream.Free; end; end; end else begin var JSON := TJSONObject.ParseJSONValue(TFile.ReadAllText(Frame.EditImport.Text, TEncoding.UTF8)); if Assigned(JSON) then try LoadFromJson(JSON as TJSONObject); finally JSON.Free; end; end; end); end; procedure TFrameChat.ButtonImageClick(Sender: TObject); begin IsImageMode := not IsImageMode; end; procedure TFrameChat.ButtonRetryClick(Sender: TObject); begin if Assigned(FLastRequest) then FLastRequest; end; procedure TFrameChat.SendRequestImage; begin if FIsTyping then Exit; var Prompt := MemoQuery.Text; if Prompt.IsEmpty then Exit; MemoQuery.Text := ''; NewMessage(Prompt, TMessageKind.User, False); RequestImage(Prompt); end; procedure TFrameChat.RequestImage(const Prompt: string); begin SetTyping(True); ScrollDown; LastRequest := nil; TTask.Run( procedure begin try var Images := API.Image.Create( procedure(Params: TImageCreateParams) begin Params.Prompt(Prompt); Params.ResponseFormat(TImageResponseFormat.Url); Params.Quality(TImageQuality.Standard); //Params.N(4); Params.Model('dall-e-3'); Params.Size(TImageSize.s1024x1024); Params.User(FChatId); end); TThread.Queue(nil, procedure begin AppendMessages(Images); end); except on E: Exception do begin ShowError(E.Message); LastRequest := procedure begin RequestImage(Prompt); end; end; end; TThread.Queue(nil, procedure begin SetTyping(False); end); end, FPool); end; procedure TFrameChat.SendRequestPrompt; begin if FIsTyping then Exit; var Prompt := MemoQuery.Text.Trim([' ', #13, #10]); if Prompt.IsEmpty then Exit; MemoQuery.Text := ''; NewMessage(Prompt, TMessageKind.User); if (not Prompt.StartsWith('/system ')) and (not Prompt.StartsWith('/assistant ')) and (not Prompt.StartsWith('/user ')) then RequestPrompt; end; function TFrameChat.GetFuncs: TArray; begin if Assigned(FOnNeedFuncList) and FUseFunctions then FOnNeedFuncList(Self, Result) else Result := []; end; function CreateTools(Funcs: TArray): TArray; begin for var Item in Funcs do Result := Result + [TChatToolFunctionParam.Create(Item)]; end; procedure TFrameChat.RequestFunc(FuncResult: string); begin SetTyping(True); ScrollDown; LastRequest := nil; TTask.Run( procedure begin try var Funcs := GetFuncs; var Completions := API.Chat.Create( procedure(Params: TChatParams) begin if not Model.IsEmpty then Params.Model(Model); if PresencePenalty <> 0 then Params.PresencePenalty(PresencePenalty); if FrequencyPenalty <> 0 then Params.FrequencyPenalty(FrequencyPenalty); Params.Messages(FBuffer.ToArray); if FBuffer.MaxTokensForQuery <> 0 then Params.MaxTokens(FBuffer.MaxTokensForQuery); Params.Temperature(Temperature); if Length(Funcs) > 0 then begin Params.Tools(CreateTools(Funcs)); Params.ToolChoice(TChatToolChoiceParam.Auto); end; Params.User(FChatId); end); TThread.Queue(nil, procedure begin AppendMessages(Completions); end); except on E: OpenAIException do begin ShowError(E.Message); LastRequest := procedure begin RequestFunc(FuncResult); end; end; on E: Exception do begin ShowError(E.Message); LastRequest := procedure begin RequestFunc(FuncResult); end; end; end; TThread.Queue(nil, procedure begin SetTyping(False); end); end, FPool); end; procedure TFrameChat.RequestPrompt; begin SetTyping(True); ScrollDown; LastRequest := nil; TTask.Run( procedure begin try var Funcs := GetFuncs; var Completions := API.Chat.Create( procedure(Params: TChatParams) begin if not Model.IsEmpty then Params.Model(Model); if PresencePenalty <> 0 then Params.PresencePenalty(PresencePenalty); if FrequencyPenalty <> 0 then Params.FrequencyPenalty(FrequencyPenalty); Params.Messages(FBuffer.ToArray); if FBuffer.MaxTokensForQuery <> 0 then Params.MaxTokens(FBuffer.MaxTokensForQuery); if Temperature <> 1 then Params.Temperature(Temperature); if Length(Funcs) > 0 then begin Params.Tools(CreateTools(Funcs)); Params.ToolChoice(TChatToolChoiceParam.Auto); end; Params.User(FChatId); end); TThread.Queue(nil, procedure begin AppendMessages(Completions); end); except on E: OpenAIException do begin ShowError(E.Message); LastRequest := RequestPrompt; end; on E: Exception do begin if E is ENetHTTPClientException then E.Message := E.Message + #13#10 + ErrorHintTimeout; ShowError(E.Message); LastRequest := RequestPrompt; end; end; TThread.Queue(nil, procedure begin SetTyping(False); end); end, FPool); end; procedure TFrameChat.ButtonScrollDownClick(Sender: TObject); begin ScrollDown(True); end; procedure TFrameChat.StopRecording; begin LayoutAudioRecording.Visible := False; MemoQuery.Visible := True; PathStopRecord.Visible := False; PathAudio.Visible := True; TimerCheckRecording.Enabled := False; end; procedure TFrameChat.StartRecording; begin FAudioRecord.StartRecord(GenerateAudioFileName); end; procedure TFrameChat.ButtonSendClick(Sender: TObject); begin if FAudioRecord.IsAvailableDevice then begin if FAudioRecord.IsMicrophoneRecording then begin FAudioRecord.StopRecord; Exit; end; end; if MemoQuery.Text.IsEmpty and FAudioRecord.IsAvailableDevice then StartRecording else SendText; end; procedure TFrameChat.SendText; begin if IsImageMode then SendRequestImage else SendRequestPrompt; end; procedure TFrameChat.ClearChat; begin LayoutTyping.Parent := nil; LayoutWelcome.Parent := nil; while VertScrollBoxChat.Content.ControlsCount > 0 do VertScrollBoxChat.Content.Controls[0].Free; LayoutTyping.Parent := VertScrollBoxChat; LayoutWelcome.Parent := VertScrollBoxChat; DoOnUpdateChatItems; end; procedure TFrameChat.FOnStartRecord(Sender: TObject); begin FRecordingStartTime := Now; TimerCheckRecording.Enabled := True; LabelRecordingTime.Text := ''; LayoutAudioRecording.Visible := True; MemoQuery.Visible := False; PathStopRecord.Visible := True; PathAudio.Visible := False; end; constructor TFrameChat.Create(AOwner: TComponent); begin inherited; FIsFirstMessage := True; LastRequest := nil; FAudioRecord := TAudioRecord.Create(Self); FAudioRecord.OnStartRecord := FOnStartRecord; FBuffer := TChatHistory.Create; FBuffer.MaxTokensForQuery := MAX_TOKENS; FBuffer.MaxTokensOfModel := MODEL_TOKENS_LIMIT; FBuffer.AutoTrim := True; FPool := TThreadPool.Create; Temperature := 0.2; Name := ''; VertScrollBoxChat.AniCalculations.Animation := True; //VertScrollBoxChat.AniCalculations.Interval := 1; VertScrollBoxChat.AniCalculations.Averaging := True; {$IFDEF MOBILE} VertScrollBoxChat.AniCalculations.BoundsAnimation := True; {$ENDIF} MemoQuery.ScrollAnimation := TBehaviorBoolean.True; PathStopRecord.Visible := False; PathAudio.Visible := False; PathSend.Visible := True; LayoutAudioRecording.Visible := False; {$IFDEF MOBILE} ButtonExample1.OnClick := nil; ButtonExample2.OnClick := nil; ButtonExample3.OnClick := nil; //(MemoQuery.Presentation as TStyledMemo).NeedSelectorPoints := True; ButtonExportImport.Visible := False; {$ENDIF} SetTyping(False); ClearChat; IsImageMode := False; MemoQueryChange(nil); MemoQuery.ApplyStyleLookup; end; destructor TFrameChat.Destroy; begin FMenuItem := nil; FPool.Free; FBuffer.Free; inherited; end; procedure TFrameChat.DoOnUpdateChatItems; begin ButtonContinue.Visible := FBuffer.Count > 0; end; procedure TFrameChat.FlowLayoutWelcomeResize(Sender: TObject); begin var W: Single := 0; case Mode of TWindowMode.Compact: W := FlowLayoutWelcome.Width; TWindowMode.Full: W := Trunc(FlowLayoutWelcome.Width / FlowLayoutWelcome.ControlsCount); end; for var Control in FlowLayoutWelcome.Controls do Control.Width := W; var B: Single := 0; for var Control in LayoutExampleTitle.Controls do B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom); if LayoutExampleTitle.Height <> B then LayoutExampleTitle.Height := B; B := 0; for var Control in LayoutCapabilitiesTitle.Controls do B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom); if LayoutCapabilitiesTitle.Height <> B then LayoutCapabilitiesTitle.Height := B; B := 0; for var Control in LayoutLimitationsTitle.Controls do B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom); if LayoutLimitationsTitle.Height <> B then LayoutLimitationsTitle.Height := B; B := 0; for var Control in FlowLayoutWelcome.Controls do B := Max(B, Control.Position.Y + Control.Height); B := B + FlowLayoutWelcome.Position.Y; if LayoutWelcome.Height <> B then LayoutWelcome.Height := B; end; procedure TFrameChat.LayoutSendResize(Sender: TObject); begin LayoutQuery.Width := Min(768, LayoutSend.Width - 48); VertScrollBoxChat.Padding.Bottom := LayoutSend.Height + LayoutButtom.Height + 20; end; procedure TFrameChat.LayoutTypingResize(Sender: TObject); begin LayoutTypingContent.Width := Min(LayoutTyping.Width - (LayoutTyping.Padding.Left + LayoutTyping.Padding.Right), MaxMessageWidth); end; procedure TFrameChat.LayoutWelcomeResize(Sender: TObject); begin FlowLayoutWelcome.Width := Min(720, LayoutWelcome.Width); end; procedure TFrameChat.MemoQueryChange(Sender: TObject); begin LabelSendTip.Visible := MemoQuery.Text.IsEmpty; var H: Single := 0; if not LabelSendTip.Visible then H := H + Round(MemoQuery.ContentBounds.Height) else H := H + 21; //LayoutAudioRecording //LayoutSend.Height := Max(LayoutSend.TagFloat, Min(H, 400)); var MaxMemoH := Min(H, 400 - (LayoutSend.Padding.Top + LayoutSend.Padding.Bottom + LayoutQuery.Padding.Top + LayoutQuery.Padding.Bottom)); MemoQuery.Height := Max(26, MaxMemoH); H := H + LayoutSend.Padding.Top + LayoutSend.Padding.Bottom + LayoutQuery.Padding.Top + LayoutQuery.Padding.Bottom; TAnimator.DetachPropertyAnimation(LayoutSend, 'Height'); if LayoutAttachments.Visible then H := H + LayoutAttachments.Height; TAnimator.AnimateFloat(LayoutSend, 'Height', Max(LayoutSend.TagFloat, Min(H, 400)), 0.1); MemoQuery.ShowScrollBars := H > 400; {$IFDEF MOBILE} if LabelSendTip.Visible then begin LayoutChatSettings.Visible := True; RectangleMemoBG.Margins.Left := 15; end else begin LayoutChatSettings.Visible := False; RectangleMemoBG.Margins.Left := -11; end; {$ENDIF} UpdateSendControls; end; procedure TFrameChat.MemoQueryEnter(Sender: TObject); begin MemoQuery.PrepareForPaint; end; procedure TFrameChat.UpdateSendControls; begin PathAudio.Visible := FAudioRecord.IsAvailableDevice and LabelSendTip.Visible; PathSend.Visible := not PathAudio.Visible; ButtonAudio.Visible := MemoQuery.Text.IsEmpty; ButtonAudio.Position.X := 0; var i := 0; for var Control in LayoutSendCommons.Controls do if Control.IsVisible then Inc(i); LayoutSendControls.Width := LayoutSendCommons.Height * i; LayoutSendCommons.RecalcSize; end; procedure TFrameChat.MemoQueryKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Manager.SendByEnter then begin if (Key = vkReturn) and not ((ssCtrl in Shift) or (ssShift in Shift)) then begin Key := 0; KeyChar := #0; SendText; end; end else begin if (Key = vkReturn) and (ssCtrl in Shift) then begin Key := 0; KeyChar := #0; SendText; end; end; MemoQueryChange(Sender); end; procedure TFrameChat.MemoQueryKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin MemoQueryChange(Sender); end; procedure TFrameChat.MemoQueryViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin MemoQueryChange(Sender); end; procedure TFrameChat.VertScrollBoxChatViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin VertScrollBoxChat.FViewPositionY := NewViewportPosition.Y; LayoutScrollDown.Visible := NewViewportPosition.Y < VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height - 100; end; procedure TFrameChat.ChatToUp; begin if not Assigned(FMenuItem) then Exit; FMenuItem.Index := 0; FMenuItem.IsSelected := True; end; function TFrameChat.NewMessage(const Text: string; Role: TMessageKind; UseBuffer: Boolean; IsAudio: Boolean): TFrameMessage; begin ChatToUp; if (Role = TMessageKind.User) and IsFirstMessage then begin IsFirstMessage := False; Title := Text; end; var AppendText := Text; var MessageTag := TGUID.NewGuid.ToString; if UseBuffer then begin if Role = TMessageKind.User then begin if AppendText.StartsWith('/system ') then begin AppendText := AppendText.Replace('/system ', '', []); FBuffer.New(TMessageRole.System, AppendText, MessageTag); Role := TMessageKind.System; end else if AppendText.StartsWith('/user ') then begin AppendText := AppendText.Replace('/user ', '', []); FBuffer.New(TMessageRole.User, AppendText, MessageTag); Role := TMessageKind.User; end else if AppendText.StartsWith('/assistant ') then begin AppendText := AppendText.Replace('/assistant ', '', []); FBuffer.New(TMessageRole.Assistant, AppendText, MessageTag); Role := TMessageKind.Assistant; end else begin FBuffer.New(TMessageRole.User, AppendText, MessageTag); end; end else begin AppendText := AppendText; FBuffer.New(TMessageRole.Assistant, AppendText, MessageTag); end; end; LayoutWelcome.Visible := False; Result := TFrameMessage.Create(VertScrollBoxChat); Result.Position.Y := VertScrollBoxChat.ContentBounds.Height; Result.Parent := VertScrollBoxChat; Result.Align := TAlignLayout.MostTop; Result.Id := MessageTag; Result.MessageRole := Role; Result.IsAudio := IsAudio; Result.Text := AppendText; Result.OnDelete := FOnMessageDelete; Result.OnTextUpdated := FOnMessageTextUpdated; Result.SetMode(FMode); Result.UpdateContentSize; Result.StartAnimate; DoOnUpdateChatItems; end; procedure TFrameChat.SetAPI(const Value: IOpenAI); begin FAPI := Value; end; procedure TFrameChat.SetAutoExecFuncs(const Value: Boolean); begin FAutoExecFuncs := Value; end; procedure TFrameChat.SetChatId(const Value: string); begin FChatId := Value; end; procedure TFrameChat.SetFrequencyPenalty(const Value: Single); begin FFrequencyPenalty := Value; end; procedure TFrameChat.SetIsImageMode(const Value: Boolean); begin FIsImageMode := Value; if FIsImageMode then begin PathImage.Fill.Color := $FFDDDDE4; RectangleImageMode.Visible := True; end else begin PathImage.Fill.Color := $FFACACBE; RectangleImageMode.Visible := False; end; end; procedure TFrameChat.SetLastRequest(const Value: TProc); begin FLastRequest := Value; ButtonRetry.Visible := Assigned(FLastRequest); end; procedure TFrameChat.SetMaxTokens(const Value: Integer); begin FMaxTokens := Value; FBuffer.MaxTokensOfModel := FMaxTokens; end; procedure TFrameChat.SetMaxTokensQuery(const Value: Integer); begin FMaxTokensQuery := Value; FBuffer.MaxTokensForQuery := FMaxTokensQuery; end; procedure TFrameChat.SetMenuItem(const Value: TListBoxItem); begin FMenuItem := Value; end; procedure TFrameChat.SetMode(const Value: TWindowMode); begin FMode := Value; for var Control in Controls do if Control is TFrameOveraly then begin var Frame := Control as TFrameOveraly; Frame.Mode := FMode; end; for var Control in VertScrollBoxChat do if Control is TFrameMessage then begin var Frame := Control as TFrameMessage; Frame.SetMode(FMode); end; case FMode of TWindowMode.Compact: begin {$IFNDEF MOBILE} LayoutSend.Margins.Right := 11; {$ELSE} LayoutSend.Margins.Right := 0; {$ENDIF} LabelWelcomeTitle.Margins.Top := 20; LayoutSend.TagFloat := 100; LayoutSend.Height := 100; LayoutButtom.Margins.Bottom := 0; LineBorder.Visible := True; PathExaCompact.Visible := True; PathExaFull.Visible := False; PathCapCompact.Visible := True; PathCapFull.Visible := False; PathLimCompact.Visible := True; PathLimFull.Visible := False; LayoutSend.Padding.Rect := TRectF.Create(0, 10, 0, 40); RectangleSendBG.Fill.Kind := TBrushKind.Solid; RectangleSendBG.Fill.Color := $FF343541; ButtonExportImport.Width := ButtonExportImport.Height; end; TWindowMode.Full: begin {$IFNDEF MOBILE} LayoutSend.Margins.Right := 11; {$ELSE} LayoutSend.Margins.Right := 0; {$ENDIF} LabelWelcomeTitle.Margins.Top := 188; LayoutSend.TagFloat := 170; LayoutButtom.Margins.Bottom := -70; LayoutSend.Height := 170; LineBorder.Visible := False; PathExaCompact.Visible := False; PathExaFull.Visible := True; PathCapCompact.Visible := False; PathCapFull.Visible := True; PathLimCompact.Visible := False; PathLimFull.Visible := True; LayoutSend.Padding.Rect := TRectF.Create(0, 80, 0, 40); RectangleSendBG.Fill.Kind := TBrushKind.Gradient; ButtonExportImport.Width := 165; end; end; FlowLayoutWelcomeResize(nil); end; procedure TFrameChat.SetModel(const Value: string); begin FModel := Value; end; procedure TFrameChat.SetOnNeedFuncList(const Value: TOnNeedFuncList); begin FOnNeedFuncList := Value; end; procedure TFrameChat.SetOnTitleChanged(const Value: TNotifyEvent); begin FOnTitleChanged := Value; end; procedure TFrameChat.SetPresencePenalty(const Value: Single); begin FPresencePenalty := Value; end; procedure TFrameChat.SetTemperature(const Value: Single); begin FTemperature := Value; end; procedure TFrameChat.SetTitle(const Value: string); begin FTitle := Value.Replace(#10, '').Replace(#13, '').Replace('&', '').Substring(0, 50); if Assigned(FOnTitleChanged) then FOnTitleChanged(Self); end; procedure TFrameChat.SetTopP(const Value: Single); begin FTopP := Value; end; procedure TFrameChat.SetTyping(const Value: Boolean); begin FIsTyping := Value; ButtonSend.Enabled := not Value; TimerTyping.Enabled := Value; LayoutTyping.Visible := Value; FlowLayoutActions.Enabled := not Value; if LayoutTyping.Visible then begin LayoutTyping.Margins.Top := 40; LayoutTyping.Opacity := 0; TAnimator.AnimateFloat(LayoutTyping, 'Margins.Top', 0); TAnimator.AnimateFloat(LayoutTyping, 'Opacity', 1); end; LabelTyping.Visible := Value; LabelTyping.Position.X := 0; UpdateSendControls; end; procedure TFrameChat.SetUseFunctions(const Value: Boolean); begin FUseFunctions := Value; end; procedure TFrameChat.TimerCheckRecordingTimer(Sender: TObject); begin if FAudioRecord.IsMicrophoneRecording then begin LabelRecordingTime.Text := HumanTime(SecondsToTime(SecondsBetween(Now, FRecordingStartTime))); end else begin StopRecording; end; end; procedure TFrameChat.TimerTypingTimer(Sender: TObject); begin RectangleIndicate.Visible := not RectangleIndicate.Visible; if LabelTyping.Text.Length > 2 then LabelTyping.Text := '.' else LabelTyping.Text := LabelTyping.Text + '.'; end; { TButton } procedure TButton.SetBounds(X, Y, AWidth, AHeight: Single); begin inherited; if Assigned(Canvas) and (Tag = 1) then begin var H := TRectF.Create(0, 0, Width - 20, 10000); Canvas.Font.Size := Font.Size; Canvas.MeasureText(H, Text, WordWrap, [], TextAlign, VertTextAlign); if AHeight <> H.Height + 24 then Height := H.Height + 24; end; end; { TLabel } procedure TLabel.SetBounds(X, Y, AWidth, AHeight: Single); begin inherited; if Assigned(Canvas) and (Tag = 1) then begin var H := TRectF.Create(0, 0, Width - 20, 10000); Canvas.Font.Size := Font.Size; Canvas.MeasureText(H, Text, WordWrap, [], TextAlign, VertTextAlign); if AHeight <> H.Height + 24 then Height := H.Height + 24; end; end; { TVertScrollBox } function TVertScrollBox.CreateAniCalculations: TScrollCalculations; begin Result := TFixedScrollCalculations.Create(Self); end; procedure TVertScrollBox.SetViewPositionY(const Value: Single); begin FViewPositionY := Value; ViewportPosition := TPointF.Create(ViewportPosition.X, FViewPositionY); end; { TMemo } procedure TMemo.SetViewPos(const Value: Single); begin FViewPos := Value; ViewportPosition := TPointF.Create(ViewportPosition.X, Value); end; { TFixedScrollCalculations } type TControlHook = class(TControl) end; procedure TFixedScrollCalculations.DoChanged; begin //inherited .DoChanged; TControlHook(ScrollBox).FDisableAlign := True; try inherited; finally TControlHook(ScrollBox).FDisableAlign := False; end; end; end. ================================================ FILE: ChatGPT.FrameCode.fmx ================================================ object FrameCode: TFrameCode ClipChildren = True HitTest = False Margins.Bottom = 5.000000000000000000 Size.Width = 575.000000000000000000 Size.Height = 387.000000000000000000 Size.PlatformDefault = False OnResize = FrameResize OnResized = FrameResize object RectangleHead: TRectangle Align = Top ClipChildren = True Corners = [TopLeft, TopRight] Fill.Color = xFF353440 Padding.Left = 16.000000000000000000 Padding.Top = 6.000000000000000000 Padding.Right = 16.000000000000000000 Padding.Bottom = 6.000000000000000000 Sides = [Top, Left, Right] Size.Width = 575.000000000000000000 Size.Height = 32.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF1A1922 XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 object LabelLanguage: TLabel Align = Client StyledSettings = [Style] Size.Width = 462.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 11.500000000000000000 TextSettings.FontColor = xFFD9D9E3 TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'language' TabOrder = 0 end object LayoutCopyCode: TLayout Align = Right Cursor = crHandPoint HitTest = True Position.X = 478.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 81.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 1 OnClick = LayoutCopyCodeClick object PathCopy: TPath Align = Left Data.Path = { 4E0000000000000000005C410000004002000000ED0D6F410000004002000000 4CA67E41D2353B4002000000B3EA7F4106128340010000000000804100008840 0200000000008041384A854002000000C0EC7F41499D8240020000007AC77F41 D3F67F400100000000008E410000804002000000D8F097410000804002000000 0000A0414B3CA040020000000000A0410000C840010000000000A04100009E41 020000000000A041D8F0A74102000000D8F097410000B0410200000000008E41 0000B041010000000000C8400000B041020000004B3CA0400000B04102000000 00008040D8F0A741020000000000804000009E4101000000000080400000C840 02000000000080404B3CA040020000004B3CA04000008040020000000000C840 00008040010000007C380041D3F67F4002000000061E004102D9814002000000 B30C004117BC834002000000E0040041ECA38540010000000000004100008840 02000000000000419678404002000000261E1041000000400200000000002441 000000400100000000005C41000000400300000000005C410000004000000000 00005C410000D04001000000000024410000D04002000000924B17410000D040 02000000A5200C4162D6C240020000005CB805416FF5AE400100000077100641 A301B040010000000000C8400000B04002000000CBBEBA400000B04002000000 0000B040CBBEBA40020000000000B0400000C840010000000000B04000009E41 020000000000B0404850A14102000000CBBEBA400000A441020000000000C840 0000A4410100000000008E410000A44102000000485091410000A44102000000 000094414850A141020000000000944100009E4101000000000094410000C840 0200000000009441CBBEBA4002000000485091410000B0400200000000008E41 0000B040010000009EEF7941A301B04001000000AE477A416FF5AE4002000000 3BDF734162D6C24002000000A2B468410000D0400200000000005C410000D040 0300000000005C410000D0400000000000005C41000060400100000000002441 0000604002000000655F1D41000060400200000000001841957D754002000000 000018410000884002000000000018413541954002000000655F1D410000A040 02000000000024410000A0400100000000005C410000A0400200000090A06241 0000A04002000000000068413541954002000000000068410000884002000000 00006841957D75400200000090A06241000060400200000000005C4100006040 0300000000005C4100006040} Fill.Color = xFFD9D9E3 HitTest = False Size.Width = 11.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object LabelCopy: TLabel Align = Right AutoSize = True StyledSettings = [Style] Position.X = 26.000000000000000000 Size.Width = 55.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 11.500000000000000000 TextSettings.FontColor = xFFD9D9E3 TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False TextSettings.Trimming = None Text = 'Copy code' TabOrder = 0 OnResize = LabelCopyResize OnResized = LabelCopyResize end end end object RectangleClient: TRectangle Touch.InteractiveGestures = [LongTap] Align = Client Corners = [BottomLeft, BottomRight] Fill.Color = claBlack Size.Width = 575.000000000000000000 Size.Height = 355.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 OnMouseDown = RectangleClientMouseDown OnMouseMove = RectangleClientMouseMove OnMouseUp = RectangleClientMouseUp object MemoCode: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] Caret.Color = x00FFFFFF DataDetectorTypes = [] DisableMouseWheel = True Lines.Strings = ( 'begin' '' 'end.') ReadOnly = True StyledSettings = [Style] TextSettings.Font.Family = 'Consolas' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFE8E8E8 Align = Client CanParentFocus = True Cursor = crDefault EnableDragHighlight = False Margins.Left = 5.000000000000000000 Margins.Top = 5.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Size.Width = 565.000000000000000000 Size.Height = 345.000000000000000000 Size.PlatformDefault = False StyleLookup = 'memostyle_code' TabOrder = 0 OnMouseWheel = MemoCodeMouseWheel OnPresentationNameChoosing = MemoCodePresentationNameChoosing Viewport.Width = 555.000000000000000000 Viewport.Height = 335.000000000000000000 end end end ================================================ FILE: ChatGPT.FrameCode.pas ================================================ unit ChatGPT.FrameCode; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Memo.Types, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Edit.Style, FMX.Memo, FMX.Layouts, FMX.Memo.Style, ChatGPT.Classes, FMX.TextLayout, ChatGPT.Code, FMX.Gestures, FMX.RichEdit.Style; {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} type TMemo = class(FMX.Memo.TMemo) protected procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override; end; TFrameCode = class(TFrame) RectangleHead: TRectangle; RectangleClient: TRectangle; MemoCode: TMemo; LabelLanguage: TLabel; LayoutCopyCode: TLayout; PathCopy: TPath; LabelCopy: TLabel; procedure FrameResize(Sender: TObject); procedure LayoutCopyCodeClick(Sender: TObject); procedure MemoCodeMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); procedure LabelCopyResize(Sender: TObject); procedure RectangleClientMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure RectangleClientMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure RectangleClientMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure TimerMouseOverTimer(Sender: TObject); procedure MemoCodePresentationNameChoosing(Sender: TObject; var PresenterName: string); private FOnWheel: TMouseWheelEvent; FStyledMemo: TRichEditStyled; FMouseDown: TPointF; procedure FOnStyleLookup(Sender: TObject); procedure SetOnWheel(const Value: TMouseWheelEvent); function IsJson(const Value: string): Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function GetContentHeight: Single; procedure Fill(Data: TPart); property OnWheel: TMouseWheelEvent read FOnWheel write SetOnWheel; end; implementation uses System.Math, FMX.Clipboard, System.JSON, FMX.Platform, ChatGPT.FrameUIMessage, System.Net.URLClient; {$R *.fmx} { TFrameCode } constructor TFrameCode.Create(AOwner: TComponent); begin inherited; Name := ''; MemoCode.DisableDisappear := True; FStyledMemo := (MemoCode.Presentation as TRichEditStyled); {$IFDEF MOBILE} MemoCode.HitTest := False; {$ENDIF} MemoCode.OnApplyStyleLookup := FOnStyleLookup; end; destructor TFrameCode.Destroy; begin inherited; end; function TFrameCode.IsJson(const Value: string): Boolean; begin Result := False; try var JSON := TJSONObject.ParseJSONValue(Value); if Assigned(JSON) then begin JSON.Free; Result := True; end; except Result := False; end; end; procedure TFrameCode.Fill(Data: TPart); begin if Data.Language.IsEmpty then if IsJson(Data.Content) then Data.Language := 'json'; if not Data.Language.IsEmpty then //FCodeSyntax := TCodeSyntax.FindSyntax(Data.Language, MemoCode.Font, MemoCode.FontColor); FStyledMemo.SetCodeSyntaxName(Data.Language, MemoCode.Font, MemoCode.FontColor) else FStyledMemo.SetCodeSyntaxName('md', MemoCode.Font, MemoCode.FontColor); MemoCode.Text := Data.Content; if Data.Language.IsEmpty then LabelLanguage.Text := '' else LabelLanguage.Text := Data.Language; FrameResize(nil); end; procedure TFrameCode.FOnStyleLookup(Sender: TObject); begin (MemoCode.Presentation as TRichEditStyled).RoundedSelection := True; (MemoCode.Presentation as TRichEditStyled).ShowGutter := True; (MemoCode.Presentation as TRichEditStyled).GutterRightMargin := 4; (MemoCode.Presentation as TRichEditStyled).UseSelectedTextColor := True; (MemoCode.Presentation as TRichEditStyled).SelectedTextColor := TAlphaColorRec.White; FrameResize(nil); end; procedure TFrameCode.FrameResize(Sender: TObject); begin Height := GetContentHeight; end; function TFrameCode.GetContentHeight: Single; begin Result := Max(MemoCode.ContentBounds.Height + 20, 30) + MemoCode.Margins.Top + MemoCode.Margins.Bottom + RectangleHead.Height; end; procedure TFrameCode.LabelCopyResize(Sender: TObject); begin LayoutCopyCode.Width := LabelCopy.Width + PathCopy.Width + 8; end; procedure TFrameCode.LayoutCopyCodeClick(Sender: TObject); begin var ClipBoard: IFMXClipboardService; if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then begin ClipBoard.SetClipboard(MemoCode.Text); ShowUIMessage('Coppied'); end else ShowUIMessage('Clipboard error'); end; procedure TFrameCode.MemoCodeMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin if (MemoCode.SelLength > 0) and (Root.Captured = IControl(FStyledMemo)) then begin Handled := True; if Assigned(FOnWheel) then FOnWheel(Sender, Shift, WheelDelta, Handled); end; end; procedure TFrameCode.MemoCodePresentationNameChoosing(Sender: TObject; var PresenterName: string); begin PresenterName := 'RichEditStyled'; end; procedure TFrameCode.RectangleClientMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FMouseDown := TPointF.Create(X, Y); Root.Captured := RectangleClient; end; procedure TFrameCode.RectangleClientMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin if ssLeft in Shift then begin MemoCode.ViewportPosition := TPointF.Create(MemoCode.ViewportPosition.X + (FMouseDown.X - X), MemoCode.ViewportPosition.Y); FMouseDown := TPointF.Create(X, Y); end; end; procedure TFrameCode.RectangleClientMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin Root.Captured := nil; end; procedure TFrameCode.SetOnWheel(const Value: TMouseWheelEvent); begin FOnWheel := Value; end; procedure TFrameCode.TimerMouseOverTimer(Sender: TObject); begin end; { TMemo } procedure TMemo.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin inherited; end; end. ================================================ FILE: ChatGPT.FrameImage.fmx ================================================ object FrameImage: TFrameImage Size.Width = 256.000000000000000000 Size.Height = 256.000000000000000000 Size.PlatformDefault = False object RectangleImage: TRectangle Align = Client ClipChildren = True Cursor = crHandPoint Fill.Color = xA03F3F3F Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 PopupMenu = PopupMenuCopy Size.Width = 251.000000000000000000 Size.Height = 251.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF545454 XRadius = 4.000000000000000000 YRadius = 4.000000000000000000 OnClick = RectangleImageClick OnPaint = RectangleImagePaint object AniIndicator: TAniIndicator Align = Center Enabled = True Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False end object LabelError: TLabel Align = Client AutoSize = True StyledSettings = [Family, Style] Padding.Left = 5.000000000000000000 Padding.Top = 5.000000000000000000 Padding.Right = 5.000000000000000000 Padding.Bottom = 5.000000000000000000 Opacity = 0.600000023841857900 Size.Width = 251.000000000000000000 Size.Height = 251.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = claWhitesmoke TextSettings.HorzAlign = Center Text = 'No longer available' Visible = False TabOrder = 0 OnResize = LabelErrorResize OnResized = LabelErrorResize end end object PopupMenuCopy: TPopupMenu Left = 64 Top = 56 object MenuItemCopy: TMenuItem Text = 'Copy image' OnClick = MenuItemCopyClick end end end ================================================ FILE: ChatGPT.FrameImage.pas ================================================ unit ChatGPT.FrameImage; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Effects, FMX.Filter.Effects, FMX.Menus, FMX.Controls.Presentation; type TFrameImage = class(TFrame) RectangleImage: TRectangle; AniIndicator: TAniIndicator; PopupMenuCopy: TPopupMenu; MenuItemCopy: TMenuItem; LabelError: TLabel; procedure RectangleImageClick(Sender: TObject); procedure MenuItemCopyClick(Sender: TObject); procedure RectangleImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); procedure LabelErrorResize(Sender: TObject); private FImage: string; FIsLoaded: Boolean; procedure SetImage(const Value: string); public property Image: string read FImage write SetImage; constructor Create(AOwner: TComponent); override; end; implementation uses ChatGPT.FrameImagePreview, FMX.Platform, ChatGPT.FrameUIMessage, HGM.FMX.Image; {$R *.fmx} { TFrameImage } constructor TFrameImage.Create(AOwner: TComponent); begin inherited; FIsLoaded := False; Name := ''; RectangleImage.HitTest := False; end; procedure TFrameImage.LabelErrorResize(Sender: TObject); begin if LabelError.Width < 100 then LabelError.Font.Size := 12 else LabelError.Font.Size := 14; end; procedure TFrameImage.MenuItemCopyClick(Sender: TObject); begin var ClipBoard: IFMXClipboardService; if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then begin ClipBoard.SetClipboard(RectangleImage.Fill.Bitmap.Bitmap); ShowUIMessage('Image coppied'); end else ShowUIMessage('ClipBoard error'); end; procedure TFrameImage.RectangleImageClick(Sender: TObject); begin RectangleImage.Visible := False; TFramePreview.ShowPreview(RectangleImage.Fill.Bitmap.Bitmap, RectangleImage, procedure begin RectangleImage.Visible := True; end); end; procedure TFrameImage.RectangleImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin if not FIsLoaded then begin FIsLoaded := True; RectangleImage.Fill.Bitmap.Bitmap.LoadFromUrlAsync(RectangleImage, FImage, True, procedure(Success: Boolean) begin AniIndicator.Visible := False; if Success then begin RectangleImage.Fill.Kind := TBrushKind.Bitmap; RectangleImage.Fill.Bitmap.WrapMode := TWrapMode.TileStretch; RectangleImage.HitTest := True; end else LabelError.Visible := True; end); end; end; procedure TFrameImage.SetImage(const Value: string); begin FImage := Value; end; end. ================================================ FILE: ChatGPT.FrameImagePreview.fmx ================================================ object FramePreview: TFramePreview Padding.Left = 20.000000000000000000 Padding.Top = 20.000000000000000000 Padding.Right = 20.000000000000000000 Padding.Bottom = 20.000000000000000000 Size.Width = 706.000000000000000000 Size.Height = 635.000000000000000000 Size.PlatformDefault = False OnClick = FrameClick OnResized = FrameResized object RectangleBG: TRectangle Align = Contents Fill.Color = xB4000000 HitTest = False Size.Width = 706.000000000000000000 Size.Height = 635.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None end object SaveDialogJPG: TSaveDialog DefaultExt = '*.jpg' Filter = 'JPG|*.jpg' Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] Left = 140 Top = 484 end object Image: TImage MultiResBitmap = < item end> HitTest = False Position.X = 96.000000000000000000 Position.Y = 80.000000000000000000 Size.Width = 345.000000000000000000 Size.Height = 249.000000000000000000 Size.PlatformDefault = False WrapMode = Place end object LayoutControls: TLayout Align = Contents Size.Width = 706.000000000000000000 Size.Height = 635.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object LayoutControlsContent: TLayout Align = Bottom Position.Y = 549.000000000000000000 Size.Width = 706.000000000000000000 Size.Height = 86.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object Rectangle1: TRectangle Align = Contents Fill.Kind = Gradient Fill.Gradient.Points = < item Color = claBlack Offset = 0.000000000000000000 end item Color = claNull Offset = 1.000000000000000000 end> Fill.Gradient.StartPosition.X = 0.500000000000000000 Fill.Gradient.StartPosition.Y = 1.000000000000000000 Fill.Gradient.StopPosition.X = 0.499999970197677600 Fill.Gradient.StopPosition.Y = 0.000000000000000000 Size.Width = 706.000000000000000000 Size.Height = 86.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None object ButtonDownload: TButton Align = Right Hint = 'Save as ...' ImageIndex = 15 Margins.Top = 20.000000000000000000 Margins.Right = 20.000000000000000000 Margins.Bottom = 20.000000000000000000 Position.X = 640.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 46.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_icon' TabOrder = 1 OnClick = ButtonDownloadClick end object ButtonShare: TButton Align = Right Hint = 'Share' ImageIndex = 14 Margins.Top = 20.000000000000000000 Margins.Right = 20.000000000000000000 Margins.Bottom = 20.000000000000000000 Position.X = 574.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 46.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_icon' TabOrder = 0 OnClick = ButtonShareClick end end end end end ================================================ FILE: ChatGPT.FrameImagePreview.pas ================================================ unit ChatGPT.FrameImagePreview; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Layouts, FMX.Controls.Presentation, FMX.Ani; type TFramePreview = class(TFrame) RectangleBG: TRectangle; Image: TImage; LayoutControlsContent: TLayout; ButtonDownload: TButton; Rectangle1: TRectangle; SaveDialogJPG: TSaveDialog; LayoutControls: TLayout; ButtonShare: TButton; procedure FrameClick(Sender: TObject); procedure ButtonDownloadClick(Sender: TObject); procedure FrameResized(Sender: TObject); procedure ButtonShareClick(Sender: TObject); private FInitImageBounds: TControl; FOnClose: TProc; procedure SetImageBounds(Rect: TControl); public class procedure ShowPreview(Bitmap: TBitmap; InitBounds: TControl; OnClose: TProc); constructor Create(AOwner: TComponent); override; end; implementation uses HGM.FMX.Ani, System.IOUtils, ChatGPT.FrameUIMessage, ChatGPT.Manager; {$R *.fmx} { TFramePreview } procedure TFramePreview.ButtonDownloadClick(Sender: TObject); begin {$IFNDEF ANDROID OR IOS OR IOS64} SaveDialogJPG.FileName := TPath.GetRandomFileName + '.jpg'; if SaveDialogJPG.Execute then begin Image.Bitmap.SaveToFile(SaveDialogJPG.FileName); ShowUIMessage('Saved'); end; {$ELSE} ShowMessage(TPath.Combine(TPath.GetSharedPicturesPath, TPath.GetRandomFileName + '.jpg')); Image.Bitmap.SaveToFile(TPath.Combine(TPath.GetSharedPicturesPath, TPath.GetRandomFileName + '.jpg')); ShowUIMessage('Saved to gallery'); {$ENDIF} end; procedure TFramePreview.ButtonShareClick(Sender: TObject); begin Manager.ShareBitmap(Image.Bitmap); end; constructor TFramePreview.Create(AOwner: TComponent); begin inherited; Name := ''; ButtonShare.Visible := Manager.CanShare; end; procedure TFramePreview.FrameClick(Sender: TObject); begin var ToRect := FInitImageBounds.AbsoluteRect; TAnimator.AnimateFloat(RectangleBG, 'Opacity', 0); TAnimator.AnimateFloat(Image, 'Position.X', ToRect.Left); TAnimator.AnimateFloat(Image, 'Position.Y', ToRect.Top); TAnimator.AnimateFloat(Image, 'Width', ToRect.Width); TAnimator.AnimateFloat(LayoutControlsContent, 'Margins.Bottom', -LayoutControlsContent.Height); LayoutControlsContent.Opacity := 0; TAnimator.AnimateFloat(LayoutControlsContent, 'Opacity', 1); TAnimator.AnimateFloatWithFinish(Image, 'Height', ToRect.Height, procedure begin if Assigned(FOnClose) then FOnClose; Release; end); end; procedure TFramePreview.FrameResized(Sender: TObject); begin Image.BoundsRect := LayoutControls.BoundsRect; end; procedure TFramePreview.SetImageBounds(Rect: TControl); begin FInitImageBounds := Rect; Image.BoundsRect := FInitImageBounds.AbsoluteRect; TAnimator.AnimateFloat(Image, 'Position.X', LayoutControls.BoundsRect.Left); TAnimator.AnimateFloat(Image, 'Position.Y', LayoutControls.BoundsRect.Top); TAnimator.AnimateFloat(Image, 'Width', LayoutControls.BoundsRect.Width); TAnimator.AnimateFloat(Image, 'Height', LayoutControls.BoundsRect.Height); end; class procedure TFramePreview.ShowPreview(Bitmap: TBitmap; InitBounds: TControl; OnClose: TProc); begin var Frame := TFramePreview.Create(InitBounds); Frame.Parent := Application.MainForm; Frame.Align := TAlignLayout.Contents; Frame.Image.Bitmap := Bitmap; Frame.BringToFront; Frame.SetImageBounds(InitBounds); Frame.RectangleBG.Opacity := 0.001; Frame.FOnClose := OnClose; Frame.LayoutControlsContent.Margins.Bottom := -Frame.LayoutControlsContent.Height; TAnimator.AnimateFloat(Frame.RectangleBG, 'Opacity', 1); TAnimator.AnimateFloat(Frame.LayoutControlsContent, 'Margins.Bottom', 0); end; end. ================================================ FILE: ChatGPT.FrameMessage.fmx ================================================ object FrameMessage: TFrameMessage Size.Width = 735.000000000000000000 Size.Height = 521.000000000000000000 Size.PlatformDefault = False OnResize = FrameResize OnResized = FrameResize object LayoutClient: TLayout Align = Contents Padding.Left = 16.000000000000000000 Padding.Top = 16.000000000000000000 Padding.Right = 16.000000000000000000 Padding.Bottom = 16.000000000000000000 Size.Width = 735.000000000000000000 Size.Height = 521.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object RectangleBG: TRectangle Align = Contents Fill.Color = xFF343541 Locked = True Sides = [Bottom] Size.Width = 735.000000000000000000 Size.Height = 521.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF282B34 end object LayoutContent: TLayout Align = HorzCenter Position.X = 45.000000000000000000 Position.Y = 16.000000000000000000 Size.Width = 645.000000000000000000 Size.Height = 489.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object LayoutContentText: TLayout Align = Client Size.Width = 507.000000000000000000 Size.Height = 459.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object FlowLayoutImages: TFlowLayout Align = Top Size.Width = 507.000000000000000000 Size.Height = 107.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Justify = Left JustifyLastLine = Left FlowDirection = LeftToRight end object LayoutFunc: TLayout Align = Top Position.Y = 107.000000000000000000 Size.Width = 507.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object ButtonExecuteFunc: TButton Align = Left Size.Width = 97.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_execute' TabOrder = 0 Text = 'Execute' TextSettings.HorzAlign = Leading OnClick = ButtonExecuteFuncClick end object LabelGPTFunc: TLabel Align = Client Cursor = crHelp StyledSettings = [Family, Size, Style] HitTest = True Margins.Left = 10.000000000000000000 Size.Width = 370.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TextSettings.FontColor = claWhite TextSettings.WordWrap = False Text = 'get_weather_info' TabOrder = 1 end object LayoutFuncState: TLayout Align = Right Cursor = crHelp HitTest = True Position.X = 477.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object PathSuccess: TPath Align = Center Data.Path = { 1700000000000000CDCC4C419A99E54101000000343353409A99994102000000 9A99394067669641020000009A993940CDCC90410200000034335340CDCC8C41 010000009A999940CDCC8041020000006766A64034337B4102000000CDCCBC40 34337B4102000000CDCCCC40CDCC8041010000009A9959416666BA4101000000 CDCCEC419899E940020000000000F041CBCCDC40020000009A99F541CBCCDC40 020000009A99F9419899E94001000000CDCC0242CCCC0C410200000067660442 32331341020000006766044266661E4102000000CDCC02426666264101000000 666666419A99E5410200000066665E41CDCCE8410200000033335341CDCCE841 02000000CDCC4C419A99E54103000000CDCC4C419A99E541} Fill.Color = xFFACACBE HitTest = False Size.Width = 16.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object PathError: TPath Align = Center Data.Path = { 3C000000000000000000404100000040020000001B2F8C410000004002000000 0000B041C74BCF40020000000000B04100004041020000000000B0410E2D8C41 020000001B2F8C410000B04102000000000040410000B041020000009643CF40 0000B04102000000000000400E2D8C4102000000000000400000404102000000 00000040C74BCF40020000009643CF4000000040020000000000404100000040 030000000000404100000040000000000000404121B06A4002000000C3F5EC40 21B06A400200000021B06A40C3F5EC400200000021B06A400000404102000000 21B06A408FC2844102000000C3F5EC40FCA9A2410200000000004041FCA9A241 020000008FC28441FCA9A24102000000FCA9A2418FC2844102000000FCA9A241 0000404102000000FCA9A241C3F5EC40020000008FC2844121B06A4002000000 0000404121B06A40030000000000404121B06A4000000000ADFA3F4103096841 020000009FCD48410309684102000000F1F44F41BE306F4102000000F1F44F41 B003784102000000F1F44F41516B8041020000009FCD48412EFF834102000000 ADFA3F412EFF834102000000522737412EFF83410200000000003041516B8041 0200000000003041B00378410200000000003041BE306F410200000052273741 0309684102000000ADFA3F410309684103000000ADFA3F410309684100000000 79E93F410000E04002000000B9FC45418BFDDF4002000000DE024B41DE02E940 0200000042CF4B4178B9F44001000000EEEB4B4116FBF74001000000ADFA4B41 1904444102000000E7FB4B41A9A44A4102000000B29D46415305504102000000 22FD3F418E06504102000000E2E93941C80750410200000054E334411F854B41 02000000F0163441FCA9454101000000ADFA33410309444101000000EEEB3341 EA04F840020000004BEA3341B5C3EA400200000080483941B402E04002000000 79E93F410000E0400300000079E93F410000E040} Fill.Color = xFFEA4141 HitTest = False Size.Width = 16.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None Visible = False WrapMode = Fit end object PathWait: TPath Align = Center Data.Path = { 2300000000000000C3F59641B81E41410100000086EB4D41EC51AC4102000000 4EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B041 020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B41 0000B04102000000B97534413BF9AE410200000024B52F4162ACAB4102000000 000030410000A84101000000000030410000704101000000713DDA4000007041 02000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A40 3601504102000000903A9A4001F149410200000019AC9D40AB00444102000000 F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC90340 02000000F3613D419238EF3F02000000E17A44410000004002000000468A4B41 2A36084002000000DB4A5041F19C224002000000000050410000404001000000 000050410000104101000000A47089410000104102000000CD46924154FF0F41 02000000EA70994178521E410200000040719941C9FE2F41020000005D719941 FF0E364102000000FB94984155FF3B4102000000C4F59641B81E414103000000 C3F59641B81E4141} Fill.Color = xFFACACBE HitTest = False Size.Width = 16.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None Visible = False WrapMode = Fit end object AniIndicatorFunc: TAniIndicator Align = Client Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False end end end end object LayoutInfo: TLayout Align = MostLeft Margins.Right = 14.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 489.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object RectangleUser: TRectangle Align = Top Fill.Color = xFF5436DA Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path1: TPath Align = Center Data.Path = { 310000000000000000004041000000400200000035D113410000004002000000 0000E0406AA28740020000000000E0400000E040020000000100E040CC2E1C41 0200000036D113410000404102000000010040410000404102000000CA2E6C41 000040410200000000008841CC2E1C4102000000000088410200E04002000000 000088416CA2874002000000CB2E6C4104000040020000000000404104000040 03000000000040410000004000000000000040410000204102000000867D2541 0000204102000000000010417A820A4102000000000010410000E04002000000 000010410CFBAA4002000000877D2541FFFF7F40020000000100404100008040 0200000079825A41FFFF7F4002000000000070410CFBAA400200000000007041 FFFFDF4002000000000070417A820A410200000079825A410000204102000000 FFFF3F4100002041030000000000404100002041000000000000A8410000A841 010000000000A8410000A041020000000000A84172128141020000008EED8E41 0000504102000000000060410000504101000000000020410000504102000000 C849C4400000504102000000000040407212814102000000020040400000A041 01000000020040400000A841010000000100A0400000A841010000000100A040 0000A041020000000100A0409AE88941020000006CA2E7400000704102000000 0100204100007041010000000100604100007041020000006617864100007041 02000000000098419BE8894102000000000098410000A0410100000000009841 0000A841030000000000A8410000A841} Fill.Color = claWhite Locked = True Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object RectangleBot: TRectangle Align = Top Fill.Color = xFF10A37F Position.Y = 30.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path2: TPath Align = Center Data.Path = { 0F010000000000002D21164232F786410200000057EC1742B762784102000000 928B1842F38E61410200000054F4174272F94A4102000000155D1742F1633441 02000000D792154279921E410200000039B41242C2FA0A41020000004D730E42 75B0DA4002000000EBF3074261C3AB400200000032260042B6F38F4002000000 F2B0F04141486840020000004547DF4109C45940020000006F92CE412E737640 020000006C09C741E48332400200000074C6BD41E17AF83F02000000D567B341 3884AE3F020000003709A941711B493F0200000098CC9D419C87FB3E02000000 47729241E90C003F02000000CC5D81416876FD3E02000000C66D61410282953F 020000004BC8454157041B4002000000D1222A4184476B400200000094931541 0A4BAE400200000034110B41014DEF400200000090A0E9405969F84002000000 5B94BF40607605410200000070CE9A4001CD1241020000000A116C40A3232041 0200000048C42E404F4031410200000024D10140F4FD444102000000D3DA743F AC8B6241020000007A70FF3EF16382410200000033C1383FE561934102000000 3ACA713FA45FA44102000000FB05EB3FF55BB44102000000E9265140CE08C141 020000004F753440A5CECB41020000001B812A408638D74102000000DCF43340 4783E241020000009D683D4007CEED4102000000740C5A40AEB6F84102000000 D7FA834055410142020000005C03A640E2A90842020000005DFED9405F870E42 020000001C360C415501124202000000F46C2B414A7B1542020000004F404E41 A36316420200000093A96F41C89814420200000099BB7E41C2D7184202000000 F9A088411C3C1C420200000063FF9241E18B1E4202000000015E9D418CDB2042 02000000A09AA841E908224202000000F1F4B341CCFF214202000000AC0BC541 8805224202000000D7B4D54112541F4202000000CE88E3410E4F1A4202000000 FB5CF141094A15420200000012A5FB41D0330E42020000009672004254120642 02000000C4020642CCEE0442020000004D440B426A9E02420200000015DD0F42 6891FE4102000000C375144232E6F741020000008C4A1842A857EF4102000000 CE191B42D578E5410200000019621F4261B2D641020000008E3521424D95C541 02000000CB5020423199B44102000000226C1F42159DA3410200000009DB1B42 9CA29341020000002D21164232F78641030000002D21164232F7864100000000 7FFBB341238A17420200000054F4A541B38C174202000000015E9841DC171542 020000005F988D41B499104202000000AF148E41CF77104202000000CCEE8E41 023C104202000000EE7C8F417D101042010000000534CF412653FB4102000000 6ACDD0414B6AFA41020000006221D2419318F94102000000E70CD3419D80F741 02000000A1F8D341A7E8F541020000004D73D4416519F441020000006F70D441 8F42F241010000006F70D441006F984101000000D35EEF41E7FBA74102000000 DE82EF41ED0DA84102000000FFA1EF418D28A841020000008CB9EF418649A841 02000000E5D0EF417F6AA84102000000A4DFEF41CB90A84102000000C3E4EF41 BBB8A84101000000C3E4EF41781CF34102000000A4DFEF410080014202000000 8A8EE941CC1D094202000000C353DE4185BC0E4202000000FC18D341575B1442 02000000D3DEC341BC851742020000007FFBB341238A1742030000007FFBB341 238A1742000000007A8DCC401B0DF841020000007172B04010E9EB4102000000 4451A64083AFDD4102000000F2EFAF4098DDCF41020000006BD4B1404C26D041 02000000A722B54087A7D04102000000ED81B740C5FED041010000001B2F5B41 64CCF54102000000295C5E41F5B9F6410200000009F961414C37F74102000000 B5A665414C37F74102000000F85369414C37F74102000000D8F06C41F5B9F641 02000000E71D704164CCF5410100000017D9C541E5E1C8410100000017D9C541 B3FBE7410200000057DBC5414024E841020000008FD3C541014DE84102000000 5BC2C541DE71E8410200000027B1C541BC96E841020000002497C541E3B6E841 020000009476C54142CFE84101000000B90D8541B1FF064202000000B98D6E41 66F70A42020000002CD44D41EF090C42020000007E1D2F414AFB094202000000 A5661041A5EC0742020000004469EC40BBE70242020000007A8DCC401B0DF841 030000007A8DCC401B0DF841000000009981894010E95941020000006B7DA540 C89841410200000075B0D1407FFB2E41020000007D2E0341BD52254102000000 7D2E0341BA6B2641020000005A1E0341645D2841020000005A1E0341AEB62941 010000005A1E0341C9769E41020000009E1803416A4DA04102000000AE0D0441 431CA2410200000045E4054105B4A34102000000DCBA0741924BA54102000000 04620A41159DA64102000000FD930D41F085A7410100000012949441006FD441 01000000C74B7341B3FBE34102000000C80773413A12E441020000008CB97241 BE1FE44102000000736872416E23E44102000000591772411E27E44102000000 6DC57141C520E44102000000787A7141CB10E44101000000734BE14079D8BE41 020000008048AA407CE1B641020000002D268240BAC9A941020000008D626340 D26F9A4102000000C07842401E168B410200000070995340F775754102000000 9981894010E95941030000009981894010E9594100000000D7A3FF41DE71A041 010000007FD9B141BF0E674101000000E3C7CC4138F8474102000000E2E9CC41 92CB4741020000000011CD4121B04741020000008C39CD41C1A8474102000000 1962CD4162A1474102000000DB8ACD417DAE47410200000055B0CD4170CE4741 010000006A0D074259178941020000009FFC0B42C1CA8E4102000000BE011042 832F97410200000074A41242584AA14102000000114715422C65AB4102000000 366B1642C1CAB64102000000CCEE1542AF25C24102000000617215429D80CD41 02000000515A13427958D84102000000AFE50F423E68E14102000000F2700C42 0378EA410200000019C40742A45FF14102000000366B02421450F54102000000 366B0242F2C1F44102000000366B024252C9F34102000000366B0242781CF341 01000000366B02420681A94102000000296D024236ABA741020000008A300242 C6DCA5410200000099BB01423945A44102000000A8460142ACADA24102000000 B29D0042C05BA14102000000D7A3FF41DE71A04103000000D7A3FF41DE71A041 00000000D5380D426E3470410200000050FC0C42BE9F6F410200000089920C42 90A06E4102000000A8460C427CF26D410100000004D6D841D656244102000000 7D3FD741857C2241020000004171D54141822141020000006B9AD34141822141 02000000CAC3D14141822141020000005AF5CF41857C224102000000D35ECE41 D656244101000000AF9480413D2C7E4101000000AF948041A1F83F4102000000 6F9280411EA73F4102000000379A804104563F41020000006BAB80414A0C3F41 020000009FBC80418FC23E4102000000A1D6804141823E410200000032F78041 83513E41010000000D60C1410C02E840020000000E3ECB41BC3FD14002000000 C286D6414833C640020000000AE8E1417C27C840020000005249ED41C51BCA40 020000008C4AF84111FCD840020000004ED10042E50AF340020000003C7D0542 DD8C0641020000000523094296A118410200000067550B424CA62D4102000000 C8870D42CEAA424102000000832F0E4283C0594102000000D5380D426E347041 03000000D5380D426E34704100000000DFE063410389AF4101000000D2002E41 1CFC9F4102000000BBB82D4116EA9F4102000000107A2D4176CF9F4102000000 5E4B2D417DAE9F4102000000AC1C2D41848D9F4102000000C5FE2C4138679F41 02000000F1F42C41143F9F4101000000F1F42C41AEB6294102000000A1F82C41 5DED124102000000107A33413A3BF94002000000DDB53F4160C8D24002000000 13F24B418655AC400200000038675D41A0A68D40020000003D0A724122A67440 02000000A156834104FF4D4002000000B7D18E412FA83F4002000000841E9A41 0E4F4B4002000000856BA541EDF55640020000003A12B0414B1F7C4002000000 C3D3B841B0389B40020000007357B84102489C4002000000FA7EB74118269E40 0200000035EFB641E8829F40010000003B706E41DB5C194102000000713D6B41 342E1B4102000000EA95684124D11D410200000077BE66416900214102000000 6DE76441832F24410200000013F263419FCD27410200000066F76341E17A2B41 01000000DFE063410389AF4103000000DFE063410389AF410000000068918041 28FE8F4101000000E336A341FDF677410100000029DCC541E1FA8F4101000000 29DCC541EEFCB74101000000E336A34185FCCB410100000068918041EEFCB741 010000006891804128FE8F41030000006891804128FE8F41} Fill.Color = claWhite Locked = True Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object RectangleSystem: TRectangle Align = Top Fill.Color = xFFDA6F36 Position.Y = 60.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path7: TPath Align = Center Data.Path = { 0001000000000000000060410000A0410200000075828A410000A04102000000 0000A04175828A41020000000000A04100006041020000000000A04116FB2A41 0200000075828A41000000410200000000006041000000410200000016FB2A41 00000041020000000000004116FB2A4102000000000000410000604102000000 0000004175828A410200000016FB2A410000A04102000000000060410000A041 03000000000060410000A0410000000000009041000060410200000000009041 3DAC8141020000003DAC81410000904102000000000060410000904102000000 87A73C410000904102000000000020413DAC8141020000000000204100006041 020000000000204187A73C410200000087A73C41000020410200000000006041 00002041020000003DAC814100002041020000000000904187A73C4102000000 000090410000604103000000000090410000604100000000000000005DFE4F41 01000000000000005DFE6F410200000000000000E5618441020000001618963F 75938E4102000000D4652B405DDC8F41020000008A93334067C4924102000000 F5D63C40DA9B95410200000008204740DF6098410200000061FD0740D9CEA141 02000000F0DC0B403BDFAF41020000000ABF524099BBB84101000000BAA09640 E10BC441020000004243B9406EB4CC410200000011C7EF40645DCD4102000000 71B80A415906C641020000009FAB11411AC0C741020000007DDC1841A245C941 02000000C44220410C93CA410200000095D422414F9ED64102000000B5373741 0000E0410200000022FD4F410000E0410100000022FD6F410000E04102000000 766084410000E041020000009D918E418A9FD6410200000057DB8F411895CA41 020000001D3893416666C94102000000C57E96416C09C841020000003DAC9941 D280C64102000000F30EA341CA54CD41020000007446B0411283CC4102000000 A5BDB841E10BC44101000000ED0DC44199BBB841020000001F85CC416744B041 02000000D656CD41E70CA341020000001283C64130AA9941020000000F0BC841 8B7D964102000000D567C941E9379341020000005396CA41F5DB8F4102000000 27A0D6419D918E41020000000000E041AA608441020000000000E0415DFE6F41 010000000000E0415DFE4F41020000000000E041643B37410200000027A0D641 E8D92241020000005396CA413945204102000000B448C94129DC184102000000 C4C2C741EBA81141020000006608C64187B30A4102000000CC5DCD4190BDEF40 02000000A2B4CC41813EB940020000007E0CC441309E96400100000036BCB841 CBB952400200000076E0AF411EDC0B40020000001AD1A141A1F8074002000000 54639841280F474002000000159D954127C23C400200000067C49241747B3340 0200000023DB8F41494B2B4002000000CB908E418FFC953F02000000D95F8441 000000000200000022FD6F41000000000100000022FD4F410000000002000000 EF383741000000000200000039D62241410E963F020000002D432041295C2B40 0200000082B919412E903440020000008A5913414F233F400200000000290D41 EFFE4A4002000000419FF44034D7074002000000F2CDBA40A96A0A4002000000 76A69640CBB952400100000058CA52401B9E964002000000357B0A40C1C5BA40 02000000C0E707402497F44002000000F90F4B40F2240D410200000012313F40 1F571341020000007C9B3440DAB8194102000000D4652B406744204102000000 1618963F39D6224102000000000000005839374102000000000000005DFE4F41 03000000000000005DFE4F410000000022FD7F41000040400200000022FD7F41 72A71C40020000005BD37841000000400200000022FD6F410000004001000000 22FD4F410000004002000000E9264741000000400200000022FD3F4172A71C40 0200000022FD3F41000040400100000022FD3F41FE7D58400200000022FD3F41 3EED764002000000029A3A4188688840020000005E4B334148A78C4002000000 13F22741533F934002000000A81D1D41CF499C40020000008EF51241AB78A740 02000000344B0C416CCFAE400200000073E803412046AD4002000000410EFD40 7B83A24001000000E128F140309E964002000000BDA9E440F71E8A4002000000 E466D040F71E8A4002000000ABE7C3401B9E96400100000076A6964065DFC340 020000003D278A40895ED040020000003D278A4077A1E4400200000076A69640 9B20F14001000000EB8BA2401006FD4002000000904EAD405AE4034102000000 DCD7AE401B470C41020000001B81A74076F1124102000000B1509C40091B1D41 0200000039459340D8F0274102000000EFAC8C40304C334102000000986E8840 3D9B3A4102000000DFF876405DFE3F4102000000A48858405DFE3F4101000000 000040405DFE3F410200000072A71C405DFE3F4102000000000000408D284741 02000000000000405DFE4F4101000000000000405DFE6F410200000000000040 95D478410200000072A71C405DFE7F4102000000000040405DFE7F4101000000 A48858405DFE7F4102000000DFF876405DFE7F4102000000836E8840F2B08241 02000000EFAC8C40455886410200000083DD9240DAAC8B4102000000A4369B40 74C69041020000009A77A5404D959541020000006E8BAC40CFE6984102000000 10E9AA40CE089D41020000000B46A04090B19F4101000000BAA09640091BA241 0200000096218A40C73AA5410200000096218A405E4BAA4102000000BAA09640 516BAD410100000004E2C34099BBB841020000002861D04057DBBB4102000000 16A4E44057DBBB41020000003A23F14099BBB8410100000081ECF84052C9B641 0200000062E701419710B44102000000A7680A41D7B4B34102000000C4191141 3D9BB541020000008CCA1B41A9A4B84102000000E63F2741E414BB4102000000 5E4B3341CAD4BC4102000000029A3A415AE4BD410200000022FD3F41F920C141 0200000022FD3F41CCEEC4410100000022FD3F410000C8410200000022FD3F41 1C6BCC4102000000E92647410000D0410200000022FD4F410000D04101000000 22FD6F410000D041020000005BD378410000D0410200000022FD7F411C6BCC41 0200000022FD7F410000C8410100000022FD7F416FF0C4410200000022FD7F41 6822C1410200000055B08241C9E5BD4102000000DC57864139D6BC4102000000 8E068C412130BB41020000007C729141F4ECB84102000000FD8796415C20B641 020000002FDD9941C14AB441020000008A0E9E410EADB4410200000048BFA041 CC5DB74101000000151DA24199BBB84102000000D33CA54157DBBB4102000000 9F4DAA4157DBBB41020000005D6DAD4199BBB84101000000A5BDB841516BAD41 0200000064DDBB415E4BAA410200000064DDBB41C73AA54102000000A5BDB841 091BA24101000000D95FB7413CBDA041020000001BAFB4417E0C9E4102000000 CD4CB44123DB9941020000009C22B641F085964102000000CCEEB8410D719141 020000009031BB4125068C4102000000A8D7BC41455886410200000038E7BD41 F2B0824102000000D723C1415DFE7F4102000000DEF1C4415DFE7F4101000000 0000C8415DFE7F41020000001C6BCC415DFE7F41020000000000D04195D47841 020000000000D0415DFE6F41010000000000D0415DFE4F41020000000000D041 8D284741020000001C6BCC415DFE3F41020000000000C8415DFE3F4101000000 DEF1C4415DFE3F4102000000D723C1415DFE3F410200000038E7BD413D9B3A41 02000000A8D7BC41304C334102000000C217BB41143F27410200000052A7B841 C3C71B41020000007E9DB5416C15114102000000E3B6B34150640A4102000000 D712B4410BE30141020000005ECBB641D2E3F8400100000036BCB8419B20F140 02000000F5DBBB4177A1E44002000000F5DBBB41895ED0400200000036BCB841 65DFC34001000000EE6BAD411B9E964002000000304CAA41F71E8A4002000000 643BA541F71E8A4002000000A61BA2411B9E964001000000D0B39F41473DA040 020000000F0B9D414CE0AA4002000000DCE89841BF82AC400200000059979541 EB6EA54002000000E3C790413D2C9B400200000043AD8B4120D2924002000000 DC57864123A18C400200000055B08241206388400200000022FD7F419CE17640 0200000022FD7F418F7058400100000022FD7F41000040400300000022FD7F41 00004040} Fill.Color = claWhite Locked = True Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object RectangleError: TRectangle Align = Top Fill.Color = xFFDD4848 Position.Y = 90.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path9: TPath Align = Center Data.Path = { 2000000000000000DD244E414A0C224002000000A69B48414E62F03F02000000 5A6437414E62F03F0200000023DB31414A0C2240010000008C6C074089419C41 020000006FB1ED3F3827A04102000000AEAE02400AFEA4410200000029DC2140 8510A7410200000091232B4066AEA74102000000B07D3540A700A84102000000 000040400000A841010000000000A8410000A84102000000D168AC415702A841 02000000CCFDAF412671A441020000002200B0415608A04102000000D500B041 ECB79E41020000007AAEAF418A6C9D41020000006210AF4196439C4101000000 DD244E414A0C224003000000DD244E414A0C2240000000000000504100009041 0100000000003041000090410100000000003041000080410100000000005041 0000804101000000000050410000904103000000000050410000904100000000 0000304100006041010000000000304100001041010000000000504100001041 0100000019045041000060410100000000003041000060410300000000003041 00006041} Fill.Color = claWhite Locked = True Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object RectangleFunc: TRectangle Align = Top Fill.Color = xFF48D8DD Position.Y = 120.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path10: TPath Align = Center Data.Path = { 2300000000000000C3F59641B81E41410100000086EB4D41EC51AC4102000000 4EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B041 020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B41 0000B04102000000B97534413BF9AE410200000024B52F4162ACAB4102000000 000030410000A84101000000000030410000704101000000713DDA4000007041 02000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A40 3601504102000000903A9A4001F149410200000019AC9D40AB00444102000000 F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC90340 02000000F3613D419238EF3F02000000E17A44410000004002000000468A4B41 2A36084002000000DB4A5041F19C224002000000000050410000404001000000 000050410000104101000000A47089410000104102000000CD46924154FF0F41 02000000EA70994178521E410200000040719941C9FE2F41020000005D719941 FF0E364102000000FB94984155FF3B4102000000C4F59641B81E414103000000 C3F59641B81E4141} Fill.Color = claWhite Locked = True Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object LayoutAudio: TLayout Align = Left Margins.Right = 14.000000000000000000 Position.X = 44.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 459.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object RectangleAudio: TRectangle Align = Top Fill.Kind = None Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path3: TPath Align = Center Data.Path = { 19000000000000000000A0400000A84101000000000040400000A84101000000 0000404000003041010000000000A04000003041030000000000A0400000A841 00000000000030410000E04001000000000010410000E0400100000000001041 0000C84101000000000030410000C84103000000000030410000E04000000000 000088410000004001000000000070410000004001000000000070410000F041 01000000000088410000F041030000000000884100000040000000000000B841 00003041010000000000A84100003041010000000000A8410000A84101000000 0000B8410000A841030000000000B84100003041000000000000E8410000E040 010000000000D8410000E040010000000000D8410000C841010000000000E841 0000C841030000000000E8410000E040} Fill.Color = xFFACACBE Hint = 'Is audio' HitTest = False Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object LayoutActions: TLayout Align = MostRight Margins.Left = 4.000000000000000000 Position.X = 599.000000000000000000 Size.Width = 46.000000000000000000 Size.Height = 489.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object ButtonCopy: TButton Align = Top Hint = 'Copy text' Margins.Right = 16.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini_left' TabOrder = 0 OnClick = ButtonCopyClick object PathCopy: TPath Align = Center Data.Path = { 8E0000000000000077BE40422546B8420200000077BE4042717DA74202000000 3AB45A42777E9A420200000066E68042777E9A4202000000AF729442777E9A42 02000000D28DBC42440B9A4202000000D28DBC42440B9A4202000000D28DBC42 440B9A420200000026F1BB4263108C420200000026F1BB426991744202000000 26F1BB42190451420200000099D9CB425FBA38420200000007ECDE425FBA3842 020000007CFFF1425FBA3842020000003B3F2843FF543A42020000000CE22C43 FF543A4202000000DD843143FF543A4202000000AE4735434135414202000000 1C7A3A43140351420200000049AC3F43F3D26042020000006C87474385407B42 02000000436B4B43156E8642020000001A4F4F43E83B8F420200000074F35043 BF5F94420200000074F3504354A39B420200000074F350436DE7A24202000000 74F35043CDAC1A430200000018E45043B428234302000000FDD45043DDA42B43 02000000950349437FEA314302000000CAC13F433D0A324302000000FF7F3643 FB293243020000003B9F2243FB293243020000003B9F2243FB29324302000000 3B9F2243FB293243020000008716234361703843020000008716234361504143 020000008716234361304A430200000064FB1A43FF1F51430200000060C51143 B75E5143020000009D8F08436F9D5143020000006CA7934246E1504302000000 24C68142FF1F514302000000B9C95F42B75E514302000000E2A53F42BB544A43 02000000E2A53F42F7B3414302000000E2A53F42331339430200000075BE4042 540EC9420200000075BE40422346B8420300000077BE40422546B84200000000 0AD781427F2AC042010000006E127F429EEF3C430200000004F57E42731F3F43 0200000042FA82423FEB404302000000EE59874299F240430200000086628742 A8F24043020000001B6B8742AFF2404302000000B4738742B0F2404301000000 94A30D43022B414302000000FEC50F439B314143020000004B861143007C3F43 02000000E48C114396593D43020000000E8D1143F04B3D4302000000F08C1143 493E3D43020000008A8C1143A4303D4301000000BB5411434A4C344302000000 E84F114343333343020000002C6810435A53324302000000244F0F432E583243 02000000144D0F433758324302000000044B0F434358324302000000F5480F43 5258324302000000E6460F43615832430200000086D6F24229FC324302000000 3609DF4254A3324302000000633BCB423D4A32430200000026B1BD42BCD42B43 020000009CAFBD423B1F23430200000013AEBD42BA691A430200000025B1BD42 C2F5BB420200000025B1BD42C2F5BB42020000004BB2BD4253C3B94202000000 49EBBB4274FAB74202000000DCB8B9424EF9B7420200000018B5B9424CF9B742 0200000051B1B94250F9B742020000008EADB94258F9B742010000009AEF8942 5423B8420200000003818542442BB8420200000087E8814205BCBB4202000000 06D781427F2AC042030000000AD781427F2AC04200000000926D2B43CD4C7342 0200000013C3294300806D420200000079692843A4F06F420200000079692843 BBC9784201000000796928436DE79E420200000079692843B31DA14202000000 564E294302EBA24202000000B4682A4315EEA24201000000E9463F43CB21A342 02000000227B41436D27A3420200000002EB4143ECD1A04202000000C4404043 85EB9D4201000000916D2B43CC4C734203000000926D2B43CD4C734200000000 DEA4E34221B0764202000000F66DE142E9A5764202000000929EDF4202367A42 02000000A19ADF42D7A37E42010000001E5ADE4275F31F4302000000EA51DE42 129721430200000097F3E0428EEE224302000000D03AE442A8F2224302000000 7F41E442B0F22243020000002C48E442B3F2224302000000DB4EE442B0F22243 01000000A05A3D4312C3224302000000E3773E43BEC12243020000000F603F43 35DD214302000000E4653F4300C020430100000080AA404372A8C44202000000 FFB14043F780C242020000008AD83F43BFB5C04202000000CDC43E43C1A6C042 0200000072BF3E4376A6C0420200000018BA3E4358A6C04202000000BDB43E43 66A6C0420200000062AF3E4374A6C04202000000B5882443E7BBC04202000000 4AEC1F43E7BBC04202000000E04F1B43E7BBC04202000000546318433D4ABC42 02000000546318431EC5B3420200000054631843FF3FAB4202000000CD4C1843 14AE7F4202000000CD4C184314AE7F4202000000B74A18437B3D7B4202000000 1B651743ACA5774202000000F6481643A49B7742010000005AA4E3421FB07642 03000000DEA4E34221B07642} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end object ButtonActions: TButton Align = Right Margins.Right = -16.000000000000000000 Position.X = 30.000000000000000000 Size.Width = 16.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini_right' TabOrder = 0 OnClick = ButtonActionsClick object Path4: TPath Align = Center Data.Path = { 1B00000000000000CDCCC54233B33843010000006766C942CDCC3A4301000000 34B36C4366A6AB4302000000CE4C7143CC4CAE43020000003433784333F3AF43 0200000067E67F4333F3AF4302000000CDCC834333F3AF430200000000408743 0040AE4302000000CD8C894366A6AB43010000000080CD439A193B4301000000 66A6CE4300803843020000000080CF4300003643020000000000D04300003343 020000000000D043CDCC2F43020000000000D0439A19274302000000CD4CCC43 000020430200000033B3C743000020430100000033B3C7430000204301000000 3333E14200002043010000003333E1420000204302000000CDCCCE4200002043 020000000000C0429A192743020000000000C042CDCC2F43020000000000C042 9A193343020000003333C2423333364302000000CDCCC54233B3384303000000 CDCCC54233B33843} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 7.000000000000000000 Size.Height = 7.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end end object LayoutCompact: TLayout Align = Bottom Position.X = 44.000000000000000000 Position.Y = 459.000000000000000000 Size.Width = 551.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 4 object ButtonCopyCompact: TButton Align = Right Hint = 'Copy text/image urls' Position.X = 491.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 3 OnClick = ButtonCopyClick object Path5: TPath Align = Center Data.Path = { 8E0000000000000077BE40422546B8420200000077BE4042717DA74202000000 3AB45A42777E9A420200000066E68042777E9A4202000000AF729442777E9A42 02000000D28DBC42440B9A4202000000D28DBC42440B9A4202000000D28DBC42 440B9A420200000026F1BB4263108C420200000026F1BB426991744202000000 26F1BB42190451420200000099D9CB425FBA38420200000007ECDE425FBA3842 020000007CFFF1425FBA3842020000003B3F2843FF543A42020000000CE22C43 FF543A4202000000DD843143FF543A4202000000AE4735434135414202000000 1C7A3A43140351420200000049AC3F43F3D26042020000006C87474385407B42 02000000436B4B43156E8642020000001A4F4F43E83B8F420200000074F35043 BF5F94420200000074F3504354A39B420200000074F350436DE7A24202000000 74F35043CDAC1A430200000018E45043B428234302000000FDD45043DDA42B43 02000000950349437FEA314302000000CAC13F433D0A324302000000FF7F3643 FB293243020000003B9F2243FB293243020000003B9F2243FB29324302000000 3B9F2243FB293243020000008716234361703843020000008716234361504143 020000008716234361304A430200000064FB1A43FF1F51430200000060C51143 B75E5143020000009D8F08436F9D5143020000006CA7934246E1504302000000 24C68142FF1F514302000000B9C95F42B75E514302000000E2A53F42BB544A43 02000000E2A53F42F7B3414302000000E2A53F42331339430200000075BE4042 540EC9420200000075BE40422346B8420300000077BE40422546B84200000000 0AD781427F2AC042010000006E127F429EEF3C430200000004F57E42731F3F43 0200000042FA82423FEB404302000000EE59874299F240430200000086628742 A8F24043020000001B6B8742AFF2404302000000B4738742B0F2404301000000 94A30D43022B414302000000FEC50F439B314143020000004B861143007C3F43 02000000E48C114396593D43020000000E8D1143F04B3D4302000000F08C1143 493E3D43020000008A8C1143A4303D4301000000BB5411434A4C344302000000 E84F114343333343020000002C6810435A53324302000000244F0F432E583243 02000000144D0F433758324302000000044B0F434358324302000000F5480F43 5258324302000000E6460F43615832430200000086D6F24229FC324302000000 3609DF4254A3324302000000633BCB423D4A32430200000026B1BD42BCD42B43 020000009CAFBD423B1F23430200000013AEBD42BA691A430200000025B1BD42 C2F5BB420200000025B1BD42C2F5BB42020000004BB2BD4253C3B94202000000 49EBBB4274FAB74202000000DCB8B9424EF9B7420200000018B5B9424CF9B742 0200000051B1B94250F9B742020000008EADB94258F9B742010000009AEF8942 5423B8420200000003818542442BB8420200000087E8814205BCBB4202000000 06D781427F2AC042030000000AD781427F2AC04200000000926D2B43CD4C7342 0200000013C3294300806D420200000079692843A4F06F420200000079692843 BBC9784201000000796928436DE79E420200000079692843B31DA14202000000 564E294302EBA24202000000B4682A4315EEA24201000000E9463F43CB21A342 02000000227B41436D27A3420200000002EB4143ECD1A04202000000C4404043 85EB9D4201000000916D2B43CC4C734203000000926D2B43CD4C734200000000 DEA4E34221B0764202000000F66DE142E9A5764202000000929EDF4202367A42 02000000A19ADF42D7A37E42010000001E5ADE4275F31F4302000000EA51DE42 129721430200000097F3E0428EEE224302000000D03AE442A8F2224302000000 7F41E442B0F22243020000002C48E442B3F2224302000000DB4EE442B0F22243 01000000A05A3D4312C3224302000000E3773E43BEC12243020000000F603F43 35DD214302000000E4653F4300C020430100000080AA404372A8C44202000000 FFB14043F780C242020000008AD83F43BFB5C04202000000CDC43E43C1A6C042 0200000072BF3E4376A6C0420200000018BA3E4358A6C04202000000BDB43E43 66A6C0420200000062AF3E4374A6C04202000000B5882443E7BBC04202000000 4AEC1F43E7BBC04202000000E04F1B43E7BBC04202000000546318433D4ABC42 02000000546318431EC5B3420200000054631843FF3FAB4202000000CD4C1843 14AE7F4202000000CD4C184314AE7F4202000000B74A18437B3D7B4202000000 1B651743ACA5774202000000F6481643A49B7742010000005AA4E3421FB07642 03000000DEA4E34221B07642} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object RectangleAudioCompact: TRectangle Align = Left Fill.Kind = None Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 2.000000000000000000 YRadius = 2.000000000000000000 object Path6: TPath Align = Center Data.Path = { 19000000000000000000A0400000A84101000000000040400000A84101000000 0000404000003041010000000000A04000003041030000000000A0400000A841 00000000000030410000E04001000000000010410000E0400100000000001041 0000C84101000000000030410000C84103000000000030410000E04000000000 000088410000004001000000000070410000004001000000000070410000F041 01000000000088410000F041030000000000884100000040000000000000B841 00003041010000000000A84100003041010000000000A8410000A84101000000 0000B8410000A841030000000000B84100003041000000000000E8410000E040 010000000000D8410000E040010000000000D8410000C841010000000000E841 0000C841030000000000E8410000E040} Fill.Color = xFFACACBE Hint = 'Is audio' HitTest = False Size.Width = 20.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object ButtonDeleteCompact: TButton Align = Right Hint = 'Delete' Position.X = 521.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 1 OnClick = ButtonDeleteClick object Path8: TPath Align = Center Data.Path = { 6900000000000000000050410000000001000000000030410000000002000000 867D154100000000020000000000004133ECAB3F020000000000004100004040 01000000000000410000804001000000000000400000804002000000BC4EB93F 00008040020000000000803FAF538E40020000000000803F0000A04002000000 0000803F51ACB14002000000BA4EB93F0000C04002000000FFFFFF3F0000C040 01000000000040400000C04001000000000040400000A0410200000000004040 51ACB14102000000BC4E99400000C041020000000000E0400000C04101000000 000088410000C0410200000051AC99410000C041020000000000A84151ACB141 020000000000A8410000A041010000000000A8410000C040010000000000B041 0000C04002000000146BB4410000C040020000000000B84151ACB14002000000 0000B8410000A040020000000000B841AF538E4002000000146BB44100008040 020000000000B041000080400100000000008041000080400100000000008041 00004040020000000000804133ECAB3F020000007A826A410000000002000000 0000504100000000030000000000504100000000000000000000204100004040 02000000000020415DA71C4002000000D8292741FFFFFF3F0200000000003041 000000400100000000005041000000400200000029D658410000004002000000 000060415EA71C40020000000000604100004040010000000000604100008040 0100000000002041000080400300000000002041000040400000000000009841 0000A041020000000000984129D6A8410200000029D690410000B04102000000 000088410000B041010000000000E0400000B041020000005EA7BC400000B041 020000000000A04029D6A841020000000000A0400000A041010000000000A040 0000C04001000000000098410000C04003000000000098410000A04100000000 000040410000104102000000D7293741000010410200000000003041D7291741 0200000000003041000020410100000000003041000090410200000000003041 146B944102000000D72937410000984102000000000040410000984102000000 28D64841000098410200000000005041146B9441020000000000504100009041 0100000000005041000020410200000000005041D72917410200000029D64841 0000104102000000000040410000104103000000000040410000104100000000 00007041000090410200000000007041146B944102000000D729774100009841 02000000000080410000984102000000146B8441000098410200000000008841 146B944102000000000088410000904101000000000088410000204102000000 00008841D729174102000000146B844100001041020000000000804100001041 02000000D7297741000010410200000000007041D72917410200000000007041 0000204103000000000070410000904100000000000000410000104102000000 AF53EE4000001041020000000000E040D7291741020000000000E04000002041 010000000000E04000009041020000000000E040146B944102000000AF53EE40 000098410200000000000041000098410200000028D608410000984102000000 00001041146B9441020000000000104100009041010000000000104100002041 0200000000001041D72917410200000029D60841000010410200000000000041 00001041030000000000004100001041} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object ButtonEditCompact: TButton Align = Right Hint = 'Copy text' Position.X = 461.000000000000000000 Size.Width = 30.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 2 OnClick = MenuItemEditClick object Path11: TPath Align = Center Data.Path = { 1500000000000000000000003333634101000000000000000000904101000000 333373400000904101000000CDCC6C41CDCCDC40010000000000304166664640 0100000000000000333363410100000000000000333363410300000000000000 33336341000000009A998D410000804002000000CDCC90416666664002000000 CDCC904100004040020000009A998D416666264001000000666676419A99993E 0200000000007041CDCCCCBD0200000066666641CDCCCCBD0200000000006041 9A99993E0100000033334341666606400100000000008041CDCCBC4001000000 9A998D4100008040010000009A998D4100008040030000009A998D4100008040} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end end end object PopupMenuActions: TPopupMenu Left = 528 Top = 48 object MenuItemDelete: TMenuItem Text = 'Delete' OnClick = ButtonDeleteClick end object MenuItemEdit: TMenuItem Text = 'Edit' OnClick = MenuItemEditClick end end end ================================================ FILE: ChatGPT.FrameMessage.pas ================================================ unit ChatGPT.FrameMessage; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Memo.Types, FMX.Layouts, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.Generics.Collections, FMX.BehaviorManager, ChatGPT.FrameImage, ChatGPT.Classes, FMX.Menus, OpenAI.Chat, System.JSON; {$SCOPEDENUMS ON} type TFrameMessage = class(TFrame) RectangleBG: TRectangle; LayoutInfo: TLayout; RectangleUser: TRectangle; Path1: TPath; RectangleBot: TRectangle; Path2: TPath; LayoutContent: TLayout; LayoutContentText: TLayout; LayoutAudio: TLayout; RectangleAudio: TRectangle; Path3: TPath; FlowLayoutImages: TFlowLayout; LayoutClient: TLayout; LayoutActions: TLayout; ButtonCopy: TButton; PathCopy: TPath; LayoutCompact: TLayout; ButtonCopyCompact: TButton; Path5: TPath; RectangleAudioCompact: TRectangle; Path6: TPath; ButtonActions: TButton; Path4: TPath; RectangleSystem: TRectangle; Path7: TPath; ButtonDeleteCompact: TButton; Path8: TPath; PopupMenuActions: TPopupMenu; MenuItemDelete: TMenuItem; MenuItemEdit: TMenuItem; RectangleError: TRectangle; Path9: TPath; RectangleFunc: TRectangle; Path10: TPath; LayoutFunc: TLayout; ButtonExecuteFunc: TButton; LabelGPTFunc: TLabel; AniIndicatorFunc: TAniIndicator; LayoutFuncState: TLayout; PathSuccess: TPath; PathError: TPath; PathWait: TPath; ButtonEditCompact: TButton; Path11: TPath; procedure FrameResize(Sender: TObject); procedure ButtonCopyClick(Sender: TObject); procedure ButtonDeleteClick(Sender: TObject); procedure ButtonActionsClick(Sender: TObject); procedure ButtonExecuteFuncClick(Sender: TObject); procedure MenuItemEditClick(Sender: TObject); private FText: string; FIsError: Boolean; FIsAudio: Boolean; FImages: TArray; FId: string; FMode: TWindowMode; FOnDelete: TNotifyEvent; FMessageRole: TMessageKind; FFuncName: string; FFuncArgs: string; FOnFuncExecute: TOnFuncExecute; FFuncState: TMessageFuncState; FOnTextUpdated: TOnTextUpdated; procedure SetText(const Value: string); procedure SetIsError(const Value: Boolean); procedure ParseText(const Value: string); procedure SetIsAudio(const Value: Boolean); procedure BuildContent(Parts: TList); procedure SetImages(const Value: TArray); procedure SetId(const Value: string); procedure FOnTextWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); procedure UpdateMode; procedure CreateCodePart(Part: TPart); procedure CreatePartText(Part: TPart); procedure SetOnDelete(const Value: TNotifyEvent); procedure UpdateMessageRole; procedure SetMessageRole(const Value: TMessageKind); procedure SetFuncArgs(const Value: string); procedure SetFuncName(const Value: string); procedure SetOnFuncExecute(const Value: TOnFuncExecute); procedure AfterExecuteFunc(Result: Boolean; Error: string); procedure SetFuncState(const Value: TMessageFuncState); procedure UpdateBufferText(const Id, Text: string); procedure SetOnTextUpdated(const Value: TOnTextUpdated); public procedure UpdateContentSize; property Id: string read FId write SetId; property Text: string read FText write SetText; property Images: TArray read FImages write SetImages; property IsAudio: Boolean read FIsAudio write SetIsAudio; property IsError: Boolean read FIsError write SetIsError; property MessageRole: TMessageKind read FMessageRole write SetMessageRole; property FuncName: string read FFuncName write SetFuncName; property FuncArgs: string read FFuncArgs write SetFuncArgs; property FuncState: TMessageFuncState read FFuncState write SetFuncState; procedure SetMode(const Value: TWindowMode); procedure StartAnimate; procedure ExecuteFunc; constructor Create(AOwner: TComponent); override; property OnDelete: TNotifyEvent read FOnDelete write SetOnDelete; property OnFuncExecute: TOnFuncExecute read FOnFuncExecute write SetOnFuncExecute; property OnTextUpdated: TOnTextUpdated read FOnTextUpdated write SetOnTextUpdated; function ToJsonObject: TJSONObject; end; const ColorError = $FFEF4444; ColorUser = $FFECECF1; ColorBot = $FFD1D5E3; BGColorUser = $00FFFFFF; BGColorBot = $14FFFFFF; implementation uses System.Math, FMX.Platform, FMX.Memo.Style, FMX.Ani, ChatGPT.FrameCode, ChatGPT.FrameSVG, ChatGPT.FramePlainText, ChatGPT.FrameUIMessage, ChatGPT.TextEditor, ChatGPT.Manager; {$R *.fmx} procedure TFrameMessage.UpdateContentSize; begin //Flow if FlowLayoutImages.Visible then begin var ItemW := Min(256, Max(Trunc(FlowLayoutImages.Width / FlowLayoutImages.ControlsCount), 48)); if ItemW = 48 then ItemW := Trunc(FlowLayoutImages.Width / Trunc(FlowLayoutImages.Width / 48)); var FH: Single := 0; for var Control in FlowLayoutImages.Controls do begin Control.Size.Size := TSizeF.Create(ItemW, ItemW); FH := Max(Control.Position.Y + Control.Height, FH); end; if FlowLayoutImages.Height <> FH then FlowLayoutImages.Height := FH; end; //Frames var H := LayoutClient.Padding.Top + LayoutClient.Padding.Bottom; for var Control in LayoutContentText.Controls do if Control.Visible then H := H + Control.Height + Control.Margins.Top + Control.Margins.Bottom; if LayoutCompact.Visible then H := Ceil(H + LayoutCompact.Height); H := Max(H, 64); if Height <> H then Height := H; end; procedure TFrameMessage.UpdateMode; begin case FMode of TWindowMode.Compact: begin LayoutCompact.Visible := True; LayoutActions.Visible := False; LayoutAudio.Visible := False; end; TWindowMode.Full: begin LayoutCompact.Visible := False; LayoutAudio.Visible := FIsAudio; LayoutActions.Visible := True; end; end; end; procedure TFrameMessage.AfterExecuteFunc(Result: Boolean; Error: string); begin LayoutFuncState.Hint := ''; LayoutFuncState.HitTest := False; if Result then FuncState := TMessageFuncState.Success else begin FuncState := TMessageFuncState.Error; LayoutFuncState.Hint := Error; LayoutFuncState.HitTest := True; end; end; procedure TFrameMessage.ExecuteFunc; begin if Assigned(FOnFuncExecute) then begin FuncState := TMessageFuncState.Executing; FOnFuncExecute(Self, FFuncName, FFuncArgs, AfterExecuteFunc); end; end; procedure TFrameMessage.ButtonExecuteFuncClick(Sender: TObject); begin ExecuteFunc; end; procedure TFrameMessage.ButtonActionsClick(Sender: TObject); begin PopupMenuActions.PopupComponent := ButtonActions; var Pt := Application.MainForm.ClientToScreen(ButtonActions.AbsoluteRect.TopLeft); PopupMenuActions.Popup(Pt.X, Pt.Y + ButtonActions.Height); end; procedure TFrameMessage.ButtonCopyClick(Sender: TObject); begin var ClipBoard: IFMXClipboardService; if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then begin if not Text.IsEmpty then ClipBoard.SetClipboard(Text) else if Length(Images) > 0 then ClipBoard.SetClipboard(string.Join(','#13#10, Images)) else if not FFuncName.IsEmpty then ClipBoard.SetClipboard(FFuncName + #13#10 + FFuncArgs); ShowUIMessage('Coppied'); end else ShowUIMessage('Clipboard error'); end; procedure TFrameMessage.ButtonDeleteClick(Sender: TObject); begin if Assigned(FOnDelete) then FOnDelete(Self); Release; end; constructor TFrameMessage.Create(AOwner: TComponent); begin inherited; Name := ''; LayoutActions.Visible := False; IsAudio := False; FlowLayoutImages.Visible := False; MenuItemEdit.Enabled := False; ButtonEditCompact.Enabled := False; LayoutFunc.Visible := False; end; procedure TFrameMessage.StartAnimate; begin LayoutClient.Margins.Top := 50; LayoutClient.Opacity := 0; TAnimator.AnimateFloat(LayoutClient, 'Margins.Top', 0); TAnimator.AnimateFloat(LayoutClient, 'Opacity', 1); end; function TFrameMessage.ToJsonObject: TJSONObject; begin Result := TJSONObject.Create; try Result.AddPair('id', FId); Result.AddPair('role', FMessageRole.ToString); Result.AddPair('content', FText); if Length(FImages) > 0 then begin var JImages := TJSONArray.Create; for var Img in FImages do JImages.Add(Img); Result.AddPair('images', JImages); end; Result.AddPair('func_name', FFuncName); Result.AddPair('func_args', FFuncArgs); Result.AddPair('func_state', Ord(FFuncState)); except // end; end; procedure TFrameMessage.FOnTextWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin if ssTouch in Shift then begin if ParentControl.ParentControl is TCustomScrollBox then TCustomScrollBox(ParentControl.ParentControl).ViewportPosition := TPointF.Create(TCustomScrollBox(ParentControl.ParentControl).ViewportPosition.X, TCustomScrollBox(ParentControl.ParentControl).ViewportPosition.Y + WheelDelta); end else if ParentControl.ParentControl is TCustomScrollBox then TCustomScrollBox(ParentControl.ParentControl).AniCalculations.MouseWheel(0, -WheelDelta); end; procedure TFrameMessage.FrameResize(Sender: TObject); begin LayoutContent.Width := Min(Width - (LayoutClient.Padding.Left + LayoutClient.Padding.Right), MaxMessageWidth); UpdateContentSize; end; procedure TFrameMessage.UpdateBufferText(const Id, Text: string); begin if Assigned(FOnTextUpdated) then FOnTextUpdated(Self, Id, Text); end; procedure TFrameMessage.MenuItemEditClick(Sender: TObject); begin Manager.OverlayContainer.BringToFront; TFrameTextEditor.Execute(Manager.OverlayContainer, procedure(Frame: TFrameTextEditor) begin Frame.LabelCaption.Text := 'Message edit'; Frame.MemoText.Text := Text; end, procedure(Frame: TFrameTextEditor; Success: Boolean) begin if Success then begin Text := Frame.MemoText.Text; UpdateBufferText(Id, Text); end; end); end; procedure TFrameMessage.SetFuncArgs(const Value: string); begin FFuncArgs := Value; LabelGPTFunc.Hint := 'Arsg: '#13#10 + Value; end; procedure TFrameMessage.SetFuncName(const Value: string); begin FFuncName := Value; LayoutFunc.Visible := not FFuncName.IsEmpty; LabelGPTFunc.Text := Value; end; procedure TFrameMessage.SetFuncState(const Value: TMessageFuncState); begin FFuncState := Value; AniIndicatorFunc.Visible := Value = TMessageFuncState.Executing; AniIndicatorFunc.Enabled := AniIndicatorFunc.Visible; ButtonExecuteFunc.Enabled := Value in [TMessageFuncState.Error, TMessageFuncState.Wait]; PathSuccess.Visible := Value = TMessageFuncState.Success; PathError.Visible := Value = TMessageFuncState.Error; PathWait.Visible := Value = TMessageFuncState.Wait; end; procedure TFrameMessage.SetId(const Value: string); begin FId := Value; end; procedure TFrameMessage.SetImages(const Value: TArray); begin FImages := Value; FlowLayoutImages.BeginUpdate; try while FlowLayoutImages.ControlsCount > 0 do FlowLayoutImages.Controls[0].Free; for var Item in FImages do begin var Frame := TFrameImage.Create(FlowLayoutImages); Frame.Parent := FlowLayoutImages; Frame.Image := Item; end; finally FlowLayoutImages.EndUpdate; end; FlowLayoutImages.Visible := FlowLayoutImages.ControlsCount > 0; UpdateContentSize; end; procedure TFrameMessage.SetIsAudio(const Value: Boolean); begin FIsAudio := Value; LayoutAudio.Visible := FIsAudio; RectangleAudioCompact.Visible := FIsAudio; end; procedure TFrameMessage.SetIsError(const Value: Boolean); begin FIsError := Value; for var Control in LayoutContentText.Controls do if Control is TFrameText then TFrameText(Control).MemoText.FontColor := $FFEF4444; UpdateMessageRole; end; procedure TFrameMessage.SetMessageRole(const Value: TMessageKind); begin FMessageRole := Value; UpdateMessageRole; end; procedure TFrameMessage.SetMode(const Value: TWindowMode); begin FMode := Value; UpdateMode; end; procedure TFrameMessage.SetOnDelete(const Value: TNotifyEvent); begin FOnDelete := Value; end; procedure TFrameMessage.SetOnFuncExecute(const Value: TOnFuncExecute); begin FOnFuncExecute := Value; end; procedure TFrameMessage.SetOnTextUpdated(const Value: TOnTextUpdated); begin FOnTextUpdated := Value; end; procedure TFrameMessage.ParseText(const Value: string); function CreatePart(AType: TPartType; AContent: string): TPart; begin Result.PartType := AType; if (AType = TPartType.Code) and (not (AContent.StartsWith(#13) or AContent.StartsWith(' '))) then begin var Len := AContent.IndexOfAny([#13, #10, ' ']); if Len >= 0 then begin Result.Language := AContent.Substring(0, Len); Result.Content := AContent.Remove(0, Len).Trim([#13, #10, ' ']); end else Result.Content := AContent.Trim([#13, #10, ' ']); end else Result.Content := AContent.Trim([#13, #10, ' ']); end; var Parts: TList; CodePairs: Integer; IsCodeParse: Boolean; Buf: string; begin try if Value.IsEmpty then Exit; Parts := TList.Create; try if Value.StartsWith('{') then try var JSON := TJSONObject.ParseJSONValue(Value); if Assigned(JSON) then try var Part: TPart; Part.PartType := TPartType.Code; Part.Content := Value; Part.Language := 'json'; Parts.Add(Part); Exit; finally JSON.Free; end; except // end; CodePairs := 0; Buf := ''; IsCodeParse := False; for var i := 1 to Value.Length do begin if Value[i] = '`' then begin Inc(CodePairs); Buf := Buf + Value[i]; if CodePairs = 3 then begin if IsCodeParse then begin if not Buf.Trim([' ', '`']).IsEmpty then Parts.Add(CreatePart(TPartType.Code, Buf.Trim(['`']))); IsCodeParse := False; end else begin if not Buf.Trim([' ', '`']).IsEmpty then Parts.Add(CreatePart(TPartType.Text, Buf.Trim([' ', '`']))); IsCodeParse := True; end; CodePairs := 0; Buf := ''; end; end else begin CodePairs := 0; Buf := Buf + Value[i]; end; end; if IsCodeParse then begin if not Buf.Trim([' ', '`']).IsEmpty then Parts.Add(CreatePart(TPartType.Code, Buf.Trim(['`']))); end else begin if not Buf.Trim([' ']).IsEmpty then Parts.Add(CreatePart(TPartType.Text, Buf)); end; finally BuildContent(Parts); Parts.Free; end; finally UpdateContentSize; end; end; procedure TFrameMessage.CreateCodePart(Part: TPart); begin var Frame := TFrameCode.Create(LayoutContentText); Frame.Parent := LayoutContentText; Frame.Fill(Part); Frame.Align := TAlignLayout.None; Frame.Position.Y := 10000; Frame.Align := TAlignLayout.Top; Frame.OnWheel := FOnTextWheel; end; procedure TFrameMessage.UpdateMessageRole; begin RectangleUser.Visible := FMessageRole = TMessageKind.User; RectangleBot.Visible := FMessageRole = TMessageKind.Assistant; RectangleSystem.Visible := FMessageRole = TMessageKind.System; RectangleError.Visible := FMessageRole = TMessageKind.Error; RectangleFunc.Visible := FMessageRole = TMessageKind.Func; if FMessageRole = TMessageKind.Assistant then RectangleBG.Fill.Color := BGColorBot else RectangleBG.Fill.Color := BGColorUser; end; procedure TFrameMessage.CreatePartText(Part: TPart); begin var Frame := TFrameText.Create(LayoutContentText); Frame.Parent := LayoutContentText; Frame.Fill(Part); Frame.Align := TAlignLayout.None; Frame.Position.Y := 10000; Frame.Align := TAlignLayout.Top; Frame.OnWheel := FOnTextWheel; if IsError then Frame.MemoText.FontColor := ColorError else if FMessageRole = TMessageKind.Assistant then Frame.MemoText.FontColor := ColorBot else Frame.MemoText.FontColor := ColorUser; end; procedure TFrameMessage.BuildContent(Parts: TList); begin LayoutContentText.BeginUpdate; try FlowLayoutImages.Parent := nil; LayoutFunc.Parent := nil; while LayoutContentText.ControlsCount > 0 do LayoutContentText.Controls[0].Free; FlowLayoutImages.Parent := LayoutContentText; LayoutFunc.Parent := LayoutContentText; for var Part in Parts do begin //SVG check var PosS := Part.Content.IndexOf('= 0 then begin var PosE := Part.Content.IndexOf(''); if PosE >= 0 then begin var SvgText := Part.Content.Substring(PosS, PosE - PosS + 6); if not SvgText.IsEmpty then try var Frame := TFrameSVG.Create(LayoutContentText, SvgText); Frame.Parent := LayoutContentText; Frame.Align := TAlignLayout.None; Frame.Position.Y := 10000; Frame.Align := TAlignLayout.Top; except // not insert end; end; end; // Code if Part.PartType = TPartType.Code then begin CreateCodePart(Part); Continue; end; // Text if Part.PartType = TPartType.Text then begin CreatePartText(Part); Continue; end; end; finally LayoutContentText.EndUpdate; end; end; procedure TFrameMessage.SetText(const Value: string); begin FText := Value.Trim([' ', #13, #10]); MenuItemEdit.Enabled := not FText.IsEmpty; ButtonEditCompact.Enabled := not FText.IsEmpty; UpdateMode; ParseText(FText); end; end. ================================================ FILE: ChatGPT.FramePlainText.fmx ================================================ object FrameText: TFrameText Size.Width = 575.000000000000000000 Size.Height = 387.000000000000000000 Size.PlatformDefault = False OnResize = FrameResize OnResized = FrameResize object MemoText: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] Caret.Color = x00FFFFFF DataDetectorTypes = [] DisableMouseWheel = True Lines.Strings = ( 'begin' '' 'end.') ReadOnly = True ShowScrollBars = False StyledSettings = [Style] TextSettings.Font.Family = 'Segoe UI, Roboto' TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFECECF1 TextSettings.WordWrap = True Align = Client CanParentFocus = True Cursor = crDefault DisableFocusEffect = True EnableDragHighlight = False Size.Width = 575.000000000000000000 Size.Height = 387.000000000000000000 Size.PlatformDefault = False StyleLookup = 'memostyle_clear' TabOrder = 0 OnApplyStyleLookup = MemoTextApplyStyleLookup OnMouseWheel = MemoTextMouseWheel OnPresentationNameChoosing = MemoTextPresentationNameChoosing Viewport.Width = 565.000000000000000000 Viewport.Height = 387.000000000000000000 end end ================================================ FILE: ChatGPT.FramePlainText.pas ================================================ unit ChatGPT.FramePlainText; interface {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Memo.Types, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Layouts, FMX.Memo.Style, ChatGPT.Classes, FMX.TextLayout, ChatGPT.Code, FMX.RichEdit.Style; type TFrameText = class(TFrame) MemoText: TMemo; procedure FrameResize(Sender: TObject); procedure MemoTextMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); procedure MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string); procedure MemoTextApplyStyleLookup(Sender: TObject); private FOnWheel: TMouseWheelEvent; FStyledMemo: TRichEditStyled; procedure SetOnWheel(const Value: TMouseWheelEvent); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function GetContentHeight: Single; procedure Fill(Data: TPart); property OnWheel: TMouseWheelEvent read FOnWheel write SetOnWheel; end; implementation uses System.Math, System.Net.URLClient; {$R *.fmx} { TFrameText } constructor TFrameText.Create(AOwner: TComponent); begin inherited; Name := ''; MemoText.DisableDisappear := True; {$IFDEF MOBILE} MemoText.HitTest := False; {$ENDIF} MemoText.TextSettings.VertAlign := TTextAlign.Center; MemoText.TextSettings.WordWrap := True; end; destructor TFrameText.Destroy; begin inherited; end; procedure TFrameText.Fill(Data: TPart); begin FStyledMemo := (MemoText.Presentation as TRichEditStyled); MemoText.ApplyStyleLookup; MemoText.Text := Data.Content; FrameResize(nil); end; procedure TFrameText.FrameResize(Sender: TObject); begin var H := GetContentHeight; if H <> Height then Height := H; end; function TFrameText.GetContentHeight: Single; begin if Assigned(FStyledMemo) then FStyledMemo.RecalcSize; var ContentH := MemoText.ContentBounds.Height; if (ContentH + 5) < 30 then MemoText.Margins.Top := 25 - ContentH else MemoText.Margins.Top := 0; Result := Max(ContentH + 5, 30) + MemoText.Margins.Top + MemoText.Margins.Bottom; end; procedure TFrameText.MemoTextApplyStyleLookup(Sender: TObject); begin FStyledMemo.SetCodeSyntaxName('md', MemoText.Font, MemoText.FontColor); FStyledMemo.SelectedTextColor := TAlphaColorRec.White; FStyledMemo.RoundedSelection := True; FStyledMemo.UseSelectedTextColor := True; FrameResize(nil); end; procedure TFrameText.MemoTextMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin if (MemoText.SelLength > 0) and (Root.Captured = IControl(FStyledMemo)) then begin Handled := True; if Assigned(FOnWheel) then FOnWheel(Sender, Shift, WheelDelta, Handled); end; end; procedure TFrameText.MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string); begin PresenterName := 'RichEditStyled'; end; procedure TFrameText.SetOnWheel(const Value: TMouseWheelEvent); begin FOnWheel := Value; end; end. ================================================ FILE: ChatGPT.FrameSVG.fmx ================================================ object FrameSVG: TFrameSVG Size.Width = 654.000000000000000000 Size.Height = 150.000000000000000000 Size.PlatformDefault = False object SvgImage: TSkSvg Align = Left Size.Width = 150.000000000000000000 Size.Height = 150.000000000000000000 Size.PlatformDefault = False end end ================================================ FILE: ChatGPT.FrameSVG.pas ================================================ unit ChatGPT.FrameSVG; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, System.Skia, FMX.Skia; type TFrameSVG = class(TFrame) SvgImage: TSkSvg; private { Private declarations } public constructor Create(AOwner: TComponent; SvgData: string); reintroduce; end; implementation {$R *.fmx} { TFrameSVG } constructor TFrameSVG.Create(AOwner: TComponent; SvgData: string); begin inherited Create(AOwner); Name := ''; SvgImage.Svg.Source := SvgData; end; end. ================================================ FILE: ChatGPT.FrameUIMessage.fmx ================================================ object FrameUIMessage: TFrameUIMessage Align = Contents HitTest = False Size.Width = 754.000000000000000000 Size.Height = 460.000000000000000000 Size.PlatformDefault = False object LayoutContent: TLayout Align = Bottom Position.Y = 376.000000000000000000 Size.Width = 754.000000000000000000 Size.Height = 84.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleBG: TRectangle Align = Center Fill.Color = xA0000000 Size.Width = 101.000000000000000000 Size.Height = 34.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 object LabelText: TLabel Align = Center AutoSize = True StyledSettings = [Family, Style] Size.Width = 57.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 15.000000000000000000 TextSettings.FontColor = claWhite TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Coppied' TabOrder = 0 OnResize = LabelTextResize OnResized = LabelTextResize end end end object TimerClose: TTimer Interval = 3000 OnTimer = TimerCloseTimer Left = 280 Top = 176 end end ================================================ FILE: ChatGPT.FrameUIMessage.pas ================================================ unit ChatGPT.FrameUIMessage; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts, FMX.Objects, FMX.Controls.Presentation; type TFrameUIMessage = class(TFrame) LayoutContent: TLayout; RectangleBG: TRectangle; LabelText: TLabel; TimerClose: TTimer; procedure LabelTextResize(Sender: TObject); procedure TimerCloseTimer(Sender: TObject); private { Private declarations } public constructor Create(AOwner: TComponent); override; end; procedure ShowUIMessage(const Text: string); implementation {$R *.fmx} procedure ShowUIMessage(const Text: string); begin with TFrameUIMessage.Create(Application) do begin LabelText.Text := Text; Align := TAlignLayout.Client; Parent := Application.MainForm; BringToFront; end; end; constructor TFrameUIMessage.Create(AOwner: TComponent); begin inherited; Name := ''; end; procedure TFrameUIMessage.LabelTextResize(Sender: TObject); begin RectangleBG.Width := LabelText.Width + 20; end; procedure TFrameUIMessage.TimerCloseTimer(Sender: TObject); begin Release; end; end. ================================================ FILE: ChatGPT.Functions.External.Intf.pas ================================================ unit ChatGPT.Functions.external.Intf; interface type IChatFunctionExternal = interface ['{B2DACD74-B773-44C2-838D-43BF99CB5405}'] function GetDescription: WideString; //Example: 'Get the current weather in a given location' function GetName: WideString; //Example: 'get_current_weather' function GetParameters: WideString; //JSON Scheme function Execute(const Args: WideString): WideString; //Args - json with params, result - json with info end; implementation end. ================================================ FILE: ChatGPT.Functions.External.pas ================================================ unit ChatGPT.Functions.external; interface uses System.Classes, OpenAI.Chat.Functions, ChatGPT.Functions.external.Intf; type TChatFunctionExternal = class(TChatFunction, IChatFunction) private FFuncRef: IChatFunctionExternal; protected function GetDescription: string; override; function GetName: string; override; function GetParameters: string; override; public constructor Create(const Func: IChatFunctionExternal); reintroduce; destructor Destroy; override; function Execute(const Args: string): string; override; end; implementation { TChatFunctionExternal } constructor TChatFunctionExternal.Create(const Func: IChatFunctionExternal); begin inherited Create; FFuncRef := Func; end; destructor TChatFunctionExternal.Destroy; begin FFuncRef := nil; inherited; end; function TChatFunctionExternal.Execute(const Args: string): string; begin Result := FFuncRef.Execute(Args); end; function TChatFunctionExternal.GetDescription: string; begin Result := FFuncRef.GetDescription; end; function TChatFunctionExternal.GetName: string; begin Result := FFuncRef.GetName; end; function TChatFunctionExternal.GetParameters: string; begin Result := FFuncRef.GetParameters; end; end. ================================================ FILE: ChatGPT.Functions.pas ================================================ unit ChatGPT.Functions; interface uses {$IFDEF MSWINDOWS} Winapi.Windows, {$ENDIF} System.SysUtils, System.Generics.Collections, OpenAI.Chat.Functions, ChatGPT.Functions.external, ChatGPT.Functions.external.Intf; const LibExtMask = {$IFDEF MSWINDOWS} '*.dll'; {$ENDIF} {$IFDEF LINUX} '*.so'; {$ENDIF} {$IF DEFINED(MACOS) OR DEFINED(IOS) OR DEFINED(IOS64)} '*.o'; {$ENDIF} {$IFDEF ANDROID} '*.so'; {$ENDIF} type TGPTFunctionsFunc = function: TArray; function LoadExternalFunctions: TArray; var FLoadedLibs: TList; implementation uses System.IOUtils; function LoadExternalFunctions: TArray; begin if TDirectory.Exists('funcs') then begin for var Lib in TDirectory.GetFiles('funcs', LibExtMask) do try var LibHandle := LoadLibrary(PChar(Lib)); try var Func: TGPTFunctionsFunc := GetProcAddress(LibHandle, 'gptfunctions'); if @Func <> nil then begin for var Item in Func() do begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := TChatFunctionExternal.Create(Item); end; FLoadedLibs.Add(LibHandle); end; except FreeLibrary(LibHandle); end; except // end; end; end; initialization FLoadedLibs := TList.Create; finalization for var Lib in FLoadedLibs do FreeLibrary(Lib); FLoadedLibs.Free; end. ================================================ FILE: ChatGPT.ImportExport.fmx ================================================ inherited FrameImportExport: TFrameImportExport Size.Width = 772.000000000000000000 Size.Height = 703.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 772.000000000000000000 Size.Height = 703.000000000000000000 OnClick = RectangleBGClick end object LayoutClient: TLayout Align = Center Padding.Left = 10.000000000000000000 Padding.Top = 10.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 440.000000000000000000 Size.Height = 589.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 440.000000000000000000 Size.Height = 589.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object LayoutActions: TLayout Align = Bottom Position.X = 10.000000000000000000 Position.Y = 533.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonOk: TButton Align = Right Position.X = 260.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'OK' TextSettings.Trimming = None OnClick = ButtonOkClick end object ButtonCancel: TButton Align = Right Cancel = True Position.X = 340.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 1 Text = 'CANCEL' TextSettings.Trimming = None OnClick = ButtonCancelClick end end object LabelCaption: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Import && Export' TabOrder = 44 end object VertScrollBox: TVertScrollBox Align = Client Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Margins.Right = -10.000000000000000000 Size.Width = 430.000000000000000000 Size.Height = 493.000000000000000000 Size.PlatformDefault = False TabOrder = 21 Viewport.Width = 430.000000000000000000 Viewport.Height = 493.000000000000000000 object Layout1: TLayout Align = Top Margins.Left = 10.000000000000000000 Margins.Top = 20.000000000000000000 Margins.Right = 10.000000000000000000 Margins.Bottom = 20.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 400.000000000000000000 Size.Height = 456.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RadioButtonImport: TRadioButton Align = Top StyledSettings = [Family, Style, FontColor] Margins.Top = 10.000000000000000000 Position.Y = 163.000000000000000000 Size.Width = 400.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False StyleLookup = 'radiobuttonstyle_md' TabOrder = 2 Text = 'Import' TextSettings.Font.Size = 14.000000000000000000 OnChange = RadioButtonExportChange end object RadioButtonExport: TRadioButton Align = Top StyledSettings = [Family, Style, FontColor] IsChecked = True Margins.Top = 10.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 400.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False StyleLookup = 'radiobuttonstyle_md' TabOrder = 0 Text = 'Export' TextSettings.Font.Size = 14.000000000000000000 OnChange = RadioButtonExportChange end object LayoutExport: TLayout Align = Top Margins.Left = 10.000000000000000000 Margins.Right = 10.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 29.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 124.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object Label17: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 90.000000000000000000 Size.Width = 370.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = '*.txt, *.json' TabOrder = 8 TabStop = False end object EditExport: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 0 Position.Y = 47.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButtonExport: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow TextSettings.Trimming = None Hint = 'Clear' Position.X = 28.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 1 Text = 'buttonstyle_clearmini' object Path2: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object EditButtonExportFile: TEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow TextSettings.Trimming = None Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'editbuttonstyle' TabOrder = 0 Text = 'editbuttonstyle' OnClick = EditButtonExportFileClick object Path1: TPath Align = Center Data.Path = { 2F0000000000000066260F446626874301000000CC4CEE436626E74302000000 9A99EB439A99EC4302000000CD0CE6430000F04302000000CD8CDF430000F043 01000000000080420000F043020000003433E5410000F0430200000000000000 85ABE14302000000000000000000D04301000000000000000000C04202000000 00000000D7A37242020000003333E54100000042020000000000804200000042 0100000000803543000000420200000052784643000000420200000000C05643 CFF71A42020000008FC2624300004B420100000033F389430000C04201000000 0000D0430000C04202000000CDACE1430000C042020000000000F043EC51F942 020000000000F04300002043010000000000F04300004043010000000000D843 00004043010000000000D84300002043020000000000D8430E2D174302000000 3769D44300001043020000000000D04300001043010000000000804300001043 01000000CDCC40434861A94202000000CDCC3D43EC51A34202000000CDCC3943 0000A04202000000008035430000A04201000000000080420000A04202000000 52B85C420000A0420200000000004042295CAE4202000000000040420000C042 01000000000040420000C04301000000EC51EE4233B37143020000003333F942 CDCC66430200000033B307430000604302000000CDCC13430000604301000000 000008440000604302000000CDEC0D440000604302000000CDCC114400007943 0200000066260F44662687430300000066260F4466268743} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label9: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'File name' TabOrder = 30 TabStop = False end end object LayoutImport: TLayout Align = Top Margins.Left = 10.000000000000000000 Margins.Right = 10.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 182.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 147.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object Label1: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 90.000000000000000000 Size.Width = 370.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = '*.json' TabOrder = 8 TabStop = False end object EditImport: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 0 Position.Y = 47.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButtonImport: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow TextSettings.Trimming = None Hint = 'Clear' Position.X = 28.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 1 Text = 'buttonstyle_clearmini' object Path3: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end object EditButtonImportFile: TEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow TextSettings.Trimming = None Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'editbuttonstyle' TabOrder = 0 Text = 'editbuttonstyle' OnClick = EditButtonImportFileClick object Path4: TPath Align = Center Data.Path = { 2F0000000000000066260F446626874301000000CC4CEE436626E74302000000 9A99EB439A99EC4302000000CD0CE6430000F04302000000CD8CDF430000F043 01000000000080420000F043020000003433E5410000F0430200000000000000 85ABE14302000000000000000000D04301000000000000000000C04202000000 00000000D7A37242020000003333E54100000042020000000000804200000042 0100000000803543000000420200000052784643000000420200000000C05643 CFF71A42020000008FC2624300004B420100000033F389430000C04201000000 0000D0430000C04202000000CDACE1430000C042020000000000F043EC51F942 020000000000F04300002043010000000000F04300004043010000000000D843 00004043010000000000D84300002043020000000000D8430E2D174302000000 3769D44300001043020000000000D04300001043010000000000804300001043 01000000CDCC40434861A94202000000CDCC3D43EC51A34202000000CDCC3943 0000A04202000000008035430000A04201000000000080420000A04202000000 52B85C420000A0420200000000004042295CAE4202000000000040420000C042 01000000000040420000C04301000000EC51EE4233B37143020000003333F942 CDCC66430200000033B307430000604302000000CDCC13430000604301000000 000008440000604302000000CDEC0D440000604302000000CDCC114400007943 0200000066260F44662687430300000066260F4466268743} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label2: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 380.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'File name' TabOrder = 29 TabStop = False end object Label3: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 120.000000000000000000 Size.Width = 370.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'The current chat data will not be deleted, but will be supplemen' + 'ted' TabOrder = 10 TabStop = False end end end end end object SaveDialogExport: TSaveDialog DefaultExt = '.json' Filter = 'JSON|*.json|Text|*.txt' Left = 664 Top = 176 end object OpenDialogImport: TOpenDialog DefaultExt = '.json' Filter = 'JSON|*.json' Left = 664 Top = 328 end end ================================================ FILE: ChatGPT.ImportExport.pas ================================================ unit ChatGPT.ImportExport; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Objects, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.Layouts, ChatGPT.Classes, FMX.Edit; type TFrameImportExport = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; LayoutActions: TLayout; ButtonOk: TButton; LabelCaption: TLabel; ButtonCancel: TButton; RadioButtonImport: TRadioButton; RadioButtonExport: TRadioButton; Layout1: TLayout; VertScrollBox: TVertScrollBox; LayoutExport: TLayout; Label17: TLabel; EditExport: TEdit; ClearEditButtonExport: TClearEditButton; Path2: TPath; Label9: TLabel; EditButtonExportFile: TEditButton; Path1: TPath; LayoutImport: TLayout; Label1: TLabel; EditImport: TEdit; ClearEditButtonImport: TClearEditButton; Path3: TPath; EditButtonImportFile: TEditButton; Path4: TPath; Label2: TLabel; SaveDialogExport: TSaveDialog; OpenDialogImport: TOpenDialog; Label3: TLabel; procedure FrameResize(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure ButtonOkClick(Sender: TObject); procedure RadioButtonExportChange(Sender: TObject); procedure EditButtonExportFileClick(Sender: TObject); procedure EditButtonImportFileClick(Sender: TObject); procedure RectangleBGClick(Sender: TObject); private FLayoutClientWidth, FLayoutClientHeight: Single; FProcCallback: TProc; protected procedure SetMode(const Value: TWindowMode); override; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); end; var FrameImportExport: TFrameImportExport; implementation uses System.Math; {$R *.fmx} { TFrameImportExport } procedure TFrameImportExport.ButtonCancelClick(Sender: TObject); begin Cancel; end; procedure TFrameImportExport.ButtonOkClick(Sender: TObject); begin if Assigned(FProcCallback) then FProcCallback(Self, True); Release; end; procedure TFrameImportExport.Cancel; begin if Assigned(FProcCallback) then FProcCallback(Self, False); Release; end; constructor TFrameImportExport.Create(AOwner: TComponent); begin inherited; Name := ''; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; RadioButtonExportChange(nil); end; procedure TFrameImportExport.EditButtonExportFileClick(Sender: TObject); begin if SaveDialogExport.Execute then begin EditExport.Text := SaveDialogExport.FileName; RadioButtonExport.IsChecked := True; end; end; procedure TFrameImportExport.EditButtonImportFileClick(Sender: TObject); begin if OpenDialogImport.Execute then begin EditImport.Text := OpenDialogImport.FileName; RadioButtonImport.IsChecked := True; end; end; class procedure TFrameImportExport.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); begin var Frame := TFrameImportExport.Create(AParent); Frame.Parent := AParent; Frame.FProcCallback := ProcExecuted; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; if Assigned(ProcSet) then ProcSet(Frame); Frame.ButtonCancel.SetFocus; end; procedure TFrameImportExport.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameImportExport.RadioButtonExportChange(Sender: TObject); begin LayoutExport.Enabled := RadioButtonExport.IsChecked; LayoutImport.Enabled := RadioButtonImport.IsChecked; end; procedure TFrameImportExport.RectangleBGClick(Sender: TObject); begin Cancel; end; procedure TFrameImportExport.SetMode(const Value: TWindowMode); begin inherited; if Mode = TWindowMode.Compact then begin LayoutClient.Align := TAlignLayout.Client; RectangleFrame.Corners := []; end else begin LayoutClient.Align := TAlignLayout.Center; RectangleFrame.Corners := AllCorners; end; FrameResize(nil); end; end. ================================================ FILE: ChatGPT.LoadedFunctions.fmx ================================================ inherited FrameLoadedFunctions: TFrameLoadedFunctions Size.Width = 1035.000000000000000000 Size.Height = 811.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 1035.000000000000000000 Size.Height = 811.000000000000000000 OnClick = RectangleBGClick end object LayoutClient: TLayout Align = Center Padding.Left = 10.000000000000000000 Padding.Top = 10.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 440.000000000000000000 Size.Height = 566.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 440.000000000000000000 Size.Height = 566.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object Layout2: TLayout Align = Bottom Position.X = 10.000000000000000000 Position.Y = 510.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonOk: TButton Align = Right Cancel = True Position.X = 340.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 2 Text = 'OK' TextSettings.Trimming = None OnClick = ButtonOkClick end end object Label1: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Loaded functions' TabOrder = 41 end object Label20: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 5.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 15.000000000000000000 Position.Y = 45.000000000000000000 Size.Width = 410.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'To load third-party functions, you must place the dynamic librar' + 'y in the "funcs" folder next to the program'#39's executable file' TabOrder = 5 TabStop = False end object Rectangle1: TRectangle Align = Client Fill.Color = x78000000 Margins.Left = 6.000000000000000000 Margins.Top = 6.000000000000000000 Margins.Right = 6.000000000000000000 Margins.Bottom = 6.000000000000000000 Size.Width = 408.000000000000000000 Size.Height = 419.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 object ListBoxItems: TListBox Align = Client Margins.Left = 4.000000000000000000 Margins.Top = 4.000000000000000000 Margins.Right = 4.000000000000000000 Margins.Bottom = 4.000000000000000000 Size.Width = 400.000000000000000000 Size.Height = 411.000000000000000000 Size.PlatformDefault = False StyleLookup = 'transparentlistboxstyle' TabOrder = 0 DisableFocusEffect = True ItemHeight = 50.000000000000000000 DefaultItemStyles.ItemStyle = 'listboxitemstyle_func' DefaultItemStyles.GroupHeaderStyle = '' DefaultItemStyles.GroupFooterStyle = '' Viewport.Width = 400.000000000000000000 Viewport.Height = 411.000000000000000000 end end object LabelEmpty: TLabel Align = Center AutoSize = True StyledSettings = [Family, Size, Style] Size.Width = 66.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False TextSettings.FontColor = xFF6C6C6C TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'List is empty' TabOrder = 3 end end end ================================================ FILE: ChatGPT.LoadedFunctions.pas ================================================ unit ChatGPT.LoadedFunctions; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Objects, FMX.Controls.Presentation, FMX.Layouts, FMX.ListBox; type TFrameLoadedFunctions = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; Layout2: TLayout; ButtonOk: TButton; ListBoxItems: TListBox; LabelEmpty: TLabel; Label1: TLabel; Label20: TLabel; Rectangle1: TRectangle; procedure FrameResize(Sender: TObject); procedure ButtonOkClick(Sender: TObject); procedure RectangleBGClick(Sender: TObject); private FLayoutClientWidth, FLayoutClientHeight: Single; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl); end; var FrameLoadedFunctions: TFrameLoadedFunctions; implementation uses System.Math, ChatGPT.Manager; {$R *.fmx} procedure TFrameLoadedFunctions.ButtonOkClick(Sender: TObject); begin Cancel; end; procedure TFrameLoadedFunctions.Cancel; begin Release; end; constructor TFrameLoadedFunctions.Create(AOwner: TComponent); begin inherited; Name := ''; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; for var Item in Manager.GPTFuncList do begin var ListItem := TListBoxItem.Create(ListBoxItems); ListItem.Text := Item.GetDescription; ListItem.ItemData.Detail := Item.GetName; ListBoxItems.AddObject(ListItem); end; LabelEmpty.Visible := ListBoxItems.Count <= 0; end; class procedure TFrameLoadedFunctions.Execute(AParent: TControl); begin var Frame := TFrameLoadedFunctions.Create(AParent); Frame.Parent := AParent; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; end; procedure TFrameLoadedFunctions.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameLoadedFunctions.RectangleBGClick(Sender: TObject); begin Cancel; end; end. ================================================ FILE: ChatGPT.Main.fmx ================================================ object FormMain: TFormMain Left = 0 Top = 0 Caption = 'ChatGPT' ClientHeight = 686 ClientWidth = 1053 Fill.Color = xFF202123 Fill.Kind = Solid Quality = HighQuality SystemStatusBar.BackgroundColor = xFF202123 StyleBook = StyleBook Constraints.MinHeight = 400.000000000000000000 Constraints.MinWidth = 400.000000000000000000 FormFactor.Width = 320 FormFactor.Height = 480 FormFactor.Orientations = [Portrait, Landscape, InvertedPortrait, InvertedLandscape] FormFactor.Devices = [Desktop, iPhone, iPad] ShowFullScreenIcon = True OnCreate = FormCreate OnCloseQuery = FormCloseQuery OnResize = FormResize OnConstrainedResize = FormConstrainedResize OnVirtualKeyboardShown = FormVirtualKeyboardShown OnVirtualKeyboardHidden = FormVirtualKeyboardHidden Touch.GestureManager = GestureManager OnGesture = FormGesture OnSaveState = FormSaveState DesignerMasterStyle = 0 object LayoutChats: TLayout Align = Client Size.Width = 783.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object Rectangle1: TRectangle Align = Contents Fill.Color = xFF343541 Locked = True Size.Width = 783.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None end object LayoutHead: TLayout Align = Top Size.Width = 783.000000000000000000 Size.Height = 43.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object Line2: TLine Align = Contents LineType = Bottom Size.Width = 783.000000000000000000 Size.Height = 43.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF50505D end object ButtonMenu: TButton Align = Left Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 2 Size.Width = 43.000000000000000000 Size.Height = 43.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_primary' TabOrder = 1 OnClick = ButtonMenuClick end object ButtonNewChatCompact: TButton Align = Right Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 0 Position.X = 740.000000000000000000 Size.Width = 43.000000000000000000 Size.Height = 43.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_primary' TabOrder = 0 OnClick = ButtonNewChatCompactClick end object LabelChatName: TLabel Align = Client StyledSettings = [Family, Style] Size.Width = 697.000000000000000000 Size.Height = 43.000000000000000000 Size.PlatformDefault = False StyleLookup = 'LabelChatNameStyle1' TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFD9D9E3 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Select chat' TabOrder = 2 end end object LayoutChatsBox: TLayout Align = Client Size.Width = 783.000000000000000000 Size.Height = 643.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end end object StyleBook: TStyleBook Styles = < item ResourcesBin = { 464D585F5354594C4520322E35010613627574746F6E7374796C655F6E657763 686174034D0506106C697374626F786974656D7374796C6503511506166C6973 74626F786974656D7374796C655F6D6F64656C039B0B06156C697374626F7869 74656D7374796C655F6368617403691306106D656D6F7374796C655F6E6F726D 616C03E907060F65646974627574746F6E7374796C65034B0306126C69737462 6F787374796C655F636C65617203EE050613627574746F6E7374796C655F7072 696D617279032A02060F656469747374796C655F636C65617203D40406157363 726F6C6C626172626F74746F6D627574746F6E03700206147363726F6C6C6261 7268747261636B7374796C6503260106137363726F6C6C6261726C6566746275 74746F6E037A0206147363726F6C6C6261727269676874627574746F6E036F02 060E7363726F6C6C6261727374796C6503D90206127363726F6C6C626172746F 70627574746F6E03790206147363726F6C6C62617276747261636B7374796C65 0343010619736D616C6C7363726F6C6C62617268747261636B7374796C6503AD 010613736D616C6C7363726F6C6C6261727374796C650349020619736D616C6C 7363726F6C6C62617276747261636B7374796C6503AD01060A7468756D627374 796C65031502060A747261636B7374796C65030C02060E7363726F6C6C626F78 7374796C6503CF070610627574746F6E7374796C655F6D656E75033405061362 7574746F6E7374796C655F636F6E6669726D033703060E6D656D6F7374796C65 5F636F6465039C060611627574746F6E7374796C655F636C656172024E060D74 7261636B6261727374796C65030D07060D7468756D626261727374796C650337 010613627574746F6E7374796C655F77656C636F6D650313040613627574746F 6E7374796C655F6578656375746503C206060B636F6D626F5F7374796C6503E9 06060D64726F70646F776E70616E656C03AD00060C706F706F7665727374796C 65033E02060C6C697374626F787374796C65031E07060D6D656E756974656D73 74796C6503C70E06146D656E756974656D7374796C655F627574746F6E03DA09 060D6D656E75766965777374796C65038D0206126D656E75736570617261746F 727374796C6503920006176C65667473656C656374696F6E706F696E74737479 6C6503C5010618726967687473656C656374696F6E706F696E747374796C6503 9B010611627574746F6E5F7363726F6C6C646F776E038F04060B737769746368 7374796C65033E01061A627574746F6E7374796C655F636C6561726D696E695F 6C656674035B03061B627574746F6E7374796C655F636C6561726D696E695F72 69676874035E03060F6D656D6F7374796C655F636C6561720399050610627574 746F6E7374796C655F69636F6E033C030617627574746F6E7374796C655F6D65 6E75627574746F6E7303BB020611627574746F6E7374796C655F726574727903 24090611616E69696E64696361746F727374796C6503870B06156C697374626F 786974656D7374796C655F66756E6303AC1706177472616E73706172656E746C 697374626F787374796C65033D070614627574746F6E7374796C655F636F6E74 696E7565030607060B627574746F6E7374796C6503C0040619627574746F6E73 74796C655F696D706F72745F6578706F727403B0060613726164696F62757474 6F6E7374796C655F6D64036C050615627574746F6E7374796C655F636C656172 6D696E69035103060F6261636B67726F756E647374796C6503AF000054504630 07544C61796F757400095374796C654E616D650613627574746F6E7374796C65 5F6E65776368617405416C69676E070643656E7465720C50616464696E672E4C 6566740500000000000000C002400B50616464696E672E546F70050000000000 0000C002400D50616464696E672E52696768740500000000000000C002400E50 616464696E672E426F74746F6D0500000000000000C002400A53697A652E5769 6474680500000000000000F406400B53697A652E486569676874050000000000 0000B804401453697A652E506C6174666F726D44656661756C74080756697369 626C6508085461624F726465720214000A5452656374616E676C650009537479 6C654E616D65060F52656374616E676C65315374796C6505416C69676E070843 6F6E74656E74730A46696C6C2E436F6C6F720709783030464646464646074869 7454657374080A53697A652E57696474680500000000000000F406400B53697A 652E4865696768740500000000000000B804401453697A652E506C6174666F72 6D44656661756C74080C5374726F6B652E436F6C6F7207097833334646464646 4607585261646975730500000000000000C00140075952616469757305000000 00000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E 616D650614436F6C6F72416E696D6174696F6E315374796C6508447572617469 6F6E050000000000CDCCCCFD3F0C50726F70657274794E616D65060A46696C6C 2E436F6C6F720A537461727456616C756507097830304646464646460953746F 7056616C756507097831394646464646460754726967676572061049734D6F75 73654F7665723D747275650E54726967676572496E7665727365061149734D6F 7573654F7665723D66616C73650000000654476C79706800095374796C654E61 6D65060A676C7970687374796C650B4D617267696E732E546F70050000000000 000080FFBF0D4D617267696E732E52696768740500000000000000C002400E4D 617267696E732E426F74746F6D050000000000000080FFBF05416C69676E0704 4C6566740A506F736974696F6E2E580500000000000000C002400A506F736974 696F6E2E590500000000000000B002400A53697A652E57696474680500000000 000000C003400B53697A652E4865696768740500000000000000C00340145369 7A652E506C6174666F726D44656661756C74080A496D616765496E6465780200 000E5446696C6C52474245666665637400095374796C654E616D65061346696C 6C524742456666656374315374796C6505436F6C6F7207097846464439443945 330000001654427574746F6E5374796C65546578744F626A6563740009537479 6C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B65 64090A53697A652E57696474680500000000000000DC06400B53697A652E4865 696768740500000000000000B003401453697A652E506C6174666F726D446566 61756C7408165465787453657474696E67732E466F6E742E53697A6505000000 00000000E00240165465787453657474696E67732E466F6E74436F6C6F720708 636C615768697465155465787453657474696E67732E5472696D6D696E670709 436861726163746572155465787453657474696E67732E576F72645772617008 165465787453657474696E67732E486F727A416C69676E07074C656164696E67 0D536861646F7756697369626C650808486F74436F6C6F720708636C61576869 74650C466F6375736564436F6C6F720708636C6157686974650B4E6F726D616C 436F6C6F720708636C6157686974650C50726573736564436F6C6F720708636C 6157686974650000005450463007544C61796F757400095374796C654E616D65 06106C697374626F786974656D7374796C6505416C69676E070643656E746572 0A53697A652E57696474680500000000000000BB07400B53697A652E48656967 687405000000000000009004401453697A652E506C6174666F726D4465666175 6C74080756697369626C6508085461624F7264657202190B4669786564486569 676874021E000A5452656374616E676C6500095374796C654E616D65060F6261 636B67726F756E645F6F76657205416C69676E0708436F6E74656E74730A4669 6C6C2E436F6C6F7207097830303437383646460748697454657374080A53697A 652E57696474680500000000000000BB07400B53697A652E4865696768740500 0000000000009004401453697A652E506C6174666F726D44656661756C74080C 5374726F6B652E436F6C6F720709783030343738364646000F54436F6C6F7241 6E696D6174696F6E00095374796C654E616D6506046F76657208447572617469 6F6E05000000000000000000000C50726F70657274794E616D65060A46696C6C 2E436F6C6F720A537461727456616C756507097830303639364136440953746F 7056616C756507097842343639364136440754726967676572060F497353656C 65637465643D747275650E54726967676572496E76657273650610497353656C 65637465643D66616C73650000000654476C79706800095374796C654E616D65 060A676C7970687374796C650C4D617267696E732E4C65667405000000000000 008000400B4D617267696E732E546F70050000000000000080FF3F0D4D617267 696E732E526967687405000000000000008000400E4D617267696E732E426F74 746F6D050000000000000080FF3F05416C69676E07044C6566740A506F736974 696F6E2E5805000000000000008000400A506F736974696F6E2E590500000000 00000080FF3F0A53697A652E576964746805000000000000008003400B53697A 652E48656967687405000000000000008804401453697A652E506C6174666F72 6D44656661756C7408000016544163746976655374796C65546578744F626A65 637400095374796C654E616D6506047465787405416C69676E0706436C69656E 740C4D617267696E732E4C6566740500000000000000C000400B4D617267696E 732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500 000000000000C000400E4D617267696E732E426F74746F6D0500000000000000 80FF3F0A53697A652E57696474680500000000000000B807400B53697A652E48 656967687405000000000000008804401453697A652E506C6174666F726D4465 6661756C7408165465787453657474696E67732E466F6E742E53697A65050000 0000000000800340165465787453657474696E67732E466F6E74436F6C6F7207 09783936464646464646155465787453657474696E67732E576F726457726170 08165465787453657474696E67732E486F727A416C69676E07074C656164696E 670D536861646F7756697369626C65080D416374697665547269676765720708 53656C65637465640B416374697665436F6C6F720708636C6157686974650000 0954436865636B426F7800095374796C654E616D650605636865636B05416C69 676E07044C6566740843616E466F637573081244697361626C65466F63757345 6666656374090C4D617267696E732E4C65667405000000000000008001400A50 6F736974696F6E2E5805000000000000008001400A53697A652E576964746805 00000000000000A003400B53697A652E48656967687405000000000000009004 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 000007544C61796F757400095374796C654E616D65060D6163636573736F7279 6D6F726505416C69676E07094D6F737452696768740A53697A652E5769647468 0500000000000000B003400B53697A652E4865696768740500000000000000B0 04401453697A652E506C6174666F726D44656661756C74080756697369626C65 080012544163746976655374796C654F626A6563740005416C69676E07064365 6E7465720C536F757263654C6F6F6B7570061A57696E646F7773203130204D6F 6465726E7374796C652E706E670A53697A652E57696474680500000000000000 C002400B53697A652E48656967687405000000000000008003401453697A652E 506C6174666F726D44656661756C740808577261704D6F6465070643656E7465 720D41637469766554726967676572070853656C65637465640A416374697665 4C696E6B0E010F536F75726365526563742E4C65667405000000000000008B06 400E536F75726365526563742E546F700500000000000000D4054010536F7572 6365526563742E5269676874050000000000000097064011536F757263655265 63742E426F74746F6D0500000000000000F405400001055363616C6505000000 00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000D0 06400E536F75726365526563742E546F7005000000000000009F064010536F75 726365526563742E52696768740500000000000000E2064011536F7572636552 6563742E426F74746F6D0500000000000000B706400001055363616C65050000 00000000008000400F536F75726365526563742E4C6566740500000000000000 8B07400E536F75726365526563742E546F700500000000000000D4064010536F 75726365526563742E5269676874050000000000000097074011536F75726365 526563742E426F74746F6D0500000000000000F406400001055363616C650500 000000000000C000400F536F75726365526563742E4C65667405000000000000 80D007400E536F75726365526563742E546F7005000000000000009F07401053 6F75726365526563742E52696768740500000000000080E2074011536F757263 65526563742E426F74746F6D0500000000000000B7074000000A536F75726365 4C696E6B0E010F536F75726365526563742E4C65667405000000000000008B06 400E536F75726365526563742E546F700500000000000000D4054010536F7572 6365526563742E5269676874050000000000000097064011536F757263655265 63742E426F74746F6D0500000000000000F405400001055363616C6505000000 00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000D0 06400E536F75726365526563742E546F7005000000000000009F064010536F75 726365526563742E52696768740500000000000000E2064011536F7572636552 6563742E426F74746F6D0500000000000000B706400001055363616C65050000 00000000008000400F536F75726365526563742E4C6566740500000000000000 8B07400E536F75726365526563742E546F700500000000000000D4064010536F 75726365526563742E5269676874050000000000000097074011536F75726365 526563742E426F74746F6D0500000000000000F406400001055363616C650500 000000000000C000400F536F75726365526563742E4C65667405000000000000 80D007400E536F75726365526563742E546F7005000000000000009F07401053 6F75726365526563742E52696768740500000000000080E2074011536F757263 65526563742E426F74746F6D0500000000000000B70740000013546F75636841 6E696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374796C 654E616D6506126163636573736F7279636865636B6D61726B05416C69676E07 094D6F737452696768740A53697A652E57696474680500000000000000B00340 0B53697A652E4865696768740500000000000000B004401453697A652E506C61 74666F726D44656661756C74080756697369626C650800125441637469766553 74796C654F626A6563740005416C69676E070643656E7465720C536F75726365 4C6F6F6B7570061A57696E646F7773203130204D6F6465726E7374796C652E70 6E670A53697A652E576964746805000000000000009003400B53697A652E4865 6967687405000000000000009003401453697A652E506C6174666F726D446566 61756C740808577261704D6F6465070643656E7465720D416374697665547269 67676572070853656C65637465640A4163746976654C696E6B0E010F536F7572 6365526563742E4C65667405000000000000009B06400E536F75726365526563 742E546F700500000000000000D2054010536F75726365526563742E52696768 740500000000000000AD064011536F75726365526563742E426F74746F6D0500 000000000000F605400001055363616C650500000000000000C0FF3F0F536F75 726365526563742E4C6566740500000000000000E806400E536F757263655265 63742E546F7005000000000000009D064010536F75726365526563742E526967 6874050000000000008081074011536F75726365526563742E426F74746F6D05 00000000000000B806400001055363616C6505000000000000008000400F536F 75726365526563742E4C65667405000000000000009B07400E536F7572636552 6563742E546F700500000000000000D2064010536F75726365526563742E5269 6768740500000000000000AD074011536F75726365526563742E426F74746F6D 0500000000000000F606400001055363616C650500000000000000C000400F53 6F75726365526563742E4C6566740500000000000080E807400E536F75726365 526563742E546F7005000000000000809D074010536F75726365526563742E52 6967687405000000000000C081084011536F75726365526563742E426F74746F 6D0500000000000080B8074000000A536F757263654C696E6B0E010F536F7572 6365526563742E4C65667405000000000000009B06400E536F75726365526563 742E546F700500000000000000D2054010536F75726365526563742E52696768 740500000000000000AD064011536F75726365526563742E426F74746F6D0500 000000000000F605400001055363616C650500000000000000C0FF3F0F536F75 726365526563742E4C6566740500000000000000E806400E536F757263655265 63742E546F7005000000000000009D064010536F75726365526563742E526967 6874050000000000008081074011536F75726365526563742E426F74746F6D05 00000000000000B806400001055363616C6505000000000000008000400F536F 75726365526563742E4C65667405000000000000009B07400E536F7572636552 6563742E546F700500000000000000D2064010536F75726365526563742E5269 6768740500000000000000AD074011536F75726365526563742E426F74746F6D 0500000000000000F606400001055363616C650500000000000000C000400F53 6F75726365526563742E4C6566740500000000000080E807400E536F75726365 526563742E546F7005000000000000809D074010536F75726365526563742E52 6967687405000000000000C081084011536F75726365526563742E426F74746F 6D0500000000000080B80740000013546F756368416E696D6174696F6E2E4C69 6E6B0E0000000007544C61796F757400095374796C654E616D65060F61636365 73736F727964657461696C05416C69676E07094D6F737452696768740A53697A 652E57696474680500000000000000B003400B53697A652E4865696768740500 000000000000B004401453697A652E506C6174666F726D44656661756C740807 56697369626C65080012544163746976655374796C654F626A6563740005416C 69676E070643656E7465720C536F757263654C6F6F6B7570061A57696E646F77 73203130204D6F6465726E7374796C652E706E670A53697A652E576964746805 000000000000008003400B53697A652E48656967687405000000000000008003 401453697A652E506C6174666F726D44656661756C740808577261704D6F6465 070643656E7465720D41637469766554726967676572070853656C6563746564 0A4163746976654C696E6B0E010F536F75726365526563742E4C656674050000 00000000808707400E536F75726365526563742E546F700500000000000000D4 054010536F75726365526563742E526967687405000000000000808F07401153 6F75726365526563742E426F74746F6D0500000000000000F405400001055363 616C650500000000000000C0FF3F0F536F75726365526563742E4C6566740500 000000000000CB07400E536F75726365526563742E546F700500000000000000 9F064010536F75726365526563742E52696768740500000000000000D7074011 536F75726365526563742E426F74746F6D0500000000000000B7064000010553 63616C6505000000000000008000400F536F75726365526563742E4C65667405 000000000000808708400E536F75726365526563742E546F7005000000000000 00D4064010536F75726365526563742E526967687405000000000000808F0840 11536F75726365526563742E426F74746F6D0500000000000000F40640000105 5363616C650500000000000000C000400F536F75726365526563742E4C656674 0500000000000040CB08400E536F75726365526563742E546F70050000000000 00009F074010536F75726365526563742E52696768740500000000000040D708 4011536F75726365526563742E426F74746F6D0500000000000000B707400000 0A536F757263654C696E6B0E010F536F75726365526563742E4C656674050000 00000000808707400E536F75726365526563742E546F700500000000000000D4 054010536F75726365526563742E526967687405000000000000808F07401153 6F75726365526563742E426F74746F6D0500000000000000F405400001055363 616C650500000000000000C0FF3F0F536F75726365526563742E4C6566740500 000000000000CB07400E536F75726365526563742E546F700500000000000000 9F064010536F75726365526563742E52696768740500000000000000D7074011 536F75726365526563742E426F74746F6D0500000000000000B7064000010553 63616C6505000000000000008000400F536F75726365526563742E4C65667405 000000000000808708400E536F75726365526563742E546F7005000000000000 00D4064010536F75726365526563742E526967687405000000000000808F0840 11536F75726365526563742E426F74746F6D0500000000000000F40640000105 5363616C650500000000000000C000400F536F75726365526563742E4C656674 0500000000000040CB08400E536F75726365526563742E546F70050000000000 00009F074010536F75726365526563742E52696768740500000000000040D708 4011536F75726365526563742E426F74746F6D0500000000000000B707400000 13546F756368416E696D6174696F6E2E4C696E6B0E0000000000545046300754 4C61796F757400095374796C654E616D6506166C697374626F786974656D7374 796C655F6D6F64656C05416C69676E070643656E7465720A53697A652E576964 74680500000000000000BB07400B53697A652E48656967687405000000000000 009004401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508085461624F72646572021A0B4669786564486569676874021E000A5452 656374616E676C6500095374796C654E616D65060F6261636B67726F756E645F 6F76657205416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207 097830303437383646460748697454657374080A53697A652E57696474680500 000000000000BB07400B53697A652E4865696768740500000000000000900440 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F 6C6F720709783030343738364646000F54436F6C6F72416E696D6174696F6E00 095374796C654E616D6506046F766572084475726174696F6E05000000000000 000000000C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374 61727456616C756507097830303639364136440953746F7056616C7565070978 42343639364136440754726967676572060F497353656C65637465643D747275 650E54726967676572496E76657273650610497353656C65637465643D66616C 73650000000654476C79706800095374796C654E616D65060A676C7970687374 796C650C4D617267696E732E4C65667405000000000000008000400B4D617267 696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874 05000000000000008000400E4D617267696E732E426F74746F6D050000000000 000080FF3F05416C69676E07044C6566740A506F736974696F6E2E5805000000 000000008000400A506F736974696F6E2E59050000000000000080FF3F0A5369 7A652E576964746805000000000000008003400B53697A652E48656967687405 000000000000008804401453697A652E506C6174666F726D44656661756C7408 000016544163746976655374796C65546578744F626A65637400095374796C65 4E616D6506047465787405416C69676E0706436C69656E740C4D617267696E73 2E4C6566740500000000000000C000400B4D617267696E732E546F7005000000 0000000080FF3F0D4D617267696E732E52696768740500000000000000C00040 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E 57696474680500000000000000B006400B53697A652E48656967687405000000 000000008804401453697A652E506C6174666F726D44656661756C7408045465 7874060454657874165465787453657474696E67732E466F6E742E53697A6505 00000000000000800340165465787453657474696E67732E466F6E74436F6C6F 720709783936464646464646155465787453657474696E67732E5472696D6D69 6E670709436861726163746572155465787453657474696E67732E576F726457 72617008165465787453657474696E67732E486F727A416C69676E07074C6561 64696E670D536861646F7756697369626C65080D416374697665547269676765 72070853656C65637465640B416374697665436F6C6F720708636C6157686974 6500000954436865636B426F7800095374796C654E616D650605636865636B05 416C69676E07044C6566740843616E466F637573081244697361626C65466F63 7573456666656374090C4D617267696E732E4C65667405000000000000008001 400A506F736974696F6E2E5805000000000000008001400A53697A652E576964 74680500000000000000A003400B53697A652E48656967687405000000000000 009004401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508000016544163746976655374796C65546578744F626A65637400095374 796C654E616D650607636F6E7465787405416C69676E07055269676874074F70 61636974790500000000003333B3FE3F0C4D617267696E732E4C656674050000 0000000000C000400B4D617267696E732E546F70050000000000000080FF3F0D 4D617267696E732E52696768740500000000000000C000400E4D617267696E73 2E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E58050000 0000000000B906400A506F736974696F6E2E59050000000000000080FF3F0A53 697A652E576964746805000000000000008205400B53697A652E486569676874 05000000000000008804401453697A652E506C6174666F726D44656661756C74 0804546578740606313238303030165465787453657474696E67732E466F6E74 2E53697A650500000000000000800340165465787453657474696E67732E466F 6E74436F6C6F720709783936464646464646155465787453657474696E67732E 5472696D6D696E670709436861726163746572155465787453657474696E6773 2E576F72645772617008165465787453657474696E67732E486F727A416C6967 6E0708547261696C696E670D536861646F7756697369626C65080D4163746976 6554726967676572070853656C65637465640B416374697665436F6C6F720708 636C615768697465000016544163746976655374796C65546578744F626A6563 7400095374796C654E616D650606746F6B656E7305416C69676E070552696768 74074F7061636974790500000000003333B3FE3F0C4D617267696E732E4C6566 740500000000000000C000400B4D617267696E732E546F700500000000000000 80FF3F0D4D617267696E732E52696768740500000000000000C000400E4D6172 67696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E 5805000000000000008007400A506F736974696F6E2E59050000000000000080 FF3F0A53697A652E57696474680500000000000000A004400B53697A652E4865 6967687405000000000000008804401453697A652E506C6174666F726D446566 61756C74080454657874060434303936165465787453657474696E67732E466F 6E742E53697A650500000000000000800340165465787453657474696E67732E 466F6E74436F6C6F720709783936464646464646155465787453657474696E67 732E5472696D6D696E670709436861726163746572155465787453657474696E 67732E576F72645772617008165465787453657474696E67732E486F727A416C 69676E0708547261696C696E670D536861646F7756697369626C65080D416374 69766554726967676572070853656C65637465640B416374697665436F6C6F72 0708636C615768697465000016544163746976655374796C65546578744F626A 65637400095374796C654E616D650608646174616461746505416C69676E0705 5269676874074F7061636974790500000000003333B3FE3F0C4D617267696E73 2E4C6566740500000000000000C000400B4D617267696E732E546F7005000000 0000000080FF3F0D4D617267696E732E52696768740500000000000000C00040 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974 696F6E2E5805000000000000009707400A506F736974696F6E2E590500000000 00000080FF3F0A53697A652E576964746805000000000000008A05400B53697A 652E48656967687405000000000000008804401453697A652E506C6174666F72 6D44656661756C74080454657874060853657020323032331654657874536574 74696E67732E466F6E742E53697A650500000000000000800340165465787453 657474696E67732E466F6E74436F6C6F72070978393646464646464615546578 7453657474696E67732E5472696D6D696E670709436861726163746572155465 787453657474696E67732E576F72645772617008165465787453657474696E67 732E486F727A416C69676E0708547261696C696E670D536861646F7756697369 626C65080D41637469766554726967676572070853656C65637465640B416374 697665436F6C6F720708636C6157686974650000005450463007544C61796F75 7400095374796C654E616D6506156C697374626F786974656D7374796C655F63 68617405416C69676E070643656E7465720C436C69704368696C6472656E090C 50616464696E672E4C6566740500000000000000C002400B50616464696E672E 546F700500000000000000C002400D50616464696E672E526967687405000000 00000000C002400E50616464696E672E426F74746F6D0500000000000000C002 400A53697A652E57696474680500000000000000C406400B53697A652E486569 6768740500000000000000AC04401453697A652E506C6174666F726D44656661 756C74080756697369626C6508085461624F726465720204000A545265637461 6E676C6500095374796C654E616D650602626705416C69676E0708436F6E7465 6E74730A46696C6C2E436F6C6F72070978303032413242333207486974546573 74080A53697A652E57696474680500000000000000C406400B53697A652E4865 696768740500000000000000AC04401453697A652E506C6174666F726D446566 61756C74080B5374726F6B652E4B696E6407044E6F6E65075852616469757305 00000000000000C0014007595261646975730500000000000000C00140000F54 436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F76657208 4475726174696F6E0500000000006F1283F53F0C50726F70657274794E616D65 060A46696C6C2E436F6C6F720A537461727456616C7565070978303032413242 33320953746F7056616C75650709784646324132423332075472696767657206 2149734D6F7573654F7665723D747275653B497353656C65637465643D66616C 73650E54726967676572496E7665727365062249734D6F7573654F7665723D66 616C73653B497353656C65637465643D66616C736500000F54436F6C6F72416E 696D6174696F6E00095374796C654E616D65060873656C656374656408447572 6174696F6E0500000000006F1283F53F0C50726F70657274794E616D65060A46 696C6C2E436F6C6F720A537461727456616C7565070978464632413242333209 53746F7056616C756507097846463334333534310754726967676572060F4973 53656C65637465643D747275650E54726967676572496E766572736506224973 4D6F7573654F7665723D66616C73653B497353656C65637465643D66616C7365 0000000654476C79706800095374796C654E616D65060A676C7970687374796C 650B4D617267696E732E546F7005000000000000008000400D4D617267696E73 2E52696768740500000000000000C002400E4D617267696E732E426F74746F6D 050000000000000080004005416C69676E07044C6566740A506F736974696F6E 2E580500000000000000C002400A506F736974696F6E2E590500000000000000 E002400A53697A652E576964746805000000000000008003400B53697A652E48 65696768740500000000000000F002401453697A652E506C6174666F726D4465 6661756C74080A496D616765496E6465780201000E5446696C6C524742456666 65637400095374796C654E616D65061346696C6C524742456666656374315374 796C6505436F6C6F7207097846464439443945330000001654427574746F6E53 74796C65546578744F626A65637400095374796C654E616D6506047465787405 416C69676E0706436C69656E74064C6F636B6564090A53697A652E5769647468 0500000000000000B906400B53697A652E486569676874050000000000000098 03401453697A652E506C6174666F726D44656661756C74081654657874536574 74696E67732E466F6E742E53697A650500000000000000E00240165465787453 657474696E67732E466F6E74436F6C6F720708636C6157686974651554657874 53657474696E67732E5472696D6D696E67070943686172616374657215546578 7453657474696E67732E576F72645772617008165465787453657474696E6773 2E486F727A416C69676E07074C656164696E670D536861646F7756697369626C 650808486F74436F6C6F720708636C6157686974650C466F6375736564436F6C 6F720708636C6157686974650B4E6F726D616C436F6C6F720708636C61576869 74650C50726573736564436F6C6F720708636C615768697465000007544C6179 6F757400095374796C654E616D6506086F7665725F6C617905416C69676E0705 52696768740D4D617267696E732E52696768740500000000000000D404C00A50 6F736974696F6E2E580500000000000000C506400A506F736974696F6E2E5905 00000000000000C002400A53697A652E57696474680500000000000000A00440 0B53697A652E48656967687405000000000000009803401453697A652E506C61 74666F726D44656661756C7408085461624F726465720200000F54466C6F6174 416E696D6174696F6E00095374796C654E616D650609656469745F6F76657208 4475726174696F6E0500000000006F1283F53F07496E7665727365090C50726F 70657274794E616D65060D4D617267696E732E52696768740A53746172745661 6C75650500000000000000D404C00953746F7056616C75650500000000000000 0000000754726967676572060F497353656C65637465643D747275650E547269 67676572496E76657273650610497353656C65637465643D66616C7365000007 54427574746F6E00095374796C654E616D65060664656C65746505416C69676E 0705526967687406437572736F72070B637248616E64506F696E740C50616464 696E672E4C656674050000000000000080FF3F0B50616464696E672E546F7005 0000000000000080FF3F0D50616464696E672E52696768740500000000000000 80FF3F0E50616464696E672E426F74746F6D050000000000000080FF3F0C4D61 7267696E732E4C65667405000000000000008002400B4D617267696E732E546F 7005000000000000008000400E4D617267696E732E426F74746F6D0500000000 0000008000400A506F736974696F6E2E580500000000000000C003400A506F73 6974696F6E2E5905000000000000008000400A53697A652E5769647468050000 00000000008003400B53697A652E4865696768740500000000000000F0024014 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 700611627574746F6E7374796C655F636C656172085461624F72646572020100 05545061746800095374796C654E616D65060A50617468315374796C6505416C 69676E0706436C69656E7409446174612E506174680AF0040000690000000000 0000000050410000000001000000000030410000000002000000867D15410000 0000020000000000004133ECAB3F020000000000004100004040010000000000 00410000804001000000000000400000804002000000BC4EB93F000080400200 00000000803FAF538E40020000000000803F0000A040020000000000803F51AC B14002000000BA4EB93F0000C04002000000FFFFFF3F0000C040010000000000 40400000C04001000000000040400000A041020000000000404051ACB1410200 0000BC4E99400000C041020000000000E0400000C04101000000000088410000 C0410200000051AC99410000C041020000000000A84151ACB141020000000000 A8410000A041010000000000A8410000C040010000000000B0410000C0400200 0000146BB4410000C040020000000000B84151ACB140020000000000B8410000 A040020000000000B841AF538E4002000000146BB44100008040020000000000 B041000080400100000000008041000080400100000000008041000040400200 00000000804133ECAB3F020000007A826A410000000002000000000050410000 0000030000000000504100000000000000000000204100004040020000000000 20415DA71C4002000000D8292741FFFFFF3F0200000000003041000000400100 000000005041000000400200000029D658410000004002000000000060415EA7 1C40020000000000604100004040010000000000604100008040010000000000 20410000804003000000000020410000404000000000000098410000A0410200 00000000984129D6A8410200000029D690410000B04102000000000088410000 B041010000000000E0400000B041020000005EA7BC400000B041020000000000 A04029D6A841020000000000A0400000A041010000000000A0400000C0400100 0000000098410000C04003000000000098410000A04100000000000040410000 104102000000D7293741000010410200000000003041D7291741020000000000 3041000020410100000000003041000090410200000000003041146B94410200 0000D7293741000098410200000000004041000098410200000028D648410000 98410200000000005041146B9441020000000000504100009041010000000000 5041000020410200000000005041D72917410200000029D64841000010410200 0000000040410000104103000000000040410000104100000000000070410000 90410200000000007041146B944102000000D729774100009841020000000000 80410000984102000000146B8441000098410200000000008841146B94410200 000000008841000090410100000000008841000020410200000000008841D729 174102000000146B84410000104102000000000080410000104102000000D729 7741000010410200000000007041D72917410200000000007041000020410300 0000000070410000904100000000000000410000104102000000AF53EE400000 1041020000000000E040D7291741020000000000E04000002041010000000000 E04000009041020000000000E040146B944102000000AF53EE40000098410200 000000000041000098410200000028D60841000098410200000000001041146B 9441020000000000104100009041010000000000104100002041020000000000 1041D72917410200000029D60841000010410200000000000041000010410300 000000000041000010410A46696C6C2E436F6C6F720709784646443944394533 064C6F636B6564090748697454657374080A53697A652E576964746805000000 00000000E002400B53697A652E4865696768740500000000000000D002401453 697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64 07044E6F6E6508577261704D6F64650703466974000F54436F6C6F72416E696D 6174696F6E00095374796C654E616D650614436F6C6F72416E696D6174696F6E 315374796C65084475726174696F6E0500000000006F1283F53F07496E766572 7365090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461 727456616C756507097846464439443945330953746F7056616C75650708636C 6157686974650754726967676572061049734D6F7573654F7665723D74727565 0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C 7365000000000754427574746F6E00095374796C654E616D6506046564697405 416C69676E0705526967687406437572736F72070B637248616E64506F696E74 0C50616464696E672E4C656674050000000000000080FF3F0B50616464696E67 2E546F70050000000000000080FF3F0D50616464696E672E5269676874050000 000000000080FF3F0E50616464696E672E426F74746F6D050000000000000080 FF3F0C4D617267696E732E4C65667405000000000000008002400B4D61726769 6E732E546F7005000000000000008000400E4D617267696E732E426F74746F6D 05000000000000008000400A506F736974696F6E2E5905000000000000008000 400A53697A652E576964746805000000000000008003400B53697A652E486569 6768740500000000000000F002401453697A652E506C6174666F726D44656661 756C74080B5374796C654C6F6F6B75700611627574746F6E7374796C655F636C 656172085461624F7264657202020005545061746800095374796C654E616D65 060A50617468315374796C6505416C69676E0706436C69656E7409446174612E 506174680AAC0000000E00000000000000000040410000A041010000000000A8 410000A041000000000000844100006040020000002CA18A4178FF2A40020000 00EF5F9541A1062B400200000000009C4100106040020000003D9FA2415E898A 40020000004B9FA241E07DB540020000001F009C4183FFCF40010000000000E0 400000984101000000000040400000A041010000000000804000008041010000 0000008441000060400300000000008441000060400946696C6C2E4B696E6407 044E6F6E65064C6F636B6564090748697454657374080A53697A652E57696474 680500000000000000E002400B53697A652E4865696768740500000000000000 D002401453697A652E506C6174666F726D44656661756C74080C5374726F6B65 2E436F6C6F72070978464644394439453308577261704D6F6465070346697400 0F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C 6F72416E696D6174696F6E315374796C6507456E61626C656409084475726174 696F6E0500000000006F1283F53F07496E7665727365090C50726F7065727479 4E616D65060C5374726F6B652E436F6C6F720A537461727456616C7565070978 46464439443945330953746F7056616C75650708636C61576869746507547269 67676572061049734D6F7573654F7665723D747275650E54726967676572496E 7665727365061149734D6F7573654F7665723D66616C73650000000000005450 463007544C61796F757400095374796C654E616D6506106D656D6F7374796C65 5F6E6F726D616C05416C69676E070643656E7465720C50616464696E672E4C65 667405000000000000008001400B50616464696E672E546F7005000000000000 008001400D50616464696E672E526967687405000000000000008001400E5061 6464696E672E426F74746F6D05000000000000008001400A53697A652E576964 74680500000000000000F406400B53697A652E48656967687405000000000000 009908401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508085461624F726465720222000A5452656374616E676C6500095374796C 654E616D650602626705416C69676E0708436F6E74656E74730A46696C6C2E43 6F6C6F7207097833434646464646460748697454657374080A53697A652E5769 6474680500000000000000F406400B53697A652E486569676874050000000000 00009908401453697A652E506C6174666F726D44656661756C74080C5374726F 6B652E436F6C6F72070978354146464646464607585261646975730500000000 000000C0004007595261646975730500000000000000C00040000F54436F6C6F 72416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D 6174696F6E315374796C65084475726174696F6E050000000000CDCCCCFC3F0C 50726F70657274794E616D65060C5374726F6B652E436F6C6F720A5374617274 56616C756507097835414646464646460953746F7056616C7565070978433846 46464646460754726967676572060E4973466F63757365643D747275650E5472 6967676572496E7665727365060F4973466F63757365643D66616C7365000000 0C5442727573684F626A65637400095374796C654E616D65060A666F72656772 6F756E6400000C5442727573684F626A65637400095374796C654E616D650609 73656C656374696F6E0B42727573682E436F6C6F720709783746324139364646 00000B54466F6E744F626A65637400095374796C654E616D650604666F6E7409 466F6E742E53697A650500000000000000E00240000007544C61796F75740009 5374796C654E616D650607636F6E74656E7405416C69676E0706436C69656E74 0C4D617267696E732E4C65667405000000000000008001400B4D617267696E73 2E546F7005000000000000008001400D4D617267696E732E5269676874050000 00000000008001400E4D617267696E732E426F74746F6D050000000000000080 01400A53697A652E57696474680500000000000000DC06400B53697A652E4865 6967687405000000000000009308401453697A652E506C6174666F726D446566 61756C7408085461624F72646572020000000A545363726F6C6C426172000953 74796C654E616D65060A767363726F6C6C62617205416C69676E070552696768 7406437572736F72070763724172726F770B536D616C6C4368616E6765050000 00000000000000000B4F7269656E746174696F6E0708566572746963616C0A50 6F736974696F6E2E580500000000000000E806400A506F736974696F6E2E5905 000000000000008001400A53697A652E57696474680500000000000000800240 0B53697A652E48656967687405000000000000009508401453697A652E506C61 74666F726D44656661756C7408085461624F72646572020100000A545363726F 6C6C42617200095374796C654E616D65060A687363726F6C6C62617205416C69 676E0706426F74746F6D06437572736F72070763724172726F770B536D616C6C 4368616E676505000000000000000000000B4F7269656E746174696F6E070A48 6F72697A6F6E74616C0A506F736974696F6E2E5805000000000000008001400A 506F736974696F6E2E5905000000000000009608400A53697A652E5769647468 0500000000000000EC06400B53697A652E486569676874050000000000000080 02401453697A652E506C6174666F726D44656661756C7408085461624F726465 720202000007544C61796F75740005416C69676E0706436C69656E740A53697A 652E57696474680500000000000000E406400B53697A652E4865696768740500 0000000000009508401453697A652E506C6174666F726D44656661756C740808 5461624F726465720203000F54536D616C6C5363726F6C6C4261720009537479 6C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E070552 6967687406437572736F72070763724172726F770B536D616C6C4368616E6765 05000000000000000000000B4F7269656E746174696F6E070856657274696361 6C0C4D617267696E732E4C65667405000000000000008000400A53697A652E57 6964746805000000000000008002400B53697A652E4865696768740500000000 0000008002401453697A652E506C6174666F726D44656661756C740807566973 69626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E61 6D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F 6D06437572736F72070763724172726F770B536D616C6C4368616E6765050000 00000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C 0B4D617267696E732E546F7005000000000000008000400A53697A652E576964 746805000000000000009606400B53697A652E48656967687405000000000000 008002401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508000000005450463007544C61796F757400095374796C654E616D65060F 65646974627574746F6E7374796C6505416C69676E070643656E7465720A5369 7A652E576964746805000000000000008004400B53697A652E48656967687405 000000000000008004401453697A652E506C6174666F726D44656661756C7408 0756697369626C6508085461624F726465720209000A5452656374616E676C65 00095374796C654E616D65060F52656374616E676C65315374796C6505416C69 676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978303032303231 32330748697454657374080A53697A652E576964746805000000000000008004 400B53697A652E48656967687405000000000000008004401453697A652E506C 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 07585261646975730500000000000000C0014007595261646975730500000000 000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61 6D650614436F6C6F72416E696D6174696F6E315374796C65084475726174696F 6E0500000000006F1283F53F0C50726F70657274794E616D65060A46696C6C2E 436F6C6F720A537461727456616C756507097830303230323132330953746F70 56616C756507097846463230323132330754726967676572061049734D6F7573 654F7665723D747275650E54726967676572496E7665727365061149734D6F75 73654F7665723D66616C73650000000654476C79706800095374796C654E616D 65060A676C7970687374796C650C4D617267696E732E4C656674050000000000 00008000400B4D617267696E732E546F7005000000000000008000400D4D6172 67696E732E526967687405000000000000008000400E4D617267696E732E426F 74746F6D050000000000000080004005416C69676E070643656E7465720A5369 7A652E57696474680500000000000000C003400B53697A652E48656967687405 00000000000000C003401453697A652E506C6174666F726D44656661756C7408 0A496D616765496E6465780202000E5446696C6C524742456666656374000953 74796C654E616D65061346696C6C524742456666656374315374796C6505436F 6C6F720709784646443944394533000000005450463007544C61796F75740009 5374796C654E616D6506126C697374626F787374796C655F636C65617205416C 69676E070643656E7465720A53697A652E57696474680500000000000000F406 400B53697A652E48656967687405000000000000009908401453697A652E506C 6174666F726D44656661756C74080756697369626C6508085461624F72646572 0220000C5442727573684F626A65637400095374796C654E616D650618416C74 65726E6174696E67526F774261636B67726F756E640B42727573682E436F6C6F 720709784646454545454545000007544C61796F757400095374796C654E616D 650607636F6E74656E7405416C69676E0706436C69656E740C436C6970436869 6C6472656E090A53697A652E57696474680500000000000000EC06400B53697A 652E48656967687405000000000000009708401453697A652E506C6174666F72 6D44656661756C7408085461624F72646572020000000A545363726F6C6C4261 7200095374796C654E616D65060A767363726F6C6C62617205416C69676E0705 52696768740B536D616C6C4368616E676505000000000000000000000B4F7269 656E746174696F6E0708566572746963616C0A506F736974696F6E2E58050000 0000000000EC06400A53697A652E576964746805000000000000008002400B53 697A652E48656967687405000000000000009708401453697A652E506C617466 6F726D44656661756C7408085461624F72646572020100000A545363726F6C6C 42617200095374796C654E616D65060A687363726F6C6C62617205416C69676E 0706426F74746F6D0B536D616C6C4368616E676505000000000000000000000B 4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E 2E5905000000000000009708400A53697A652E57696474680500000000000000 F406400B53697A652E48656967687405000000000000008002401453697A652E 506C6174666F726D44656661756C7408085461624F726465720202000007544C 61796F75740005416C69676E0706436C69656E740A53697A652E576964746805 00000000000000EC06400B53697A652E48656967687405000000000000009708 401453697A652E506C6174666F726D44656661756C7408085461624F72646572 0203000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F 76736D616C6C7363726F6C6C62617205416C69676E070552696768740B536D61 6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07 08566572746963616C0C4D617267696E732E4C65667405000000000000008000 400A53697A652E576964746805000000000000008002400B53697A652E486569 67687405000000000000008002401453697A652E506C6174666F726D44656661 756C74080756697369626C650800000F54536D616C6C5363726F6C6C42617200 095374796C654E616D65060F68736D616C6C7363726F6C6C62617205416C6967 6E0706426F74746F6D0B536D616C6C4368616E67650500000000000000000000 0B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E73 2E546F7005000000000000008000400A53697A652E5769647468050000000000 00009606400B53697A652E48656967687405000000000000008002401453697A 652E506C6174666F726D44656661756C74080756697369626C65080000000754 4C61796F757400095374796C654E616D65060668656164657205416C69676E07 03546F700A53697A652E57696474680500000000000000C804400B53697A652E 4865696768740500000000000000C804401453697A652E506C6174666F726D44 656661756C74080756697369626C6508085461624F726465720204000007544C 61796F757400095374796C654E616D650606666F6F74657205416C69676E0706 426F74746F6D0A53697A652E57696474680500000000000000C804400B53697A 652E4865696768740500000000000000C804401453697A652E506C6174666F72 6D44656661756C74080756697369626C6508085461624F726465720205000000 5450463007544C61796F757400095374796C654E616D650613627574746F6E73 74796C655F7072696D61727905416C69676E070643656E746572074F70616369 7479050000000000CDCCCCFE3F0A53697A652E57696474680500000000000000 A004400B53697A652E4865696768740500000000000000A004401453697A652E 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 6572020A000654476C79706800095374796C654E616D65060A676C7970687374 796C6505416C69676E070643656E7465720A53697A652E576964746805000000 00000000C003400B53697A652E4865696768740500000000000000C003401453 697A652E506C6174666F726D44656661756C74080A496D616765496E64657802 00000E5446696C6C52474245666665637400095374796C654E616D6506134669 6C6C524742456666656374315374796C6505436F6C6F72070978464644394439 45330000000F54466C6F6174416E696D6174696F6E00095374796C654E616D65 0614466C6F6174416E696D6174696F6E315374796C65084475726174696F6E05 0000000000CDCCCCFC3F0C50726F70657274794E616D6506074F706163697479 0A537461727456616C7565050000000000CDCCCCFE3F0953746F7056616C7565 050000000000000080FF3F0754726967676572061049734D6F7573654F766572 3D747275650E54726967676572496E7665727365061149734D6F7573654F7665 723D66616C73650000005450463007544C61796F757400095374796C654E616D 65060F656469747374796C655F636C65617205416C69676E070643656E746572 0A53697A652E57696474680500000000000000D606400B53697A652E48656967 687405000000000000008C04401453697A652E506C6174666F726D4465666175 6C74080756697369626C6508085461624F726465720224000A5452656374616E 676C6500095374796C654E616D650602626705416C69676E0708436F6E74656E 74730A46696C6C2E436F6C6F7207097833434646464646460748697454657374 080A53697A652E57696474680500000000000000D606400B53697A652E486569 67687405000000000000008C04401453697A652E506C6174666F726D44656661 756C74080C5374726F6B652E436F6C6F72070978354146464646464607585261 646975730500000000000000C0004007595261646975730500000000000000C0 0040000F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614 436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E050000 000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F6B652E436F 6C6F720A537461727456616C756507097835414646464646460953746F705661 6C756507097843384646464646460754726967676572060E4973466F63757365 643D747275650E54726967676572496E7665727365060F4973466F6375736564 3D66616C73650000000C5442727573684F626A65637400095374796C654E616D 65060A666F726567726F756E6400000C5442727573684F626A65637400095374 796C654E616D65060973656C656374696F6E0B42727573682E436F6C6F720709 78374632413936464600000B54466F6E744F626A65637400095374796C654E61 6D650604666F6E7409466F6E742E53697A650500000000000000E00240000007 544C61796F757400095374796C654E616D650607636F6E74656E7405416C6967 6E0706436C69656E740C4D617267696E732E4C6566740500000000000000C000 400B4D617267696E732E546F700500000000000000C000400D4D617267696E73 2E52696768740500000000000000C000400E4D617267696E732E426F74746F6D 0500000000000000C000400A53697A652E57696474680500000000000000CE06 400B53697A652E4865696768740500000000000000E803401453697A652E506C 6174666F726D44656661756C7408085461624F726465720200000007544C6179 6F757400095374796C654E616D650607627574746F6E7305416C69676E070552 69676874064C6F636B6564090B4D617267696E732E546F700500000000000000 8000400D4D617267696E732E526967687405000000000000008000400E4D6172 67696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E 580500000000000000D406400A506F736974696F6E2E59050000000000000080 00400A53697A652E576964746805000000000000000000000B53697A652E4865 696768740500000000000000F803401453697A652E506C6174666F726D446566 61756C7408085461624F726465720201000006544C6162656C00095374796C65 4E616D65060670726F6D7074064C6F636B656409074F70616369747905000000 0000000080FE3F0756697369626C6508085461624F7264657202030000005450 463007544C61796F757400095374796C654E616D6506157363726F6C6C626172 626F74746F6D627574746F6E05416C69676E070643656E7465720A53697A652E 576964746805000000000000008803400B53697A652E48656967687405000000 000000008803401453697A652E506C6174666F726D44656661756C7408075669 7369626C6508085461624F72646572021F000554506174680005416C69676E07 0643656E74657209446174612E506174680A3400000004000000000000000000 000000000000010000000000803F00000000010000000000003F0000803F0300 000000000000000000000A46696C6C2E436F6C6F720707636C6147726179064C 6F636B6564090748697454657374080A53697A652E5769647468050000000000 00008002400B53697A652E4865696768740500000000000000E001401453697A 652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704 4E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05 0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F 6C6F720A537461727456616C75650707636C61477261790953746F7056616C75 6507097846464343434343430754726967676572061049734D6F7573654F7665 723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469 6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C 2E436F6C6F720A537461727456616C756507097846464343434343430953746F 7056616C75650707636C61477261790754726967676572061149734D6F757365 4F7665723D66616C7365000000005450463007544C61796F757400095374796C 654E616D6506147363726F6C6C62617268747261636B7374796C6505416C6967 6E070643656E7465720A53697A652E576964746805000000000000009803400B 53697A652E4865696768740500000000000100FC04401453697A652E506C6174 666F726D44656661756C74080756697369626C6508085461624F72646572021E 0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65 64090A506F736974696F6E2E580500000000000000A001400A506F736974696F 6E2E590500000000000000A001400A53697A652E576964746805000000000000 00A002400B53697A652E4865696768740500000000000000B804401453697A65 2E506C6174666F726D44656661756C74080000005450463007544C61796F7574 00095374796C654E616D6506137363726F6C6C6261726C656674627574746F6E 05416C69676E070643656E7465720A53697A652E576964746805000000000000 00A803400B53697A652E4865696768740500000000000000A803401453697A65 2E506C6174666F726D44656661756C74080756697369626C6508085461624F72 6465720221000554506174680005416C69676E070643656E7465720944617461 2E506174680A4000000005000000000000000000803F00000000010000000000 803F0000803F01000000000000000000003F010000000000803F000000000300 000000000000000000000A46696C6C2E436F6C6F720707636C6147726179064C 6F636B6564090748697454657374080A53697A652E5769647468050000000000 0000E001400B53697A652E48656967687405000000000000008002401453697A 652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704 4E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05 0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F 6C6F720A537461727456616C75650707636C61477261790953746F7056616C75 6507097846464343434343430754726967676572061049734D6F7573654F7665 723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469 6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C 2E436F6C6F720A537461727456616C756507097846464343434343430953746F 7056616C75650707636C61477261790754726967676572061149734D6F757365 4F7665723D66616C7365000000005450463007544C61796F757400095374796C 654E616D6506147363726F6C6C6261727269676874627574746F6E05416C6967 6E070643656E7465720A53697A652E57696474680500000000000000B003400B 53697A652E4865696768740500000000000000A003401453697A652E506C6174 666F726D44656661756C74080756697369626C6508085461624F726465720223 000554506174680005416C69676E070643656E74657209446174612E50617468 0A34000000040000000000000000000000000000000100000000000000000080 3F010000000000803F0000003F0300000000000000000000000A46696C6C2E43 6F6C6F720707636C6147726179064C6F636B6564090748697454657374080A53 697A652E57696474680500000000000000E001400B53697A652E486569676874 05000000000000008002401453697A652E506C6174666F726D44656661756C74 080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D61 74696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F706572 74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070763 6C61477261790953746F7056616C756507097846464343434343430754726967 676572061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E 696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F 70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565 07097846464343434343430953746F7056616C75650707636C61477261790754 726967676572061149734D6F7573654F7665723D66616C736500000000545046 3007544C61796F757400095374796C654E616D65060E7363726F6C6C62617273 74796C6505416C69676E070643656E7465720A53697A652E5769647468050000 00000000009008400B53697A652E486569676874050000000000008085074014 53697A652E506C6174666F726D44656661756C74080756697369626C65080854 61624F726465720227000A54526F756E645265637400095374796C654E616D65 060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A46696C 6C2E436F6C6F7207097831453333333333330A53697A652E5769647468050000 00000000009008400B53697A652E486569676874050000000000008085074014 53697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E 6407044E6F6E6500000654547261636B00095374796C654E616D650606687472 61636B05416C69676E0706436C69656E74064C6F636B656409034D6178050000 000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C 0A53697A652E576964746805000000000000009008400B53697A652E48656967 687405000000000000808507401453697A652E506C6174666F726D4465666175 6C74080B5374796C654C6F6F6B757006147363726F6C6C62617268747261636B 7374796C650C56696577706F727453697A65050000000000CDCCCCFB3F000006 54547261636B00095374796C654E616D65060676747261636B05416C69676E07 06436C69656E74064C6F636B656409034D6178050000000000000080FF3F0B4F 7269656E746174696F6E070A486F72697A6F6E74616C0A53697A652E57696474 6805000000000000009008400B53697A652E4865696768740500000000000080 8507401453697A652E506C6174666F726D44656661756C74080B5374796C654C 6F6F6B757006147363726F6C6C62617276747261636B7374796C650C56696577 706F727453697A65050000000000CDCCCCFB3F0000005450463007544C61796F 757400095374796C654E616D6506127363726F6C6C626172746F70627574746F 6E05416C69676E070643656E7465720A53697A652E5769647468050000000000 00008003400B53697A652E48656967687405000000000000009803401453697A 652E506C6174666F726D44656661756C74080756697369626C6508085461624F 726465720226000554506174680005416C69676E070643656E74657209446174 612E506174680A400000000500000000000000000000000000803F0100000000 00803F0000803F010000000000003F0000000001000000000000000000803F03 00000000000000000000000A46696C6C2E436F6C6F720707636C614772617906 4C6F636B6564090748697454657374080A53697A652E57696474680500000000 0000008002400B53697A652E4865696768740500000000000000E00140145369 7A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407 044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E 050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E43 6F6C6F720A537461727456616C75650707636C61477261790953746F7056616C 756507097846464343434343430754726967676572061049734D6F7573654F76 65723D7472756500000F54436F6C6F72416E696D6174696F6E00084475726174 696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C 6C2E436F6C6F720A537461727456616C75650709784646434343434343095374 6F7056616C75650707636C61477261790754726967676572061149734D6F7573 654F7665723D66616C7365000000005450463007544C61796F75740009537479 6C654E616D6506147363726F6C6C62617276747261636B7374796C6505416C69 676E070643656E7465720A53697A652E57696474680500000000000000F60540 0B53697A652E48656967687405000000000000009003401453697A652E506C61 74666F726D44656661756C74080756697369626C6508085461624F7264657202 170006545468756D6200095374796C654E616D6506057468756D620643757273 6F72070B637248616E64506F696E74064C6F636B6564090A506F736974696F6E 2E5805000000000000008001400A506F736974696F6E2E590500000000000000 8001400A53697A652E57696474680500000000000000BC04400B53697A652E48 656967687405000000000000009002401453697A652E506C6174666F726D4465 6661756C74080756697369626C6508000000545046300A54526F756E64526563 7400095374796C654E616D650619736D616C6C7363726F6C6C62617268747261 636B7374796C6505416C69676E070643656E7465720A46696C6C2E436F6C6F72 07097831453333333333330A53697A652E57696474680500000000000040A408 400B53697A652E48656967687405000000000000009003401453697A652E506C 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 0756697369626C65080006545468756D6200095374796C654E616D6506057468 756D62064C6F636B6564090C4D617267696E732E4C6566740500000000000000 80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769 6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474 6F6D050000000000000080FF3F0A506F736974696F6E2E580500000000000000 C000400A506F736974696F6E2E590500000000000000C002C00A53697A652E57 696474680500000000000000A002400B53697A652E4865696768740500000000 000000B804401453697A652E506C6174666F726D44656661756C740800000054 50463007544C61796F757400095374796C654E616D650613736D616C6C736372 6F6C6C6261727374796C6505416C69676E070643656E7465720A53697A652E57 696474680500000000000000FA05400B53697A652E4865696768740500000000 000040B408401453697A652E506C6174666F726D44656661756C740807566973 69626C6508085461624F72646572021D000654547261636B00095374796C654E 616D65060668747261636B05416C69676E0706436C69656E74064C6F636B6564 09034D6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F 72697A6F6E74616C0A53697A652E57696474680500000000000000FA05400B53 697A652E4865696768740500000000000040B408401453697A652E506C617466 6F726D44656661756C74080B5374796C654C6F6F6B75700619736D616C6C7363 726F6C6C62617268747261636B7374796C650C56696577706F727453697A6505 0000000000CDCCCCFB3F00000654547261636B00095374796C654E616D650606 76747261636B05416C69676E0706436C69656E74064C6F636B656409034D6178 050000000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E 74616C0A53697A652E57696474680500000000000000FA05400B53697A652E48 65696768740500000000000040B408401453697A652E506C6174666F726D4465 6661756C74080B5374796C654C6F6F6B75700619736D616C6C7363726F6C6C62 617276747261636B7374796C650C56696577706F727453697A65050000000000 CDCCCCFB3F000000545046300A54526F756E645265637400095374796C654E61 6D650619736D616C6C7363726F6C6C62617276747261636B7374796C6505416C 69676E070643656E7465720A46696C6C2E436F6C6F7207097831453333333333 330A53697A652E57696474680500000000000000A003400B53697A652E486569 6768740500000000000000FC07401453697A652E506C6174666F726D44656661 756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C650800 06545468756D6200095374796C654E616D6506057468756D62064C6F636B6564 090C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E 732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500 00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000 80FF3F0A506F736974696F6E2E5805000000000000009002C00A506F73697469 6F6E2E590500000000000000C002400A53697A652E5769647468050000000000 0000BC04400B53697A652E48656967687405000000000000009002401453697A 652E506C6174666F726D44656661756C74080000005450463007544C61796F75 7400095374796C654E616D65060A7468756D627374796C6505416C69676E0706 43656E74657206437572736F72070B637248616E64506F696E740A53697A652E 576964746805000000000000009003400B53697A652E48656967687405000000 000000008803401453697A652E506C6174666F726D44656661756C7408075669 7369626C6508085461624F72646572021C000A54526F756E6452656374000953 74796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74 656E74730A46696C6C2E436F6C6F720709784646353635383639064C6F636B65 64090748697454657374080A53697A652E576964746805000000000000009003 400B53697A652E48656967687405000000000000008803401453697A652E506C 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 000F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614436F 6C6F72416E696D6174696F6E315374796C65084475726174696F6E0500000000 000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A 537461727456616C756507097846463536353836390953746F7056616C756507 097846464143414342450754726967676572061049734D6F7573654F7665723D 747275650E54726967676572496E7665727365061149734D6F7573654F766572 3D66616C7365000000005450463007544C61796F757400095374796C654E616D 65060A747261636B7374796C6505416C69676E070643656E7465720A53697A65 2E576964746805000000000000009D06400B53697A652E486569676874050000 00000000009003401453697A652E506C6174666F726D44656661756C74080756 697369626C6508085461624F72646572021B000A5452656374616E676C650009 5374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E 74656E74730A46696C6C2E436F6C6F720709784646353035303530064C6F636B 6564090748697454657374080A53697A652E576964746805000000000000009D 06400B53697A652E48656967687405000000000000009003401453697A652E50 6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846 4633303330333007585261646975730500000000000000800140075952616469 75730500000000000000800140000006545468756D6200095374796C654E616D 6506057468756D6206437572736F72070B637248616E64506F696E74064C6F63 6B6564090A506F736974696F6E2E580500000000000000C000400A506F736974 696F6E2E59050000000000000080FF3F0A53697A652E57696474680500000000 000000C404400B53697A652E4865696768740500000000000000F00240145369 7A652E506C6174666F726D44656661756C74080000005450463007544C61796F 757400095374796C654E616D65060E7363726F6C6C626F787374796C6505416C 69676E070643656E7465720A53697A652E57696474680500000000000000CD07 400B53697A652E4865696768740500000000000000BE07401453697A652E506C 6174666F726D44656661756C74080756697369626C6508085461624F72646572 02310007544C61796F757400095374796C654E616D65060A6261636B67726F75 6E6405416C69676E0708436F6E74656E7473064C6F636B6564090A53697A652E 57696474680500000000000000CD07400B53697A652E48656967687405000000 00000000BE07401453697A652E506C6174666F726D44656661756C7408000754 4C61796F757400095374796C654E616D650607636F6E74656E7405416C69676E 0708436F6E74656E74730D4D617267696E732E52696768740500000000000000 C002400A53697A652E57696474680500000000000000C707400B53697A652E48 65696768740500000000000000BE07401453697A652E506C6174666F726D4465 6661756C7408000007544C61796F75740005416C69676E0706436C69656E740A 53697A652E57696474680500000000000000C607400B53697A652E4865696768 740500000000000000B707401453697A652E506C6174666F726D44656661756C 7408000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F 76736D616C6C7363726F6C6C62617205416C69676E070552696768740B536D61 6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07 08566572746963616C0C4D617267696E732E4C65667405000000000000008000 400A53697A652E576964746805000000000000008002400B53697A652E486569 67687405000000000000008002401453697A652E506C6174666F726D44656661 756C74080B5374796C654C6F6F6B757006227363726F6C6C626F787374796C65 536D616C6C5363726F6C6C4261725374796C65310756697369626C650800000F 54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D61 6C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C43 68616E676505000000000000000000000B4F7269656E746174696F6E070A486F 72697A6F6E74616C0B4D617267696E732E546F7005000000000000008000400A 53697A652E576964746805000000000000009606400B53697A652E4865696768 7405000000000000008002401453697A652E506C6174666F726D44656661756C 74080756697369626C650800000007544C61796F75740005416C69676E070843 6F6E74656E74730A53697A652E57696474680500000000000000CD07400B5369 7A652E4865696768740500000000000000BE07401453697A652E506C6174666F 726D44656661756C74080007544C61796F75740005416C69676E0706426F7474 6F6D0A506F736974696F6E2E590500000000000000A507400A53697A652E5769 6474680500000000000000CD07400B53697A652E486569676874050000000000 0000C804401453697A652E506C6174666F726D44656661756C74080009545369 7A654772697000095374796C654E616D65060873697A656772697005416C6967 6E07055269676874064C6F636B6564090A506F736974696F6E2E580500000000 000000C307400A53697A652E57696474680500000000000000A003400B53697A 652E4865696768740500000000000000C804401453697A652E506C6174666F72 6D44656661756C74080B5374796C654C6F6F6B7570061C7363726F6C6C626F78 7374796C6553697A65477269705374796C6531000000000A545363726F6C6C42 617200095374796C654E616D65060A767363726F6C6C62617205416C69676E07 0552696768740B536D616C6C4368616E676505000000000000000000000B4F72 69656E746174696F6E0708566572746963616C0C4D617267696E732E4C656674 0500000000000000C000400B4D617267696E732E546F700500000000000000C0 00400D4D617267696E732E52696768740500000000000000C000400E4D617267 696E732E426F74746F6D0500000000000000C000400A506F736974696F6E2E58 0500000000000080C707400A506F736974696F6E2E590500000000000000C000 400A53697A652E576964746805000000000000008002400B53697A652E486569 6768740500000000000000B407401453697A652E506C6174666F726D44656661 756C74080B5374796C654C6F6F6B7570061D7363726F6C6C626F787374796C65 5363726F6C6C4261725374796C653100000A545363726F6C6C42617200095374 796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F 6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E7461 74696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C656674050000 0000000000C000400B4D617267696E732E546F700500000000000000C000400D 4D617267696E732E52696768740500000000000000C000400E4D617267696E73 2E426F74746F6D0500000000000000C000400A506F736974696F6E2E58050000 0000000000C000400A506F736974696F6E2E590500000000000080B807400A53 697A652E57696474680500000000000000CA07400B53697A652E486569676874 05000000000000008002401453697A652E506C6174666F726D44656661756C74 08000000005450463007544C61796F757400095374796C654E616D6506106275 74746F6E7374796C655F6D656E7505416C69676E070643656E7465720C506164 64696E672E4C6566740500000000000000C002400B50616464696E672E546F70 0500000000000000C002400D50616464696E672E526967687405000000000000 00C002400E50616464696E672E426F74746F6D0500000000000000C002400A53 697A652E57696474680500000000000000F406400B53697A652E486569676874 0500000000000000B004401453697A652E506C6174666F726D44656661756C74 080756697369626C6508085461624F726465720203000A5452656374616E676C 6500095374796C654E616D65060F52656374616E676C65315374796C6505416C 69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783030324132 4233320748697454657374080A53697A652E57696474680500000000000000F4 06400B53697A652E4865696768740500000000000000B004401453697A652E50 6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E 6507585261646975730500000000000000C00140075952616469757305000000 00000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E 616D6506046F766572084475726174696F6E0500000000006F1283F53F0C5072 6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75 6507097830303241324233320953746F7056616C756507097846463241324233 320754726967676572061049734D6F7573654F7665723D747275650E54726967 676572496E7665727365061149734D6F7573654F7665723D66616C7365000000 0654476C79706800095374796C654E616D65060A676C7970687374796C650B4D 617267696E732E546F7005000000000000008000400D4D617267696E732E5269 6768740500000000000000C002400E4D617267696E732E426F74746F6D050000 000000000080004005416C69676E07044C6566740A506F736974696F6E2E5805 00000000000000C002400A506F736974696F6E2E590500000000000000E00240 0A53697A652E576964746805000000000000008003400B53697A652E48656967 687405000000000000008003401453697A652E506C6174666F726D4465666175 6C74080A496D616765496E6465780201000E5446696C6C524742456666656374 00095374796C654E616D65061346696C6C524742456666656374315374796C65 05436F6C6F7207097846464439443945330000001654427574746F6E5374796C 65546578744F626A65637400095374796C654E616D6506047465787405416C69 676E0706436C69656E74064C6F636B6564090A53697A652E5769647468050000 0000000000DC06400B53697A652E4865696768740500000000000000A0034014 53697A652E506C6174666F726D44656661756C7408165465787453657474696E 67732E466F6E742E53697A650500000000000000E00240165465787453657474 696E67732E466F6E74436F6C6F720708636C6157686974651554657874536574 74696E67732E5472696D6D696E67070943686172616374657215546578745365 7474696E67732E576F72645772617008165465787453657474696E67732E486F 727A416C69676E07074C656164696E670D536861646F7756697369626C650808 486F74436F6C6F720708636C6157686974650C466F6375736564436F6C6F7207 08636C6157686974650B4E6F726D616C436F6C6F720708636C6157686974650C 50726573736564436F6C6F720708636C6157686974650000005450463007544C 61796F757400095374796C654E616D650613627574746F6E7374796C655F636F 6E6669726D05416C69676E070643656E7465720A53697A652E57696474680500 0000000000008004400B53697A652E4865696768740500000000000000800440 1453697A652E506C6174666F726D44656661756C74080756697369626C650808 5461624F726465720205000A5452656374616E676C6500095374796C654E616D 65060F52656374616E676C65315374796C6505416C69676E0708436F6E74656E 74730A46696C6C2E436F6C6F7207097830304646464646460748697454657374 080A53697A652E576964746805000000000000008004400B53697A652E486569 67687405000000000000008004401453697A652E506C6174666F726D44656661 756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500 000000000000C0014007595261646975730500000000000000C00140000F5443 6F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C6F7241 6E696D6174696F6E315374796C65084475726174696F6E0500000000006F1283 F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 7456616C756507097830304646464646460953746F7056616C75650709783134 4646464646460754726967676572061049734D6F7573654F7665723D74727565 0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C 73650000000654476C79706800095374796C654E616D65060A676C7970687374 796C650B4D617267696E732E546F7005000000000000008000400D4D61726769 6E732E526967687405000000000000008000400E4D617267696E732E426F7474 6F6D050000000000000080004005416C69676E070643656E7465720A53697A65 2E57696474680500000000000000C003400B53697A652E486569676874050000 0000000000C003401453697A652E506C6174666F726D44656661756C74080A49 6D616765496E6465780202000E5446696C6C5247424566666563740009537479 6C654E616D65061346696C6C524742456666656374315374796C6505436F6C6F 720709784646443944394533000000005450463007544C61796F757400095374 796C654E616D65060E6D656D6F7374796C655F636F646505416C69676E070643 656E7465720A53697A652E57696474680500000000000000C806400B53697A65 2E4865696768740500000000000000C806401453697A652E506C6174666F726D 44656661756C74080756697369626C6508085461624F726465720230000A5452 656374616E676C6500095374796C654E616D65060F52656374616E676C653153 74796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207 097833323030303030300748697454657374080A53697A652E57696474680500 000000000000C806400B53697A652E4865696768740500000000000000C80640 1453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B69 6E6407044E6F6E6507585261646975730500000000000000C001400759526164 6975730500000000000000C0014000000C5442727573684F626A656374000953 74796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F72 0708636C61426C61636B00000C5442727573684F626A65637400095374796C65 4E616D65060973656C656374696F6E0B42727573682E436F6C6F720709783634 34453445353300000B54466F6E744F626A65637400095374796C654E616D6506 04666F6E74000007544C61796F757400095374796C654E616D650607636F6E74 656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566740500 000000000000A001400B4D617267696E732E546F700500000000000000A00140 0D4D617267696E732E52696768740500000000000000A001400E4D617267696E 732E426F74746F6D0500000000000000A001400A53697A652E57696474680500 000000000000B606400B53697A652E4865696768740500000000000000B60640 1453697A652E506C6174666F726D44656661756C7408085461624F7264657202 0000000A545363726F6C6C42617200095374796C654E616D65060A767363726F 6C6C62617205416C69676E0705526967687406437572736F7207076372417272 6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74 6174696F6E0708566572746963616C0A506F736974696F6E2E58050000000000 0000C006400A53697A652E576964746805000000000000008002400B53697A65 2E4865696768740500000000000000C006401453697A652E506C6174666F726D 44656661756C7408085461624F72646572020100000A545363726F6C6C426172 00095374796C654E616D65060A687363726F6C6C62617205416C69676E070642 6F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E67 6505000000000000000000000B4F7269656E746174696F6E070A486F72697A6F 6E74616C0A506F736974696F6E2E590500000000000000C006400A53697A652E 57696474680500000000000000C806400B53697A652E48656967687405000000 000000008002401453697A652E506C6174666F726D44656661756C7408085461 624F726465720202000007544C61796F75740005416C69676E0706436C69656E 740A53697A652E57696474680500000000000000C006400B53697A652E486569 6768740500000000000000C006401453697A652E506C6174666F726D44656661 756C7408085461624F726465720203000F54536D616C6C5363726F6C6C426172 00095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69 676E0705526967687406437572736F72070763724172726F770B536D616C6C43 68616E676505000000000000000000000B4F7269656E746174696F6E07085665 72746963616C0C4D617267696E732E4C65667405000000000000008000400A53 697A652E576964746805000000000000008002400B53697A652E486569676874 05000000000000008002401453697A652E506C6174666F726D44656661756C74 080756697369626C650800000F54536D616C6C5363726F6C6C42617200095374 796C654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706 426F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E 676505000000000000000000000B4F7269656E746174696F6E070A486F72697A 6F6E74616C0B4D617267696E732E546F7005000000000000008000400A53697A 652E576964746805000000000000009606400B53697A652E4865696768740500 0000000000008002401453697A652E506C6174666F726D44656661756C740807 56697369626C6508000000005450463007544C61796F757400095374796C654E 616D650611627574746F6E7374796C655F636C65617205416C69676E07064365 6E7465720756697369626C6508085461624F7264657202330000545046300754 4C61796F757400095374796C654E616D65060D747261636B6261727374796C65 05416C69676E070643656E7465720C50616464696E672E4C6566740500000000 0000008001400D50616464696E672E526967687405000000000000008001400A 53697A652E576964746805000000000000809507400B53697A652E4865696768 7405000000000000009803401453697A652E506C6174666F726D44656661756C 74080756697369626C6508085461624F7264657202350B466978656448656967 68740213000A54526F756E645265637400095374796C654E616D650606687472 61636B05416C69676E070A5665727443656E746572074869745465737408074F 7061636974790500000000009A9999FE3F0A506F736974696F6E2E5805000000 000000008001400A506F736974696F6E2E5905000000000000008001400A5369 7A652E576964746805000000000000809107400B53697A652E48656967687405 00000000000000B002401453697A652E506C6174666F726D44656661756C7408 0C5374726F6B652E436F6C6F720709784646443644364436000009545374796C 6554616700035461670214095374796C654E616D6506095468756D6253697A65 00000C545374796C654F626A65637400095374796C654E616D65060676747261 636B05416C69676E070A486F727A43656E746572074361704D6F646507045469 6C65064C6F636B6564090C536F757263654C6F6F6B7570061B57696E646F7773 203130204465736B746F707374796C652E706E670A506F736974696F6E2E5805 000000000000009006400A53697A652E57696474680500000000000000B00240 0B53697A652E48656967687405000000000000009803401453697A652E506C61 74666F726D44656661756C74080A536F757263654C696E6B0E010D436170496E 736574732E546F70050000000000000080014010436170496E736574732E426F 74746F6D05000000000000008001400F536F75726365526563742E4C65667405 000000000000808F07400E536F75726365526563742E546F7005000000000000 00B1064010536F75726365526563742E52696768740500000000000000950740 11536F75726365526563742E426F74746F6D0500000000000000ED064000010D 436170496E736574732E546F700500000000000000C0014010436170496E7365 74732E426F74746F6D0500000000000000C00140055363616C65050000000000 0000C0FF3F0F536F75726365526563742E4C6566740500000000000000D70740 0E536F75726365526563742E546F70050000000000008084074010536F757263 65526563742E52696768740500000000000000DF074011536F75726365526563 742E426F74746F6D0500000000000000B2074000010D436170496E736574732E 546F70050000000000000080024010436170496E736574732E426F74746F6D05 00000000000000800240055363616C6505000000000000008000400F536F7572 6365526563742E4C65667405000000000000808F08400E536F75726365526563 742E546F700500000000000000B1074010536F75726365526563742E52696768 74050000000000000095084011536F75726365526563742E426F74746F6D0500 000000000000ED07400000000A5452656374616E676C6500095374796C654E61 6D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946 696C6C2E4B696E6407044E6F6E65064C6F636B6564090748697454657374080C 4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E 546F7005000000000000008000400D4D617267696E732E526967687405000000 0000000080FF3F0E4D617267696E732E426F74746F6D05000000000000008000 400A53697A652E576964746805000000000000009002400B53697A652E486569 6768740500000000000000F002401453697A652E506C6174666F726D44656661 756C74080B5374726F6B652E4B696E6407044E6F6E6500000006545468756D62 00095374796C654E616D650606767468756D62064C6F636B6564090C4D617267 696E732E4C65667405000000000000008000C00B4D617267696E732E546F7005 000000000000008000C00D4D617267696E732E52696768740500000000000000 8000C00E4D617267696E732E426F74746F6D05000000000000008000C00B5374 796C654C6F6F6B7570060D7468756D626261727374796C65000006545468756D 6200095374796C654E616D650606687468756D62064C6F636B6564090C4D6172 67696E732E4C65667405000000000000008000C00B4D617267696E732E546F70 05000000000000008000C00D4D617267696E732E526967687405000000000000 008000C00E4D617267696E732E426F74746F6D05000000000000008000C00B53 74796C654C6F6F6B7570060D7468756D626261727374796C65085461624F7264 657202010000005450463007544C61796F757400095374796C654E616D65060D 7468756D626261727374796C6505416C69676E070643656E7465720A53697A65 2E57696474680500000000000000A003400B53697A652E486569676874050000 0000000000A003401453697A652E506C6174666F726D44656661756C74080756 697369626C6508085461624F726465720237000754436972636C650009537479 6C654E616D65060C436972636C65315374796C6505416C69676E0706436C6965 6E740A46696C6C2E436F6C6F720708636C615768697465074869745465737408 0A53697A652E57696474680500000000000000A003400B53697A652E48656967 68740500000000000000A003401453697A652E506C6174666F726D4465666175 6C74080C5374726F6B652E436F6C6F7207097846464444444444440000005450 463007544C61796F757400095374796C654E616D650613627574746F6E737479 6C655F77656C636F6D6505416C69676E070643656E7465720C50616464696E67 2E4C6566740500000000000000A002400B50616464696E672E546F7005000000 00000000A002400D50616464696E672E52696768740500000000000000A00240 0E50616464696E672E426F74746F6D0500000000000000A002400A53697A652E 57696474680500000000000000F406400B53697A652E48656967687405000000 00000000B804401453697A652E506C6174666F726D44656661756C7408075669 7369626C6508085461624F726465720213000A5452656374616E676C65000953 74796C654E616D65060F52656374616E676C65315374796C6505416C69676E07 08436F6E74656E74730A46696C6C2E436F6C6F72070978464633453346344207 48697454657374080A53697A652E57696474680500000000000000F406400B53 697A652E4865696768740500000000000000B804401453697A652E506C617466 6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075852 61646975730500000000000000C0014007595261646975730500000000000000 C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506 14436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E0500 000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F6C 6F720A537461727456616C756507097846463345334634420953746F7056616C 756507097846463230323132330754726967676572061049734D6F7573654F76 65723D747275650E54726967676572496E7665727365061149734D6F7573654F 7665723D66616C73650000001654427574746F6E5374796C65546578744F626A 65637400095374796C654E616D6506047465787405416C69676E0706436C6965 6E74064C6F636B6564090A53697A652E57696474680500000000000000E00640 0B53697A652E4865696768740500000000000000D003401453697A652E506C61 74666F726D44656661756C7408165465787453657474696E67732E466F6E742E 53697A650500000000000000E00240165465787453657474696E67732E466F6E 74436F6C6F720708636C615768697465155465787453657474696E67732E5472 696D6D696E670709436861726163746572155465787453657474696E67732E57 6F72645772617008165465787453657474696E67732E486F727A416C69676E07 074C656164696E670D536861646F7756697369626C650808486F74436F6C6F72 0708636C6157686974650C466F6375736564436F6C6F720708636C6157686974 650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373656443 6F6C6F720708636C6157686974650000005450463007544C61796F7574000953 74796C654E616D650613627574746F6E7374796C655F6578656375746505416C 69676E070643656E7465720C50616464696E672E4C6566740500000000000000 C002400B50616464696E672E546F7005000000000000008002400D5061646469 6E672E52696768740500000000000000C002400E50616464696E672E426F7474 6F6D05000000000000008002400A53697A652E57696474680500000000000000 F406400B53697A652E48656967687405000000000000009804401453697A652E 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 6572020F000A5452656374616E676C6500095374796C654E616D65060F526563 74616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C 6C2E436F6C6F7207097846463334333534310748697454657374080A53697A65 2E57696474680500000000000000F406400B53697A652E486569676874050000 00000000009804401453697A652E506C6174666F726D44656661756C74080C53 74726F6B652E436F6C6F72070978464635363538363907585261646975730500 000000000000C0014007595261646975730500000000000000C00140000F5443 6F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C6F7241 6E696D6174696F6E315374796C65084475726174696F6E0500000000000AD7A3 F83F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 7456616C756507097846463334333534310953746F7056616C75650709784646 3431343034450754726967676572061049734D6F7573654F7665723D74727565 0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C 73650000001654427574746F6E5374796C65546578744F626A65637400095374 796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B 6564090A53697A652E57696474680500000000000000CA06400B53697A652E48 65696768740500000000000000B003401453697A652E506C6174666F726D4465 6661756C7408165465787453657474696E67732E466F6E742E53697A65050000 0000000000E00240165465787453657474696E67732E466F6E74436F6C6F7207 08636C615768697465155465787453657474696E67732E5472696D6D696E6707 09436861726163746572155465787453657474696E67732E576F726457726170 08165465787453657474696E67732E486F727A416C69676E07074C656164696E 670D536861646F7756697369626C650808486F74436F6C6F720708636C615768 6974650C466F6375736564436F6C6F720708636C6157686974650B4E6F726D61 6C436F6C6F720708636C6157686974650C50726573736564436F6C6F72070863 6C615768697465000005545061746800095374796C654E616D65060A50617468 315374796C6505416C69676E07044C65667409446174612E506174680AA80100 002300000000000000C3F59641B81E41410100000086EB4D41EC51AC41020000 004EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B0 41020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B 410000B04102000000B97534413BF9AE410200000024B52F4162ACAB41020000 00000030410000A84101000000000030410000704101000000713DDA40000070 4102000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A 403601504102000000903A9A4001F149410200000019AC9D40AB004441020000 00F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC903 4002000000F3613D419238EF3F02000000E17A44410000004002000000468A4B 412A36084002000000DB4A5041F19C2240020000000000504100004040010000 00000050410000104101000000A47089410000104102000000CD46924154FF0F 4102000000EA70994178521E410200000040719941C9FE2F41020000005D7199 41FF0E364102000000FB94984155FF3B4102000000C4F59641B81E4141030000 00C3F59641B81E41410A46696C6C2E436F6C6F72070978464644394439453307 48697454657374080D4D617267696E732E52696768740500000000000000C001 400A506F736974696F6E2E580500000000000000C002400A506F736974696F6E 2E5905000000000000008002400A53697A652E57696474680500000000000000 C002400B53697A652E4865696768740500000000000000B003401453697A652E 506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F 6E6508577261704D6F646507034669740000005450463007544C61796F757400 095374796C654E616D65060B636F6D626F5F7374796C6505416C69676E070643 656E7465720A53697A652E57696474680500000000000000FA06400B53697A65 2E48656967687405000000000000008404401453697A652E506C6174666F726D 44656661756C74080756697369626C6508085461624F726465720239000A5452 656374616E676C6500095374796C654E616D650602626705416C69676E070843 6F6E74656E74730A46696C6C2E436F6C6F720709783343464646464646074869 7454657374080A53697A652E57696474680500000000000000FA06400B53697A 652E48656967687405000000000000008404401453697A652E506C6174666F72 6D44656661756C74080C5374726F6B652E436F6C6F7207097835414646464646 4607585261646975730500000000000000C00040075952616469757305000000 00000000C00040000F54436F6C6F72416E696D6174696F6E00095374796C654E 616D650614436F6C6F72416E696D6174696F6E315374796C6508447572617469 6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F 6B652E436F6C6F720A537461727456616C756507097835414646464646460953 746F7056616C756507097843384646464646460754726967676572060E497346 6F63757365643D747275650E54726967676572496E7665727365060F4973466F 63757365643D66616C736500000A5452656374616E676C6500095374796C654E 616D6506056172726F7705416C69676E0708466974526967687407436F726E65 72730B08546F7052696768740B426F74746F6D5269676874000A46696C6C2E43 6F6C6F7207097833434646464646460748697454657374080C4D617267696E73 2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000 0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974 696F6E2E58050000000000B0F8D906400A506F736974696F6E2E590500000000 00000080FF3F0A53697A652E5769647468050000000000803AF803400B53697A 652E4865696768740500000000000000F803401453697A652E506C6174666F72 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164 6975730500000000000000C0004007595261646975730500000000000000C000 40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65061443 6F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05000000 0000CDCCCCFC3F07496E7665727365090C50726F70657274794E616D65060A46 696C6C2E436F6C6F720A537461727456616C7565070978334346464646464609 53746F7056616C75650709783738464646464646075472696767657206104973 4D6F7573654F7665723D747275650E54726967676572496E7665727365061149 734D6F7573654F7665723D66616C7365000005545061746800095374796C654E 616D65060A50617468315374796C6505416C69676E070643656E746572094461 74612E506174680A580000000700000000000000AE476D41295C834101000000 0000C04152B8CC410100000014AE0442295C8341010000000000104200009A41 010000000000C0410000FA41010000000000404100009A4103000000AE476D41 295C83410A46696C6C2E436F6C6F720709784646443944394533074869745465 7374080A53697A652E57696474680500000000000000C002400B53697A652E48 65696768740500000000000000F803401453697A652E506C6174666F726D4465 6661756C74080B5374726F6B652E4B696E6407044E6F6E6508577261704D6F64 6507034669740000000007544C61796F757400095374796C654E616D65060763 6F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B6564090C4D 617267696E732E4C6566740500000000000000C000400B4D617267696E732E54 6F700500000000000000C000400D4D617267696E732E52696768740500000000 000000B803400E4D617267696E732E426F74746F6D0500000000000000C00040 0A53697A652E57696474680500000000000000E006400B53697A652E48656967 68740500000000000000D803401453697A652E506C6174666F726D4465666175 6C740800000B54466F6E744F626A65637400095374796C654E616D650604666F 6E7409466F6E742E53697A650500000000000000E0024000000C544272757368 4F626A65637400095374796C654E616D65060A666F726567726F756E6400000C 5442727573684F626A65637400095374796C654E616D65060973656C65637469 6F6E0B42727573682E436F6C6F72070978374632413936464600000054504630 0A5452656374616E676C6500095374796C654E616D65060D64726F70646F776E 70616E656C05416C69676E070643656E7465720A46696C6C2E436F6C6F720709 7846463334333534310A53697A652E57696474680500000000000000B807400B 53697A652E4865696768740500000000000080BD07401453697A652E506C6174 666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650756 697369626C650800005450463007544C61796F757400095374796C654E616D65 060C706F706F7665727374796C6505416C69676E070643656E7465720A53697A 652E576964746805000000000000809D07400B53697A652E4865696768740500 0000000000808507401453697A652E506C6174666F726D44656661756C740807 56697369626C6508085461624F726465720210000A5452656374616E676C6500 095374796C654E616D650602626705416C69676E0706436C69656E740A46696C 6C2E436F6C6F7207097846463334333534310A53697A652E5769647468050000 00000000809D07400B53697A652E486569676874050000000000008085074014 53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C 6F72070978464636363637373007585261646975730500000000000000A00140 07595261646975730500000000000000A00140000D54536861646F7745666665 6374000844697374616E63650500000000006F1283F53F09446972656374696F 6E0500000000000000B4044008536F66746E657373050000000000CECCCCFC3F 074F706163697479050000000000CDCCCCFD3F0B536861646F77436F6C6F7207 08636C61426C61636B000007544C61796F757400095374796C654E616D650607 636F6E74656E7405416C69676E0706436C69656E740A53697A652E5769647468 05000000000000809D07400B53697A652E486569676874050000000000008085 07401453697A652E506C6174666F726D44656661756C7408085461624F726465 720200000000005450463007544C61796F757400095374796C654E616D65060C 6C697374626F787374796C6505416C69676E070643656E7465720A53697A652E 57696474680500000000000000E907400B53697A652E48656967687405000000 00000040D607401453697A652E506C6174666F726D44656661756C7408075669 7369626C6508085461624F726465720216000C5442727573684F626A65637400 095374796C654E616D650618416C7465726E6174696E67526F774261636B6772 6F756E640B42727573682E436F6C6F72070978464645424542454200000A5452 656374616E676C6500095374796C654E616D65060A6261636B67726F756E6405 416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464633 34333534310748697454657374080A53697A652E576964746805000000000000 00E907400B53697A652E4865696768740500000000000040D607401453697A65 2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709 78464639413941413007585261646975730500000000000000C0004007595261 646975730500000000000000C000400007544C61796F757400095374796C654E 616D650607636F6E74656E7405416C69676E0706436C69656E740C436C697043 68696C6472656E090C4D617267696E732E4C6566740500000000000000800040 0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E 526967687405000000000000008000400E4D617267696E732E426F74746F6D05 000000000000008000400A53697A652E57696474680500000000000000E30740 0B53697A652E4865696768740500000000000040D007401453697A652E506C61 74666F726D44656661756C7408085461624F72646572020000000A545363726F 6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C69 676E070552696768740B536D616C6C4368616E67650500000000000000000000 0B4F7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E 580500000000000000E507400A53697A652E5769647468050000000000000080 02400B53697A652E4865696768740500000000000040D207401453697A652E50 6C6174666F726D44656661756C7408085461624F72646572020100000A545363 726F6C6C42617200095374796C654E616D65060A687363726F6C6C6261720541 6C69676E0706426F74746F6D0B536D616C6C4368616E67650500000000000000 0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F7369 74696F6E2E590500000000000040D207400A53697A652E576964746805000000 00000000E907400B53697A652E48656967687405000000000000008002401453 697A652E506C6174666F726D44656661756C7408085461624F72646572020200 0007544C61796F75740005416C69676E0706436C69656E740A53697A652E5769 6474680500000000000000E507400B53697A652E486569676874050000000000 0040D207401453697A652E506C6174666F726D44656661756C7408085461624F 726465720203000F54536D616C6C5363726F6C6C42617200095374796C654E61 6D65060F76736D616C6C7363726F6C6C62617205416C69676E07055269676874 0B536D616C6C4368616E676505000000000000000000000B4F7269656E746174 696F6E0708566572746963616C0C4D617267696E732E4C656674050000000000 00008000400A53697A652E576964746805000000000000008002400B53697A65 2E48656967687405000000000000008002401453697A652E506C6174666F726D 44656661756C74080756697369626C650800000F54536D616C6C5363726F6C6C 42617200095374796C654E616D65060F68736D616C6C7363726F6C6C62617205 416C69676E0706426F74746F6D0B536D616C6C4368616E676505000000000000 000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D6172 67696E732E546F7005000000000000008000400A53697A652E57696474680500 0000000000009606400B53697A652E4865696768740500000000000000800240 1453697A652E506C6174666F726D44656661756C74080756697369626C650800 000007544C61796F757400095374796C654E616D65060668656164657205416C 69676E0703546F700A53697A652E57696474680500000000000000C804400B53 697A652E4865696768740500000000000000C804401453697A652E506C617466 6F726D44656661756C74080756697369626C6508085461624F72646572020400 0007544C61796F757400095374796C654E616D650606666F6F74657205416C69 676E0706426F74746F6D0A53697A652E57696474680500000000000000C80440 0B53697A652E4865696768740500000000000000C804401453697A652E506C61 74666F726D44656661756C74080756697369626C6508085461624F7264657202 05000000005450463007544C61796F75740003546167021E095374796C654E61 6D65060D6D656E756974656D7374796C6505416C69676E070643656E7465720A 53697A652E576964746805000000000000809007400B53697A652E4865696768 740500000000000000CC04401453697A652E506C6174666F726D44656661756C 74080756697369626C6508085461624F726465720215000A5452656374616E67 6C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E07 08436F6E74656E74730A46696C6C2E436F6C6F72070978464634343435353007 4869745465737408074F70616369747905000000000000000000000A53697A65 2E576964746805000000000000809007400B53697A652E486569676874050000 0000000000CC04401453697A652E506C6174666F726D44656661756C74080B53 74726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000 80014007595261646975730500000000000000800140000F54466C6F6174416E 696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F 70657274794E616D6506074F7061636974790A537461727456616C7565050000 00000000000000000953746F7056616C7565050000000000000080FF3F075472 6967676572061049734D6F7573654F7665723D747275650E5472696767657249 6E7665727365061149734D6F7573654F7665723D66616C736500000007544C61 796F757400095374796C654E616D650605676C79706805416C69676E07044C65 66740A53697A652E57696474680500000000000000C803400B53697A652E4865 696768740500000000000000CC04401453697A652E506C6174666F726D446566 61756C74080007544C61796F757400095374796C654E616D650609636865636B 6D61726B05416C69676E0708436F6E74656E7473074F70616369747905000000 00006F1283F53F0A53697A652E57696474680500000000000000C803400B5369 7A652E4865696768740500000000000000CC04401453697A652E506C6174666F 726D44656661756C74080005545061746800095374796C654E616D65060E6368 65636B6D61726B7374796C6505416C69676E070643656E74657209446174612E 506174680A58000000070000000000000056D9524391AE2C4301000000927666 4365021643010000009F3983432B7C3C43010000009E9AA64382D2B442010000 006F1CB04375A4D1420100000026DF8243263F67430300000056D9524391AE2C 430A46696C6C2E436F6C6F720708636C61426C61636B0748697454657374080A 53697A652E57696474680500000000000000B002400B53697A652E4865696768 740500000000000000B002401453697A652E506C6174666F726D44656661756C 74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D 6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F7065 7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708 636C61426C61636B0953746F7056616C75650708636C61426C61636B07547269 67676572060F497353656C65637465643D747275650E54726967676572496E76 657273650610497353656C65637465643D66616C736500000F54436F6C6F7241 6E696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C5072 6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75 650708636C61426C61636B0953746F7056616C75650708636C61426C61636B07 54726967676572062149734D6F7573654F7665723D747275653B497353656C65 637465643D66616C73650E54726967676572496E7665727365062249734D6F75 73654F7665723D66616C73653B497353656C65637465643D66616C7365000000 0F54466C6F6174416E696D6174696F6E00084475726174696F6E050000000000 CDCCCCFB3F0C50726F70657274794E616D6506074F7061636974790A53746172 7456616C756505000000000000000000000953746F7056616C75650500000000 00000080FF3F0754726967676572060E4973436865636B65643D747275650E54 726967676572496E7665727365060F4973436865636B65643D66616C73650000 000654496D61676500095374796C654E616D6506066269746D61700E4D756C74 695265734269746D61700E01000005416C69676E070A486F727A43656E746572 0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73 2E546F7005000000000000008000400D4D617267696E732E5269676874050000 00000000008000400E4D617267696E732E426F74746F6D050000000000000080 00400A506F736974696F6E2E5805000000000000008000400A506F736974696F 6E2E5905000000000000008000400A53697A652E576964746805000000000000 00A803400B53697A652E4865696768740500000000000000BC04401453697A65 2E506C6174666F726D44656661756C740800000654476C79706800095374796C 654E616D65060A676C7970687374796C650C4D617267696E732E4C6566740500 00000000000080FF3F0B4D617267696E732E546F700500000000000000800040 0D4D617267696E732E52696768740500000000000000C000400E4D617267696E 732E426F74746F6D050000000000000080FF3F05416C69676E070A486F727A43 656E7465720A53697A652E576964746805000000000000008003400B53697A65 2E48656967687405000000000000008003401453697A652E506C6174666F726D 44656661756C740800000005545465787400095374796C654E616D6506047465 787405416C69676E07044C656674064C6F636B6564090748697454657374080C 4D617267696E732E4C65667405000000000000008002400D4D617267696E732E 526967687405000000000000008002400A506F736974696F6E2E580500000000 0000008404400A53697A652E57696474680500000000000000C804400B53697A 652E4865696768740500000000000000CC04401453697A652E506C6174666F72 6D44656661756C7408165465787453657474696E67732E466F6E742E53697A65 0500000000000000800340165465787453657474696E67732E466F6E74436F6C 6F720709783936464646464646165465787453657474696E67732E486F727A41 6C69676E07074C656164696E67000F54436F6C6F72416E696D6174696F6E0009 5374796C654E616D650608616E696D5F73656C084475726174696F6E05000000 000018B7D1F23F0C50726F70657274794E616D650605436F6C6F720A53746172 7456616C756507097839364646464646460953746F7056616C75650709783936 4646464646460754726967676572060F497353656C65637465643D747275650E 54726967676572496E76657273650610497353656C65637465643D66616C7365 00000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65060961 6E696D5F6F766572084475726174696F6E05000000000018B7D1F23F0C50726F 70657274794E616D650605436F6C6F720A537461727456616C75650709783936 4646464646460953746F7056616C75650708636C615768697465075472696767 6572062149734D6F7573654F7665723D747275653B497353656C65637465643D 66616C73650E54726967676572496E7665727365062249734D6F7573654F7665 723D66616C73653B497353656C65637465643D66616C73650000000554546578 7400095374796C654E616D65060873686F727463757405416C69676E07055269 676874064C6F636B656409074869745465737408074F70616369747905000000 00003333B3FE3F0C4D617267696E732E4C6566740500000000000000C002400D 4D617267696E732E52696768740500000000000000C001400A506F736974696F 6E2E580500000000000000D506400A53697A652E576964746805000000000000 00C804400B53697A652E4865696768740500000000000000CC04401453697A65 2E506C6174666F726D44656661756C7408165465787453657474696E67732E46 6F6E74436F6C6F720708636C615768697465165465787453657474696E67732E 486F727A416C69676E07074C656164696E67000007544C61796F757400095374 796C654E616D6506077375626D61726B05416C69676E070552696768740A506F 736974696F6E2E5805000000000000808607400A53697A652E57696474680500 000000000000A003400B53697A652E4865696768740500000000000000CC0440 1453697A652E506C6174666F726D44656661756C740800055450617468000541 6C69676E070643656E74657209446174612E506174680A340000000400000000 000000000000000000000001000000000000000000803F010000000000803F00 00003F0300000000000000000000000A46696C6C2E436F6C6F72070978464645 4445444544064C6F636B6564090748697454657374080A53697A652E57696474 680500000000000000E001400B53697A652E4865696768740500000000000000 8002401453697A652E506C6174666F726D44656661756C74080B5374726F6B65 2E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475 726174696F6E05000000000018B7D1F23F0C50726F70657274794E616D65060A 46696C6C2E436F6C6F720A537461727456616C75650708636C61426C61636B09 53746F7056616C75650708636C61426C61636B0754726967676572062149734D 6F7573654F7665723D747275653B497353656C65637465643D66616C73650E54 726967676572496E7665727365062249734D6F7573654F7665723D66616C7365 3B497353656C65637465643D66616C736500000F54436F6C6F72416E696D6174 696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F70657274 794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708636C 61426C61636B0953746F7056616C75650708636C61426C61636B075472696767 6572060F497353656C65637465643D747275650E54726967676572496E766572 73650610497353656C65637465643D66616C73650000000009545374796C6554 616700095374796C654E616D65060668656967687408546167466C6F61740500 000000000000F003400000005450463007544C61796F757400095374796C654E 616D6506146D656E756974656D7374796C655F627574746F6E05416C69676E07 0643656E7465720A53697A652E576964746805000000000000809007400B5369 7A652E4865696768740500000000000000CC04401453697A652E506C6174666F 726D44656661756C74080756697369626C6508085461624F726465720211000A 5452656374616E676C6500095374796C654E616D65060A6261636B67726F756E 6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846 46343434353530074869745465737408074F7061636974790500000000000000 0000000A53697A652E576964746805000000000000809007400B53697A652E48 65696768740500000000000000CC04401453697A652E506C6174666F726D4465 6661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164697573 050000000000000080014007595261646975730500000000000000800140000F 54466C6F6174416E696D6174696F6E00084475726174696F6E05000000000018 B7D1F23F0C50726F70657274794E616D6506074F7061636974790A5374617274 56616C756505000000000000000000000953746F7056616C7565050000000000 000080FF3F0754726967676572061049734D6F7573654F7665723D747275650E 54726967676572496E7665727365061149734D6F7573654F7665723D66616C73 6500000007544C61796F757400095374796C654E616D650605676C7970680541 6C69676E07044C6566740A53697A652E57696474680500000000000000C80340 0B53697A652E4865696768740500000000000000CC04401453697A652E506C61 74666F726D44656661756C74080007544C61796F757400095374796C654E616D 650609636865636B6D61726B05416C69676E0708436F6E74656E7473074F7061 636974790500000000006F1283F53F0A53697A652E5769647468050000000000 0000C803400B53697A652E4865696768740500000000000000CC04401453697A 652E506C6174666F726D44656661756C74080005545061746800095374796C65 4E616D65060E636865636B6D61726B7374796C6505416C69676E070643656E74 657209446174612E506174680A58000000070000000000000056D9524391AE2C 43010000009276664365021643010000009F3983432B7C3C43010000009E9AA6 4382D2B442010000006F1CB04375A4D1420100000026DF8243263F6743030000 0056D9524391AE2C430A46696C6C2E436F6C6F720708636C61426C61636B0748 697454657374080A53697A652E57696474680500000000000000B002400B5369 7A652E4865696768740500000000000000B002401453697A652E506C6174666F 726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F5443 6F6C6F72416E696D6174696F6E00084475726174696F6E05000000000018B7D1 F23F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 7456616C75650708636C61426C61636B0953746F7056616C75650708636C6142 6C61636B0754726967676572060F497353656C65637465643D747275650E5472 6967676572496E76657273650610497353656C65637465643D66616C73650000 0F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000 18B7D1F23F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53 7461727456616C75650708636C61426C61636B0953746F7056616C7565070863 6C61426C61636B0754726967676572062149734D6F7573654F7665723D747275 653B497353656C65637465643D66616C73650E54726967676572496E76657273 65062249734D6F7573654F7665723D66616C73653B497353656C65637465643D 66616C73650000000F54466C6F6174416E696D6174696F6E0008447572617469 6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D6506074F706163 6974790A537461727456616C756505000000000000000000000953746F705661 6C7565050000000000000080FF3F0754726967676572060E4973436865636B65 643D747275650E54726967676572496E7665727365060F4973436865636B6564 3D66616C73650000000654496D61676500095374796C654E616D650606626974 6D61700E4D756C74695265734269746D61700E01000005416C69676E070A486F 727A43656E7465720C4D617267696E732E4C6566740500000000000000800040 0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E 526967687405000000000000008000400E4D617267696E732E426F74746F6D05 000000000000008000400A506F736974696F6E2E580500000000000000800040 0A506F736974696F6E2E5905000000000000008000400A53697A652E57696474 680500000000000000A803400B53697A652E4865696768740500000000000000 BC04401453697A652E506C6174666F726D44656661756C740800000654476C79 706800095374796C654E616D65060A676C7970687374796C650C4D617267696E 732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000 00000000008000400D4D617267696E732E52696768740500000000000000C000 400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C6967 6E070A486F727A43656E7465720A53697A652E57696474680500000000000000 8003400B53697A652E48656967687405000000000000008003401453697A652E 506C6174666F726D44656661756C74080000001654427574746F6E5374796C65 546578744F626A65637400095374796C654E616D6506047465787405416C6967 6E0706436C69656E74064C6F636B6564090C4D617267696E732E4C6566740500 00000000000080FF3F0B4D617267696E732E546F700500000000000000800040 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E 732E426F74746F6D05000000000000008000400A53697A652E57696474680500 0000000000008307400B53697A652E4865696768740500000000000000BC0440 1453697A652E506C6174666F726D44656661756C740818546578745365747469 6E67732E466F6E742E46616D696C790606526F626F746F165465787453657474 696E67732E466F6E742E53697A65050000000000000080034016546578745365 7474696E67732E466F6E74436F6C6F7207097839364646464646461654657874 53657474696E67732E486F727A416C69676E07074C656164696E670D53686164 6F7756697369626C650808486F74436F6C6F720708636C6157686974650C466F 6375736564436F6C6F7207097839364646464646460B4E6F726D616C436F6C6F 7207097839364646464646460C50726573736564436F6C6F720708636C615768 6974650000005450463007544C61796F757400095374796C654E616D65060D6D 656E75766965777374796C6505416C69676E070643656E7465720A53697A652E 57696474680500000000000000E406400B53697A652E48656967687405000000 00000000A907401453697A652E506C6174666F726D44656661756C7408085461 624F726465720212000A5452656374616E676C6500095374796C654E616D6506 02626705416C69676E0706436C69656E740A46696C6C2E436F6C6F7207097846 463334333534310A53697A652E57696474680500000000000000E406400B5369 7A652E4865696768740500000000000000A907401453697A652E506C6174666F 726D44656661756C74080C5374726F6B652E436F6C6F72070978464634423434 353407585261646975730500000000000000A001400759526164697573050000 0000000000A00140000D54536861646F77456666656374000844697374616E63 650500000000006F1283F53F09446972656374696F6E0500000000000000B404 4008536F66746E657373050000000000CECCCCFC3F074F706163697479050000 000000CDCCCCFD3F0B536861646F77436F6C6F720708636C61426C61636B0000 0007544C61796F757400095374796C654E616D650607636F6E74656E7405416C 69676E0706436C69656E740C4D617267696E732E4C6566740500000000000000 C001400B4D617267696E732E546F700500000000000000C001400D4D61726769 6E732E52696768740500000000000000C001400E4D617267696E732E426F7474 6F6D0500000000000000C001400A53697A652E57696474680500000000000000 D806400B53697A652E4865696768740500000000000000A307401453697A652E 506C6174666F726D44656661756C74080000005450463007544C61796F757400 095374796C654E616D6506126D656E75736570617261746F727374796C650541 6C69676E070643656E7465720A53697A652E57696474680500000000000000C8 05400B53697A652E48656967687405000000000000008002401453697A652E50 6C6174666F726D44656661756C74080756697369626C6508085461624F726465 72023B00005450463007544C61796F757400095374796C654E616D6506176C65 667473656C656374696F6E706F696E747374796C6505416C69676E070643656E 7465720A53697A652E57696474680500000000000000C003400B53697A652E48 65696768740500000000000000C004401453697A652E506C6174666F726D4465 6661756C74080756697369626C6508085461624F7264657202400A4669786564 576964746802180B46697865644865696768740230000A5452656374616E676C 6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273 0B07546F704C6566740A426F74746F6D4C6566740B426F74746F6D5269676874 000A46696C6C2E436F6C6F720709784646414341434245074869745465737408 0A506F736974696F6E2E580500000000000000A803C00A506F736974696F6E2E 5905000000000000008404400A53697A652E57696474680500000000000000A0 03400B53697A652E4865696768740500000000000000A003401453697A652E50 6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E 6507585261646975730500000000000000A00240075952616469757305000000 00000000A002400000005450463007544C61796F757400095374796C654E616D 650618726967687473656C656374696F6E706F696E747374796C6505416C6967 6E070643656E7465720A53697A652E57696474680500000000000000C003400B 53697A652E4865696768740500000000000000C004401453697A652E506C6174 666F726D44656661756C74080756697369626C6508085461624F726465720244 0A4669786564576964746802180B46697865644865696768740230000A545265 6374616E676C6500095374796C654E616D65060A6261636B67726F756E640743 6F726E6572730B08546F7052696768740A426F74746F6D4C6566740B426F7474 6F6D5269676874000A46696C6C2E436F6C6F7207097846464143414342450748 697454657374080A53697A652E57696474680500000000000000A003400B5369 7A652E4865696768740500000000000000A003401453697A652E506C6174666F 726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507585261 646975730500000000000000A0024007595261646975730500000000000000A0 02400000005450463007544C61796F757400095374796C654E616D6506116275 74746F6E5F7363726F6C6C646F776E05416C69676E070643656E7465720A5369 7A652E57696474680500000000000000F003400B53697A652E48656967687405 00000000000000F003401453697A652E506C6174666F726D44656661756C7408 0756697369626C6508085461624F72646572024A000754436972636C65000953 74796C654E616D650602626705416C69676E0706436C69656E740A46696C6C2E 436F6C6F7207097833324646464646460748697454657374080A53697A652E57 696474680500000000000000F003400B53697A652E4865696768740500000000 000000F003401453697A652E506C6174666F726D44656661756C74080C537472 6F6B652E436F6C6F720709783145464646464646000554506174680009537479 6C654E616D65060A50617468315374796C6505416C69676E070643656E746572 09446174612E506174680AD801000027000000000000001E6ACF42E790C94502 000000F631D042C58DC94502000000F631D042B488C945020000001E6ACF4294 85C9450200000045A2CE427382C94502000000BC5ECD427382C9450200000066 97CC429485C9450100000038B7BF4225B9C945020000003716BF42AABBC94502 00000026FFBD42E1B9C9450200000026FFBD4251B6C9450100000026FFBD42DF 3FC9450200000026FFBD42733BC94502000000421EBD420038C945020000001F 04BC420038C945010000001402BC420038C94502000000F1E7BA420038C94502 000000EB00BA42733BC94502000000EB00BA42DF3FC94501000000EB00BA4251 B6C94502000000EB00BA42E1B9C9450200000084F1B842AABBC9450200000083 50B84225B9C945010000009F66AB425585C94502000000499FAA423382C94502 000000C65CA9423382C94502000000ED94A8425585C945010000007095A84255 85C945020000001ACEA7427488C945020000001ACEA742868DC94502000000F3 95A842A790C94501000000FB34B9424FD3C94501000000FB34B9424FD3C94502 0000002AC4BA4290D9C94502000000BF4BBD4290D9C94502000000EDDABE424F D3C94502000000ED36BF42DCD1C94502000000A1C6CF42748FC945020000001E 6ACF42E790C9450A46696C6C2E436F6C6F720709784141464646464646074869 7454657374080A53697A652E576964746805000000000000008003400B53697A 652E48656967687405000000000000008003401453697A652E506C6174666F72 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650857726170 4D6F6465070346697400000F54436F6C6F72416E696D6174696F6E0009537479 6C654E616D650614436F6C6F72416E696D6174696F6E315374796C6508447572 6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46 696C6C2E436F6C6F720A537461727456616C7565070978333246464646464609 53746F7056616C75650709783530464646464646075472696767657206104973 4D6F7573654F7665723D747275650E54726967676572496E7665727365061149 734D6F7573654F7665723D66616C736500000000545046300D54537769746368 4F626A65637400095374796C654E616D65060B7377697463687374796C650541 6C69676E070643656E7465720A53697A652E5769647468050000000000004094 08400B53697A652E48656967687405000000000000808207401453697A652E50 6C6174666F726D44656661756C7408085461624F72646572023F12547261636B 696E675468756D625363616C65050000000000000080FF3F0756697369626C65 080A46696C6C2E436F6C6F7207097846463133313331330B5374726F6B652E4B 696E6407044E6F6E650B5468756D622E436F6C6F720709784646373437343734 0D5468756D624F6E2E436F6C6F7207097846464143414342450C5468756D624F 6E2E4B696E640705536F6C6964105468756D625374726F6B652E4B696E640704 4E6F6E6505536861706507044F76616C00005450463007544C61796F75740009 5374796C654E616D65061A627574746F6E7374796C655F636C6561726D696E69 5F6C65667405416C69676E070643656E7465720A53697A652E57696474680500 0000000000008004400B53697A652E4865696768740500000000000000800440 1453697A652E506C6174666F726D44656661756C74080756697369626C650808 5461624F726465720207000A5452656374616E676C6500095374796C654E616D 65060F52656374616E676C65315374796C6505416C69676E0708436F6E74656E 747307436F726E6572730B07546F704C6566740A426F74746F6D4C656674000A 46696C6C2E436F6C6F7207097846463230323132330748697454657374080A53 697A652E576964746805000000000000008004400B53697A652E486569676874 05000000000000008004401453697A652E506C6174666F726D44656661756C74 080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500000000 000000C0014007595261646975730500000000000000C00140000F54436F6C6F 72416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D 6174696F6E315374796C65084475726174696F6E0500000000006F1283F53F0C 50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172745661 6C756507097846463230323132330953746F7056616C75650709784646353235 3435380754726967676572061049734D6F7573654F7665723D747275650E5472 6967676572496E7665727365061149734D6F7573654F7665723D66616C736500 00000654476C79706800095374796C654E616D65060A676C7970687374796C65 0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E 526967687405000000000000008000400E4D617267696E732E426F74746F6D05 0000000000000080004005416C69676E070643656E7465720A53697A652E5769 6474680500000000000000C003400B53697A652E486569676874050000000000 0000C003401453697A652E506C6174666F726D44656661756C74080A496D6167 65496E6465780202000E5446696C6C52474245666665637400095374796C654E 616D65061346696C6C524742456666656374315374796C6505436F6C6F720709 784646443944394533000000005450463007544C61796F757400095374796C65 4E616D65061B627574746F6E7374796C655F636C6561726D696E695F72696768 7405416C69676E070643656E7465720A53697A652E5769647468050000000000 00008004400B53697A652E48656967687405000000000000008004401453697A 652E506C6174666F726D44656661756C74080756697369626C6508085461624F 726465720206000654476C79706800095374796C654E616D65060A676C797068 7374796C650B4D617267696E732E546F7005000000000000008000400D4D6172 67696E732E526967687405000000000000008000400E4D617267696E732E426F 74746F6D050000000000000080004005416C69676E070643656E7465720A5369 7A652E57696474680500000000000000C003400B53697A652E48656967687405 00000000000000C003401453697A652E506C6174666F726D44656661756C7408 0A496D616765496E6465780202000E5446696C6C524742456666656374000953 74796C654E616D65061346696C6C524742456666656374315374796C6505436F 6C6F7207097846464439443945330000000A5452656374616E676C6500095374 796C654E616D65060F52656374616E676C65315374796C6505416C69676E0708 436F6E74656E747307436F726E6572730B08546F7052696768740B426F74746F 6D5269676874000A46696C6C2E436F6C6F720709784646323032313233074869 7454657374080A53697A652E576964746805000000000000008004400B53697A 652E48656967687405000000000000008004401453697A652E506C6174666F72 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164 6975730500000000000000C0014007595261646975730500000000000000C001 40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65061443 6F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05000000 00006F1283F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72 0A537461727456616C756507097846463230323132330953746F7056616C7565 07097846463532353435380754726967676572061049734D6F7573654F766572 3D747275650E54726967676572496E7665727365061149734D6F7573654F7665 723D66616C7365000000005450463007544C61796F757400095374796C654E61 6D65060F6D656D6F7374796C655F636C65617205416C69676E070643656E7465 720A53697A652E57696474680500000000000000F406400B53697A652E486569 67687405000000000000009908401453697A652E506C6174666F726D44656661 756C74080756697369626C6508085461624F72646572022D000C544272757368 4F626A65637400095374796C654E616D65060A666F726567726F756E640B4272 7573682E436F6C6F720708636C61426C61636B00000C5442727573684F626A65 637400095374796C654E616D65060973656C656374696F6E0B42727573682E43 6F6C6F72070978363431463230323700000B54466F6E744F626A656374000953 74796C654E616D650604666F6E74000007544C61796F757400095374796C654E 616D650607636F6E74656E7405416C69676E0706436C69656E740C4D61726769 6E732E4C6566740500000000000000A001400D4D617267696E732E5269676874 0500000000000000A001400A53697A652E57696474680500000000000000E206 400B53697A652E48656967687405000000000000009708401453697A652E506C 6174666F726D44656661756C7408085461624F72646572020000000A54536372 6F6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C 69676E0705526967687406437572736F72070763724172726F770B536D616C6C 4368616E676505000000000000000000000B4F7269656E746174696F6E070856 6572746963616C0A506F736974696F6E2E580500000000000000EC06400A5369 7A652E576964746805000000000000008002400B53697A652E48656967687405 000000000000009708401453697A652E506C6174666F726D44656661756C7408 085461624F72646572020100000A545363726F6C6C42617200095374796C654E 616D65060A687363726F6C6C62617205416C69676E0706426F74746F6D064375 72736F72070763724172726F770B536D616C6C4368616E676505000000000000 000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F73 6974696F6E2E5905000000000000009708400A53697A652E5769647468050000 0000000000F406400B53697A652E486569676874050000000000000080024014 53697A652E506C6174666F726D44656661756C7408085461624F726465720202 000007544C61796F75740005416C69676E0706436C69656E740A53697A652E57 696474680500000000000000EC06400B53697A652E4865696768740500000000 0000009708401453697A652E506C6174666F726D44656661756C740808546162 4F726465720203000F54536D616C6C5363726F6C6C42617200095374796C654E 616D65060F76736D616C6C7363726F6C6C62617205416C69676E070552696768 7406437572736F72070763724172726F770B536D616C6C4368616E6765050000 00000000000000000B4F7269656E746174696F6E0708566572746963616C0C4D 617267696E732E4C65667405000000000000008000400A53697A652E57696474 6805000000000000008002400B53697A652E4865696768740500000000000000 8002401453697A652E506C6174666F726D44656661756C74080756697369626C 650800000F54536D616C6C5363726F6C6C42617200095374796C654E616D6506 0F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0643 7572736F72070763724172726F770B536D616C6C4368616E6765050000000000 00000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D61 7267696E732E546F7005000000000000008000400A53697A652E576964746805 000000000000009606400B53697A652E48656967687405000000000000008002 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 000000005450463007544C61796F757400095374796C654E616D650610627574 746F6E7374796C655F69636F6E05416C69676E070643656E7465720C50616464 696E672E4C65667405000000000000008001400B50616464696E672E546F7005 000000000000008001400D50616464696E672E52696768740500000000000000 8001400E50616464696E672E426F74746F6D05000000000000008001400A5369 7A652E57696474680500000000000000B804400B53697A652E48656967687405 00000000000000B804401453697A652E506C6174666F726D44656661756C7408 0756697369626C6508085461624F726465720201000A5452656374616E676C65 00095374796C654E616D65060F52656374616E676C65315374796C6505416C69 676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978303032413242 33320748697454657374080A53697A652E57696474680500000000000000B804 400B53697A652E4865696768740500000000000000B804401453697A652E506C 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 07585261646975730500000000000000C0014007595261646975730500000000 000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61 6D6506046F766572084475726174696F6E0500000000006F1283F53F0C50726F 70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565 07097830303241324233320953746F7056616C75650709784646324132423332 0754726967676572061049734D6F7573654F7665723D747275650E5472696767 6572496E7665727365061149734D6F7573654F7665723D66616C736500000006 54476C79706800095374796C654E616D65060A676C7970687374796C6505416C 69676E070643656E7465720A53697A652E57696474680500000000000000A003 400B53697A652E4865696768740500000000000000A003401453697A652E506C 6174666F726D44656661756C74080A496D616765496E646578020E000E544669 6C6C52474245666665637400095374796C654E616D65061346696C6C52474245 6666656374315374796C6505436F6C6F72070978464644394439453300000000 5450463007544C61796F757400095374796C654E616D650617627574746F6E73 74796C655F6D656E75627574746F6E7305416C69676E070643656E7465720A53 697A652E57696474680500000000000000F406400B53697A652E486569676874 0500000000000000B004401453697A652E506C6174666F726D44656661756C74 080756697369626C6508085461624F726465720202000A5452656374616E676C 6500095374796C654E616D65060F52656374616E676C65315374796C6505416C 69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783030464646 4646460748697454657374080A53697A652E57696474680500000000000000F4 06400B53697A652E4865696768740500000000000000B004401453697A652E50 6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E 65000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F 766572084475726174696F6E0500000000006F1283F53F0C50726F7065727479 4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709783030 4646464646460953746F7056616C756507097831454646464646460754726967 676572061049734D6F7573654F7665723D747275650E54726967676572496E76 65727365061149734D6F7573654F7665723D66616C73650000000654476C7970 6800095374796C654E616D65060A676C7970687374796C6505416C69676E0706 43656E7465720A53697A652E576964746805000000000000008003400B53697A 652E48656967687405000000000000008003401453697A652E506C6174666F72 6D44656661756C74080A496D616765496E6465780210000E5446696C6C524742 45666665637400095374796C654E616D65061346696C6C524742456666656374 315374796C6505436F6C6F720709784646443944394533000000005450463007 544C61796F757400095374796C654E616D650611627574746F6E7374796C655F 726574727905416C69676E070643656E7465720C50616464696E672E4C656674 0500000000000000C002400B50616464696E672E546F70050000000000000080 02400D50616464696E672E52696768740500000000000000C002400E50616464 696E672E426F74746F6D05000000000000008002400A53697A652E5769647468 0500000000000000F406400B53697A652E486569676874050000000000000098 04401453697A652E506C6174666F726D44656661756C74080756697369626C65 08085461624F72646572020E000A5452656374616E676C6500095374796C654E 616D65060F52656374616E676C65315374796C6505416C69676E0708436F6E74 656E74730A46696C6C2E436F6C6F720709784646333433353431074869745465 7374080A53697A652E57696474680500000000000000F406400B53697A652E48 656967687405000000000000009804401453697A652E506C6174666F726D4465 6661756C74080C5374726F6B652E436F6C6F7207097846463536353836390758 5261646975730500000000000000C00140075952616469757305000000000000 00C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65 0614436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05 00000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F 6C6F720A537461727456616C756507097846463334333534310953746F705661 6C756507097846463431343034450754726967676572061049734D6F7573654F 7665723D747275650E54726967676572496E7665727365061149734D6F757365 4F7665723D66616C73650000001654427574746F6E5374796C65546578744F62 6A65637400095374796C654E616D6506047465787405416C69676E0706436C69 656E74064C6F636B6564090A53697A652E57696474680500000000000000CA06 400B53697A652E4865696768740500000000000000B003401453697A652E506C 6174666F726D44656661756C7408165465787453657474696E67732E466F6E74 2E53697A650500000000000000E00240165465787453657474696E67732E466F 6E74436F6C6F720708636C615768697465155465787453657474696E67732E54 72696D6D696E670709436861726163746572155465787453657474696E67732E 576F72645772617008165465787453657474696E67732E486F727A416C69676E 07074C656164696E670D536861646F7756697369626C650808486F74436F6C6F 720708636C6157686974650C466F6375736564436F6C6F720708636C61576869 74650B4E6F726D616C436F6C6F720708636C6157686974650C50726573736564 436F6C6F720708636C615768697465000005545061746800095374796C654E61 6D65060A50617468315374796C6505416C69676E07044C65667409446174612E 506174680A0C04000056000000000000007E466F415A8BFF40010000003A2371 414DDBFF4002000000EBE27941282C01410200000038F87F41EB450941020000 00F5B97E419205124102000000EEEB7A41D6C52C4102000000B1BF6E419CA245 4102000000B6F35B41E10B59410200000052274941BC746C41020000002DB230 41BA6B79410200000070141641E4147E410200000091EDF640075F8141020000 00971CC0405DDC7E4102000000DA8F8F40F4FD724102000000917E71407F6A6D 410200000084BB4740A83566410200000053052340C1A85D41010000009582DA 3FCE196B4102000000B9DF893F492E75410200000000008027A60A6E41020000 000000802786C95F410100000000008027EBFF1F410100000096267F40EBFF1F 41020000008C159C40EBFF1F4102000000925CAA40CD3B314102000000DB3396 4048503B41010000003D9B7D40470347410200000074298C40F0164D41020000 00BC3F9B40FB3A52410200000008ACAB40AB3E564102000000A015D04046255F 41020000004D32F940560E624102000000678F1041C58F5E4102000000888524 41CB105B410200000098DD3641A85751410200000094F64441B4C84241020000 00F90F5341C13934410200000027315C41AF94214102000000780B5F4123840D 4102000000234A604187C4044102000000F16368414A5EFD40020000003A2371 414DDBFF40010000007E466F415A8BFF40030000007E466F415A8BFF40000000 001D383841321F503F020000007AA5434155C1943F02000000371A4E41D786CE 3F02000000F54A5741098A094001000000B8AF644152EDA73F0200000033C46E 41FF942E3F02000000000080419066903F0200000000008041F4370140010000 00000080411500C04001000000D34D40411500C04002000000B30C32411500C0 400200000010E92A4127889D40020000008BFD3441855F8940010000007AA540 414B1F64400200000088F43941CFBD4B40020000002C653241B81E3740020000 00302A2A41D10527400200000030F517413C6B034002000000DA660341008CEF 3F0200000033E1DE4094C1054002000000B2F4B640FDBC134002000000BB4492 408CA13A400200000007256C4005DD7440020000006EC033402A8C9740020000 00B83B0F400AD7BC4002000000F6D10340BAF7E44002000000E2AFFD3FF376F6 4002000000C6E1BC3FDB50014102000000A3C96D3F5A12004102000000569FC3 3EB1A7FD4002000000FE3FF33A2A74ED4002000000FB0CA33DDCF4DB40020000 00F180A23E0074A64002000000CD018A3FE275694002000000A53110404ED11B 400200000063625B4075599C3F02000000D09B9E40098BD23E020000001FD7D3 408596F53D02000000378904414A7F2FBE02000000B4F11F41A3DA913D020000 001D383841321F503F030000001D383841321F503F0A46696C6C2E436F6C6F72 07097846464439443945330748697454657374080D4D617267696E732E526967 68740500000000000000C001400A506F736974696F6E2E580500000000000000 C002400A506F736974696F6E2E5905000000000000008002400A53697A652E57 696474680500000000000000C002400B53697A652E4865696768740500000000 000000B003401453697A652E506C6174666F726D44656661756C74080B537472 6F6B652E4B696E6407044E6F6E6508577261704D6F6465070346697400000054 50463007544C61796F757400095374796C654E616D650611616E69696E646963 61746F727374796C6505416C69676E070643656E7465720756697369626C6508 085461624F726465720259001054536B416E696D61746564496D616765000953 74796C654E616D650604616E696D05416C69676E070643656E74657207536361 6C652E58050000000000CDCCCCFF3F075363616C652E59050000000000CDCCCC FF3F12416E696D6174696F6E2E50726F67726573730500A8C64B378941A0FC3F 04446174610A580A00007B226E6D223A226C6F6164696E675F36222C22646464 223A302C2268223A3530302C2277223A3530302C226D657461223A7B2267223A 22406C6F7474696566696C65732F746F6F6C6B69742D6A7320302E32362E3122 7D2C226C6179657273223A5B7B227479223A342C226E6D223A22536861706520 4C617965722032222C227372223A312C227374223A302C226F70223A3330302C 226970223A302C226864223A66616C73652C22646464223A302C22626D223A30 2C226861734D61736B223A66616C73652C22616F223A302C226B73223A7B2261 223A7B2261223A302C226B223A5B302C302C305D2C226978223A317D2C227322 3A7B2261223A302C226B223A5B35302C35302C3130305D2C226978223A367D2C 22736B223A7B2261223A302C226B223A307D2C2270223A7B2261223A302C226B 223A5B3235302C3235302C305D2C226978223A327D2C2272223A7B2261223A31 2C226B223A5B7B226F223A7B2278223A302E3136372C2279223A302E3136377D 2C2269223A7B2278223A302E3833332C2279223A302E3833337D2C2273223A5B 305D2C2274223A307D2C7B2273223A5B3336305D2C2274223A36307D5D2C2269 78223A31307D2C227361223A7B2261223A302C226B223A307D2C226F223A7B22 61223A302C226B223A3130302C226978223A31317D7D2C226566223A5B5D2C22 736861706573223A5B7B227479223A226772222C22626D223A302C226864223A 66616C73652C226D6E223A224144424520566563746F722047726F7570222C22 6E6D223A22456C6C697073652031222C226978223A312C22636978223A322C22 6E70223A332C226974223A5B7B227479223A22656C222C22626D223A302C2268 64223A66616C73652C226D6E223A224144424520566563746F72205368617065 202D20456C6C69707365222C226E6D223A22456C6C6970736520506174682031 222C2264223A312C2270223A7B2261223A302C226B223A5B302C305D2C226978 223A337D2C2273223A7B2261223A302C226B223A5B3330302C3330305D2C2269 78223A327D7D2C7B227479223A227374222C22626D223A302C226864223A6661 6C73652C226D6E223A224144424520566563746F722047726170686963202D20 5374726F6B65222C226E6D223A225374726F6B652031222C226C63223A322C22 6C6A223A312C226D6C223A342C226F223A7B2261223A302C226B223A3130302C 226978223A347D2C2277223A7B2261223A302C226B223A35302C226978223A35 7D2C2263223A7B2261223A302C226B223A5B302E363632372C302E363734352C 302E363934315D2C226978223A337D7D2C7B227479223A227472222C2261223A 7B2261223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261 223A302C226B223A5B3130302C3130305D2C226978223A337D2C22736B223A7B 2261223A302C226B223A302C226978223A347D2C2270223A7B2261223A302C22 6B223A5B302C305D2C226978223A327D2C2272223A7B2261223A302C226B223A 302C226978223A367D2C227361223A7B2261223A302C226B223A302C22697822 3A357D2C226F223A7B2261223A302C226B223A3130302C226978223A377D7D5D 7D2C7B227479223A22746D222C22626D223A302C226864223A66616C73652C22 6D6E223A224144424520566563746F722046696C746572202D205472696D222C 226E6D223A225472696D2050617468732031222C226978223A322C2265223A7B 2261223A312C226B223A5B7B226F223A7B2278223A302E3333332C2279223A30 7D2C2269223A7B2278223A302E3636372C2279223A317D2C2273223A5B315D2C 2274223A307D2C7B2273223A5B3130305D2C2274223A35307D5D2C226978223A 327D2C226F223A7B2261223A312C226B223A5B7B226F223A7B2278223A302E31 36372C2279223A302E3136377D2C2269223A7B2278223A302E3833332C227922 3A302E3833337D2C2273223A5B305D2C2274223A307D2C7B2273223A5B335D2C 2274223A36307D5D2C226978223A337D2C2273223A7B2261223A312C226B223A 5B7B226F223A7B2278223A302E3333332C2279223A307D2C2269223A7B227822 3A302E3636372C2279223A317D2C2273223A5B305D2C2274223A31307D2C7B22 73223A5B39395D2C2274223A36307D5D2C226978223A317D2C226D223A317D5D 2C22696E64223A317D2C7B227479223A342C226E6D223A225368617065204C61 7965722031222C227372223A312C227374223A302C226F70223A3330302C2269 70223A302C226864223A66616C73652C22646464223A302C22626D223A302C22 6861734D61736B223A66616C73652C22616F223A302C226B73223A7B2261223A 7B2261223A302C226B223A5B302C302C305D2C226978223A317D2C2273223A7B 2261223A302C226B223A5B35302C35302C3130305D2C226978223A367D2C2273 6B223A7B2261223A302C226B223A307D2C2270223A7B2261223A302C226B223A 5B3235302C3235302C305D2C226978223A327D2C2272223A7B2261223A302C22 6B223A302C226978223A31307D2C227361223A7B2261223A302C226B223A307D 2C226F223A7B2261223A302C226B223A33302C226978223A31317D7D2C226566 223A5B5D2C22736861706573223A5B7B227479223A226772222C22626D223A30 2C226864223A66616C73652C226D6E223A224144424520566563746F72204772 6F7570222C226E6D223A22456C6C697073652031222C226978223A312C226369 78223A322C226E70223A332C226974223A5B7B227479223A22656C222C22626D 223A302C226864223A66616C73652C226D6E223A224144424520566563746F72 205368617065202D20456C6C69707365222C226E6D223A22456C6C6970736520 506174682031222C2264223A312C2270223A7B2261223A302C226B223A5B302C 305D2C226978223A337D2C2273223A7B2261223A302C226B223A5B3330302C33 30305D2C226978223A327D7D2C7B227479223A227374222C22626D223A302C22 6864223A66616C73652C226D6E223A224144424520566563746F722047726170 686963202D205374726F6B65222C226E6D223A225374726F6B652031222C226C 63223A312C226C6A223A312C226D6C223A342C226F223A7B2261223A302C226B 223A3130302C226978223A347D2C2277223A7B2261223A302C226B223A35302C 226978223A357D2C2263223A7B2261223A302C226B223A5B302E393235352C30 2E393235352C302E393235355D2C226978223A337D7D2C7B227479223A227472 222C2261223A7B2261223A302C226B223A5B302C305D2C226978223A317D2C22 73223A7B2261223A302C226B223A5B3130302C3130305D2C226978223A337D2C 22736B223A7B2261223A302C226B223A302C226978223A347D2C2270223A7B22 61223A302C226B223A5B302C305D2C226978223A327D2C2272223A7B2261223A 302C226B223A302C226978223A367D2C227361223A7B2261223A302C226B223A 302C226978223A357D2C226F223A7B2261223A302C226B223A3130302C226978 223A377D7D5D7D5D2C22696E64223A327D5D2C2276223A22352E382E31222C22 6672223A33302C226F70223A36302C226970223A302C22617373657473223A5B 5D7D00000F54466C6F6174416E696D6174696F6E00095374796C654E616D6506 03616E69084475726174696F6E050000000000CDCCCCFC3F0A53746172745661 6C756505000000000000000000000953746F7056616C75650500000000000000 0000000000005450463007544C61796F757400095374796C654E616D6506156C 697374626F786974656D7374796C655F66756E6305416C69676E070643656E74 65720C50616464696E672E4C65667405000000000000008001400B5061646469 6E672E546F7005000000000000008001400D50616464696E672E526967687405 000000000000008001400E50616464696E672E426F74746F6D05000000000000 008001400A53697A652E57696474680500000000000000C007400B53697A652E 4865696768740500000000000000C804401453697A652E506C6174666F726D44 656661756C74080756697369626C6508085461624F7264657202180B46697865 64486569676874021E000A5452656374616E676C6500095374796C654E616D65 060F6261636B67726F756E645F6F76657205416C69676E0708436F6E74656E74 730A46696C6C2E436F6C6F720709783030343738364646074869745465737408 0A53697A652E57696474680500000000000000C007400B53697A652E48656967 68740500000000000000C804401453697A652E506C6174666F726D4465666175 6C74080C5374726F6B652E436F6C6F7207097830303437383646460758526164 6975730500000000000000C0014007595261646975730500000000000000C001 40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F 766572084475726174696F6E05000000000000000000000C50726F7065727479 4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709783030 3639364136440953746F7056616C756507097842343639364136440754726967 676572060F497353656C65637465643D747275650E54726967676572496E7665 7273650610497353656C65637465643D66616C73650000000654476C79706800 095374796C654E616D65060A676C7970687374796C650C4D617267696E732E4C 65667405000000000000008000400B4D617267696E732E546F70050000000000 000080FF3F0D4D617267696E732E526967687405000000000000008000400E4D 617267696E732E426F74746F6D050000000000000080FF3F05416C69676E0704 4C6566740A506F736974696F6E2E5805000000000000008000400A506F736974 696F6E2E59050000000000000080FF3F0A53697A652E57696474680500000000 0000008003400B53697A652E4865696768740500000000000000880440145369 7A652E506C6174666F726D44656661756C740800001654416374697665537479 6C65546578744F626A65637400095374796C654E616D65060664657461696C05 416C69676E0706426F74746F6D0C4D617267696E732E4C656674050000000000 0000C001400B4D617267696E732E546F70050000000000000080FF3F0D4D6172 67696E732E52696768740500000000000000C001400E4D617267696E732E426F 74746F6D050000000000000080FF3F0A506F736974696F6E2E58050000000000 0000A002400A506F736974696F6E2E590500000000000000B003400A53697A65 2E57696474680500000000000000B607400B53697A652E486569676874050000 0000000000B803401453697A652E506C6174666F726D44656661756C74080454 657874060454657874165465787453657474696E67732E466F6E742E53697A65 0500000000000000E00240165465787453657474696E67732E466F6E74436F6C 6F720709783634464646464646155465787453657474696E67732E576F726457 72617008165465787453657474696E67732E486F727A416C69676E07074C6561 64696E670D536861646F7756697369626C65080D416374697665547269676765 72070853656C65637465640B416374697665436F6C6F720708636C6157686974 6500000954436865636B426F7800095374796C654E616D650605636865636B05 416C69676E07044C6566740843616E466F637573081244697361626C65466F63 7573456666656374090C4D617267696E732E4C65667405000000000000008001 400A506F736974696F6E2E5805000000000000008001400A53697A652E576964 74680500000000000000A003400B53697A652E48656967687405000000000000 009004401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508000007544C61796F757400095374796C654E616D65060D616363657373 6F72796D6F726505416C69676E07094D6F737452696768740A53697A652E5769 6474680500000000000000B003400B53697A652E486569676874050000000000 0000B004401453697A652E506C6174666F726D44656661756C74080756697369 626C65080012544163746976655374796C654F626A6563740005416C69676E07 0643656E7465720C536F757263654C6F6F6B7570061A57696E646F7773203130 204D6F6465726E7374796C652E706E670A53697A652E57696474680500000000 000000C002400B53697A652E4865696768740500000000000000800340145369 7A652E506C6174666F726D44656661756C740808577261704D6F646507064365 6E7465720D41637469766554726967676572070853656C65637465640A416374 6976654C696E6B0E010F536F75726365526563742E4C65667405000000000000 008B06400E536F75726365526563742E546F700500000000000000D405401053 6F75726365526563742E5269676874050000000000000097064011536F757263 65526563742E426F74746F6D0500000000000000F405400001055363616C6505 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 0000D006400E536F75726365526563742E546F7005000000000000009F064010 536F75726365526563742E52696768740500000000000000E2064011536F7572 6365526563742E426F74746F6D0500000000000000B706400001055363616C65 05000000000000008000400F536F75726365526563742E4C6566740500000000 0000008B07400E536F75726365526563742E546F700500000000000000D40640 10536F75726365526563742E5269676874050000000000000097074011536F75 726365526563742E426F74746F6D0500000000000000F406400001055363616C 650500000000000000C000400F536F75726365526563742E4C65667405000000 00000080D007400E536F75726365526563742E546F7005000000000000009F07 4010536F75726365526563742E52696768740500000000000080E2074011536F 75726365526563742E426F74746F6D0500000000000000B7074000000A536F75 7263654C696E6B0E010F536F75726365526563742E4C65667405000000000000 008B06400E536F75726365526563742E546F700500000000000000D405401053 6F75726365526563742E5269676874050000000000000097064011536F757263 65526563742E426F74746F6D0500000000000000F405400001055363616C6505 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 0000D006400E536F75726365526563742E546F7005000000000000009F064010 536F75726365526563742E52696768740500000000000000E2064011536F7572 6365526563742E426F74746F6D0500000000000000B706400001055363616C65 05000000000000008000400F536F75726365526563742E4C6566740500000000 0000008B07400E536F75726365526563742E546F700500000000000000D40640 10536F75726365526563742E5269676874050000000000000097074011536F75 726365526563742E426F74746F6D0500000000000000F406400001055363616C 650500000000000000C000400F536F75726365526563742E4C65667405000000 00000080D007400E536F75726365526563742E546F7005000000000000009F07 4010536F75726365526563742E52696768740500000000000080E2074011536F 75726365526563742E426F74746F6D0500000000000000B70740000013546F75 6368416E696D6174696F6E2E4C696E6B0E0000000007544C61796F7574000953 74796C654E616D6506126163636573736F7279636865636B6D61726B05416C69 676E07094D6F737452696768740A53697A652E57696474680500000000000000 B003400B53697A652E4865696768740500000000000000B004401453697A652E 506C6174666F726D44656661756C74080756697369626C650800125441637469 76655374796C654F626A6563740005416C69676E070643656E7465720C536F75 7263654C6F6F6B7570061A57696E646F7773203130204D6F6465726E7374796C 652E706E670A53697A652E576964746805000000000000009003400B53697A65 2E48656967687405000000000000009003401453697A652E506C6174666F726D 44656661756C740808577261704D6F6465070643656E7465720D416374697665 54726967676572070853656C65637465640A4163746976654C696E6B0E010F53 6F75726365526563742E4C65667405000000000000009B06400E536F75726365 526563742E546F700500000000000000D2054010536F75726365526563742E52 696768740500000000000000AD064011536F75726365526563742E426F74746F 6D0500000000000000F605400001055363616C650500000000000000C0FF3F0F 536F75726365526563742E4C6566740500000000000000E806400E536F757263 65526563742E546F7005000000000000009D064010536F75726365526563742E 5269676874050000000000008081074011536F75726365526563742E426F7474 6F6D0500000000000000B806400001055363616C650500000000000000800040 0F536F75726365526563742E4C65667405000000000000009B07400E536F7572 6365526563742E546F700500000000000000D2064010536F7572636552656374 2E52696768740500000000000000AD074011536F75726365526563742E426F74 746F6D0500000000000000F606400001055363616C650500000000000000C000 400F536F75726365526563742E4C6566740500000000000080E807400E536F75 726365526563742E546F7005000000000000809D074010536F75726365526563 742E526967687405000000000000C081084011536F75726365526563742E426F 74746F6D0500000000000080B8074000000A536F757263654C696E6B0E010F53 6F75726365526563742E4C65667405000000000000009B06400E536F75726365 526563742E546F700500000000000000D2054010536F75726365526563742E52 696768740500000000000000AD064011536F75726365526563742E426F74746F 6D0500000000000000F605400001055363616C650500000000000000C0FF3F0F 536F75726365526563742E4C6566740500000000000000E806400E536F757263 65526563742E546F7005000000000000009D064010536F75726365526563742E 5269676874050000000000008081074011536F75726365526563742E426F7474 6F6D0500000000000000B806400001055363616C650500000000000000800040 0F536F75726365526563742E4C65667405000000000000009B07400E536F7572 6365526563742E546F700500000000000000D2064010536F7572636552656374 2E52696768740500000000000000AD074011536F75726365526563742E426F74 746F6D0500000000000000F606400001055363616C650500000000000000C000 400F536F75726365526563742E4C6566740500000000000080E807400E536F75 726365526563742E546F7005000000000000809D074010536F75726365526563 742E526967687405000000000000C081084011536F75726365526563742E426F 74746F6D0500000000000080B80740000013546F756368416E696D6174696F6E 2E4C696E6B0E0000000007544C61796F757400095374796C654E616D65060F61 63636573736F727964657461696C05416C69676E07094D6F737452696768740A 53697A652E57696474680500000000000000B003400B53697A652E4865696768 740500000000000000B004401453697A652E506C6174666F726D44656661756C 74080756697369626C65080012544163746976655374796C654F626A65637400 05416C69676E070643656E7465720C536F757263654C6F6F6B7570061A57696E 646F7773203130204D6F6465726E7374796C652E706E670A53697A652E576964 746805000000000000008003400B53697A652E48656967687405000000000000 008003401453697A652E506C6174666F726D44656661756C740808577261704D 6F6465070643656E7465720D41637469766554726967676572070853656C6563 7465640A4163746976654C696E6B0E010F536F75726365526563742E4C656674 05000000000000808707400E536F75726365526563742E546F70050000000000 0000D4054010536F75726365526563742E526967687405000000000000808F07 4011536F75726365526563742E426F74746F6D0500000000000000F405400001 055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566 740500000000000000CB07400E536F75726365526563742E546F700500000000 0000009F064010536F75726365526563742E52696768740500000000000000D7 074011536F75726365526563742E426F74746F6D0500000000000000B7064000 01055363616C6505000000000000008000400F536F75726365526563742E4C65 667405000000000000808708400E536F75726365526563742E546F7005000000 00000000D4064010536F75726365526563742E52696768740500000000000080 8F084011536F75726365526563742E426F74746F6D0500000000000000F40640 0001055363616C650500000000000000C000400F536F75726365526563742E4C 6566740500000000000040CB08400E536F75726365526563742E546F70050000 00000000009F074010536F75726365526563742E526967687405000000000000 40D7084011536F75726365526563742E426F74746F6D0500000000000000B707 4000000A536F757263654C696E6B0E010F536F75726365526563742E4C656674 05000000000000808707400E536F75726365526563742E546F70050000000000 0000D4054010536F75726365526563742E526967687405000000000000808F07 4011536F75726365526563742E426F74746F6D0500000000000000F405400001 055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566 740500000000000000CB07400E536F75726365526563742E546F700500000000 0000009F064010536F75726365526563742E52696768740500000000000000D7 074011536F75726365526563742E426F74746F6D0500000000000000B7064000 01055363616C6505000000000000008000400F536F75726365526563742E4C65 667405000000000000808708400E536F75726365526563742E546F7005000000 00000000D4064010536F75726365526563742E52696768740500000000000080 8F084011536F75726365526563742E426F74746F6D0500000000000000F40640 0001055363616C650500000000000000C000400F536F75726365526563742E4C 6566740500000000000040CB08400E536F75726365526563742E546F70050000 00000000009F074010536F75726365526563742E526967687405000000000000 40D7084011536F75726365526563742E426F74746F6D0500000000000000B707 40000013546F756368416E696D6174696F6E2E4C696E6B0E0000000016544163 746976655374796C65546578744F626A65637400095374796C654E616D650604 7465787405416C69676E0706436C69656E740C4D617267696E732E4C65667405 00000000000000C000400B4D617267696E732E546F70050000000000000080FF 3F0D4D617267696E732E52696768740500000000000000C000400E4D61726769 6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805 00000000000000B907400B53697A652E4865696768740500000000000000F002 401453697A652E506C6174666F726D44656661756C7408165465787453657474 696E67732E466F6E742E53697A65050000000000000090034016546578745365 7474696E67732E466F6E74436F6C6F7207097839364646464646461554657874 53657474696E67732E576F72645772617008165465787453657474696E67732E 486F727A416C69676E07074C656164696E670D536861646F7756697369626C65 080D41637469766554726967676572070853656C65637465640B416374697665 436F6C6F720708636C6157686974650000005450463007544C61796F75740009 5374796C654E616D6506177472616E73706172656E746C697374626F78737479 6C6505416C69676E070643656E7465720C436C69704368696C6472656E090A53 697A652E576964746805000000000000208E07400B53697A652E486569676874 0500000000000080D206401453697A652E506C6174666F726D44656661756C74 080756697369626C6508085461624F726465720249000C5442727573684F626A 65637400095374796C654E616D650618416C7465726E6174696E67526F774261 636B67726F756E640B42727573682E436F6C6F72070978464646334633463300 0007544C61796F757400095374796C654E616D65060A6261636B67726F756E64 05416C69676E0708436F6E74656E74730A53697A652E57696474680500000000 0000208E07400B53697A652E4865696768740500000000000080D20640145369 7A652E506C6174666F726D44656661756C7408085461624F7264657202000007 544C61796F757400095374796C654E616D650607636F6E74656E7405416C6967 6E0706436C69656E740C436C69704368696C6472656E090A53697A652E576964 746805000000000000208A07400B53697A652E48656967687405000000000000 80CA06401453697A652E506C6174666F726D44656661756C7408085461624F72 646572020000000A545363726F6C6C42617200095374796C654E616D65060A76 7363726F6C6C62617205416C69676E070552696768740B536D616C6C4368616E 676505000000000000000000000B4F7269656E746174696F6E07085665727469 63616C0A506F736974696F6E2E5805000000000000208A07400A53697A652E57 6964746805000000000000008002400B53697A652E4865696768740500000000 000080CA06401453697A652E506C6174666F726D44656661756C740808546162 4F72646572020100000A545363726F6C6C42617200095374796C654E616D6506 0A687363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C43 68616E676505000000000000000000000B4F7269656E746174696F6E070A486F 72697A6F6E74616C0A506F736974696F6E2E590500000000000080CA06400A53 697A652E576964746805000000000000208E07400B53697A652E486569676874 05000000000000008002401453697A652E506C6174666F726D44656661756C74 08085461624F726465720202000007544C61796F75740005416C69676E070643 6C69656E740A53697A652E576964746805000000000000208A07400B53697A65 2E4865696768740500000000000080CA06401453697A652E506C6174666F726D 44656661756C7408085461624F726465720203000F54536D616C6C5363726F6C 6C42617200095374796C654E616D65060F76736D616C6C7363726F6C6C626172 05416C69676E070552696768740B536D616C6C4368616E676505000000000000 000000000B4F7269656E746174696F6E0708566572746963616C0C4D61726769 6E732E4C65667405000000000000008000400A53697A652E5769647468050000 00000000008002400B53697A652E486569676874050000000000000080024014 53697A652E506C6174666F726D44656661756C74080756697369626C65080000 0F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D 616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C 4368616E676505000000000000000000000B4F7269656E746174696F6E070A48 6F72697A6F6E74616C0B4D617267696E732E546F700500000000000000800040 0A53697A652E576964746805000000000000009606400B53697A652E48656967 687405000000000000008002401453697A652E506C6174666F726D4465666175 6C74080756697369626C650800000007544C61796F757400095374796C654E61 6D65060668656164657205416C69676E0703546F700A53697A652E5769647468 0500000000000000C804400B53697A652E4865696768740500000000000000C8 04401453697A652E506C6174666F726D44656661756C74080756697369626C65 08085461624F726465720204000007544C61796F757400095374796C654E616D 650606666F6F74657205416C69676E0706426F74746F6D0A53697A652E576964 74680500000000000000C804400B53697A652E48656967687405000000000000 00C804401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508085461624F72646572020500000A5452656374616E676C650009537479 6C654E616D65060973656C656374696F6E0946696C6C2E4B696E6407044E6F6E 650748697454657374080A53697A652E57696474680500000000000000C80440 0B53697A652E4865696768740500000000000000C804401453697A652E506C61 74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978333246 464646464607585261646975730500000000000000C001400759526164697573 0500000000000000C00140000000005450463007544C61796F75740009537479 6C654E616D650614627574746F6E7374796C655F636F6E74696E756505416C69 676E070643656E7465720C50616464696E672E4C6566740500000000000000C0 02400B50616464696E672E546F7005000000000000008002400D50616464696E 672E52696768740500000000000000C002400E50616464696E672E426F74746F 6D05000000000000008002400A53697A652E57696474680500000000000000F4 06400B53697A652E48656967687405000000000000009804401453697A652E50 6C6174666F726D44656661756C74080756697369626C6508085461624F726465 72020B000A5452656374616E676C6500095374796C654E616D65060F52656374 616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C6C 2E436F6C6F7207097846463130413337460748697454657374080A53697A652E 57696474680500000000000000F406400B53697A652E48656967687405000000 000000009804401453697A652E506C6174666F726D44656661756C74080B5374 726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000C0 014007595261646975730500000000000000C00140000F54436F6C6F72416E69 6D6174696F6E00095374796C654E616D650614436F6C6F72416E696D6174696F 6E315374796C65084475726174696F6E0500000000000AD7A3F83F0C50726F70 657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507 097846463130413337460953746F7056616C7565070978464630384241384507 54726967676572061049734D6F7573654F7665723D747275650E547269676765 72496E7665727365061149734D6F7573654F7665723D66616C73650000001654 427574746F6E5374796C65546578744F626A65637400095374796C654E616D65 06047465787405416C69676E0706436C69656E74064C6F636B6564090A53697A 652E57696474680500000000000000CA06400B53697A652E4865696768740500 000000000000B003401453697A652E506C6174666F726D44656661756C740816 5465787453657474696E67732E466F6E742E53697A650500000000000000E002 40165465787453657474696E67732E466F6E74436F6C6F720708636C61576869 7465155465787453657474696E67732E5472696D6D696E670709436861726163 746572155465787453657474696E67732E576F72645772617008165465787453 657474696E67732E486F727A416C69676E07074C656164696E670D536861646F 7756697369626C650808486F74436F6C6F720708636C6157686974650C466F63 75736564436F6C6F720708636C6157686974650B4E6F726D616C436F6C6F7207 08636C6157686974650C50726573736564436F6C6F720708636C615768697465 000005545061746800095374796C654E616D65060A50617468315374796C6505 416C69676E07044C65667409446174612E506174680AD8010000270000000000 0000D34D2E415A642340020000003A582A41DFCA03400200000016BB20419307 EE3F02000000B8D418412EDA064002000000CDBE1541CA090D4002000000143E 1341AC0C1740020000002DB211415964234001000000B4C806408B6C84410200 000068EFED3F116088410200000059C503405D2E8D4102000000876123407D28 8F4102000000BBB43140DA0D904102000000B3324240FC3E9041020000009899 51402DB28F41010000006666044195438441020000000F450B41124883410200 000004011041002480410200000000001041D122794101000000000010410000 30410200000000001041D729274102000000D829174100002041020000000000 2041000020410200000028D62841000020410200000000003041D72927410200 000000003041000030410100000000003041D1227941020000001CFF2F412424 8041020000002CBB34412C48834102000000DF993B41A043844101000000F0CC 85412BB08F4102000000500C8A4189E7904102000000397A8E4175728E410200 000097B18F4114338A4102000000A23E90418646884102000000EE0D9041FE36 86410200000019298F41966C84410100000032522E41B064234003000000D34D 2E415A64234003000000D34D2E415A6423400A46696C6C2E436F6C6F72070978 46464439443945330748697454657374080D4D617267696E732E526967687405 00000000000000C001400A506F736974696F6E2E580500000000000000C00240 0A506F736974696F6E2E5905000000000000008002400D526F746174696F6E41 6E676C650500000000000000B405400A53697A652E5769647468050000000000 0000C002400B53697A652E4865696768740500000000000000B003401453697A 652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704 4E6F6E6508577261704D6F646507034669740000005450463007544C61796F75 7400095374796C654E616D65060B627574746F6E7374796C6505416C69676E07 0643656E7465720C50616464696E672E4C6566740500000000000000C002400B 50616464696E672E546F7005000000000000008002400D50616464696E672E52 696768740500000000000000C002400E50616464696E672E426F74746F6D0500 0000000000008002400A53697A652E57696474680500000000000000F406400B 53697A652E48656967687405000000000000009804401453697A652E506C6174 666F726D44656661756C74080756697369626C6508085461624F72646572020D 000A5452656374616E676C6500095374796C654E616D65060F52656374616E67 6C65315374796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F 6C6F7207097846463334333534310748697454657374080A53697A652E576964 74680500000000000000F406400B53697A652E48656967687405000000000000 009804401453697A652E506C6174666F726D44656661756C74080C5374726F6B 652E436F6C6F7207097846463536353836390758526164697573050000000000 0000C0014007595261646975730500000000000000C00140000F54436F6C6F72 416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D61 74696F6E315374796C65084475726174696F6E0500000000000AD7A3F83F0C50 726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C 756507097846463334333534310953746F7056616C7565070978464634313430 34450754726967676572061049734D6F7573654F7665723D747275650E547269 67676572496E7665727365061149734D6F7573654F7665723D66616C73650000 001654427574746F6E5374796C65546578744F626A65637400095374796C654E 616D6506047465787405416C69676E0706436C69656E74064C6F636B6564090A 53697A652E57696474680500000000000000DC06400B53697A652E4865696768 740500000000000000B003401453697A652E506C6174666F726D44656661756C 7408165465787453657474696E67732E466F6E742E53697A6505000000000000 00E00240165465787453657474696E67732E466F6E74436F6C6F720708636C61 5768697465155465787453657474696E67732E5472696D6D696E670709436861 726163746572155465787453657474696E67732E576F72645772617008165465 787453657474696E67732E486F727A416C69676E07074C656164696E670D5368 61646F7756697369626C650808486F74436F6C6F720708636C6157686974650C 466F6375736564436F6C6F720708636C6157686974650B4E6F726D616C436F6C 6F720708636C6157686974650C50726573736564436F6C6F720708636C615768 69746500000654476C79706800095374796C654E616D650605676C7970680D4D 617267696E732E52696768740500000000000000C0014005416C69676E07044C 6566740A506F736974696F6E2E580500000000000000C002400A506F73697469 6F6E2E5905000000000000008002400A53697A652E5769647468050000000000 00008003400B53697A652E4865696768740500000000000000B003401453697A 652E506C6174666F726D44656661756C74080000005450463007544C61796F75 7400095374796C654E616D650619627574746F6E7374796C655F696D706F7274 5F6578706F727405416C69676E070643656E7465720C50616464696E672E4C65 66740500000000000000C002400B50616464696E672E546F7005000000000000 008002400D50616464696E672E52696768740500000000000000C002400E5061 6464696E672E426F74746F6D05000000000000008002400A53697A652E576964 74680500000000000000F406400B53697A652E48656967687405000000000000 009804401453697A652E506C6174666F726D44656661756C7408075669736962 6C6508085461624F72646572020C000A5452656374616E676C6500095374796C 654E616D65060F52656374616E676C65315374796C6505416C69676E0708436F 6E74656E74730A46696C6C2E436F6C6F72070978464633343335343107486974 54657374080A53697A652E57696474680500000000000000F406400B53697A65 2E48656967687405000000000000009804401453697A652E506C6174666F726D 44656661756C74080C5374726F6B652E436F6C6F720709784646353635383639 07585261646975730500000000000000C0014007595261646975730500000000 000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61 6D650614436F6C6F72416E696D6174696F6E315374796C65084475726174696F 6E0500000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E 436F6C6F720A537461727456616C756507097846463334333534310953746F70 56616C756507097846463431343034450754726967676572061049734D6F7573 654F7665723D747275650E54726967676572496E7665727365061149734D6F75 73654F7665723D66616C73650000001654427574746F6E5374796C6554657874 4F626A65637400095374796C654E616D6506047465787405416C69676E070643 6C69656E74064C6F636B6564090A53697A652E57696474680500000000000000 C606400B53697A652E4865696768740500000000000000B003401453697A652E 506C6174666F726D44656661756C7408165465787453657474696E67732E466F 6E742E53697A650500000000000000E00240165465787453657474696E67732E 466F6E74436F6C6F720708636C615768697465155465787453657474696E6773 2E5472696D6D696E670709436861726163746572155465787453657474696E67 732E576F72645772617008165465787453657474696E67732E486F727A416C69 676E07074C656164696E670D536861646F7756697369626C650808486F74436F 6C6F720708636C6157686974650C466F6375736564436F6C6F720708636C6157 686974650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373 6564436F6C6F720708636C61576869746500000654476C79706800095374796C 654E616D650605676C7970680D4D617267696E732E5269676874050000000000 0000C0014005416C69676E07044C6566740A506F736974696F6E2E5805000000 00000000C002400A506F736974696F6E2E5905000000000000008002400A5369 7A652E576964746805000000000000008003400B53697A652E48656967687405 00000000000000B003401453697A652E506C6174666F726D44656661756C7408 000005545061746800095374796C654E616D65060A50617468315374796C6505 416C69676E07044C65667409446174612E506174680AAC0000000E0000000000 000000006041CCFFCF41010000000000A040E6FF0B420100000000006041E6FF 2F42000000000000A04080080C42010000000000B44180080C42000000000000 0842000090410100000000002C420000D8410100000000000842000010420000 000000002C423411D841010000000000CC413411D84100000000000090400000 C04101000000000090400000F0400100000000002E420000F040010000000000 2E42000070410946696C6C2E4B696E6407044E6F6E650748697454657374080D 4D617267696E732E52696768740500000000000000C001400A506F736974696F 6E2E580500000000000000C002400A506F736974696F6E2E5905000000000000 008002400D526F746174696F6E416E676C650500000000000000B405400A5369 7A652E576964746805000000000000008003400B53697A652E48656967687405 00000000000000B003401453697A652E506C6174666F726D44656661756C7408 0C5374726F6B652E436F6C6F720709784646443944394533105374726F6B652E 546869636B6E6573730500000000003333B3FF3F08577261704D6F6465070346 69740000005450463007544C61796F757400095374796C654E616D6506137261 64696F627574746F6E7374796C655F6D6405416C69676E070643656E7465720A 53697A652E57696474680500000000000000F005400B53697A652E4865696768 740500000000000000A003401453697A652E506C6174666F726D44656661756C 74080756697369626C6508085461624F72646572022F0007544C61796F757400 05416C69676E07044C6566740A53697A652E57696474680500000000000000A0 03400B53697A652E4865696768740500000000000000A003401453697A652E50 6C6174666F726D44656661756C7408000754436972636C6500095374796C654E 616D65060A6261636B67726F756E6405416C69676E070643656E746572094669 6C6C2E4B696E6407044E6F6E650748697454657374080C50616464696E672E4C 6566740500000000000000A001400B50616464696E672E546F70050000000000 0000A001400D50616464696E672E52696768740500000000000000A001400E50 616464696E672E426F74746F6D0500000000000000A001400A53697A652E5769 6474680500000000000000A003400B53697A652E486569676874050000000000 0000A003401453697A652E506C6174666F726D44656661756C74080C5374726F 6B652E436F6C6F720709784646333433353431105374726F6B652E546869636B 6E6573730500000000000000800040000754436972636C6500095374796C654E 616D650605636865636B05416C69676E0706436C69656E740A46696C6C2E436F 6C6F720709784646414341434245074869745465737408074F70616369747905 000000000000000000000A53697A652E57696474680500000000000000A00240 0B53697A652E4865696768740500000000000000A002401453697A652E506C61 74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500 0F54466C6F6174416E696D6174696F6E00095374796C654E616D6506076F7061 63697479084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274 794E616D6506074F7061636974790A537461727456616C756505000000000000 000000000953746F7056616C7565050000000000000080FF3F07547269676765 72060E4973436865636B65643D747275650E54726967676572496E7665727365 060F4973436865636B65643D66616C73650000000F54436F6C6F72416E696D61 74696F6E00095374796C654E616D6506067374726F6B65084475726174696F6E 050000000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F6B65 2E436F6C6F720A537461727456616C756507097846463334333534310953746F 7056616C756507097846464143414342450754726967676572060E4973436865 636B65643D747275650E54726967676572496E7665727365060F497343686563 6B65643D66616C7365000000001654427574746F6E5374796C65546578744F62 6A65637400095374796C654E616D6506047465787405416C69676E0706436C69 656E74064C6F636B6564090C4D617267696E732E4C6566740500000000000000 A002400A53697A652E57696474680500000000000000B405400B53697A652E48 65696768740500000000000000A003401453697A652E506C6174666F726D4465 6661756C7408185465787453657474696E67732E466F6E742E46616D696C7906 06526F626F746F165465787453657474696E67732E466F6E74436F6C6F720708 636C6157686974650D536861646F7756697369626C650808486F74436F6C6F72 0708636C6157686974650C466F6375736564436F6C6F720708636C6157686974 650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373656443 6F6C6F720708636C6157686974650000005450463007544C61796F7574000953 74796C654E616D650615627574746F6E7374796C655F636C6561726D696E6905 416C69676E070643656E7465720A53697A652E57696474680500000000000000 8004400B53697A652E48656967687405000000000000008004401453697A652E 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 65720208000A5452656374616E676C6500095374796C654E616D65060F526563 74616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C 6C2E436F6C6F7207097830303230323132330748697454657374080A53697A65 2E576964746805000000000000008004400B53697A652E486569676874050000 00000000008004401453697A652E506C6174666F726D44656661756C74080B53 74726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000 C0014007595261646975730500000000000000C00140000F54436F6C6F72416E 696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D617469 6F6E315374796C65084475726174696F6E0500000000006F1283F53F0C50726F 70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565 07097830303230323132330953746F7056616C75650709784646323032313233 0754726967676572061049734D6F7573654F7665723D747275650E5472696767 6572496E7665727365061149734D6F7573654F7665723D66616C736500000006 54476C79706800095374796C654E616D65060A676C7970687374796C650C4D61 7267696E732E4C65667405000000000000008000400B4D617267696E732E546F 7005000000000000008000400D4D617267696E732E5269676874050000000000 00008000400E4D617267696E732E426F74746F6D050000000000000080004005 416C69676E070643656E7465720A53697A652E57696474680500000000000000 C003400B53697A652E4865696768740500000000000000C003401453697A652E 506C6174666F726D44656661756C74080A496D616765496E6465780202000E54 46696C6C52474245666665637400095374796C654E616D65061346696C6C5247 42456666656374315374796C6505436F6C6F7207097846464439443945330000 0000545046300A5452656374616E676C6500095374796C654E616D65060F6261 636B67726F756E647374796C6505416C69676E070643656E7465720A46696C6C 2E436F6C6F7207097846463230323132330A53697A652E576964746805000000 00000000C804400B53697A652E4865696768740500000000000000C804401453 697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64 07044E6F6E650756697369626C65080000} end item Platform = 'iOS' ResourcesBin = { 464D585F5354594C4520322E3501060F6D656D6F7374796C655F636C65617203 8807060E6D656D6F7374796C655F636F646503E30806106D656D6F7374796C65 5F6E6F726D616C03300A06176C65667473656C656374696F6E706F696E747374 796C6503C5010618726967687473656C656374696F6E706F696E747374796C65 039B01005450463007544C61796F757400095374796C654E616D65060F6D656D 6F7374796C655F636C65617205416C69676E070643656E7465720A53697A652E 57696474680500000000000000F406400B53697A652E48656967687405000000 000000009908401453697A652E506C6174666F726D44656661756C7408075669 7369626C6508085461624F726465720228000C5442727573684F626A65637400 095374796C654E616D65060A666F726567726F756E640B42727573682E436F6C 6F720708636C61426C61636B00000C5442727573684F626A6563740009537479 6C654E616D65060973656C656374696F6E0B42727573682E436F6C6F72070978 363431463230323700000B54466F6E744F626A65637400095374796C654E616D 650604666F6E74000007544C61796F757400095374796C654E616D650607636F 6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C656674 0500000000000000A001400D4D617267696E732E526967687405000000000000 00A001400A53697A652E57696474680500000000000000E206400B53697A652E 48656967687405000000000000009708401453697A652E506C6174666F726D44 656661756C7408085461624F72646572020000000A545363726F6C6C42617200 095374796C654E616D65060A767363726F6C6C62617205416C69676E07055269 67687406437572736F72070763724172726F770B536D616C6C4368616E676505 000000000000000000000B4F7269656E746174696F6E0708566572746963616C 0A506F736974696F6E2E580500000000000000EC06400A53697A652E57696474 6805000000000000008002400B53697A652E4865696768740500000000000000 9708401453697A652E506C6174666F726D44656661756C7408085461624F7264 6572020100000A545363726F6C6C42617200095374796C654E616D65060A6873 63726F6C6C62617205416C69676E0706426F74746F6D06437572736F72070763 724172726F770B536D616C6C4368616E676505000000000000000000000B4F72 69656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E59 05000000000000009708400A53697A652E57696474680500000000000000F406 400B53697A652E48656967687405000000000000008002401453697A652E506C 6174666F726D44656661756C7408085461624F726465720202000007544C6179 6F75740005416C69676E0706436C69656E740A53697A652E5769647468050000 0000000000EC06400B53697A652E486569676874050000000000000097084014 53697A652E506C6174666F726D44656661756C7408085461624F726465720203 000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F7673 6D616C6C7363726F6C6C62617205416C69676E0705526967687406437572736F 72070763724172726F770B536D616C6C4368616E676505000000000000000000 000B4F7269656E746174696F6E0708566572746963616C0C4D617267696E732E 4C65667405000000000000008000400A53697A652E5769647468050000000000 00008002400B53697A652E48656967687405000000000000008002401453697A 652E506C6174666F726D44656661756C74080756697369626C650800000F5453 6D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C 7363726F6C6C62617205416C69676E0706426F74746F6D06437572736F720707 63724172726F770B536D616C6C4368616E676505000000000000000000000B4F 7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E54 6F7005000000000000008000400A53697A652E57696474680500000000000000 9606400B53697A652E48656967687405000000000000008002401453697A652E 506C6174666F726D44656661756C74080756697369626C65080000000F545365 6C656374696F6E506F696E7400095374796C654E616D6506126C65667473656C 656374696F6E706F696E74084772697053697A650500000000000000C000400C 4772697043656E7465722E580500000000000000E002400C4772697043656E74 65722E590500000000000000B003C00A53697A652E5769647468050000000000 0000C003400B53697A652E4865696768740500000000000000C004401453697A 652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75700617 6C65667473656C656374696F6E706F696E747374796C6519546F756368546172 676574457870616E73696F6E2E4C6566740500000000000000E003401A546F75 6368546172676574457870616E73696F6E2E52696768740500000000000000E0 03C000000F5453656C656374696F6E506F696E7400095374796C654E616D6506 13726967687473656C656374696F6E706F696E74084772697053697A65050000 0000000000C000400C4772697043656E7465722E590500000000000000B004C0 0A53697A652E57696474680500000000000000C003400B53697A652E48656967 68740500000000000000C004401453697A652E506C6174666F726D4465666175 6C74080B5374796C654C6F6F6B75700618726967687473656C656374696F6E70 6F696E747374796C650000005450463007544C61796F757400095374796C654E 616D65060E6D656D6F7374796C655F636F646505416C69676E070643656E7465 720A53697A652E57696474680500000000000000C806400B53697A652E486569 6768740500000000000000C806401453697A652E506C6174666F726D44656661 756C74080756697369626C6508085461624F72646572022B000A545265637461 6E676C6500095374796C654E616D65060F52656374616E676C65315374796C65 05416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783332 3030303030300748697454657374080A53697A652E5769647468050000000000 0000C806400B53697A652E4865696768740500000000000000C806401453697A 652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704 4E6F6E6507585261646975730500000000000000C00140075952616469757305 00000000000000C0014000000C5442727573684F626A65637400095374796C65 4E616D65060A666F726567726F756E640B42727573682E436F6C6F720708636C 61426C61636B00000C5442727573684F626A65637400095374796C654E616D65 060973656C656374696F6E0B42727573682E436F6C6F72070978363434453445 353300000B54466F6E744F626A65637400095374796C654E616D650604666F6E 74000007544C61796F757400095374796C654E616D650607636F6E74656E7405 416C69676E0706436C69656E740C4D617267696E732E4C656674050000000000 0000A001400B4D617267696E732E546F700500000000000000A001400D4D6172 67696E732E52696768740500000000000000A001400E4D617267696E732E426F 74746F6D0500000000000000A001400A53697A652E5769647468050000000000 0000B606400B53697A652E4865696768740500000000000000B606401453697A 652E506C6174666F726D44656661756C7408085461624F72646572020000000A 545363726F6C6C42617200095374796C654E616D65060A767363726F6C6C6261 7205416C69676E0705526967687406437572736F72070763724172726F770B53 6D616C6C4368616E676505000000000000000000000B4F7269656E746174696F 6E0708566572746963616C0A506F736974696F6E2E580500000000000000C006 400A53697A652E576964746805000000000000008002400B53697A652E486569 6768740500000000000000C006401453697A652E506C6174666F726D44656661 756C7408085461624F72646572020100000A545363726F6C6C42617200095374 796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F 6D06437572736F72070763724172726F770B536D616C6C4368616E6765050000 00000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C 0A506F736974696F6E2E590500000000000000C006400A53697A652E57696474 680500000000000000C806400B53697A652E4865696768740500000000000000 8002401453697A652E506C6174666F726D44656661756C7408085461624F7264 65720202000007544C61796F75740005416C69676E0706436C69656E740A5369 7A652E57696474680500000000000000C006400B53697A652E48656967687405 00000000000000C006401453697A652E506C6174666F726D44656661756C7408 085461624F726465720203000F54536D616C6C5363726F6C6C42617200095374 796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E0705 526967687406437572736F72070763724172726F770B536D616C6C4368616E67 6505000000000000000000000B4F7269656E746174696F6E0708566572746963 616C0C4D617267696E732E4C65667405000000000000008000400A53697A652E 576964746805000000000000008002400B53697A652E48656967687405000000 000000008002401453697A652E506C6174666F726D44656661756C7408075669 7369626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E 616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F7474 6F6D06437572736F72070763724172726F770B536D616C6C4368616E67650500 0000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E7461 6C0B4D617267696E732E546F7005000000000000008000400A53697A652E5769 64746805000000000000009606400B53697A652E486569676874050000000000 00008002401453697A652E506C6174666F726D44656661756C74080756697369 626C65080000000F5453656C656374696F6E506F696E7400095374796C654E61 6D6506126C65667473656C656374696F6E706F696E74084772697053697A6505 00000000000000C000400C4772697043656E7465722E580500000000000000E0 02400C4772697043656E7465722E590500000000000000B003C00A506F736974 696F6E2E580500000000000000B005400A506F736974696F6E2E590500000000 000000B005400A53697A652E57696474680500000000000000C003400B53697A 652E4865696768740500000000000000C004401453697A652E506C6174666F72 6D44656661756C74080B5374796C654C6F6F6B757006176C65667473656C6563 74696F6E706F696E747374796C6519546F756368546172676574457870616E73 696F6E2E4C6566740500000000000000E003401A546F75636854617267657445 7870616E73696F6E2E52696768740500000000000000E003C000000F5453656C 656374696F6E506F696E7400095374796C654E616D650613726967687473656C 656374696F6E706F696E74084772697053697A650500000000000000C000400C 4772697043656E7465722E590500000000000000B004C00A506F736974696F6E 2E580500000000000000B005400A506F736974696F6E2E590500000000000000 B005400A53697A652E57696474680500000000000000C003400B53697A652E48 65696768740500000000000000C004401453697A652E506C6174666F726D4465 6661756C74080B5374796C654C6F6F6B75700618726967687473656C65637469 6F6E706F696E747374796C650000005450463007544C61796F75740009537479 6C654E616D6506106D656D6F7374796C655F6E6F726D616C05416C69676E0706 43656E7465720C50616464696E672E4C65667405000000000000008001400B50 616464696E672E546F7005000000000000008001400D50616464696E672E5269 67687405000000000000008001400E50616464696E672E426F74746F6D050000 00000000008001400A53697A652E57696474680500000000000000F406400B53 697A652E48656967687405000000000000009908401453697A652E506C617466 6F726D44656661756C74080756697369626C6508085461624F72646572022100 0A5452656374616E676C6500095374796C654E616D650602626705416C69676E 0708436F6E74656E74730A46696C6C2E436F6C6F720709783343464646464646 0748697454657374080A53697A652E57696474680500000000000000F406400B 53697A652E48656967687405000000000000009908401453697A652E506C6174 666F726D44656661756C74080C5374726F6B652E436F6C6F7207097835414646 4646464607585261646975730500000000000000C00040075952616469757305 00000000000000C00040000F54436F6C6F72416E696D6174696F6E0009537479 6C654E616D650614436F6C6F72416E696D6174696F6E315374796C6508447572 6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060C53 74726F6B652E436F6C6F720A537461727456616C756507097835414646464646 460953746F7056616C756507097843384646464646460754726967676572060E 4973466F63757365643D747275650E54726967676572496E7665727365060F49 73466F63757365643D66616C73650000000C5442727573684F626A6563740009 5374796C654E616D65060A666F726567726F756E6400000C5442727573684F62 6A65637400095374796C654E616D65060973656C656374696F6E0B4272757368 2E436F6C6F72070978374632413936464600000B54466F6E744F626A65637400 095374796C654E616D650604666F6E7409466F6E742E53697A65050000000000 0000E00240000007544C61796F757400095374796C654E616D650607636F6E74 656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566740500 0000000000008001400B4D617267696E732E546F700500000000000000800140 0D4D617267696E732E526967687405000000000000008001400E4D617267696E 732E426F74746F6D05000000000000008001400A53697A652E57696474680500 000000000000DC06400B53697A652E4865696768740500000000000000930840 1453697A652E506C6174666F726D44656661756C7408085461624F7264657202 0000000A545363726F6C6C42617200095374796C654E616D65060A767363726F 6C6C62617205416C69676E0705526967687406437572736F7207076372417272 6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74 6174696F6E0708566572746963616C0A506F736974696F6E2E58050000000000 0000E806400A506F736974696F6E2E5905000000000000008001400A53697A65 2E576964746805000000000000008002400B53697A652E486569676874050000 00000000009508401453697A652E506C6174666F726D44656661756C74080854 61624F72646572020100000A545363726F6C6C42617200095374796C654E616D 65060A687363726F6C6C62617205416C69676E0706426F74746F6D0643757273 6F72070763724172726F770B536D616C6C4368616E6765050000000000000000 00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974 696F6E2E5805000000000000008001400A506F736974696F6E2E590500000000 0000009608400A53697A652E57696474680500000000000000EC06400B53697A 652E48656967687405000000000000008002401453697A652E506C6174666F72 6D44656661756C7408085461624F726465720202000007544C61796F75740005 416C69676E0706436C69656E740A53697A652E57696474680500000000000000 E406400B53697A652E48656967687405000000000000009508401453697A652E 506C6174666F726D44656661756C7408085461624F726465720203000F54536D 616C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C6C73 63726F6C6C62617205416C69676E0705526967687406437572736F7207076372 4172726F770B536D616C6C4368616E676505000000000000000000000B4F7269 656E746174696F6E0708566572746963616C0C4D617267696E732E4C65667405 000000000000008000400A53697A652E57696474680500000000000000800240 0B53697A652E48656967687405000000000000008002401453697A652E506C61 74666F726D44656661756C74080756697369626C650800000F54536D616C6C53 63726F6C6C42617200095374796C654E616D65060F68736D616C6C7363726F6C 6C62617205416C69676E0706426F74746F6D06437572736F7207076372417272 6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74 6174696F6E070A486F72697A6F6E74616C0B4D617267696E732E546F70050000 00000000008000400A53697A652E576964746805000000000000009606400B53 697A652E48656967687405000000000000008002401453697A652E506C617466 6F726D44656661756C74080756697369626C65080000000F5453656C65637469 6F6E506F696E7400095374796C654E616D6506126C65667473656C656374696F 6E706F696E74084772697053697A650500000000000000C000400C4772697043 656E7465722E580500000000000000E002400C4772697043656E7465722E5905 00000000000000B003C00A506F736974696F6E2E580500000000000000DC0540 0A506F736974696F6E2E5905000000000000009307400A53697A652E57696474 680500000000000000C003400B53697A652E4865696768740500000000000000 C004401453697A652E506C6174666F726D44656661756C74080B5374796C654C 6F6F6B757006176C65667473656C656374696F6E706F696E747374796C651954 6F756368546172676574457870616E73696F6E2E4C6566740500000000000000 E003401A546F756368546172676574457870616E73696F6E2E52696768740500 000000000000E003C000000F5453656C656374696F6E506F696E740009537479 6C654E616D650613726967687473656C656374696F6E706F696E740847726970 53697A650500000000000000C000400C4772697043656E7465722E5905000000 00000000B004C00A506F736974696F6E2E580500000000000000DC05400A506F 736974696F6E2E5905000000000000009307400A53697A652E57696474680500 000000000000C003400B53697A652E4865696768740500000000000000C00440 1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B 75700618726967687473656C656374696F6E706F696E747374796C6500000054 50463007544C61796F757400095374796C654E616D6506176C65667473656C65 6374696F6E706F696E747374796C6505416C69676E070643656E7465720A5369 7A652E57696474680500000000000000C003400B53697A652E48656967687405 00000000000000C004401453697A652E506C6174666F726D44656661756C7408 0756697369626C6508085461624F7264657202400A4669786564576964746802 180B46697865644865696768740230000A5452656374616E676C650009537479 6C654E616D65060A6261636B67726F756E6407436F726E6572730B07546F704C 6566740A426F74746F6D4C6566740B426F74746F6D5269676874000A46696C6C 2E436F6C6F7207097846464143414342450748697454657374080A506F736974 696F6E2E580500000000000000A803C00A506F736974696F6E2E590500000000 0000008404400A53697A652E57696474680500000000000000A003400B53697A 652E4865696768740500000000000000A003401453697A652E506C6174666F72 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164 6975730500000000000000A0024007595261646975730500000000000000A002 400000005450463007544C61796F757400095374796C654E616D650618726967 687473656C656374696F6E706F696E747374796C6505416C69676E070643656E 7465720A53697A652E57696474680500000000000000C003400B53697A652E48 65696768740500000000000000C004401453697A652E506C6174666F726D4465 6661756C74080756697369626C6508085461624F7264657202440A4669786564 576964746802180B46697865644865696768740230000A5452656374616E676C 6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273 0B08546F7052696768740A426F74746F6D4C6566740B426F74746F6D52696768 74000A46696C6C2E436F6C6F7207097846464143414342450748697454657374 080A53697A652E57696474680500000000000000A003400B53697A652E486569 6768740500000000000000A003401453697A652E506C6174666F726D44656661 756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500 000000000000A0024007595261646975730500000000000000A00240000000} end item Platform = 'Android' ResourcesBin = { 464D585F5354594C4520322E350106176C65667473656C656374696F6E706F69 6E747374796C6503C501060F6D656D6F7374796C655F636C656172038807060E 6D656D6F7374796C655F636F646503E30806106D656D6F7374796C655F6E6F72 6D616C03300A0618726967687473656C656374696F6E706F696E747374796C65 039B01005450463007544C61796F757400095374796C654E616D6506176C6566 7473656C656374696F6E706F696E747374796C6505416C69676E070643656E74 65720A53697A652E57696474680500000000000000C003400B53697A652E4865 696768740500000000000000C004401453697A652E506C6174666F726D446566 61756C74080756697369626C6508085461624F7264657202370A466978656457 6964746802180B46697865644865696768740230000A5452656374616E676C65 00095374796C654E616D65060A6261636B67726F756E6407436F726E6572730B 07546F704C6566740A426F74746F6D4C6566740B426F74746F6D526967687400 0A46696C6C2E436F6C6F7207097846464143414342450748697454657374080A 506F736974696F6E2E580500000000000000A803C00A506F736974696F6E2E59 05000000000000008404400A53697A652E57696474680500000000000000A003 400B53697A652E4865696768740500000000000000A003401453697A652E506C 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 07585261646975730500000000000000A0024007595261646975730500000000 000000A002400000005450463007544C61796F757400095374796C654E616D65 060F6D656D6F7374796C655F636C65617205416C69676E070643656E7465720A 53697A652E57696474680500000000000000F406400B53697A652E4865696768 7405000000000000009908401453697A652E506C6174666F726D44656661756C 74080756697369626C6508085461624F726465720228000C5442727573684F62 6A65637400095374796C654E616D65060A666F726567726F756E640B42727573 682E436F6C6F720708636C61426C61636B00000C5442727573684F626A656374 00095374796C654E616D65060973656C656374696F6E0B42727573682E436F6C 6F72070978363431463230323700000B54466F6E744F626A6563740009537479 6C654E616D650604666F6E74000007544C61796F757400095374796C654E616D 650607636F6E74656E7405416C69676E0706436C69656E740C4D617267696E73 2E4C6566740500000000000000A001400D4D617267696E732E52696768740500 000000000000A001400A53697A652E57696474680500000000000000E206400B 53697A652E48656967687405000000000000009708401453697A652E506C6174 666F726D44656661756C7408085461624F72646572020000000A545363726F6C 6C42617200095374796C654E616D65060A767363726F6C6C62617205416C6967 6E0705526967687406437572736F72070763724172726F770B536D616C6C4368 616E676505000000000000000000000B4F7269656E746174696F6E0708566572 746963616C0A506F736974696F6E2E580500000000000000EC06400A53697A65 2E576964746805000000000000008002400B53697A652E486569676874050000 00000000009708401453697A652E506C6174666F726D44656661756C74080854 61624F72646572020100000A545363726F6C6C42617200095374796C654E616D 65060A687363726F6C6C62617205416C69676E0706426F74746F6D0643757273 6F72070763724172726F770B536D616C6C4368616E6765050000000000000000 00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974 696F6E2E5905000000000000009708400A53697A652E57696474680500000000 000000F406400B53697A652E4865696768740500000000000000800240145369 7A652E506C6174666F726D44656661756C7408085461624F7264657202020000 07544C61796F75740005416C69676E0706436C69656E740A53697A652E576964 74680500000000000000EC06400B53697A652E48656967687405000000000000 009708401453697A652E506C6174666F726D44656661756C7408085461624F72 6465720203000F54536D616C6C5363726F6C6C42617200095374796C654E616D 65060F76736D616C6C7363726F6C6C62617205416C69676E0705526967687406 437572736F72070763724172726F770B536D616C6C4368616E67650500000000 0000000000000B4F7269656E746174696F6E0708566572746963616C0C4D6172 67696E732E4C65667405000000000000008000400A53697A652E576964746805 000000000000008002400B53697A652E48656967687405000000000000008002 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 00000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68 736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D06437572 736F72070763724172726F770B536D616C6C4368616E67650500000000000000 0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267 696E732E546F7005000000000000008000400A53697A652E5769647468050000 00000000009606400B53697A652E486569676874050000000000000080024014 53697A652E506C6174666F726D44656661756C74080756697369626C65080000 000F5453656C656374696F6E506F696E7400095374796C654E616D6506126C65 667473656C656374696F6E706F696E74084772697053697A6505000000000000 00C000400C4772697043656E7465722E580500000000000000E002400C477269 7043656E7465722E590500000000000000B003C00A53697A652E576964746805 00000000000000C003400B53697A652E4865696768740500000000000000C004 401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F 6B757006176C65667473656C656374696F6E706F696E747374796C6519546F75 6368546172676574457870616E73696F6E2E4C6566740500000000000000E003 401A546F756368546172676574457870616E73696F6E2E526967687405000000 00000000E003C000000F5453656C656374696F6E506F696E7400095374796C65 4E616D650613726967687473656C656374696F6E706F696E7408477269705369 7A650500000000000000C000400C4772697043656E7465722E59050000000000 0000B004C00A53697A652E57696474680500000000000000C003400B53697A65 2E4865696768740500000000000000C004401453697A652E506C6174666F726D 44656661756C74080B5374796C654C6F6F6B75700618726967687473656C6563 74696F6E706F696E747374796C650000005450463007544C61796F7574000953 74796C654E616D65060E6D656D6F7374796C655F636F646505416C69676E0706 43656E7465720A53697A652E57696474680500000000000000C806400B53697A 652E4865696768740500000000000000C806401453697A652E506C6174666F72 6D44656661756C74080756697369626C6508085461624F72646572022B000A54 52656374616E676C6500095374796C654E616D65060F52656374616E676C6531 5374796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72 07097833323030303030300748697454657374080A53697A652E576964746805 00000000000000C806400B53697A652E4865696768740500000000000000C806 401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B 696E6407044E6F6E6507585261646975730500000000000000C0014007595261 646975730500000000000000C0014000000C5442727573684F626A6563740009 5374796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F 720708636C61426C61636B00000C5442727573684F626A65637400095374796C 654E616D65060973656C656374696F6E0B42727573682E436F6C6F7207097836 3434453445353300000B54466F6E744F626A65637400095374796C654E616D65 0604666F6E74000007544C61796F757400095374796C654E616D650607636F6E 74656E7405416C69676E0706436C69656E740C4D617267696E732E4C65667405 00000000000000A001400B4D617267696E732E546F700500000000000000A001 400D4D617267696E732E52696768740500000000000000A001400E4D61726769 6E732E426F74746F6D0500000000000000A001400A53697A652E576964746805 00000000000000B606400B53697A652E4865696768740500000000000000B606 401453697A652E506C6174666F726D44656661756C7408085461624F72646572 020000000A545363726F6C6C42617200095374796C654E616D65060A76736372 6F6C6C62617205416C69676E0705526967687406437572736F72070763724172 726F770B536D616C6C4368616E676505000000000000000000000B4F7269656E 746174696F6E0708566572746963616C0A506F736974696F6E2E580500000000 000000C006400A53697A652E576964746805000000000000008002400B53697A 652E4865696768740500000000000000C006401453697A652E506C6174666F72 6D44656661756C7408085461624F72646572020100000A545363726F6C6C4261 7200095374796C654E616D65060A687363726F6C6C62617205416C69676E0706 426F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E 676505000000000000000000000B4F7269656E746174696F6E070A486F72697A 6F6E74616C0A506F736974696F6E2E590500000000000000C006400A53697A65 2E57696474680500000000000000C806400B53697A652E486569676874050000 00000000008002401453697A652E506C6174666F726D44656661756C74080854 61624F726465720202000007544C61796F75740005416C69676E0706436C6965 6E740A53697A652E57696474680500000000000000C006400B53697A652E4865 696768740500000000000000C006401453697A652E506C6174666F726D446566 61756C7408085461624F726465720203000F54536D616C6C5363726F6C6C4261 7200095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C 69676E0705526967687406437572736F72070763724172726F770B536D616C6C 4368616E676505000000000000000000000B4F7269656E746174696F6E070856 6572746963616C0C4D617267696E732E4C65667405000000000000008000400A 53697A652E576964746805000000000000008002400B53697A652E4865696768 7405000000000000008002401453697A652E506C6174666F726D44656661756C 74080756697369626C650800000F54536D616C6C5363726F6C6C426172000953 74796C654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E07 06426F74746F6D06437572736F72070763724172726F770B536D616C6C436861 6E676505000000000000000000000B4F7269656E746174696F6E070A486F7269 7A6F6E74616C0B4D617267696E732E546F7005000000000000008000400A5369 7A652E576964746805000000000000009606400B53697A652E48656967687405 000000000000008002401453697A652E506C6174666F726D44656661756C7408 0756697369626C65080000000F5453656C656374696F6E506F696E7400095374 796C654E616D6506126C65667473656C656374696F6E706F696E740847726970 53697A650500000000000000C000400C4772697043656E7465722E5805000000 00000000E002400C4772697043656E7465722E590500000000000000B003C00A 506F736974696F6E2E580500000000000000B005400A506F736974696F6E2E59 0500000000000000B005400A53697A652E57696474680500000000000000C003 400B53697A652E4865696768740500000000000000C004401453697A652E506C 6174666F726D44656661756C74080B5374796C654C6F6F6B757006176C656674 73656C656374696F6E706F696E747374796C6519546F75636854617267657445 7870616E73696F6E2E4C6566740500000000000000E003401A546F7563685461 72676574457870616E73696F6E2E52696768740500000000000000E003C00000 0F5453656C656374696F6E506F696E7400095374796C654E616D650613726967 687473656C656374696F6E706F696E74084772697053697A6505000000000000 00C000400C4772697043656E7465722E590500000000000000B004C00A506F73 6974696F6E2E580500000000000000B005400A506F736974696F6E2E59050000 0000000000B005400A53697A652E57696474680500000000000000C003400B53 697A652E4865696768740500000000000000C004401453697A652E506C617466 6F726D44656661756C74080B5374796C654C6F6F6B7570061872696768747365 6C656374696F6E706F696E747374796C650000005450463007544C61796F7574 00095374796C654E616D6506106D656D6F7374796C655F6E6F726D616C05416C 69676E070643656E7465720C50616464696E672E4C6566740500000000000000 8001400B50616464696E672E546F7005000000000000008001400D5061646469 6E672E526967687405000000000000008001400E50616464696E672E426F7474 6F6D05000000000000008001400A53697A652E57696474680500000000000000 F406400B53697A652E48656967687405000000000000009908401453697A652E 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 65720221000A5452656374616E676C6500095374796C654E616D650602626705 416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978334346 46464646460748697454657374080A53697A652E576964746805000000000000 00F406400B53697A652E48656967687405000000000000009908401453697A65 2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709 78354146464646464607585261646975730500000000000000C0004007595261 646975730500000000000000C00040000F54436F6C6F72416E696D6174696F6E 00095374796C654E616D650614436F6C6F72416E696D6174696F6E315374796C 65084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E61 6D65060C5374726F6B652E436F6C6F720A537461727456616C75650709783541 4646464646460953746F7056616C756507097843384646464646460754726967 676572060E4973466F63757365643D747275650E54726967676572496E766572 7365060F4973466F63757365643D66616C73650000000C5442727573684F626A 65637400095374796C654E616D65060A666F726567726F756E6400000C544272 7573684F626A65637400095374796C654E616D65060973656C656374696F6E0B 42727573682E436F6C6F72070978374632413936464600000B54466F6E744F62 6A65637400095374796C654E616D650604666F6E7409466F6E742E53697A6505 00000000000000E00240000007544C61796F757400095374796C654E616D6506 07636F6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C 65667405000000000000008001400B4D617267696E732E546F70050000000000 00008001400D4D617267696E732E526967687405000000000000008001400E4D 617267696E732E426F74746F6D05000000000000008001400A53697A652E5769 6474680500000000000000DC06400B53697A652E486569676874050000000000 00009308401453697A652E506C6174666F726D44656661756C7408085461624F 72646572020000000A545363726F6C6C42617200095374796C654E616D65060A 767363726F6C6C62617205416C69676E0705526967687406437572736F720707 63724172726F770B536D616C6C4368616E676505000000000000000000000B4F 7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E5805 00000000000000E806400A506F736974696F6E2E590500000000000000800140 0A53697A652E576964746805000000000000008002400B53697A652E48656967 687405000000000000009508401453697A652E506C6174666F726D4465666175 6C7408085461624F72646572020100000A545363726F6C6C4261720009537479 6C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F6D 06437572736F72070763724172726F770B536D616C6C4368616E676505000000 000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A 506F736974696F6E2E5805000000000000008001400A506F736974696F6E2E59 05000000000000009608400A53697A652E57696474680500000000000000EC06 400B53697A652E48656967687405000000000000008002401453697A652E506C 6174666F726D44656661756C7408085461624F726465720202000007544C6179 6F75740005416C69676E0706436C69656E740A53697A652E5769647468050000 0000000000E406400B53697A652E486569676874050000000000000095084014 53697A652E506C6174666F726D44656661756C7408085461624F726465720203 000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F7673 6D616C6C7363726F6C6C62617205416C69676E0705526967687406437572736F 72070763724172726F770B536D616C6C4368616E676505000000000000000000 000B4F7269656E746174696F6E0708566572746963616C0C4D617267696E732E 4C65667405000000000000008000400A53697A652E5769647468050000000000 00008002400B53697A652E48656967687405000000000000008002401453697A 652E506C6174666F726D44656661756C74080756697369626C650800000F5453 6D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C 7363726F6C6C62617205416C69676E0706426F74746F6D06437572736F720707 63724172726F770B536D616C6C4368616E676505000000000000000000000B4F 7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E54 6F7005000000000000008000400A53697A652E57696474680500000000000000 9606400B53697A652E48656967687405000000000000008002401453697A652E 506C6174666F726D44656661756C74080756697369626C65080000000F545365 6C656374696F6E506F696E7400095374796C654E616D6506126C65667473656C 656374696F6E706F696E74084772697053697A650500000000000000C000400C 4772697043656E7465722E580500000000000000E002400C4772697043656E74 65722E590500000000000000B003C00A506F736974696F6E2E58050000000000 0000DC05400A506F736974696F6E2E5905000000000000009307400A53697A65 2E57696474680500000000000000C003400B53697A652E486569676874050000 0000000000C004401453697A652E506C6174666F726D44656661756C74080B53 74796C654C6F6F6B757006176C65667473656C656374696F6E706F696E747374 796C6519546F756368546172676574457870616E73696F6E2E4C656674050000 0000000000E003401A546F756368546172676574457870616E73696F6E2E5269 6768740500000000000000E003C000000F5453656C656374696F6E506F696E74 00095374796C654E616D650613726967687473656C656374696F6E706F696E74 084772697053697A650500000000000000C000400C4772697043656E7465722E 590500000000000000B004C00A506F736974696F6E2E580500000000000000DC 05400A506F736974696F6E2E5905000000000000009307400A53697A652E5769 6474680500000000000000C003400B53697A652E486569676874050000000000 0000C004401453697A652E506C6174666F726D44656661756C74080B5374796C 654C6F6F6B75700618726967687473656C656374696F6E706F696E747374796C 650000005450463007544C61796F757400095374796C654E616D650618726967 687473656C656374696F6E706F696E747374796C6505416C69676E070643656E 7465720A53697A652E57696474680500000000000000C003400B53697A652E48 65696768740500000000000000C004401453697A652E506C6174666F726D4465 6661756C74080756697369626C6508085461624F7264657202440A4669786564 576964746802180B46697865644865696768740230000A5452656374616E676C 6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273 0B08546F7052696768740A426F74746F6D4C6566740B426F74746F6D52696768 74000A46696C6C2E436F6C6F7207097846464143414342450748697454657374 080A53697A652E57696474680500000000000000A003400B53697A652E486569 6768740500000000000000A003401453697A652E506C6174666F726D44656661 756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500 000000000000A0024007595261646975730500000000000000A00240000000} end> Left = 64 Top = 386 end object LayoutMenuContent: TLayout Align = Contents Size.Width = 1053.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 3 object RectangleMenuBG: TRectangle Align = Contents Fill.Color = xBF565869 Size.Width = 1053.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False OnClick = ButtonCloseMenuClick end object LayoutMenuContainer: TLayout Align = Left Size.Width = 320.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end end object RectangleMenu: TRectangle Align = Left Fill.Color = xFF202123 Padding.Left = 8.000000000000000000 Padding.Top = 8.000000000000000000 Padding.Right = 8.000000000000000000 Padding.Bottom = 8.000000000000000000 Size.Width = 270.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None object LayoutMenu: TLayout Align = Client Size.Width = 251.000000000000000000 Size.Height = 670.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object ButtonNewChat: TButton Align = Top Cursor = crHandPoint StyledSettings = [Family, Style, FontColor] Images = Manager.SVGIconImageList ImageIndex = 0 Margins.Bottom = 8.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_newchat' TabOrder = 0 Text = 'New chat' TextSettings.Font.Size = 14.000000000000000000 TextSettings.HorzAlign = Leading OnClick = ButtonNewChatClick end object ListBoxChatList: TListBox Align = Client Margins.Top = 4.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 402.000000000000000000 Size.PlatformDefault = False StyleLookup = 'listboxstyle_clear' TabOrder = 1 TabStop = False CanFocus = False DisableFocusEffect = True ItemIndex = 0 ItemHeight = 44.000000000000000000 Images = Manager.SVGIconImageList DefaultItemStyles.ItemStyle = 'listboxitemstyle_chat' DefaultItemStyles.GroupHeaderStyle = '' DefaultItemStyles.GroupFooterStyle = '' Viewport.Width = 251.000000000000000000 Viewport.Height = 402.000000000000000000 object ListBoxItem1: TListBoxItem HitTest = True IsSelected = True ImageIndex = 1 Margins.Bottom = 8.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'listboxitemstyle_chat' TabOrder = 0 Text = 'New chat' end object ListBoxItem3: TListBoxItem HitTest = True ImageIndex = 1 Margins.Bottom = 8.000000000000000000 Position.Y = 52.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'listboxitemstyle_chat' TabOrder = 1 Text = 'Make HTTP Request in JavaScript' end end object LayoutMenuButtons: TLayout Align = Bottom ClipChildren = True Position.Y = 460.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 210.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonAbout: TButton Align = Top Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 13 Margins.Top = 4.000000000000000000 Position.Y = 165.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 4 Text = 'About' TextSettings.HorzAlign = Leading OnClick = ButtonAboutClick end object ButtonClear: TButton Align = Top Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 8 Margins.Top = 4.000000000000000000 Position.Y = 21.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 2 Text = 'Clear conversations' TextSettings.HorzAlign = Leading OnClick = ButtonClearClick object Layout2: TLayout Align = Right Margins.Top = 6.000000000000000000 Margins.Right = 6.000000000000000000 Margins.Bottom = 6.000000000000000000 Position.X = 181.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 64.000000000000000000 Size.Height = 32.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object ButtonClearConfirm: TButton Align = Right Cursor = crHandPoint Hint = 'Confirm' Images = Manager.SVGIconImageList ImageIndex = 10 Size.Width = 32.000000000000000000 Size.Height = 32.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_confirm' TabOrder = 1 OnClick = ButtonClearConfirmClick end object ButtonClearCancel: TButton Align = Right Cursor = crHandPoint Hint = 'Cancel' Images = Manager.SVGIconImageList ImageIndex = 11 Position.X = 32.000000000000000000 Size.Width = 32.000000000000000000 Size.Height = 32.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_confirm' TabOrder = 0 OnClick = ButtonClearCancelClick end end end object ButtonFAQ: TButton Align = Top Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 9 Margins.Top = 4.000000000000000000 Position.Y = 117.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 5 Text = 'Updates & FAQ' TextSettings.HorzAlign = Leading OnClick = ButtonFAQClick end object ButtonSettings: TButton Align = Top Cursor = crHandPoint Images = Manager.SVGIconImageList ImageIndex = 12 Margins.Top = 4.000000000000000000 Position.Y = 69.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 3 Text = 'Settings' TextSettings.HorzAlign = Leading OnClick = ButtonSettingsClick end object Line1: TLine Align = Top LineType = Top Size.Width = 251.000000000000000000 Size.Height = 1.000000000000000000 Size.PlatformDefault = False Stroke.Color = x33FFFFFF end object ButtonMenuButonsSwitch: TButton Align = Top Images = Manager.SVGIconImageList ImageIndex = 16 Position.Y = 1.000000000000000000 Size.Width = 251.000000000000000000 Size.Height = 16.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menubuttons' TabOrder = 7 Text = 'buttonstyle_menubuttons' OnClick = ButtonMenuButonsSwitchClick end end end object LayoutCloseMenu: TLayout Align = Right Margins.Left = 8.000000000000000000 Margins.Right = -55.000000000000000000 Position.X = 267.000000000000000000 Position.Y = 8.000000000000000000 Size.Width = 50.000000000000000000 Size.Height = 670.000000000000000000 Size.PlatformDefault = False TabOrder = 1 object ButtonCloseMenu: TButton Align = Top Cursor = crHandPoint ImageIndex = 3 Size.Width = 50.000000000000000000 Size.Height = 45.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_primary' TabOrder = 0 OnClick = ButtonCloseMenuClick end end end object LayoutOverlay: TLayout Align = Contents Size.Width = 1053.000000000000000000 Size.Height = 686.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 7 end object TimerFPS: TTimer Interval = 10 OnTimer = TimerFPSTimer Left = 136 Top = 384 end object GestureManager: TGestureManager Sensitivity = 80.000000000000000000 Left = 64 Top = 328 GestureData = < item Control = Owner Collection = < item GestureID = sgiRightLeft end> end> end object FDConnection: TFDConnection Left = 136 Top = 330 end end ================================================ FILE: ChatGPT.Main.pas ================================================ unit ChatGPT.Main; interface {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, OpenAI, FMX.Objects, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, System.ImageList, FMX.ImgList, FMX.SVGIconImageList, ChatGPT.FrameChat, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Effects, FMX.Filter.Effects, FMX.Edit, ChatGPT.Classes, System.JSON, FMX.ComboEdit, FMX.Menus, System.Skia, System.Generics.Collections, System.Actions, FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions, OpenAI.Chat.Functions, FMX.Gestures, FMX.Ani, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.FMXUI.Wait, Data.DB, FireDAC.Comp.Client; type TListBoxItemChat = class(TListBoxItem) public JSON: TJSONObject; ChatId: string; procedure Paint; override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; TFormMain = class(TForm) LayoutChats: TLayout; Rectangle1: TRectangle; StyleBook: TStyleBook; LayoutHead: TLayout; ButtonMenu: TButton; ButtonNewChatCompact: TButton; LabelChatName: TLabel; LayoutMenuContent: TLayout; RectangleMenu: TRectangle; LayoutMenu: TLayout; ButtonNewChat: TButton; ListBoxChatList: TListBox; ListBoxItem1: TListBoxItem; ListBoxItem3: TListBoxItem; RectangleMenuBG: TRectangle; ButtonCloseMenu: TButton; LayoutMenuContainer: TLayout; LayoutCloseMenu: TLayout; Line1: TLine; ButtonClear: TButton; ButtonFAQ: TButton; LayoutChatsBox: TLayout; Layout2: TLayout; ButtonClearConfirm: TButton; ButtonClearCancel: TButton; LayoutOverlay: TLayout; ButtonSettings: TButton; Line2: TLine; ButtonAbout: TButton; LayoutMenuButtons: TLayout; ButtonMenuButonsSwitch: TButton; TimerFPS: TTimer; GestureManager: TGestureManager; FDConnection: TFDConnection; procedure ButtonNewChatClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure ButtonMenuClick(Sender: TObject); procedure ButtonCloseMenuClick(Sender: TObject); procedure ButtonNewChatCompactClick(Sender: TObject); procedure FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Single); procedure FormVirtualKeyboardShown(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect); procedure FormVirtualKeyboardHidden(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect); procedure ButtonClearClick(Sender: TObject); procedure ButtonClearConfirmClick(Sender: TObject); procedure ButtonClearCancelClick(Sender: TObject); procedure ButtonFAQClick(Sender: TObject); procedure ButtonSettingsClick(Sender: TObject); procedure ButtonAboutClick(Sender: TObject); procedure ButtonMenuButonsSwitchClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormSaveState(Sender: TObject); procedure TimerFPSTimer(Sender: TObject); procedure FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private class var FChatIdCount: Integer; private FOpenAI: TOpenAIComponent; FMode: TWindowMode; FToken: string; FTemperature: Single; FChatsFileName: string; FSettingsFileName: string; FSelectedChatId: string; FPresencePenalty: Single; FMaxTokens: Integer; FMaxTokensQuery: Integer; FFrequencyPenalty: Single; FOrganization: string; FBaseUrl: string; FModel: string; FTopP: Single; FGPTFuncList: TList; FUseFunctions: Boolean; FAutoExecFuncs: Boolean; FTimeout: Integer; procedure SetMode(const Value: TWindowMode); procedure UpdateMode; procedure SelectChat(const ChatId: string); procedure DeleteChat(const ChatId: string); procedure FOnChatItemClick(Sender: TObject); {$HINTS OFF} procedure FOnChatItemTap(Sender: TObject; const Point: TPointF); {$HINTS ON} function CreateChat(JSON: TJSONObject = nil): string; procedure CloseMenu; procedure Clear; procedure ShowClearConfirm; procedure HideClearConfirm; procedure FOnChatEditClick(Sender: TObject); procedure FOnChatDeleteClick(Sender: TObject); procedure OpenSettings; procedure LoadSettings; procedure SaveSettings; procedure SetToken(const Value: string); procedure SetTemperature(const Value: Single); function GetSettingsFileName: string; function GetChatsFileName: string; procedure SetFrequencyPenalty(const Value: Single); procedure SetMaxTokens(const Value: Integer); procedure SetMaxTokensQuery(const Value: Integer); procedure SetPresencePenalty(const Value: Single); procedure SetOrganization(const Value: string); procedure SetBaseUrl(const Value: string); procedure SetModel(const Value: string); function GetChatFrame(const ChatId: string): TFrameChat; procedure SetTopP(const Value: Single); procedure Defaults; procedure FOnNeedFuncList(Sender: TObject; out Items: TArray); procedure CreateGPTFunctions; procedure SetUseFunctions(const Value: Boolean); procedure SetAutoExecFuncs(const Value: Boolean); procedure SetTimeout(const Value: Integer); procedure RenameChat(const ChatId, Text: string); procedure FOnChatTitleChanged(Sender: TObject); protected procedure CreateHandle; override; public procedure LoadChats; procedure SaveChats; class function NextChatId: Integer; static; property UseFunctions: Boolean read FUseFunctions write SetUseFunctions; property AutoExecFuncs: Boolean read FAutoExecFuncs write SetAutoExecFuncs; property OpenAI: TOpenAIComponent read FOpenAI; property Mode: TWindowMode read FMode write SetMode; property Token: string read FToken write SetToken; property Temperature: Single read FTemperature write SetTemperature; property Timeout: Integer read FTimeout write SetTimeout; property Organization: string read FOrganization write SetOrganization; property BaseUrl: string read FBaseUrl write SetBaseUrl; property MaxTokens: Integer read FMaxTokens write SetMaxTokens; property MaxTokensQuery: Integer read FMaxTokensQuery write SetMaxTokensQuery; property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty; property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty; property TopP: Single read FTopP write SetTopP; property Model: string read FModel write SetModel; property GPTFuncList: TList read FGPTFuncList; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; const URL_FAQ = 'https://help.openai.com/en/collections/3742473-chatgpt'; DEFAULT_TIMEOUT = 120000; const VersionName = '1.1.30'; var FormMain: TFormMain; const AniInterpolation = TInterpolationType.Quadratic; implementation uses FMX.Text, System.Math, System.Rtti, FMX.Utils, FMX.DialogService, System.Threading, System.Net.URLClient, System.IOUtils, ChatGPT.Settings, ChatGPT.Overlay, FMX.Styles, HGM.FMX.Ani, HGM.FMX.Image, OpenAI.API, ChatGPT.Manager, {$IFDEF MSWINDOWS} DarkModeApi.FMX, FMX.Platform.Win, {$ENDIF} ChatGPT.About, ChatGPT.Functions, System.Math.Vectors; {$R *.fmx} { TFormMain } class function TFormMain.NextChatId: Integer; begin Inc(FChatIdCount); Result := FChatIdCount; end; procedure TFormMain.ShowClearConfirm; begin ButtonClear.Text := 'Confirm clear'; ButtonClearConfirm.Visible := True; ButtonClearCancel.Visible := True; end; procedure TFormMain.TimerFPSTimer(Sender: TObject); begin Invalidate; end; procedure TFormMain.HideClearConfirm; begin ButtonClear.Text := 'Clear conversations'; ButtonClearConfirm.Visible := False; ButtonClearCancel.Visible := False; end; procedure TFormMain.ButtonAboutClick(Sender: TObject); begin LayoutOverlay.BringToFront; TFrameAbout.Execute(LayoutOverlay, procedure(Frame: TFrameAbout) begin Frame.Mode := Mode; end, procedure(Frame: TFrameAbout; Success: Boolean) begin // end); end; procedure TFormMain.ButtonClearCancelClick(Sender: TObject); begin HideClearConfirm; end; procedure TFormMain.ButtonClearClick(Sender: TObject); begin ShowClearConfirm; end; procedure TFormMain.ButtonClearConfirmClick(Sender: TObject); begin Clear; SelectChat(CreateChat); end; procedure TFormMain.ButtonCloseMenuClick(Sender: TObject); begin CloseMenu; end; procedure TFormMain.ButtonFAQClick(Sender: TObject); begin OpenUrl(URL_FAQ); end; procedure TFormMain.ButtonMenuButonsSwitchClick(Sender: TObject); begin if LayoutMenuButtons.Height < 210 then begin TAnimator.AnimateFloat(LayoutMenuButtons, 'Height', 210, 0.1); ButtonMenuButonsSwitch.RotationAngle := 0; end else begin TAnimator.AnimateFloat(LayoutMenuButtons, 'Height', 17, 0.1); ButtonMenuButonsSwitch.RotationAngle := 180; end; end; procedure TFormMain.ButtonMenuClick(Sender: TObject); begin RectangleMenuBG.Opacity := 0; LayoutMenuContainer.Opacity := 0; LayoutMenuContainer.Margins.Left := -(LayoutMenuContainer.Width - 45); ButtonCloseMenu.Opacity := 0; LayoutMenuContent.Visible := True; TAnimator.AnimateFloat(RectangleMenuBG, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloat(ButtonCloseMenu, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloat(LayoutMenuContainer, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloat(LayoutMenuContainer, 'Margins.Left', 0, 0.2, TAnimationType.InOut, AniInterpolation); end; procedure TFormMain.CloseMenu; begin TAnimator.AnimateFloat(RectangleMenuBG, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloat(ButtonCloseMenu, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloat(LayoutMenuContainer, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation); TAnimator.AnimateFloatWithFinish(LayoutMenuContainer, 'Margins.Left', -(LayoutMenuContainer.Width - 45), procedure begin LayoutMenuContent.Visible := False; end, 0.2, TAnimationType.InOut, AniInterpolation); end; function TFormMain.CreateChat(JSON: TJSONObject): string; begin var IsNew: Boolean := not Assigned(JSON); var ItemList := TListBoxItemChat.Create(ListBoxChatList); if IsNew then begin ItemList.JSON := nil; ItemList.ChatId := TGUID.NewGuid.ToString; ItemList.Text := 'New chat ' + NextChatId.ToString; end else begin ItemList.JSON := JSON.Clone as TJSONObject; ItemList.Text := JSON.GetValue('title', '').Replace(#13, ' ').Replace(#10, ' ').Replace('&', ''); ItemList.ChatId := JSON.GetValue('chat_id', TGUID.NewGuid.ToString); end; ItemList.TabStop := False; ItemList.HitTest := True; {$IFDEF MOBILE} ItemList.OnTap := FOnChatItemTap; {$ELSE} ItemList.OnClick := FOnChatItemClick; {$ENDIF} ItemList.Margins.Bottom := 8; ItemList.TextSettings.WordWrap := False; ItemList.ImageIndex := 1; ItemList.DisableDisappear := True; ItemList.StylesData['edit.OnClick'] := TValue.From(FOnChatEditClick); ItemList.StylesData['delete.OnClick'] := TValue.From(FOnChatDeleteClick); if IsNew then ListBoxChatList.InsertObject(0, ItemList) else ListBoxChatList.AddObject(ItemList); ItemList.ApplyStyleLookup; Result := ItemList.ChatId; end; procedure TFormMain.CreateHandle; begin inherited; {$IFDEF MSWINDOWS} SetWindowColorModeAsSystem; {$ENDIF} end; procedure TFormMain.DeleteChat(const ChatId: string); begin for var Control in LayoutChatsBox.Controls do if Control is TFrameChat then begin var Frame := TFrameChat(Control); if Frame.ChatId = ChatId then begin Frame.Release; Break; end; end; var DeletedIndex: Integer := -1; for var i := 0 to Pred(ListBoxChatList.Count) do if ListBoxChatList.ListItems[i] is TListBoxItemChat then if TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId = ChatId then begin DeletedIndex := i; ListBoxChatList.ListItems[i].Release; Break; end; if ListBoxChatList.Count <= 0 then SelectChat(CreateChat) else begin DeletedIndex := Max(0, Min(DeletedIndex - 1, ListBoxChatList.Count - 1)); SelectChat((ListBoxChatList.ListItems[DeletedIndex] as TListBoxItemChat).ChatId); end; end; procedure TFormMain.RenameChat(const ChatId, Text: string); begin for var Control in LayoutChatsBox.Controls do if Control is TFrameChat then begin var Frame := TFrameChat(Control); if Frame.ChatId = ChatId then begin Frame.Title := Text; Break; end; end; end; destructor TFormMain.Destroy; begin FGPTFuncList.Free; inherited; end; procedure TFormMain.ButtonNewChatClick(Sender: TObject); begin SelectChat(CreateChat); if Mode = TWindowMode.Compact then CloseMenu; end; procedure TFormMain.ButtonNewChatCompactClick(Sender: TObject); begin SelectChat(CreateChat); end; procedure TFormMain.ButtonSettingsClick(Sender: TObject); begin OpenSettings; end; procedure TFormMain.FOnChatEditClick(Sender: TObject); var Button: TButton absolute Sender; ListItem: TListBoxItemChat; ChatId: string; begin if TFMXObjectHelper.FindNearestParentOfClass(Button, ListItem) then begin ChatId := ListItem.ChatId; TDialogService.InputQuery('New Chat name', ['Name'], [ListItem.Text], procedure(const AResult: TModalResult; const AValues: array of string) begin if AResult = mrOk then RenameChat(ChatId, AValues[0]); end); end; end; procedure TFormMain.FOnChatDeleteClick(Sender: TObject); var Button: TButton absolute Sender; ListItem: TListBoxItemChat; ChatId: string; begin if TFMXObjectHelper.FindNearestParentOfClass(Button, ListItem) then begin ChatId := ListItem.ChatId; TDialogService.MessageDialog('Delete "' + ListItem.Text + '"?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0, procedure(const AResult: TModalResult) begin if AResult = mrYes then DeleteChat(ChatId); end); end; end; procedure TFormMain.FOnChatItemClick(Sender: TObject); var Item: TListBoxItemChat absolute Sender; begin if not (Item is TListBoxItemChat) then Exit; SelectChat(Item.ChatId); if Mode = TWindowMode.Compact then CloseMenu; end; procedure TFormMain.FOnChatItemTap(Sender: TObject; const Point: TPointF); begin FOnChatItemClick(Sender); end; procedure TFormMain.FOnNeedFuncList(Sender: TObject; out Items: TArray); begin Items := FGPTFuncList.ToArray; end; function TFormMain.GetSettingsFileName: string; begin if FSettingsFileName.IsEmpty then FSettingsFileName := TPath.Combine(Manager.AppFolder, 'settings.json'); Result := FSettingsFileName; end; function TFormMain.GetChatsFileName: string; begin if FChatsFileName.IsEmpty then FChatsFileName := TPath.Combine(Manager.AppFolder, 'chats.json'); Result := FChatsFileName; end; procedure TFormMain.Defaults; begin TimeOut := DEFAULT_TIMEOUT; Token := ''; Temperature := 1; FrequencyPenalty := 0; PresencePenalty := 0; TopP := 1; Model := ''; MaxTokens := 0; MaxTokensQuery := 0; FSelectedChatId := ''; end; procedure TFormMain.LoadSettings; begin try if not TFile.Exists(GetSettingsFileName) then Exit; var JsonText: string := ''; try JsonText := TFile.ReadAllText(GetSettingsFileName, TEncoding.UTF8); except Exit; end; if JsonText.IsEmpty then Exit; var JSON := TJSONObject.ParseJSONValue(JsonText); if Assigned(JSON) then try Token := JSON.GetValue('api_key', ''); Temperature := JSON.GetValue('temperature', 1); FrequencyPenalty := JSON.GetValue('frequency_penalty', 0.0); PresencePenalty := JSON.GetValue('presence_penalty', 0.0); TopP := JSON.GetValue('top_p', 1); Model := JSON.GetValue('model', ''); MaxTokens := JSON.GetValue('max_tokens', 0); MaxTokensQuery := JSON.GetValue('max_tokens_query', 0); FSelectedChatId := JSON.GetValue('selected_chat', ''); OpenAI.BaseUrl := JSON.GetValue('base_url', OpenAI.BaseUrl); UseFunctions := JSON.GetValue('use_functions', False); AutoExecFuncs := JSON.GetValue('auto_exec_funcs', False); Manager.SendByEnter := JSON.GetValue('send_by_enter', True); if JSON.GetValue('on_top', False) then FormStyle := TFormStyle.StayOnTop else FormStyle := TFormStyle.Normal; OpenAI.API.ProxySettings := TProxySettings.Create( JSON.GetValue('proxy_host', ''), JSON.GetValue('proxy_port', 0), JSON.GetValue('proxy_username', ''), JSON.GetValue('proxy_password', '')); TBitmap.Client.ProxySettings := OpenAI.API.ProxySettings; var Headers: TNetHeaders; var JHeaders: TJSONArray; if JSON.TryGetValue('custom_headers', JHeaders) then for var JHead in JHeaders do if JHead is TJSONObject then begin var HName: string; var HValue: string; if JHead.TryGetValue('name', HName) and JHead.TryGetValue('value', HValue) then Headers := Headers + [TNetHeader.Create(HName, HValue)]; end; Width := Max(Trunc(Constraints.MinWidth), JSON.GetValue('width', Width)); Height := Max(Trunc(Constraints.MinHeight), JSON.GetValue('height', Height)); Left := JSON.GetValue('left', Left); Top := JSON.GetValue('top', Top); if JSON.GetValue('menubuttons', True) then begin LayoutMenuButtons.Height := 210; ButtonMenuButonsSwitch.RotationAngle := 0; end else begin LayoutMenuButtons.Height := 17; ButtonMenuButonsSwitch.RotationAngle := 180; end; OpenAI.API.CustomHeaders := Headers; finally JSON.Free; end; finally if Token.IsEmpty then OpenSettings; end; end; procedure TFormMain.SaveSettings; begin var JSON := TJSONObject.Create; try JSON.AddPair('api_key', Token); JSON.AddPair('temperature', TJSONNumber.Create(Temperature)); JSON.AddPair('selected_chat', FSelectedChatId); JSON.AddPair('frequency_penalty', TJSONNumber.Create(FrequencyPenalty)); JSON.AddPair('presence_penalty', TJSONNumber.Create(PresencePenalty)); JSON.AddPair('top_p', TJSONNumber.Create(TopP)); JSON.AddPair('max_tokens', TJSONNumber.Create(MaxTokens)); JSON.AddPair('max_tokens_query', TJSONNumber.Create(MaxTokensQuery)); JSON.AddPair('model', Model); JSON.AddPair('on_top', FormStyle = TFormStyle.StayOnTop); JSON.AddPair('use_functions', UseFunctions); JSON.AddPair('auto_exec_funcs', AutoExecFuncs); JSON.AddPair('send_by_enter', Manager.SendByEnter); JSON.AddPair('proxy_host', OpenAI.API.ProxySettings.Host); JSON.AddPair('proxy_port', OpenAI.API.ProxySettings.Port); JSON.AddPair('proxy_username', OpenAI.API.ProxySettings.UserName); JSON.AddPair('proxy_password', OpenAI.API.ProxySettings.Password); JSON.AddPair('base_url', OpenAI.BaseUrl); JSON.AddPair('width', Width); JSON.AddPair('height', Height); JSON.AddPair('left', Left); JSON.AddPair('top', Top); JSON.AddPair('menubuttons', LayoutMenuButtons.Height >= 210); if Length(OpenAI.API.CustomHeaders) > 0 then begin var JHeaders := TJSONArray.Create; JSON.AddPair('custom_headers', JHeaders); for var Header in OpenAI.API.CustomHeaders do begin var JHead := TJSONObject.Create; JHead.AddPair('name', Header.Name); JHead.AddPair('value', Header.Value); JHeaders.Add(JHead); end; end; TFile.WriteAllText(GetSettingsFileName, JSON.ToJSON, TEncoding.UTF8); except // end; JSON.Free; end; procedure TFormMain.LoadChats; begin try if not TFile.Exists(GetChatsFileName) then Exit; var JsonText: string := ''; try JsonText := TFile.ReadAllText(GetChatsFileName, TEncoding.UTF8); except Exit; end; if JsonText.IsEmpty then Exit; var JSON := TJSONObject.ParseJSONValue(JsonText); if Assigned(JSON) then try var JSONChats: TJSONArray; if JSON.TryGetValue('items', JSONChats) then begin for var JChat in JSONChats do if JChat is TJSONObject then CreateChat(TJSONObject(JChat)); end; SelectChat(FSelectedChatId); finally JSON.Free; end; finally if LayoutChatsBox.ControlsCount <= 0 then SelectChat(CreateChat) else if (ListBoxChatList.Count > 0) and (ListBoxChatList.Selected = nil) then SelectChat((ListBoxChatList.ListItems[0] as TListBoxItemChat).ChatId); end; end; procedure TFormMain.SaveChats; begin var JSON := TJSONObject.Create; try var JSONChats := TJSONArray.Create; JSON.AddPair('items', JSONChats); for var i := 0 to ListBoxChatList.Count - 1 do if ListBoxChatList.ListItems[i] is TListBoxItemChat then begin var Frame := GetChatFrame(TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId); if Assigned(Frame) then JSONChats.Add(Frame.SaveAsJson) else JSONChats.Add(TListBoxItemChat(ListBoxChatList.ListItems[i]).JSON.Clone as TJSONObject); end; TFile.WriteAllText(GetChatsFileName, JSON.ToJSON, TEncoding.UTF8); except on E: Exception do ShowMessage(E.Message); end; JSON.Free; end; function TFormMain.GetChatFrame(const ChatId: string): TFrameChat; begin for var Control in LayoutChatsBox.Controls do if Control is TFrameChat then begin var Frame := TFrameChat(Control); if Frame.ChatId = ChatId then Exit(Frame); end; Result := nil; end; procedure TFormMain.SelectChat(const ChatId: string); begin FSelectedChatId := ChatId; var ItemList: TListBoxItemChat := nil; for var i := 0 to Pred(ListBoxChatList.Count) do if (ListBoxChatList.ListItems[i] as TListBoxItemChat).ChatId = ChatId then begin ListBoxChatList.ListItems[i].IsSelected := True; LabelChatName.Text := ListBoxChatList.ListItems[i].Text; ItemList := TListBoxItemChat(ListBoxChatList.ListItems[i]); Break; end; if not Assigned(ItemList) then Exit; var SelFrame: TFrameChat := nil; for var Control in LayoutChatsBox.Controls do if Control is TFrameChat then begin var Frame := TFrameChat(Control); Frame.Visible := Frame.ChatId = ChatId; if Frame.Visible then SelFrame := Frame; end; if not Assigned(SelFrame) then begin SelFrame := TFrameChat.Create(LayoutChatsBox); SelFrame.Parent := LayoutChatsBox; SelFrame.Align := TAlignLayout.Client; SelFrame.API := OpenAI; SelFrame.Mode := Mode; SelFrame.OnNeedFuncList := FOnNeedFuncList; SelFrame.OnTitleChanged := FOnChatTitleChanged; if Assigned(ItemList.JSON) then SelFrame.LoadFromJson(ItemList.JSON) else begin SelFrame.ChatId := ItemList.ChatId; SelFrame.Title := ItemList.Text; SelFrame.Temperature := Temperature; SelFrame.TopP := TopP; SelFrame.PresencePenalty := PresencePenalty; SelFrame.FrequencyPenalty := FrequencyPenalty; SelFrame.Model := Model; SelFrame.MaxTokens := MaxTokens; SelFrame.MaxTokensQuery := MaxTokensQuery; SelFrame.UseFunctions := UseFunctions; SelFrame.AutoExecFuncs := AutoExecFuncs; end; SelFrame.MenuItem := ItemList; SelFrame.Visible := True; end; SelFrame.Init; end; procedure TFormMain.FOnChatTitleChanged(Sender: TObject); var Frame: TFrameChat absolute Sender; begin for var i := 0 to Pred(ListBoxChatList.Count) do if ListBoxChatList.ListItems[i] is TListBoxItemChat then if TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId = Frame.ChatId then begin ListBoxChatList.ListItems[i].Text := Frame.Title; Break; end; if FSelectedChatId = Frame.ChatId then LabelChatName.Text := Frame.Title; end; procedure TFormMain.CreateGPTFunctions; begin // FGPTFuncList.Add(TChatFunctionWeather.Create); FGPTFuncList.AddRange(LoadExternalFunctions); end; constructor TFormMain.Create(AOwner: TComponent); begin inherited; FMode := TWindowMode.Full; //TAnimation.AniFrameRate := 300; ListBoxChatList.AniCalculations.Animation := True; //ListBoxChatList.AniCalculations.Interval := 1; ListBoxChatList.AniCalculations.Averaging := True; ListBoxChatList.DisableDisappear := True; {$IFDEF NEW_MEMO} var Style := StyleBook.Style; if Assigned(Style) then begin var ObjStyle := Style.FindStyleResource('memostyle_clear'); if Assigned(ObjStyle) then begin var Sel := ObjStyle.FindStyleResource('selection'); if Assigned(Sel) and (Sel is TBrushObject) then TBrushObject(Sel).Brush.Color := $FF1F2027; end; ObjStyle := Style.FindStyleResource('memostyle_code'); if Assigned(ObjStyle) then begin var Sel := ObjStyle.FindStyleResource('selection'); if Assigned(Sel) and (Sel is TBrushObject) then TBrushObject(Sel).Brush.Color := $FF4E4E53; end; TStyleManager.UpdateScenes; end; {$ENDIF} LayoutOverlay.Visible := True; LayoutOverlay.BringToFront; ListBoxChatList.AniCalculations.Animation := True; FGPTFuncList := TList.Create; FOpenAI := TOpenAIComponent.Create(Self); //FOpenAI.DisableBearerPrefix := True; FOpenAI.API.ConnectionTimeout := 30000; Manager.OverlayContainer := LayoutOverlay; Manager.GPTFuncList := FGPTFuncList; CreateGPTFunctions; Defaults; Clear; UpdateMode; end; procedure TFormMain.Clear; begin HideClearConfirm; ListBoxChatList.Clear; LayoutChatsBox.BeginUpdate; try while LayoutChatsBox.ControlsCount > 0 do LayoutChatsBox.Controls[0].Free; finally LayoutChatsBox.EndUpdate; end; end; procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin {$IFDEF MOBILE} if Overlays.Count > 0 then begin var Active := Overlays.Last; Active.Cancel; CanClose := False; end; {$ENDIF} end; procedure TFormMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Single); begin FormResize(Sender); end; procedure TFormMain.FormCreate(Sender: TObject); begin LoadSettings; LoadChats; end; procedure TFormMain.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); begin if (EventInfo.GestureID = sgiRightLeft) then begin Handled := True; ButtonMenuClick(nil); end; end; procedure TFormMain.OpenSettings; begin LayoutOverlay.BringToFront; TFrameSettings.Execute(LayoutOverlay, procedure(Frame: TFrameSettings) begin Frame.Mode := FMode; Frame.EditToken.Text := Token; Frame.EditOrg.Text := Organization; Frame.TrackBarTemp.Value := Temperature * 10; Frame.TrackBarPP.Value := PresencePenalty * 10; Frame.TrackBarFP.Value := FrequencyPenalty * 10; if MaxTokens <> 0 then Frame.EditMaxTokens.Text := MaxTokens.ToString else Frame.EditMaxTokens.Text := ''; if MaxTokensQuery <> 0 then Frame.EditQueryMaxToken.Text := MaxTokensQuery.ToString else Frame.EditQueryMaxToken.Text := ''; if (Timeout <> 0) and (Timeout <> DEFAULT_TIMEOUT) then Frame.EditTimeout.Text := Timeout.ToString else Frame.EditTimeout.Text := ''; Frame.ComboEditModel.Text := Model; Frame.TrackBarTopP.Value := TopP * 10; Frame.SwitchOnTop.IsChecked := FormStyle = TFormStyle.StayOnTop; Frame.EditProxyServer.Text := OpenAI.API.ProxySettings.Host; Frame.EditProxyPort.Text := OpenAI.API.ProxySettings.Port.ToString; Frame.EditProxyUsername.Text := OpenAI.API.ProxySettings.UserName; Frame.EditProxyPassword.Text := OpenAI.API.ProxySettings.Password; Frame.LabelVersion.Text := 'Version: ' + VersionName; Frame.EditBaseUrl.Text := OpenAI.BaseUrl; Frame.SwitchUseFunctions.IsChecked := UseFunctions; Frame.SwitchAutoExecFuncs.IsChecked := AutoExecFuncs; Frame.SwitchSendEnter.IsChecked := Manager.SendByEnter; for var Head in OpenAI.API.CustomHeaders do Frame.MemoCustomHeaders.Lines.AddPair(Head.Name, Head.Value); end, procedure(Frame: TFrameSettings; Success: Boolean) begin if not Success then Exit; Token := Frame.EditToken.Text; Organization := Frame.EditOrg.Text; Temperature := Frame.TrackBarTemp.Value / 10; PresencePenalty := Frame.TrackBarPP.Value / 10; FrequencyPenalty := Frame.TrackBarFP.Value / 10; TopP := Frame.TrackBarTopP.Value / 10; MaxTokens := StrToIntDef(Frame.EditMaxTokens.Text, 0); MaxTokensQuery := StrToIntDef(Frame.EditQueryMaxToken.Text, 0); Timeout := StrToIntDef(Frame.EditTimeout.Text, DEFAULT_TIMEOUT); Model := Frame.ComboEditModel.Text; if Frame.SwitchOnTop.IsChecked then FormStyle := TFormStyle.StayOnTop else FormStyle := TFormStyle.Normal; OpenAI.API.ProxySettings := TProxySettings.Create( Frame.EditProxyServer.Text, StrToIntDef(Frame.EditProxyPort.Text, 0), Frame.EditProxyUsername.Text, Frame.EditProxyPassword.Text); TBitmap.Client.ProxySettings := OpenAI.API.ProxySettings; OpenAI.BaseUrl := Frame.EditBaseUrl.Text; UseFunctions := Frame.SwitchUseFunctions.IsChecked; AutoExecFuncs := Frame.SwitchAutoExecFuncs.IsChecked; Manager.SendByEnter := Frame.SwitchSendEnter.IsChecked; var FHeaders: TNetHeaders; try for var Line in Frame.MemoCustomHeaders.Lines do begin var Pair := Line.Split([':']); if Length(Pair) = 2 then begin SetLength(FHeaders, Length(FHeaders) + 1); FHeaders[High(FHeaders)] := TNetHeader.Create(Pair[0], Pair[1]); end; end; except // end; OpenAI.API.CustomHeaders := FHeaders; if OpenAI.BaseUrl.IsEmpty then OpenAI.BaseUrl := TOpenAIAPI.URL_BASE; {$IFDEF MSWINDOWS} SetWindowColorModeAsSystem; {$ENDIF} SaveSettings; end); end; procedure TFormMain.FormResize(Sender: TObject); begin LayoutMenuContainer.Width := Min(320, ClientWidth - 45); if ClientWidth < 768 then Mode := TWindowMode.Compact else Mode := TWindowMode.Full; end; procedure TFormMain.FormSaveState(Sender: TObject); begin SaveChats; SaveSettings; end; procedure TFormMain.FormVirtualKeyboardHidden(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect); begin TAnimator.AnimateFloat(Self, 'Padding.Bottom', 0); TAnimator.AnimateFloat(LayoutOverlay, 'Margins.Bottom', 0); // Padding.Bottom := 0; // LayoutOverlay.Margins.Bottom := 0; end; procedure TFormMain.FormVirtualKeyboardShown(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect); begin TAnimator.AnimateFloat(Self, 'Padding.Bottom', Bounds.Height); TAnimator.AnimateFloat(LayoutOverlay, 'Margins.Bottom', Bounds.Height); // LayoutOverlay.Margins.Bottom := Bounds.Height; // Padding.Bottom := Bounds.Height; end; procedure TFormMain.UpdateMode; begin for var Control in LayoutChatsBox.Controls do if Control is TFrameChat then begin var Frame := TFrameChat(Control); Frame.Mode := FMode; end; for var Control in LayoutOverlay.Controls do if Control is TFrameOveraly then begin var Frame := TFrameOveraly(Control); Frame.Mode := FMode; end; case FMode of TWindowMode.Compact: begin RectangleMenu.Align := TAlignLayout.Client; RectangleMenu.Parent := LayoutMenuContainer; LayoutHead.Visible := True; ButtonCloseMenu.Visible := True; end; TWindowMode.Full: begin RectangleMenu.Align := TAlignLayout.Left; RectangleMenu.Width := 260; RectangleMenu.Parent := Self; LayoutHead.Visible := False; ButtonCloseMenu.Visible := False; LayoutMenuContent.Visible := False; RectangleMenu.SendToBack; end; end; end; procedure TFormMain.SetAutoExecFuncs(const Value: Boolean); begin FAutoExecFuncs := Value; end; procedure TFormMain.SetBaseUrl(const Value: string); begin FBaseUrl := Value; OpenAI.BaseUrl := FBaseUrl; end; procedure TFormMain.SetFrequencyPenalty(const Value: Single); begin FFrequencyPenalty := Value; end; procedure TFormMain.SetMaxTokens(const Value: Integer); begin FMaxTokens := Value; end; procedure TFormMain.SetMaxTokensQuery(const Value: Integer); begin FMaxTokensQuery := Value; end; procedure TFormMain.SetMode(const Value: TWindowMode); begin if FMode = Value then Exit; FMode := Value; UpdateMode; end; procedure TFormMain.SetModel(const Value: string); begin FModel := Value; end; procedure TFormMain.SetOrganization(const Value: string); begin FOrganization := Value; OpenAI.Organization := FOrganization; end; procedure TFormMain.SetPresencePenalty(const Value: Single); begin FPresencePenalty := Value; end; procedure TFormMain.SetTemperature(const Value: Single); begin FTemperature := Value; end; procedure TFormMain.SetTimeout(const Value: Integer); begin FTimeout := Value; if Value <= 0 then FTimeout := DEFAULT_TIMEOUT; FOpenAI.API.ResponseTimeout := FTimeout; FOpenAI.API.SendTimeout := FTimeout; end; procedure TFormMain.SetToken(const Value: string); begin FToken := Value; FOpenAI.Token := FToken; end; procedure TFormMain.SetTopP(const Value: Single); begin FTopP := Value; end; procedure TFormMain.SetUseFunctions(const Value: Boolean); begin FUseFunctions := Value; end; { TListBoxItemChat } constructor TListBoxItemChat.Create(AOwner: TComponent); begin inherited; JSON := nil; end; destructor TListBoxItemChat.Destroy; begin if Assigned(JSON) then JSON.Free; inherited; end; procedure TListBoxItemChat.Paint; begin var Canv: ISkCanvas; if Supports(Canvas, ISkCanvas, Canv) then Canv.Skew(1, 0.2); Canvas.SetMatrix(TMatrix.CreateScaling(1, 2)); inherited; Canvas.SetMatrix(TMatrix.CreateScaling(1, 2)); end; initialization {$IFDEF DEBUG} ReportMemoryLeaksOnShutdown := True; {$ENDIF} end. ================================================ FILE: ChatGPT.Manager.dfm ================================================ object Manager: TManager Height = 480 Width = 640 object SVGIconImageList: TSVGIconImageList Source = < item MultiResBitmap = < item Size = 24 end> IconName = 'Item 0' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 1' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 2' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 3' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 4' SVGText = '' FixedColor = claWhite Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 7' SVGText = '' FixedColor = claWhite Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 8' SVGText = '' FixedColor = claWhite Opacity = 1.000000000000000000 end item MultiResBitmap = < item Width = 19 Height = 15 end> IconName = 'Item 9' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 10' SVGText = '' + '<' + '/svg>' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 11' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 12' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 13' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 14' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 15' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 16' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 24 end> IconName = 'Item 17' SVGText = '' Opacity = 1.000000000000000000 end item MultiResBitmap = < item Size = 16 end> IconName = 'Item 18' SVGText = '' Opacity = 1.000000000000000000 end> Destination = < item Layers = < item Name = 'Item 0' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 1' end> end item Layers = < item Name = 'Item 2' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 3' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 4' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 7' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 8' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 9' SourceRect.Right = 19.000000000000000000 SourceRect.Bottom = 19.000000000000000000 end> end item Layers = < item Name = 'Item 10' end> end item Layers = < item Name = 'Item 11' end> end item Layers = < item Name = 'Item 12' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 13' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 14' end> end item Layers = < item Name = 'Item 15' end> end item Layers = < item Name = 'Item 16' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 17' SourceRect.Right = 24.000000000000000000 SourceRect.Bottom = 24.000000000000000000 end> end item Layers = < item Name = 'Item 18' end> end> Size = 24 Left = 160 Top = 18 end object ActionListMain: TActionList Left = 48 Top = 16 object ShowShareSheetAction: TShowShareSheetAction Category = 'Media Library' OnBeforeExecute = ShowShareSheetActionBeforeExecute end end end ================================================ FILE: ChatGPT.Manager.pas ================================================ unit ChatGPT.Manager; interface uses System.SysUtils, System.Classes, System.Actions, FMX.Controls, FMX.ActnList, FMX.StdActns, FMX.Graphics, FMX.MediaLibrary.Actions, System.ImageList, System.Generics.Collections, FMX.ImgList, FMX.SVGIconImageList, OpenAI.Chat.Functions; type TModelData = record Name: string; Context: Integer; Tokens: Integer; DataDate: string; Legacy: Boolean; class function Create(const Name: string; Context, Tokens: Integer; const DataDate: string; Legacy: Boolean = False): TModelData; static; end; TManager = class(TDataModule) SVGIconImageList: TSVGIconImageList; ActionListMain: TActionList; ShowShareSheetAction: TShowShareSheetAction; procedure ShowShareSheetActionBeforeExecute(Sender: TObject); private FShareBitmap: TBitmap; FCanShare: Boolean; FAppFolder: string; FImagesCacheFolder: string; FAudioCacheFolder: string; FSendByEnter: Boolean; FOverlayContainer: TControl; FGPTFuncList: TList; FActualModels: TArray; function GetCanShare: Boolean; procedure CreateAppFolder; procedure SetSendByEnter(const Value: Boolean); procedure SetOverlayContainer(const Value: TControl); procedure SetGPTFuncList(const Value: TList); procedure SetActualModels(const Value: TArray); procedure FillActualModels; public procedure ShareBitmap(Bitmap: TBitmap); property CanShare: Boolean read FCanShare; property AudioCacheFolder: string read FAudioCacheFolder; property ImagesCacheFolder: string read FImagesCacheFolder; property AppFolder: string read FAppFolder; property SendByEnter: Boolean read FSendByEnter write SetSendByEnter; property OverlayContainer: TControl read FOverlayContainer write SetOverlayContainer; property GPTFuncList: TList read FGPTFuncList write SetGPTFuncList; property ActualModels: TArray read FActualModels write SetActualModels; constructor Create(AOwner: TComponent); override; end; const ActualModels: TArray = [ 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-0613', 'gpt-4-0314', 'gpt-4', 'gpt-4-32k-0613', 'gpt-4-32k-0314', 'gpt-4-32k']; Legacy = True; var Manager: TManager; implementation {%CLASSGROUP 'FMX.Controls.TControl'} uses FMX.platform, FMX.Dialogs, FMX.MediaLibrary, System.IOUtils, HGM.FMX.Image; {$R *.dfm} constructor TManager.Create(AOwner: TComponent); begin inherited; FCanShare := GetCanShare; {$IFDEF IOS} FAppFolder := TPath.Combine(TPath.GetDocumentsPath, 'ChatGPT'); {$ELSE} FAppFolder := TPath.Combine(TPath.GetHomePath, 'ChatGPT'); {$ENDIF} FImagesCacheFolder := TPath.Combine(FAppFolder, 'images'); FAudioCacheFolder := TPath.Combine(FAppFolder, 'audios'); TBitmap.CachePath := FImagesCacheFolder; CreateAppFolder; FillActualModels; end; procedure TManager.FillActualModels; begin FActualModels := [ TModelData.Create('gpt-3.5-turbo-0613', 4096, 4096, 'Sep 2021', Legacy), TModelData.Create('gpt-3.5-turbo-0301', 4096, 4096, 'Sep 2021', Legacy), TModelData.Create('gpt-3.5-turbo-1106', 16385, 4096, 'Sep 2021'), TModelData.Create('gpt-3.5-turbo', 4096, 4096, 'Sep 2021'), TModelData.Create('gpt-3.5-turbo-16k', 16385, 4096, 'Sep 2021'), TModelData.Create('gpt-4-0613', 8192, 4096, 'Sep 2021'), TModelData.Create('gpt-4-0314', 8192, 4096, 'Sep 2021', Legacy), TModelData.Create('gpt-4', 8192, 4096, 'Sep 2021'), TModelData.Create('gpt-4-32k-0613', 32768, 4096, 'Sep 2021'), TModelData.Create('gpt-4-32k-0314', 32768, 4096, 'Sep 2021', Legacy), TModelData.Create('gpt-4-32k', 32768, 4096, 'Sep 2021'), TModelData.Create('gpt-4-1106-preview', 128000, 4096, 'Apr 2023'), TModelData.Create('gpt-4-vision-preview', 128000, 4096, 'Apr 2023') ]; end; procedure TManager.CreateAppFolder; begin try TDirectory.CreateDirectory(FAppFolder); TDirectory.CreateDirectory(FImagesCacheFolder); TDirectory.CreateDirectory(FAudioCacheFolder); except on E: Exception do ShowMessage('Error: ' + E.Message); end; end; procedure TManager.SetActualModels(const Value: TArray); begin FActualModels := Value; end; procedure TManager.SetGPTFuncList(const Value: TList); begin FGPTFuncList := Value; end; procedure TManager.SetOverlayContainer(const Value: TControl); begin FOverlayContainer := Value; end; procedure TManager.SetSendByEnter(const Value: Boolean); begin FSendByEnter := Value; end; procedure TManager.ShareBitmap(Bitmap: TBitmap); begin FShareBitmap := Bitmap; ShowShareSheetAction.Execute; end; procedure TManager.ShowShareSheetActionBeforeExecute(Sender: TObject); begin ShowShareSheetAction.Bitmap.Assign(FShareBitmap); end; function TManager.GetCanShare: Boolean; begin var FSharingService: IFMXShareSheetActionsService; Result := TPlatformServices.Current.SupportsPlatformService(IFMXShareSheetActionsService, FSharingService); end; { TModelData } class function TModelData.Create(const Name: string; Context, Tokens: Integer; const DataDate: string; Legacy: Boolean): TModelData; begin Result.Name := Name; Result.Context := Context; Result.Tokens := Tokens; Result.DataDate := DataDate; Result.Legacy := Legacy; end; end. ================================================ FILE: ChatGPT.Overlay.fmx ================================================ object FrameOveraly: TFrameOveraly Size.Width = 689.000000000000000000 Size.Height = 469.000000000000000000 Size.PlatformDefault = False object RectangleBG: TRectangle Align = Contents Fill.Color = xBF565869 Locked = True Size.Width = 689.000000000000000000 Size.Height = 469.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None end end ================================================ FILE: ChatGPT.Overlay.pas ================================================ unit ChatGPT.Overlay; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Classes, FMX.Objects, System.Generics.Collections; type TFrameOveraly = class(TFrame) RectangleBG: TRectangle; private FMode: TWindowMode; protected procedure SetMode(const Value: TWindowMode); virtual; public property Mode: TWindowMode read FMode write SetMode; procedure Cancel; virtual; abstract; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; var Overlays: TList; implementation {$R *.fmx} { TFrameOveraly } constructor TFrameOveraly.Create(AOwner: TComponent); begin inherited; Overlays.Add(Self); Name := ''; SetFocus; end; destructor TFrameOveraly.Destroy; begin Overlays.Remove(Self); inherited; end; procedure TFrameOveraly.SetMode(const Value: TWindowMode); begin FMode := Value; end; initialization Overlays := TList.Create; finalization Overlays.Free; end. ================================================ FILE: ChatGPT.Settings.fmx ================================================ inherited FrameSettings: TFrameSettings Size.Width = 906.000000000000000000 Size.Height = 804.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 906.000000000000000000 Size.Height = 804.000000000000000000 OnClick = RectangleBGClick end object LayoutClient: TLayout Align = Center Padding.Left = 10.000000000000000000 Padding.Top = 10.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 440.000000000000000000 Size.Height = 772.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 440.000000000000000000 Size.Height = 772.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object VertScrollBoxContent: TVertScrollBox Align = Client Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Margins.Right = -10.000000000000000000 Size.Width = 430.000000000000000000 Size.Height = 706.000000000000000000 Size.PlatformDefault = False TabOrder = 1 Viewport.Width = 414.000000000000000000 Viewport.Height = 706.000000000000000000 object EditToken: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 8 Position.Y = 300.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'sk-rBYbw....' object ClearEditButton2: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path1: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label1: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 10.000000000000000000 Position.Y = 10.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 25.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 20.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.HorzAlign = Center TextSettings.WordWrap = False Text = 'Settings' TabOrder = 59 end object Label3: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1412.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Temperature (default: 1.0)' TabOrder = 33 TabStop = False end object Label4: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1464.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'The higher, the more creativity will be in the answers (less acc' + 'urate)' TabOrder = 36 TabStop = False end object Label5: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 273.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Token (required)' TabOrder = 7 TabStop = False end object Label6: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 838.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Default chat settings (for new chats)' TabOrder = 19 TabStop = False end object Layout3: TLayout Align = Top Position.Y = 1434.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 35 TabStop = False object TrackBarTemp: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Value = 10.000000000000000000 OnTracking = TrackBarTempTracking end object LabelTemp: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '2.0' TabOrder = 1 TabStop = False end end object Layout4: TLayout Align = Top Margins.Top = 10.000000000000000000 Position.Y = 343.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 10 TabStop = False object ButtonGetToken: TButton Align = Left ImageIndex = 9 Size.Width = 289.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'Obtain API token from your Open AI' TextSettings.HorzAlign = Leading ParentShowHint = False ShowHint = True OnClick = ButtonGetTokenClick end end object Label8: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 875.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Model (default: gpt-3.5-turbo)' TabOrder = 20 TabStop = False end object ComboEditModel: TComboEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'combo_style' TabOrder = 21 DropDownKind = Custom ItemHeight = 36.000000000000000000 Items.Strings = ( 'gpt-3.5-turbo' 'gpt-3.5-turbo-0613' 'gpt-3.5-turbo-16k' 'gpt-4' 'gpt-4-turbo' 'gpt-4-0613' 'gpt-4-32k') ItemIndex = 0 Text = 'gpt-3.5-turbo' Position.Y = 897.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False OnMouseWheel = ComboEditModelMouseWheel end object Label9: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1192.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Model max tokens (default: 4096)' TabOrder = 25 TabStop = False end object EditMaxTokens: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 27 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 1219.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'Example: 4096' object ClearEditButton3: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path2: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Layout1: TLayout Align = Top Position.Y = 1526.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 38 TabStop = False object TrackBarPP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Min = -20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnTracking = TrackBarPPTracking end object LabelPP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 1 TabStop = False end end object Label11: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1556.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Number between -2.0 and 2.0. Positive values penalize new tokens' + ' based on whether they appear in the text so far, increasing the' + ' model'#39's likelihood to talk about new topics.' TabOrder = 39 TabStop = False end object Label12: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1504.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Presence penalty (default: 0.0)' TabOrder = 37 TabStop = False end object Label13: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1677.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Number between -2.0 and 2.0. Positive values penalize new tokens' + ' based on their existing frequency in the text so far, decreasin' + 'g the model'#39's likelihood to repeat the same line verbatim.' TabOrder = 42 TabStop = False end object Layout5: TLayout Align = Top Position.Y = 1647.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 41 TabStop = False object TrackBarFP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 20.000000000000000000 Min = -20.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TabOrder = 0 OnTracking = TrackBarFPTracking end object LabelFP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 1 TabStop = False end end object Label15: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1625.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Frequency penalty (default: 0.0)' TabOrder = 40 TabStop = False end object Label16: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1302.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Query max tokens (default: 1024)' TabOrder = 30 TabStop = False end object EditQueryMaxToken: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 31 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 1329.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'Example: 1024' object ClearEditButton4: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path3: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label17: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1262.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Limit of the selected model' TabOrder = 29 TabStop = False end object Label18: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1372.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Max number of tokens per request' TabOrder = 32 TabStop = False end object Label19: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 940.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'GPT-4 is currently in a limited beta and only accessible to thos' + 'e who have been granted access' TabOrder = 23 TabStop = False end object LabelAppearance: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 75.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Appearance' TabOrder = 0 TabStop = False end object Label14: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 456.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Organization' TabOrder = 11 TabStop = False end object EditOrg: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 12 Position.Y = 483.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButton5: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path5: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label20: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 526.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 44.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'For users who belong to multiple organizations, you can specify ' + 'which organization is used for an API request. Usage from these ' + 'API requests will count against the specified organization'#39's sub' + 'scription quota.' TabOrder = 15 TabStop = False end object EditBaseUrl: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 18 KeyboardType = URL Position.Y = 612.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'https://api.openai.com/v1' object ClearEditButton6: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path6: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label21: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 585.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Base url' TabOrder = 17 TabStop = False end object Label22: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 236.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'General settings' TabOrder = 6 TabStop = False end object LayoutOnTop: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Position.Y = 102.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 4 TabStop = False object SwitchOnTop: TSwitch Align = Right IsChecked = False Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label23: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Show window on top' TabOrder = 0 TabStop = False end end object Label10: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2087.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Proxy (default: System proxy)' TabOrder = 49 TabStop = False end object Label24: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2124.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Server (required)' TabOrder = 51 TabStop = False end object EditProxyServer: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 52 Position.Y = 2151.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = 'http or https://...' object ClearEditButton7: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path7: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label25: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2194.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Port' TabOrder = 53 TabStop = False end object EditProxyPort: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 54 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 2221.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButton8: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path8: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object EditProxyUsername: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 56 Position.Y = 2291.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButton9: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path9: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label26: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2264.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Username' TabOrder = 55 TabStop = False end object EditProxyPassword: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 58 Position.Y = 2361.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False object ClearEditButton10: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path10: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label27: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2334.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Password' TabOrder = 57 TabStop = False end object Label28: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1798.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 73.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'An alternative to sampling with temperature, called nucleus samp' + 'ling, where the model considers the results of the tokens with t' + 'op_p probability mass. So 0.1 means only the tokens comprising t' + 'he top 10% probability mass are considered.'#13#10'We generally recomm' + 'end altering this or temperature but not both.' TabOrder = 46 TabStop = False end object Layout6: TLayout Align = Top Position.Y = 1768.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 44 TabStop = False object TrackBarTopP: TTrackBar Align = Client CanParentFocus = True Frequency = 1.000000000000000000 Max = 10.000000000000000000 Orientation = Horizontal Size.Width = 370.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Value = 10.000000000000000000 OnTracking = TrackBarTopPTracking end object LabelTopP: TLabel Align = Right StyledSettings = [Style] Margins.Left = 6.000000000000000000 Position.X = 376.000000000000000000 Size.Width = 28.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xBEFFFFFF TextSettings.HorzAlign = Trailing TextSettings.WordWrap = False Text = '0.0' TabOrder = 1 TabStop = False end end object Label30: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1746.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Top P (default: 1.0)' TabOrder = 43 TabStop = False end object Label29: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2454.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Info' TabOrder = 47 TabStop = False end object LabelVersion: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 2491.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Version: ' TabOrder = 50 TabStop = False end object Label31: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 2404.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 15.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Proxy is not used if Server is empty' TabOrder = 45 TabStop = False end object Label32: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 655.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Custom headers' TabOrder = 16 TabStop = False end object MemoCustomHeaders: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] DataDetectorTypes = [] Align = Top Margins.Top = 5.000000000000000000 Position.Y = 682.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 82.000000000000000000 Size.PlatformDefault = False StyleLookup = 'memostyle_normal' TabOrder = 60 Viewport.Width = 388.000000000000000000 Viewport.Height = 66.000000000000000000 end object Label33: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 774.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'You can add custom headers for third party APIs. '#13#10'Example: "hea' + 'der-name: value"' TabOrder = 13 TabStop = False end object Layout7: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Margins.Top = 20.000000000000000000 Position.Y = 1003.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 2 TabStop = False object SwitchUseFunctions: TSwitch Align = Right IsChecked = False Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label34: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Use functions' TabOrder = 0 TabStop = False end end object Label35: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 1073.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'In an API call, you can describe functions to gpt-3.5-turbo-0613' + ', gpt-3.5-turbo-16k and gpt-4-0613' TabOrder = 22 TabStop = False end object Label36: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 419.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Optional settings' TabOrder = 5 TabStop = False end object Layout8: TLayout Align = Top Margins.Top = 10.000000000000000000 Position.Y = 1117.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 9 TabStop = False object ButtonLoadedFunctions: TButton Align = Left Size.Width = 161.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 0 Text = 'View loaded functions' TextSettings.HorzAlign = Leading ParentShowHint = False ShowHint = True OnClick = ButtonLoadedFunctionsClick end end object Layout9: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Position.Y = 1033.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 1 TabStop = False object SwitchAutoExecFuncs: TSwitch Align = Right IsChecked = False Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label37: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Auto execution of functions' TabOrder = 0 TabStop = False end end object Layout10: TLayout Align = Top Position.Y = 2513.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TabOrder = 34 end object Label2: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 2023.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Time in milliseconds that determines how long the client will wa' + 'it for a response from the server' TabOrder = 28 TabStop = False end object EditTimeout: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top StyleLookup = 'editstyle_clear' TabOrder = 26 KeyboardType = DecimalNumberPad FilterChar = '0123456789' Position.Y = 1980.000000000000000000 Margins.Top = 5.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextPrompt = '120000ms' object ClearEditButton1: TClearEditButton Touch.InteractiveGestures = [LongTap] CanFocus = False Cursor = crArrow Hint = 'Clear' Size.Width = 28.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_clearmini' TabOrder = 0 Text = 'buttonstyle_clearmini' object Path4: TPath Align = Center Data.Path = { 0E00000000000000000060413333B33F010000009A9949410000000001000000 0000E0403333B340010000003333B33F0000000001000000000000003333B33F 010000003333B3400000E04001000000000000009A994941010000003333B33F 00006041010000000000E04066660641010000009A9949410000604101000000 000060419A99494101000000666606410000E04001000000000060413333B33F 03000000000060413333B33F} Fill.Color = xFFACACBE Locked = True HitTest = False Margins.Left = 2.000000000000000000 Size.Width = 13.000000000000000000 Size.Height = 13.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None WrapMode = Fit end end end object Label7: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 20.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1953.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF Text = 'Timout (ms, default: 120000ms - 2min)' TabOrder = 24 TabStop = False end object Label38: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 30.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.Y = 1906.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 18.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'HTTP' TabOrder = 48 TabStop = False end object Layout11: TLayout Align = Top Padding.Top = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Position.Y = 132.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 30.000000000000000000 Size.PlatformDefault = False TabOrder = 3 TabStop = False object SwitchSendEnter: TSwitch Align = Right IsChecked = True Margins.Top = 2.000000000000000000 Margins.Bottom = 2.000000000000000000 Position.X = 359.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 45.000000000000000000 Size.Height = 18.000000000000000000 Size.PlatformDefault = False TabOrder = 1 end object Label39: TLabel Align = Client AutoSize = True StyledSettings = [Style] Size.Width = 359.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xB4FFFFFF TextSettings.WordWrap = False Text = 'Sending by pressing Enter' TabOrder = 0 TabStop = False end end object Label40: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Left = 5.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 5.000000000000000000 Margins.Bottom = 5.000000000000000000 Position.X = 5.000000000000000000 Position.Y = 172.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 29.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.FontColor = x78FFFFFF Text = 'Line break, in this case, will be possible by pressing Ctrl + En' + 'ter or Shift + Enter' TabOrder = 14 TabStop = False end object ALLine1: TLine Align = Top LineType = Top Margins.Top = 4.000000000000000000 Margins.Bottom = 3.000000000000000000 Position.Y = 978.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 2.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF343539 end object ALLine2: TLine Align = Top LineType = Top Margins.Top = 4.000000000000000000 Margins.Bottom = 3.000000000000000000 Position.Y = 1167.000000000000000000 Size.Width = 404.000000000000000000 Size.Height = 2.000000000000000000 Size.PlatformDefault = False Stroke.Color = xFF343539 end end object Layout2: TLayout Align = Bottom Position.X = 10.000000000000000000 Position.Y = 716.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 3 object ButtonCancel: TButton Align = Right Cancel = True Position.X = 340.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 2 Text = 'CANCEL' ParentShowHint = False ShowHint = True OnClick = ButtonCancelClick end object ButtonOk: TButton Align = Right Position.X = 260.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 3 Text = 'OK' OnClick = ButtonOkClick end end end end ================================================ FILE: ChatGPT.Settings.pas ================================================ unit ChatGPT.Settings; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Edit, FMX.Objects, FMX.Layouts, ChatGPT.Classes, FMX.ComboEdit, FMX.ListBox, FMX.Controls.Presentation, FMX.ComboEdit.Style, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} type TStyledComboEdit = class(FMX.ComboEdit.Style.TStyledComboEdit) procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override; protected function CreateListBox: TComboEditListBox; override; end; TTrackBar = class(FMX.StdCtrls.TTrackBar) procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override; end; TFrameSettings = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; Label1: TLabel; Label3: TLabel; Label4: TLabel; Layout2: TLayout; ButtonCancel: TButton; ButtonOk: TButton; Layout3: TLayout; TrackBarTemp: TTrackBar; LabelTemp: TLabel; EditToken: TEdit; ClearEditButton2: TClearEditButton; Path1: TPath; Label5: TLabel; Label6: TLabel; Layout4: TLayout; ButtonGetToken: TButton; VertScrollBoxContent: TVertScrollBox; Label8: TLabel; ComboEditModel: TComboEdit; Label9: TLabel; EditMaxTokens: TEdit; ClearEditButton3: TClearEditButton; Path2: TPath; Layout1: TLayout; TrackBarPP: TTrackBar; LabelPP: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Layout5: TLayout; TrackBarFP: TTrackBar; LabelFP: TLabel; Label15: TLabel; Label16: TLabel; EditQueryMaxToken: TEdit; ClearEditButton4: TClearEditButton; Path3: TPath; Label17: TLabel; Label18: TLabel; Label19: TLabel; LabelAppearance: TLabel; Label14: TLabel; EditOrg: TEdit; ClearEditButton5: TClearEditButton; Path5: TPath; Label20: TLabel; EditBaseUrl: TEdit; ClearEditButton6: TClearEditButton; Path6: TPath; Label21: TLabel; Label22: TLabel; LayoutOnTop: TLayout; SwitchOnTop: TSwitch; Label23: TLabel; Label10: TLabel; Label24: TLabel; EditProxyServer: TEdit; ClearEditButton7: TClearEditButton; Path7: TPath; Label25: TLabel; EditProxyPort: TEdit; ClearEditButton8: TClearEditButton; Path8: TPath; EditProxyUsername: TEdit; ClearEditButton9: TClearEditButton; Path9: TPath; Label26: TLabel; EditProxyPassword: TEdit; ClearEditButton10: TClearEditButton; Path10: TPath; Label27: TLabel; Label28: TLabel; Layout6: TLayout; TrackBarTopP: TTrackBar; LabelTopP: TLabel; Label30: TLabel; Label29: TLabel; LabelVersion: TLabel; Label31: TLabel; Label32: TLabel; MemoCustomHeaders: TMemo; Label33: TLabel; Layout7: TLayout; SwitchUseFunctions: TSwitch; Label34: TLabel; Label35: TLabel; Label36: TLabel; Layout8: TLayout; ButtonLoadedFunctions: TButton; Layout9: TLayout; SwitchAutoExecFuncs: TSwitch; Label37: TLabel; Layout10: TLayout; Label2: TLabel; EditTimeout: TEdit; ClearEditButton1: TClearEditButton; Path4: TPath; Label7: TLabel; Label38: TLabel; Layout11: TLayout; SwitchSendEnter: TSwitch; Label39: TLabel; Label40: TLabel; ALLine1: TLine; ALLine2: TLine; procedure TrackBarTempTracking(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure ButtonOkClick(Sender: TObject); procedure ButtonGetTokenClick(Sender: TObject); procedure FrameResize(Sender: TObject); procedure RectangleBGClick(Sender: TObject); procedure TrackBarPPTracking(Sender: TObject); procedure TrackBarFPTracking(Sender: TObject); procedure TrackBarTopPTracking(Sender: TObject); procedure ButtonLoadedFunctionsClick(Sender: TObject); procedure ComboEditModelMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); private FProcCallback: TProc; FLayoutClientWidth, FLayoutClientHeight: Single; protected procedure SetMode(const Value: TWindowMode); override; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); end; var FrameSettings: TFrameSettings; implementation uses System.Math, FMX.Ani, FMX.Presentation.Style, FMX.Presentation.Factory, HGM.FMX.Ani, ChatGPT.LoadedFunctions, ChatGPT.Manager; {$R *.fmx} { TFrameSettings } procedure TFrameSettings.ButtonCancelClick(Sender: TObject); begin Cancel; end; procedure TFrameSettings.ButtonGetTokenClick(Sender: TObject); begin OpenUrl('https://platform.openai.com/account/api-keys'); end; procedure TFrameSettings.ButtonLoadedFunctionsClick(Sender: TObject); begin TFrameLoadedFunctions.Execute(TControl(Parent)); end; procedure TFrameSettings.ButtonOkClick(Sender: TObject); begin if Assigned(FProcCallback) then FProcCallback(Self, True); Release; end; procedure TFrameSettings.Cancel; begin if Assigned(FProcCallback) then FProcCallback(Self, False); Release; end; procedure TFrameSettings.ComboEditModelMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin Handled := True; VertScrollBoxContent.AniCalculations.MouseWheel(0, -WheelDelta); end; constructor TFrameSettings.Create(AOwner: TComponent); begin inherited; {$IFDEF MOBILE} LabelAppearance.Visible := False; LayoutOnTop.Visible := False; {$ENDIF} Name := ''; MemoCustomHeaders.Text := ''; MemoCustomHeaders.Lines.NameValueSeparator := ':'; ComboEditModel.Items.Clear; var ActualModels: TArray := []; SetLength(ActualModels, Length(Manager.ActualModels)); for var i := 0 to High(Manager.ActualModels) do ActualModels[i] := Manager.ActualModels[i].Name; ComboEditModel.Items.AddStrings(ActualModels); if ComboEditModel.Presentation is TStyledComboEdit then begin var Style := TStyledComboEdit(ComboEditModel.Presentation); for var i := 0 to Style.ListBox.Count - 1 do begin Style.ListBox.ListItems[i].StyleLookup := 'listboxitemstyle_model'; Style.ListBox.ListItems[i].StylesData['context'] := Manager.ActualModels[i].Context.ToString; Style.ListBox.ListItems[i].StylesData['tokens'] := Manager.ActualModels[i].Tokens.ToString; Style.ListBox.ListItems[i].StylesData['datadate'] := Manager.ActualModels[i].DataDate; Style.ListBox.ListItems[i].StylesData['legacy.Visible'] := Manager.ActualModels[i].Legacy; end; end; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; VertScrollBoxContent.AniCalculations.Animation := True; //VertScrollBoxContent.AniCalculations.Interval := 1; VertScrollBoxContent.ViewportPosition := TPoint.Zero; end; class procedure TFrameSettings.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); begin var Frame := TFrameSettings.Create(AParent); Frame.Parent := AParent; Frame.FProcCallback := ProcExecuted; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; if Assigned(ProcSet) then ProcSet(Frame); Frame.TrackBarTempTracking(nil); Frame.TrackBarPPTracking(nil); Frame.TrackBarFPTracking(nil); Frame.TrackBarTopPTracking(nil); Frame.ButtonCancel.SetFocus; end; procedure TFrameSettings.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameSettings.RectangleBGClick(Sender: TObject); begin Cancel; end; procedure TFrameSettings.SetMode(const Value: TWindowMode); begin inherited; if Mode = TWindowMode.Compact then begin LayoutClient.Align := TAlignLayout.Client; RectangleFrame.Corners := []; end else begin LayoutClient.Align := TAlignLayout.Center; RectangleFrame.Corners := AllCorners; end; FrameResize(nil); end; procedure TFrameSettings.TrackBarFPTracking(Sender: TObject); begin LabelFP.Text := FormatFloat('0.0', TrackBarFP.Value / 10); end; procedure TFrameSettings.TrackBarPPTracking(Sender: TObject); begin LabelPP.Text := FormatFloat('0.0', TrackBarPP.Value / 10); end; procedure TFrameSettings.TrackBarTempTracking(Sender: TObject); begin LabelTemp.Text := FormatFloat('0.0', TrackBarTemp.Value / 10); end; procedure TFrameSettings.TrackBarTopPTracking(Sender: TObject); begin LabelTopP.Text := FormatFloat('0.0', TrackBarTopP.Value / 10); end; { TStyledComboEdit } function TStyledComboEdit.CreateListBox: TComboEditListBox; begin Result := inherited; Result.DefaultItemStyles.ItemStyle := 'listboxitemstyle_model'; Result.AniCalculations.Animation := True; //Result.AniCalculations.Interval := 1; end; procedure TStyledComboEdit.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin Handled := False; end; { TTrackBar } procedure TTrackBar.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin Handled := False; end; initialization //TPresentationProxyFactory.Current.Unregister(TComboEdit, TControlType.Styled, TStyledPresentationProxy); //TPresentationProxyFactory.Current.Register(TComboEdit, TControlType.Styled, TStyledPresentationProxy); finalization //TPresentationProxyFactory.Current.Unregister(TComboEdit, TControlType.Styled, TStyledPresentationProxy); end. ================================================ FILE: ChatGPT.SoundRecorder.pas ================================================ unit ChatGPT.SoundRecorder; interface uses System.Classes, System.SysUtils, FMX.Media; type TAudioRecord = class(TComponent) private FFileName: string; FMicrophone: TAudioCaptureDevice; FOnStartRecord: TNotifyEvent; procedure MicrophonePermissionRequest(Sender: TObject; const&Message: string; const AccessGranted: Boolean); procedure SetOnStartRecord(const Value: TNotifyEvent); function GetIsAvailableDevice: Boolean; public function IsMicrophoneRecording: Boolean; constructor Create(AOwner: TComponent); override; procedure StartRecord(const FileName: string); procedure StopRecord; property Microphone: TAudioCaptureDevice read FMicrophone write FMicrophone; property OnStartRecord: TNotifyEvent read FOnStartRecord write SetOnStartRecord; property IsAvailableDevice: Boolean read GetIsAvailableDevice; end; implementation { TAudioRecord } constructor TAudioRecord.Create(AOwner: TComponent); begin inherited; FMicrophone := nil;// TCaptureDeviceManager.Current.DefaultAudioCaptureDevice; if Assigned(FMicrophone) then FMicrophone.OnPermissionRequest := MicrophonePermissionRequest; end; function TAudioRecord.GetIsAvailableDevice: Boolean; begin Result := Assigned(FMicrophone); end; function TAudioRecord.IsMicrophoneRecording: Boolean; begin if not Assigned(FMicrophone) then Exit(False); Result := FMicrophone.State = TCaptureDeviceState.Capturing; end; procedure TAudioRecord.MicrophonePermissionRequest(Sender: TObject; const Message: string; const AccessGranted: Boolean); begin if not Assigned(FMicrophone) then Exit; if AccessGranted then begin FMicrophone.StartCapture; if Assigned(FOnStartRecord) then FOnStartRecord(Self); end else raise Exception.Create('Cannot record audio without the relevant permission being granted: '#13#10 + Message); end; procedure TAudioRecord.SetOnStartRecord(const Value: TNotifyEvent); begin FOnStartRecord := Value; end; procedure TAudioRecord.StartRecord(const FileName: string); begin if not Assigned(FMicrophone) then raise Exception.Create('No suitable device'); FFileName := FileName; FMicrophone.FileName := FFileName; FMicrophone.RequestPermission; end; procedure TAudioRecord.StopRecord; begin if not Assigned(FMicrophone) then raise Exception.Create('No suitable device'); if IsMicrophoneRecording then FMicrophone.StopCapture; end; end. ================================================ FILE: ChatGPT.TextEditor.fmx ================================================ inherited FrameTextEditor: TFrameTextEditor Size.Width = 1035.000000000000000000 Size.Height = 811.000000000000000000 OnResize = FrameResize OnResized = FrameResize inherited RectangleBG: TRectangle Size.Width = 1035.000000000000000000 Size.Height = 811.000000000000000000 end object LayoutClient: TLayout Align = Center Padding.Left = 10.000000000000000000 Padding.Top = 10.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 Size.Width = 440.000000000000000000 Size.Height = 566.000000000000000000 Size.PlatformDefault = False TabOrder = 0 object RectangleFrame: TRectangle Align = Contents Fill.Color = xFF202123 Locked = True Size.Width = 440.000000000000000000 Size.Height = 566.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 end object LayoutActions: TLayout Align = Bottom Position.X = 10.000000000000000000 Position.Y = 510.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False TabOrder = 2 object ButtonOk: TButton Align = Right Position.X = 260.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 2 Text = 'OK' OnClick = ButtonOkClick end object ButtonCancel: TButton Align = Right Cancel = True Position.X = 340.000000000000000000 Size.Width = 80.000000000000000000 Size.Height = 46.000000000000000000 Size.PlatformDefault = False StyleLookup = 'buttonstyle_menu' TabOrder = 3 Text = 'CANCEL' OnClick = ButtonCancelClick end end object LabelCaption: TLabel Align = Top AutoSize = True StyledSettings = [Style] Margins.Top = 10.000000000000000000 Position.X = 10.000000000000000000 Position.Y = 20.000000000000000000 Size.Width = 420.000000000000000000 Size.Height = 20.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Family = 'Roboto' TextSettings.Font.Size = 16.000000000000000000 TextSettings.FontColor = xFFE9E9E9 TextSettings.WordWrap = False Text = 'Title' TabOrder = 49 end object Rectangle1: TRectangle Align = Client Fill.Color = x78000000 Margins.Left = 6.000000000000000000 Margins.Top = 6.000000000000000000 Margins.Right = 6.000000000000000000 Margins.Bottom = 6.000000000000000000 Size.Width = 408.000000000000000000 Size.Height = 458.000000000000000000 Size.PlatformDefault = False Stroke.Kind = None XRadius = 6.000000000000000000 YRadius = 6.000000000000000000 object MemoText: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] DataDetectorTypes = [] StyledSettings = [Family, Style] TextSettings.Font.Size = 14.000000000000000000 TextSettings.FontColor = xFFEDEDED TextSettings.WordWrap = True Align = Client Size.Width = 408.000000000000000000 Size.Height = 458.000000000000000000 Size.PlatformDefault = False StyleLookup = 'memostyle_clear' TabOrder = 0 OnPresentationNameChoosing = MemoTextPresentationNameChoosing Viewport.Width = 398.000000000000000000 Viewport.Height = 458.000000000000000000 end end end end ================================================ FILE: ChatGPT.TextEditor.pas ================================================ unit ChatGPT.TextEditor; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, ChatGPT.Overlay, FMX.Objects, FMX.Controls.Presentation, FMX.Layouts, FMX.ListBox, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; type TFrameTextEditor = class(TFrameOveraly) LayoutClient: TLayout; RectangleFrame: TRectangle; LayoutActions: TLayout; ButtonOk: TButton; LabelCaption: TLabel; Rectangle1: TRectangle; MemoText: TMemo; ButtonCancel: TButton; procedure FrameResize(Sender: TObject); procedure ButtonOkClick(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string); private FProcCallback: TProc; FLayoutClientWidth, FLayoutClientHeight: Single; public constructor Create(AOwner: TComponent); override; procedure Cancel; override; class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); end; var FrameTextEditor: TFrameTextEditor; implementation uses System.Math; {$R *.fmx} procedure TFrameTextEditor.ButtonCancelClick(Sender: TObject); begin Cancel; end; procedure TFrameTextEditor.ButtonOkClick(Sender: TObject); begin if Assigned(FProcCallback) then FProcCallback(Self, True); Release; end; procedure TFrameTextEditor.Cancel; begin if Assigned(FProcCallback) then FProcCallback(Self, False); Release; end; constructor TFrameTextEditor.Create(AOwner: TComponent); begin inherited; Name := ''; FLayoutClientWidth := LayoutClient.Width; FLayoutClientHeight := LayoutClient.Height; end; class procedure TFrameTextEditor.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc); begin var Frame := TFrameTextEditor.Create(AParent); Frame.Parent := AParent; Frame.FProcCallback := ProcExecuted; Frame.Align := TAlignLayout.Contents; Frame.BringToFront; if Assigned(ProcSet) then ProcSet(Frame); Frame.MemoText.SetFocus; end; procedure TFrameTextEditor.FrameResize(Sender: TObject); begin LayoutClient.Width := Min(FLayoutClientWidth, Width); LayoutClient.Height := Min(FLayoutClientHeight, Height); end; procedure TFrameTextEditor.MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string); begin inherited; PresenterName := 'RichEditStyled'; end; end. ================================================ FILE: ChatGPT.deployproj ================================================  12 127.0.0.1:58526 127.0.0.1:58526 ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\Assets\ Logo150x150.png UWP_DelphiLogo150 1 True ChatGPT\Assets\ Logo44x44.png UWP_DelphiLogo44 1 True ChatGPT\ ChatGPT.exe ProjectOutput 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\res\values\ strings.xml Android_Strings 1 True ChatGPT\res\drawable\ splash_image_def.xml AndroidSplashImageDef 1 True ChatGPT\library\lib\arm64-v8a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\arm64-v8a\ libsk4d.so Skia 1 True True ChatGPT\res\drawable-night-anydpi-v21\ splash_vector.xml Android_VectorizedSplashDark 1 True ChatGPT\res\drawable-night-anydpi-v21\ splash_vector.xml Android_VectorizedSplashDark 1 True ChatGPT\res\values-v31\ styles.xml AndroidSplashStylesV31 1 True ChatGPT\res\drawable-normal\ splash_image.png Android_SplashImage470 1 True ChatGPT\res\drawable-normal\ splash_image.png Android_SplashImage470 1 True ChatGPT\library\lib\mips\ libChatGPT.so AndroidLibnativeMipsFile 1 True ChatGPT\library\lib\arm64-v8a\ libChatGPT.so ProjectOutput 1 True True ChatGPT\library\lib\armeabi-v7a\ libChatGPT.so AndroidLibnativeArmeabiv7aFile 1 True ChatGPT\res\values-v21\ styles.xml AndroidSplashStylesV21 1 True ChatGPT\res\values\ styles.xml AndroidSplashStyles 1 True ChatGPT\res\drawable-mdpi\ ic_notification.png Android_NotificationIcon24 1 True ChatGPT\res\drawable-mdpi\ ic_notification.png Android_NotificationIcon24 1 True ChatGPT\res\drawable-anydpi-v26\ ic_launcher.xml Android_AdaptiveIcon 1 True ChatGPT\res\drawable-anydpi-v24\ ic_notification.xml Android_VectorizedNotificationIcon 1 True ChatGPT\res\drawable-anydpi-v24\ ic_notification.xml Android_VectorizedNotificationIcon 1 True ChatGPT\res\drawable\ splash_vector.xml Android_VectorizedSplash 1 True ChatGPT\res\drawable\ splash_vector.xml Android_VectorizedSplash 1 True ChatGPT\res\values-night-v21\ colors.xml Android_ColorsDark 1 True ChatGPT\res\drawable-anydpi-v33\ ic_launcher.xml Android_AdaptiveIconV33 1 True ChatGPT\ AndroidManifest.xml ProjectAndroidManifest 1 True ChatGPT\res\values-night-v21\ colors.xml Android_ColorsDark 1 True ChatGPT\library\lib\armeabi\ libChatGPT.so AndroidLibnativeArmeabiFile 1 True ChatGPT\res\values\ colors.xml Android_Colors 1 True ChatGPT\res\drawable-large\ splash_image.png Android_SplashImage640 1 True ChatGPT\res\drawable-large\ splash_image.png Android_SplashImage640 1 True ChatGPT\res\drawable\ ic_launcher_monochrome.xml Android_AdaptiveIconMonochrome 1 True ChatGPT\res\drawable\ ic_launcher_monochrome.xml Android_AdaptiveIconMonochrome 1 True ChatGPT\res\drawable-xhdpi\ ic_launcher.png Android_LauncherIcon96 1 True ChatGPT\res\drawable-xhdpi\ ic_launcher.png Android_LauncherIcon96 1 True ChatGPT\classes\ ChatGPT.classes AndroidClasses 64 True ChatGPT\library\lib\arm64-v8a\ libChatGPT.so ProjectOutput 1 True True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\res\values\ strings.xml Android_Strings 1 True ChatGPT\res\drawable-anydpi-v21\ splash_image_def.xml AndroidSplashImageDefV21 1 True ChatGPT\res\drawable-anydpi-v26\ ic_launcher.xml Android_AdaptiveIcon 1 True ChatGPT\res\values-v31\ styles.xml AndroidSplashStylesV31 1 True ChatGPT\res\drawable-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31 1 True ChatGPT\res\drawable-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31 1 True ChatGPT\res\values\ colors.xml Android_Colors 1 True ChatGPT\res\drawable-xlarge\ splash_image.png Android_SplashImage960 1 True ChatGPT\res\drawable-xlarge\ splash_image.png Android_SplashImage960 1 True ChatGPT\res\drawable-xxxhdpi\ ic_notification.png Android_NotificationIcon96 1 True ChatGPT\res\drawable-xxxhdpi\ ic_notification.png Android_NotificationIcon96 1 True ChatGPT\res\drawable-xhdpi\ ic_notification.png Android_NotificationIcon48 1 True ChatGPT\res\drawable-xhdpi\ ic_notification.png Android_NotificationIcon48 1 True ChatGPT\res\xml\ provider_paths.xml AndroidFileProvider 1 True ChatGPT\library\lib\arm64-v8a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\arm64-v8a\ libsk4d.so Skia 1 True True ChatGPT\res\drawable-xxhdpi\ ic_launcher.png Android_LauncherIcon144 1 True ChatGPT\res\drawable-xxhdpi\ ic_launcher.png Android_LauncherIcon144 1 True ChatGPT\res\drawable-mdpi\ ic_launcher.png Android_LauncherIcon48 1 True ChatGPT\res\drawable\ ic_launcher_foreground.xml Android_AdaptiveIconForeground 1 True ChatGPT\res\drawable\ ic_launcher_foreground.xml Android_AdaptiveIconForeground 1 True ChatGPT\res\drawable-mdpi\ ic_launcher.png Android_LauncherIcon48 1 True ChatGPT\res\drawable-anydpi-v33\ ic_launcher.xml Android_AdaptiveIconV33 1 True ChatGPT\res\drawable-ldpi\ ic_launcher.png Android_LauncherIcon36 1 True ChatGPT\res\drawable-ldpi\ ic_launcher.png Android_LauncherIcon36 1 True ChatGPT\res\drawable\ ic_launcher_background.xml Android_AdaptiveIconBackground 1 True ChatGPT\res\drawable\ ic_launcher_background.xml Android_AdaptiveIconBackground 1 True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\res\drawable-xxhdpi\ ic_notification.png Android_NotificationIcon72 1 True ChatGPT\res\drawable-xxhdpi\ ic_notification.png Android_NotificationIcon72 1 True ChatGPT\res\drawable-night-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31Dark 1 True ChatGPT\res\drawable-night-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31Dark 1 True ChatGPT\res\drawable-small\ splash_image.png Android_SplashImage426 1 True ChatGPT\res\drawable-small\ splash_image.png Android_SplashImage426 1 True ChatGPT\res\drawable-anydpi-v21\ splash_image_def.xml AndroidSplashImageDefV21 1 True ChatGPT\res\drawable-hdpi\ ic_launcher.png Android_LauncherIcon72 1 True ChatGPT\res\drawable-hdpi\ ic_launcher.png Android_LauncherIcon72 1 True ChatGPT\res\drawable-xxxhdpi\ ic_launcher.png Android_LauncherIcon192 1 True ChatGPT\res\drawable-xxxhdpi\ ic_launcher.png Android_LauncherIcon192 1 True ChatGPT\ AndroidManifest.xml ProjectAndroidManifest 1 True ChatGPT\res\drawable\ splash_image_def.xml AndroidSplashImageDef 1 True ChatGPT\classes\ ChatGPT.classes AndroidClasses 64 True ChatGPT\res\values\ styles.xml AndroidSplashStyles 1 True ChatGPT\res\drawable-hdpi\ ic_notification.png Android_NotificationIcon36 1 True ChatGPT\res\drawable-hdpi\ ic_notification.png Android_NotificationIcon36 1 True ChatGPT\res\xml\ provider_paths.xml AndroidFileProvider 1 True ChatGPT\res\values-v21\ styles.xml AndroidSplashStylesV21 1 True ChatGPT\res\drawable-anydpi-v21\ splash_image_def.xml AndroidSplashImageDefV21 1 True ChatGPT\res\values-v31\ styles.xml AndroidSplashStylesV31 1 True ChatGPT\res\values\ colors.xml Android_Colors 1 True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\res\values\ strings.xml Android_Strings 1 True ChatGPT\res\values-v21\ styles.xml AndroidSplashStylesV21 1 True ChatGPT\res\drawable-night-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31Dark 1 True ChatGPT\res\drawable-anydpi-v33\ ic_launcher.xml Android_AdaptiveIconV33 1 True ChatGPT\res\drawable\ ic_launcher_background.xml Android_AdaptiveIconBackground 1 True ChatGPT\res\drawable\ splash_image_def.xml AndroidSplashImageDef 1 True ChatGPT\res\drawable-xhdpi\ ic_launcher.png Android_LauncherIcon96 1 True ChatGPT\res\drawable-xhdpi\ ic_launcher.png Android_LauncherIcon96 1 True ChatGPT\res\drawable-ldpi\ ic_launcher.png Android_LauncherIcon36 1 True ChatGPT\res\drawable-ldpi\ ic_launcher.png Android_LauncherIcon36 1 True ChatGPT\library\lib\armeabi-v7a\ gdbserver AndroidGDBServer 1 True ChatGPT\res\drawable-normal\ splash_image.png Android_SplashImage470 1 True ChatGPT\res\drawable-normal\ splash_image.png Android_SplashImage470 1 True ChatGPT\res\drawable-xxhdpi\ ic_notification.png Android_NotificationIcon72 1 True ChatGPT\res\drawable-xxhdpi\ ic_notification.png Android_NotificationIcon72 1 True ChatGPT\ AndroidManifest.xml ProjectAndroidManifest 1 True ChatGPT\res\values\ styles.xml AndroidSplashStyles 1 True ChatGPT\res\xml\ provider_paths.xml AndroidFileProvider 1 True ChatGPT\res\drawable-mdpi\ ic_notification.png Android_NotificationIcon24 1 True ChatGPT\res\drawable-mdpi\ ic_notification.png Android_NotificationIcon24 1 True ChatGPT\res\drawable-small\ splash_image.png Android_SplashImage426 1 True ChatGPT\res\drawable-small\ splash_image.png Android_SplashImage426 1 True ChatGPT\library\lib\mips\ libChatGPT.so AndroidLibnativeMipsFile 1 True ChatGPT\library\lib\mips\ libChatGPT.so AndroidLibnativeMipsFile 1 True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\library\lib\armeabi-v7a\ libsk4d.so Skia 1 True True ChatGPT\res\drawable\ ic_launcher_monochrome.xml Android_AdaptiveIconMonochrome 1 True ChatGPT\res\drawable\ splash_vector.xml Android_VectorizedSplash 1 True ChatGPT\res\drawable-large\ splash_image.png Android_SplashImage640 1 True ChatGPT\res\drawable-large\ splash_image.png Android_SplashImage640 1 True ChatGPT\res\values\ strings.xml Android_Strings 1 True ChatGPT\res\drawable\ splash_image_def.xml AndroidSplashImageDef 1 True ChatGPT\res\values\ styles.xml AndroidSplashStyles 1 True ChatGPT\res\drawable-anydpi-v31\ splash_vector.xml Android_VectorizedSplashV31 1 True ChatGPT\res\drawable-xlarge\ splash_image.png Android_SplashImage960 1 True ChatGPT\res\drawable-xlarge\ splash_image.png Android_SplashImage960 1 True ChatGPT\res\drawable-xxxhdpi\ ic_launcher.png Android_LauncherIcon192 1 True ChatGPT\res\drawable-xxxhdpi\ ic_launcher.png Android_LauncherIcon192 1 True ChatGPT\res\drawable-xhdpi\ ic_notification.png Android_NotificationIcon48 1 True ChatGPT\res\drawable-xhdpi\ ic_notification.png Android_NotificationIcon48 1 True ChatGPT\res\values-v21\ styles.xml AndroidSplashStylesV21 1 True ChatGPT\res\drawable-hdpi\ ic_launcher.png Android_LauncherIcon72 1 True ChatGPT\res\drawable-hdpi\ ic_launcher.png Android_LauncherIcon72 1 True ChatGPT\library\lib\armeabi\ libChatGPT.so AndroidLibnativeArmeabiFile 1 True ChatGPT\library\lib\armeabi\ libChatGPT.so AndroidLibnativeArmeabiFile 1 True ChatGPT\res\drawable-hdpi\ ic_notification.png Android_NotificationIcon36 1 True ChatGPT\res\drawable-hdpi\ ic_notification.png Android_NotificationIcon36 1 True ChatGPT\res\drawable-anydpi-v26\ ic_launcher.xml Android_AdaptiveIcon 1 True ChatGPT\res\values\ colors.xml Android_Colors 1 True ChatGPT\res\drawable-night-anydpi-v21\ splash_vector.xml Android_VectorizedSplashDark 1 True ChatGPT\res\values-night-v21\ colors.xml Android_ColorsDark 1 True ChatGPT\library\lib\armeabi-v7a\ libChatGPT.so ProjectOutput 1 True True ChatGPT\res\drawable-mdpi\ ic_launcher.png Android_LauncherIcon48 1 True ChatGPT\res\drawable-mdpi\ ic_launcher.png Android_LauncherIcon48 1 True ChatGPT\res\drawable-xxxhdpi\ ic_notification.png Android_NotificationIcon96 1 True ChatGPT\res\drawable-xxxhdpi\ ic_notification.png Android_NotificationIcon96 1 True ChatGPT\library\lib\armeabi\ libChatGPT.so AndroidLibnativeArmeabiFile 1 True ChatGPT\res\drawable-xxhdpi\ ic_launcher.png Android_LauncherIcon144 1 True ChatGPT\res\drawable-xxhdpi\ ic_launcher.png Android_LauncherIcon144 1 True ChatGPT\res\drawable-anydpi-v24\ ic_notification.xml Android_VectorizedNotificationIcon 1 True ChatGPT\res\drawable\ ic_launcher_foreground.xml Android_AdaptiveIconForeground 1 True ChatGPT\ AndroidManifest.xml ProjectAndroidManifest 1 True ChatGPT\classes\ ChatGPT.classes AndroidClasses 64 True ChatGPT\library\lib\armeabi-v7a\ libChatGPT.so ProjectOutput 1 True True ChatGPT\library\lib\mips\ libChatGPT.so AndroidLibnativeMipsFile 1 True ChatGPT\res\xml\ provider_paths.xml AndroidFileProvider 1 True ChatGPT\classes\ ChatGPT.classes AndroidClasses 64 True ChatGPT\Assets\ Logo44x44.png UWP_DelphiLogo44 1 True ChatGPT\Assets\ Logo150x150.png UWP_DelphiLogo150 1 True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT\ sk4d.dll Skia 0 True True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPhone@3x.png iPhone_Launch3x 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_ApplicationIcon_152x152.png iPad_AppIcon152 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\ ChatGPT.launchscreen ProjectiOSLaunchScreen 64 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SettingIcon_58x58.png iPad_Setting58 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_ApplicationIcon_120x120.png iPhone_AppIcon120 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SpotlightSearchIcon_80x80.png iPad_SpotLight80 1 True ChatGPT.app\..\ ChatGPT.entitlements ProjectiOSEntitlements 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_ApplicationIcon_1024x1024.png iOS_AppStore1024 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPhone@2x.png iPhone_Launch2x 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_ApplicationIcon_167x167.png iPad_AppIcon167 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPadDark@2x.png iPad_LaunchDark2x 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SpotlightSearchIcon_120x120.png iPhone_Spotlight120 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_NotificationIcon_40x40.png iPhone_Notification40 1 True ChatGPT.app\ Info.plist ProjectiOSInfoPList 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_NotificationIcon_60x60.png iPhone_Notification60 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SettingIcon_58x58.png iPhone_Setting58 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SettingIcon_87x87.png iPhone_Setting87 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_SpotlightSearchIcon_80x80.png iPhone_Spotlight80 1 True ChatGPT.app\ ChatGPT ProjectOutput 1 True True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_ApplicationIcon_180x180.png iPhone_AppIcon180 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset\ FM_NotificationIcon_40x40.png iPad_Notification40 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPhoneDark@3x.png iPhone_LaunchDark3x 1 True ChatGPT.app\..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF\ ChatGPT ProjectiOSDeviceDebug 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPad@2x.png iPad_Launch2x 1 True ChatGPT.app\..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset\ FM_LaunchScreenImage_iPhoneDark@2x.png iPhone_LaunchDark2x 1 True ChatGPT\ ChatGPT ProjectOutput 1 True True ChatGPT\ libsk4d.so Skia 1 True True ChatGPT\ libsk4d.so Skia 1 True True ChatGPT\ ChatGPT ProjectOutput 1 True True ChatGPT\funcs\ libgpt_function_owm.so File 0 True ChatGPT\ libsk4d.so Skia 1 True True ChatGPT\ libsk4d.so Skia 1 True True ================================================ FILE: ChatGPT.dpr ================================================ program ChatGPT; {$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)} {$DEFINE MOBILE} {$ENDIF} uses System.StartUpCopy, FMX.Forms, FMX.Types, FMX.Skia, ChatGPT.Main in 'ChatGPT.Main.pas' {FormMain}, OpenAI.API.Params in 'DelphiOpenAI\OpenAI.API.Params.pas', OpenAI.API in 'DelphiOpenAI\OpenAI.API.pas', OpenAI.Completions in 'DelphiOpenAI\OpenAI.Completions.pas', OpenAI.Edits in 'DelphiOpenAI\OpenAI.Edits.pas', OpenAI.Embeddings in 'DelphiOpenAI\OpenAI.Embeddings.pas', OpenAI.Engines in 'DelphiOpenAI\OpenAI.Engines.pas', OpenAI.Errors in 'DelphiOpenAI\OpenAI.Errors.pas', OpenAI.Files in 'DelphiOpenAI\OpenAI.Files.pas', OpenAI.FineTunes in 'DelphiOpenAI\OpenAI.FineTunes.pas', OpenAI.Images in 'DelphiOpenAI\OpenAI.Images.pas', OpenAI.Models in 'DelphiOpenAI\OpenAI.Models.pas', OpenAI.Moderations in 'DelphiOpenAI\OpenAI.Moderations.pas', OpenAI in 'DelphiOpenAI\OpenAI.pas', ChatGPT.FrameChat in 'ChatGPT.FrameChat.pas' {FrameChat: TFrame}, ChatGPT.FrameMessage in 'ChatGPT.FrameMessage.pas' {FrameMessage: TFrame}, OpenAI.Chat in 'DelphiOpenAI\OpenAI.Chat.pas', OpenAI.Audio in 'DelphiOpenAI\OpenAI.Audio.pas', OpenAI.Utils.ChatHistory in 'DelphiOpenAI\OpenAI.Utils.ChatHistory.pas', ChatGPT.FrameImagePreview in 'ChatGPT.FrameImagePreview.pas', ChatGPT.FrameImage in 'ChatGPT.FrameImage.pas', ChatGPT.FrameCode in 'ChatGPT.FrameCode.pas' {FrameCode: TFrame}, ChatGPT.Classes in 'ChatGPT.Classes.pas', ChatGPT.FrameSVG in 'ChatGPT.FrameSVG.pas' {FrameSVG: TFrame}, ChatGPT.FramePlainText in 'ChatGPT.FramePlainText.pas' {FrameText}, DarkModeApi.Consts in 'WindowDarkMode\DarkModeApi.Consts.pas', DarkModeApi.FMX in 'WindowDarkMode\DarkModeApi.FMX.pas', DarkModeApi in 'WindowDarkMode\DarkModeApi.pas', DarkModeApi.Types in 'WindowDarkMode\DarkModeApi.Types.pas', ChatGPT.Overlay in 'ChatGPT.Overlay.pas' {FrameOveraly: TFrame}, ChatGPT.Settings in 'ChatGPT.Settings.pas' {FrameSettings: TFrame}, ChatGPT.ChatSettings in 'ChatGPT.ChatSettings.pas' {FrameChatSettings: TFrame}, ChatGPT.FrameUIMessage in 'ChatGPT.FrameUIMessage.pas' {FrameUIMessage: TFrame}, ChatGPT.Code in 'ChatGPT.Code.pas', HGM.FMX.Image in 'HGM.FMX.Image.pas', HGM.FMX.Ani in 'HGM.FMX.Ani.pas', ChatGPT.About in 'ChatGPT.About.pas' {FrameAbout: TFrame}, ChatGPT.SoundRecorder in 'ChatGPT.SoundRecorder.pas', ChatGPT.Android in 'ChatGPT.Android.pas', OpenAI.Chat.Functions in 'DelphiOpenAI\OpenAI.Chat.Functions.pas', OpenAI.Chat.Functions.Samples in 'DelphiOpenAI\OpenAI.Chat.Functions.Samples.pas', ChatGPT.Functions in 'ChatGPT.Functions.pas', ChatGPT.Functions.External in 'ChatGPT.Functions.External.pas', ChatGPT.Functions.External.Intf in 'ChatGPT.Functions.External.Intf.pas', ChatGPT.LoadedFunctions in 'ChatGPT.LoadedFunctions.pas' {FrameLoadedFunctions: TFrame}, ChatGPT.TextEditor in 'ChatGPT.TextEditor.pas' {FrameTextEditor}, ChatGPT.ImportExport in 'ChatGPT.ImportExport.pas' {FrameImportExport: TFrame}, OpenAI.FineTuning in 'DelphiOpenAI\OpenAI.FineTuning.pas', ChatGPT.Manager in 'ChatGPT.Manager.pas' {Manager: TDataModule}, OpenAI.Types in 'DelphiOpenAI\OpenAI.Types.pas', OpenAI.Utils.Base64 in 'DelphiOpenAI\OpenAI.Utils.Base64.pas', OpenAI.Utils.ObjectHolder in 'DelphiOpenAI\OpenAI.Utils.ObjectHolder.pas', OpenAI.Assistants in 'DelphiOpenAI\OpenAI.Assistants.pas', OpenAI.Utils.JSON.Cleaner in 'DelphiOpenAI\OpenAI.Utils.JSON.Cleaner.pas', FMX.RichEdit.Style in 'FMXRichMemo\FMX.RichEdit.Style.pas', FMX.StyledContextMenu in 'FMXRichMemo\FMX.StyledContextMenu.pas', Syntax.Code.CSS in 'FMXRichMemo\Syntax.Code.CSS.pas', Syntax.Code.HTML in 'FMXRichMemo\Syntax.Code.HTML.pas', Syntax.Code.JSON in 'FMXRichMemo\Syntax.Code.JSON.pas', Syntax.Code.MarkDown in 'FMXRichMemo\Syntax.Code.MarkDown.pas', Syntax.Code in 'FMXRichMemo\Syntax.Code.pas', Syntax.Code.Pascal in 'FMXRichMemo\Syntax.Code.Pascal.pas', Syntax.Code.Python in 'FMXRichMemo\Syntax.Code.Python.pas', Syntax.Code.SQL in 'FMXRichMemo\Syntax.Code.SQL.pas'; {$R *.res} begin {$IFDEF MOBILE} GlobalUseSkia := True; //GlobalUseSkiaRasterWhenAvailable := False; //GlobalPreferredFramesPerSecond := 120; //GlobalDisableSkiaCodecsReplacement := True; {$ENDIF} Application.Initialize; Application.CreateForm(TManager, Manager); Application.CreateForm(TFormMain, FormMain); Application.Run; end. ================================================ FILE: ChatGPT.dproj ================================================  {C8E3829F-F48A-4A7C-8D0F-FAFAF9C9B5FF} 20.4 FMX True Debug Win32 558227 Application ChatGPT.dpr ChatGPT true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Cfg_1 true true true Cfg_1 true true true Cfg_1 true true true Cfg_1 true true true Cfg_1 true true true Base true true Cfg_2 true true true Cfg_2 true true true Cfg_2 true true true Cfg_2 true true .\$(Platform)\$(Config) .\$(Platform)\$(Config) false false false false false System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) true true true true true true true true $(BDS)\bin\delphi_PROJECTICON.ico $(BDS)\bin\delphi_PROJECTICNS.icns ChatGPT NEW_MEMO;SKIA;$(DCC_Define) fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;Skia.Package.RTL;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.1.30;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=36 Debug true $(ProjectName).Artwork\Android\FM_LauncherIcon_36x36.png $(ProjectName).Artwork\Android\FM_LauncherIcon_48x48.png $(ProjectName).Artwork\Android\FM_LauncherIcon_72x72.png $(ProjectName).Artwork\Android\FM_LauncherIcon_96x96.png $(ProjectName).Artwork\Android\FM_LauncherIcon_144x144.png $(ProjectName).Artwork\Android\FM_LauncherIcon_192x192.png $(ProjectName).Artwork\Android\FM_SplashImage_426x320.png $(ProjectName).Artwork\Android\FM_SplashImage_470x320.png $(ProjectName).Artwork\Android\FM_SplashImage_640x480.png $(ProjectName).Artwork\Android\FM_SplashImage_960x720.png $(ProjectName).Artwork\Android\FM_NotificationIcon_24x24.png $(ProjectName).Artwork\Android\FM_NotificationIcon_36x36.png $(ProjectName).Artwork\Android\FM_NotificationIcon_48x48.png $(ProjectName).Artwork\Android\FM_NotificationIcon_72x72.png $(ProjectName).Artwork\Android\FM_NotificationIcon_96x96.png activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar 1 #000000 true false false false Keys\AndroidKey.keystore 852E47FF5FBE07BACF62E567A4037BF3E41508107EECECF19F500FFA8E613CC1DB2AA38CE3111C2FC1E2573AFACFC36BBAE83658042922D216784587E5FC22A2C924F30FD545FA8FBFBBAF5307131D6A921D3E581DAE0939E3EC chatgptkey #FFFFFF center #000000 True $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Background.xml True True $(ProjectName).Artwork\Android\FM_VectorizedSplash.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashDark.xml $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Foreground.xml $(ProjectName).Artwork\Android\FM_VectorizedNotificationIcon.xml $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Monochrome.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashV31Dark.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashV31.xml fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;RadiantShapesFmx_Design;Skia.Package.RTL;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;RadiantShapesFmx;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.1.30;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=36 Debug true $(ProjectName).Artwork\Android\FM_LauncherIcon_36x36.png $(ProjectName).Artwork\Android\FM_LauncherIcon_48x48.png $(ProjectName).Artwork\Android\FM_LauncherIcon_72x72.png $(ProjectName).Artwork\Android\FM_LauncherIcon_96x96.png $(ProjectName).Artwork\Android\FM_LauncherIcon_144x144.png $(ProjectName).Artwork\Android\FM_LauncherIcon_192x192.png $(ProjectName).Artwork\Android\FM_SplashImage_426x320.png $(ProjectName).Artwork\Android\FM_SplashImage_470x320.png $(ProjectName).Artwork\Android\FM_SplashImage_640x480.png $(ProjectName).Artwork\Android\FM_SplashImage_960x720.png $(ProjectName).Artwork\Android\FM_NotificationIcon_24x24.png $(ProjectName).Artwork\Android\FM_NotificationIcon_36x36.png $(ProjectName).Artwork\Android\FM_NotificationIcon_48x48.png $(ProjectName).Artwork\Android\FM_NotificationIcon_72x72.png $(ProjectName).Artwork\Android\FM_NotificationIcon_96x96.png activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar false false false false false 1 #000000 true Keys\AndroidKey.keystore 852E47FF5FBE07BACF62E567A4037BF3E41508107EECECF19F500FFA8E613CC1DB2AA38CE3111C2FC1E2573AFACFC36BBAE83658042922D216784587E5FC22A2C924F30FD545FA8FBFBBAF5307131D6A921D3E581DAE0939E3EC chatgptkey #FFFFFF center #000000 True True $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Background.xml $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Foreground.xml True $(ProjectName).Artwork\Android\FM_VectorizedSplash.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashDark.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashV31.xml $(ProjectName).Artwork\Android\FM_VectorizedNotificationIcon.xml $(ProjectName).Artwork\Android\FM_AdaptiveIcon_Monochrome.xml $(ProjectName).Artwork\Android\FM_VectorizedSplashV31Dark.xml CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug $(MSBuildProjectName) $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug true CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug true vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;RadiantShapesFmx_Design;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;DzHTMLText_VCL;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;OSMMapDXE2;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;VKComponents;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 $(BDS)\bin\default_app.manifest Res\chatgptfmx\play_store_512.png Res\chatgptfmx\1024.png Res\chatgptfmx\chatgptfmx.ico none vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;DzHTMLText_VCL;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 $(BDS)\bin\default_app.manifest Res\chatgptfmx\play_store_512.png Res\chatgptfmx\1024.png Res\chatgptfmx\chatgptfmx.ico none DEBUG;$(DCC_Define) true false true true true true true false true true 1 false false false false true true true #FFFFFF #000000 true -debugport=58526 1 true true true #FFFFFF #000000 true true iPhoneAndiPad MXZ5UB382L.HGM.Test1 Apple Development: alinvip@mail.ru (R5URB387M5) 2b306d7e-7dc7-42bb-b4bb-050fdf9dd764 MXZ5UB382L /Users/hemulgm/Library/MobileDevice/Provisioning Profiles/2b306d7e-7dc7-42bb-b4bb-050fdf9dd764.mobileprovision MXZ5UB382L.HGM.Test1; MXZ5UB382L.HGM.Test1 <key>get-task-allow</key><true/><key>com.apple.developer.team-identifier</key><string>MXZ5UB382L</string> False False CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=MXZ5UB382L.HGM.Test1;CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers false PerMonitorV2 true 1033 Res\chatgptfmx\chatgptfmx.ico true PerMonitorV2 false RELEASE;$(DCC_Define) 0 0 1 AppStore 2 AppStore true package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=2;versionName=1.1.30;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=36 true #FFFFFF #000000 true true PerMonitorV2 PerMonitorV2 MainSource
FormMain
FrameChat
TFrame
FrameMessage
TFrame
FrameCode
TFrame
FrameSVG
TFrame
FrameText
FrameOveraly
TFrame
FrameSettings
TFrame
FrameChatSettings
TFrame
FrameUIMessage
TFrame
FrameAbout
TFrame
FrameLoadedFunctions
TFrame
FrameTextEditor
FrameImportExport
TFrame
Manager
TDataModule
Base Cfg_1 Base Cfg_2 Base
Delphi.Personality.12 Application ChatGPT.dpr Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components true true true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\ 1 libsk4d.so true .\ 1 libsk4d.so true .\ 1 libsk4d.so true .\ 1 libsk4d.so true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\ 0 sk4d.dll true .\funcs\ libgpt_function_owm.so true ChatGPT.exe true 1 Contents\MacOS 1 0 res\xml 1 res\xml 1 library\lib\armeabi 1 library\lib\armeabi 1 library\lib\armeabi-v7a 1 library\lib\mips 1 library\lib\mips 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 library\lib\armeabi-v7a 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v21 1 res\drawable-anydpi-v21 1 res\values 1 res\values 1 res\values-v21 1 res\values-v21 1 res\values-v31 1 res\values-v31 1 res\values-v35 1 res\values-v35 1 res\drawable-anydpi-v26 1 res\drawable-anydpi-v26 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v33 1 res\drawable-anydpi-v33 1 res\values 1 res\values 1 res\values-night-v21 1 res\values-night-v21 1 res\drawable 1 res\drawable 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-ldpi 1 res\drawable-ldpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-small 1 res\drawable-small 1 res\drawable-normal 1 res\drawable-normal 1 res\drawable-large 1 res\drawable-large 1 res\drawable-xlarge 1 res\drawable-xlarge 1 res\values 1 res\values 1 res\drawable-anydpi-v24 1 res\drawable-anydpi-v24 1 res\drawable 1 res\drawable 1 res\drawable-night-anydpi-v21 1 res\drawable-night-anydpi-v21 1 res\drawable-anydpi-v31 1 res\drawable-anydpi-v31 1 res\drawable-night-anydpi-v31 1 res\drawable-night-anydpi-v31 1 1 Contents\MacOS 1 0 Contents\MacOS 1 .framework Contents\MacOS 1 .framework Contents\MacOS 1 .framework 0 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .dll;.bpl 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .bpl 0 0 0 0 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 0 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 Contents 1 Contents 1 Contents 1 Contents\Resources 1 Contents\Resources 1 Contents\Resources 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 1 1 1 1 Contents\MacOS 1 Contents\MacOS 1 Contents\MacOS 1 0 library\lib\armeabi-v7a 1 1 1 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 1 1 1 ..\$(PROJECTNAME).launchscreen 64 ..\$(PROJECTNAME).launchscreen 64 1 1 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 True True True True True False False True True 12
================================================ FILE: ChatGPTGroup.groupproj ================================================  {8E18A818-2E61-4C1A-A75F-35E2C9D052E4} Default.Personality.12 ================================================ FILE: ChatGPT_Console.dpr ================================================ program ChatGPT_Console; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, OpenAI.Chat, OpenAI.Utils.ChatHistory, OpenAI; var History: TChatHistory; begin try var OpenAI := TOpenAI.Create({$include MY_TOKEN.txt}); History := TChatHistory.Create; Writeln('ChatGPT is ready'); var Prompt: string := ''; repeat Write('Human: '); Readln(Prompt); if Prompt.IsEmpty then Break; History.New(TMessageRole.User, Prompt, ''); try { OpenAI.Chat.CreateStream( procedure(Params: TChatParams) begin Params.Messages(History.ToArray); Params.MaxTokens(1024); Params.Stream; end, procedure(Chat: TChat; IsDone: Boolean; var Cancel: Boolean) begin if (not IsDone) and Assigned(Chat) then Writeln(Chat.Choices[0].Delta.Content) else if IsDone then Writeln('DONE!'); Writeln('-------'); Sleep(80); end); } var Chat := OpenAI.Chat.Create( procedure(Params: TChatParams) begin Params.Messages(History.ToArray); Params.MaxTokens(1024); end); try for var Choise in Chat.Choices do begin History.New(TMessageRole.Assistant, Choise.Message.Content, ''); Writeln(Choise.Message.Content.Trim([#13, #10, ' '])); end; finally Chat.Free; end; except on E: Exception do Writeln('Error: ', E.Message); end; until False; History.Free; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. ================================================ FILE: ChatGPT_Console.dproj ================================================  {48B49E9F-2EA8-4526-8576-1E45E5DD4550} 20.3 None True Debug Win32 1 Console ChatGPT_Console.dpr ChatGPT_Console true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Cfg_1 true true true Base true .\$(Platform)\$(Config) .\$(Platform)\$(Config) false false false false false System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) ChatGPT_Console D:\Projects\ChatGPT\DelphiOpenAI;$(DCC_UnitSearchPath) 1049 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;Skia.Package.RTL;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;RadiantShapesFmx_Design;Skia.Package.RTL;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;RadiantShapesFmx;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug $(MSBuildProjectName) CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;RadiantShapesFmx_Design;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;DzHTMLText_VCL;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;OSMMapDXE2;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;VKComponents;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 true $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;DzHTMLText_VCL;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) true $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png DEBUG;$(DCC_Define) true false true true true true true false 1033 (None) none false RELEASE;$(DCC_Define) 0 0 MainSource Base Cfg_1 Base Cfg_2 Base Delphi.Personality.12 Application ChatGPT_Console.dpr Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components true true true 1 Contents\MacOS 1 0 res\xml 1 res\xml 1 library\lib\armeabi 1 library\lib\armeabi 1 library\lib\armeabi-v7a 1 library\lib\mips 1 library\lib\mips 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 library\lib\armeabi-v7a 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v21 1 res\drawable-anydpi-v21 1 res\values 1 res\values 1 res\values-v21 1 res\values-v21 1 res\values-v31 1 res\values-v31 1 res\values-v35 1 res\values-v35 1 res\drawable-anydpi-v26 1 res\drawable-anydpi-v26 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v33 1 res\drawable-anydpi-v33 1 res\values 1 res\values 1 res\values-night-v21 1 res\values-night-v21 1 res\drawable 1 res\drawable 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-ldpi 1 res\drawable-ldpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-small 1 res\drawable-small 1 res\drawable-normal 1 res\drawable-normal 1 res\drawable-large 1 res\drawable-large 1 res\drawable-xlarge 1 res\drawable-xlarge 1 res\values 1 res\values 1 res\drawable-anydpi-v24 1 res\drawable-anydpi-v24 1 res\drawable 1 res\drawable 1 res\drawable-night-anydpi-v21 1 res\drawable-night-anydpi-v21 1 res\drawable-anydpi-v31 1 res\drawable-anydpi-v31 1 res\drawable-night-anydpi-v31 1 res\drawable-night-anydpi-v31 1 1 Contents\MacOS 1 0 Contents\MacOS 1 .framework Contents\MacOS 1 .framework Contents\MacOS 1 .framework 0 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .dll;.bpl 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .bpl 0 0 0 0 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 0 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 Contents 1 Contents 1 Contents 1 Contents\Resources 1 Contents\Resources 1 Contents\Resources 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 1 1 1 1 Contents\MacOS 1 Contents\MacOS 1 Contents\MacOS 1 0 library\lib\armeabi-v7a 1 1 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 1 1 1 ..\$(PROJECTNAME).launchscreen 64 ..\$(PROJECTNAME).launchscreen 64 1 1 1 Assets 1 Assets 1 Assets 1 Assets 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 False False False False False False False True False 12 ================================================ FILE: Code/ChatGPT.Code.JSON.pas ================================================ unit ChatGPT.Code.JSON; interface uses System.SysUtils, ChatGPT.Code, System.Generics.Collections, FMX.TextLayout, FMX.Graphics, System.UITypes; type TCodeSyntaxJson = class(TCodeSyntax) private FStringKey, FNumKey: TKeyWord; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); override; destructor Destroy; override; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; override; end; implementation { TCodeSyntaxJson } constructor TCodeSyntaxJson.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited; FStringKey := TKeyWord.Create; FStringKey.Color := $FFE7DB74; FStringKey.Font.Assign(FDefaultFont); FNumKey := TKeyWord.Create; FNumKey.Color := $FFAC80FF; FNumKey.Font.Assign(FDefaultFont); end; destructor TCodeSyntaxJson.Destroy; begin FStringKey.Free; FNumKey.Free; inherited; end; function TCodeSyntaxJson.GetAttributesForLine(const Line: string; const Index: Integer): TArray; const Seps =[' ', ';', ')', '(', '[', ']', ':', '<', '>', ',', '+', '-', '=', '*', '/', '\']; begin if FCached.TryGetValue(Index, Result) then Exit; try var Buf: string := ''; var IsString: Boolean := False; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; if IsString then begin if Line.Chars[C] = '"' then begin IsString := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length - 1, Buf.Length + 2), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '"' then begin IsString := True; Buf := ''; Continue; end; if (C = Line.Length) or CharInSet(Line.Chars[C], Seps) then begin if not Buf.IsEmpty then begin var FL: Extended; if TryStrToFloat(Buf.Replace('.', FormatSettings.DecimalSeparator), FL) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FNumKey.Font, FNumKey.Color) )]; end else if Buf.StartsWith('\') then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; end; Buf := ''; end; end else Buf := Buf + Line.Chars[C]; end; finally FCached.AddOrSetValue(Index, Result); end; end; initialization TCodeSyntax.RegisterSyntax(['json'], TCodeSyntaxJson); end. ================================================ FILE: Code/ChatGPT.Code.MarkDown.pas ================================================ unit ChatGPT.Code.MarkDown; interface uses System.SysUtils, ChatGPT.Code, System.Generics.Collections, FMX.TextLayout, FMX.Graphics, System.UITypes; type TCodeSyntaxMD = class(TCodeSyntax) private FMonoKey, FNumKey, FCommentKey, FDirectiveKey: TKeyWord; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); override; destructor Destroy; override; function ParseLine(const Line: string; out Output: string): TArray; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; override; end; implementation { TCodeSyntaxMD } constructor TCodeSyntaxMD.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited; FMonoKey := TKeyWord.Create; FMonoKey.Color := TAlphaColorRec.White; FMonoKey.Font.Assign(FDefaultFont); FMonoKey.Font.Family := 'Consolas'; FNumKey := TKeyWord.Create; FNumKey.Color := DefaultColor; FNumKey.Font.Assign(FDefaultFont); FCommentKey := TKeyWord.Create; FCommentKey.Color := DefaultColor; FCommentKey.Font.Assign(FDefaultFont); FDirectiveKey := TKeyWord.Create; FDirectiveKey.Color := DefaultColor; FDirectiveKey.Font.Assign(FDefaultFont); end; destructor TCodeSyntaxMD.Destroy; begin FMonoKey.Free; FDirectiveKey.Free; FCommentKey.Free; FNumKey.Free; inherited; end; function TCodeSyntaxMD.GetAttributesForLine(const Line: string; const Index: Integer): TArray; const Seps =[' ', '.', ',', '(', '[', ']', ':', '<', '>', '+', '-', '=', '*', '/', '&']; begin if FCached.TryGetValue(Index, Result) then Exit; try var Buf: string := ''; var IsMono := False; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; if IsMono then begin if Line.Chars[C] = '`' then begin Buf := Buf + Line.Chars[C]; IsMono := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length + 1, Buf.Length), TTextAttribute.Create(FMonoKey.Font, FMonoKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '`' then begin Buf := ''; IsMono := True; Buf := Buf + Line.Chars[C]; Continue; end; { if (C = Line.Length) or CharInSet(Line.Chars[C], Seps) then begin if not Buf.IsEmpty then begin if Buf.StartsWith('#') then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; end; Buf := ''; end; end else } Buf := Buf + Line.Chars[C]; end; finally FCached.AddOrSetValue(Index, Result); end; end; function TCodeSyntaxMD.ParseLine(const Line: string; out Output: string): TArray; begin var Buf: string := ''; var IsMono := -1; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; //------------- if Line.Chars[C] = '`' then begin if IsMono <> -1 then begin IsMono := -1; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(IsMono + 1, Buf.Length), TTextAttribute.Create(FMonoKey.Font, FMonoKey.Color) )]; Buf := ''; end; Continue; end else begin Output := Output + Buf; Buf := ''; IsMono := C; Buf := Buf + Line.Chars[C]; Continue; end; end; { if Line.Chars[C] = '#' then begin Buf := Buf + Line.Chars[C]; Inc(HashCnt); end else begin if HashCnt > 0 then begin end; HashCnt := 0; end; } Buf := Buf + Line.Chars[C]; end; Output := Output + Buf; end; initialization TCodeSyntax.RegisterSyntax(['md'], TCodeSyntaxMD); end. ================================================ FILE: Code/ChatGPT.Code.Pascal.pas ================================================ unit ChatGPT.Code.pascal; interface uses System.SysUtils, ChatGPT.Code, System.Generics.Collections, FMX.TextLayout, FMX.Graphics, System.UITypes; type TCodeSyntaxPascal = class(TCodeSyntax) private FKeyWords: TKeyWords; FStringKey, FNumKey, FCommentKey, FDirectiveKey: TKeyWord; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); override; destructor Destroy; override; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; override; end; implementation { TCodeSyntaxPascal } constructor TCodeSyntaxPascal.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited; var KeyWord: TKeyWord; FKeyWords := TKeyWords.Create; KeyWord := TKeyWord.Create; KeyWord.Word := ['var', 'string', 'as', 'inherited', 'destructor', 'procedure', 'constructor', 'function', 'uses', 'implementation', 'private', 'initialization', 'finalization', 'or', 'and', 'xor', 'div', 'mod', 'in', 'public', 'override', 'overload', 'type', 'unit', 'interface', 'nil', 'not', 'shr', 'shl', 'platform', 'deprecated', 'packed', 'index', 'cdecl', 'stdcall', 'register', 'fastcall', 'file', 'goto', 'program', 'downto', 'label', 'raise', 'array', 'of', 'is', 'const', 'read', 'write', 'operator', 'static', 'inline', 'abstract', 'protected', 'strict', 'virtual', 'to', 'property', 'message', 'set']; KeyWord.Color := $FFFFE0BC; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); KeyWord := TKeyWord.Create; KeyWord.Word := ['begin', 'end', 'asm', 'end.', 'class', 'record', 'try', 'finally', 'except']; KeyWord.Color := $FFC22700; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; //KeyWord.Font.Size := 25; FKeyWords.Add(KeyWord); KeyWord := TKeyWord.Create; KeyWord.Word := ['if', 'then', 'case', 'do', 'else', 'for', 'with', 'repeat', 'until', 'while']; KeyWord.Color := $FFFF9900; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); FStringKey := TKeyWord.Create; FStringKey.Color := $FF7FAAFF; FStringKey.Font.Assign(FDefaultFont); FNumKey := TKeyWord.Create; FNumKey.Color := $FFFF7F85; FNumKey.Font.Assign(FDefaultFont); FCommentKey := TKeyWord.Create; FCommentKey.Color := $FF88E775; FCommentKey.Font.Assign(FDefaultFont); FDirectiveKey := TKeyWord.Create; FDirectiveKey.Color := $FF3CB1FF; FDirectiveKey.Font.Assign(FDefaultFont); end; destructor TCodeSyntaxPascal.Destroy; begin FStringKey.Free; FDirectiveKey.Free; FCommentKey.Free; FNumKey.Free; FKeyWords.Free; inherited; end; function TCodeSyntaxPascal.GetAttributesForLine(const Line: string; const Index: Integer): TArray; const Seps =[' ', ';', ')', '(', '[', ']', ':', '<', '>', ',', '+', '-', '=', '*', '/', '&']; begin if FCached.TryGetValue(Index, Result) then Exit; try var Buf: string := ''; var IsString: Boolean := False; var IsComment: Boolean := False; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; if IsComment then begin if Line.Chars[C] = '}' then begin IsComment := False; if not Buf.IsEmpty then begin if Buf.StartsWith('{$') then Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FDirectiveKey.Font, FDirectiveKey.Color) )] else Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FCommentKey.Font, FCommentKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if IsString then begin if Line.Chars[C] = '''' then begin IsString := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if C <> Line.Length then begin if (Line.Chars[C] = '/') and (Line.Chars[C + 1] = '/') then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C, Line.Length - C), TTextAttribute.Create(FCommentKey.Font, FCommentKey.Color) )]; Exit; end; if Line.Chars[C] = '{' then begin IsComment := True; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '''' then begin IsString := True; Buf := Buf + Line.Chars[C]; Continue; end; end; if (C = Line.Length) or CharInSet(Line.Chars[C], Seps) then begin if not Buf.IsEmpty then begin var KeyWord: TKeyWord; var Num: Extended; if (TryStrToFloat(Buf.Replace('.', ','), Num) or Buf.StartsWith('$')) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FNumKey.Font, FNumKey.Color) )]; end else if Buf.StartsWith('#') then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; end else if FKeyWords.FindWord(Buf, KeyWord) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(KeyWord.Font, KeyWord.Color) )]; end; Buf := ''; end; end else Buf := Buf + Line.Chars[C]; end; finally FCached.AddOrSetValue(Index, Result); end; end; initialization TCodeSyntax.RegisterSyntax(['pascal', 'delphi', 'fpc', 'freepascal', 'free-pascal'], TCodeSyntaxPascal); end. ================================================ FILE: Code/ChatGPT.Code.Python.pas ================================================ unit ChatGPT.Code.Python; interface uses System.SysUtils, ChatGPT.Code, System.Generics.Collections, FMX.TextLayout, FMX.Graphics, System.UITypes; type TCodeSyntaxPython = class(TCodeSyntax) private FKeyWords: TKeyWords; FStringKey, FNumKey, FCommentKey, FCallKey: TKeyWord; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); override; destructor Destroy; override; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; override; end; implementation { TCodeSyntaxPython } constructor TCodeSyntaxPython.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited; var KeyWord: TKeyWord; FKeyWords := TKeyWords.Create; KeyWord := TKeyWord.Create; KeyWord.Word := ['import', 'from', 'def', 'return', 'for', 'if', 'elif', 'else', 'not', 'await', 'async', 'yield', 'as', 'with', 'pass', 'none', 'break', 'try', 'except', 'raise', 'class', 'finally', 'is', 'and', 'continue', 'lambda', 'nonlocal', 'while', 'assert', 'del', 'global', 'or']; KeyWord.Color := $FFF47067; //red KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); KeyWord := TKeyWord.Create; KeyWord.Word := ['in', '==', '=', '**', 'false', 'true']; KeyWord.Color := $FF1E8BF0; //blue KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); FStringKey := TKeyWord.Create; FStringKey.Color := $FF87D0FF; FStringKey.Font.Assign(FDefaultFont); FNumKey := TKeyWord.Create; FNumKey.Color := $FF46A9FF; FNumKey.Font.Assign(FDefaultFont); FCommentKey := TKeyWord.Create; FCommentKey.Color := $FF46A9FF; FCommentKey.Font.Assign(FDefaultFont); FCallKey := TKeyWord.Create; FCallKey.Color := $FFDCBDFB; FCallKey.Font.Assign(FDefaultFont); end; destructor TCodeSyntaxPython.Destroy; begin FStringKey.Free; FCallKey.Free; FCommentKey.Free; FNumKey.Free; FKeyWords.Free; inherited; end; function TCodeSyntaxPython.GetAttributesForLine(const Line: string; const Index: Integer): TArray; const Seps =[' ', ';', ')', '(', '[', ']', ':', '<', '>', ',', '+', '-', '=', '*', '/', '&']; begin if FCached.TryGetValue(Index, Result) then Exit; try var Buf: string := ''; var IsString: Boolean := False; var IsComment: Boolean := False; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; if IsString then begin if Line.Chars[C] = '''' then begin IsString := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '''' then begin IsString := True; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '#' then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C, Line.Length - C), TTextAttribute.Create(FCommentKey.Font, FCommentKey.Color) )]; Exit; end; if IsComment then begin if Line.Chars[C] = '"' then begin IsComment := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '"' then begin IsComment := True; Buf := Buf + Line.Chars[C]; Continue; end; if (C = Line.Length) or CharInSet(Line.Chars[C], Seps) then begin if not Buf.IsEmpty then begin var KeyWord: TKeyWord; var FL: Extended; if Line.Chars[C] = '(' then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FCallKey.Font, FCallKey.Color) )]; end; if (TryStrToFloat(Buf.Replace('.', ','), FL) or Buf.StartsWith('$')) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FNumKey.Font, FNumKey.Color) )]; end else if Buf.StartsWith('#') then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; end else if FKeyWords.FindWord(Buf, KeyWord) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(KeyWord.Font, KeyWord.Color) )]; end; Buf := ''; end; end else Buf := Buf + Line.Chars[C]; end; finally FCached.AddOrSetValue(Index, Result); end; end; initialization TCodeSyntax.RegisterSyntax(['python'], TCodeSyntaxPython); end. ================================================ FILE: Code/ChatGPT.Code.SQL.pas ================================================ unit ChatGPT.Code.SQL; interface uses System.SysUtils, ChatGPT.Code, System.Generics.Collections, FMX.TextLayout, FMX.Graphics, System.UITypes; type TCodeSyntaxSQL = class(TCodeSyntax) private FKeyWords: TKeyWords; FStringKey, FNumKey, FCommentKey, FDirectiveKey: TKeyWord; public constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); override; destructor Destroy; override; function GetAttributesForLine(const Line: string; const Index: Integer): TArray; override; end; implementation { TCodeSyntaxSQL } constructor TCodeSyntaxSQL.Create(DefaultFont: TFont; DefaultColor: TAlphaColor); begin inherited; var KeyWord: TKeyWord; FKeyWords := TKeyWords.Create; KeyWord := TKeyWord.Create; KeyWord.Word := ['add', 'constraint', 'alter', 'all', 'any', 'as', 'asc', 'backup', 'check', 'by', 'column', 'create', 'replace', 'database', 'default', 'delete', 'desc', 'distinct', 'drop', 'exec', 'exists', 'foreign', 'from', 'group', 'having', 'index', 'inner', 'insert', 'key', 'limit', 'order', 'outer', 'primary', 'procedure', 'right', 'join', 'rownum', 'select', 'into', 'set', 'table', 'top', 'truncate', 'union', 'unique', 'update', 'values', 'view', 'where', 'on', 'full', 'left']; KeyWord.Color := $FF638FCF; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); KeyWord := TKeyWord.Create; KeyWord.Word := ['ascii', 'char_length', 'character_length', 'concat', 'concat_ws', 'field', 'find_in_set', 'format', 'instr', 'lcase', 'length', 'locate', 'lower', 'lpad', 'ltrim', 'mid', 'position', 'repeat', 'reverse', 'rpad', 'rtrim', 'space', 'strcmp', 'substr', 'substring', 'substring_index', 'trim', 'ucase', 'upper', 'adddate', 'addtime', 'curdate', 'current_date', 'current_time', 'current_timestamp', 'curtime', 'date', 'datediff', 'date_add', 'date_format', 'date_sub', 'day', 'dayname', 'dayofmonth', 'dayofweek', 'dayofyear', 'extract', 'from_days', 'hour', 'last_day', 'localtime', 'localtimestamp', 'makedate', 'maketime', 'microsecond', 'minute', 'month', 'monthname', 'now', 'period_add', 'period_diff', 'quarter', 'second', 'sec_to_time', 'str_to_date', 'subdate', 'subtime', 'sysdate', 'time', 'time_format', 'time_to_sec', 'timediff', 'timestamp', 'to_days', 'week', 'weekday', 'weekofyear', 'year', 'yearweek', 'bin', 'binary', 'case', 'cast', 'coalesce', 'connection_id', 'conv', 'convert', 'current_user', 'if', 'ifnull', 'isnull', 'last_insert_id', 'nullif', 'session_user', 'system_user', 'user', 'version', 'any_value', 'array_agg', 'array_concat_agg', 'avg', 'bit_and', 'bit_or', 'bit_xor', 'count', 'countif', 'logical_and', 'logical_or', 'max', 'min', 'string_agg', 'sum']; KeyWord.Color := $FFC22700; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; //KeyWord.Font.Size := 25; FKeyWords.Add(KeyWord); KeyWord := TKeyWord.Create; KeyWord.Word := ['string', 'bytes', 'between', 'in', 'is', 'null', 'true', 'false', 'not', 'and', 'or', 'like']; KeyWord.Color := $FF5E5E5E; KeyWord.Font.Assign(FDefaultFont); KeyWord.Font.Style := [TFontStyle.fsBold]; FKeyWords.Add(KeyWord); FStringKey := TKeyWord.Create; FStringKey.Color := $FF468141; FStringKey.Font.Assign(FDefaultFont); FNumKey := TKeyWord.Create; FNumKey.Color := $FFFF7F85; FNumKey.Font.Assign(FDefaultFont); FCommentKey := TKeyWord.Create; FCommentKey.Color := $FF468141; FCommentKey.Font.Assign(FDefaultFont); FDirectiveKey := TKeyWord.Create; FDirectiveKey.Color := $FF3CB1FF; FDirectiveKey.Font.Assign(FDefaultFont); end; destructor TCodeSyntaxSQL.Destroy; begin FStringKey.Free; FDirectiveKey.Free; FCommentKey.Free; FNumKey.Free; FKeyWords.Free; inherited; end; function TCodeSyntaxSQL.GetAttributesForLine(const Line: string; const Index: Integer): TArray; const Seps =[' ', ';', ')', '(', '[', ']', ':', '<', '>', ',', '+', '-', '=', '*', '/', '&']; begin if FCached.TryGetValue(Index, Result) then Exit; try var Buf: string := ''; var IsString: Boolean := False; var IsComment: Boolean := False; for var C := 0 to Line.Length do begin if Line.IsEmpty then Continue; if IsComment then begin if Line.Chars[C] = '}' then begin IsComment := False; if not Buf.IsEmpty then begin if Buf.StartsWith('{$') then Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FDirectiveKey.Font, FDirectiveKey.Color) )] else Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FCommentKey.Font, FCommentKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if IsString then begin if Line.Chars[C] = '''' then begin IsString := False; if not Buf.IsEmpty then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length + 1), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; Buf := ''; end; Continue; end; Buf := Buf + Line.Chars[C]; Continue; end; if C <> Line.Length then begin if (Line.Chars[C] = '/') and (Line.Chars[C + 1] = '/') then begin Result := Result + [ TTextAttributedRangeData.Create( TTextRange.Create(C, Line.Length - C), TTextAttribute.Create(FCommentKey.Font, FCommentKey.Color) )]; Exit; end; if Line.Chars[C] = '{' then begin IsComment := True; Buf := Buf + Line.Chars[C]; Continue; end; if Line.Chars[C] = '''' then begin IsString := True; Buf := Buf + Line.Chars[C]; Continue; end; end; if (C = Line.Length) or CharInSet(Line.Chars[C], Seps) then begin if not Buf.IsEmpty then begin var KeyWord: TKeyWord; var Num: Extended; if (TryStrToFloat(Buf.Replace('.', ','), Num) or Buf.StartsWith('$')) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FNumKey.Font, FNumKey.Color) )]; end else if Buf.StartsWith('#') then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(FStringKey.Font, FStringKey.Color) )]; end else if FKeyWords.FindWord(Buf, KeyWord) then begin Result := Result + [TTextAttributedRangeData.Create( TTextRange.Create(C - Buf.Length, Buf.Length), TTextAttribute.Create(KeyWord.Font, KeyWord.Color) )]; end; Buf := ''; end; end else Buf := Buf + Line.Chars[C]; end; finally FCached.AddOrSetValue(Index, Result); end; end; initialization TCodeSyntax.RegisterSyntax(['sql'], TCodeSyntaxSQL); end. ================================================ FILE: FMX.Media.Win.pas ================================================ {*******************************************************} { } { Delphi FireMonkey Platform } { } { Copyright(c) 2012-2023 Embarcadero Technologies, Inc. } { All rights reserved } { } {*******************************************************} unit FMX.Media.Win; interface {$SCOPEDENUMS ON} uses System.Win.ComObj, System.Variants, System.Classes, System.SysUtils, System.Math, System.Types, System.SyncObjs, Winapi.Windows, Winapi.DirectShow9, Winapi.Direct3D9, Winapi.ActiveX, FMX.Context.DX9, FMX.Types, FMX.Types3D, FMX.Forms, FMX.Media, FMX.Platform.Win, FMX.Graphics, FMX.Consts; type { TWindowsCaptureDeviceManager } TWindowsCaptureDeviceManager = class(TCaptureDeviceManager) public constructor Create; override; destructor Destroy; override; end; { TWindowsCaptureDevice } TWindowsAudioCaptureDevice = class(TAudioCaptureDevice) private FMoniker: IMoniker; FBaseFilter: IBaseFilter; FGraphBuilder: IGraphBuilder; FCaptureGraphBuilder: ICaptureGraphBuilder2; FMediaControl: IMediaControl; protected procedure DoStartCapture; override; procedure DoStopCapture; override; function GetDeviceProperty(const Prop: TCaptureDevice.TProperty): string; override; function GetDeviceState: TCaptureDeviceState; override; function GetFilterString: string; override; public constructor Create(AManager: TCaptureDeviceManager; const AMoniker: IMoniker; const ADefault: Boolean); reintroduce; destructor Destroy; override; end; { TVMRRenderer } TVMRRenderer = class(TInterfacedPersistent, IVMRSurfaceAllocator9, IVMRImagePresenter9) private FVideoTexture: IDirect3DTexture9; // must be RenderTarget to allow GPU copy FSysMemSurface: IDirect3DSurface9; FSurface: IDirect3DSurface9; FSurfaceAllocatorNotify: IVMRSurfaceAllocatorNotify9; FBaseFilter: IBaseFilter; FVMRFilterConfig: IVMRFilterConfig9; FSampleBufferReady: TSampleBufferReadyEvent; FRunning: Boolean; FIsSkipFrames: Boolean; FRequestedBufferSize: TPoint; FBufferLoadTime: TMediaTime; FBufferLoaded: Boolean; FIsFinishedProcessingEvent: TEvent; { IVMRSurfaceAllocator9 } function InitializeDevice(dwUserID: DWORD; lpAllocInfo: PVMR9AllocationInfo; var lpNumBuffers: DWORD): HResult; stdcall; function TerminateDevice(dwID: DWORD): HResult; stdcall; function GetSurface(dwUserID: DWORD; SurfaceIndex: DWORD; SurfaceFlags: DWORD; out lplpSurface: IDirect3DSurface9): HResult; stdcall; function AdviseNotify(lpIVMRSurfAllocNotify: IVMRSurfaceAllocatorNotify9): HResult; stdcall; { IVMRImagePresenter9 } function StartPresenting(dwUserID: DWORD): HResult; stdcall; function StopPresenting(dwUserID: DWORD): HResult; stdcall; function PresentImage(dwUserID: DWORD; lpPresInfo: PVMR9PresentationInfo): HResult; stdcall; { } function AddToGraph(const FGraphBuilder: IGraphBuilder): Boolean; function LoadBufferToSystemMemory: Boolean; procedure SampleBufferToBitmap(const ABitmap: TBitmap; const ASetSize: Boolean); { sync } procedure Sync; public constructor Create; destructor Destroy; override; procedure SetSkipFrames; end; { TWindowsCaptureDevice } TWindowsVideoCaptureDevice = class(TVideoCaptureDevice) private const FrameDurationScale = 10000000; private FMoniker: IMoniker; FBaseFilter: IBaseFilter; FGraphBuilder: IGraphBuilder; FCaptureGraphBuilder: ICaptureGraphBuilder2; FMediaControl: IMediaControl; FVMRRenderer: TVMRRenderer; procedure VMRRendererSampleReady(Sender: TObject; const ATime: TMediaTime); protected procedure DoStartCapture; override; procedure DoStopCapture; override; procedure DoSampleBufferToBitmap(const ABitmap: TBitmap; const ASetSize: Boolean); override; function GetDeviceProperty(const Prop: TCaptureDevice.TProperty): string; override; function GetDeviceState: TCaptureDeviceState; override; /// Inherited from TVideoCaptureDevice. function GetCaptureSetting: TVideoCaptureSetting; override; /// Inherited from TVideoCaptureDevice. function DoSetCaptureSetting(const ASetting: TVideoCaptureSetting): Boolean; override; /// Inherited from TVideoCaptureDevice. function DoGetAvailableCaptureSettings: TArray; override; /// Inherited from TVideoCaptureDevice. procedure DoSetQuality(const Value: TVideoCaptureQuality); override; public constructor Create(AManager: TCaptureDeviceManager; const AMoniker: IMoniker; const ADefault: Boolean); reintroduce; destructor Destroy; override; end; { TWindowsMedia } TWindowsMedia = class(TMedia) private FGraphBuilder: IGraphBuilder; FMediaControl: IMediaControl; FMediaSeeking: IMediaSeeking; FBasicAudio: IBasicAudio; FVMR: IBaseFilter; FVMRFilterConfig9: IVMRFilterConfig9; FVMRWindowlessControl9: IVMRWindowlessControl9; FVMRFilterConfig7: IVMRFilterConfig; FVMRWindowlessControl7: IVMRWindowlessControl; FWnd: HWND; FWaitCompletionThread: TThread; FMediaState: TMediaState; { Initialization } procedure InitWnd; procedure DestroyWnd; function InitMediaControl: Boolean; function InitGraphTree: Boolean; function InitVideoMixingRenderer9: Boolean; function LocateVideoMixingRenderer9: Boolean; function InitVideoMixingRenderer7: Boolean; function LocateVideoMixingRenderer7: Boolean; { Playback thread listener } procedure StartWaitCompletionThread; procedure StopAndFreeWaitCompletionThread; procedure WaitCompletionThreadTerminated(Sender: TObject); protected function QueryInterface(const IID: TGUID; out Obj): HResult; override; function GetDuration: TMediaTime; override; function GetCurrent: TMediaTime; override; procedure SetCurrent(const Value: TMediaTime); override; function GetVideoSize: TPointF; override; function GetMediaState: TMediaState; override; function GetVolume: Single; override; procedure SetVolume(const Value: Single); override; procedure UpdateMediaFromControl; override; procedure DoPlay; override; procedure DoStop; override; public constructor Create(const AFileName: string); override; destructor Destroy; override; end; /// This thread is waiting for completion of playback of a media file. TWaitMediaCompletionThread = class(TThread) private FMediaEvent: IMediaEvent; protected procedure Execute; override; public constructor Create(const AMediaEvent: IMediaEvent); end; TWindowsMediaCodec = class(TCustomMediaCodec) public function CreateFromFile(const AFileName: string): TMedia; override; end; implementation uses System.RTLConsts, System.SysConst, System.Generics.Collections, Winapi.UrlMon; const MinAllowedVolume = -10000; { TWindowsCaptureDeviceManager } constructor TWindowsCaptureDeviceManager.Create; var Moniker: IMoniker; DevEnum: ICreateDevEnum; Enum: IEnumMoniker; Default: Boolean; begin inherited; CoCreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, DevEnum); if DevEnum <> nil then begin // audio devices Default := True; DevEnum.CreateClassEnumerator(CLSID_AudioInputDeviceCategory, Enum, 0); if Enum <> nil then while (Enum.Next(1, Moniker, nil) = S_OK) do begin TWindowsAudioCaptureDevice.Create(Self, Moniker, Default); Default := False; end; Enum := nil; // video devices Default := True; DevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, Enum, 0); if Enum <> nil then while (Enum.Next(1, Moniker, nil) = S_OK) do begin TWindowsVideoCaptureDevice.Create(Self, Moniker, Default); Default := False; end; end; end; destructor TWindowsCaptureDeviceManager.Destroy; begin inherited; end; { TWindowsAudioCaptureDevice } constructor TWindowsAudioCaptureDevice.Create(AManager: TCaptureDeviceManager; const AMoniker: IMoniker; const ADefault: Boolean); begin inherited Create(AManager, ADefault); if AMoniker = nil then raise EArgumentNilException.CreateResFmt(@SParamIsNil, ['AMoniker']); FMoniker := AMoniker; end; destructor TWindowsAudioCaptureDevice.Destroy; begin inherited; end; procedure InitBaseFilter(const Self: TWindowsAudioCaptureDevice); forward; overload; const //{3C78B8E2-6C4D-11d1-ADE2-0000F8754B99} CLSID_WavDest: TGUID = '{8A667154-F9CB-11D2-AD8A-0060B0575ABC}'; procedure InitAudioFilter(const Self: TWindowsAudioCaptureDevice); var HR: HResult; begin if Self.FBaseFilter <> nil then Exit; HR := Self.FMoniker.BindToObject(nil, nil, IID_IBaseFilter, Self.FBaseFilter); //HR := coCreateInstance(CLSID_WavDest, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Self.FBaseFilter); if Failed(HR) then raise ECaptureDeviceException.CreateRes(@SCannotCreateDirectShowCaptureFilter); end; procedure TWindowsAudioCaptureDevice.DoStartCapture; var HR: HResult; ppf: IBaseFilter; sink: IFileSinkfilter; FailedToRun: Boolean; begin InitAudioFilter(Self); FailedToRun := True; // Create GraphBuilder HR := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder); if Succeeded(HR) then begin HR := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder); if Succeeded(HR) then begin FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder); // Get IMediaControl FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl); HR := FGraphBuilder.AddFilter(FBaseFilter, 'Capture Filter'); if Succeeded(HR) then begin HR := FCaptureGraphBuilder.SetOutputFileName(MEDIASUBTYPE_WAVE, PChar(FFileName), ppf, sink); if Succeeded(HR) then begin HR := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Audio, FBaseFilter, nil, ppf); if Succeeded(HR) then begin if FMediaControl <> nil then begin HR := FMediaControl.Run; FailedToRun := Failed(HR); if not FailedToRun then Exit; // Success end; end; end; end; end; end; FCaptureGraphBuilder := nil; FGraphBuilder := nil; FMediaControl := nil; if FailedToRun then raise ECaptureDeviceException.CreateRes(@SCannotRunDirectShowFilterGraph); end; procedure TWindowsAudioCaptureDevice.DoStopCapture; begin if FMediaControl <> nil then begin FMediaControl.StopWhenReady; FCaptureGraphBuilder := nil; FGraphBuilder := nil; FMediaControl := nil; end; end; function TWindowsAudioCaptureDevice.GetDeviceProperty(const Prop: TCaptureDevice.TProperty): string; var PropBag: IPropertyBag; V: OleVariant; begin FMoniker.BindToStorage(nil, nil, IPropertyBag, PropBag); if PropBag <> nil then begin case Prop of TProperty.Description: begin PropBag.Read('Description', V, nil); Result := V; end; TProperty.Name: begin PropBag.Read('FriendlyName', V, nil); Result := V; end; TProperty.UniqueID: begin PropBag.Read('WaveInID', V, nil); Result := V; end; else Result := ''; end; end else Result := ''; end; function TWindowsAudioCaptureDevice.GetDeviceState: TCaptureDeviceState; begin if FMediaControl <> nil then Result := TCaptureDeviceState.Capturing else Result := TCaptureDeviceState.Stopped; end; function TWindowsAudioCaptureDevice.GetFilterString: string; begin Result := SVWAVFiles + '(*.wav)|*.wav'; end; procedure InitBaseFilter(const Self: TWindowsAudioCaptureDevice); var HR: HResult; begin if Self.FBaseFilter <> nil then Exit; HR := Self.FMoniker.BindToObject(nil, nil, IID_IBaseFilter, Self.FBaseFilter); if Failed(HR) then raise ECaptureDeviceException.CreateRes(@SCannotCreateDirectShowCaptureFilter); end; { TVMRRenderer } constructor TVMRRenderer.Create; begin inherited Create; FIsFinishedProcessingEvent := TEvent.Create; FIsFinishedProcessingEvent.SetEvent; FIsSkipFrames := False; end; destructor TVMRRenderer.Destroy; begin FreeAndNil(FIsFinishedProcessingEvent); FVideoTexture := nil; FSysMemSurface := nil; FSurfaceAllocatorNotify := nil; FBaseFilter := nil; FVMRFilterConfig := nil; inherited; end; function TVMRRenderer.AddToGraph(const FGraphBuilder: IGraphBuilder): Boolean; var HR: HResult; begin // Create VMR Result := True; HR := CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, FBaseFilter); if Succeeded(HR) then begin FBaseFilter.QueryInterface(IVMRFilterConfig9, FVMRFilterConfig); HR := FVMRFilterConfig.SetRenderingMode(VMR9Mode_Renderless); if Succeeded(HR) then begin FBaseFilter.QueryInterface(IVMRSurfaceAllocatorNotify9, FSurfaceAllocatorNotify); HR := FSurfaceAllocatorNotify.AdviseSurfaceAllocator(Cardinal(Self), Self); if Succeeded(HR) then begin IVMRSurfaceAllocator9(Self).AdviseNotify(FSurfaceAllocatorNotify); HR := FGraphBuilder.AddFilter(FBaseFilter, 'Video Mixing Renderer9'); if Succeeded(HR) then Exit; // Success end; end; end; Result := False; FVMRFilterConfig := nil; FBaseFilter := nil; end; { IVMRSurfaceAllocator9 } function TVMRRenderer.GetSurface(dwUserID, SurfaceIndex, SurfaceFlags: DWORD; out lplpSurface: IDirect3DSurface9): HResult; begin if FSurface <> nil then begin lplpSurface := FSurface; Result := S_OK; end else Result := E_FAIL; end; function TVMRRenderer.InitializeDevice(dwUserID: DWORD; lpAllocInfo: PVMR9AllocationInfo; var lpNumBuffers: DWORD): HResult; begin Result := E_NOTIMPL; if TCustomDX9Context.SharedDevice <> nil then Result := FSurfaceAllocatorNotify.AllocateSurfaceHelper(lpAllocInfo, lpNumBuffers, FSurface); end; function TVMRRenderer.TerminateDevice(dwID: DWORD): HResult; begin FVideoTexture := nil; FSysMemSurface := nil; FSurface := nil; Result := S_OK; end; function TVMRRenderer.AdviseNotify(lpIVMRSurfAllocNotify: IVMRSurfaceAllocatorNotify9): HResult; begin Result := E_NOTIMPL; if TCustomDX9Context.SharedDevice <> nil then Result := lpIVMRSurfAllocNotify.SetD3DDevice(TCustomDX9Context.SharedDevice, TCustomDX9Context.Direct3D9Obj.GetAdapterMonitor(D3DADAPTER_DEFAULT)); end; { IVMRImagePresenter9 } function TVMRRenderer.StartPresenting(dwUserID: DWORD): HResult; begin Result := S_OK; FRunning := True; FRequestedBufferSize := TPoint.Zero; FBufferLoaded := False; end; function TVMRRenderer.StopPresenting(dwUserID: DWORD): HResult; begin FRunning := False; Result := S_OK; end; function TVMRRenderer.PresentImage(dwUserID: DWORD; lpPresInfo: PVMR9PresentationInfo): HResult; begin TMonitor.Enter(Self); try if FIsSkipFrames then Exit(S_OK); finally TMonitor.Exit(Self); end; if FRunning and not FBufferLoaded then begin FIsFinishedProcessingEvent.ResetEvent; try if LoadBufferToSystemMemory then begin FBufferLoadTime := lpPresInfo.rtStart; FBufferLoaded := True; TThread.Synchronize(nil, Sync); end; finally FIsFinishedProcessingEvent.SetEvent; end; end; Result := S_OK; end; function TVMRRenderer.LoadBufferToSystemMemory: Boolean; var Device: IDirect3DDevice9; Desc: TD3DSurfaceDesc; CopyRect: TRect; VideoSurface: IDirect3DSurface9; begin Result := False; if (FSurface <> nil) and Succeeded(FSurface.GetDesc(Desc)) then begin Device := TCustomDX9Context.SharedDevice; if not FRequestedBufferSize.IsZero then CopyRect := TRect.Create(0, 0, FRequestedBufferSize.X, FRequestedBufferSize.Y) else CopyRect := TRect.Create(0, 0, Desc.Width, Desc.Height); if (FVideoTexture = nil) or (Integer(Desc.Width) <> CopyRect.Width) or (Integer(Desc.Height) <> CopyRect.Height) then begin FSysMemSurface := nil; FVideoTexture := nil; if Failed(Device.CreateTexture(CopyRect.Width, CopyRect.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, FVideoTexture, nil)) then Exit; if Failed(Device.CreateOffscreenPlainSurface(CopyRect.Width, CopyRect.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, FSysMemSurface, nil)) then begin FVideoTexture := nil; Exit; end; end; if Succeeded(FVideoTexture.GetSurfaceLevel(0, VideoSurface)) then begin if Failed(Device.StretchRect(FSurface, nil, VideoSurface, @CopyRect, D3DTEXF_LINEAR)) then Exit; Result := Succeeded(Device.GetRenderTargetData(VideoSurface, FSysMemSurface)); end; end; end; procedure TVMRRenderer.SampleBufferToBitmap(const ABitmap: TBitmap; const ASetSize: Boolean); procedure MoveResetAlpha(Source, Dest: Pointer; Count: Integer); begin while Count > 0 do begin PLongWord(Dest)^ := PLongWord(Source)^ or $FF000000; Inc(NativeInt(Source), 4); Inc(NativeInt(Dest), 4); Dec(Count); end; end; var Desc: TD3DSurfaceDesc; DescValid: Boolean; Lock: TD3DLockedRect; Map: TBitmapData; I: Integer; begin if not ASetSize and ABitmap.IsEmpty then raise EBitmapIncorrectSize.Create(SBitmapIncorrectSize); if FSurface <> nil then begin if FVideoTexture <> nil then DescValid := Succeeded(FVideoTexture.GetLevelDesc(0, Desc)) else DescValid := Succeeded(FSurface.GetDesc(Desc)); if not DescValid then raise EBitmapIncorrectSize.Create(SRetrieveSurfaceDescription); if ASetSize then begin ABitmap.SetSize(Desc.Width, Desc.Height); FRequestedBufferSize := TPoint.Zero; end else if (Integer(Desc.Width) <> ABitmap.Width) or (Integer(Desc.Height) <> ABitmap.Height) then begin FRequestedBufferSize := TPoint.Create(ABitmap.Width, ABitmap.Height); // Buffer that was loaded previously has incorrect size, therefore it needs to be reloaded again here. if not LoadBufferToSystemMemory then raise ERetrieveSurfaceContents.Create(SRetrieveSurfaceContents); end; if Failed(FSysMemSurface.LockRect(Lock, nil, D3DLOCK_READONLY)) then raise ERetrieveSurfaceContents.Create(SRetrieveSurfaceContents); try if not ABitmap.Map(TMapAccess.Write, Map) then raise EAcquireBitmapAccess.Create(SAcquireBitmapAccess); try for I := 0 to ABitmap.Height - 1 do MoveResetAlpha(Pointer(NativeInt(Lock.pBits) + Lock.Pitch * I), Map.GetScanline(I), Desc.Width); finally ABitmap.Unmap(Map); end; finally FSysMemSurface.UnlockRect; end; end; end; procedure TVMRRenderer.SetSkipFrames; begin TMonitor.Enter(Self); try FIsSkipFrames := True; finally TMonitor.Exit(Self); end; // When we process camera frame we synchronize rendered frame with Main UI Thread and for this purpose // we use TThread.Synchronize. When user stops camera, it uses synchronouse method IMediaControl.Stop, // which blocks UI thread and as result main thread cannot make synchronization and we get dead lock. // For avoiding it we need to invoke CheckSynchronize while current frame is processed. while FRunning and (FIsFinishedProcessingEvent.WaitFor(20) = TWaitResult.wrTimeout) do CheckSynchronize; end; procedure TVMRRenderer.Sync; begin if FBufferLoaded then begin if Assigned(FSampleBufferReady) then FSampleBufferReady(Self, FBufferLoadTime); FBufferLoaded := False; end; end; { TWindowsVideoCaptureDevice } function PinMatchesCategory(APin: IPin; ACategory: TGuid): Boolean; var LSet: IKsPropertySet; PinCategory: TGuid; Value: DWORD; LResult: HRESULT; begin Result := False; if Supports(APin, IKsPropertySet, LSet) then begin LResult := LSet.Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, nil, 0, PinCategory, SizeOf(TGuid), Value); if Succeeded(LResult) and (Value = SizeOf(TGuid)) then Result := (PinCategory = ACategory); end; end; function GetStreamConfig(const APin: IPin): IAMStreamConfig; begin Supports(APin, IAMStreamConfig, Result); end; function GetCapturePin(const AFilter: IBaseFilter): IPin; var PinsEnum: IEnumPins; Pin: IPin; Config: IAMStreamConfig; begin Result := nil; AFilter.EnumPins(PinsEnum); if PinsEnum <> nil then while PinsEnum.Next(1, Pin, nil) = S_OK do if PinMatchesCategory(Pin, PIN_CATEGORY_CAPTURE) then begin if Supports(Pin, IAMStreamConfig, Config) then Exit(Pin); end; end; constructor TWindowsVideoCaptureDevice.Create(AManager: TCaptureDeviceManager; const AMoniker: IMoniker; const ADefault: Boolean); begin inherited Create(AManager, ADefault); if AMoniker = nil then raise EArgumentNilException.CreateResFmt(@SParamIsNil, ['AMoniker']); FMoniker := AMoniker; end; destructor TWindowsVideoCaptureDevice.Destroy; begin inherited; end; procedure InitBaseFilter(const Self: TWindowsVideoCaptureDevice); forward; overload; procedure TWindowsVideoCaptureDevice.DoStartCapture; var HR: HResult; FailedToRun: Boolean; begin InitBaseFilter(Self); FailedToRun := False; // Create GraphBuilder HR := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder); if Succeeded(HR) then begin HR := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IFilterGraph2, FGraphBuilder); if Succeeded(HR) then begin FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder); // Get IMediaControl FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl); // Set Capture HR := FGraphBuilder.AddFilter(FBaseFilter, 'Capture'); if Succeeded(HR) then begin // Create VMR FVMRRenderer := TVMRRenderer.Create; FVMRRenderer.FSampleBufferReady := VMRRendererSampleReady; FVMRRenderer.AddToGraph(FGraphBuilder); // Start HR := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, FBaseFilter, nil, FVMRRenderer.FBaseFilter); if Succeeded(HR) then begin if FMediaControl <> nil then begin HR := FMediaControl.Run; FailedToRun := Failed(HR); if not FailedToRun then Exit; // Success end; end; end; end; end; FMediaControl := nil; FCaptureGraphBuilder := nil; FGraphBuilder := nil; FreeAndNil(FVMRRenderer); if FailedToRun then raise ECaptureDeviceException.CreateRes(@SCannotRunDirectShowFilterGraph); end; procedure TWindowsVideoCaptureDevice.DoStopCapture; begin if (FMediaControl <> nil) then begin FVMRRenderer.SetSkipFrames; FMediaControl.StopWhenReady; FMediaControl := nil; FCaptureGraphBuilder := nil; FGraphBuilder := nil; FreeAndNil(FVMRRenderer); end; end; function TWindowsVideoCaptureDevice.DoGetAvailableCaptureSettings: TArray; var MediaEnum: IEnumMediaTypes; Pin: IPin; MediaType: PAMMediaType; OldMediaType: PAMMediaType; MediaHeader: PVideoInfoHeader; List: TList; Setting: TVideoCaptureSetting; Config: IAMStreamConfig; begin InitBaseFilter(Self); SetLength(Result, 0); List := TList.Create; try Pin := GetCapturePin(FBaseFilter); if Pin <> nil then begin Config := GetStreamConfig(Pin); Config.GetFormat(OldMediaType); try Config.SetFormat(nil); Pin.EnumMediaTypes(MediaEnum); if MediaEnum <> nil then while MediaEnum.Next(1, MediaType, nil) = S_OK do if (MediaType.formattype = FORMAT_VideoInfo) and (MediaType.cbFormat >= SizeOf(VIDEOINFOHEADER)) and (MediaType.pbFormat <> nil) then begin MediaHeader := MediaType.pbFormat; Setting.Width := MediaHeader.bmiHeader.biWidth; Setting.Height := MediaHeader.bmiHeader.biHeight; Setting.FrameRate := FrameDurationScale / MediaHeader.AvgTimePerFrame; if not List.Contains(Setting) then List.Add(Setting); end; finally Config.SetFormat(OldMediaType); end; end; Result := List.ToArray; finally List.Free; end; end; function TWindowsVideoCaptureDevice.DoSetCaptureSetting(const ASetting: TVideoCaptureSetting): Boolean; var MediaEnum: IEnumMediaTypes; Pin: IPin; MediaType, SelectedMediaType: PAMMediaType; MediaHeader: PVideoInfoHeader; Found: Boolean; Config: IAMStreamConfig; DesiredAvgDuration: Double; begin InitBaseFilter(Self); Found := False; Result := False; DesiredAvgDuration := FrameDurationScale / ASetting.FrameRate; Pin := GetCapturePin(FBaseFilter); if Pin <> nil then begin // We store the current configuration in order to reset it if there was any problem Config := GetStreamConfig(Pin); Config.GetFormat(SelectedMediaType); try Config.SetFormat(nil); Pin.EnumMediaTypes(MediaEnum); if MediaEnum <> nil then while (Found = False) and (MediaEnum.Next(1, MediaType, nil) = S_OK) do begin if (MediaType.formattype = FORMAT_VideoInfo) and (MediaType.cbFormat >= SizeOf(VIDEOINFOHEADER)) and (MediaType.pbFormat <> nil) then begin MediaHeader := MediaType.pbFormat; if (MediaHeader.bmiHeader.biWidth = ASetting.Width) and (MediaHeader.bmiHeader.biHeight = ASetting.Height) and (MediaHeader.AvgTimePerFrame = DesiredAvgDuration) then begin // As described in Direct Show, this is an estimation Found := True; SelectedMediaType := MediaType; Break; end; end; end; finally Result := Found and Succeeded(Config.SetFormat(SelectedMediaType)); end; end; end; procedure TWindowsVideoCaptureDevice.DoSetQuality(const Value: TVideoCaptureQuality); var SettingsList: TArray; Priority: TVideoCaptureSettingPriority; begin if Value <> TVideoCaptureQuality.CaptureSettings then begin Priority := CaptureSettingPriority; try CaptureSettingPriority := TVideoCaptureSettingPriority.Resolution; SettingsList := AvailableCaptureSettings; finally CaptureSettingPriority := Priority; end; if Length(SettingsList) > 0 then begin case Value of TVideoCaptureQuality.PhotoQuality: CaptureSetting := SettingsList[0]; TVideoCaptureQuality.HighQuality: CaptureSetting := SettingsList[0]; TVideoCaptureQuality.MediumQuality: CaptureSetting := SettingsList[Length(SettingsList) div 2]; TVideoCaptureQuality.LowQuality: CaptureSetting := SettingsList[High(SettingsList)]; end; end; end; inherited; end; function TWindowsVideoCaptureDevice.GetCaptureSetting: TVideoCaptureSetting; var PinsEnum: IEnumPins; Pin: IPin; MediaType: PAMMediaType; MediaHeader: PVideoInfoHeader; Config: IAMStreamConfig; begin InitBaseFilter(Self); Result := TVideoCaptureSetting.Create; FBaseFilter.EnumPins(PinsEnum); if PinsEnum <> nil then while (PinsEnum.Next(1, Pin, nil) = S_OK) and Supports(Pin, IAMStreamConfig, Config) do begin Config.GetFormat(MediaType); MediaHeader := MediaType.pbFormat; Exit(TVideoCaptureSetting.Create(MediaHeader.bmiHeader.biWidth, MediaHeader.bmiHeader.biHeight, FrameDurationScale / MediaHeader.AvgTimePerFrame)); end; end; procedure TWindowsVideoCaptureDevice.DoSampleBufferToBitmap(const ABitmap: TBitmap; const ASetSize: Boolean); begin FVMRRenderer.SampleBufferToBitmap(ABitmap, ASetSize); end; function TWindowsVideoCaptureDevice.GetDeviceProperty(const Prop: TCaptureDevice.TProperty): string; var PropBag: IPropertyBag; HR: HRESULT; V: OleVariant; begin HR := FMoniker.BindToStorage(nil, nil, IPropertyBag, PropBag); if Succeeded(HR) then begin case Prop of TProperty.Description: begin PropBag.Read('Description', V, nil); Result := V; end; TProperty.Name: begin PropBag.Read('FriendlyName', V, nil); Result := V; end; TProperty.UniqueID: begin PropBag.Read('DevicePath', V, nil); Result := V; end; else Result := string.Empty; end; end else Result := string.Empty; end; function TWindowsVideoCaptureDevice.GetDeviceState: TCaptureDeviceState; begin if FMediaControl <> nil then Result := TCaptureDeviceState.Capturing else Result := TCaptureDeviceState.Stopped; end; procedure TWindowsVideoCaptureDevice.VMRRendererSampleReady(Sender: TObject; const ATime: TMediaTime); begin SampleBufferReady(ATime); end; procedure InitBaseFilter(const Self: TWindowsVideoCaptureDevice); var HR: HResult; begin if Self.FBaseFilter <> nil then Exit; HR := Self.FMoniker.BindToObject(nil, nil, IID_IBaseFilter, Self.FBaseFilter); if Failed(HR) then raise ECaptureDeviceException.CreateRes(@SCannotCreateDirectShowCaptureFilter); end; { TWindowsMedia } constructor TWindowsMedia.Create(const AFileName: string); begin if (not FileExists(AFileName)) and (IsValidURL(nil, PChar(AFileName), 0) <> S_OK) then raise EFileNotFoundException.Create(SFileNotFound); inherited; FMediaState := TMediaState.Unavailable; InitWnd; if InitMediaControl and InitVideoMixingRenderer9 then begin if not LocateVideoMixingRenderer9 then begin FVMR := nil; FVMRFilterConfig9 := nil; if InitVideoMixingRenderer7 then LocateVideoMixingRenderer7 else raise EMediaException.Create(SMediaGlobalError); end; if InitGraphTree then Exit; end; DestroyWnd; FGraphBuilder := nil; FMediaControl := nil; raise EMediaException.CreateFmt(SMediaFileNotSupported, [ExtractFileName(AFileName)]); end; destructor TWindowsMedia.Destroy; begin StopAndFreeWaitCompletionThread; DestroyWnd; if FMediaControl <> nil then begin FMediaControl.StopWhenReady; FMediaControl := nil; end; FGraphBuilder := nil; inherited Destroy; end; procedure TWindowsMedia.DestroyWnd; begin DestroyWindow(FWnd); end; procedure TWindowsMedia.DoPlay; begin FMediaState := TMediaState.Playing; FMediaControl.Run; StartWaitCompletionThread; end; procedure TWindowsMedia.DoStop; begin StopAndFreeWaitCompletionThread; FMediaControl.StopWhenReady; FMediaState := TMediaState.Stopped; end; procedure TWindowsMedia.UpdateMediaFromControl; var P: TPointF; R: TRect; Bounds: TRectF; Form: TCommonCustomForm; BoundsInt: TRect; begin if FWnd = 0 then Exit; if (Control <> nil) and not (csDesigning in Control.ComponentState) and (Control.ParentedVisible) and (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then begin Form := TCommonCustomForm(Control.Root.GetObject); var Scale := Form.Handle.Scale; SetParent(FWnd, WindowHandleToPlatform(Form.Handle).Wnd); P := GetVideoSize; Bounds := TRectF.Create(0, 0, P.X, P.Y); Bounds.Fit(TRectF.Create(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight)); Bounds.Offset(Control.AbsoluteRect.TopLeft); BoundsInt := TRectF.Create(Bounds.Left * Scale, Bounds.Top * Scale, Bounds.Right * Scale, Bounds.Bottom * Scale).Round; SetWindowPos(FWnd, 0, BoundsInt.Left, BoundsInt.Top, BoundsInt.Width, BoundsInt.Height, 0); R := TRect.Create(0, 0, BoundsInt.Width, BoundsInt.Height); if FVMRWindowlessControl9 <> nil then FVMRWindowlessControl9.SetVideoPosition(nil, @R); if FVMRWindowlessControl7 <> nil then FVMRWindowlessControl7.SetVideoPosition(nil, @R); ShowWindow(FWnd, SW_SHOW) end else begin SetParent(FWnd, ApplicationHWND); ShowWindow(FWnd, SW_HIDE) end; end; procedure TWindowsMedia.WaitCompletionThreadTerminated(Sender: TObject); begin FMediaState := TMediaState.Stopped; // IMediaControl doesn't stop, even if the playback is already finished. // This causes the video to continue playing if the user changes the Current position. FMediaControl.Pause; end; function TWindowsMedia.GetDuration: TMediaTime; var LDuration: Int64; begin if FMediaSeeking = nil then Result := 0 else begin FMediaSeeking.GetDuration(LDuration); Result := LDuration; end; end; function TWindowsMedia.GetCurrent: TMediaTime; var CurrentPosition: Int64; begin if FMediaSeeking = nil then Result := 0 else begin FMediaSeeking.GetCurrentPosition(CurrentPosition); Result := CurrentPosition; end; end; procedure TWindowsMedia.SetCurrent(const Value: TMediaTime); var CurrentPosition, S: Int64; begin if FMediaSeeking <> nil then begin CurrentPosition := Value; FMediaSeeking.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning, S, AM_SEEKING_SeekToKeyFrame); end; end; function TWindowsMedia.GetVolume: Single; var LVolume: Integer; begin if FBasicAudio <> nil then begin FBasicAudio.get_Volume(LVolume); if LVolume > MinAllowedVolume then Result := EnsureRange(Power(10, -LVolume / MinAllowedVolume), 0, 1) else Result := 0; end else Result := 1.0; end; function TWindowsMedia.InitGraphTree: Boolean; begin Result := False; if Succeeded(FGraphBuilder.RenderFile(PChar(FileName), nil)) then begin FMediaControl.StopWhenReady; // Get IMediaSeeking FGraphBuilder.QueryInterface(IID_IMediaSeeking, FMediaSeeking); // Get IBaseAudio FGraphBuilder.QueryInterface(IID_IBasicAudio, FBasicAudio); Result := True; // Success end; end; function TWindowsMedia.InitMediaControl: Boolean; begin Result := Succeeded(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder)) and Succeeded(FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl)); end; function TWindowsMedia.InitVideoMixingRenderer7: Boolean; const VideoMixingRenderer7 = 'Video Mixing Renderer7'; begin Result := Succeeded(CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVMR)) and Succeeded(FVMR.QueryInterface(IVMRFilterConfig, FVMRFilterConfig7)) and Succeeded(FGraphBuilder.AddFilter(FVMR, VideoMixingRenderer7)) and Succeeded(FVMRFilterConfig7.SetRenderingMode(VMRMode_Windowless)); end; function TWindowsMedia.InitVideoMixingRenderer9: Boolean; const VideoMixingRenderer9 = 'Video Mixing Renderer9'; begin Result := Succeeded(CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, FVMR)) and Succeeded(FVMR.QueryInterface(IVMRFilterConfig9, FVMRFilterConfig9)) and Succeeded(FGraphBuilder.AddFilter(FVMR, VideoMixingRenderer9)) and Succeeded(FVMRFilterConfig9.SetRenderingMode(VMR9Mode_Windowless)); end; procedure TWindowsMedia.InitWnd; var WindowClass: TWndClass; begin if not GetClassInfo(hInstance, PChar('VMRWindow'), WindowClass) then begin FillChar(WindowClass, SizeOf(WindowClass), 0); WindowClass.Style := CS_HREDRAW or CS_VREDRAW; WindowClass.lpfnWndProc := @DefWindowProc; WindowClass.cbClsExtra := 0; WindowClass.cbWndExtra := 0; WindowClass.hInstance := hInstance; WindowClass.hCursor := LoadCursorW(0, PChar(IDC_ARROW)); WindowClass.hbrBackground := GetStockObject(NULL_BRUSH); WindowClass.lpszMenuName := nil; WindowClass.lpszClassName := PChar('VMRWindow'); if Winapi.Windows.RegisterClass(WindowClass) = 0 then RaiseLastOSError; end; FWnd := CreateWindowEx(0, WindowClass.lpszClassName, nil, WS_CHILDWINDOW, 0, 0, 0, 0, GetDesktopWindow, 0, hInstance, nil); ShowWindow(FWnd, SW_HIDE); end; function TWindowsMedia.LocateVideoMixingRenderer7: Boolean; var R: TRect; begin Result := False; if Succeeded(FVMR.QueryInterface(IVMRWindowlessControl, FVMRWindowlessControl7)) then begin FVMRWindowlessControl7.SetVideoClippingWindow(FWnd); GetClientRect(FWnd, R); FVMRWindowlessControl7.SetVideoPosition(nil, @R); Result := True; end end; function TWindowsMedia.LocateVideoMixingRenderer9: Boolean; var R: TRect; begin Result := False; if Succeeded(FVMR.QueryInterface(IVMRWindowlessControl9, FVMRWindowlessControl9)) then begin FVMRWindowlessControl9.SetVideoClippingWindow(FWnd); GetClientRect(FWnd, R); FVMRWindowlessControl9.SetVideoPosition(nil, @R); Result := True; end end; function TWindowsMedia.QueryInterface(const IID: TGUID; out Obj): HResult; begin if Supports(FGraphBuilder, IID, Obj) then Exit(S_OK); if Supports(FMediaControl, IID, Obj) then Exit(S_OK); if Supports(FMediaSeeking, IID, Obj) then Exit(S_OK); if Supports(FBasicAudio, IID, Obj) then Exit(S_OK); if Supports(FVMR, IID, Obj) then Exit(S_OK); if Supports(FVMRFilterConfig9, IID, Obj) then Exit(S_OK); if Supports(FVMRWindowlessControl9, IID, Obj) then Exit(S_OK); if Supports(FVMRFilterConfig7, IID, Obj) then Exit(S_OK); if Supports(FVMRWindowlessControl7, IID, Obj) then Exit(S_OK); Result := E_NOTIMPL; end; procedure TWindowsMedia.SetVolume(const Value: Single); var LVolume : Single; begin if FBasicAudio = nil then Exit; if Value > 0 then begin LVolume := EnsureRange(-MinAllowedVolume * Log10(Value), MinAllowedVolume, 0); FBasicAudio.put_Volume(Round(LVolume)); end else FBasicAudio.put_Volume(MinAllowedVolume); end; procedure TWindowsMedia.StartWaitCompletionThread; var MediaEvent: IMediaEvent; begin if (FWaitCompletionThread = nil) or FWaitCompletionThread.Finished then begin StopAndFreeWaitCompletionThread; if Supports(FGraphBuilder, IMediaEvent, MediaEvent) then begin FWaitCompletionThread := TWaitMediaCompletionThread.Create(MediaEvent); FWaitCompletionThread.OnTerminate := WaitCompletionThreadTerminated; end; end; end; procedure TWindowsMedia.StopAndFreeWaitCompletionThread; begin if FWaitCompletionThread <> nil then begin FWaitCompletionThread.Terminate; FWaitCompletionThread.WaitFor; FreeAndNil(FWaitCompletionThread); end; end; function TWindowsMedia.GetMediaState: TMediaState; begin Result := FMediaState; end; function TWindowsMedia.GetVideoSize: TPointF; var W, H, AW, AH: Integer; begin if FVMRWindowlessControl9 <> nil then begin FVMRWindowlessControl9.GetNativeVideoSize(W, H, AW, AH); Result := TPointF.Create(W, H); end else if FVMRWindowlessControl7 <> nil then begin FVMRWindowlessControl7.GetNativeVideoSize(W, H, AW, AH); Result := TPointF.Create(W, H); end else Result := TPointF.Zero; end; { TWindowsMediaCodec } function TWindowsMediaCodec.CreateFromFile(const AFileName: string): TMedia; begin Result := TWindowsMedia.Create(AFileName); end; { TWaitMediaCompletionThread } constructor TWaitMediaCompletionThread.Create(const AMediaEvent: IMediaEvent); begin inherited Create(False); FMediaEvent := AMediaEvent; end; procedure TWaitMediaCompletionThread.Execute; const CheckingStateInterval = 50; var EventCode: Integer; begin EventCode := 0; try while (EventCode = 0) and not Terminated do FMediaEvent.WaitForCompletion(CheckingStateInterval, EventCode); finally FMediaEvent := nil; end; end; initialization TMediaCodecManager.RegisterMediaCodecClass('.avi', SVAviFiles, TMediaType.Video, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.wmv', SVWMVFiles, TMediaType.Video, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.mp4', SVMP4Files, TMediaType.Video, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.m4v', SVMP4Files, TMediaType.Video, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.mov', SVMOVFiles, TMediaType.Video, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.wma', SVWMAFiles, TMediaType.Audio, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.mp3', SVMP3Files, TMediaType.Audio, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass('.wav', SVWAVFiles, TMediaType.Audio, TWindowsMediaCodec); TMediaCodecManager.RegisterMediaCodecClass(SAllFilesExt, SDefault, TMediaType.Video, TWindowsMediaCodec); finalization end. ================================================ FILE: FunctionsLib/func_cmd.pas ================================================ unit func_cmd; interface uses System.SysUtils, System.JSON, ChatGPT.Functions.External.Intf, Process; type TChatFunctionCMD = class(TInterfacedObject, IChatFunctionExternal) protected function GetDescription: WideString; function GetName: WideString; function GetParameters: WideString; public function Execute(const Args: WideString): WideString; end; implementation { TChatFunctionCMD } function TChatFunctionCMD.Execute(const Args: WideString): WideString; var JSON: TJSONObject; Command: string; Params: TArray; begin Result := ''; // Parse arguments try JSON := TJSONObject.ParseJSONValue(Args) as TJSONObject; if Assigned(JSON) then try Command := JSON.GetValue('command', ''); Params := ['/c', Command] + JSON.GetValue>('params', ['']); finally JSON.Free; end; except JSON := nil; end; // Invalid arguments if (not Assigned(JSON)) or Command.IsEmpty then Exit; // Generate response JSON := TJSONObject.Create; try var Output: AnsiString; if RunCommand('cmd', Params, Output, [poNoConsole]) then JSON.AddPair('result', string(Output)) else JSON.AddPair('error', 'Unknown error'); Result := JSON.ToJSON; finally JSON.Free; end; end; function TChatFunctionCMD.GetDescription: WideString; begin Result := 'Run command via cmd'; end; function TChatFunctionCMD.GetName: WideString; begin Result := 'execute_command'; end; function TChatFunctionCMD.GetParameters: WideString; begin Result := '{' + ' "type": "object",' + ' "properties": {' + ' "command": {"type": "string", "description": "Command to execute"},' + ' "params": {"type": "array", "items": {"type": "string"}, "description": "Command Options"}' + ' },' + ' "required": ["command"]' + '}'; end; end. ================================================ FILE: FunctionsLib/func_weather.pas ================================================ unit func_weather; interface uses System.SysUtils, System.JSON, ChatGPT.Functions.External.Intf, OWM.API, OWM.Classes; type TChatFunctionWeather = class(TInterfacedObject, IChatFunctionExternal) const OWM_APPID = '36994c7b370d2e4c0753e34696105d7c'; //I do not mind) protected function GetDescription: WideString; function GetName: WideString; function GetParameters: WideString; public function Execute(const Args: WideString): WideString; end; implementation { TChatFunctionWeather } function TChatFunctionWeather.Execute(const Args: WideString): WideString; var JSON: TJSONObject; Location: string; UnitKind: string; begin Result := ''; // Parse arguments try JSON := TJSONObject.ParseJSONValue(Args) as TJSONObject; if Assigned(JSON) then try Location := JSON.GetValue('location', ''); UnitKind := JSON.GetValue('unit', ''); finally JSON.Free; end; except JSON := nil; end; // Invalid arguments if (not Assigned(JSON)) or Location.IsEmpty then Exit; // Generate response JSON := TJSONObject.Create; try var OWM := TOWMAPI.Create(nil, OWM_APPID); try var OWMCurrent: TOWMCurrent; var Units: TOWMUnit; if UnitKind = 'celsius' then Units := TOWMUnit.Metric else if UnitKind = 'fahrenheit' then Units := TOWMUnit.Imperial else Units := TOWMUnit.Metric; if OWM.Current(OWMCurrent, Location, Units) then try JSON.AddPair('location', OWMCurrent.Name); JSON.AddPair('unit', UnitKind); JSON.AddPair('temperature', TJSONNumber.Create(Round(OWMCurrent.Main.Temp))); JSON.AddPair('pressure', TJSONNumber.Create(OWMCurrent.Main.Pressure)); JSON.AddPair('humidity', TJSONNumber.Create(OWMCurrent.Main.Humidity)); Result := JSON.ToJSON; finally OWMCurrent.Free; end; finally OWM.Free; end; finally JSON.Free; end; end; function TChatFunctionWeather.GetDescription: WideString; begin Result := 'Get the current weather in a given location'; end; function TChatFunctionWeather.GetName: WideString; begin Result := 'get_current_weather'; end; function TChatFunctionWeather.GetParameters: WideString; begin Result := '{' + ' "type": "object",' + ' "properties": {' + ' "location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"},' + ' "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}' + ' },' + ' "required": ["location"]' + '}'; end; end. ================================================ FILE: FunctionsLib/gpt_function_cmd.dpr ================================================ library gpt_function_cmd; uses System.SysUtils, ChatGPT.Functions.External.Intf in '..\ChatGPT.Functions.External.Intf.pas', func_cmd in 'func_cmd.pas', Process in '..\TProcessDelphi\Process.pas', Pipes in '..\TProcessDelphi\Pipes.pas'; function gptfunctions: TArray; begin Result := [TChatFunctionCMD.Create]; end; exports gptfunctions; begin end. ================================================ FILE: FunctionsLib/gpt_function_cmd.dproj ================================================  {5D99C67F-D3C0-4DC0-A153-9C8F66990649} 20.4 None True Debug Win32 3 Library gpt_function_cmd.dpr gpt_function_cmd true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Cfg_1 true true true Base true .\$(Platform)\$(Config) .\$(Platform)\$(Config) false false false false false true System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) gpt_function_cmd package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug $(MSBuildProjectName) CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true DataSnapServer;fmx;emshosting;DbxCommonDriver;bindengine;FireDACCommonODBC;emsclient;FireDACCommonDriver;IndyProtocols;Skia.Package.RTL;dbxcds;emsedge;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;dbexpress;FireDACInfxDriver;inet;DataSnapCommon;dbrtl;FireDACOracleDriver;Skia.Package.FMX;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;FireDACMongoDBDriver;IndySystem;RadiantShapesFmx;FireDACTDataDriver;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;dsnapxml;DataSnapClient;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;xmlrtl;dsnap;CloudService;FireDACDb2Driver;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;HGMComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;HGMLineStorage;FireDACSqliteDriver;DbxClientDriver;FmxTrayIcon;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;CEF4DelphiVCLRTL;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;TGC_API;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;AbbreviaVCLD;DataSnapIndy10ServerTransport;CEF4DelphiFMXRTL;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;PngComponentsD;RvXmlFMXD11;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;DelphiDiagPlugin;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;RvHtmlFMXD11;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ChatGptWizard;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;VKComponents;RVPkgFMXD11;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;mbColorLibDXTokyo;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 D:\Projects\ChatGPT\Win32\Debug\funcs\ (None) none vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;CEF4DelphiVCLRTL;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;AbbreviaVCLD;DataSnapIndy10ServerTransport;CEF4DelphiFMXRTL;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;PngComponentsD;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 DEBUG;$(DCC_Define) true false true true true true true false true 1033 (None) none false RELEASE;$(DCC_Define) 0 0 MainSource Base Cfg_1 Base Cfg_2 Base Delphi.Personality.12 Application gpt_function_cmd.dpr Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components true true true 1 Contents\MacOS 1 0 res\xml 1 res\xml 1 library\lib\armeabi 1 library\lib\armeabi 1 library\lib\armeabi-v7a 1 library\lib\mips 1 library\lib\mips 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 library\lib\armeabi-v7a 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v21 1 res\drawable-anydpi-v21 1 res\values 1 res\values 1 res\values-v21 1 res\values-v21 1 res\values-v31 1 res\values-v31 1 res\values-v35 1 res\values-v35 1 res\drawable-anydpi-v26 1 res\drawable-anydpi-v26 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v33 1 res\drawable-anydpi-v33 1 res\values 1 res\values 1 res\values-night-v21 1 res\values-night-v21 1 res\drawable 1 res\drawable 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-ldpi 1 res\drawable-ldpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-small 1 res\drawable-small 1 res\drawable-normal 1 res\drawable-normal 1 res\drawable-large 1 res\drawable-large 1 res\drawable-xlarge 1 res\drawable-xlarge 1 res\values 1 res\values 1 res\drawable-anydpi-v24 1 res\drawable-anydpi-v24 1 res\drawable 1 res\drawable 1 res\drawable-night-anydpi-v21 1 res\drawable-night-anydpi-v21 1 res\drawable-anydpi-v31 1 res\drawable-anydpi-v31 1 res\drawable-night-anydpi-v31 1 res\drawable-night-anydpi-v31 1 1 Contents\MacOS 1 0 Contents\MacOS 1 .framework Contents\MacOS 1 .framework Contents\MacOS 1 .framework 0 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .dll;.bpl 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .bpl 0 0 0 0 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 0 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 Contents 1 Contents 1 Contents 1 Contents\Resources 1 Contents\Resources 1 Contents\Resources 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 1 1 1 1 Contents\MacOS 1 Contents\MacOS 1 Contents\MacOS 1 0 library\lib\armeabi-v7a 1 1 1 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 1 1 1 ..\$(PROJECTNAME).launchscreen 64 ..\$(PROJECTNAME).launchscreen 64 1 1 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 False False False False False False False True True 12 ================================================ FILE: FunctionsLib/gpt_function_owm.deployproj ================================================  12 gpt_function_owm\ gpt_function_owm.dll ProjectOutput 0 True True gpt_function_owm\ libgpt_function_owm.so ProjectOutput 1 True True ================================================ FILE: FunctionsLib/gpt_function_owm.dpr ================================================ library gpt_function_owm; uses System.SysUtils, ChatGPT.Functions.External.Intf in '..\ChatGPT.Functions.External.Intf.pas', OWM.API in '..\OWM_API\OWM.API.pas', OWM.Classes in '..\OWM_API\OWM.Classes.pas', func_weather in 'func_weather.pas'; function gptfunctions: TArray; begin Result := [TChatFunctionWeather.Create]; end; exports gptfunctions; begin end. ================================================ FILE: FunctionsLib/gpt_function_owm.dproj ================================================  {457F1337-2798-49A4-AA4E-15829CD7ABC9} 20.4 None True Debug Linux64 131 Library gpt_function_owm.dpr true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Base true true Cfg_1 true true true Base true .\$(Platform)\$(Config) .\$(Platform)\$(Config) false false false false false true System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) gpt_function_owm 1049 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug $(MSBuildProjectName) CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true DataSnapServer;fmx;emshosting;DbxCommonDriver;bindengine;FireDACCommonODBC;emsclient;FireDACCommonDriver;IndyProtocols;Skia.Package.RTL;dbxcds;emsedge;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;dbexpress;FireDACInfxDriver;inet;DataSnapCommon;dbrtl;FireDACOracleDriver;Skia.Package.FMX;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;FireDACMongoDBDriver;IndySystem;RadiantShapesFmx;FireDACTDataDriver;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;dsnapxml;DataSnapClient;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;xmlrtl;dsnap;CloudService;FireDACDb2Driver;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface Debug vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;HGMComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;HGMLineStorage;FireDACSqliteDriver;DbxClientDriver;FmxTrayIcon;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FMXfrx28;FireDACInfxDriver;CEF4DelphiVCLRTL;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;TGC_API;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;AbbreviaVCLD;DataSnapIndy10ServerTransport;CEF4DelphiFMXRTL;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;PngComponentsD;RvXmlFMXD11;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;DelphiDiagPlugin;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;RvHtmlFMXD11;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ChatGptWizard;FMXfrxDB28;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;VKComponents;RVPkgFMXD11;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;mbColorLibDXTokyo;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true (None) 1033 none D:\Projects\ChatGPT\Win32\Debug\funcs\ vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;SVGIconImageListFMX;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;CEF4DelphiVCLRTL;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;SVGIconPackage;AbbreviaVCLD;DataSnapIndy10ServerTransport;CEF4DelphiFMXRTL;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FMXPAN100;IndySystem;PngComponentsD;RadiantShapesFmx;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug true 1033 DEBUG;$(DCC_Define) true false true true true true true false true 1033 (None) none false RELEASE;$(DCC_Define) 0 0 MainSource Base Cfg_1 Base Cfg_2 Base Delphi.Personality.12 Application gpt_function_owm.dpr Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components true true true 1 Contents\MacOS 1 0 res\xml 1 res\xml 1 library\lib\armeabi 1 library\lib\armeabi 1 library\lib\armeabi-v7a 1 library\lib\mips 1 library\lib\mips 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 library\lib\armeabi-v7a 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v21 1 res\drawable-anydpi-v21 1 res\values 1 res\values 1 res\values-v21 1 res\values-v21 1 res\values-v31 1 res\values-v31 1 res\values-v35 1 res\values-v35 1 res\drawable-anydpi-v26 1 res\drawable-anydpi-v26 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable 1 res\drawable-anydpi-v33 1 res\drawable-anydpi-v33 1 res\values 1 res\values 1 res\values-night-v21 1 res\values-night-v21 1 res\drawable 1 res\drawable 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-ldpi 1 res\drawable-ldpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-mdpi 1 res\drawable-mdpi 1 res\drawable-hdpi 1 res\drawable-hdpi 1 res\drawable-xhdpi 1 res\drawable-xhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-xxxhdpi 1 res\drawable-small 1 res\drawable-small 1 res\drawable-normal 1 res\drawable-normal 1 res\drawable-large 1 res\drawable-large 1 res\drawable-xlarge 1 res\drawable-xlarge 1 res\values 1 res\values 1 res\drawable-anydpi-v24 1 res\drawable-anydpi-v24 1 res\drawable 1 res\drawable 1 res\drawable-night-anydpi-v21 1 res\drawable-night-anydpi-v21 1 res\drawable-anydpi-v31 1 res\drawable-anydpi-v31 1 res\drawable-night-anydpi-v31 1 res\drawable-night-anydpi-v31 1 1 Contents\MacOS 1 0 Contents\MacOS 1 .framework Contents\MacOS 1 .framework Contents\MacOS 1 .framework 0 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .dll;.bpl 1 .dylib 1 .dylib 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib Contents\MacOS 1 .dylib 0 .bpl 0 0 0 0 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 Contents\Resources\StartUp\ 0 0 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 Contents 1 Contents 1 Contents 1 Contents\Resources 1 Contents\Resources 1 Contents\Resources 1 library\lib\armeabi-v7a 1 library\lib\arm64-v8a 1 1 1 1 1 Contents\MacOS 1 Contents\MacOS 1 Contents\MacOS 1 0 library\lib\armeabi-v7a 1 1 1 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\ 1 ..\ 1 ..\ 1 1 1 1 ..\$(PROJECTNAME).launchscreen 64 ..\$(PROJECTNAME).launchscreen 64 1 1 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 Assets 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 False False False False True False False True True 12 ================================================ FILE: HGM.FMX.Ani.pas ================================================ unit HGM.FMX.Ani; interface uses FMX.Ani, FMX.Types, System.Classes, System.SysUtils, System.Types; type TAniFreeNotification = class(TInterfacedObject, IFreeNotification) private FProc: TProc; public procedure FreeNotification(AObject: TObject); constructor Create(Proc: TProc); end; TRectAnimation = class(FMX.Ani.TRectAnimation) protected procedure FirstFrame; override; end; { TPositionAnimation } TPositionAnimation = class(TCustomPropertyAnimation) private FStartRect: TPosition; FCurrent: TPosition; FStopRect: TPosition; FStartFromCurrent: Boolean; procedure SetStartRect(const Value: TPosition); procedure SetStopRect(const Value: TPosition); protected procedure ProcessAnimation; override; procedure FirstFrame; override; procedure AssignTo(Dest: TPersistent); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property AnimationType default TAnimationType.in; property AutoReverse default False; property Enabled default False; property Delay; property Duration nodefault; property Interpolation default TInterpolationType.Linear; property Inverse default False; property Loop default False; property OnProcess; property OnFinish; property PropertyName; property StartValue: TPosition read FStartRect write SetStartRect; property StartFromCurrent: Boolean read FStartFromCurrent write FStartFromCurrent default False; property StopValue: TPosition read FStopRect write SetStopRect; property Trigger; property TriggerInverse; end; TAnimatorHelper = class helper for TAnimator class procedure DetachPropertyAnimation(const Target: TFmxObject; const APropertyName: string); class procedure AnimateFloat(const Target: TFmxObject; const APropertyName: string; const NewValue: Single; Update: TNotifyEvent; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); overload; class procedure AnimateRect(const Target: TFmxObject; const APropertyName: string; const NewValue: TRectF; Update: TNotifyEvent; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); overload; class procedure AnimatePosition(const Target: TFmxObject; const APropertyName: string; const NewValue: TPointF; Update: TNotifyEvent; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); overload; class procedure AnimateFloatWithFinish(const Target: TFmxObject; const APropertyName: string; const NewValue: Single; Finish: TProc; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); overload; end; implementation uses System.Rtti, FMX.Utils, System.TypInfo; { TAnimatorHelper } class procedure TAnimatorHelper.AnimateFloat(const Target: TFmxObject; const APropertyName: string; const NewValue: Single; Update: TNotifyEvent; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); var Animation: TFloatAnimation; begin StopPropertyAnimation(Target, APropertyName); with Self do CreateDestroyer; Animation := TFloatAnimation.Create(nil); Animation.Parent := Target; Animation.AnimationType := AType; Animation.Interpolation := AInterpolation; Animation.Duration := Duration; Animation.PropertyName := APropertyName; Animation.StartFromCurrent := True; Animation.StopValue := NewValue; Animation.OnProcess := Update; with Self do FDestroyer.RegisterAnimation(Animation); Animation.Start; end; class procedure TAnimatorHelper.AnimateFloatWithFinish(const Target: TFmxObject; const APropertyName: string; const NewValue: Single; Finish: TProc; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.in; AInterpolation: TInterpolationType = TInterpolationType.Linear); var Animation: TFloatAnimation; begin StopPropertyAnimation(Target, APropertyName); with Self do CreateDestroyer; Animation := TFloatAnimation.Create(nil); Animation.Parent := Target; Animation.AnimationType := AType; Animation.Interpolation := AInterpolation; Animation.Duration := Duration; Animation.PropertyName := APropertyName; Animation.StartFromCurrent := True; Animation.StopValue := NewValue; Animation.AddFreeNotify(TAniFreeNotification.Create(Finish)); with Self do FDestroyer.RegisterAnimation(Animation); Animation.Start; end; class procedure TAnimatorHelper.AnimatePosition(const Target: TFmxObject; const APropertyName: string; const NewValue: TPointF; Update: TNotifyEvent; Duration: Single; AType: TAnimationType; AInterpolation: TInterpolationType); var Animation: TPositionAnimation; begin StopPropertyAnimation(Target, APropertyName); with Self do CreateDestroyer; Animation := TPositionAnimation.Create(nil); Animation.Parent := Target; Animation.AnimationType := AType; Animation.Interpolation := AInterpolation; Animation.Duration := Duration; Animation.PropertyName := APropertyName; Animation.StartFromCurrent := True; Animation.StopValue.Point := NewValue; Animation.OnProcess := Update; with Self do FDestroyer.RegisterAnimation(Animation); Animation.Start; end; class procedure TAnimatorHelper.AnimateRect(const Target: TFmxObject; const APropertyName: string; const NewValue: TRectF; Update: TNotifyEvent; Duration: Single; AType: TAnimationType; AInterpolation: TInterpolationType); var Animation: TRectAnimation; begin StopPropertyAnimation(Target, APropertyName); with Self do CreateDestroyer; Animation := TRectAnimation.Create(nil); Animation.Parent := Target; Animation.AnimationType := AType; Animation.Interpolation := AInterpolation; Animation.Duration := Duration; Animation.PropertyName := APropertyName; Animation.StartFromCurrent := True; Animation.StopValue.Rect := NewValue; Animation.OnProcess := Update; with Self do FDestroyer.RegisterAnimation(Animation); Animation.Start; end; class procedure TAnimatorHelper.DetachPropertyAnimation(const Target: TFmxObject; const APropertyName: string); var I: Integer; begin I := Target.ChildrenCount - 1; while I >= 0 do begin if (Target.Children[I] is TCustomPropertyAnimation) and (CompareText(TCustomPropertyAnimation(Target.Children[I]).PropertyName, APropertyName) = 0) then TFloatAnimation(Target.Children[I]).StopAtCurrent; if I > Target.ChildrenCount then I := Target.ChildrenCount; Dec(I); end; end; { TAniFreeNotification } constructor TAniFreeNotification.Create(Proc: TProc); begin inherited Create; FProc := Proc; end; procedure TAniFreeNotification.FreeNotification(AObject: TObject); begin if Assigned(FProc) then FProc; Free; end; { TRectAnimation } procedure TRectAnimation.FirstFrame; var T: TRttiType; P: TRttiProperty; begin if StartFromCurrent then begin T := SharedContext.GetType(FInstance.ClassInfo); if T <> nil then begin P := T.GetProperty(FPath); if (P <> nil) and (P.PropertyType.TypeKind = tkClass) then StartValue.Rect := TBounds(P.GetValue(FInstance).AsObject).Rect; end; end; end; { TPositionAnimation } procedure TPositionAnimation.AssignTo(Dest: TPersistent); var DestAnimation: TPositionAnimation; begin if Dest is TPositionAnimation then begin DestAnimation := TPositionAnimation(Dest); DestAnimation.StartValue := StartValue; DestAnimation.StopValue := StopValue; DestAnimation.StartFromCurrent := StartFromCurrent; end; inherited; end; constructor TPositionAnimation.Create(AOwner: TComponent); begin inherited; Duration := 0.2; FStartRect := TPosition.Create(TPointF.Zero); FStopRect := TPosition.Create(TPointF.Zero); FCurrent := TPosition.Create(TPointF.Zero); end; destructor TPositionAnimation.Destroy; begin FreeAndNil(FCurrent); FreeAndNil(FStartRect); FreeAndNil(FStopRect); inherited; end; procedure TPositionAnimation.FirstFrame; var T: TRttiType; P: TRttiProperty; begin if StartFromCurrent then begin T := SharedContext.GetType(FInstance.ClassInfo); if T <> nil then begin P := T.GetProperty(FPath); if (P <> nil) and (P.PropertyType.TypeKind = tkClass) then StartValue.Point := TPosition(P.GetValue(FInstance).AsObject).Point; end; end; end; procedure TPositionAnimation.ProcessAnimation; begin if FInstance <> nil then begin { calc value } FCurrent.X := InterpolateSingle(FStartRect.X, FStopRect.X, NormalizedTime); FCurrent.Y := InterpolateSingle(FStartRect.Y, FStopRect.Y, NormalizedTime); if (FRttiProperty <> nil) and FRttiProperty.PropertyType.IsInstance then TBounds(FRttiProperty.GetValue(FInstance).AsObject).Assign(FCurrent); end; end; procedure TPositionAnimation.SetStartRect(const Value: TPosition); begin FStartRect.Assign(Value); end; procedure TPositionAnimation.SetStopRect(const Value: TPosition); begin FStopRect.Assign(Value); end; end. ================================================ FILE: HGM.FMX.Image.pas ================================================ unit HGM.FMX.Image; interface uses System.Classes, System.Types, System.SysUtils, FMX.Forms, FMX.Graphics, FMX.Objects, System.Threading, System.Generics.Collections, System.Net.HttpClient; type TCallbackObject = record Owner: TComponent; Bitmap: TBitmap; Url: string; Task: ITask; OnDone: TProc; procedure Done(const Success: Boolean); end; TObjectOwner = class(TComponent) procedure Notification(AComponent: TComponent; Operation: TOperation); override; end; TBitmapHelper = class helper for TBitmap private class var Pool: TThreadPool; FCallbackList: TThreadList; FObjectOwner: TComponent; FClient: THTTPClient; FCachePath: string; class procedure AddCallback(Callback: TCallbackObject); class procedure Ready(const Url: string; Stream: TStream); class function Get(const URL: string): TMemoryStream; static; class function GetClient: THTTPClient; static; class procedure SetCachePath(const Value: string); static; public class procedure RemoveCallback(const AOwner: TComponent); procedure LoadFromUrl(const Url: string; UseCache: Boolean = True); procedure LoadFromUrlAsync(AOwner: TComponent; const Url: string; Cache: Boolean = True; OnDone: TProc = nil; SyncAssign: Boolean = True); overload; procedure LoadFromResource(ResName: string); overload; class function UrlToCacheName(const Url: string): string; procedure LoadFromResource(Instanse: NativeUInt; ResName: string); overload; procedure SaveToStream(Stream: TStream; const Ext: string); overload; procedure SaveToFile(const AFileName: string; const Ext: string); overload; class procedure AddCache(const Url: string; Stream: TMemoryStream); class function FindCached(const Url: string; out Stream: TMemoryStream): Boolean; class function CreateFromUrl(const Url: string; UseCache: Boolean = True): TBitmap; class function CreateFromResource(ResName: string; Url: string = ''): TBitmap; class property Client: THTTPClient read GetClient; class property CachePath: string read FCachePath write SetCachePath; end; implementation uses FMX.Surfaces, FMX.Types, FMX.Consts, System.Hash, System.IOUtils; { TBitmapHelper } class procedure TBitmapHelper.AddCallback(Callback: TCallbackObject); begin Callback.Owner.FreeNotification(FObjectOwner); FCallbackList.Add(Callback); end; class function TBitmapHelper.CreateFromResource(ResName, Url: string): TBitmap; begin Result := TBitmap.Create; Result.LoadFromResource(ResName); end; class function TBitmapHelper.CreateFromUrl(const Url: string; UseCache: Boolean): TBitmap; begin Result := TBitmap.Create; Result.LoadFromUrl(Url, False); end; procedure TBitmapHelper.LoadFromResource(ResName: string); begin LoadFromResource(HInstance, ResName); end; procedure TBitmapHelper.LoadFromResource(Instanse: NativeUInt; ResName: string); var Mem: TResourceStream; begin Mem := TResourceStream.Create(Instanse, ResName, RT_RCDATA); try Self.LoadFromStream(Mem); finally Mem.Free; end; end; procedure TBitmapHelper.LoadFromUrl(const Url: string; UseCache: Boolean); var Mem: TMemoryStream; begin Mem := Get(Url); try Self.LoadFromStream(Mem); finally Mem.Free; end; end; class function TBitmapHelper.Get(const URL: string): TMemoryStream; begin if URL.IsEmpty then raise Exception.Create('Empty URL'); Result := TMemoryStream.Create; try if (GetClient.Get(URL, Result).StatusCode = 200) and (Result.Size > 0) then Result.Position := 0 else begin Result.Free; Result := nil; end; except Result.Free; Result := nil; end; end; class function TBitmapHelper.GetClient: THTTPClient; begin if not Assigned(FClient) then begin FClient := THTTPClient.Create; FClient.HandleRedirects := True; end; Result := FClient; end; class function TBitmapHelper.FindCached(const Url: string; out Stream: TMemoryStream): Boolean; begin Result := False; Stream := nil; var FileName := TPath.Combine(FCachePath, UrlToCacheName(Url)); if TFile.Exists(FileName) then try Stream := TMemoryStream.Create; Stream.LoadFromFile(FileName); Result := True; except Stream.Free; Stream := nil; end; end; class procedure TBitmapHelper.AddCache(const Url: string; Stream: TMemoryStream); begin var FileName := TPath.Combine(FCachePath, UrlToCacheName(Url)); try if TFile.Exists(FileName) then TFile.Delete(FileName); except Exit; end; try Stream.SaveToFile(FileName); except // end; end; procedure TBitmapHelper.LoadFromUrlAsync(AOwner: TComponent; const Url: string; Cache: Boolean; OnDone: TProc; SyncAssign: Boolean); begin if AOwner = nil then raise Exception.Create('You must specify an owner (responsible) who will ensure that the Bitmap is not destroyed before the owner'); var Callback: TCallbackObject; Callback.Owner := AOwner; Callback.Bitmap := Self; Callback.Url := Url; Callback.OnDone := OnDone; Callback.Task := TTask.Run( procedure begin try var Mem: TMemoryStream; if not FindCached(Url, Mem) then begin Mem := Get(Url); if Cache and Assigned(Mem) then AddCache(Url, Mem); end; if SyncAssign then TThread.ForceQueue(nil, procedure begin Ready(Url, Mem); end) else Ready(Url, Mem); except if SyncAssign then TThread.ForceQueue(nil, procedure begin Ready(Url, nil); end) else Ready(Url, nil); end; end, Pool); AddCallback(Callback); end; class procedure TBitmapHelper.Ready(const Url: string; Stream: TStream); begin try var List := FCallbackList.LockList; try for var i := List.Count - 1 downto 0 do begin var Item := List[i]; if Item.Url <> Url then Continue; var Success: Boolean := False; try if Assigned(Stream) then try Stream.Position := 0; Item.Bitmap.LoadFromStream(Stream); Success := True; except // end else Item.Bitmap.Assign(nil); finally Item.Done(Success); end; List.Delete(i); end; finally FCallbackList.UnlockList; end; finally Stream.Free; end; end; class procedure TBitmapHelper.RemoveCallback(const AOwner: TComponent); begin var List := FCallbackList.LockList; try for var i := List.Count - 1 downto 0 do if List[i].Owner = AOwner then begin List[i].Task.Cancel; List.Delete(i); end; finally FCallbackList.UnlockList; end; end; procedure TBitmapHelper.SaveToFile(const AFileName, Ext: string); var Stream: TFileStream; begin Stream := TFileStream.Create(AFileName, fmCreate); try SaveToStream(Stream, Ext); finally Stream.Free; end; end; procedure TBitmapHelper.SaveToStream(Stream: TStream; const Ext: string); var Surf: TBitmapSurface; begin TMonitor.Enter(Self); try Surf := TBitmapSurface.Create; try Surf.Assign(Self); if not TBitmapCodecManager.SaveToStream(Stream, Surf, Ext) then raise EBitmapSavingFailed.Create(SBitmapSavingFailed); finally Surf.Free; end; finally TMonitor.Exit(Self); end; end; class procedure TBitmapHelper.SetCachePath(const Value: string); begin FCachePath := Value; end; class function TBitmapHelper.UrlToCacheName(const Url: string): string; begin Result := THashMD5.GetHashString(Url); end; { TObjectOwner } procedure TObjectOwner.Notification(AComponent: TComponent; Operation: TOperation); begin inherited; if Operation <> TOperation.opRemove then Exit; var List := TBitmap.FCallbackList.LockList; try for var i := List.Count - 1 downto 0 do if List[i].Owner = AComponent then begin List[i].Task.Cancel; List.Delete(i); end; finally TBitmap.FCallbackList.UnlockList; end; end; { TCallbackObject } procedure TCallbackObject.Done(const Success: Boolean); begin if Assigned(OnDone) then try OnDone(Success); except // end; end; initialization TBitmap.Pool := TThreadPool.Create; TBitmap.FCallbackList := TThreadList.Create; TBitmap.FObjectOwner := TObjectOwner.Create(nil); TBitmap.FClient := nil; finalization TBitmap.Pool.Free; TBitmap.FCallbackList.Free; TBitmap.FObjectOwner.Free; TBitmap.FClient.Free; end. ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2023 HemulGM Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: LaunchScreen.TemplateiOS/Assets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ <%AppIconImages%> ], "info" : { "version" : 1, "author" : "RAD Studio" } } ================================================ FILE: LaunchScreen.TemplateiOS/Assets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "RAD Studio" } } ================================================ FILE: LaunchScreen.TemplateiOS/Assets/LaunchScreenBackgroundColor.colorset/Contents.json ================================================ { "colors" : [ <%LaunchScreenBackgroundColors%> ], "info" : { "version" : 1, "author" : "RAD Studio" } } ================================================ FILE: LaunchScreen.TemplateiOS/Assets/LaunchScreenImage.imageset/Contents.json ================================================ { "images" : [ <%LaunchScreenImages%> ], "info" : { "version" : 1, "author" : "RAD Studio" } } ================================================ FILE: LaunchScreen.TemplateiOS/LaunchScreen.storyboard ================================================ ================================================ FILE: README.md ================================================

ChatGPT

ChatGPT

ChatGPT Desktop Application (Windows, Mac, iOS, Android and Linux)

![Preview](https://github.com/HemulGM/ChatGPT/blob/main/preview.png?raw=true) ### This is NOT a web page, this is a native application with its own interface! ## ⚒️ Builds |Platform|Available|| |--------|---------|--| |

windows Windows 32

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

windows Windows 64

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

android Android 32

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

android Android 64

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

linux Linux 64

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

mac MacOS arm64

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

mac MacOS Intel64

|✔|[Download](https://github.com/HemulGM/ChatGPT/releases/latest)| |

ios iOS

|❌| | ## ⚡ Features - Access to gpt-3 and gpt-4 - Image generation with DALL-E - Sound recognition and use of this context with GPT - Separate settings for each chat - SVG display - Ability to edit chat - All model settings - Custom headers for third party APIs - Send message as assistant, user or system - Doesn't require a VPN (*Now required!*) - GPT functions (external load from "funcs" folder) - Syntax highlighting (pascal, python, json, sql, markdown) ## 🙌 List of planned features - Display of mathematical formulas - Support MarkDown - Syntax highlighting for Linux - Additional functions OpenAI (such as: text correction, customizing your model via Fine-tunes, quick commands) ## Dependencies ❗ Build requires Delphi 11.3+ Skia - https://github.com/skia4delphi/skia4delphi SVGImageList - https://github.com/EtheaDev/SVGIconImageList And some submodules

Delphi

Made with :heart: on Delphi
================================================ FILE: Res/chatgptfmx/res/mipmap-anydpi-v26/chatgptfmx.xml ================================================