From 8aadf2c5e9c7d3a925896138e6f2eeb3a2a8c7ef Mon Sep 17 00:00:00 2001 From: Liam Allan Date: Tue, 20 Feb 2018 17:50:41 +0000 Subject: [PATCH] Diff, IFS Browser create fix, remember open info --- ILEditor/Classes/DiffMatchPatch.cs | 15 +- ILEditor/Editor.Designer.cs | 14 +- ILEditor/Editor.cs | 4 + ILEditor/Forms/OpenSource.cs | 9 + ILEditor/Forms/SaveAs.Designer.cs | 91 +-- ILEditor/Forms/SaveAs.cs | 38 +- .../Forms/SourceCompareSelect.Designer.cs | 124 +++ ILEditor/Forms/SourceCompareSelect.cs | 93 +++ ILEditor/Forms/SourceCompareSelect.resx | 724 ++++++++++++++++++ ILEditor/Forms/SourceSelectBox.Designer.cs | 186 +++++ ILEditor/Forms/SourceSelectBox.cs | 75 ++ ILEditor/Forms/SourceSelectBox.resx | 120 +++ ILEditor/ILEditor.csproj | 31 +- ILEditor/UserTools/DiffView.Designer.cs | 97 +++ ILEditor/UserTools/DiffView.cs | 82 ++ ILEditor/UserTools/DiffView.resx | 120 +++ ILEditor/UserTools/IFSBrowser.cs | 2 +- ILEditor/UserTools/SourceEditor.cs | 66 +- 18 files changed, 1756 insertions(+), 135 deletions(-) create mode 100644 ILEditor/Forms/SourceCompareSelect.Designer.cs create mode 100644 ILEditor/Forms/SourceCompareSelect.cs create mode 100644 ILEditor/Forms/SourceCompareSelect.resx create mode 100644 ILEditor/Forms/SourceSelectBox.Designer.cs create mode 100644 ILEditor/Forms/SourceSelectBox.cs create mode 100644 ILEditor/Forms/SourceSelectBox.resx create mode 100644 ILEditor/UserTools/DiffView.Designer.cs create mode 100644 ILEditor/UserTools/DiffView.cs create mode 100644 ILEditor/UserTools/DiffView.resx diff --git a/ILEditor/Classes/DiffMatchPatch.cs b/ILEditor/Classes/DiffMatchPatch.cs index 3e633e6..8b52b99 100644 --- a/ILEditor/Classes/DiffMatchPatch.cs +++ b/ILEditor/Classes/DiffMatchPatch.cs @@ -25,6 +25,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Web; +using System.Windows.Forms; namespace DiffMatchPatch { @@ -1548,10 +1549,14 @@ public int diff_xIndex(List diffs, int loc) /** * Convert a Diff list into a pretty HTML report. * @param diffs List of Diff objects. + * @param 0 = combined, 1 = only old, 2 = only new * @return HTML representation. */ - public string diff_prettyHtml(List diffs) + public string diff_prettyHtml(List diffs, int oldnew = 0) { + if (oldnew < 0 || oldnew > 2) + oldnew = 0; + StringBuilder html = new StringBuilder(); foreach (Diff aDiff in diffs) @@ -1562,12 +1567,12 @@ public string diff_prettyHtml(List diffs) switch (aDiff.operation) { case Operation.INSERT: - html.Append("").Append(text) - .Append(""); + if (oldnew == 0 || oldnew == 2) + html.Append("").Append(text).Append(""); break; case Operation.DELETE: - html.Append("").Append(text) - .Append(""); + if (oldnew == 0 || oldnew == 1) + html.Append("").Append(text).Append(""); break; case Operation.EQUAL: html.Append("").Append(text).Append(""); diff --git a/ILEditor/Editor.Designer.cs b/ILEditor/Editor.Designer.cs index c31f324..a7805c5 100644 --- a/ILEditor/Editor.Designer.cs +++ b/ILEditor/Editor.Designer.cs @@ -86,6 +86,7 @@ private void InitializeComponent() this.undoButton = new System.Windows.Forms.ToolStripButton(); this.redoButton = new System.Windows.Forms.ToolStripButton(); this.commentButton = new System.Windows.Forms.ToolStripButton(); + this.sourceDiffToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.toolStripContainer1.ContentPanel.SuspendLayout(); @@ -271,7 +272,8 @@ private void InitializeComponent() this.localCopiesToolStripMenuItem, this.languageToolsToolStripMenuItem, this.quickCommentToolStripMenuItem, - this.duplicateLineToolStripMenuItem}); + this.duplicateLineToolStripMenuItem, + this.sourceDiffToolStripMenuItem}); this.sourceToolStripMenuItem.Name = "sourceToolStripMenuItem"; this.sourceToolStripMenuItem.Size = new System.Drawing.Size(55, 20); this.sourceToolStripMenuItem.Text = "Source"; @@ -549,7 +551,7 @@ private void InitializeComponent() this.commentButton}); this.toolStrip2.Location = new System.Drawing.Point(142, 0); this.toolStrip2.Name = "toolStrip2"; - this.toolStrip2.Size = new System.Drawing.Size(164, 25); + this.toolStrip2.Size = new System.Drawing.Size(133, 25); this.toolStrip2.TabIndex = 1; // // saveSource @@ -608,6 +610,13 @@ private void InitializeComponent() this.commentButton.Text = "Comment Selected"; this.commentButton.Click += new System.EventHandler(this.commentButton_Click); // + // sourceDiffToolStripMenuItem + // + this.sourceDiffToolStripMenuItem.Name = "sourceDiffToolStripMenuItem"; + this.sourceDiffToolStripMenuItem.Size = new System.Drawing.Size(223, 22); + this.sourceDiffToolStripMenuItem.Text = "Source Diff"; + this.sourceDiffToolStripMenuItem.Click += new System.EventHandler(this.sourceDiffToolStripMenuItem_Click); + // // Editor // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -698,5 +707,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton redoButton; private System.Windows.Forms.ToolStripButton compileButton; private System.Windows.Forms.ToolStripButton commentButton; + private System.Windows.Forms.ToolStripMenuItem sourceDiffToolStripMenuItem; } } \ No newline at end of file diff --git a/ILEditor/Editor.cs b/ILEditor/Editor.cs index 9631f1c..357c321 100644 --- a/ILEditor/Editor.cs +++ b/ILEditor/Editor.cs @@ -29,7 +29,9 @@ public partial class Editor : Form { "CLP", Language.CL }, { "CMD", Language.CL }, { "CPP", Language.CPP }, + { "SQLCPP", Language.CPP }, { "C", Language.CPP }, + { "SQLC", Language.CPP }, { "SQL", Language.SQL }, { "CBL", Language.COBOL }, { "COBOL", Language.COBOL }, @@ -387,6 +389,8 @@ private void start5250SessionToolStripMenuItem_Click(object sender, EventArgs e) } private void quickMemberSearchToolStripMenuItem_Click(object sender, EventArgs e) => new QuickMemberSearch().Show(); + + private void sourceDiffToolStripMenuItem_Click(object sender, EventArgs e) => new SourceCompareSelect().ShowDialog(); #endregion #region Source dropdown diff --git a/ILEditor/Forms/OpenSource.cs b/ILEditor/Forms/OpenSource.cs index 458d3f0..f20b431 100644 --- a/ILEditor/Forms/OpenSource.cs +++ b/ILEditor/Forms/OpenSource.cs @@ -15,12 +15,18 @@ namespace ILEditor.Forms { public partial class OpenSource : Form { + public static string Library = "", SPF = "", Stmf = ""; + public OpenSource(int tab = 0) { InitializeComponent(); type.Items.AddRange(Editor.LangTypes.Keys.ToArray()); tabs.SelectedIndex = tab; + + lib.Text = Library; + spf.Text = SPF; + stmfPath.Text = Stmf; } private void button1_Click(object sender, EventArgs e) @@ -40,6 +46,8 @@ private void button1_Click(object sender, EventArgs e) if (isValid) { Editor.OpenSource(new RemoteSource("", lib.Text, spf.Text, mbr.Text, type.Text, true)); + Library = lib.Text; + SPF = spf.Text; this.Close(); } else @@ -51,6 +59,7 @@ private void button1_Click(object sender, EventArgs e) if (IBMi.FileExists(stmfPath.Text)) { Editor.OpenSource(new RemoteSource("", stmfPath.Text)); + Stmf = stmfPath.Text; this.Close(); } else diff --git a/ILEditor/Forms/SaveAs.Designer.cs b/ILEditor/Forms/SaveAs.Designer.cs index 76980b8..ff1c5fd 100644 --- a/ILEditor/Forms/SaveAs.Designer.cs +++ b/ILEditor/Forms/SaveAs.Designer.cs @@ -29,83 +29,24 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.save = new System.Windows.Forms.Button(); - this.mbr = new System.Windows.Forms.TextBox(); - this.spf = new System.Windows.Forms.TextBox(); - this.lib = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); this.cancel = new System.Windows.Forms.Button(); + this.sourceSelectBox = new ILEditor.Forms.SourceSelectBox(); this.SuspendLayout(); // // save // - this.save.Location = new System.Drawing.Point(159, 106); + this.save.Location = new System.Drawing.Point(215, 138); this.save.Name = "save"; - this.save.Size = new System.Drawing.Size(100, 23); + this.save.Size = new System.Drawing.Size(100, 21); this.save.TabIndex = 22; this.save.Text = "Save"; this.save.UseVisualStyleBackColor = true; this.save.Click += new System.EventHandler(this.save_Click); // - // mbr - // - this.mbr.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.mbr.Location = new System.Drawing.Point(159, 64); - this.mbr.MaxLength = 10; - this.mbr.Name = "mbr"; - this.mbr.Size = new System.Drawing.Size(100, 20); - this.mbr.TabIndex = 20; - // - // spf - // - this.spf.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.spf.Location = new System.Drawing.Point(159, 38); - this.spf.MaxLength = 10; - this.spf.Name = "spf"; - this.spf.Size = new System.Drawing.Size(100, 20); - this.spf.TabIndex = 19; - // - // lib - // - this.lib.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.lib.Location = new System.Drawing.Point(159, 12); - this.lib.MaxLength = 10; - this.lib.Name = "lib"; - this.lib.Size = new System.Drawing.Size(100, 20); - this.lib.TabIndex = 18; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(13, 67); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(76, 13); - this.label3.TabIndex = 17; - this.label3.Text = "Member Name"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(13, 41); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(102, 13); - this.label2.TabIndex = 16; - this.label2.Text = "Source-Physical File"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(13, 15); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 13); - this.label1.TabIndex = 15; - this.label1.Text = "Library"; - // // cancel // this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.cancel.Location = new System.Drawing.Point(16, 106); + this.cancel.Location = new System.Drawing.Point(12, 138); this.cancel.Name = "cancel"; this.cancel.Size = new System.Drawing.Size(100, 21); this.cancel.TabIndex = 23; @@ -113,39 +54,35 @@ private void InitializeComponent() this.cancel.UseVisualStyleBackColor = true; this.cancel.Click += new System.EventHandler(this.cancel_Click); // + // sourceSelectBox + // + this.sourceSelectBox.Location = new System.Drawing.Point(12, 9); + this.sourceSelectBox.Name = "sourceSelectBox"; + this.sourceSelectBox.Size = new System.Drawing.Size(303, 123); + this.sourceSelectBox.TabIndex = 24; + // // SaveAs // this.AcceptButton = this.save; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.cancel; - this.ClientSize = new System.Drawing.Size(276, 140); + this.ClientSize = new System.Drawing.Size(325, 171); + this.Controls.Add(this.sourceSelectBox); this.Controls.Add(this.cancel); this.Controls.Add(this.save); - this.Controls.Add(this.mbr); - this.Controls.Add(this.spf); - this.Controls.Add(this.lib); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "SaveAs"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Save Member As"; this.ResumeLayout(false); - this.PerformLayout(); } #endregion private System.Windows.Forms.Button save; - private System.Windows.Forms.TextBox mbr; - private System.Windows.Forms.TextBox spf; - private System.Windows.Forms.TextBox lib; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; private System.Windows.Forms.Button cancel; + private SourceSelectBox sourceSelectBox; } } \ No newline at end of file diff --git a/ILEditor/Forms/SaveAs.cs b/ILEditor/Forms/SaveAs.cs index 0397514..268f4ec 100644 --- a/ILEditor/Forms/SaveAs.cs +++ b/ILEditor/Forms/SaveAs.cs @@ -14,33 +14,31 @@ namespace ILEditor.Forms public partial class SaveAs : Form { public bool Success = false; - public string Lib = ""; - public string Spf = ""; - public string Mbr = ""; - public SaveAs() + public SourceSelectBox SourceInfo() => sourceSelectBox; + public SaveAs(RemoteSource MemberInfo = null) { InitializeComponent(); + + if (MemberInfo != null) + { + switch (MemberInfo.GetFS()) + { + case FileSystem.IFS: + sourceSelectBox.SetSource(MemberInfo.GetRemoteFile()); + sourceSelectBox.SetSource("", "", MemberInfo.GetName()); + break; + case FileSystem.QSYS: + sourceSelectBox.SetSource("", MemberInfo.GetObject(), MemberInfo.GetName()); + break; + } + } } private void save_Click(object sender, EventArgs e) { - Boolean valid = true; - this.Lib = lib.Text.Trim(); - this.Spf = spf.Text.Trim(); - this.Mbr = mbr.Text.Trim(); - - if (!IBMiUtils.IsValueObjectName(this.Lib)) - valid = false; - - if (!IBMiUtils.IsValueObjectName(this.Spf)) - valid = false; - - if (!IBMiUtils.IsValueObjectName(this.Mbr)) - valid = false; - - if (!valid) + if (!sourceSelectBox.isValid()) { - MessageBox.Show("Member information not valid."); + MessageBox.Show("Source information not valid."); } else { diff --git a/ILEditor/Forms/SourceCompareSelect.Designer.cs b/ILEditor/Forms/SourceCompareSelect.Designer.cs new file mode 100644 index 0000000..d98cb2c --- /dev/null +++ b/ILEditor/Forms/SourceCompareSelect.Designer.cs @@ -0,0 +1,124 @@ +namespace ILEditor.Forms +{ + partial class SourceCompareSelect + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SourceCompareSelect)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.newSourceBox = new ILEditor.Forms.SourceSelectBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.oldSourceBox = new ILEditor.Forms.SourceSelectBox(); + this.compareButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.newSourceBox); + this.groupBox1.Location = new System.Drawing.Point(12, 166); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(317, 148); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "New source"; + // + // newSourceBox + // + this.newSourceBox.Location = new System.Drawing.Point(6, 19); + this.newSourceBox.Name = "newSourceBox"; + this.newSourceBox.Size = new System.Drawing.Size(303, 123); + this.newSourceBox.TabIndex = 0; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.oldSourceBox); + this.groupBox2.Location = new System.Drawing.Point(12, 12); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(317, 148); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Old source"; + // + // oldSourceBox + // + this.oldSourceBox.Location = new System.Drawing.Point(6, 19); + this.oldSourceBox.Name = "oldSourceBox"; + this.oldSourceBox.Size = new System.Drawing.Size(303, 123); + this.oldSourceBox.TabIndex = 0; + // + // compareButton + // + this.compareButton.Location = new System.Drawing.Point(254, 320); + this.compareButton.Name = "compareButton"; + this.compareButton.Size = new System.Drawing.Size(75, 23); + this.compareButton.TabIndex = 3; + this.compareButton.Text = "Compare"; + this.compareButton.UseVisualStyleBackColor = true; + this.compareButton.Click += new System.EventHandler(this.compareButton_Click); + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(12, 320); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 4; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // SourceCompareSelect + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(341, 353); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.compareButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "SourceCompareSelect"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Source Compare Select"; + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.GroupBox groupBox1; + private SourceSelectBox newSourceBox; + private System.Windows.Forms.GroupBox groupBox2; + private SourceSelectBox oldSourceBox; + private System.Windows.Forms.Button compareButton; + private System.Windows.Forms.Button cancelButton; + } +} \ No newline at end of file diff --git a/ILEditor/Forms/SourceCompareSelect.cs b/ILEditor/Forms/SourceCompareSelect.cs new file mode 100644 index 0000000..4757f8a --- /dev/null +++ b/ILEditor/Forms/SourceCompareSelect.cs @@ -0,0 +1,93 @@ +using ILEditor.Classes; +using ILEditor.UserTools; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ILEditor.Forms +{ + public partial class SourceCompareSelect : Form + { + public SourceCompareSelect() + { + InitializeComponent(); + + if (Editor.LastEditing != null) + { + RemoteSource src = Editor.LastEditing.Tag as RemoteSource; + + if (src != null) + { + switch (src.GetFS()) + { + case FileSystem.QSYS: + newSourceBox.SetSource(src.GetLibrary(), src.GetObject(), src.GetName()); + oldSourceBox.SetSource("", src.GetObject(), src.GetName()); + break; + case FileSystem.IFS: + newSourceBox.SetSource(src.GetRemoteFile()); + newSourceBox.SetTab(src.GetFS()); + break; + } + } + } + } + + private void compareButton_Click(object sender, EventArgs e) + { + if (!newSourceBox.isValid()) + { + MessageBox.Show("New source information not valid."); + return; + } + + if (!oldSourceBox.isValid()) + { + MessageBox.Show("Old source information not valid."); + return; + } + + string NewFile = "", OldFile = ""; + + switch (newSourceBox.GetFS()) + { + case FileSystem.IFS: + NewFile = IBMiUtils.DownloadFile(newSourceBox.GetIFSPath()); + break; + case Classes.FileSystem.QSYS: + NewFile = IBMiUtils.DownloadMember(newSourceBox.GetLibrary(), newSourceBox.GetSPF(), newSourceBox.GetMember()); + break; + } + + switch (oldSourceBox.GetFS()) + { + case FileSystem.IFS: + OldFile = IBMiUtils.DownloadFile(oldSourceBox.GetIFSPath()); + break; + case Classes.FileSystem.QSYS: + OldFile = IBMiUtils.DownloadMember(oldSourceBox.GetLibrary(), oldSourceBox.GetSPF(), oldSourceBox.GetMember()); + break; + } + + if (NewFile == "" || OldFile == "") + { + MessageBox.Show("Unable to download members."); + return; + } + + Editor.TheEditor.AddTool(new DiffView(NewFile, OldFile)); + this.Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/ILEditor/Forms/SourceCompareSelect.resx b/ILEditor/Forms/SourceCompareSelect.resx new file mode 100644 index 0000000..d9b3c5d --- /dev/null +++ b/ILEditor/Forms/SourceCompareSelect.resx @@ -0,0 +1,724 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + Of8uIDn/LyA6/x4bL/8CEh/9ARYmyAEZLKwBChGuASZG/QJvz/8Cd93/Anje/wB33f8Ad93/AHfd/wB3 + 3f8Ad93/AHfd/wB33f8Ad93/AHfd/wB33f8Ad93/AHfd/wB33f8Ad93/AHfd/wF33f8CeN7/Anfe/wJl + vP8BFifzAQoRtAJcqf8CjP//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK + //8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor+/wFEfvwBAgKMAQAAXQEhPfkCfur/Aor//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Ci///AmzI/wEQHOsBAAA4AQIBgwMDBf8CTpD/Aor//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Chfb/AjFZ/wIBAPcBAgJYAAEBrSIM + E/8aHzf/AHbb/wKK//8Cif//Aon//wKK//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKK + //8Cif//Aon//wKL//8AXKr/JBIf/xkKD/8AAQCAAAEAvj0WJf9YHTT/BEF4/wKJ/f8Cif//Aoj8/wKA + 7P8Cif7/Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon+/wKB7v8CiP3/Aor//wF96P8LIz//ZiE6/ykP + Gf8AAQCSAAEAvDoVI/+GLE//KRsx/wBtyf8CjP//AWzI/wEyXP8Cf+v/Aor//wKJ//8Cif//Aon//wKJ + //8Civ//An3m/wE2Y/8Cd9z/Aov//wBKh/88FSX/hy1R/yYOGP8AAQCQAAEApC0RHP+ML1T/aCE7/wo2 + Y/8Bf+r/CzBX/xkKEP8BU5r/Aov//wKJ//8Cif//Aon//wKJ//8Civ//A02N/xwLEv8GSYf/AHLS/xQZ + LP93J0b/hC1P/xsLEf4AAQB4AAEAdhkKEP2AK03/iy5T/zocM/8AL1X/PBks/2kiPP8MIDn/AXzl/wKK + //8Cif//Aon//wKK//8Addj/GBwz/3EkQP8pITv/ACdH/00aLv+PMFb/cydF/w0GCfQAAQBMAAEBOQYE + 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 + Sv9/Kkr/fypK/38qSv9/Kkr/fypK/38qSv9/Kkr/fypK/38qSv9/Kkr/fypK/38qSv9/Kkr/fypK/4Eq + TP9lIjv/EwcL/wABAOwBAABVAQAAFgEAABgBAgIYAQkP2AEUI9gBFCPZARIf9AERHv8OFSb/Fxgr/xYY + Kv8WGCr/Fhgq/xYYKv8WGCr/Fhgq/xYYKv8WGCr/Fhgq/xYYKv8WGCr/Fhgq/xYYKv8WGCr/Fhgq/xYY + Kv8WGCr/Fhgq/xcYK/8KFCP/AREe/wESIOwBFCPYARIg2AEFB9gBGS3/AmnD/wJ33f8Cd93/Anfd/wF3 + 3f8Bd9z/AXfc/wF33P8Bd9z/AXfc/wF33P8Bd9z/AXfc/wF33P8Bd9z/AXfc/wF33P8Bd9z/AXfc/wF3 + 3P8Bd9z/AXfc/wF33P8Bd9z/AXfc/wF33f8Cd93/Anfc/wJ43v8CVp//AQkP+gEDBdYCTIz/Aov//wKK + //8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK + //8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Ci///AoX0/wEtU/8BAACoAQAAWgEW + KPICddj/Aor//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKL//8CWKL/AQYK2gEA + AC8BAgInAQEA3wE9cf8CiP3/Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Civ//Anvk/wEc + M/8BAAC6AQIDCgECAlABAQD1AQ0X/wJrxv8Ci///Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8BRoD/AQIC/wECAt0BAgIkAQICfAQDBP4cCQ7/AzFa/wKF9/8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Ci///AW/M/wgSIf8aCQ//AQIC8QECAkUAAgKaCQUG/1wfNv8cEBz/AF+v/wKL//8Cif//Aon//wKJ + //8Civ//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aor//wKJ + //8Cif//Aon//wKG9/8AMl3/MhAc/00bL/8BAgL6AQICXwACAaULBQj/dChG/1ccMf8EJUP/AoDt/wKK + //8Cif//Aor//wJ+6v8Cg/P/Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKD + 8v8CgO3/Aor//wKJ//8Ci///AV+v/w0MFP9vJUL/WyA3/wICAvwBAgJqAAIBowoFB/9yJ0T/hi1Q/ycQ + HP8AUpb/Aov//wKJ//8Chfb/ATZk/wJVnP8Ci///Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Civ//AVCU/wFEfP8Cif7/Aor//wJ/6v8AIj7/QBUk/44wVf9YHzX/AQIC/AECAmgAAgKRBgQF/2kk + P/+QMFb/ZSE7/wkcMv8BeeD/Aoz//wJYov8FBgn/Ah01/wJ95/8Civ//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aor//wJ43v8DGCv/BBEe/wJy0v8CjP//AEyM/xcKEf95KUn/jzBW/04bL/8AAgH4AQICVwEC + Am4BAgL8Vx40/48wVv+KLlL/OBMh/wBFf/8Bddn/Bxov/0gYKf8WCRD/AE2N/wKK//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif7/AEF4/ygOGP88FCL/AT5y/wJz1P8DFSb/Uhsv/40vVf+ML1T/OhUj/wAB + AewBAgI6AQICQAABAe46FSP/jC9U/44wVf9zJkT/EhYn/wAkQ/8vER3/iC5S/04aLf8CGCv/Anje/wKK + //8Cif//Aon//wKJ//8Cif//Aov//wFtyv8JEiD/aCI9/30pSv8aFyj/ACNB/yQNF/+DLE7/jS9V/4Qt + T/8gDRT/AAEB0QECAhkBAgIVAAEByRkKEP9/K0z/jS9V/40vVP9IGSv/DQUI/20lQf+PMFb/gStN/yEM + FP8ARH3/Aon//wKJ//8Cif//Aon//wKJ//8Chvj/ADNd/zkSIP+KLlP/jjBV/1UdM/8KBAb/YiE7/44w + Vf+OMFX/bSVB/wkFB/8AAgGcAQICAgECAgABAgKDBAMD/1ogNv+OMFX/jS9V/30qS/9YHjb/ii5T/4wv + VP+OMFX/Xh83/wYUI/8BctP/Aor//wKJ//8Cif//Aov//wFhs/8SDhj/dCdF/40vVf+NL1T/gixO/1Ye + NP+HLVH/jC9U/4wvVP8/Fyb/AAIB+AECAlIBAgIAAQICAAECAjAAAQHlIw4W/4MsTv+NL1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+ILlH/MBAb/wA7bf8CiPz/Aon//wKK//8Cge7/AiZF/0oYKv+NL1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+OMFX/cydF/xAHC/8AAgHEAQICEgECAgABAgIAAQICAgECAowDAwP/TRsu/40v + VP+ML1T/jC9U/4wvVP+ML1T/jC9U/44wVf9tJED/DREf/wFsx/8Ci///Aov//wBTmP8eDRf/fypM/40v + Vf+ML1T/jC9U/4wvVP+ML1T/jS9U/4guUf80Ex//AAIB9wECAlwBAgIAAQICAAAAAAABAgIAAQICIQAC + Ac4NBgn/ZiM9/44wVf+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP9BFST/ATNe/wKH+/8CeeH/BRsx/1se + NP+OMFX/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/Txwv/wQDBP8AAgKnAQICCwECAgAAAAAAAAAAAAEC + AgABAgIAAQICSQABAekWCQ7/ayVA/44wVf+ML1T/jC9U/4wvVP+ML1T/jS9V/3ooSP8XER7/AGS5/wBF + f/8tDxv/hi1Q/4wvVP+ML1T/jC9U/4wvVP+NL1T/jC9U/1gfNf8KBQf/AAIBzgECAicBAgIAAQICAAAA + AAAAAAAAAAAAAAECAgABAgIBAQICYQABAe4UCQ3/YSI6/4svVP+NL1X/jC9U/4wvVP+ML1T/jS9V/1Ib + MP8CGzD/CxIg/2ojP/+OMFX/jC9U/4wvVP+ML1T/jjBV/4cuUf9OHC//CgUH/wACAdkBAgI8AQICAAEC + AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgIDAQICXQABAeQKBQf/Qhgo/3sqSv+NL1X/jjBV/4wv + VP+NL1T/gyxP/yQMFf88FCT/iy9T/4wvVP+NL1T/jjBV/4wvVP9xJ0T/MhIe/wQDBP8AAgHOAQICOwEC + AgABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgIBAQICPgACAcABAgL8FwoP/0ga + K/9xJ0T/hi1Q/4wvVP+PMFb/cSZE/3wqSv+PMFb/jC9U/4MsTv9qJD//PBYk/w8HCv8AAgH2AQICpAEC + AiUBAgIAAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgIAAQICFQEC + AnEAAQHSAQIB+wwGCP8jDRb/OhUj/0sbLf9UHTP/Ux0y/0gaLP81EyD/HQsS/wgEBv8AAQH3AAIBwAEC + AlcBAgIKAQICAAECAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAABAgIAAQICAAECAhoBAgJdAAIBpAABAdQAAQHsAAIB9wACAvoAAgL5AAEB9QABAegAAQHLAAIClQEC + AksBAgIQAQICAAECAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAQICAAECAgABAgIEAQICGwECAjkBAgJSAQICXgECAlwBAgJNAQICMgEC + AhQBAgICAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAP//wAA//wA + AH/4AAAf8AAAD+AAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAAAABgAAAAYAAAAPAAAAD4AAAB+AAAA/wAAAf+AAAP/4AAH//gAH//+AH/ygA + AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAECAgIBAgISAQICMAEC + AlABAgJsAQICfwECAoUBAgKEAQICeQECAmMBAgJFAQICJAECAgoBAgIAAQICAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAECAgEBAgIaAQICUwEC + ApQBAgLHAQIC5gECAvUBAgL8AAIC/wACAv8AAgL/AAIC/gECAvoBAgLxAQIC3QECArcBAgJ+AQICPAEC + Ag0BAgIAAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgICAQICKwEC + AoUBAgLUAQIC+QACAv8AAQH/AAEB/wICAv8GBAX/CwUH/w0GCf8MBgj/CQUH/wUDBP8BAgL/AAEB/wAB + Af8BAgL/AQIC8QECArwBAgJjAQICFgECAgABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIAAQICAAEC + Ah8BAgKFAQIC4gECAv8AAQH/AgIC/w8HCv8oDxj/Qxgo/1kfNv9pJD//cSdE/3UoRv90KEb/byZC/2Qj + PP9SHTH/OhUj/x4ME/8IBQb/AAIB/wACAf8BAgL6AQICyAECAlwBAgILAQICAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC + AgABAgIFAQICUwECAs8BAgL+AAEB/wUEBP8jDhX/UR0w/3UoRv+HLlH/jS9V/44wVf+OMFX/jjBV/40v + Vf+OL1X/jjBV/44wVf+OMFX/jC9U/4MsTv9qJUD/QBgn/xUJDv8BAgL/AAIB/wECAvcBAgKoAQICLAEC + AgABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAQICAAECAhABAgKFAQIC8QACAf8DAwP/Iw4V/10hOP+ELU//jjBV/40vVf+ML1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/40vVP+OMFX/jC9U/3oqSf9IGiv/EggM/wAC + Af8BAgL/AQIC1wECAlEBAgIDAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAECAgABAgIAAQICGAECAqMBAgL8AAEB/w4HCf9LGy3/gixO/44wVf+NL1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/40v + Vf+NL1T/dChF/zITHv8EAwP/AAIB/wECAuwBAgJqAQICBQECAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAQICAAECAgABAgIYAQICrAECAv4AAgH/HQwS/2klPv+ML1T/jS9V/4wv + VP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+ML1T/ji9V/4cuUf9OHC//CwYI/wACAf8BAgLyAQICcAECAgQBAgIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAECAg8BAgKhAQIC/gACAf8mDxf/dylH/44w + Vf+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wv + VP+ML1T/jC9U/4wvVP+ML1T/jC9U/4wvVP+ML1T/jC9U/40vVP+ML1T/XiE4/xAHCv8AAgH/AQIC8AEC + AmIBAgIAAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIAAQICBAECAoIBAgL8AQIC/ygQ + GP99K0r/kDBW/44wVf+OMFX/jjBV/44wVf+OMFX/jjBV/44wVf+OMFX/jjBV/44wVf+OMFX/jjBV/44w + Vf+OMFX/jjBV/44wVf+OMFX/jjBV/44wVf+OMFX/jjBV/44wVf+OMFX/jjBV/44wVf+OMFX/jzBW/2Mj + O/8QCAv/AAIC/wECAuUBAgJCAQICAAECAgAAAAAAAAAAAAAAAAABAgJuAQAAbgEAAG4BAABsAQAAhQEB + AO4BAQD/BgMD/zsUIv9SGzD/UBsv/1AbL/9QGy//UBsv/1AbL/9QGy//UBsv/1AbL/9QGy//UBsv/1Ab + L/9QGy//UBsv/1AbL/9QGy//UBsv/1AbL/9QGy//UBsv/1AbL/9QGy//UBsv/1AbL/9QGy//UBsv/1Ab + L/9QGy//URsv/1EbL/8lDRX/AAEA/wEBAP8BAQDNAQAAcQEAAG0BAABuAQEBbgECAm4BBAX/AQ8a/wER + Hf8BER3/AREd/wERHf8BER3/AREd/wERHf8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQ + HP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQ + HP8AEBz/ABAc/wAQHP8AEBz/ABAc/wAQHf8BER3/AREd/wERHf8BER3/AREd/wERHf8BER7/AQoR/wEC + Av8BBwz/AlSa/wJ43v8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ2 + 2/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ2 + 2/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ22/8Cdtv/Anbb/wJ2 + 3P8Cddj/AS5U/wEAAP8BAAD6AS1R/wKF9P8Ci///Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK + //8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK + //8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK//8Civ//Aor//wKK + //8Civ//Aor//wKM//8CacH/AQ0X/wEBANUBAQGpAQYK/wJap/8Ci///Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aor//wKD8v8BK0//AQAA8QECAloBAgIwAQAA2gEgOv8Cfuj/Aor//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aov//wJXoP8BBQj/AQIBoQECAgkBAgIAAQIBgQED + BP8CTY7/Aor//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Civ//Anri/wEbMv8BAADvAQICOwEC + AgABAgIAAQIChgEBAP8BFij/AnbZ/wKK//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif7/AUR9/wEC + Av8BAgLyAQICPgECAgABAgIMAQICvAECAv8BAQD/AT90/wKI/f8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKL + //8Cbcr/AQ8b/wEBAP8BAgL/AQICcgECAgABAgIlAQIC3gECAv8EAgL/AQ4Z/wJsx/8Ci///Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKF9v8BMVv/AgEA/wMDA/8BAgL/AQICnwECAgIBAgJCAQIC8AICA/8yEx7/DwUH/wEy + W/8Chff/Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aov//wJdrP8ABwv/JA0W/yANFP8AAQH/AQICwAECAg0BAgJbAQIC+QQD + BP9gIjr/QhYn/wAIDf8CYLH/Aov//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Civ//An7p/wEhPP8JAwT/ZSM9/zkVI/8AAQH/AQIC1AEC + AhoBAgJsAQIC/AcEBf9rJUD/eylK/xcHC/8AJUP/AoDu/wKK//8Cif//Aon//wKJ//8Cif//Aon//wKK + //8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKK//8Civ//Aon//wKJ//8Cif//Aon//wKJ//8Civ//AkuK/wACA/84FCL/iy9T/0IY + KP8AAQH/AQIC3gECAiQBAgJwAQIC/QkFBv9uJkL/jzBW/1EcMf8DBQf/AVOZ/wKL//8Cif//Aon//wKJ + //8Cif//Aor//wJ01/8Cf+z/Aor//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ//8Cif//Aon//wKJ + //8Cif//Aon//wKJ//8Cif//Aor//wJ/6v8CeN7/Aor//wKJ//8Cif//Aon//wKK//8CctP/ABMi/xIG + Cv9zJ0X/jzBW/0YZKv8AAQH/AQIC4AECAicBAgJvAQIC/QgFBv9tJUH/jzBW/4IsTv8kDBT/ABov/wJ6 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgIAAQICEAEC + AnABAgLcAQIC/wABAf8EAwP/GgsQ/z4XJf9gIjr/dylH/4QtT/+KLlP/jC9U/4ovU/+ML1T/jC9U/4gu + Uv+BLE3/cSdD/1UeM/8wEh3/DwcK/wECAv8AAgH/AQIC+gECAr0BAgJGAQICBAECAgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAQICAAECAgEBAgIoAQICiAECAt4BAgL9AAEB/wABAf8EAwT/EAcK/x8ME/8tERz/NxQi/zwW + Jf87FiT/NBMg/ykPGf8aCxD/CwYI/wICAv8AAQH/AAIB/wECAvgBAgLGAQICYwECAhIBAgIAAQICAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIAAQICAgECAiUBAgJvAQICugECAukBAgL9AAIB/wAB + Af8AAQH/AAEB/wABAf8AAQH/AAEB/wABAf8AAQH/AAIC/wECAvgBAgLcAQICogECAlMBAgITAQICAAEC + AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgABAgIAAQICCwEC + Ai4BAgJeAQICiwECAq4BAgLFAQIC0gECAtYBAgLWAQICzwECAr4BAgKjAQICfAECAkwBAgIfAQICBAEC + AgABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAABAgIAAQICAAECAgYBAgIQAQICGQECAhwBAgIcAQICFgECAgwBAgIDAQICAAEC + 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 + + + \ No newline at end of file diff --git a/ILEditor/Forms/SourceSelectBox.Designer.cs b/ILEditor/Forms/SourceSelectBox.Designer.cs new file mode 100644 index 0000000..8f66872 --- /dev/null +++ b/ILEditor/Forms/SourceSelectBox.Designer.cs @@ -0,0 +1,186 @@ +namespace ILEditor.Forms +{ + partial class SourceSelectBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tabs = new System.Windows.Forms.TabControl(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.label1 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.lib = new System.Windows.Forms.TextBox(); + this.mbr = new System.Windows.Forms.TextBox(); + this.spf = new System.Windows.Forms.TextBox(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.stmfPath = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.tabs.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.SuspendLayout(); + // + // tabs + // + this.tabs.Controls.Add(this.tabPage3); + this.tabs.Controls.Add(this.tabPage4); + this.tabs.Location = new System.Drawing.Point(0, 3); + this.tabs.Name = "tabs"; + this.tabs.SelectedIndex = 0; + this.tabs.Size = new System.Drawing.Size(303, 117); + this.tabs.TabIndex = 18; + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.label1); + this.tabPage3.Controls.Add(this.label6); + this.tabPage3.Controls.Add(this.label7); + this.tabPage3.Controls.Add(this.lib); + this.tabPage3.Controls.Add(this.mbr); + this.tabPage3.Controls.Add(this.spf); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Padding = new System.Windows.Forms.Padding(3); + this.tabPage3.Size = new System.Drawing.Size(295, 91); + this.tabPage3.TabIndex = 0; + this.tabPage3.Text = "Member"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 6; + this.label1.Text = "Library"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 41); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(102, 13); + this.label6.TabIndex = 7; + this.label6.Text = "Source-Physical File"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(6, 67); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(76, 13); + this.label7.TabIndex = 8; + this.label7.Text = "Member Name"; + // + // lib + // + this.lib.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.lib.Location = new System.Drawing.Point(189, 12); + this.lib.MaxLength = 10; + this.lib.Name = "lib"; + this.lib.Size = new System.Drawing.Size(100, 20); + this.lib.TabIndex = 9; + // + // mbr + // + this.mbr.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.mbr.Location = new System.Drawing.Point(189, 64); + this.mbr.MaxLength = 10; + this.mbr.Name = "mbr"; + this.mbr.Size = new System.Drawing.Size(100, 20); + this.mbr.TabIndex = 11; + // + // spf + // + this.spf.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.spf.Location = new System.Drawing.Point(189, 38); + this.spf.MaxLength = 10; + this.spf.Name = "spf"; + this.spf.Size = new System.Drawing.Size(100, 20); + this.spf.TabIndex = 10; + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.stmfPath); + this.tabPage4.Controls.Add(this.label2); + this.tabPage4.Location = new System.Drawing.Point(4, 22); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Padding = new System.Windows.Forms.Padding(3); + this.tabPage4.Size = new System.Drawing.Size(295, 91); + this.tabPage4.TabIndex = 1; + this.tabPage4.Text = "Stream file"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // stmfPath + // + this.stmfPath.Location = new System.Drawing.Point(6, 30); + this.stmfPath.MaxLength = 256; + this.stmfPath.Name = "stmfPath"; + this.stmfPath.Size = new System.Drawing.Size(283, 20); + this.stmfPath.TabIndex = 19; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 14); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(80, 13); + this.label2.TabIndex = 18; + this.label2.Text = "Stream file path"; + // + // SourceSelectBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tabs); + this.Name = "SourceSelectBox"; + this.Size = new System.Drawing.Size(303, 123); + this.tabs.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.tabPage4.ResumeLayout(false); + this.tabPage4.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TabControl tabs; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox lib; + private System.Windows.Forms.TextBox mbr; + private System.Windows.Forms.TextBox spf; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.TextBox stmfPath; + private System.Windows.Forms.Label label2; + } +} diff --git a/ILEditor/Forms/SourceSelectBox.cs b/ILEditor/Forms/SourceSelectBox.cs new file mode 100644 index 0000000..3403c10 --- /dev/null +++ b/ILEditor/Forms/SourceSelectBox.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ILEditor.Classes; + +namespace ILEditor.Forms +{ + public partial class SourceSelectBox : UserControl + { + public FileSystem GetFS() => (tabs.SelectedTab.Text == "Member" ? FileSystem.QSYS : FileSystem.IFS); + public string GetIFSPath() => stmfPath.Text; + + public string GetLibrary() => lib.Text; + public string GetSPF() => spf.Text; + public string GetMember() => mbr.Text; + + public void SetSource(string Lib, string Spf, string Mbr) + { + lib.Text = Lib; + spf.Text = Spf; + mbr.Text = Mbr; + } + + public void SetSource(string Path) + { + stmfPath.Text = Path; + } + + public void SetTab(FileSystem System) + { + switch (System) + { + case FileSystem.QSYS: + tabs.SelectedIndex = 0; + break; + case FileSystem.IFS: + tabs.SelectedIndex = 1; + break; + } + } + + public Boolean isValid() + { + switch (tabs.SelectedIndex) + { + case 0: + if (!IBMiUtils.IsValueObjectName(lib.Text)) + return false; + if (!IBMiUtils.IsValueObjectName(spf.Text)) + return false; + if (!IBMiUtils.IsValueObjectName(mbr.Text)) + return false; + break; + + case 1: + if (spf.Text.Trim() != "") + return false; + break; + } + + return true; + } + + public SourceSelectBox() + { + InitializeComponent(); + } + } +} diff --git a/ILEditor/Forms/SourceSelectBox.resx b/ILEditor/Forms/SourceSelectBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ILEditor/Forms/SourceSelectBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ILEditor/ILEditor.csproj b/ILEditor/ILEditor.csproj index 84c2c9b..a843aae 100644 --- a/ILEditor/ILEditor.csproj +++ b/ILEditor/ILEditor.csproj @@ -30,7 +30,7 @@ Works Of Barry true index.html - 18 + 19 3.0.0.%2a true true @@ -270,6 +270,20 @@ ServiceGenerator.cs + + Form + + + SourceCompareSelect.cs + + + UserControl + SourceSelectBox + ILEditor + + + SourceSelectBox.cs + Form @@ -294,6 +308,12 @@ CompileOptions.cs + + Form + + + DiffView.cs + Form @@ -440,6 +460,12 @@ ServiceGenerator.cs + + SourceCompareSelect.cs + + + SourceSelectBox.cs + SPFSelect.cs @@ -465,6 +491,9 @@ CompileOptions.cs + + DiffView.cs + ErrorListing.cs diff --git a/ILEditor/UserTools/DiffView.Designer.cs b/ILEditor/UserTools/DiffView.Designer.cs new file mode 100644 index 0000000..dd43c91 --- /dev/null +++ b/ILEditor/UserTools/DiffView.Designer.cs @@ -0,0 +1,97 @@ +namespace ILEditor.UserTools +{ + partial class DiffView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.oldContent = new System.Windows.Forms.RichTextBox(); + this.newContent = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.oldContent); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.newContent); + this.splitContainer1.Size = new System.Drawing.Size(441, 323); + this.splitContainer1.SplitterDistance = 228; + this.splitContainer1.TabIndex = 0; + // + // oldContent + // + this.oldContent.Dock = System.Windows.Forms.DockStyle.Fill; + this.oldContent.Location = new System.Drawing.Point(0, 0); + this.oldContent.Name = "oldContent"; + this.oldContent.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.oldContent.Size = new System.Drawing.Size(228, 323); + this.oldContent.TabIndex = 0; + this.oldContent.Text = ""; + // + // newContent + // + this.newContent.Dock = System.Windows.Forms.DockStyle.Fill; + this.newContent.Location = new System.Drawing.Point(0, 0); + this.newContent.Name = "newContent"; + this.newContent.Size = new System.Drawing.Size(209, 323); + this.newContent.TabIndex = 0; + this.newContent.Text = ""; + // + // DiffView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(441, 323); + this.Controls.Add(this.splitContainer1); + this.Name = "DiffView"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.RichTextBox oldContent; + private System.Windows.Forms.RichTextBox newContent; + } +} diff --git a/ILEditor/UserTools/DiffView.cs b/ILEditor/UserTools/DiffView.cs new file mode 100644 index 0000000..ea32e22 --- /dev/null +++ b/ILEditor/UserTools/DiffView.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using WeifenLuo.WinFormsUI.Docking; +using DiffMatchPatch; +using System.IO; +using ILEditor.Classes; +using System.Windows.Documents; + +namespace ILEditor.UserTools +{ + public partial class DiffView : DockContent + { + public static void AppendText(RichTextBox box, string text, Color color) + { + box.SelectionStart = box.TextLength; + box.SelectionLength = 0; + + box.SelectionColor = color; + box.AppendText(text); + box.SelectionColor = box.ForeColor; + } + + public Color textColor = Color.Black; + public void HandleTheme(RichTextBox box) + { + bool DarkMode = (Program.Config.GetValue("darkmode") == "true"); + + box.Font = new Font(IBMi.CurrentSystem.GetValue("FONT"), float.Parse(IBMi.CurrentSystem.GetValue("ZOOM"))); + box.WordWrap = false; + + if (DarkMode) + { + box.BackColor = Color.FromArgb(30, 30, 30); + textColor = Color.White; + } + else + { + textColor = Color.Black; + } + } + + public DiffView(string LocalOld, string LocalNew) + { + InitializeComponent(); + + HandleTheme(newContent); + HandleTheme(oldContent); + + this.Text = "Diff " + Path.GetFileNameWithoutExtension(LocalNew) + " -> " + Path.GetFileNameWithoutExtension(LocalOld); + + var dmp = new diff_match_patch(); + var diffs = dmp.diff_main(File.ReadAllText(LocalNew), File.ReadAllText(LocalOld), false); + + foreach (Diff aDiff in diffs) + { + switch (aDiff.operation) + { + case Operation.INSERT: + AppendText(newContent, aDiff.text, Color.Green); + break; + case Operation.DELETE: + AppendText(oldContent, aDiff.text, Color.Red); + break; + case Operation.EQUAL: + AppendText(oldContent, aDiff.text, textColor); + AppendText(newContent, aDiff.text, textColor); + break; + } + } + + oldContent.SelectionStart = 0; + newContent.SelectionStart = 0; + } + } +} diff --git a/ILEditor/UserTools/DiffView.resx b/ILEditor/UserTools/DiffView.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ILEditor/UserTools/DiffView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ILEditor/UserTools/IFSBrowser.cs b/ILEditor/UserTools/IFSBrowser.cs index 1ae1a58..bca67f8 100644 --- a/ILEditor/UserTools/IFSBrowser.cs +++ b/ILEditor/UserTools/IFSBrowser.cs @@ -176,7 +176,7 @@ private void fileToolStripMenuItem_Click(object sender, EventArgs e) window.ShowDialog(); if (window.result != null) - Editor.OpenSource(window.result); + Editor.OpenExistingSource(window.result); } } diff --git a/ILEditor/UserTools/SourceEditor.cs b/ILEditor/UserTools/SourceEditor.cs index 9ab45c1..d1dd229 100644 --- a/ILEditor/UserTools/SourceEditor.cs +++ b/ILEditor/UserTools/SourceEditor.cs @@ -302,49 +302,57 @@ private void SaveAs() RemoteSource MemberInfo = this.Tag as RemoteSource; if (MemberInfo != null) { - switch (MemberInfo.GetFS()) + SaveAs SaveAsWindow = new SaveAs(MemberInfo); + SaveAsWindow.ShowDialog(); + if (SaveAsWindow.Success) { - case FileSystem.QSYS: - SaveAs SaveAsWindow = new SaveAs(); - SaveAsWindow.ShowDialog(); - if (SaveAsWindow.Success) - { - CurrentSaving = true; - - Editor.TheEditor.SetStatus("Saving " + SaveAsWindow.Mbr + ".."); - Thread gothread = new Thread((ThreadStart)delegate + Thread gothread = null; + CurrentSaving = true; + Editor.TheEditor.SetStatus("Saving " + MemberInfo.GetName() + ".."); + switch (SaveAsWindow.SourceInfo().GetFS()) + { + case FileSystem.QSYS: + gothread = new Thread((ThreadStart)delegate { - bool UploadResult = IBMiUtils.UploadMember(MemberInfo.GetLocalFile(), SaveAsWindow.Lib, SaveAsWindow.Spf, SaveAsWindow.Mbr); + bool UploadResult = IBMiUtils.UploadMember(MemberInfo.GetLocalFile(), SaveAsWindow.SourceInfo().GetLibrary(), SaveAsWindow.SourceInfo().GetSPF(), SaveAsWindow.SourceInfo().GetMember()); if (UploadResult == false) - MessageBox.Show("Failed to upload to " + SaveAsWindow.Mbr + "."); + MessageBox.Show("Failed to upload to " + MemberInfo.GetName() + "."); this.Invoke((MethodInvoker)delegate { - Editor.TheEditor.SetStatus(SaveAsWindow.Mbr + " " + (UploadResult ? "" : "not ") + "saved."); + Editor.TheEditor.SetStatus(MemberInfo.GetName() + " " + (UploadResult ? "" : "not ") + "saved."); }); - + CurrentSaving = false; }); + break; - gothread.Start(); - } - else - { - MessageBox.Show("Save as is not available for local source."); - } - break; + case FileSystem.IFS: + gothread = new Thread((ThreadStart)delegate + { + bool UploadResult = IBMiUtils.UploadFile(MemberInfo.GetLocalFile(), SaveAsWindow.SourceInfo().GetIFSPath()); + if (UploadResult == false) + MessageBox.Show("Failed to upload to " + MemberInfo.GetName() + "." + MemberInfo.GetExtension() + "."); - case FileSystem.IFS: - MessageBox.Show("Save as is not available for stream files yet."); - break; - } + this.Invoke((MethodInvoker)delegate + { + Editor.TheEditor.SetStatus(MemberInfo.GetName() + "." + MemberInfo.GetExtension() + " " + (UploadResult ? "" : "not ") + "saved."); + }); + + CurrentSaving = false; + }); + break; + } + if (gothread != null) + gothread.Start(); + } } } - } - else - { - MessageBox.Show("You must save the source before you can Save-As."); + else + { + MessageBox.Show("You must save the source before you can Save-As."); + } } }