Commit before update

This commit is contained in:
Disassembler 2024-11-15 14:19:44 +01:00
parent be85aeff52
commit ab54e937f5
Signed by: Disassembler
GPG Key ID: 524BD33A0EE29499
45 changed files with 2720 additions and 274 deletions

View File

@ -11,9 +11,8 @@ using System.Windows.Forms;
namespace RCM { namespace RCM {
public static class Config { public static class Config {
private static readonly char[] _equals = new char[] { '=' }; private static readonly string _dirName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RCM");
private static readonly char[] _brackets = new char[] { '[', ']' }; private static readonly string _fileName = Path.Combine(_dirName, "RCM.conf");
private static readonly string _fileName = "RCM.conf";
private static Icon _emptyIcon; private static Icon _emptyIcon;
public static ImageList IconList { get; } = new ImageList() { ColorDepth = ColorDepth.Depth32Bit, ImageSize = new Size(20, 20) }; public static ImageList IconList { get; } = new ImageList() { ColorDepth = ColorDepth.Depth32Bit, ImageSize = new Size(20, 20) };
@ -76,6 +75,9 @@ namespace RCM {
JArray json = new JArray(DataSources.Select(dataSource => ConfigSerializer.ObjToJson(dataSource)) JArray json = new JArray(DataSources.Select(dataSource => ConfigSerializer.ObjToJson(dataSource))
.Union(ConfigSections.Values.Select(configSection => ConfigSerializer.ObjToJson(configSection))) .Union(ConfigSections.Values.Select(configSection => ConfigSerializer.ObjToJson(configSection)))
.Union(_uknownSections)); .Union(_uknownSections));
if (!Directory.Exists(_dirName)) {
Directory.CreateDirectory(_dirName);
}
File.WriteAllText(_fileName, ConfigSerializer.JsonToString(json)); File.WriteAllText(_fileName, ConfigSerializer.JsonToString(json));
} }
} }

View File

@ -23,6 +23,7 @@
/// the contents of this method with the code editor. /// the contents of this method with the code editor.
/// </summary> /// </summary>
private void InitializeComponent() { private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigForm));
this.treeView = new System.Windows.Forms.TreeView(); this.treeView = new System.Windows.Forms.TreeView();
this.tabControl = new System.Windows.Forms.TabControl(); this.tabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPage1 = new System.Windows.Forms.TabPage();
@ -103,7 +104,7 @@
this.panelDataSource.Location = new System.Drawing.Point(10, 53); this.panelDataSource.Location = new System.Drawing.Point(10, 53);
this.panelDataSource.Name = "panelDataSource"; this.panelDataSource.Name = "panelDataSource";
this.panelDataSource.Size = new System.Drawing.Size(307, 373); this.panelDataSource.Size = new System.Drawing.Size(307, 373);
this.panelDataSource.TabIndex = 19; this.panelDataSource.TabIndex = 2;
// //
// buttonSave // buttonSave
// //
@ -112,7 +113,7 @@
this.buttonSave.Location = new System.Drawing.Point(131, 432); this.buttonSave.Location = new System.Drawing.Point(131, 432);
this.buttonSave.Name = "buttonSave"; this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(175, 23); this.buttonSave.Size = new System.Drawing.Size(175, 23);
this.buttonSave.TabIndex = 18; this.buttonSave.TabIndex = 3;
this.buttonSave.Text = "Save changes"; this.buttonSave.Text = "Save changes";
this.buttonSave.UseVisualStyleBackColor = true; this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
@ -123,7 +124,7 @@
this.textBoxTitle.Location = new System.Drawing.Point(130, 9); this.textBoxTitle.Location = new System.Drawing.Point(130, 9);
this.textBoxTitle.Name = "textBoxTitle"; this.textBoxTitle.Name = "textBoxTitle";
this.textBoxTitle.Size = new System.Drawing.Size(175, 20); this.textBoxTitle.Size = new System.Drawing.Size(175, 20);
this.textBoxTitle.TabIndex = 17; this.textBoxTitle.TabIndex = 1;
// //
// labelTitle // labelTitle
// //
@ -140,6 +141,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(574, 496); this.ClientSize = new System.Drawing.Size(574, 496);
this.Controls.Add(this.tabControl); this.Controls.Add(this.tabControl);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ConfigForm"; this.Name = "ConfigForm";
this.Text = "Configuration - Remote Connection Manager"; this.Text = "Configuration - Remote Connection Manager";
this.tabControl.ResumeLayout(false); this.tabControl.ResumeLayout(false);

View File

@ -1,11 +1,4 @@
using System; 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; using System.Windows.Forms;
namespace RCM { namespace RCM {
@ -24,7 +17,6 @@ namespace RCM {
treeView.ImageList = Config.IconList; treeView.ImageList = Config.IconList;
treeView.ContextMenuStrip = GetNewDataSourceContextMenu(); treeView.ContextMenuStrip = GetNewDataSourceContextMenu();
foreach (IDataSource dataSource in Config.DataSources) { foreach (IDataSource dataSource in Config.DataSources) {
string dataSourceType = dataSource.GetType().FullName;
treeView.Nodes.Add(CreateTreeNodeFromDataSource(dataSource)); treeView.Nodes.Add(CreateTreeNodeFromDataSource(dataSource));
SortTreeAndSelectNode(null); SortTreeAndSelectNode(null);
} }
@ -39,7 +31,7 @@ namespace RCM {
#region TreeView display #region TreeView display
private TreeNode CreateTreeNodeFromDataSource(IDataSource dataSource) { private TreeNode CreateTreeNodeFromDataSource(IDataSource dataSource) {
string imageKey = dataSource.GetType().FullName; string imageKey = dataSource.GetType().FullName;
return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu(dataSource) }; return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu() };
} }
private void SortTreeAndSelectNode(TreeNode node) { private void SortTreeAndSelectNode(TreeNode node) {
@ -107,7 +99,8 @@ namespace RCM {
IDataSource dataSource = (IDataSource)e.Node.Tag; IDataSource dataSource = (IDataSource)e.Node.Tag;
dataSource.Title = e.Label; dataSource.Title = e.Label;
Config.Save(); Config.Save();
BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node });
} }
private void ButtonSave_Click(object sender, EventArgs e) { private void ButtonSave_Click(object sender, EventArgs e) {
@ -117,6 +110,7 @@ namespace RCM {
dataSource.Title = selectedNode.Text = textBoxTitle.Text; dataSource.Title = selectedNode.Text = textBoxTitle.Text;
Config.Save(); Config.Save();
SortTreeAndSelectNode(selectedNode); SortTreeAndSelectNode(selectedNode);
MessageBox.Show("Data source changes saved", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
private void NewDataSourceContextMenuItem_Click(object sender, EventArgs e) { private void NewDataSourceContextMenuItem_Click(object sender, EventArgs e) {
@ -159,7 +153,7 @@ namespace RCM {
ContextMenuStrip menu = new ContextMenuStrip(); ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem menuItem = new ToolStripMenuItem("New item"); ToolStripMenuItem menuItem = new ToolStripMenuItem("New item");
foreach (Type type in Config.DataSourceTypes) { foreach (Type type in Config.DataSourceTypes) {
ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type }; ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] };
item.Click += NewDataSourceContextMenuItem_Click; item.Click += NewDataSourceContextMenuItem_Click;
menuItem.DropDownItems.Add(item); menuItem.DropDownItems.Add(item);
} }
@ -167,7 +161,7 @@ namespace RCM {
return menu; return menu;
} }
private ContextMenuStrip GetContextMenu(IDataSource dataSource) { private ContextMenuStrip GetContextMenu() {
ContextMenuStrip menu = new ContextMenuStrip(); ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem duplicateItem = new ToolStripMenuItem("Duplicate item"); ToolStripMenuItem duplicateItem = new ToolStripMenuItem("Duplicate item");
duplicateItem.Click += DuplicateDataSourceContextMenuItem_Click; duplicateItem.Click += DuplicateDataSourceContextMenuItem_Click;

View File

@ -117,4 +117,467 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA
BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ
AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm
AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA
AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP//////////
/////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
//////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
/wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
/wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
/wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
/wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
//////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
/gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
//////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
/xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
/4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
/v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
/v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
//+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
/P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho
aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ
Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7
+/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA
AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
/v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
//8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
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
</value>
</data>
</root> </root>

View File

@ -1,11 +1,4 @@
using System; 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 System.Windows.Forms;
namespace RCM { namespace RCM {
@ -22,6 +15,7 @@ namespace RCM {
private void ButtonSave_Click(object sender, EventArgs e) { private void ButtonSave_Click(object sender, EventArgs e) {
_configSection.UpdateFromControl(); _configSection.UpdateFromControl();
Config.Save(); Config.Save();
MessageBox.Show(string.Format("{0} changes saved", _configSection.GetType().GetDisplayName()), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
} }
} }

View File

@ -24,7 +24,7 @@ namespace RCM {
public static string JsonToString(JToken json) { public static string JsonToString(JToken json) {
var stringWriter = new StringWriter(); var stringWriter = new StringWriter();
var jsonWriter = new JsonTextWriter(stringWriter) { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }; var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented };
new JsonSerializer().Serialize(jsonWriter, json); new JsonSerializer().Serialize(jsonWriter, json);
return stringWriter.ToString(); return stringWriter.ToString();
} }
@ -50,7 +50,7 @@ namespace RCM {
Array.Copy(cipherbytes, salt, 16); Array.Copy(cipherbytes, salt, 16);
Array.Copy(cipherbytes, 16, iv, 0, 16); Array.Copy(cipherbytes, 16, iv, 0, 16);
using (AesManaged aes = new AesManaged() { KeySize = 128 }) using (AesManaged aes = new AesManaged() { KeySize = 128 })
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 1024)) using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 16))
using (ICryptoTransform decryptor = aes.CreateDecryptor(pbkdf2.GetBytes(16), iv)) using (ICryptoTransform decryptor = aes.CreateDecryptor(pbkdf2.GetBytes(16), iv))
using (MemoryStream memoryStream = new MemoryStream()) using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write)) using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
@ -62,7 +62,7 @@ namespace RCM {
} }
public static object DecryptObject(byte[] cipherbytes, string password) { public static object DecryptObject(byte[] cipherbytes, string password) {
return StringToObj(Encoding.ASCII.GetString(Decrypt(cipherbytes, password))); return StringToObj(Encoding.Unicode.GetString(Decrypt(cipherbytes, password)));
} }
public static byte[] Encrypt(byte[] plaintext, string password) { public static byte[] Encrypt(byte[] plaintext, string password) {
@ -71,7 +71,7 @@ namespace RCM {
} }
using (AesManaged aes = new AesManaged() { KeySize = 128 }) { using (AesManaged aes = new AesManaged() { KeySize = 128 }) {
aes.GenerateIV(); aes.GenerateIV();
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 1024)) using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 16))
using (ICryptoTransform encryptor = aes.CreateEncryptor(pbkdf2.GetBytes(16), aes.IV)) using (ICryptoTransform encryptor = aes.CreateEncryptor(pbkdf2.GetBytes(16), aes.IV))
using (MemoryStream memoryStream = new MemoryStream()) using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
@ -84,7 +84,7 @@ namespace RCM {
} }
public static byte[] EncryptObject(object obj, string password) { public static byte[] EncryptObject(object obj, string password) {
return Encrypt(Encoding.ASCII.GetBytes(ObjToString(obj)), password); return Encrypt(Encoding.Unicode.GetBytes(ObjToString(obj)), password);
} }
} }
} }

View File

