From 24c36acfe8e9ac00ec1f7fd75300104d6003b89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E5=82=91?= <840465812@qq.com> Date: Wed, 28 Apr 2021 21:33:58 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=AE=8C=E6=88=90=20UI=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=202.=20=E5=AE=8C=E6=88=90=20=E6=A0=B8=E5=BF=83=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=203.=20=E5=A2=9E=E5=8A=A0=20=E8=8B=A5=E6=97=A0?= =?UTF-8?q?=E7=83=AD=E9=94=AE=E5=88=99=E9=BB=98=E8=AE=A4=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E8=BA=AB=E5=94=A4=E5=87=BA=E7=83=AD=E9=94=AE=204.=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=BA=94=E7=94=A8=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=205.=20=E5=A2=9E=E5=8A=A0=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=9A=E8=BF=87=E6=89=98=E7=9B=98=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=98=BE=E7=A4=BA=E9=9A=90=E8=97=8F=EF=BC=8C?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E5=8C=96=E9=BB=98=E8=AE=A4=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KeyGo/AppControl.cs | 24 +- KeyGo/FormHotKey.Designer.cs | 1 + KeyGo/FormHotKey.cs | 57 ++- KeyGo/FormMain.Designer.cs | 53 ++- KeyGo/FormMain.cs | 140 ++++-- KeyGo/FormMain.resx | 572 +++++++++++++++++++++++++ KeyGo/HotKeyItem.cs | 6 +- KeyGo/KeyGo.cs | 101 ++++- KeyGo/KeyGo.csproj | 22 +- KeyGo/KeyGo.ico | Bin 0 -> 16749 bytes KeyGo/Program.cs | 23 +- KeyGo/Properties/Resources.Designer.cs | 105 +++-- KeyGo/Properties/Resources.resx | 29 +- KeyGo/Resources/ImgAdd.png | Bin 0 -> 528 bytes KeyGo/Resources/ImgDel.png | Bin 0 -> 716 bytes KeyGo/Resources/ImgDisable.png | Bin 0 -> 829 bytes KeyGo/Resources/ImgEnable.png | Bin 0 -> 760 bytes KeyGo/Resources/ImgSet.png | Bin 0 -> 750 bytes KeyGo/UCHotKeyItem.Designer.cs | 119 +++++ KeyGo/UCHotKeyItem.cs | 135 ++++++ KeyGo/UCHotKeyItem.resx | 120 ++++++ 21 files changed, 1385 insertions(+), 122 deletions(-) create mode 100644 KeyGo/KeyGo.ico create mode 100644 KeyGo/Resources/ImgAdd.png create mode 100644 KeyGo/Resources/ImgDel.png create mode 100644 KeyGo/Resources/ImgDisable.png create mode 100644 KeyGo/Resources/ImgEnable.png create mode 100644 KeyGo/Resources/ImgSet.png create mode 100644 KeyGo/UCHotKeyItem.Designer.cs create mode 100644 KeyGo/UCHotKeyItem.cs create mode 100644 KeyGo/UCHotKeyItem.resx diff --git a/KeyGo/AppControl.cs b/KeyGo/AppControl.cs index 03905b2..f91fa29 100644 --- a/KeyGo/AppControl.cs +++ b/KeyGo/AppControl.cs @@ -5,13 +5,13 @@ using System.Runtime.InteropServices; namespace KeyGo { - public class AppControl + public static class AppControl { /// /// 获取本应用程序当前正在运行的进程,若不存在则返回null /// /// 当前正在运行的进程 - private static Process GetCurrentRunningInstance() + public static Process GetCurrentRunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); @@ -36,21 +36,28 @@ namespace KeyGo /// 显示指定实例窗体 /// /// The instance. - private static void ShowWindow(Process instance) + public static void ShowWindow(Process instance) { if (instance != null && instance.MainWindowHandle != IntPtr.Zero) - ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Show); - //SetForegroundWindow(instance.MainWindowHandle); + { + ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.ShowNormal); + SetForegroundWindow(instance.MainWindowHandle); + } } /// /// 隐藏指定实例窗体 /// /// The instance. - public static void HideWindow(Process instance) + public static void MinimizeWindow(Process instance) { if (instance != null && instance.MainWindowHandle != IntPtr.Zero) - ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Hide); + ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Minimize); + } + + public static bool IsForegroundWindow(Process instance) + { + return GetForegroundWindow() == instance.MainWindowHandle; } private enum CmdShow : int @@ -139,5 +146,8 @@ namespace KeyGo [DllImport("User32.dll")] private static extern bool SetForegroundWindow(System.IntPtr hWnd); + + [DllImport("User32.dll")] + private static extern IntPtr GetForegroundWindow(); } } \ No newline at end of file diff --git a/KeyGo/FormHotKey.Designer.cs b/KeyGo/FormHotKey.Designer.cs index e29f853..56f23fb 100644 --- a/KeyGo/FormHotKey.Designer.cs +++ b/KeyGo/FormHotKey.Designer.cs @@ -175,6 +175,7 @@ namespace KeyGo this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "热键设置"; + this.Load += new System.EventHandler(this.FormHotKey_Load); this.ResumeLayout(false); this.PerformLayout(); diff --git a/KeyGo/FormHotKey.cs b/KeyGo/FormHotKey.cs index 8903464..bb1c4b4 100644 --- a/KeyGo/FormHotKey.cs +++ b/KeyGo/FormHotKey.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Windows.Forms; namespace KeyGo @@ -10,9 +11,53 @@ namespace KeyGo InitializeComponent(); } + public HotKeyItem HotKeyItem { get; set; } + private void FormHotKey_Load(object sender, EventArgs e) + { + if (HotKeyItem != null) + { + TxtProcessName.Text = HotKeyItem.ProcessName; + TxtStartupPath.Text = HotKeyItem.StartupPath; + TxtHotKey.Text = HotKeyItem.HotKey; + } + } + private void BtnAccept_Click(object sender, EventArgs e) { - DialogResult = DialogResult.OK; + if (string.IsNullOrWhiteSpace(TxtProcessName.Text)) + { + MessageBox.Show("请设置进程名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (!string.IsNullOrWhiteSpace(TxtStartupPath.Text) && !File.Exists(TxtStartupPath.Text)) + { + MessageBox.Show("请选择有效的启动路径", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(TxtHotKey.Text)) + { + MessageBox.Show("请设置快捷键", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + bool Modified = true; + + if (HotKeyItem == null) + HotKeyItem = new HotKeyItem(); + else + Modified = !(HotKeyItem.ProcessName == TxtProcessName.Text && HotKeyItem.StartupPath == TxtStartupPath.Text && HotKeyItem.HotKey == TxtHotKey.Text); + + if (Modified) + { + HotKeyItem.ProcessName = TxtProcessName.Text.Trim(); + HotKeyItem.StartupPath = TxtStartupPath.Text.Trim(); + HotKeyItem.HotKey = TxtHotKey.Text; + DialogResult = DialogResult.OK; + } + else + { + DialogResult = DialogResult.Cancel; + } } private void TxtHotKey_KeyDown(object sender, KeyEventArgs e) @@ -40,7 +85,14 @@ namespace KeyGo { var p = frm.SelectedItem; TxtProcessName.Text = p.ProcessName; - TxtStartupPath.Text = p.MainModule.FileName; + try + { + TxtStartupPath.Text = p.MainModule.FileName; + } + catch (Exception ex) + { + MessageBox.Show("无法获取进程的启动路径:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } } } @@ -58,5 +110,6 @@ namespace KeyGo TxtStartupPath.Text = frm.FileName; } } + } } \ No newline at end of file diff --git a/KeyGo/FormMain.Designer.cs b/KeyGo/FormMain.Designer.cs index 84d69a9..dd2d8bd 100644 --- a/KeyGo/FormMain.Designer.cs +++ b/KeyGo/FormMain.Designer.cs @@ -29,41 +29,70 @@ namespace KeyGo /// private void InitializeComponent() { - this.BtnTest = new System.Windows.Forms.Button(); + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); + this.FLPHotKeys = new System.Windows.Forms.FlowLayoutPanel(); + this.BtnAdd = new System.Windows.Forms.Button(); + this.NotifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.FLPHotKeys.SuspendLayout(); this.SuspendLayout(); // - // BtnTest + // FLPHotKeys // - this.BtnTest.Location = new System.Drawing.Point(155, 162); - this.BtnTest.Name = "BtnTest"; - this.BtnTest.Size = new System.Drawing.Size(193, 66); - this.BtnTest.TabIndex = 0; - this.BtnTest.Text = "Test"; - this.BtnTest.UseVisualStyleBackColor = true; - this.BtnTest.Click += new System.EventHandler(this.button1_Click); + this.FLPHotKeys.AutoScroll = true; + this.FLPHotKeys.BackColor = System.Drawing.Color.White; + this.FLPHotKeys.Controls.Add(this.BtnAdd); + this.FLPHotKeys.Dock = System.Windows.Forms.DockStyle.Fill; + this.FLPHotKeys.Location = new System.Drawing.Point(0, 0); + this.FLPHotKeys.Margin = new System.Windows.Forms.Padding(0); + this.FLPHotKeys.Name = "FLPHotKeys"; + this.FLPHotKeys.Padding = new System.Windows.Forms.Padding(3); + this.FLPHotKeys.Size = new System.Drawing.Size(488, 197); + this.FLPHotKeys.TabIndex = 0; + // + // BtnAdd + // + this.BtnAdd.Image = global::KeyGo.Properties.Resources.ImgAdd; + this.BtnAdd.Location = new System.Drawing.Point(6, 6); + this.BtnAdd.Name = "BtnAdd"; + this.BtnAdd.Size = new System.Drawing.Size(110, 90); + this.BtnAdd.TabIndex = 0; + this.BtnAdd.UseVisualStyleBackColor = true; + this.BtnAdd.Click += new System.EventHandler(this.BtnAdd_Click); + // + // NotifyIcon + // + this.NotifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIcon.Icon"))); + this.NotifyIcon.Visible = true; + this.NotifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseClick); // // FormMain // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(564, 390); - this.Controls.Add(this.BtnTest); + this.ClientSize = new System.Drawing.Size(488, 197); + this.Controls.Add(this.FLPHotKeys); this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.MaximizeBox = false; this.Name = "FormMain"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "KeyGo!"; + this.Deactivate += new System.EventHandler(this.FormMain_Deactivate); this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormMain_FormClosed); this.Load += new System.EventHandler(this.FormMain_Load); + this.FLPHotKeys.ResumeLayout(false); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.Button BtnTest; + private System.Windows.Forms.FlowLayoutPanel FLPHotKeys; + private System.Windows.Forms.Button BtnAdd; + private System.Windows.Forms.NotifyIcon NotifyIcon; } } diff --git a/KeyGo/FormMain.cs b/KeyGo/FormMain.cs index c861958..ae9a1f4 100644 --- a/KeyGo/FormMain.cs +++ b/KeyGo/FormMain.cs @@ -1,50 +1,63 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Diagnostics; -using System.Drawing; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; -using System.Xml.Serialization; namespace KeyGo { public partial class FormMain : Form { - static readonly string _DataFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KeyGo", "HotKey.xml"); - readonly KeyGo _KeyGo; - + private static readonly string _DataFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KeyGo", "HotKey.xml"); + private readonly KeyGo _KeyGo; + public FormMain() { InitializeComponent(); _KeyGo = LoadHotKeyItems(_DataFilePath); _KeyGo.FormHandle = Handle; + var p = Process.GetCurrentProcess(); + if (_KeyGo.Items.Count == 0) + { + _KeyGo.Items.Add(new HotKeyItem + { + ProcessName = p.ProcessName, + StartupPath = p.MainModule.FileName, + HotKey = "Ctrl+G", + }); + } _KeyGo.RegAllKey(); - } + FLPHotKeys.SuspendLayout(); + foreach (var item in _KeyGo.Items) + FLP_AddItem(item); + FLPHotKeys.ResumeLayout(); + } private void FormMain_Load(object sender, EventArgs e) { + Console.WriteLine(_DataFilePath); + } + private void FormMain_FormClosed(object sender, FormClosedEventArgs e) + { + _KeyGo.UnRegAllKey(); + SaveHotKeyItems(_KeyGo); } #region 数据文件IO private KeyGo LoadHotKeyItems(string xmlFilePath) { + KeyGo instance = null; try { - return KeyGo.LoadXml(xmlFilePath); + instance = KeyGo.LoadXml(xmlFilePath); } catch (Exception ex) { MessageBox.Show("载入数据文件异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - return new KeyGo(); + return instance ?? new KeyGo(); } private void SaveHotKeyItems(KeyGo data) @@ -59,27 +72,12 @@ namespace KeyGo } } - #endregion - - private void FormMain_FormClosed(object sender, FormClosedEventArgs e) - { - _KeyGo.UnRegAllKey(); - } - - - - - - - - - - - - + #endregion 数据文件IO #region 窗体消息 热键回调 + private const int WM_HOTKEY = 0x312; + protected override void WndProc(ref Message m) { base.WndProc(ref m); @@ -90,10 +88,10 @@ namespace KeyGo break; } } - #endregion + #endregion 窗体消息 热键回调 - private void button1_Click(object sender, EventArgs e) + private void BtnTest_Click(object sender, EventArgs e) { //_KeyGo.Items.Add(new HotKeyItem //{ @@ -108,5 +106,79 @@ namespace KeyGo //SaveHotKeyItems(_KeyGo); //new FormHotKey().ShowDialog(); } + + private void BtnAdd_Click(object sender, EventArgs e) + { + var frm = new FormHotKey(); + if (frm.ShowDialog() == DialogResult.OK) + { + try + { + var item = frm.HotKeyItem; + _KeyGo.AddHotKey(item); + FLP_AddItem(item); + SaveHotKeyItems(_KeyGo); + } + catch (Exception ex) + { + MessageBox.Show("在添加新的热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void FLP_AddItem(HotKeyItem item) + { + var ucitem = new UCHotKeyItem + { + KeyGo = _KeyGo, + HotKeyItem = item, + }; + // 值改变则保存 + ucitem.ValueChangedEvent += (s, e) => SaveHotKeyItems(_KeyGo); + + // 添加到最后 + FLPHotKeys.Controls.Add(ucitem); + + // 与添加按钮交换位置 + var i1 = FLPHotKeys.Controls.GetChildIndex(ucitem); + var i2 = FLPHotKeys.Controls.GetChildIndex(BtnAdd); + FLPHotKeys.Controls.SetChildIndex(ucitem, i2); + FLPHotKeys.Controls.SetChildIndex(BtnAdd, i1); + } + + private void NotifyIcon_MouseClick(object sender, MouseEventArgs e) + { + // 如果点击托盘图标 + + // 当前在前台则隐藏 + if (Visible) + { + Hide(); + } + else + { + // 否则,显示窗体 + Show(); + + // 如果最小化状态,则切出窗体 + if (WindowState == FormWindowState.Minimized) + { + WindowState = FormWindowState.Normal; + } + else + { + // 否则,激活窗体到最前端 + TopMost = true; + TopMost = false; + } + } + } + + private void FormMain_Deactivate(object sender, EventArgs e) + { + // 如果最小化,则隐藏窗体 + if (WindowState == FormWindowState.Minimized) + Hide(); + } } } \ No newline at end of file diff --git a/KeyGo/FormMain.resx b/KeyGo/FormMain.resx index 1af7de1..2358fcf 100644 --- a/KeyGo/FormMain.resx +++ b/KeyGo/FormMain.resx @@ -117,4 +117,576 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclxI/25YSwNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKt3JYTIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EwPblxNK25YS1NuWEv/blhL/25YS9NuXEpPblxIgAAAAAAAAAAAAAAAAAAAAANuXEhXblxJ525YS49uW + Ev/blhLo25YRewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkxAJ25YSY9uW + EtvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS6duXEj7blhIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cSBNuXEk7blhLU25YS/9uWEv/blhLz25cSk9uXEiEAAAAAAAAAAAAA + AAAAAAAA25cSFduWEnPblhLD25YSrNqWEUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMTBdqV + EhXblhIq25USVtuWErbblhL525YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJ025cSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEF3JYRUduWEtTblhL/25YS/9uW + EvLblxKT25cSIgAAAAAAAAAAAAAAAAAAAADalBMK2pUTK9uWEigAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIJ25YSKduWElXblhKC25YSrduWEuDblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSqtuXEh0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuW + EQbblhFV25YS1NuWEv/blhL/25YS8duXEpPblxIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblhEQ25YSTtuWEqnblhLq25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EsTblxIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pUSCNqVEljblhLU25YS/9uWEv/blhLw25cSlNuXEiQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIi25YSeduWEsvblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhK02pYSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalRIJ2pUSW9uWEtTblhL/25YS/9uW + Eu3clhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhEZ25YSi9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSpNuXERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQrblxFd25YS1duWEv/blhL13JYSoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxIR25YSbNuW + EubblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uXEpDblxIXAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pcSC9qXElvblhKw25YSrNuWE1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADdmREE25cSRduWEs7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blxF53JcREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalBMF2pUTI9uWEivbmxINAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cREtuWEnvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/3JcSft2XEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEibblhKj25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9yWEqPclhIcAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxI525YSzNuW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLb3JcTPd2Y + FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADclRII25YSXduWEu/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEpLblxIc3ZkRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiJFAHajBMI3JERENqS + EBnakxEh2pQTKdqUEjLalRI925URXtuVErPblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLm25YTcNuVEw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblREI25URQ9uW + Em3clhJ925USiNuVEpDblRKZ25USotuVEqrblhKz25YSvtuWEtfblhL425YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtrblhJY25YSCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIE25USOduWEsTblhLt25YS+9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YSy9qVEUTZlBEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YTDNuWEnfblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKy25cRLduXEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEhTblhKt25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS9tyWEpDfmRMV6KIXAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIQ25YSk9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhLo3JYSbdyXEgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA2pUTBNuVEzrblhLR25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEtralhFN2pYRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEM25YSbduWEvHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSsdiTExXRixcBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pYPAtuWESLblhKn25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EvDblhFb25YRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblhIG25YSQduWEtHblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS99qWEs7blhKb25YSctuWEoPblhKi25YS49uWEv3blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YSwN6YEx3gmRQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANyWEw7clhNx25YS89uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS2NuWEoTalhNE25USItyUEgvblxIU2pYRJtuW + ElfblhLE25YS+NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvbblhFq25YRBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADelhQC3JYSJtuWEqrblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS4NuWEmzclhMY4JkUAwAA + AAAAAAAAAAAAAAAAAADflRUG25YROduXEsvblhL825YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS0N2W + EyXelhQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQbblhJD25YS0tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS6tuW + EnXblhIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhJh25cS49uWEv7blhL/25YS/9uW + Ev/blhL/25YS/9uWEvvblxF425cRBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YSEduWEnbblhL125YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWErPclhEvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pQSEdyX + Ep3blhL025YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS396XER/flxABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyXEQPblxIq25YSrNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKI3JYTFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclxNm25YS6duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJW25YSAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pcTB9qW + EkXblhLS25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSZ9yWFAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URP9uWEuHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YRlduWEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblxIN2pYSX9uWEt7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uV + EnzbkxARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEVbblhLm25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uXEtvTkAwKv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZkRAdqWERXalhFr25YS2NuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blRKf2pUSJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADalhN925YS7tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL73JYTOtyWEwEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalg8C25YREduW + EkPblhKb25YS4duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS29uVEkvRixcDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADgmRQP2pYSt9uWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EoDblhICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclRMG3JUTG9uWETjblhFm25YSkNuXEpvblxKb25cSjNyXEmPblxJO2pYSZduW + EpjblhLY25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvvblhKq3JcSKwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25UTa9uWEuXblhL+25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhPM25YTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclQ4C25UQDNuWERfblxIa25cSGtyX + EhbelxIL3JgSBtqXEgzblhIZ2pUSVNuWEsXblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS8tuWErDblhIvAAAAAAAAAAAAAAAAAAAAAAAAAADbmBIa25YSgtuWEt3blhL825YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS+NyXESYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqVEgrblhFA25YSrtuWEvfblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL225cRv9yWEW3clhM23JYUC9yWESzalhFo25YSuduW + EuzblhL925YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/dlRNOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YQBtqW + ETPalhKd25YS8NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvnblhLq25YS3tuW + EtbblhLc25YS6duWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YTaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADYlxEF2ZcRI9uXEnjblhLa25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9qVEYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANeXEALblxIO25YTStuWErPblhLz25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKaAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqV + EwbalhEk25cSeduWEtzblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/2pUSswAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclxI/25YSwNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKt3JYTIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EwPblxNK25YS1NuWEv/blhL/25YS9NuXEpPblxIgAAAAAAAAAAAAAAAAAAAAANuXEhXblxJ525YS49uW + Ev/blhLo25YRewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkxAJ25YSY9uW + EtvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS6duXEj7blhIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cSBNuXEk7blhLU25YS/9uWEv/blhLz25cSk9uXEiEAAAAAAAAAAAAA + AAAAAAAA25cSFduWEnPblhLD25YSrNqWEUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMTBdqV + EhXblhIq25USVtuWErbblhL525YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJ025cSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEF3JYRUduWEtTblhL/25YS/9uW + EvLblxKT25cSIgAAAAAAAAAAAAAAAAAAAADalBMK2pUTK9uWEigAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIJ25YSKduWElXblhKC25YSrduWEuDblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSqtuXEh0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuW + EQbblhFV25YS1NuWEv/blhL/25YS8duXEpPblxIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblhEQ25YSTtuWEqnblhLq25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EsTblxIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pUSCNqVEljblhLU25YS/9uWEv/blhLw25cSlNuXEiQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIi25YSeduWEsvblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhK02pYSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalRIJ2pUSW9uWEtTblhL/25YS/9uW + Eu3clhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhEZ25YSi9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSpNuXERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQrblxFd25YS1duWEv/blhL13JYSoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxIR25YSbNuW + EubblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uXEpDblxIXAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pcSC9qXElvblhKw25YSrNuWE1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADdmREE25cSRduWEs7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blxF53JcREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalBMF2pUTI9uWEivbmxINAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cREtuWEnvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/3JcSft2XEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEibblhKj25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9yWEqPclhIcAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxI525YSzNuW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLb3JcTPd2Y + FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADclRII25YSXduWEu/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEpLblxIc3ZkRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiJFAHajBMI3JERENqS + EBnakxEh2pQTKdqUEjLalRI925URXtuVErPblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLm25YTcNuVEw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblREI25URQ9uW + Em3clhJ925USiNuVEpDblRKZ25USotuVEqrblhKz25YSvtuWEtfblhL425YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtrblhJY25YSCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIE25USOduWEsTblhLt25YS+9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YSy9qVEUTZlBEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YTDNuWEnfblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKy25cRLduXEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEhTblhKt25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS9tyWEpDfmRMV6KIXAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIQ25YSk9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhLo3JYSbdyXEgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA2pUTBNuVEzrblhLR25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEtralhFN2pYRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEM25YSbduWEvHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSsdiTExXRixcBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pYPAtuWESLblhKn25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EvDblhFb25YRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblhIG25YSQduWEtHblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS99qWEs7blhKb25YSctuWEoPblhKi25YS49uWEv3blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YSwN6YEx3gmRQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANyWEw7clhNx25YS89uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS2NuWEoTalhNE25USItyUEgvblxIU2pYRJtuW + ElfblhLE25YS+NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvbblhFq25YRBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADelhQC3JYSJtuWEqrblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS4NuWEmzclhMY4JkUAwAA + AAAAAAAAAAAAAAAAAADflRUG25YROduXEsvblhL825YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS0N2W + EyXelhQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQbblhJD25YS0tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS6tuW + EnXblhIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhJh25cS49uWEv7blhL/25YS/9uW + Ev/blhL/25YS/9uWEvvblxF425cRBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YSEduWEnbblhL125YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWErPclhEvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pQSEdyX + Ep3blhL025YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS396XER/flxABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyXEQPblxIq25YSrNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKI3JYTFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclxNm25YS6duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJW25YSAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pcTB9qW + EkXblhLS25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSZ9yWFAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URP9uWEuHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YRlduWEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblxIN2pYSX9uWEt7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uV + EnzbkxARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEVbblhLm25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uXEtvTkAwKv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZkRAdqWERXalhFr25YS2NuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blRKf2pUSJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADalhN925YS7tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL73JYTOtyWEwEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalg8C25YREduW + EkPblhKb25YS4duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS29uVEkvRixcDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADgmRQP2pYSt9uWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EoDblhICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclRMG3JUTG9uWETjblhFm25YSkNuXEpvblxKb25cSjNyXEmPblxJO2pYSZduW + EpjblhLY25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvvblhKq3JcSKwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25UTa9uWEuXblhL+25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhPM25YTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclQ4C25UQDNuWERfblxIa25cSGtyX + EhbelxIL3JgSBtqXEgzblhIZ2pUSVNuWEsXblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS8tuWErDblhIvAAAAAAAAAAAAAAAAAAAAAAAAAADbmBIa25YSgtuWEt3blhL825YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS+NyXESYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqVEgrblhFA25YSrtuWEvfblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL225cRv9yWEW3clhM23JYUC9yWESzalhFo25YSuduW + EuzblhL925YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/dlRNOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YQBtqW + ETPalhKd25YS8NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvnblhLq25YS3tuW + EtbblhLc25YS6duWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YTaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADYlxEF2ZcRI9uXEnjblhLa25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9qVEYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANeXEALblxIO25YTStuWErPblhLz25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKaAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqV + EwbalhEk25cSeduWEtzblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/2pUSswAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA + + \ No newline at end of file diff --git a/KeyGo/HotKeyItem.cs b/KeyGo/HotKeyItem.cs index fdb75ca..dcea1c4 100644 --- a/KeyGo/HotKeyItem.cs +++ b/KeyGo/HotKeyItem.cs @@ -48,7 +48,7 @@ namespace KeyGo /// /// true if enabled; otherwise, false. /// - public bool Enabled { get; set; } + public bool Enabled { get; set; } = true; /// /// Gets or sets the trigger counter. @@ -64,7 +64,7 @@ namespace KeyGo /// /// The creation time. /// - public DateTime CreationTime { get; set; } + public DateTime CreationTime { get; set; } = DateTime.Now; /// /// Gets or sets the last modified time. @@ -72,6 +72,6 @@ namespace KeyGo /// /// The last modified time. /// - public DateTime LastModifiedTime { get; set; } + public DateTime LastModifiedTime { get; set; } = DateTime.Now; } } \ No newline at end of file diff --git a/KeyGo/KeyGo.cs b/KeyGo/KeyGo.cs index 9a5385e..7a37fb0 100644 --- a/KeyGo/KeyGo.cs +++ b/KeyGo/KeyGo.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading; using System.Windows.Forms; using System.Xml.Serialization; @@ -16,6 +18,7 @@ namespace KeyGo public List Items { get; set; } = new List(); + #region FILE IO /// @@ -58,24 +61,6 @@ namespace KeyGo #endregion - - /// - /// Processes the hotkey. - /// - /// The hot key identifier. - public void ProcessHotkey(int hotKey_id) - { - var hotkey = Items.Find(k => k.HotKeyID == hotKey_id); - if (hotkey != null) - { - ++hotkey.TriggerCounter; - MessageBox.Show($"ID:{hotkey.HotKeyID}\nKeys:{hotkey.HotKey}\nProcessName:{hotkey.ProcessName}\nStartupPath:{hotkey.StartupPath}", "HotKey", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - - - #region HotKey Register /// @@ -99,6 +84,7 @@ namespace KeyGo } } + /// /// Uns the reg all key. /// @@ -195,5 +181,84 @@ namespace KeyGo } #endregion + + /// + /// Processes the hotkey. + /// + /// The hot key identifier. + public void ProcessHotkey(int hotKey_id) + { + var hotkey = Items.Find(k => k.HotKeyID == hotKey_id); + if (hotkey != null) + { + ++hotkey.TriggerCounter; + + // 热键相应逻辑: + // 若应用未启动:启动应用 + // 若应用未在最前:激活窗体,推到最前 + // 若应用已在最前:最小化窗体 + + var process = Process.GetProcessesByName(hotkey.ProcessName).Where(p => p.MainWindowHandle != IntPtr.Zero).ToArray().FirstOrDefault(); + if (process != null) + { + if (AppControl.IsForegroundWindow(process)) + AppControl.MinimizeWindow(process); + else + AppControl.ShowWindow(process); + } + else + { + if (!string.IsNullOrWhiteSpace(hotkey.StartupPath) && File.Exists(hotkey.StartupPath)) + Process.Start(hotkey.StartupPath); + } + + Console.WriteLine($"ID:{hotkey.HotKeyID} Keys:{hotkey.HotKey} ProcessName:{hotkey.ProcessName}\nStartupPath:{hotkey.StartupPath}"); + } + } + + /// + /// 添加一个新热键 + /// + /// The item. + public void AddHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + Items.Add(item); + if (item.Enabled) + RegKey(item); + } + + /// + /// 删除一个热键 + /// + /// The item. + public void DelHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + Items.Remove(item); + + if (item.HotKeyID != 0) + UnRegKey(item); + } + + /// + /// 修改热键 + /// + /// The item. + public void ChangeHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + // 重新注册 + if (item.HotKeyID != 0) + UnRegKey(item); + if (item.Enabled) + RegKey(item); + } } } \ No newline at end of file diff --git a/KeyGo/KeyGo.csproj b/KeyGo/KeyGo.csproj index b148b9f..959cbcc 100644 --- a/KeyGo/KeyGo.csproj +++ b/KeyGo/KeyGo.csproj @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -32,6 +33,9 @@ prompt 4 + + KeyGo.ico + @@ -70,6 +74,12 @@ + + UserControl + + + UCHotKeyItem.cs + FormHotKey.cs @@ -87,7 +97,11 @@ True Resources.resx + True + + UCHotKeyItem.cs + SettingsSingleFileGenerator Settings.Designer.cs @@ -101,8 +115,14 @@ + - + + + + + + \ No newline at end of file diff --git a/KeyGo/KeyGo.ico b/KeyGo/KeyGo.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e3e9c2596af4cf985bb94b0f99ee2102a531fb8 GIT binary patch literal 16749 zcmeI3dyG`o9mi)Ec3BqKnS1XnFF|=&6=-8p`qI{d5vl>fT5U10k2HqbhnV^VYN1x_(v)alSo(^E#7ASa4{E8qb7vpKN7+`bycbubpWk{9x!mW>o!Qx) zrjRdZ?zz8n&hPuX=lp)ZbM7UPsNwI@B?LNjr+d3wmOoDTvneAer9F$0m==Owd#JgmT>q1I0H_?|AubU@Z|*m zddt*SBKM9h{~F~3V0^W57roK{pv~t@KC2&r|EH{MYMdV@F>>BwxE2B4ASgGM6zt zYcH&Qx$ePrf^CC0ZBD20iFxAVsxH%*;2sAV9o!9+yx8EMKy1+DmiN1sHHPfR;J=mf zcc2~qAGfkbGH)8be%P;{a@E1V!M4GF&_(#1Cf0X#oBFl*ML!$JGrI@iH;3h=&8uKD zNJi-e|Aojs2Be)rAN;qV$ECSUYQlk*s9wr@pK%*)8@z7o^fq(z?_gzjR`d9IWYXYX zpyZVeHc^)f(=M0QZb0S*ptw8By}1lNs5O<&XDXX#z<-i$1Icqlr?;7-`_Xp=y7<|k z85yyGu@q0Q`6Ont+A*mHSwSH)8)8ti!VUN7i5s zNHfnoejENxwhbi4i(YSmXTdc+8SitYeku@u&=159wD@tCy6(25_|I10$Jej!CD!0W z$bS(3;IV(uIAQhlLk?`rh5vW0jJ6i8Gu`skC2bo>j8`^zhPdzvt0V2vgT2%g4 zwf!Awk4;to$Lmy;~P}>1Z`GYnN*XteR4_b0q(V6hpodYc(#J`l#Z&TE@j(5 z;+yDo3Oq^Oa(uMM2C7|H$-07ag~4aDlrm^=aD%FWd4b@y)-%e|*#}8+OgJTS9y0 z&)G5K@Rv4^;fv;kjTLpzBG&{f=*ww?W3~-EeN*3T+W?;qTRkJAQ6sS|%NSLv=w>LlLZ1)c;d9OOX05C-iKd-{tQUY!134>^e7_$k-AgY`eHS{;R%4b@GLP$l=<2k=VcQ1ti|Lzw)WrH^vqpi?!Xe;qu;^lLo+G?lVeOb7 zaz1t&P@Fpzohb3ndkd^V^r@<53p%aQvt7Zm8r@uqy@uO( zAnW-lAZOb{K-qdMm(Q`EU)J5GdEQ$UV*}>WWcbQ??pWp;q}wlv#qYCB|9AO?*a6;Y zAbYi-F~)NJ3D)bjz7C`L(9UVG{2{z$@77wS{N>pk!UpTejbix%c@K*(y_|mbSFsIp zoXe~Nv3vn%A>sqpfx}g7gI{#D8qND3EPfs2vPs?#XtIz0aTW9D{k+EhE#4e}H|Ih6 zm0+~jft)kTzOobC2_67D!AsyY2=mALdfScJypM|I3prnI0(UUR(TH)vbSULs7vp{> zmo=7=lg!Jv4ZojGv#w>owFXFz5|(?N;Q48P9q znJ;1kSqtv~zdncHumO0!Ym4ez-KSp-+zXBejNvzKDRsMvL6@rW!%FsH8nOQS=yfba zx4vFeyP(fZ#hL@0G4Y;AUr7I)gZbLH6s~@4w=nMuKG)+6;7jN=5TTpAdx`zdILEhO z_+dHYtHe6EmG21(p0Dgxm!Q|#Z+iXhpk?qEC7qKn2c}?yFVKIl{}^SO8yWqZyelmD zToYdMY+nu4$<(bEwoPu_+Y+{#!tco$3$dpee2uXrHu=rn((5w%4$f8zey>A(+=MP~ zMCdcbnz|gs@&U>+c5W#CP-24QBoXs2mW?dp{Yr9IPux>_sFK*2WKRAXJx+lr+qWPS z+XtvIrR3X#dT<_d?;}9`kGzZMw6PVRd<(xssNd>kC=$=WwST*Tz?Z^s7XD7kOy6sm*7dY(O75xAoC+IL~-_H24)Vrkqp3e?kvuR;-Cz zvB4ilzz(Mi(PcDc#18PU=j?74rNsJY!5}E=SqI6FCbwe7w(T$;JIo~SS;M!g?d)|W zX1*1~t&sX+bQlY=!|Nie5i^atgWH=L*c*SC?+(^WZV2C^&ZLMp=2+kqSBEn#{Qu?F zR1N&Ghc>ROH9eg /// 应用程序的主入口点。 /// [STAThread] - static void Main() + private static void Main() { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new FormMain()); + var p = AppControl.GetCurrentRunningInstance(); + if (p != null) + { + AppControl.ShowWindow(p); + } + else + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + } } } -} +} \ No newline at end of file diff --git a/KeyGo/Properties/Resources.Designer.cs b/KeyGo/Properties/Resources.Designer.cs index 66926cc..d7af1bc 100644 --- a/KeyGo/Properties/Resources.Designer.cs +++ b/KeyGo/Properties/Resources.Designer.cs @@ -1,70 +1,113 @@ //------------------------------------------------------------------------------ // // 此代码由工具生成。 -// 运行时版本: 4.0.30319.42000 +// 运行时版本:4.0.30319.42000 // -// 对此文件的更改可能导致不正确的行为,如果 -// 重新生成代码,则所做更改将丢失。 +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ - -namespace KeyGo.Properties -{ +namespace KeyGo.Properties { + using System; + + /// - /// 强类型资源类,用于查找本地化字符串等。 + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// // 此类是由 StronglyTypedResourceBuilder // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// - /// 返回此类使用的缓存 ResourceManager 实例。 + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KeyGo.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// 重写当前线程的 CurrentUICulture 属性,对 /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgAdd { + get { + object obj = ResourceManager.GetObject("ImgAdd", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgDel { + get { + object obj = ResourceManager.GetObject("ImgDel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgDisable { + get { + object obj = ResourceManager.GetObject("ImgDisable", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgEnable { + get { + object obj = ResourceManager.GetObject("ImgEnable", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgSet { + get { + object obj = ResourceManager.GetObject("ImgSet", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/KeyGo/Properties/Resources.resx b/KeyGo/Properties/Resources.resx index af7dbeb..91703f5 100644 --- a/KeyGo/Properties/Resources.resx +++ b/KeyGo/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,25 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\ImgAdd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgDel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgDisable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgEnable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgSet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/KeyGo/Resources/ImgAdd.png b/KeyGo/Resources/ImgAdd.png new file mode 100644 index 0000000000000000000000000000000000000000..cef8c3a093ebb1a63ae14cbd04c749d0baf62dd9 GIT binary patch literal 528 zcmV+r0`L8aP)Jbe17I7t&)jj>{2k!Iedq&V5qJfb2L`|gum*e;{qg~@58MpQ`I$Qhz%&HFDRAZh zu$3twkB;5u*Lf-cPnm(R2?zj1z&rw)0?GkOf~o>4gMHuuR-=t@6`PGrom`{WJiuq1 zu}uL`BimF2^qC543V23GIY3EJRX}A>JRoNtV5Kdlx!YB-`;MV#X`Kj}L$M&l09Jh0 zoDTse0NQ4Pih!|Cf!O&!xFi^p(6kuRV(9O&l~#jV4Qe&0)nJI<|F_cg=5SPHP-ReM zaNI{@G080T-PZR5QVnhDI|0!4hDcK*nfhNvfFeK_C3RD@)~m9q$*9Zkk^tBRZo9O) z!M^u^yU;B$(+Rx~Kq}+nXwsP#S3guHnK8Z4Rf8kZ#jlTix}hr3l<9^p2Oym>sm!rY zFJz+-5>A?a$QadX7eiJ&wc=O{RmJx SE!~0u0000?GVExOh!Caz*W{>PdTp**lxAv^_viEb=KbF9g|LR}osmA| z!8-`h9spSoio|#`YCG5ChNHL+mZ3cWaJqwEz3K7Mu|;>j*SN6&${BT%net(90^a(+ z85nC%$W3R1`4QiGf#?~aq^I{2@thx&2=gBEMbma)`~ORZx=SINVaDzt>0@C#$C3re zq^}V3O}S#GakJKtFyU3w(+7z7c}o#qqMz<|@fAP1K`bj^ZB37|+uYpIft2$^I0fJ{ z0e7S97?=RCNkVwuzD}`7O??uTMp>#ENO+q-Q{8Bje9qv!X}gysfMsY80US> zC!*>ckpN{wyVfco9+Hkkxvl~FGpG|V>-UWnyTH=bmmz@v9?ivH#r|>u%Q2aYqUQcl z8v}rUM}bzMa*l|K;h|&c>I{fBHa))O_x~sxxy!=3>Zb-QUH#%G15g*XGaLjC?-hjY zoQbkY4#3bj+zrBZ!v4{^7p%;Ruo(ah6c{M*Unx+LBY1lwGPLgi)&qDXZ0Ce!Xe(?I zQ$V&^V48sGuoagL?LGrJ1vE8cH=ae=BnHsWOc3iV2v&7Am~JnawmaKT@|FTx8H5o8 zV_18KVW{T+p?X3V1Jo9cuw0q7O`XA*xQHlmBne7-BzXpWI9U0000!eY^UloY7kmc>Ugo{`p68zPoadaGW0q~sEc-Vd z0C(d_EGy5w$P@dkJl`YFY5X(ha$^A8fi2jI2gV$VKd>8n@L%7aAponf9ZSj~mv9Wn z@h7g7_xIs`Jcm_SP~QKH_wn^45Pbk%#V2LsReXRCM@Hanyn{Q-`fd2MYwsigxk+vs zOFm!0FC(2d%NApA;Z5EpGKt(2>jLmNek!Zp#e36q++Mx|IVbi6&eRLq07AIjI5|Iv zbu)C{Y(Idt2q#iWw}{yW@H%!PIe)q%?91`pZGcKTekh!H1G}0tY5@1(Tq(5>s7<)d zrL6kWvIvK89gnquhL|C8O7v0uo&Re9DY>ukJ09w|vC;UI1fL5RM$dymIpZX_RgVL~jblkT5d+WzmW{ z?6utXf#@Y+L?UAGF`|fV3(<}iB6a0_42US;YenQDc2hX;EKZaPNF}r_<&zuq5v~T& z)#y?INyAEf(*_Xs=kQEDT~eG9-B8HaB{B`*jks3U)t9KHIMKX0vQ4)c4VC7k|3@{W zY_8jJ+H#cf|F9@u+VEgIjUl7O$w#+2lD%05k@)MJ z3;TxBdM=#lP}(^Uc9F0h(g@GKYAnyJa1vik7|YjVMd|rDD>;9;JqOlKhQ13LV$Rx! zNewn5TZAZ|W{FJKr&%W6e41r$yg70W*_a3noiU^TXC1%|_T;!BPT0H|00000NkvXX Hu0mjf@rr+7 literal 0 HcmV?d00001 diff --git a/KeyGo/Resources/ImgEnable.png b/KeyGo/Resources/ImgEnable.png new file mode 100644 index 0000000000000000000000000000000000000000..fed22026e7e2904a3bbd62fa6f9874ac5f851a39 GIT binary patch literal 760 zcmV6;vYVC`c&iD6EB8Vkzh} z8WB_)@=wmZoOd#FXTJA|Z<1Twd(ZNpGyk*95CdLA1NKiZ044%Uffe>l0rY5nwdWC_ z=PB@`Wpgb6#sNEkoxs!j#xDGE>0+uMu-^!>;+Dn z=5=6epU#u|HDHUq>;ulEA0EIYKp7Qqu!a$|?1~e-bztIj|bIZvr)=2}DiK z2hsyy13ZWTR3_j3r&2sSjci@bC|3^()Tn;;ZMoQtWF@xae*wZfueM`>@J&hYy_|Cl zMI`J<6H0=mku27A%?86gv}d(nHKsHJ$X|9Y>>5hrT$qMZvA5JI)$x=~aVX8sgE0$o zOwxRKIWv}PBv--GaG|9kMg>NrxnDYSHL6i_pckm!3lcF0b}{i_HL|U=YndXGyP9dI qx|%&qBUdd!TOv@i(bxZh1NaN{K%XK1eOmhf0000#*GVdF;bEndFqO%;>g{|)sU`)#aP08nL@0c`BIv0^I${EbmKiuj$Ex)WBdZ^Q4nfTekd#Rx3J z`JBQzti+GlkGW~BE(Pzf12=IB({nzTjko zvGFi0#-)bk){|Ps7r_ge{EE|fjcIt6Mc^3Lrrbo1zNK8oA{@uM01!xn;r_z}JZZ3d zfSi|35q7t6C#9**d?Fs8Uod6>xPtlVf*i)%8V^yLzf|Zv#FQHQLFrz_Wxg5!@;5gk z@ds{HI0@vF)7k>u$4C5}Pr__h zigNsZiVe74B$O-~WgRU@DRLjDi&K_Kq%u-k7KN;ncBIWa?TY}i3t0x>ImTc_s_8NS zBk>Y1FuI_S0f<)JRhoScKr2#kBvnC_Z&wOhaS8L)_Bhe;wN{tm!c+-CMj`FrgNUNT zZcIQriKx|7JRZTA12Za)P_(icWqi`ri~>MU?YOM1)-{}}^^B;xwc{`-4kW|z8&)T8 z5w?T)t7i8gqs{3FLOO(Kav{-UW|a*ju~;0*0?>ex&CVhQi!#aceSSTLoinLjSB_+1 zP#j95UgKTNa0f6rdHp6sX@)qEu1Ygo%x-!4(y_c-lj@TnCOzG;-bSF(XKy1=SB8!K gHdahKe)Z4uPjj8e6y#d2WdHyG07*qoM6N<$f_y++s{jB1 literal 0 HcmV?d00001 diff --git a/KeyGo/UCHotKeyItem.Designer.cs b/KeyGo/UCHotKeyItem.Designer.cs new file mode 100644 index 0000000..32fdff8 --- /dev/null +++ b/KeyGo/UCHotKeyItem.Designer.cs @@ -0,0 +1,119 @@ + +namespace KeyGo +{ + partial class UCHotKeyItem + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.LblHotKey = new System.Windows.Forms.Label(); + this.LblTitle = new System.Windows.Forms.Label(); + this.BtnEnable = new System.Windows.Forms.Button(); + this.BtnDel = new System.Windows.Forms.Button(); + this.BtnSet = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // LblHotKey + // + this.LblHotKey.Font = new System.Drawing.Font("微软雅黑", 7F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.LblHotKey.Location = new System.Drawing.Point(5, 31); + this.LblHotKey.Name = "LblHotKey"; + this.LblHotKey.Size = new System.Drawing.Size(100, 20); + this.LblHotKey.TabIndex = 0; + this.LblHotKey.Text = "Ctrl+W"; + this.LblHotKey.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LblTitle + // + this.LblTitle.AutoEllipsis = true; + this.LblTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.LblTitle.Location = new System.Drawing.Point(5, 6); + this.LblTitle.Name = "LblTitle"; + this.LblTitle.Size = new System.Drawing.Size(100, 25); + this.LblTitle.TabIndex = 0; + this.LblTitle.Text = "WeChat"; + this.LblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // BtnEnable + // + this.BtnEnable.BackgroundImage = global::KeyGo.Properties.Resources.ImgEnable; + this.BtnEnable.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnEnable.Location = new System.Drawing.Point(6, 54); + this.BtnEnable.Name = "BtnEnable"; + this.BtnEnable.Size = new System.Drawing.Size(30, 30); + this.BtnEnable.TabIndex = 1; + this.BtnEnable.UseVisualStyleBackColor = true; + this.BtnEnable.Click += new System.EventHandler(this.BtnEnable_Click); + // + // BtnDel + // + this.BtnDel.BackgroundImage = global::KeyGo.Properties.Resources.ImgDel; + this.BtnDel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnDel.Location = new System.Drawing.Point(74, 54); + this.BtnDel.Name = "BtnDel"; + this.BtnDel.Size = new System.Drawing.Size(30, 30); + this.BtnDel.TabIndex = 3; + this.BtnDel.UseVisualStyleBackColor = true; + this.BtnDel.Click += new System.EventHandler(this.BtnDel_Click); + // + // BtnSet + // + this.BtnSet.BackgroundImage = global::KeyGo.Properties.Resources.ImgSet; + this.BtnSet.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnSet.Location = new System.Drawing.Point(40, 54); + this.BtnSet.Name = "BtnSet"; + this.BtnSet.Size = new System.Drawing.Size(30, 30); + this.BtnSet.TabIndex = 2; + this.BtnSet.UseVisualStyleBackColor = true; + this.BtnSet.Click += new System.EventHandler(this.BtnSet_Click); + // + // UCHotKeyItem + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(238)))), ((int)(((byte)(238)))), ((int)(((byte)(238))))); + this.Controls.Add(this.BtnEnable); + this.Controls.Add(this.BtnDel); + this.Controls.Add(this.BtnSet); + this.Controls.Add(this.LblTitle); + this.Controls.Add(this.LblHotKey); + this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.Name = "UCHotKeyItem"; + this.Size = new System.Drawing.Size(110, 90); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label LblHotKey; + private System.Windows.Forms.Label LblTitle; + private System.Windows.Forms.Button BtnSet; + private System.Windows.Forms.Button BtnDel; + private System.Windows.Forms.Button BtnEnable; + } +} diff --git a/KeyGo/UCHotKeyItem.cs b/KeyGo/UCHotKeyItem.cs new file mode 100644 index 0000000..4dcdcfd --- /dev/null +++ b/KeyGo/UCHotKeyItem.cs @@ -0,0 +1,135 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +using KeyGo.Properties; + +namespace KeyGo +{ + public partial class UCHotKeyItem : UserControl + { + public UCHotKeyItem() + { + InitializeComponent(); + } + + private HotKeyItem _HotKeyItem; + + public HotKeyItem HotKeyItem + { + get => _HotKeyItem; + set => ShowHotKeyItem(_HotKeyItem = value); + } + + public KeyGo KeyGo { get; set; } + + /// + /// 值改变时触发 + /// + public event EventHandler ValueChangedEvent; + + private void OnValueChanged() => ValueChangedEvent?.Invoke(this, EventArgs.Empty); + + /// + /// 显示信息 + /// + /// The item. + private void ShowHotKeyItem(HotKeyItem item) + { + LblTitle.Text = item.ProcessName; + LblHotKey.Text = item.HotKey; + HotKeyBtnEnable = item.Enabled; + if (item.Enabled && item.HotKeyID == 0) + LblHotKey.ForeColor = Color.Red; + else + LblHotKey.ForeColor = Color.Black; + } + + /// + /// 热键使能按钮状态 + /// + private bool HotKeyBtnEnable + { + set + { + if (value) + BtnEnable.BackgroundImage = Resources.ImgEnable; + else + BtnEnable.BackgroundImage = Resources.ImgDisable; + } + } + + /// + /// 切换热键使能状态 + /// + private void BtnEnable_Click(object sender, EventArgs e) + { + try + { + if (HotKeyItem.Enabled) + { + KeyGo.UnRegKey(HotKeyItem); + HotKeyItem.Enabled = false; + } + else + { + KeyGo.RegKey(HotKeyItem); + HotKeyItem.Enabled = true; + } + HotKeyBtnEnable = HotKeyItem.Enabled; + OnValueChanged(); + } + catch (Exception ex) + { + MessageBox.Show("在切换热键使能时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 设置热键参数 + /// + private void BtnSet_Click(object sender, EventArgs e) + { + string oldKey = HotKeyItem.HotKey; + var frm = new FormHotKey() + { + HotKeyItem = this.HotKeyItem, + }; + if (frm.ShowDialog() == DialogResult.OK) + { + var item = frm.HotKeyItem; + // 如果热键发生改变,则需要重新注册 + if (oldKey != item.HotKey) + { + try + { + KeyGo.ChangeHotKey(item); + } + catch (Exception ex) + { + MessageBox.Show("在重新注册热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + ShowHotKeyItem(item); + OnValueChanged(); + } + } + + /// + /// 删除热键项 + /// + private void BtnDel_Click(object sender, EventArgs e) + { + try + { + KeyGo.DelHotKey(HotKeyItem); + Parent?.Controls.Remove(this); + OnValueChanged(); + } + catch (Exception ex) + { + MessageBox.Show("在注销热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} \ No newline at end of file diff --git a/KeyGo/UCHotKeyItem.resx b/KeyGo/UCHotKeyItem.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/KeyGo/UCHotKeyItem.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file