@ -103,7 +103,7 @@
this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 104); this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 104);
this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword"; this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword";
this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22); this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22);
this.buttonUnmaskEncPassword.TabIndex = 17; this.buttonUnmaskEncPassword.TabIndex = 7;
this.buttonUnmaskEncPassword.Text = "●"; this.buttonUnmaskEncPassword.Text = "●";
this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true; this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true;
this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click); this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click);
@ -113,7 +113,7 @@
this.textBoxEncPassword.Location = new System.Drawing.Point(120, 105); this.textBoxEncPassword.Location = new System.Drawing.Point(120, 105);
this.textBoxEncPassword.Name = "textBoxEncPassword"; this.textBoxEncPassword.Name = "textBoxEncPassword";
this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20); this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20);
this.textBoxEncPassword.TabIndex = 16; this.textBoxEncPassword.TabIndex = 6;
this.textBoxEncPassword.UseSystemPasswordChar = true; this.textBoxEncPassword.UseSystemPasswordChar = true;
// //
// textBoxDatabase // textBoxDatabase
@ -121,7 +121,7 @@
this.textBoxDatabase.Location = new System.Drawing.Point(120, 79); this.textBoxDatabase.Location = new System.Drawing.Point(120, 79);
this.textBoxDatabase.Name = "textBoxDatabase"; this.textBoxDatabase.Name = "textBoxDatabase";
this.textBoxDatabase.Size = new System.Drawing.Size(175, 20); this.textBoxDatabase.Size = new System.Drawing.Size(175, 20);
this.textBoxDatabase.TabIndex = 15; this.textBoxDatabase.TabIndex = 5;
// //
// label1 // label1
// //
@ -146,7 +146,7 @@
this.buttonTestConnection.Location = new System.Drawing.Point(120, 132); this.buttonTestConnection.Location = new System.Drawing.Point(120, 132);
this.buttonTestConnection.Name = "buttonTestConnection"; this.buttonTestConnection.Name = "buttonTestConnection";
this.buttonTestConnection.Size = new System.Drawing.Size(175, 23); this.buttonTestConnection.Size = new System.Drawing.Size(175, 23);
this.buttonTestConnection.TabIndex = 20; this.buttonTestConnection.TabIndex = 8;
this.buttonTestConnection.Text = "Test connection"; this.buttonTestConnection.Text = "Test connection";
this.buttonTestConnection.UseVisualStyleBackColor = true; this.buttonTestConnection.UseVisualStyleBackColor = true;
this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click); this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click);
@ -156,7 +156,7 @@
this.buttonCreateSchema.Location = new System.Drawing.Point(120, 161); this.buttonCreateSchema.Location = new System.Drawing.Point(120, 161);
this.buttonCreateSchema.Name = "buttonCreateSchema"; this.buttonCreateSchema.Name = "buttonCreateSchema";
this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23); this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23);
this.buttonCreateSchema.TabIndex = 21; this.buttonCreateSchema.TabIndex = 9;
this.buttonCreateSchema.Text = "Create schema"; this.buttonCreateSchema.Text = "Create schema";
this.buttonCreateSchema.UseVisualStyleBackColor = true; this.buttonCreateSchema.UseVisualStyleBackColor = true;
this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click); this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click);

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -39,7 +39,7 @@
this.buttonSelectDatabase.Location = new System.Drawing.Point(273, -1); this.buttonSelectDatabase.Location = new System.Drawing.Point(273, -1);
this.buttonSelectDatabase.Name = "buttonSelectDatabase"; this.buttonSelectDatabase.Name = "buttonSelectDatabase";
this.buttonSelectDatabase.Size = new System.Drawing.Size(22, 22); this.buttonSelectDatabase.Size = new System.Drawing.Size(22, 22);
this.buttonSelectDatabase.TabIndex = 4; this.buttonSelectDatabase.TabIndex = 2;
this.buttonSelectDatabase.Text = "⋯"; this.buttonSelectDatabase.Text = "⋯";
this.buttonSelectDatabase.UseVisualStyleBackColor = true; this.buttonSelectDatabase.UseVisualStyleBackColor = true;
this.buttonSelectDatabase.Click += new System.EventHandler(this.ButtonSelectDatabase_Click); this.buttonSelectDatabase.Click += new System.EventHandler(this.ButtonSelectDatabase_Click);
@ -49,7 +49,7 @@
this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 25); this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 25);
this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword"; this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword";
this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22); this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22);
this.buttonUnmaskEncPassword.TabIndex = 17; this.buttonUnmaskEncPassword.TabIndex = 4;
this.buttonUnmaskEncPassword.Text = "●"; this.buttonUnmaskEncPassword.Text = "●";
this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true; this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true;
this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click); this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click);
@ -59,7 +59,7 @@
this.textBoxEncPassword.Location = new System.Drawing.Point(120, 26); this.textBoxEncPassword.Location = new System.Drawing.Point(120, 26);
this.textBoxEncPassword.Name = "textBoxEncPassword"; this.textBoxEncPassword.Name = "textBoxEncPassword";
this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20); this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20);
this.textBoxEncPassword.TabIndex = 16; this.textBoxEncPassword.TabIndex = 3;
this.textBoxEncPassword.UseSystemPasswordChar = true; this.textBoxEncPassword.UseSystemPasswordChar = true;
// //
// textBoxDatabase // textBoxDatabase
@ -67,7 +67,7 @@
this.textBoxDatabase.Location = new System.Drawing.Point(120, 0); this.textBoxDatabase.Location = new System.Drawing.Point(120, 0);
this.textBoxDatabase.Name = "textBoxDatabase"; this.textBoxDatabase.Name = "textBoxDatabase";
this.textBoxDatabase.Size = new System.Drawing.Size(147, 20); this.textBoxDatabase.Size = new System.Drawing.Size(147, 20);
this.textBoxDatabase.TabIndex = 15; this.textBoxDatabase.TabIndex = 1;
// //
// labelEncPassword // labelEncPassword
// //
@ -92,7 +92,7 @@
this.buttonTestConnection.Location = new System.Drawing.Point(120, 53); this.buttonTestConnection.Location = new System.Drawing.Point(120, 53);
this.buttonTestConnection.Name = "buttonTestConnection"; this.buttonTestConnection.Name = "buttonTestConnection";
this.buttonTestConnection.Size = new System.Drawing.Size(175, 23); this.buttonTestConnection.Size = new System.Drawing.Size(175, 23);
this.buttonTestConnection.TabIndex = 20; this.buttonTestConnection.TabIndex = 5;
this.buttonTestConnection.Text = "Test connection"; this.buttonTestConnection.Text = "Test connection";
this.buttonTestConnection.UseVisualStyleBackColor = true; this.buttonTestConnection.UseVisualStyleBackColor = true;
this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click); this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click);
@ -102,7 +102,7 @@
this.buttonCreateSchema.Location = new System.Drawing.Point(120, 82); this.buttonCreateSchema.Location = new System.Drawing.Point(120, 82);
this.buttonCreateSchema.Name = "buttonCreateSchema"; this.buttonCreateSchema.Name = "buttonCreateSchema";
this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23); this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23);
this.buttonCreateSchema.TabIndex = 21; this.buttonCreateSchema.TabIndex = 6;
this.buttonCreateSchema.Text = "Create schema"; this.buttonCreateSchema.Text = "Create schema";
this.buttonCreateSchema.UseVisualStyleBackColor = true; this.buttonCreateSchema.UseVisualStyleBackColor = true;
this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click); this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click);

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -1,6 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
namespace RCM { namespace RCM {
public class DisplayName : Attribute { public class DisplayName : Attribute {

View File

@ -1,11 +1,10 @@
using Newtonsoft.Json; using System;
using System;
using System.Windows.Forms; using System.Windows.Forms;
namespace RCM { namespace RCM {
[Serializable] [Serializable]
[DisplayName("Group")] [DisplayName("Group")]
public class Group : IRecord { // TODO: Prvni v poradi new items public class Group : IRecord {
public Guid Id { get; set; } public Guid Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
public Guid GroupId { get; set; } public Guid GroupId { get; set; }

View File

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Windows.Forms;
using System.Windows.Forms;
namespace RCM { namespace RCM {
public interface IConfigSection { public interface IConfigSection {

View File

@ -6,8 +6,6 @@ namespace RCM {
Guid Id { get; set; } Guid Id { get; set; }
string Title { get; set; } string Title { get; set; }
Guid GroupId { get; set; } Guid GroupId { get; set; }
// DateTime LastUpdate { get; set; }
IAction[] GetActions(); IAction[] GetActions();
UserControl GetControl(); UserControl GetControl();
void UpdateFromControl(); void UpdateFromControl();

View File

@ -29,6 +29,7 @@
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container(); this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.treeView = new System.Windows.Forms.TreeView(); this.treeView = new System.Windows.Forms.TreeView();
this.splitContainer = new System.Windows.Forms.SplitContainer(); this.splitContainer = new System.Windows.Forms.SplitContainer();
this.buttonConfig = new System.Windows.Forms.Button(); this.buttonConfig = new System.Windows.Forms.Button();
@ -42,12 +43,17 @@
this.timerDataSourceRefresh = new System.Windows.Forms.Timer(this.components); this.timerDataSourceRefresh = new System.Windows.Forms.Timer(this.components);
this.statusStrip = new System.Windows.Forms.StatusStrip(); this.statusStrip = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLastRefresh = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusFailedFlag = new System.Windows.Forms.ToolStripStatusLabel();
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuNotifyIcon = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuShowMainForm = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuCloseMainForm = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout();
this.splitContainer.SuspendLayout(); this.splitContainer.SuspendLayout();
this.statusStrip.SuspendLayout(); this.statusStrip.SuspendLayout();
this.contextMenuNotifyIcon.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// treeView // treeView
@ -62,7 +68,7 @@
this.treeView.Location = new System.Drawing.Point(3, 30); this.treeView.Location = new System.Drawing.Point(3, 30);
this.treeView.Name = "treeView"; this.treeView.Name = "treeView";
this.treeView.Size = new System.Drawing.Size(244, 440); this.treeView.Size = new System.Drawing.Size(244, 440);
this.treeView.TabIndex = 0; this.treeView.TabIndex = 3;
this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.TreeView_AfterLabelEdit); this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.TreeView_AfterLabelEdit);
this.treeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterCollapse); this.treeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterCollapse);
this.treeView.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterExpand); this.treeView.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterExpand);
@ -105,7 +111,7 @@
this.buttonConfig.Location = new System.Drawing.Point(3, 1); this.buttonConfig.Location = new System.Drawing.Point(3, 1);
this.buttonConfig.Name = "buttonConfig"; this.buttonConfig.Name = "buttonConfig";
this.buttonConfig.Size = new System.Drawing.Size(24, 24); this.buttonConfig.Size = new System.Drawing.Size(24, 24);
this.buttonConfig.TabIndex = 2; this.buttonConfig.TabIndex = 1;
this.buttonConfig.UseVisualStyleBackColor = true; this.buttonConfig.UseVisualStyleBackColor = true;
this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click); this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click);
// //
@ -118,7 +124,7 @@
this.comboBoxDatabase.Location = new System.Drawing.Point(33, 3); this.comboBoxDatabase.Location = new System.Drawing.Point(33, 3);
this.comboBoxDatabase.Name = "comboBoxDatabase"; this.comboBoxDatabase.Name = "comboBoxDatabase";
this.comboBoxDatabase.Size = new System.Drawing.Size(214, 21); this.comboBoxDatabase.Size = new System.Drawing.Size(214, 21);
this.comboBoxDatabase.TabIndex = 1; this.comboBoxDatabase.TabIndex = 2;
this.comboBoxDatabase.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDatabase_SelectedIndexChanged); this.comboBoxDatabase.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDatabase_SelectedIndexChanged);
// //
// panelRecord // panelRecord
@ -129,7 +135,7 @@
this.panelRecord.Location = new System.Drawing.Point(11, 82); this.panelRecord.Location = new System.Drawing.Point(11, 82);
this.panelRecord.Name = "panelRecord"; this.panelRecord.Name = "panelRecord";
this.panelRecord.Size = new System.Drawing.Size(306, 350); this.panelRecord.Size = new System.Drawing.Size(306, 350);
this.panelRecord.TabIndex = 15; this.panelRecord.TabIndex = 3;
// //
// buttonSave // buttonSave
// //
@ -138,7 +144,7 @@
this.buttonSave.Location = new System.Drawing.Point(131, 438); this.buttonSave.Location = new System.Drawing.Point(131, 438);
this.buttonSave.Name = "buttonSave"; this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(175, 23); this.buttonSave.Size = new System.Drawing.Size(175, 23);
this.buttonSave.TabIndex = 14; this.buttonSave.TabIndex = 4;
this.buttonSave.Text = "Save changes"; this.buttonSave.Text = "Save changes";
this.buttonSave.UseVisualStyleBackColor = true; this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
@ -160,7 +166,7 @@
this.comboBoxGroup.Location = new System.Drawing.Point(131, 39); this.comboBoxGroup.Location = new System.Drawing.Point(131, 39);
this.comboBoxGroup.Name = "comboBoxGroup"; this.comboBoxGroup.Name = "comboBoxGroup";
this.comboBoxGroup.Size = new System.Drawing.Size(175, 21); this.comboBoxGroup.Size = new System.Drawing.Size(175, 21);
this.comboBoxGroup.TabIndex = 12; this.comboBoxGroup.TabIndex = 2;
// //
// textBoxTitle // textBoxTitle
// //
@ -181,14 +187,14 @@
// //
// timerDataSourceRefresh // timerDataSourceRefresh
// //
this.timerDataSourceRefresh.Interval = 30000; this.timerDataSourceRefresh.Interval = 120000;
this.timerDataSourceRefresh.Tick += new System.EventHandler(this.TimerDataSourceRefresh_Tick); this.timerDataSourceRefresh.Tick += new System.EventHandler(this.TimerDataSourceRefresh_Tick);
// //
// statusStrip // statusStrip
// //
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel, this.toolStripStatusLabel,
this.toolStripStatusLastRefresh}); this.toolStripStatusFailedFlag});
this.statusStrip.Location = new System.Drawing.Point(0, 474); this.statusStrip.Location = new System.Drawing.Point(0, 474);
this.statusStrip.Name = "statusStrip"; this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(574, 22); this.statusStrip.Size = new System.Drawing.Size(574, 22);
@ -197,15 +203,47 @@
// //
// toolStripStatusLabel // toolStripStatusLabel
// //
this.toolStripStatusLabel.ForeColor = System.Drawing.SystemColors.ControlDark;
this.toolStripStatusLabel.Name = "toolStripStatusLabel"; this.toolStripStatusLabel.Name = "toolStripStatusLabel";
this.toolStripStatusLabel.Size = new System.Drawing.Size(134, 17); this.toolStripStatusLabel.Size = new System.Drawing.Size(166, 17);
this.toolStripStatusLabel.Text = "Last data source refresh:"; this.toolStripStatusLabel.Text = "Last data source refresh: never";
// //
// toolStripStatusLastRefresh // toolStripStatusFailedFlag
// //
this.toolStripStatusLastRefresh.Name = "toolStripStatusLastRefresh"; this.toolStripStatusFailedFlag.ForeColor = System.Drawing.SystemColors.ControlDark;
this.toolStripStatusLastRefresh.Size = new System.Drawing.Size(36, 17); this.toolStripStatusFailedFlag.Name = "toolStripStatusFailedFlag";
this.toolStripStatusLastRefresh.Text = "never"; this.toolStripStatusFailedFlag.Size = new System.Drawing.Size(136, 17);
this.toolStripStatusFailedFlag.Text = "(data source not loaded)";
//
// notifyIcon
//
this.notifyIcon.ContextMenuStrip = this.contextMenuNotifyIcon;
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
this.notifyIcon.Text = "Remote Connection Manager";
this.notifyIcon.Visible = true;
this.notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseClick);
//
// contextMenuNotifyIcon
//
this.contextMenuNotifyIcon.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuShowMainForm,
this.toolStripMenuCloseMainForm});
this.contextMenuNotifyIcon.Name = "contextMenuNotifyIcon";
this.contextMenuNotifyIcon.Size = new System.Drawing.Size(179, 48);
//
// toolStripMenuShowMainForm
//
this.toolStripMenuShowMainForm.Name = "toolStripMenuShowMainForm";
this.toolStripMenuShowMainForm.Size = new System.Drawing.Size(178, 22);
this.toolStripMenuShowMainForm.Text = "Show main window";
this.toolStripMenuShowMainForm.Click += new System.EventHandler(this.ToolStripMenuShowMainForm_Click);
//
// toolStripMenuCloseMainForm
//
this.toolStripMenuCloseMainForm.Name = "toolStripMenuCloseMainForm";
this.toolStripMenuCloseMainForm.Size = new System.Drawing.Size(178, 22);
this.toolStripMenuCloseMainForm.Text = "Exit application";
this.toolStripMenuCloseMainForm.Click += new System.EventHandler(this.ToolStripMenuCloseMainForm_Click);
// //
// MainForm // MainForm
// //
@ -214,8 +252,11 @@
this.ClientSize = new System.Drawing.Size(574, 496); this.ClientSize = new System.Drawing.Size(574, 496);
this.Controls.Add(this.statusStrip); this.Controls.Add(this.statusStrip);
this.Controls.Add(this.splitContainer); this.Controls.Add(this.splitContainer);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "MainForm"; this.Name = "MainForm";
this.Text = "Remote Connection Manager"; this.Text = "Remote Connection Manager";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.Resize += new System.EventHandler(this.MainForm_Resize);
this.splitContainer.Panel1.ResumeLayout(false); this.splitContainer.Panel1.ResumeLayout(false);
this.splitContainer.Panel2.ResumeLayout(false); this.splitContainer.Panel2.ResumeLayout(false);
this.splitContainer.Panel2.PerformLayout(); this.splitContainer.Panel2.PerformLayout();
@ -223,6 +264,7 @@
this.splitContainer.ResumeLayout(false); this.splitContainer.ResumeLayout(false);
this.statusStrip.ResumeLayout(false); this.statusStrip.ResumeLayout(false);
this.statusStrip.PerformLayout(); this.statusStrip.PerformLayout();
this.contextMenuNotifyIcon.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -243,7 +285,11 @@
private System.Windows.Forms.Button buttonConfig; private System.Windows.Forms.Button buttonConfig;
private System.Windows.Forms.StatusStrip statusStrip; private System.Windows.Forms.StatusStrip statusStrip;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLastRefresh; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusFailedFlag;
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.ContextMenuStrip contextMenuNotifyIcon;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuShowMainForm;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuCloseMainForm;
} }
} }

View File

@ -3,12 +3,14 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using System.Linq; using System.Linq;
using System.Collections.Specialized;
namespace RCM { namespace RCM {
public partial class MainForm : Form { public partial class MainForm : Form {
#region Form #region Form
protected override CreateParams CreateParams { // Workaround for control flickering reduction private bool allowClose = false;
protected override CreateParams CreateParams {
// Workaround for control flickering reduction
get { get {
CreateParams cp = base.CreateParams; CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
@ -24,6 +26,31 @@ namespace RCM {
LoadDataSources(0); LoadDataSources(0);
} }
private void MainForm_Resize(object sender, EventArgs e) {
if (WindowState == FormWindowState.Minimized) {
ShowInTaskbar = false;
return;
}
Config.Save();
}
private void NotifyIcon_MouseClick(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
WindowState = FormWindowState.Normal;
ShowInTaskbar = true;
}
}
private void ToolStripMenuShowMainForm_Click(object sender, EventArgs e) {
WindowState = FormWindowState.Normal;
ShowInTaskbar = true;
}
private void ToolStripMenuCloseMainForm_Click(object sender, EventArgs e) {
allowClose = true;
Close();
}
private void LoadDataSources(int selectedIndex) { private void LoadDataSources(int selectedIndex) {
comboBoxDatabase.Items.Clear(); comboBoxDatabase.Items.Clear();
comboBoxDatabase.Items.AddRange(Config.DataSources.ToArray()); comboBoxDatabase.Items.AddRange(Config.DataSources.ToArray());
@ -43,9 +70,18 @@ namespace RCM {
configForm.Dispose(); configForm.Dispose();
LoadDataSources(selectedIndex); LoadDataSources(selectedIndex);
} }
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
if (e.CloseReason == CloseReason.UserClosing && !allowClose) {
e.Cancel = true;
WindowState = FormWindowState.Minimized;
}
}
#endregion #endregion
#region ComboBox & DataSource #region ComboBox & DataSource
private IDataSource previouslySelectedDataSource = null;
private void RebuildGroupCombobox(IRecord record) { private void RebuildGroupCombobox(IRecord record) {
List<GroupPath> groupPaths = new List<GroupPath>() { new GroupPath(null) }; List<GroupPath> groupPaths = new List<GroupPath>() { new GroupPath(null) };
groupPaths.AddRange(RebuildGroupCombobox(treeView.Nodes)); groupPaths.AddRange(RebuildGroupCombobox(treeView.Nodes));
@ -65,31 +101,66 @@ namespace RCM {
return groupPaths; return groupPaths;
} }
private void ReloadDataSource() { private void ShowDataSourceException(string failedAction, Exception ex) {
RebuildTreeView(); IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
timerDataSourceRefresh.Stop(); string message = String.Format("{0}\n\nData source \"{1}\" exception:\n{2}\n{3}", failedAction, dataSource.Title, ex.GetType().ToString(), ex.Message);
timerDataSourceRefresh.Start(); MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) => ReloadDataSource(); private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) {
if (comboBoxDatabase.SelectedIndex == -1) {
return;
}
try {
treeView.Enabled = true;
ReloadTreeView(true);
previouslySelectedDataSource = (IDataSource)comboBoxDatabase.SelectedItem;
treeView.SelectedNode = null;
ChangeSelectedRecord();
} catch (Exception ex) {
ShowDataSourceException("Failed to load data source.", ex);
if (previouslySelectedDataSource == null) {
treeView.Enabled = false;
treeView.Nodes.Clear();
comboBoxDatabase.SelectedIndex = -1;
toolStripStatusLabel.Text = "Last data source refresh: never";
toolStripStatusFailedFlag.Text = "(data source not loaded)";
} else {
comboBoxDatabase.SelectedItem = previouslySelectedDataSource;
}
}
}
private void RefreshContextMenuItem_Click(object sender, EventArgs e) => ReloadDataSource(); private void RefreshContextMenuItem_Click(object sender, EventArgs e) {
try {
ReloadTreeView(true);
} catch (Exception ex) {
ShowDataSourceException("Failed to refresh data source.", ex);
toolStripStatusFailedFlag.Text = "(failed to refresh since then)";
}
}
private void TimerDataSourceRefresh_Tick(object sender, EventArgs e) { private void TimerDataSourceRefresh_Tick(object sender, EventArgs e) {
RebuildTreeView(); try {
ReloadTreeView();
} catch (Exception ex) {
if (toolStripStatusFailedFlag.Text == String.Empty) {
ShowDataSourceException("Failed to refresh data source.", ex);
toolStripStatusFailedFlag.Text = "(failed to refresh since then)";
}
}
} }
#endregion #endregion
#region TreeView display #region TreeView display
/* test */ private void ReloadTreeView(bool restartTimer = false) {
private void RebuildTreeView() {
// Select all records from database // Select all records from database
IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem; IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
Dictionary<Guid, IRecord> dataSourceRecords = dataSource.SelectAll(); Dictionary<Guid, IRecord> dataSourceRecords = dataSource.SelectAll();
Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id; Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id;
// Flatten tree nodes // Flatten existing tree nodes
List<TreeNode> flattenedTreeList = new List<TreeNode>(); List<TreeNode> flattenedTreeList = new List<TreeNode>();
int lastProcessPosition = 0; int lastProcessPosition = 0;
flattenedTreeList.AddRange(treeView.Nodes.Cast<TreeNode>()); flattenedTreeList.AddRange(treeView.Nodes.Cast<TreeNode>());
@ -99,11 +170,13 @@ namespace RCM {
Dictionary<Guid, TreeNode> flattenedTree = flattenedTreeList.ToDictionary(n => ((IRecord)n.Tag).Id, n => n); Dictionary<Guid, TreeNode> flattenedTree = flattenedTreeList.ToDictionary(n => ((IRecord)n.Tag).Id, n => n);
// Iterate over existing nodes // Iterate over existing nodes
HashSet<Guid> removeFromFlattenedTree = new HashSet<Guid>();
foreach (TreeNode node in flattenedTree.Values) { foreach (TreeNode node in flattenedTree.Values) {
IRecord record = (IRecord)node.Tag; IRecord record = (IRecord)node.Tag;
// Delete node if record no longer present in database // Delete node if record no longer present in database
if (!dataSourceRecords.ContainsKey(record.Id)) { if (!dataSourceRecords.ContainsKey(record.Id)) {
node.Remove(); node.Remove();
removeFromFlattenedTree.Add(record.Id);
continue; continue;
} }
// Update existing record if it has changed since the last refresh // Update existing record if it has changed since the last refresh
@ -123,17 +196,17 @@ namespace RCM {
// Remove processed record // Remove processed record
dataSourceRecords.Remove(record.Id); dataSourceRecords.Remove(record.Id);
} }
// Remove deleted records from flattened tree
foreach (Guid removedId in removeFromFlattenedTree) {
flattenedTree.Remove(removedId);
}
// Create nodes from unprocessed (new) records // Create nodes from unprocessed (new) records
foreach (IRecord record in dataSourceRecords.Values) { foreach (IRecord record in dataSourceRecords.Values) {
TreeNode node = CreateTreeNodeFromRecord(record); flattenedTree.Add(record.Id, CreateTreeNodeFromRecord(record));
if (dataSource.ExpandedNodes.Contains(record.Id)) {
node.Expand();
}
flattenedTree.Add(record.Id, node);
} }
// Assign nodes to tree structure // Assign nodes to tree structure (all nodes have to exist first)
foreach (IRecord record in dataSourceRecords.Values) { foreach (IRecord record in dataSourceRecords.Values) {
TreeNode node = flattenedTree[record.Id]; TreeNode node = flattenedTree[record.Id];
if (record.GroupId == Guid.Empty) { if (record.GroupId == Guid.Empty) {
@ -142,48 +215,41 @@ namespace RCM {
flattenedTree[record.GroupId].Nodes.Add(node); flattenedTree[record.GroupId].Nodes.Add(node);
} }
} }
// Expand nodes (all nodes have to be placed in tree first)
TreeNode selectedNode = flattenedTree.ContainsKey(selectedGuid) ? flattenedTree[selectedGuid] : null; foreach (IRecord record in dataSourceRecords.Values) {
SortTreeAndSelectNode(selectedNode); if (dataSource.ExpandedNodes.Contains(record.Id)) {
toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); TreeNode node = flattenedTree[record.Id];
}
/* test end */
/*private void RebuildTreeView() {
IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
Dictionary<Guid, TreeNode> nodes = new Dictionary<Guid, TreeNode>();
try {
foreach (IRecord record in dataSource.SelectAll()) {
nodes.Add(record.Id, CreateTreeNodeFromRecord(record));
}
} catch {
MessageBox.Show("Failed to retieve records from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id;
TreeNode selectedNode = null;
treeView.Nodes.Clear();
foreach (TreeNode node in nodes.Values) {
IRecord record = (IRecord)node.Tag;
if (record.GroupId == Guid.Empty) {
treeView.Nodes.Add(node);
} else {
nodes[record.GroupId].Nodes.Add(node);
}
if (record.Id == selectedGuid) {
selectedNode = node;
}
}
SortTreeAndSelectNode(selectedNode);
foreach (TreeNode node in nodes.Values) {
if (dataSource.ExpandedNodes.Contains(((IRecord)node.Tag).Id)) {
node.Expand(); node.Expand();
} }
} }
toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}*/ // Remove controls if selected node has been deleted
if (!flattenedTree.ContainsKey(selectedGuid)) {
SortTreeAndSelectNode(null);
}
// Restart timer
toolStripStatusLabel.Text = String.Format("Last data source refresh: {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
toolStripStatusFailedFlag.Text = String.Empty;
if (restartTimer) {
timerDataSourceRefresh.Stop();
timerDataSourceRefresh.Start();
}
// Delete expanded nodes which no longer exist
HashSet<Guid> removeFromExpandedNodes = new HashSet<Guid>();
foreach (Guid recordId in dataSource.ExpandedNodes) {
if (!flattenedTree.ContainsKey(recordId)) {
removeFromExpandedNodes.Add(recordId);
}
}
foreach (Guid recordId in removeFromExpandedNodes) {
dataSource.ExpandedNodes.Remove(recordId);
}
// Save expanded nodes
Config.Save();
}
private TreeNode CreateTreeNodeFromRecord(IRecord record) { private TreeNode CreateTreeNodeFromRecord(IRecord record) {
string imageKey = record.GetType().FullName; string imageKey = record.GetType().FullName;
@ -191,6 +257,9 @@ namespace RCM {
} }
private void SortTreeAndSelectNode(TreeNode node) { private void SortTreeAndSelectNode(TreeNode node) {
/*if (node == null) {
return;
}*/
treeView.Sort(); treeView.Sort();
if (treeView.SelectedNode == node) { if (treeView.SelectedNode == node) {
ChangeSelectedRecord(); ChangeSelectedRecord();
@ -253,7 +322,11 @@ namespace RCM {
} }
private void TreeView_KeyDown(object sender, KeyEventArgs e) { private void TreeView_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Delete) { if (e.KeyCode == Keys.Return) {
if (treeView.SelectedNode != null) {
RunDefaultNodeAction(treeView.SelectedNode);
}
} else if (e.KeyCode == Keys.Delete) {
if (treeView.SelectedNode != null) { if (treeView.SelectedNode != null) {
DeleteSelectedNode(); DeleteSelectedNode();
} }
@ -262,18 +335,22 @@ namespace RCM {
treeView.SelectedNode.BeginEdit(); treeView.SelectedNode.BeginEdit();
} }
} else if (e.KeyCode == Keys.F5) { } else if (e.KeyCode == Keys.F5) {
ReloadDataSource(); ReloadTreeView(true);
} }
} }
private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { private void RunDefaultNodeAction(TreeNode node) {
IAction[] actions = ((IRecord)e.Node.Tag).GetActions(); IAction[] actions = ((IRecord)node.Tag).GetActions();
if (actions.Length == 0) { if (actions.Length == 0) {
return; return;
} }
actions[0].Run(); actions[0].Run();
} }
private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
RunDefaultNodeAction(e.Node);
}
private void ChangeSelectedRecord() { private void ChangeSelectedRecord() {
bool isSelected = treeView.SelectedNode != null; bool isSelected = treeView.SelectedNode != null;
textBoxTitle.Enabled = isSelected; textBoxTitle.Enabled = isSelected;
@ -291,6 +368,8 @@ namespace RCM {
} }
if (treeView.SelectedNode != null) { if (treeView.SelectedNode != null) {
IRecord record = (IRecord)treeView.SelectedNode.Tag; IRecord record = (IRecord)treeView.SelectedNode.Tag;
// Prevent refresh of currently selected node (which is possibly being edited)
//if (record.Id == panelRecord.
textBoxTitle.Text = record.Title; textBoxTitle.Text = record.Title;
RebuildGroupCombobox(record); RebuildGroupCombobox(record);
panelRecord.Controls.Add(record.GetControl()); panelRecord.Controls.Add(record.GetControl());
@ -315,9 +394,10 @@ namespace RCM {
record.Title = e.Label; record.Title = e.Label;
try { try {
((IDataSource)comboBoxDatabase.SelectedItem).Update(record); ((IDataSource)comboBoxDatabase.SelectedItem).Update(record);
BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node });
} catch { } catch {
MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
} else { } else {
e.CancelEdit = true; e.CancelEdit = true;
@ -335,7 +415,7 @@ namespace RCM {
try { try {
((IDataSource)comboBoxDatabase.SelectedItem).Update(record); ((IDataSource)comboBoxDatabase.SelectedItem).Update(record);
} catch { } catch {
MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
if (groupChanged) { if (groupChanged) {
@ -359,8 +439,8 @@ namespace RCM {
try { try {
TreeNode node = InsertNewRecord(record, parentNode); TreeNode node = InsertNewRecord(record, parentNode);
SortTreeAndSelectNode(node); SortTreeAndSelectNode(node);
} catch { } catch (Exception ex) {
MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ShowDataSourceException("Failed to insert record into data source.", ex);
} }
} }
@ -368,8 +448,8 @@ namespace RCM {
try { try {
TreeNode node = DuplicateRecord(treeView.SelectedNode, treeView.SelectedNode.Parent); TreeNode node = DuplicateRecord(treeView.SelectedNode, treeView.SelectedNode.Parent);
SortTreeAndSelectNode(node); SortTreeAndSelectNode(node);
} catch { } catch (Exception ex) {
MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ShowDataSourceException("Failed to insert record into data source.", ex);
} }
} }
@ -405,8 +485,8 @@ namespace RCM {
if (MessageBox.Show(message, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { if (MessageBox.Show(message, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) {
try { try {
((IDataSource)comboBoxDatabase.SelectedItem).Delete(record); ((IDataSource)comboBoxDatabase.SelectedItem).Delete(record);
} catch { } catch (Exception ex) {
MessageBox.Show("Failed to remove record from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ShowDataSourceException("Failed to remove record from data source.", ex);
return; return;
} }
treeView.SelectedNode.Remove(); treeView.SelectedNode.Remove();
@ -421,8 +501,18 @@ namespace RCM {
private ContextMenuStrip GetNewRecordContextMenu() { private ContextMenuStrip GetNewRecordContextMenu() {
ContextMenuStrip menu = new ContextMenuStrip(); ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem menuItemNew = new ToolStripMenuItem("New item"); ToolStripMenuItem menuItemNew = new ToolStripMenuItem("New item");
// Add group as the first type
Type groupType = typeof(Group);
ToolStripMenuItem groupItem = new ToolStripMenuItem(groupType.GetDisplayName()) { Tag = groupType, Image = Config.IconList.Images[groupType.FullName] };
groupItem.Click += NewRecordContextMenuItem_Click;
menuItemNew.DropDownItems.Add(groupItem);
menuItemNew.DropDownItems.Add(new ToolStripSeparator());
// Add all the rest
foreach (Type type in Config.RecordTypes) { foreach (Type type in Config.RecordTypes) {
ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type }; if (type == groupType) {
continue;
}
ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] };
item.Click += NewRecordContextMenuItem_Click; item.Click += NewRecordContextMenuItem_Click;
menuItemNew.DropDownItems.Add(item); menuItemNew.DropDownItems.Add(item);
} }
@ -459,5 +549,13 @@ namespace RCM {
((IAction)((ToolStripMenuItem)sender).Tag).Run(); ((IAction)((ToolStripMenuItem)sender).Tag).Run();
} }
#endregion #endregion
/*private void button1_Click(object sender, EventArgs e) {
List<IRecord> records = Importer.GetRecordsFromRDM();
IDataSource dataSource = ((IDataSource)comboBoxDatabase.SelectedItem);
foreach (IRecord record in records) {
dataSource.Insert(record);
}
}*/
} }
} }

View File

@ -123,7 +123,938 @@
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>201, 17</value> <value>201, 17</value>
</metadata> </metadata>
<metadata name="notifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>310, 17</value>
</metadata>
<metadata name="contextMenuNotifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>416, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="notifyIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA
BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ
AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm
AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA
AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP//////////
/////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
//////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
/wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
/wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
/wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
/wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
//////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
/gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
//////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
/xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
/4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
/v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
/v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
//+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
/P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho
aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ
Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7
+/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA
AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
/v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
//8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
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
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>39</value> <value>39</value>
</metadata> </metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA
BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ
AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm
AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA
AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP//////////
/////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
//////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
/wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
/wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
/wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
/wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
//////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
/gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
//////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
/xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
/4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
/v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
/v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
//+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
/P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho
aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ
Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAEAAABCAAAA8AAAAP4TExP+29vb//7+/v7+/v7+7e3t/wICAv4AAADaAAAAEQAA
ADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAADGAAAA/hISEv7FxcX+/v7+//7+/v77+/v+ZGRk/wAA
AP4AAAC5AAAACgAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD0AAAAJAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAAMgAAAD+ERER/8jIyP/+/v7//v7+//r6
+v9nZ2f/AAAA/wAAAPIAAABaAAAAAQAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAADzAAAAJAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAxgAAAP4SEhL+xsbG//7+
/v7+/v7++/v7/2dnZ/4AAAD+AAAA9wAAAHsAAAAMAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJ
Cf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADGAAAA/hER
Ef7Gxsb+/v7+//7+/v77+/v+aGho/wAAAP4AAAD4AAAAgAAAAA4AAAAAAAAAAAAAADYAAAD9CAgI//f3
9//+/v7/9PT0/wkJCf8AAAD0AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAA
ALEAAAD+ERER/8nJyf/+/v7//v7+//r6+v9mZmb/AAAA/wAAAP8AAADvAAAAkgAAADkAAAAHAAAAAAAA
ADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAPgAAAPYQEBD+xsbG//7+/v7+/v7++/v7/2ZmZv4AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AOEAAABSAAAAAQAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAP50dHT+/v7+//7+/v77+/v+Z2dn/wAAAP4AAAD+AAAA/1NT
U/6zs7P+UlJS/wAAAP4AAAC1AAAACgAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD0AAAAJAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAP5MTEz/+vr6//n5+f9lZWX/AAAA/wAA
AP8AAAD/X19f//r6+v/+/v7/7e3t/wMDA/8AAADaAAAAEQAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJ
Cf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAN8AAAD+Li4u/ysr
K/4AAAD+AAAA/gAAAP5gYGD++Pj4//7+/v7+/v7+wMDA/wAAAP4AAADQAAAADwAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAA
AFwAAADQAAAA+QAAAP4AAAD+AAAA/15eXv74+Pj+/v7+//7+/v7Ly8v+FhYW/wAAAP4AAACSAAAABQAA
ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD0AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAAAnAAAAqAAAAP8AAAD/Xl5e//r6+v/+/v7//v7+/8vLy/8VFRX/AAAA/gAA
AMUAAAApAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAB1AAAA9AAAAP5fX1/++Pj4//7+/v7+/v7+y8vL/xUV
Ff4AAAD+AAAAygAAADIAAAABAAAAAAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAADzAAAAJAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAGoAAADzAAAA/15eXv/5+fn//v7+//7+
/v/MzMz/FhYW/wAAAP4AAADKAAAAMwAAAAEAAAAAAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJ
Cf8AAAD0AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7
+/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3
9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA
AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
/v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
//8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
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
</value>
</data>
</root> </root>

View File

@ -1,9 +1,9 @@
using Newtonsoft.Json.Linq; using System;
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
namespace RCM { namespace RCM {
@ -13,9 +13,30 @@ namespace RCM {
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
string mutexId = string.Format("Local\\{{{0}}}", appGuid);
using (Mutex mutex = new Mutex(false, mutexId)) {
bool hasHandle = false;
try {
try {
hasHandle = mutex.WaitOne(0, false);
if (hasHandle == false) {
MessageBox.Show("An instance of the application is already running", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
} catch (AbandonedMutexException) {
hasHandle = true;
}
Config.LoadModules(); Config.LoadModules();
Config.LoadConfiguration(); Config.LoadConfiguration();
Application.Run(new MainForm()); Application.Run(new MainForm());
} finally {
if (hasHandle) {
mutex.ReleaseMutex();
}
}
}
} }
} }
} }

BIN
RCM/Program.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -54,16 +54,20 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit> <Prefer32Bit>true</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Program.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="CredentialManagement, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Google.Protobuf">
<HintPath>..\packages\CredentialManagement.1.0.2\lib\net35\CredentialManagement.dll</HintPath> <HintPath>..\packages\Google.Protobuf.3.10.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="MySql.Data, Version=8.0.16.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> <Reference Include="Microsoft.VisualBasic" />
<HintPath>..\packages\MySql.Data.8.0.16\lib\net452\MySql.Data.dll</HintPath> <Reference Include="MySql.Data, Version=8.0.15.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
@ -71,7 +75,8 @@
<HintPath>..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net46\System.Data.SQLite.dll</HintPath> <HintPath>..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net46\System.Data.SQLite.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Management" /> <Reference Include="System.Drawing.Design" />
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -96,9 +101,17 @@
<Compile Include="DataSource\SQLite\SQLiteControl.Designer.cs"> <Compile Include="DataSource\SQLite\SQLiteControl.Designer.cs">
<DependentUpon>SQLiteControl.cs</DependentUpon> <DependentUpon>SQLiteControl.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="ZZImporter.cs" />
<Compile Include="Record\RDP\RDP.cs" /> <Compile Include="Record\RDP\RDP.cs" />
<Compile Include="Record\RDP\RDPAction.cs" /> <Compile Include="Record\RDP\RDPAction.cs" />
<Compile Include="Record\RDP\SMBAction.cs" /> <Compile Include="Record\RDP\SMBAction.cs" />
<Compile Include="Record\RDP\RDPConfigControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Record\RDP\RDPConfigControl.Designer.cs">
<DependentUpon>RDPConfigControl.cs</DependentUpon>
</Compile>
<Compile Include="Record\RDP\RDPConfig.cs" />
<Compile Include="Record\SSH\SCPAction.cs" /> <Compile Include="Record\SSH\SCPAction.cs" />
<Compile Include="Record\SSH\SSH.cs" /> <Compile Include="Record\SSH\SSH.cs" />
<Compile Include="Record\SSH\SSHAction.cs" /> <Compile Include="Record\SSH\SSHAction.cs" />
@ -137,10 +150,16 @@
<DependentUpon>MySQL.cs</DependentUpon> <DependentUpon>MySQL.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="DataSource\MySQL\MySQLControl.resx">
<DependentUpon>MySQLControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="DataSource\SQLite\SQLite.resx"> <EmbeddedResource Include="DataSource\SQLite\SQLite.resx">
<DependentUpon>SQLite.cs</DependentUpon> <DependentUpon>SQLite.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="DataSource\SQLite\SQLiteControl.resx">
<DependentUpon>SQLiteControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx"> <EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@ -191,10 +210,16 @@
<DependentUpon>RDP.cs</DependentUpon> <DependentUpon>RDP.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Record\RDP\RDPConfigControl.resx">
<DependentUpon>RDPConfigControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Record\SSH\SSH.resx"> <EmbeddedResource Include="Record\SSH\SSH.resx">
<DependentUpon>SSH.cs</DependentUpon> <DependentUpon>SSH.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Record\SSH\SSHConfigControl.resx">
<DependentUpon>SSHConfigControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Record\WebSite\WebSite.resx"> <EmbeddedResource Include="Record\WebSite\WebSite.resx">
<DependentUpon>WebSite.cs</DependentUpon> <DependentUpon>WebSite.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
@ -215,9 +240,12 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" />
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup>
<Content Include="Program.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.110.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.110.0\build\net46\System.Data.SQLite.Core.targets')" /> <Import Project="..\packages\System.Data.SQLite.Core.1.0.110.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.110.0\build\net46\System.Data.SQLite.Core.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

View File

@ -1,10 +1,5 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using System.Diagnostics;
using CredentialManagement;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace RCM { namespace RCM {
[Serializable] [Serializable]

View File

@ -1,20 +1,22 @@
using CredentialManagement; using System;
using System; using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM { namespace RCM {
[DisplayName("Start Remote Desktop")] [@DisplayName("Start Remote Desktop")]
public class RDPAction : IAction { public class RDPAction : IAction {
private RDP _rdp; private RDP _rdp;
private RDPConfig _config;
public RDPAction(RDP rdp) { public RDPAction(RDP rdp) {
_rdp = rdp; _rdp = rdp;
_config = (RDPConfig)Config.ConfigSections[typeof(RDPConfig)];
} }
public async void Run() { public async void Run() {
@ -27,29 +29,104 @@ namespace RCM {
}); });
} }
private void RunWin() { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
string[] host = _rdp.Host.Split(new char[] { ':' }); private struct DATA_BLOB {
string[] username = _rdp.Username.Split(new char[] { '\\' }); public int cbData;
public IntPtr pbData;
}
[DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool CryptProtectData(ref DATA_BLOB pDataIn, string szDataDescr, IntPtr pOptionalEntropy, IntPtr pvReserved, IntPtr pPromptStruct, int dwFlags, ref DATA_BLOB pDataOut);
public static string EncryptPassword(string plainText) {
if (plainText == null) {
plainText = String.Empty;
}
byte[] plainBytes = Encoding.Unicode.GetBytes(plainText);
DATA_BLOB plainBlob = new DATA_BLOB();
DATA_BLOB cipherBlob = new DATA_BLOB();
try {
plainBlob.pbData = Marshal.AllocHGlobal(plainBytes.Length);
if (plainBlob.pbData == IntPtr.Zero) {
throw new Exception("Plaintext DATA_BLOB allocation exception");
}
plainBlob.cbData = plainBytes.Length;
Marshal.Copy(plainBytes, 0, plainBlob.pbData, plainBytes.Length);
bool result = CryptProtectData(ref plainBlob, String.Empty, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 1, ref cipherBlob);
if (!result) {
throw new Exception("CryptProtectData exception", new Win32Exception(Marshal.GetLastWin32Error()));
}
byte[] cipherBytes = new byte[cipherBlob.cbData];
Marshal.Copy(cipherBlob.pbData, cipherBytes, 0, cipherBlob.cbData);
return BitConverter.ToString(cipherBytes).Replace("-", "");
} catch (Exception ex) {
throw new Exception("DPAPI encryption exception", ex);
} finally {
if (plainBlob.pbData != IntPtr.Zero) {
Marshal.FreeHGlobal(plainBlob.pbData);
}
if (cipherBlob.pbData != IntPtr.Zero) {
Marshal.FreeHGlobal(cipherBlob.pbData);
}
}
}
private string CreateRdpFile() {
string domain = null;
string username;
string[] splitname = _rdp.Username.Split("\\".ToCharArray());
if (splitname.Length == 2) {
domain = splitname[0];
username = splitname[1];
} else {
username = _rdp.Username;
}
string rdpName = string.Format("{0}.{1}", _rdp.Title, Guid.NewGuid().ToString());
foreach (var c in Path.GetInvalidFileNameChars()) {
rdpName = rdpName.Replace(c, '_');
}
string rdpFile = Path.Combine(Path.GetTempPath(), string.Format("{0}.rdp", rdpName));
// https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff393699(v%3dws.10) // https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff393699(v%3dws.10)
string rdpFile = Path.GetTempPath() + Guid.NewGuid().ToString() + ".rdp";
using (StreamWriter sw = new StreamWriter(rdpFile)) { using (StreamWriter sw = new StreamWriter(rdpFile)) {
sw.Write("drivestoredirect:s:*\r\nredirectprinters:i:0\r\nredirectcomports:i:0\r\nredirectsmartcards:i:0\r\nredirectposdevices:i:0\r\nnetworkautodetect:i:0\r\nauthentication level:i:0\r\nprompt for credentials:i:0\r\nnegotiate security layer:i:1\r\npromptcredentialonce:i:0\r\nsmart sizing:i:0\r\nuse multimon:i:0\r\nbandwidthautodetect:i:1\r\n"); sw.Write("drivestoredirect:s:*\r\nredirectprinters:i:0\r\nredirectcomports:i:0\r\nredirectsmartcards:i:0\r\nredirectposdevices:i:0\r\nnetworkautodetect:i:0\r\nauthentication level:i:0\r\nprompt for credentials:i:0\r\nnegotiate security layer:i:1\r\npromptcredentialonce:i:0\r\nsmart sizing:i:0\r\nuse multimon:i:0\r\nbandwidthautodetect:i:1\r\n");
sw.Write(string.Format("full address:s:{0}\r\n", _rdp.Host)); sw.Write(string.Format("full address:s:{0}\r\n", _rdp.Host));
sw.Write(string.Format("username:s:{0}\r\n", _rdp.Username)); sw.Write(string.Format("username:s:{0}\r\n", username));
if (username.Length == 2) { if (!string.IsNullOrEmpty(domain)) {
sw.Write(string.Format("domain:s:{0}\r\n", username[0])); sw.Write(string.Format("domain:s:{0}\r\n", domain));
}
if (Environment.OSVersion.Platform == PlatformID.Unix) {
sw.Write(string.Format("password:s:{0}\r\n", _rdp.Password));
} else {
sw.Write(string.Format("password 51:b:{0}\r\n", EncryptPassword(_rdp.Password)));
} }
} }
Credential credential = new Credential(_rdp.Username, _rdp.Password, string.Format("TERMSRV/{0}", host[0])); return rdpFile;
credential.Save(); }
Process p = Process.Start("mstsc", string.Format("\"{0}\"", rdpFile));
private void RunWin() {
string rdpFile = CreateRdpFile();
Process.Start("mstsc", string.Format("\"{0}\"", rdpFile));
Thread.Sleep(1000); Thread.Sleep(1000);
File.Delete(rdpFile); File.Delete(rdpFile);
} }
private void RunUnix() { private void RunUnix() {
// TODO string rdpFile = CreateRdpFile();
string[] cmd = _config.LinuxRDPCommand.Replace("$RDP", rdpFile).Split(" ".ToCharArray(), 2);
if (cmd.Length == 0) {
MessageBox.Show("No RDP command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else if (cmd.Length == 1) {
Process.Start(cmd[0]);
} else {
Process.Start(cmd[0], cmd[1]);
}
Thread.Sleep(1000);
File.Delete(rdpFile);
} }
} }
} }

View File

@ -0,0 +1,23 @@
using System;
using System.Windows.Forms;
namespace RCM {
[DisplayName("RDP")]
[Serializable]
public class RDPConfig : IConfigSection {
public string LinuxRDPCommand { get; set; }
[NonSerialized]
private RDPConfigControl _control;
public UserControl GetControl() {
if (_control == null || _control.IsDisposed) {
_control = new RDPConfigControl(this);
}
return _control;
}
public void UpdateFromControl() {
LinuxRDPCommand = _control.textBoxLinuxRDPCommand.Text;
}
}
}

View File

@ -0,0 +1,89 @@
namespace RCM {
partial class RDPConfigControl {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.labelLinuxRDPCommandHelp = new System.Windows.Forms.Label();
this.textBoxLinuxRDPCommand = new System.Windows.Forms.TextBox();
this.labelLinuxSSHCommand = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.labelLinuxRDPCommandHelp);
this.groupBox1.Controls.Add(this.textBoxLinuxRDPCommand);
this.groupBox1.Controls.Add(this.labelLinuxSSHCommand);
this.groupBox1.Location = new System.Drawing.Point(3, 6);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(487, 68);
this.groupBox1.TabIndex = 10;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Linux";
//
// labelLinuxRDPCommandHelp
//
this.labelLinuxRDPCommandHelp.AutoSize = true;
this.labelLinuxRDPCommandHelp.Location = new System.Drawing.Point(129, 42);
this.labelLinuxRDPCommandHelp.Name = "labelLinuxRDPCommandHelp";
this.labelLinuxRDPCommandHelp.Size = new System.Drawing.Size(194, 13);
this.labelLinuxRDPCommandHelp.TabIndex = 7;
this.labelLinuxRDPCommandHelp.Text = "Use $RDP to inject the path to RDP file";
//
// textBoxLinuxRDPCommand
//
this.textBoxLinuxRDPCommand.Location = new System.Drawing.Point(132, 19);
this.textBoxLinuxRDPCommand.Name = "textBoxLinuxRDPCommand";
this.textBoxLinuxRDPCommand.Size = new System.Drawing.Size(342, 20);
this.textBoxLinuxRDPCommand.TabIndex = 1;
//
// labelLinuxSSHCommand
//
this.labelLinuxSSHCommand.AutoSize = true;
this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22);
this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand";
this.labelLinuxSSHCommand.Size = new System.Drawing.Size(113, 13);
this.labelLinuxSSHCommand.TabIndex = 0;
this.labelLinuxSSHCommand.Text = "Command to run RDP:";
//
// RDPConfigControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.groupBox1);
this.Name = "RDPConfigControl";
this.Size = new System.Drawing.Size(499, 99);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label labelLinuxRDPCommandHelp;
public System.Windows.Forms.TextBox textBoxLinuxRDPCommand;
private System.Windows.Forms.Label labelLinuxSSHCommand;
}
}

View File

@ -0,0 +1,10 @@
using System.Windows.Forms;
namespace RCM {
public partial class RDPConfigControl : UserControl {
public RDPConfigControl(RDPConfig rdpConfig) {
InitializeComponent();
textBoxLinuxRDPCommand.Text = rdpConfig.LinuxRDPCommand;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,9 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Windows.Forms;
using System.Text;
using System.Threading.Tasks;
namespace RCM { namespace RCM {
[DisplayName("Browse via SMB")] [DisplayName("Browse via SMB")]
@ -15,12 +12,19 @@ namespace RCM {
} }
public void Run() { public void Run() {
string[] host = _rdp.Host.Split(new char[] { ':' }); string[] host = _rdp.Host.Split(":".ToCharArray());
if (Environment.OSVersion.Platform == PlatformID.Unix) { if (Environment.OSVersion.Platform == PlatformID.Unix) {
// TODO MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// TODO: Implement
} else { } else {
Process.Start("explorer.exe", string.Format("\\\\{0}", host[0])); // TODO: net use credentials? Process netUse = Process.Start("net", string.Format("use \\\\{0} \"/USER:{1}\" \"{2}\"", host[0], _rdp.Username, _rdp.Password));
netUse.WaitForExit();
if (netUse.ExitCode == 0) {
Process.Start("explorer.exe", string.Format("\\\\{0}", host[0]));
} else {
MessageBox.Show("Unable to open the SMB share path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} }
} }
} }

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
@ -36,11 +35,11 @@ namespace RCM {
MessageBox.Show("WinSCP path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("WinSCP path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) { if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) {
MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
if (string.IsNullOrWhiteSpace(_config.PageantPath)) { if (string.IsNullOrWhiteSpace(_config.PageantPath)) {
MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
@ -52,16 +51,23 @@ namespace RCM {
} }
StringBuilder scpParams = new StringBuilder(); StringBuilder scpParams = new StringBuilder();
if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
Process.Start(_config.PageantPath, _config.SSHKeys); StringBuilder pageantParams = new StringBuilder();
scpParams.Append(string.Format("/privatekey={0} ", _config.SSHKeys)); //TODO: Zvlada vic klicu? foreach (string sshKey in _config.SSHKeys) {
pageantParams.AppendFormat("\"{0}\" ", sshKey);
}
Process.Start(_config.PageantPath, pageantParams.ToString());
}
scpParams.AppendFormat("sftp://{0}@{1}", _ssh.Username, _ssh.Host);
if (!string.IsNullOrWhiteSpace(_ssh.Password)) {
scpParams.AppendFormat(" \"/password={0}\"", _ssh.Password);
} }
scpParams.AppendFormat("scp://{0}@{1}", _ssh.Username, _ssh.Host); // TODO: password?
Process.Start(_config.WinSCPPath, scpParams.ToString()); Process.Start(_config.WinSCPPath, scpParams.ToString());
} }
private void RunUnix() { private void RunUnix() {
// TOOD MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// TODO: Implement
} }
} }
} }

View File

@ -1,9 +1,4 @@
using System; using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace RCM { namespace RCM {

View File

@ -35,11 +35,11 @@ namespace RCM {
MessageBox.Show("PuTTY path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("PuTTY path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) { if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) {
MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
if (string.IsNullOrWhiteSpace(_config.PageantPath)) { if (string.IsNullOrWhiteSpace(_config.PageantPath)) {
MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
@ -50,23 +50,47 @@ namespace RCM {
} }
} }
string[] host = _ssh.Host.Split(new char[] { ':' }); string[] host = _ssh.Host.Split(":".ToCharArray());
StringBuilder puttyParams = new StringBuilder(); StringBuilder puttyParams = new StringBuilder();
if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
Process.Start(_config.PageantPath, _config.SSHKeys); StringBuilder pageantParams = new StringBuilder();
puttyParams.AppendFormat("-i {0} ", _config.SSHKeys); foreach (string sshKey in _config.SSHKeys) {
} else { pageantParams.AppendFormat("\"{0}\" ", sshKey);
}
Process.Start(_config.PageantPath, pageantParams.ToString());
}
if (!string.IsNullOrWhiteSpace(_ssh.Password)) {
puttyParams.AppendFormat("-pw {0} ", _ssh.Password); puttyParams.AppendFormat("-pw {0} ", _ssh.Password);
} }
if (host.Length > 1) { if (host.Length > 1) {
puttyParams.AppendFormat("-P {0} ", host[1]); puttyParams.AppendFormat("-P {0} ", host[1]);
} }
puttyParams.AppendFormat("{0}@{1}", _ssh.Username, host[0]); if (!string.IsNullOrWhiteSpace(_ssh.Username)) {
puttyParams.AppendFormat("{0}@", _ssh.Username);
}
puttyParams.Append(host[0]);
Process.Start(_config.PuttyPath, puttyParams.ToString()); Process.Start(_config.PuttyPath, puttyParams.ToString());
} }
private void RunUnix() { private void RunUnix() {
// TODO string[] host = _ssh.Host.Split(":".ToCharArray());
StringBuilder sshParams = new StringBuilder("ssh ");
if (host.Length > 1) {
sshParams.AppendFormat("-p {0} ", host[1]);
}
if (!string.IsNullOrWhiteSpace(_ssh.Username)) {
sshParams.AppendFormat("{0}@", _ssh.Username);
}
sshParams.Append(host[0]);
string[] cmd = _config.LinuxSSHCommand.Replace("$SSH", sshParams.ToString()).Split(" ".ToCharArray(), 2);
if (cmd.Length == 0) {
MessageBox.Show("No SSH command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else if (cmd.Length == 1) {
Process.Start(cmd[0]);
} else {
Process.Start(cmd[0], cmd[1]);
}
} }
} }
} }

View File

@ -1,18 +1,15 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace RCM { namespace RCM {
[DisplayName("SSH")] [DisplayName("SSH")]
[Serializable] [Serializable]
public class SSHConfig : IConfigSection { public class SSHConfig : IConfigSection {
public string SSHKeys { get; set; } public string[] SSHKeys { get; set; }
public string PuttyPath { get; set; } public string PuttyPath { get; set; }
public string PageantPath { get; set; } public string PageantPath { get; set; }
public string WinSCPPath { get; set; } public string WinSCPPath { get; set; }
public string LinuxSSHCommand { get; set; }
[NonSerialized] [NonSerialized]
private SSHConfigControl _control; private SSHConfigControl _control;
@ -24,10 +21,11 @@ namespace RCM {
} }
public void UpdateFromControl() { public void UpdateFromControl() {
SSHKeys = _control.textBoxSshKeys.Text; SSHKeys = _control.SSHKeys;
PuttyPath = _control.textBoxPutty.Text; PuttyPath = _control.textBoxPutty.Text;
PageantPath = _control.textBoxPageant.Text; PageantPath = _control.textBoxPageant.Text;
WinSCPPath = _control.textBoxWinSCP.Text; WinSCPPath = _control.textBoxWinSCP.Text;
LinuxSSHCommand = _control.textBoxLinuxSSHCommand.Text;
} }
} }
} }

View File

@ -25,6 +25,9 @@
private void InitializeComponent() { private void InitializeComponent() {
this.labelPutty = new System.Windows.Forms.Label(); this.labelPutty = new System.Windows.Forms.Label();
this.groupBoxWindows = new System.Windows.Forms.GroupBox(); this.groupBoxWindows = new System.Windows.Forms.GroupBox();
this.buttonSelectWinSCP = new System.Windows.Forms.Button();
this.textBoxWinSCP = new System.Windows.Forms.TextBox();
this.labelWinSCP = new System.Windows.Forms.Label();
this.buttonSelectPageant = new System.Windows.Forms.Button(); this.buttonSelectPageant = new System.Windows.Forms.Button();
this.buttonSelectPutty = new System.Windows.Forms.Button(); this.buttonSelectPutty = new System.Windows.Forms.Button();
this.textBoxPageant = new System.Windows.Forms.TextBox(); this.textBoxPageant = new System.Windows.Forms.TextBox();
@ -36,11 +39,13 @@
this.openFileDialogSshKeys = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogSshKeys = new System.Windows.Forms.OpenFileDialog();
this.openFileDialogPutty = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogPutty = new System.Windows.Forms.OpenFileDialog();
this.openFileDialogPageant = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogPageant = new System.Windows.Forms.OpenFileDialog();
this.buttonSelectWinSCP = new System.Windows.Forms.Button();
this.textBoxWinSCP = new System.Windows.Forms.TextBox();
this.labelWinSCP = new System.Windows.Forms.Label();
this.openFileDialogWinSCP = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogWinSCP = new System.Windows.Forms.OpenFileDialog();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.labelLinuxSSHCommandHelp = new System.Windows.Forms.Label();
this.textBoxLinuxSSHCommand = new System.Windows.Forms.TextBox();
this.labelLinuxSSHCommand = new System.Windows.Forms.Label();
this.groupBoxWindows.SuspendLayout(); this.groupBoxWindows.SuspendLayout();
this.groupBox1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// labelPutty // labelPutty
@ -55,27 +60,56 @@
// groupBoxWindows // groupBoxWindows
// //
this.groupBoxWindows.Controls.Add(this.buttonSelectWinSCP); this.groupBoxWindows.Controls.Add(this.buttonSelectWinSCP);
this.groupBoxWindows.Controls.Add(this.buttonSelectSshKeys);
this.groupBoxWindows.Controls.Add(this.textBoxWinSCP); this.groupBoxWindows.Controls.Add(this.textBoxWinSCP);
this.groupBoxWindows.Controls.Add(this.textBoxSshKeys);
this.groupBoxWindows.Controls.Add(this.labelWinSCP); this.groupBoxWindows.Controls.Add(this.labelWinSCP);
this.groupBoxWindows.Controls.Add(this.labelSshKey);
this.groupBoxWindows.Controls.Add(this.buttonSelectPageant); this.groupBoxWindows.Controls.Add(this.buttonSelectPageant);
this.groupBoxWindows.Controls.Add(this.buttonSelectPutty); this.groupBoxWindows.Controls.Add(this.buttonSelectPutty);
this.groupBoxWindows.Controls.Add(this.textBoxPageant); this.groupBoxWindows.Controls.Add(this.textBoxPageant);
this.groupBoxWindows.Controls.Add(this.textBoxPutty); this.groupBoxWindows.Controls.Add(this.textBoxPutty);
this.groupBoxWindows.Controls.Add(this.labelPageant); this.groupBoxWindows.Controls.Add(this.labelPageant);
this.groupBoxWindows.Controls.Add(this.labelPutty); this.groupBoxWindows.Controls.Add(this.labelPutty);
this.groupBoxWindows.Location = new System.Drawing.Point(3, 39); this.groupBoxWindows.Location = new System.Drawing.Point(3, 3);
this.groupBoxWindows.Name = "groupBoxWindows"; this.groupBoxWindows.Name = "groupBoxWindows";
this.groupBoxWindows.Size = new System.Drawing.Size(487, 108); this.groupBoxWindows.Size = new System.Drawing.Size(487, 130);
this.groupBoxWindows.TabIndex = 1; this.groupBoxWindows.TabIndex = 1;
this.groupBoxWindows.TabStop = false; this.groupBoxWindows.TabStop = false;
this.groupBoxWindows.Text = "Windows"; this.groupBoxWindows.Text = "Windows";
// //
// buttonSelectWinSCP
//
this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70);
this.buttonSelectWinSCP.Name = "buttonSelectWinSCP";
this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22);
this.buttonSelectWinSCP.TabIndex = 6;
this.buttonSelectWinSCP.Text = "⋯";
this.buttonSelectWinSCP.UseVisualStyleBackColor = true;
this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click);
//
// textBoxWinSCP
//
this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71);
this.textBoxWinSCP.Name = "textBoxWinSCP";
this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20);
this.textBoxWinSCP.TabIndex = 5;
//
// labelWinSCP
//
this.labelWinSCP.AutoSize = true;
this.labelWinSCP.Location = new System.Drawing.Point(19, 74);
this.labelWinSCP.Name = "labelWinSCP";
this.labelWinSCP.Size = new System.Drawing.Size(107, 13);
this.labelWinSCP.TabIndex = 7;
this.labelWinSCP.Text = "Path to WinSCP.exe:";
//
// buttonSelectPageant // buttonSelectPageant
// //
this.buttonSelectPageant.Location = new System.Drawing.Point(452, 44); this.buttonSelectPageant.Location = new System.Drawing.Point(452, 44);
this.buttonSelectPageant.Name = "buttonSelectPageant"; this.buttonSelectPageant.Name = "buttonSelectPageant";
this.buttonSelectPageant.Size = new System.Drawing.Size(22, 22); this.buttonSelectPageant.Size = new System.Drawing.Size(22, 22);
this.buttonSelectPageant.TabIndex = 6; this.buttonSelectPageant.TabIndex = 4;
this.buttonSelectPageant.Text = "⋯"; this.buttonSelectPageant.Text = "⋯";
this.buttonSelectPageant.UseVisualStyleBackColor = true; this.buttonSelectPageant.UseVisualStyleBackColor = true;
this.buttonSelectPageant.Click += new System.EventHandler(this.ButtonSelectPageant_Click); this.buttonSelectPageant.Click += new System.EventHandler(this.ButtonSelectPageant_Click);
@ -85,7 +119,7 @@
this.buttonSelectPutty.Location = new System.Drawing.Point(452, 18); this.buttonSelectPutty.Location = new System.Drawing.Point(452, 18);
this.buttonSelectPutty.Name = "buttonSelectPutty"; this.buttonSelectPutty.Name = "buttonSelectPutty";
this.buttonSelectPutty.Size = new System.Drawing.Size(22, 22); this.buttonSelectPutty.Size = new System.Drawing.Size(22, 22);
this.buttonSelectPutty.TabIndex = 6; this.buttonSelectPutty.TabIndex = 2;
this.buttonSelectPutty.Text = "⋯"; this.buttonSelectPutty.Text = "⋯";
this.buttonSelectPutty.UseVisualStyleBackColor = true; this.buttonSelectPutty.UseVisualStyleBackColor = true;
this.buttonSelectPutty.Click += new System.EventHandler(this.ButtonSelectPutty_Click); this.buttonSelectPutty.Click += new System.EventHandler(this.ButtonSelectPutty_Click);
@ -102,7 +136,7 @@
this.textBoxPutty.Location = new System.Drawing.Point(132, 19); this.textBoxPutty.Location = new System.Drawing.Point(132, 19);
this.textBoxPutty.Name = "textBoxPutty"; this.textBoxPutty.Name = "textBoxPutty";
this.textBoxPutty.Size = new System.Drawing.Size(314, 20); this.textBoxPutty.Size = new System.Drawing.Size(314, 20);
this.textBoxPutty.TabIndex = 2; this.textBoxPutty.TabIndex = 1;
// //
// labelPageant // labelPageant
// //
@ -116,7 +150,7 @@
// labelSshKey // labelSshKey
// //
this.labelSshKey.AutoSize = true; this.labelSshKey.AutoSize = true;
this.labelSshKey.Location = new System.Drawing.Point(8, 10); this.labelSshKey.Location = new System.Drawing.Point(19, 100);
this.labelSshKey.Name = "labelSshKey"; this.labelSshKey.Name = "labelSshKey";
this.labelSshKey.Size = new System.Drawing.Size(99, 13); this.labelSshKey.Size = new System.Drawing.Size(99, 13);
this.labelSshKey.TabIndex = 4; this.labelSshKey.TabIndex = 4;
@ -124,24 +158,24 @@
// //
// textBoxSshKeys // textBoxSshKeys
// //
this.textBoxSshKeys.Location = new System.Drawing.Point(135, 7); this.textBoxSshKeys.Location = new System.Drawing.Point(132, 97);
this.textBoxSshKeys.Name = "textBoxSshKeys"; this.textBoxSshKeys.Name = "textBoxSshKeys";
this.textBoxSshKeys.Size = new System.Drawing.Size(314, 20); this.textBoxSshKeys.Size = new System.Drawing.Size(314, 20);
this.textBoxSshKeys.TabIndex = 4; this.textBoxSshKeys.TabIndex = 7;
// //
// buttonSelectSshKeys // buttonSelectSshKeys
// //
this.buttonSelectSshKeys.Location = new System.Drawing.Point(455, 6); this.buttonSelectSshKeys.Location = new System.Drawing.Point(452, 96);
this.buttonSelectSshKeys.Name = "buttonSelectSshKeys"; this.buttonSelectSshKeys.Name = "buttonSelectSshKeys";
this.buttonSelectSshKeys.Size = new System.Drawing.Size(22, 22); this.buttonSelectSshKeys.Size = new System.Drawing.Size(22, 22);
this.buttonSelectSshKeys.TabIndex = 5; this.buttonSelectSshKeys.TabIndex = 8;
this.buttonSelectSshKeys.Text = "⋯"; this.buttonSelectSshKeys.Text = "⋯";
this.buttonSelectSshKeys.UseVisualStyleBackColor = true; this.buttonSelectSshKeys.UseVisualStyleBackColor = true;
this.buttonSelectSshKeys.Click += new System.EventHandler(this.ButtonSelectSshKeys_Click); this.buttonSelectSshKeys.Click += new System.EventHandler(this.ButtonSelectSshKeys_Click);
// //
// openFileDialogSshKeys // openFileDialogSshKeys
// //
this.openFileDialogSshKeys.Filter = "OpenSSH keys (*.pub)|*.pub|PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*"; this.openFileDialogSshKeys.Filter = "PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*";
this.openFileDialogSshKeys.Multiselect = true; this.openFileDialogSshKeys.Multiselect = true;
// //
// openFileDialogPutty // openFileDialogPutty
@ -152,50 +186,60 @@
// //
this.openFileDialogPageant.Filter = "Pageant.exe|Pageant.exe"; this.openFileDialogPageant.Filter = "Pageant.exe|Pageant.exe";
// //
// buttonSelectWinSCP
//
this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70);
this.buttonSelectWinSCP.Name = "buttonSelectWinSCP";
this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22);
this.buttonSelectWinSCP.TabIndex = 9;
this.buttonSelectWinSCP.Text = "⋯";
this.buttonSelectWinSCP.UseVisualStyleBackColor = true;
this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click);
//
// textBoxWinSCP
//
this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71);
this.textBoxWinSCP.Name = "textBoxWinSCP";
this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20);
this.textBoxWinSCP.TabIndex = 8;
//
// labelWinSCP
//
this.labelWinSCP.AutoSize = true;
this.labelWinSCP.Location = new System.Drawing.Point(19, 74);
this.labelWinSCP.Name = "labelWinSCP";
this.labelWinSCP.Size = new System.Drawing.Size(107, 13);
this.labelWinSCP.TabIndex = 7;
this.labelWinSCP.Text = "Path to WinSCP.exe:";
//
// openFileDialogWinSCP // openFileDialogWinSCP
// //
this.openFileDialogWinSCP.Filter = "WinSCP.exe|WinSCP.exe"; this.openFileDialogWinSCP.Filter = "WinSCP.exe|WinSCP.exe";
// //
// groupBox1
//
this.groupBox1.Controls.Add(this.labelLinuxSSHCommandHelp);
this.groupBox1.Controls.Add(this.textBoxLinuxSSHCommand);
this.groupBox1.Controls.Add(this.labelLinuxSSHCommand);
this.groupBox1.Location = new System.Drawing.Point(3, 139);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(487, 68);
this.groupBox1.TabIndex = 10;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Linux";
//
// labelLinuxSSHCommandHelp
//
this.labelLinuxSSHCommandHelp.AutoSize = true;
this.labelLinuxSSHCommandHelp.Location = new System.Drawing.Point(129, 42);
this.labelLinuxSSHCommandHelp.Name = "labelLinuxSSHCommandHelp";
this.labelLinuxSSHCommandHelp.Size = new System.Drawing.Size(189, 13);
this.labelLinuxSSHCommandHelp.TabIndex = 7;
this.labelLinuxSSHCommandHelp.Text = "Use $SSH to inject the SSH command";
//
// textBoxLinuxSSHCommand
//
this.textBoxLinuxSSHCommand.Location = new System.Drawing.Point(132, 19);
this.textBoxLinuxSSHCommand.Name = "textBoxLinuxSSHCommand";
this.textBoxLinuxSSHCommand.Size = new System.Drawing.Size(342, 20);
this.textBoxLinuxSSHCommand.TabIndex = 9;
//
// labelLinuxSSHCommand
//
this.labelLinuxSSHCommand.AutoSize = true;
this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22);
this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand";
this.labelLinuxSSHCommand.Size = new System.Drawing.Size(112, 13);
this.labelLinuxSSHCommand.TabIndex = 0;
this.labelLinuxSSHCommand.Text = "Command to run SSH:";
//
// SSHConfigControl // SSHConfigControl
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.buttonSelectSshKeys); this.Controls.Add(this.groupBox1);
this.Controls.Add(this.textBoxSshKeys);
this.Controls.Add(this.labelSshKey);
this.Controls.Add(this.groupBoxWindows); this.Controls.Add(this.groupBoxWindows);
this.Name = "SSHConfigControl"; this.Name = "SSHConfigControl";
this.Size = new System.Drawing.Size(499, 172); this.Size = new System.Drawing.Size(499, 220);
this.groupBoxWindows.ResumeLayout(false); this.groupBoxWindows.ResumeLayout(false);
this.groupBoxWindows.PerformLayout(); this.groupBoxWindows.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout();
} }
@ -218,5 +262,9 @@
public System.Windows.Forms.TextBox textBoxWinSCP; public System.Windows.Forms.TextBox textBoxWinSCP;
private System.Windows.Forms.Label labelWinSCP; private System.Windows.Forms.Label labelWinSCP;
private System.Windows.Forms.OpenFileDialog openFileDialogWinSCP; private System.Windows.Forms.OpenFileDialog openFileDialogWinSCP;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label labelLinuxSSHCommandHelp;
public System.Windows.Forms.TextBox textBoxLinuxSSHCommand;
private System.Windows.Forms.Label labelLinuxSSHCommand;
} }
} }

View File

@ -3,15 +3,22 @@ using System.Windows.Forms;
namespace RCM { namespace RCM {
public partial class SSHConfigControl : UserControl { public partial class SSHConfigControl : UserControl {
public string[] SSHKeys { get; private set; }
public SSHConfigControl(SSHConfig sshConfig) { public SSHConfigControl(SSHConfig sshConfig) {
InitializeComponent(); InitializeComponent();
textBoxPutty.Text = sshConfig.PuttyPath; textBoxPutty.Text = sshConfig.PuttyPath;
textBoxPageant.Text = sshConfig.PageantPath; textBoxPageant.Text = sshConfig.PageantPath;
textBoxSshKeys.Text = sshConfig.SSHKeys; SSHKeys = sshConfig.SSHKeys;
if (SSHKeys != null) {
textBoxSshKeys.Text = string.Join(",", SSHKeys);
}
textBoxLinuxSSHCommand.Text = sshConfig.LinuxSSHCommand;
} }
private void ButtonSelectSshKeys_Click(object sender, EventArgs e) { private void ButtonSelectSshKeys_Click(object sender, EventArgs e) {
if (openFileDialogSshKeys.ShowDialog() == DialogResult.OK) { if (openFileDialogSshKeys.ShowDialog() == DialogResult.OK) {
SSHKeys = openFileDialogSshKeys.FileNames;
textBoxSshKeys.Text = string.Join(",", openFileDialogSshKeys.FileNames); textBoxSshKeys.Text = string.Join(",", openFileDialogSshKeys.FileNames);
} }
} }

View File

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="openFileDialogSshKeys.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="openFileDialogPutty.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>194, 17</value>
</metadata>
<metadata name="openFileDialogPageant.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>356, 17</value>
</metadata>
<metadata name="openFileDialogWinSCP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>534, 17</value>
</metadata>
</root>

View File

@ -1,8 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace RCM { namespace RCM {
@ -16,8 +13,13 @@ namespace RCM {
public async void Run() { public async void Run() {
await Task.Run(() => { await Task.Run(() => {
if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://")) if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://")) {
if (Environment.OSVersion.Platform == PlatformID.Unix) {
Process.Start("xdg-open", _website.URL);
} else {
Process.Start(_website.URL); // TODO: vyplnovat hesla Process.Start(_website.URL); // TODO: vyplnovat hesla
}
}
}); });
} }
} }

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Diagnostics;
using System.Windows.Forms; using System.Windows.Forms;
namespace RCM { namespace RCM {

View File

@ -5,6 +5,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM { namespace RCM {
[DisplayName("Start WinBox")] [DisplayName("Start WinBox")]
@ -19,6 +20,14 @@ namespace RCM {
public async void Run() { public async void Run() {
await Task.Run(() => { await Task.Run(() => {
if (string.IsNullOrWhiteSpace(_config.WinBoxPath)) {
MessageBox.Show("WinBox path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!File.Exists(_config.WinBoxPath)) {
MessageBox.Show("WinBox path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (Environment.OSVersion.Platform == PlatformID.Unix) { if (Environment.OSVersion.Platform == PlatformID.Unix) {
RunUnix(); RunUnix();
} else { } else {
@ -28,12 +37,12 @@ namespace RCM {
} }
private void RunWin() { private void RunWin() {
string winboxParam = string.Format("{0} \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password); string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password);
Process.Start(_config.WinBoxPath, winboxParam); Process.Start(_config.WinBoxPath, winboxParam);
} }
private void RunUnix() { private void RunUnix() {
string winboxParam = string.Format("{0} {1} \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password); string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password);
Process.Start("wine", winboxParam); Process.Start("wine", winboxParam);
} }
} }

View File

@ -34,7 +34,7 @@
this.buttonSelectWinBox.Location = new System.Drawing.Point(455, 6); this.buttonSelectWinBox.Location = new System.Drawing.Point(455, 6);
this.buttonSelectWinBox.Name = "buttonSelectWinBox"; this.buttonSelectWinBox.Name = "buttonSelectWinBox";
this.buttonSelectWinBox.Size = new System.Drawing.Size(22, 22); this.buttonSelectWinBox.Size = new System.Drawing.Size(22, 22);
this.buttonSelectWinBox.TabIndex = 9; this.buttonSelectWinBox.TabIndex = 2;
this.buttonSelectWinBox.Text = "⋯"; this.buttonSelectWinBox.Text = "⋯";
this.buttonSelectWinBox.UseVisualStyleBackColor = true; this.buttonSelectWinBox.UseVisualStyleBackColor = true;
this.buttonSelectWinBox.Click += new System.EventHandler(this.ButtonSelectWinBox_Click); this.buttonSelectWinBox.Click += new System.EventHandler(this.ButtonSelectWinBox_Click);
@ -44,7 +44,7 @@
this.textBoxWinBox.Location = new System.Drawing.Point(135, 7); this.textBoxWinBox.Location = new System.Drawing.Point(135, 7);
this.textBoxWinBox.Name = "textBoxWinBox"; this.textBoxWinBox.Name = "textBoxWinBox";
this.textBoxWinBox.Size = new System.Drawing.Size(314, 20); this.textBoxWinBox.Size = new System.Drawing.Size(314, 20);
this.textBoxWinBox.TabIndex = 8; this.textBoxWinBox.TabIndex = 1;
// //
// labelWinBox // labelWinBox
// //
@ -57,7 +57,7 @@
// //
// openFileDialogWinBox // openFileDialogWinBox
// //
this.openFileDialogWinBox.Filter = "WinBox.exe|WinBox.exe"; this.openFileDialogWinBox.Filter = "WinBox*.exe|WinBox*.exe";
// //
// WinBoxConfigControl // WinBoxConfigControl
// //

View File

@ -7,7 +7,7 @@ namespace RCM {
IRecord record1 = (IRecord)((TreeNode)o1).Tag; IRecord record1 = (IRecord)((TreeNode)o1).Tag;
IRecord record2 = (IRecord)((TreeNode)o2).Tag; IRecord record2 = (IRecord)((TreeNode)o2).Tag;
int result = 0; int result;
if (record1 is Group) { if (record1 is Group) {
if (record2 is Group) { if (record2 is Group) {

View File

@ -1,8 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RCM { namespace RCM {
public static class TypeExtensions { public static class TypeExtensions {

82
RCM/ZZImporter.cs Normal file
View File

@ -0,0 +1,82 @@
/*using Microsoft.VisualBasic.FileIO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM {
public static class Importer {
public static List<IRecord> GetRecordsFromRDM() {
Dictionary<string, Guid> groups = new Dictionary<string, Guid>();
List<IRecord> records = new List<IRecord>();
string previousGroup = null;
using (TextFieldParser parser = new TextFieldParser("EntryList.csv", Encoding.UTF8)) {
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.ReadFields(); // Skip headers
while (!parser.EndOfData) {
string[] fields = parser.ReadFields();
string type = fields[0];
string name = fields[3];
string group = fields[4];
string parent = fields[7];
string host = fields[8];
string port = fields[9];
string username = fields[10];
string domain = fields[11];
string password = fields[12];
string url = fields[14];
if (!string.IsNullOrWhiteSpace(parent)) {
// Naive identification of subconnections ownership
group = previousGroup;
}
if (!string.IsNullOrWhiteSpace(port)) {
host = string.Format("{0}:{1}", host, port);
}
if (!string.IsNullOrWhiteSpace(domain)) {
username = string.Format("{0}\\{1}", domain, username);
}
IRecord record = null;
if (type == "Folder" || type == "Site") {
string[] splitGroup = group.Split("\\".ToCharArray());
group = string.Join("\\", splitGroup.Take(splitGroup.Length - 1));
} else if (type == "Winbox") {
record = new WinBox() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
} else if (type == "Microsoft Remote Desktop (RDP)") {
record = new RDP() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
} else if (type == "Putty") {
record = new SSH() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
} else if (type == "Web Browser (http/https)") {
record = new WebSite() { Id = Guid.NewGuid(), Title = name, URL = url, Username = username, Password = password };
} else if (type == "FTP (Third Party)") {
// skip
} else {
MessageBox.Show(string.Format("Type: {0}, Title: {1}", type, name));
}
if (record != null) {
string[] splitGroup = group.Split("\\".ToCharArray());
for (int i = 0; i < splitGroup.Length; i++) {
string level = string.Join("\\", splitGroup.Take(i+1));
if (!groups.ContainsKey(level)) {
Group g = new Group() { Id = Guid.NewGuid(), Title = splitGroup[i], GroupId = i == 0 ? Guid.Empty : groups[string.Join("\\", splitGroup.Take(i))] };
records.Add(g);
groups.Add(level, g.Id);
}
}
record.GroupId = groups[group];
records.Add(record);
}
previousGroup = group;
}
}
return records;
}
}
}
*/

11
RCM/app.config Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.10.1.0" newVersion="3.10.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="BouncyCastle" version="1.8.3.1" targetFramework="net461" /> <package id="Google.Protobuf" version="3.10.1" targetFramework="net461" />
<package id="CredentialManagement" version="1.0.2" targetFramework="net461" /> <package id="MySql.Data" version="8.0.15" targetFramework="net461" />
<package id="Google.Protobuf" version="3.6.1" targetFramework="net461" /> <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
<package id="MySql.Data" version="8.0.16" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net461" />
<package id="System.Data.SQLite.Core" version="1.0.110.0" targetFramework="net461" /> <package id="System.Data.SQLite.Core" version="1.0.110.0" targetFramework="net461" />
</packages> </packages>

BIN
Resources/Program.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

4
mono.txt Normal file
View File

@ -0,0 +1,4 @@
apt-get install mono-runtime \
libmono-system-management4.0-cil \
libmono-system-runtime-serialization4.0-cil \
libmono-system-windows-forms4.0-cil