123 Commits

Author SHA1 Message Date
ac5cc3f82e package: Cleaned up code and increased version number 2023-06-27 12:15:51 +10:00
c964aa0064 multisig: Added settings and cleaned up new account creation 2023-06-27 11:49:47 +10:00
fe7fc4cee9 multisig: Cleaned up code and added checks to not show >n signers 2023-06-26 21:44:11 +10:00
6cc6cd4a79 multisig: Disabled bulk actions and a set to reqiure batch
- Added condition to disable buttonActionMain when mainForm.multiSig is true

- Removed buttons (buttonRevealAll, buttonRedeemAll, and buttonSendAll) when WatchOnly or multiSig is true
- Added buttons (buttonAddressVerify) when WatchOnly is true
- Updated conditions for showing/hiding toolStripStatusLabelLedger and toolStripStatusLabelMultisig
2023-06-26 21:25:42 +10:00
f69f16df4a multisig: Added multisig from batching 2023-06-26 21:21:55 +10:00
db5934bf4a batch: Fixed batch form flashing when it imports 2023-06-26 21:21:03 +10:00
54d5c63db7 multisig: Finished signing for hot wallets 2023-06-26 18:48:12 +10:00
6da345e650 multisig: Added info on signers
Added variables to track the number of total signers, required signers and signed signatures. Also added code to get multisig information from transaction inputs and display it in the UI.
2023-06-26 18:13:08 +10:00
5be4f0d6e9 multisig: Added import tx 2023-06-26 16:21:05 +10:00
b1d21289ab main: Initial send multisig to address 2023-06-26 16:20:54 +10:00
cefd2d18c7 main: Added multisig detect 2023-06-26 14:31:18 +10:00
d8efdb98f7 batch: Bring form to front after you add a new batch 2023-06-24 14:39:59 +10:00
eea79b92d4 main: Added HIP-02 to batch import transfers 2023-06-24 11:41:05 +10:00
ffd1372eca transform: Updated HIP02 to use MainForm's task 2023-06-24 11:34:02 +10:00
cbf1bc3e38 main: Moved HIP02 lookup to its own task 2023-06-24 11:28:30 +10:00
843f824b2f package: Increased version 2023-06-22 13:29:37 +10:00
71a04edc02 README.md: Added default settings to config file
- Added default settings for HideScreen and Timeout to the config file
- Users can modify these values in the file if needed
2023-06-22 13:26:58 +10:00
30c5690c24 main: Custom timeouts 2023-06-22 13:20:11 +10:00
af9327a1fa main: Restart node if it hangs 2023-06-22 12:55:46 +10:00
07345d7f33 Merge branch 'newBranding' 2023-06-21 21:32:08 +10:00
d41c72faff main: Added redeem and send all 2023-06-21 21:31:46 +10:00
a4a35ad62e splash: Cleaned up code 2023-06-21 19:42:19 +10:00
9f0f7214e2 splash: Added splash screen fade in out 2023-06-21 19:38:20 +10:00
742cd9bafd main: Initial new image 2023-06-21 17:57:52 +10:00
9f33c74bb0 main: Added Register support 2023-06-21 12:12:45 +10:00
8f241fc90a main: Stop logging sending HNS unless errors 2023-06-20 12:39:51 +10:00
dc09194759 readme: Added info on donating straight to @firewallet 2023-06-20 12:11:44 +10:00
638a367029 package: Increased version 2023-06-20 11:58:51 +10:00
026849575d readme: Removed warning about import UPDATE not working 2023-06-20 11:58:02 +10:00
d1a150114e main: Updated batching and docs
- Updated example-configs/batch.txt with new DNS records
- Modified BatchForm.cs to handle new DNS record types
2023-06-20 11:57:33 +10:00
5d59bdee64 dns: Updated DNS record parsing and formatting
- Added support for new DNS record types
- Improved formatting of update records in BatchForm.cs
2023-06-20 11:43:39 +10:00
74548a22e2 main: Removed unused dependencies 2023-06-19 13:24:18 +10:00
ac2aa06888 main: Fixed resizing form 2023-06-19 11:31:43 +10:00
429cf0d67b package: Increase version 2023-06-18 20:33:27 +10:00
38838096d6 readme: Added info on HIP-02 config 2023-06-18 20:28:08 +10:00
fae4bff32b main: HIP-02 fix for Bob port
If Bob is the HSD FireWallet is connected to use the default Bob DNS resolver port
2023-06-18 20:25:27 +10:00
df8c675588 Merge branch 'hip02remote' 2023-06-18 20:10:31 +10:00
de7109eddc main: Added some improvements to hip02 addresses with trailing whitespace 2023-06-18 19:58:43 +10:00
1a98a6a1c6 main: Add option to set custom hip 02 ip and port 2023-06-18 19:42:05 +10:00
859562ac22 splash: Don't require top most 2023-06-18 19:41:26 +10:00
0a5412478c main: Cleaned up code and set splash to close after node connected
- Splash will not close anymore until Node is started and connected if internal HSD running.
- Splash will not close until after 4 seconds if external HSD running
2023-06-17 15:24:13 +10:00
90cc614ebf main: Updated theme dropdown and added new menu item for other projects.
- Changed foreach loop to update the foreground and background colors of ToolStripDropDownItems
- Added a new menu item "Other Projects" to the Help dropdown menu
- Created a new event handler method for the "Other Projects" menu item click action
2023-06-17 13:47:47 +10:00
a024ce7afc readme: Added installation dependencies
- Added instructions for installing .net desktop
- Added instructions for installing Node, NPM, and git
2023-06-16 11:20:48 +10:00
88ee50f4a6 main: Dependencies install links 2023-06-15 22:56:35 +10:00
23cbace1ea package: Increased version 2023-06-15 22:28:51 +10:00
6894e9c079 main: Fixed installation of hsd 2023-06-15 22:21:12 +10:00
95d0498672 main: cleaned up code 2023-06-15 22:01:32 +10:00
88c6b5afe0 README.md: Added instructions for using HIP-02
- Added instructions for using HIP-02 to send HNS to Handshake addresses or domains.
- To use HIP-02, a user needs to have an HSD resolver listening on port 5350.
- A domain must be prefixed with `@` to use HIP-02 (e.g., `@nathan.woodburn`).
2023-06-15 17:38:05 +10:00
f06bc5b711 mainForm.cs: Added domain sorting feature and updated UI
- Added comboBoxDomainSort_DropDownClosed method to update domains
- Added comboBoxDomainSort control to panelDomains
- Added labelDomainSort control to MainForm.Designer.cs
- Updated UpdateDomains method to sort domains based on selected option
2023-06-15 16:47:59 +10:00
42536e47bb README.md: Added a note about BID import syntax
- Added a note about the BID import syntax being BID,LOCKUP where LOCKUP is (BID+BLIND)
2023-06-15 16:43:51 +10:00
404a47ec79 batchForm.cs: Added try-catch block to handle file in use exceptions
- Added try-catch block to handle exceptions when importing batch
- Displayed error message and notification form if an exception occurs
2023-06-15 16:21:13 +10:00
c3abd0b4de README.md: Added ability to send HNS using HIP-02
- Added option to send HNS to Handshake addresses or domains
- Implemented [HIP-02](https://github.com/handshake-org/HIPs/blob/master/HIP-0002.md) for sending HNS
2023-06-15 14:07:26 +10:00
41a38e2af1 package: Increased version 2023-06-15 14:00:48 +10:00
699b1051d4 main: Finished HIP-02 sending 2023-06-15 13:56:24 +10:00
14cb5453dc main: HIP-02 transfers for domains 2023-06-15 13:55:51 +10:00
5323a8ff0d main: Added HIP-02 to sending HNS 2023-06-15 13:46:45 +10:00
2572b17898 main: Don't install HSD if custom path specified 2023-06-15 12:21:15 +10:00
a8f425434e config: Added custom HSD launch command
- Added `HSD` and `HSD-command` keys to node.txt file
- Users can now set a custom HSD launch command by setting the `hsd-command` key in node.txt
- README.md updated with instructions on how to set a custom HSD launch command using `{default-dir}`, `{key}` and `{Bob}`
- Support section added to README.md
2023-06-15 00:00:37 +10:00
07c9618837 tx: Show inputs while outputs are loading 2023-06-14 23:27:50 +10:00
eccc584b2c main: Fixed error check in reveal all 2023-06-14 23:27:28 +10:00
cf2f68f2b3 main: Added support for custom HSD launch command 2023-06-14 23:27:13 +10:00
5eb80bcd06 main: Added help menu 2023-06-14 17:30:50 +10:00
7c38bfc755 main: Move log if it is getting big 2023-06-14 17:19:06 +10:00
d4620af384 batch: Removed old file writing for ledger 2023-06-14 17:08:10 +10:00
15cb4efaf1 package: Increased version 2023-06-14 17:04:14 +10:00
18607358bf TX: Fixed watchonly errors 2023-06-14 17:04:00 +10:00
6db6d02e9e TXs: Fixed decimal errors 2023-06-14 16:57:07 +10:00
3eda3d7419 hsd-ledger added sendraw to usage 2023-06-14 16:30:49 +10:00
3f6c2bdded hsd-ledger: Removed using files to store batch info 2023-06-14 16:30:05 +10:00
2bfca908a9 batch: Changed sendRaw in hsd-ledger 2023-06-14 16:29:22 +10:00
531d41a413 main: Fixed showing TXs for Ledger 2023-06-14 16:29:00 +10:00
960af0b169 main: fixed settings location 2023-06-14 15:49:56 +10:00
14a685690c package: Increased version 2023-06-14 15:29:22 +10:00
816e16a9aa main: On load bring to front 2023-06-14 15:28:59 +10:00
036819169d tx: Get TX on load to lower memory use 2023-06-14 15:20:08 +10:00
1675ac48f3 main: Only get the number of TXs needed
This should speed up the loading on larger wallets
2023-06-14 15:19:16 +10:00
f44aac35f0 domain: Removed OPEN button from reserved domains 2023-06-14 14:09:20 +10:00
bf2e41058d main: Fixed click on text in domains and tx history doesn't open window 2023-06-14 14:07:03 +10:00
2109879f93 Merge remote-tracking branch 'origin/master' 2023-06-13 23:58:32 +10:00
112b719d78 main: Fixed npm installed checks and fixed HSD install 2023-06-13 23:58:24 +10:00
2395c4ca29 main: Fixed npm installed checks 2023-06-13 23:57:10 +10:00
752d20f369 main: Updated version 2023-06-13 23:26:16 +10:00
dc53d7eb0f assets: removed tmp logo 2023-06-13 23:26:06 +10:00
3783cfe759 main: Added error checks in case HSD doesn't start 2023-06-13 23:04:16 +10:00
71395f253b main: Added agent to internal HSD node 2023-06-13 22:51:48 +10:00
b34c6507b8 domains: Fixed opening domain error 2023-06-13 22:51:23 +10:00
b93c981fcd main: Added better errors for git, node or npm not installed 2023-06-13 11:30:54 +10:00
c7184be5ef main: Fixed installer problem (need to increase file version number) 2023-06-12 21:55:43 +10:00
b934ba2184 Added TXWindow 2023-06-12 21:36:07 +10:00
43a52cc029 tx: Added name to outputs 2023-06-12 21:35:39 +10:00
092e30799b main: Added TX windows to open and view txs in 2023-06-12 21:03:54 +10:00
54c5ccb555 main: Fixed bug with domain stats not being found 2023-06-12 14:53:07 +10:00
879f74f2bc installer: increased version number 2023-06-12 14:34:16 +10:00
41fa569563 main: updated no domains found error message 2023-06-12 14:27:36 +10:00
f4900cf9d6 main: Added reveal and renew all buttons 2023-06-12 14:23:02 +10:00
72be43e16d batch: Added error description to addresses exceed lookahead 2023-06-12 13:34:33 +10:00
c94bc8dcda batch: Added import any file type 2023-06-11 13:28:47 +10:00
145047b614 main: Fixed names page having errors when a domain is in auction 2023-06-11 13:28:35 +10:00
21ef8b2139 domain: Fixed single renews 2023-06-11 13:28:16 +10:00
860000bea8 main: Added checks for login without HSD connected 2023-06-11 12:45:02 +10:00
91c90136c1 readme: Added install video 2023-06-10 15:29:03 +10:00
e93ce03d50 install: Added new .msi installer for easier installation 2023-06-10 14:55:36 +10:00
520fe20051 docs: Added some debugging information 2023-06-10 13:42:52 +10:00
1b41b72193 Merge remote-tracking branch 'origin/master' 2023-06-10 13:20:29 +10:00
1d2597e1e7 readme: Added settings information
- Added information about the different settings files used in FireWallet
- Included details on what each file stores and how to access them
2023-06-10 13:20:24 +10:00
8aaf871bdf README: Added settings information
- Added information about the different settings files used in FireWallet
- Included details on what each file stores and how to access them
2023-06-10 13:20:12 +10:00
2e6f38d832 main: Added API key regex match 2023-06-10 12:50:28 +10:00
10662f5910 main: Added error checking in new cold wallet creation 2023-06-10 12:09:37 +10:00
7388710704 main: Added bug fixes for new installs 2023-06-09 23:43:50 +10:00
92bef9ef5d main: Added ledger verification for receive address 2023-06-09 17:28:51 +10:00
03a6b4d6da main: Require HSD API key 2023-06-09 16:09:19 +10:00
1a71329e6a readme: Added HSD info 2023-06-09 16:04:32 +10:00
c2990afed3 main: Added option to run HSD internally 2023-06-09 16:02:16 +10:00
e78bddd6d3 readme: Added info on new wallets 2023-06-09 14:46:55 +10:00
26bec13292 main: Added transfer form for individual domain transfers 2023-06-09 14:43:02 +10:00
01877a67b6 main: Finished adding cold wallet support 2023-06-09 14:14:14 +10:00
2ad933318c hsd-ledger: Added node script for ledger wallets 2023-06-09 14:02:44 +10:00
b1e3cd5818 main: Cold wallet batching 2023-06-09 13:14:59 +10:00
43c064fd7d main: Added cold wallet sending HNS 2023-06-09 12:56:27 +10:00
0f84462a03 main: Import wallets and rescan 2023-06-09 11:36:54 +10:00
4a4527657c main: Added new wallet creation 2023-06-08 23:09:16 +10:00
b71a5f7290 splashscreen: Fix sizing and added link
- Added a new label2 control to the designer file
- Created a new event handler for the label2_Click method in SplashScreen.cs
- Implemented ProcessStartInfo and Process.Start() methods to open website
2023-06-08 21:04:10 +10:00
9d0db3193c main: Fixed startup bugs 2023-06-08 19:21:38 +10:00
47 changed files with 10650 additions and 1323 deletions

View File

@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.6.33723.286 VisualStudioVersion = 17.6.33723.286
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FireWallet", "FireWallet\FireWallet.csproj", "{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FireWallet", "FireWallet\FireWallet.csproj", "{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "FireWalletSetup", "FireWalletSetup\FireWalletSetup.vdproj", "{D1751AFE-92C3-4C7E-B5E1-D1D6420A30EA}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,8 @@ Global
{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Debug|Any CPU.Build.0 = Debug|Any CPU {14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Release|Any CPU.Build.0 = Release|Any CPU {14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}.Release|Any CPU.Build.0 = Release|Any CPU
{D1751AFE-92C3-4C7E-B5E1-D1D6420A30EA}.Debug|Any CPU.ActiveCfg = Debug
{D1751AFE-92C3-4C7E-B5E1-D1D6420A30EA}.Release|Any CPU.ActiveCfg = Release
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -1,8 +1,10 @@
using System.Data; using System.Data;
using System.Diagnostics;
using System.Net; using System.Net;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Microsoft.VisualBasic; using System.Text;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using ContentAlignment = System.Drawing.ContentAlignment;
using Point = System.Drawing.Point; using Point = System.Drawing.Point;
namespace FireWallet namespace FireWallet
@@ -21,6 +23,13 @@ namespace FireWallet
this.mainForm = mainForm; this.mainForm = mainForm;
batches = new Batch[0]; batches = new Batch[0];
} }
public void bringToFront()
{
// Minimize this form and bring it back up
this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
}
public void AddBatch(string domain, string operation) public void AddBatch(string domain, string operation)
{ {
if (operation == "BID") return; if (operation == "BID") return;
@@ -56,7 +65,7 @@ namespace FireWallet
List<Batch> temp = new List<Batch>(); List<Batch> temp = new List<Batch>();
foreach (Batch batch in batches) foreach (Batch batch in batches)
{ {
if (batch.domain != domain && batch.method != operation) if (batch.domain != domain || batch.method != operation)
{ {
temp.Add(batch); temp.Add(batch);
} }
@@ -68,7 +77,6 @@ namespace FireWallet
tx.Controls.Add(deleteTX); tx.Controls.Add(deleteTX);
panelTXs.Controls.Add(tx); panelTXs.Controls.Add(tx);
UpdateTheme();
} }
public void AddBatch(string domain, string operation, decimal bid, decimal lockup) public void AddBatch(string domain, string operation, decimal bid, decimal lockup)
{ {
@@ -120,7 +128,7 @@ namespace FireWallet
List<Batch> temp = new List<Batch>(); List<Batch> temp = new List<Batch>();
foreach (Batch batch in batches) foreach (Batch batch in batches)
{ {
if (batch.domain != domain && batch.method != operation) if (batch.domain != domain || batch.method != operation)
{ {
temp.Add(batch); temp.Add(batch);
} }
@@ -132,7 +140,6 @@ namespace FireWallet
tx.Controls.Add(deleteTX); tx.Controls.Add(deleteTX);
panelTXs.Controls.Add(tx); panelTXs.Controls.Add(tx);
UpdateTheme();
} }
public void AddBatch(string domain, string operation, string toAddress) public void AddBatch(string domain, string operation, string toAddress)
{ {
@@ -180,7 +187,7 @@ namespace FireWallet
List<Batch> temp = new List<Batch>(); List<Batch> temp = new List<Batch>();
foreach (Batch batch in batches) foreach (Batch batch in batches)
{ {
if (batch.domain != domain && batch.method != operation) if (batch.domain != domain || batch.method != operation)
{ {
temp.Add(batch); temp.Add(batch);
} }
@@ -192,7 +199,6 @@ namespace FireWallet
tx.Controls.Add(deleteTX); tx.Controls.Add(deleteTX);
panelTXs.Controls.Add(tx); panelTXs.Controls.Add(tx);
UpdateTheme();
} }
public void AddBatch(string domain, string operation, DNS[] updateRecords) public void AddBatch(string domain, string operation, DNS[] updateRecords)
@@ -236,7 +242,7 @@ namespace FireWallet
List<Batch> temp = new List<Batch>(); List<Batch> temp = new List<Batch>();
foreach (Batch batch in batches) foreach (Batch batch in batches)
{ {
if (batch.domain != domain && batch.method != operation) if (batch.domain != domain || batch.method != operation)
{ {
temp.Add(batch); temp.Add(batch);
} }
@@ -248,7 +254,6 @@ namespace FireWallet
tx.Controls.Add(deleteTX); tx.Controls.Add(deleteTX);
panelTXs.Controls.Add(tx); panelTXs.Controls.Add(tx);
UpdateTheme();
} }
private void FixSpacing() private void FixSpacing()
@@ -268,7 +273,7 @@ namespace FireWallet
} }
#endregion #endregion
#region Theming #region Theming
private void UpdateTheme() public void UpdateTheme()
{ {
// Check if file exists // Check if file exists
if (!Directory.Exists(dir)) if (!Directory.Exists(dir))
@@ -311,7 +316,7 @@ namespace FireWallet
} }
applyTransparency(theme); applyTransparency(theme);
bringToFront();
} }
private void ThemeControl(Control c) private void ThemeControl(Control c)
{ {
@@ -461,37 +466,186 @@ namespace FireWallet
HttpClient httpClient = new HttpClient(); HttpClient httpClient = new HttpClient();
private async void buttonSend_Click(object sender, EventArgs e) private async void buttonSend_Click(object sender, EventArgs e)
{ {
string batchTX = "[" + string.Join(", ", batches.Select(batch => batch.ToString())) + "]"; if (!mainForm.WatchOnly && !mainForm.multiSig)
string content = "{\"method\": \"sendbatch\",\"params\":[ " + batchTX + "]}";
string responce = await APIPost("", true, content);
if (responce == "Error")
{ {
AddLog("Error sending batch"); string batchTX = "[" + string.Join(", ", batches.Select(batch => batch.ToString())) + "]";
NotifyForm notifyForm = new NotifyForm("Error sending batch"); string content = "{\"method\": \"sendbatch\",\"params\":[ " + batchTX + "]}";
notifyForm.ShowDialog(); string responce = await APIPost("", true, content);
notifyForm.Dispose();
return;
}
JObject jObject = JObject.Parse(responce); if (responce == "Error")
if (jObject["error"].ToString() != "") {
AddLog("Error sending batch");
NotifyForm notifyForm = new NotifyForm("Error sending batch");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject jObject = JObject.Parse(responce);
if (jObject["error"].ToString() != "")
{
AddLog("Error: ");
AddLog(jObject["error"].ToString());
if (jObject["error"].ToString().Contains("Batch output addresses would exceed lookahead"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nBatch output addresses would exceed lookahead\nYour batch might have too many TXs.");
notifyForm.ShowDialog();
notifyForm.Dispose();
} else if (jObject["error"].ToString().Contains("Name is not registered"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nName is not registered\nRemember you can't renew domains in transfer");
notifyForm.ShowDialog();
notifyForm.Dispose();
}
else
{
NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString());
notifyForm.ShowDialog();
notifyForm.Dispose();
}
return;
}
JObject result = JObject.Parse(jObject["result"].ToString());
string hash = result["hash"].ToString();
AddLog("Batch sent with hash: " + hash);
NotifyForm notifyForm2 = new NotifyForm("Batch sent\nThis might take a while to mine.", "Explorer", mainForm.UserSettings["explorer-tx"] + hash);
notifyForm2.ShowDialog();
notifyForm2.Dispose();
this.Close();
}
else if (mainForm.multiSig)
{ {
AddLog("Error: "); string batchTX = "[" + string.Join(", ", batches.Select(batch => batch.ToString())) + "]";
AddLog(jObject["error"].ToString()); string content = "{\"method\": \"createbatch\",\"params\":[ " + batchTX + "]}";
NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString()); string responce = await APIPost("", true, content);
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject result = JObject.Parse(jObject["result"].ToString()); if (responce == "Error")
string hash = result["hash"].ToString(); {
AddLog("Batch sent with hash: " + hash); AddLog("Error sending batch");
NotifyForm notifyForm2 = new NotifyForm("Batch sent\nThis might take a while to mine.", "Explorer", mainForm.userSettings["explorer-tx"] + hash); NotifyForm notifyForm = new NotifyForm("Error sending batch");
notifyForm2.ShowDialog(); notifyForm.ShowDialog();
notifyForm2.Dispose(); notifyForm.Dispose();
this.Close(); return;
}
JObject jObject = JObject.Parse(responce);
if (jObject["error"].ToString() != "")
{
AddLog("Error: ");
AddLog(jObject["error"].ToString());
if (jObject["error"].ToString().Contains("Batch output addresses would exceed lookahead"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nBatch output addresses would exceed lookahead\nYour batch might have too many TXs.");
notifyForm.ShowDialog();
notifyForm.Dispose();
}
else if (jObject["error"].ToString().Contains("Name is not registered"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nName is not registered\nRemember you can't renew domains in transfer");
notifyForm.ShowDialog();
notifyForm.Dispose();
}
else
{
NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString());
notifyForm.ShowDialog();
notifyForm.Dispose();
}
return;
}
string[] domains = batches.Select(batch => batch.domain).ToArray();
string tx = await mainForm.ExportTransaction(jObject["result"].ToString(),domains);
if (tx != "Error")
{
ImportTXForm importTXForm = new ImportTXForm(mainForm, tx);
this.Hide();
importTXForm.ShowDialog();
importTXForm.Dispose();
this.Close();
}
}
else // watch only
{
string batchTX = "[" + string.Join(", ", batches.Select(batch => batch.ToString())) + "]";
string content = "{\"method\": \"createbatch\",\"params\":[ " + batchTX + "]}";
string response = await APIPost("", true, content);
if (response == "Error")
{
AddLog("Error creating batch");
NotifyForm notifyForm = new NotifyForm("Error creating batch");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject jObject = JObject.Parse(response);
if (jObject["error"].ToString() != "")
{
AddLog("Error: ");
AddLog(jObject["error"].ToString());
NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString());
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
string domainslist = string.Join(",", batches.Select(batch => "\\\"" + batch.domain + "\\\""));
NotifyForm notify = new NotifyForm("Please confirm the transaction on your Ledger device", false);
notify.Show();
var proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardInput = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "node.exe";
proc.StartInfo.WorkingDirectory = dir + "hsd-ledger/bin/";
string args = "hsd-ledger/bin/hsd-ledger sendraw \"\"" + response.Replace("\"","\\\"") + "\"\" [" + domainslist + "] --api-key " + mainForm.NodeSettings["Key"] + " -w " + mainForm.Account;
proc.StartInfo.Arguments = dir + args;
var outputBuilder = new StringBuilder();
// Event handler for capturing output data
proc.OutputDataReceived += (sender, args) =>
{
if (!string.IsNullOrEmpty(args.Data))
{
outputBuilder.AppendLine(args.Data);
}
};
proc.Start();
proc.BeginOutputReadLine();
proc.WaitForExit();
notify.CloseNotification();
notify.Dispose();
string output = outputBuilder.ToString();
AddLog(output);
if (output.Contains("Submitted TXID"))
{
string hash = output.Substring(output.IndexOf("Submitted TXID") + 16, 64);
string link = mainForm.UserSettings["explorer-tx"] + hash;
NotifyForm notifySuccess = new NotifyForm("Transaction Sent\nThis transaction could take up to 20 minutes to mine",
"Explorer", link);
notifySuccess.ShowDialog();
this.Close();
}
else
{
AddLog(args);
AddLog(proc.StandardError.ReadToEnd());
NotifyForm notifyError = new NotifyForm("Error Transaction Failed\nCheck logs for more details");
notifyError.ShowDialog();
notifyError.Dispose();
}
}
} }
private void BatchForm_FormClosing(object sender, FormClosingEventArgs e) private void BatchForm_FormClosing(object sender, FormClosingEventArgs e)
@@ -519,7 +673,7 @@ namespace FireWallet
} }
else if (b.method == "UPDATE") else if (b.method == "UPDATE")
{ {
sw.WriteLine(b.domain + "," + b.method + ",[" + string.Join(", ", b.update.Select(record => record.ToString())) + "]"); sw.WriteLine(b.domain + "," + b.method + ",[" + string.Join(";", b.update.Select(record => record.ToString())) + "]");
} }
else else
{ {
@@ -533,21 +687,89 @@ namespace FireWallet
private void buttonImport_Click(object sender, EventArgs e) private void buttonImport_Click(object sender, EventArgs e)
{ {
OpenFileDialog openFileDialog = new OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "CSV File|*.csv|TXT File|*.txt"; openFileDialog.Filter = "All Files|*.*";
openFileDialog.Title = "Open Batch"; openFileDialog.Title = "Open Batch";
if (openFileDialog.ShowDialog() == DialogResult.OK) if (openFileDialog.ShowDialog() == DialogResult.OK)
{ {
StreamReader sr = new StreamReader(openFileDialog.FileName); try
string line;
string[] domains = new string[0];
while ((line = sr.ReadLine()) != null)
{ {
string[] split = line.Split(','); StreamReader sr = new StreamReader(openFileDialog.FileName);
try string line;
string[] domains = new string[0];
while ((line = sr.ReadLine()) != null)
{ {
if (split.Length > 2) string[] split = line.Split(',');
try
{ {
if (split[1] == "UPDATE") if (split.Length > 2)
{
if (split[1] == "UPDATE")
{
// Join the rest of the line
string[] updateArray = new string[split.Length - 2];
for (int i = 0; i < updateArray.Length; i++)
{
updateArray[i] = split[i + 2];
}
string updateString = string.Join(",", updateArray);
updateString.TrimStart('[');
updateString.TrimEnd(']');
string[] updateSplit = updateString.Split(';');
DNS[] UpdateRecords = new DNS[updateSplit.Length];
int r = 0;
foreach (string update in updateSplit)
{
string[] updateRecord = update.Split(',');
string type = updateRecord[0];
type = type.Split(':')[1].Replace("\"","").Trim();
switch (type)
{
case "NS":
string ns = updateRecord[1].Split(':')[1].Replace("\"","").Replace("}","").Trim();
UpdateRecords[r] = new DNS(type, ns);
break;
case "DS":
int keyTag = int.Parse(updateRecord[1].Split(':')[1]);
int algorithm = int.Parse(updateRecord[2].Split(':')[1]);
int digestType = int.Parse(updateRecord[3].Split(':')[1]);
string digest = updateRecord[4].Split(':')[1].Replace("\"", "").Replace("}", "");
UpdateRecords[r] = new DNS(type, keyTag, algorithm, digestType, digest);
break;
case "TXT":
string txt = updateRecord[1].Split(':')[1].Replace("\"", "").Replace("}", "");
txt = txt.Replace("[", "");
txt = txt.Replace("]", "");
UpdateRecords[r] = new DNS(type, new string[] { txt.Trim() });
break;
case "GLUE4":
case "GLUE6":
string nsGlue = updateRecord[1].Split(':')[1].Replace("\"", "").Trim();
string address = updateRecord[2].Split(':')[1].Replace("\"", "").Replace("}", "").Trim();
UpdateRecords[r] = new DNS(type, nsGlue, address);
break;
}
r++;
}
AddBatch(split[0], split[1], UpdateRecords);
continue;
}
}
if (split.Length == 2)
{
AddBatch(split[0], split[1]);
}
else if (split.Length == 3)
{
AddBatch(split[0], split[1], split[2]);
}
else if (split.Length == 4)
{
AddBatch(split[0], split[1], Convert.ToDecimal(split[2]), Convert.ToDecimal(split[3]));
}
else
{ {
// Select operation and import domains // Select operation and import domains
string[] newDomains = new string[domains.Length + 1]; string[] newDomains = new string[domains.Length + 1];
@@ -555,68 +777,53 @@ namespace FireWallet
{ {
newDomains[i] = domains[i]; newDomains[i] = domains[i];
} }
newDomains[domains.Length] = split[0]; newDomains[domains.Length] = line.Trim();
domains = newDomains; domains = newDomains;
continue;
} }
} }
catch (Exception ex)
if (split.Length == 2)
{ {
AddBatch(split[0], split[1]); AddLog("Error importing batch: " + ex.Message);
} NotifyForm notifyForm = new NotifyForm("Error importing batch");
else if (split.Length == 3) notifyForm.ShowDialog();
{ notifyForm.Dispose();
AddBatch(split[0], split[1], split[2]);
}
else if (split.Length == 4)
{
AddBatch(split[0], split[1], Convert.ToDecimal(split[2]), Convert.ToDecimal(split[3]));
}
else
{
// Select operation and import domains
string[] newDomains = new string[domains.Length + 1];
for (int i = 0; i < domains.Length; i++)
{
newDomains[i] = domains[i];
}
newDomains[domains.Length] = line.Trim();
domains = newDomains;
} }
} }
catch (Exception ex) if (domains.Length > 0)
{ {
AddLog("Error importing batch: " + ex.Message); BatchImportForm batchImportForm = new BatchImportForm(domains,mainForm);
NotifyForm notifyForm = new NotifyForm("Error importing batch"); batchImportForm.ShowDialog();
notifyForm.ShowDialog(); if (batchImportForm.batches != null)
notifyForm.Dispose(); {
foreach (Batch b in batchImportForm.batches)
{
if (b.method == "BID")
{
AddBatch(b.domain, b.method, b.bid, b.lockup);
}
else if (b.method == "TRANSFER")
{
AddBatch(b.domain, b.method, b.toAddress);
}
else if (b.method == "UPDATE")
{
AddBatch(b.domain, b.method, b.update);
}
else
{
AddBatch(b.domain, b.method);
}
}
}
} }
} sr.Dispose();
if (domains.Length > 0) } catch (Exception ex)
{ {
BatchImportForm batchImportForm = new BatchImportForm(domains); AddLog("Error importing batch: " + ex.Message);
batchImportForm.ShowDialog(); NotifyForm notifyForm = new NotifyForm("Error importing batch\nMake sure the file is in not in use");
if (batchImportForm.batches != null) notifyForm.ShowDialog();
{ notifyForm.Dispose();
foreach (Batch b in batchImportForm.batches)
{
if (b.method == "BID")
{
AddBatch(b.domain, b.method, b.bid, b.lockup);
}
else if (b.method == "TRANSFER")
{
AddBatch(b.domain, b.method, b.toAddress);
}
else
{
AddBatch(b.domain, b.method);
}
}
}
} }
sr.Dispose();
} }
} }
@@ -629,10 +836,10 @@ namespace FireWallet
/// <returns></returns> /// <returns></returns>
private async Task<string> APIPost(string path, bool wallet, string content) private async Task<string> APIPost(string path, bool wallet, string content)
{ {
string key = mainForm.nodeSettings["Key"]; string key = mainForm.NodeSettings["Key"];
string ip = mainForm.nodeSettings["IP"]; string ip = mainForm.NodeSettings["IP"];
string port = "1203"; string port = "1203";
if (mainForm.network == 1) if (mainForm.HSDNetwork == 1)
{ {
port = "1303"; port = "1303";
} }
@@ -644,21 +851,26 @@ namespace FireWallet
req.Content = new StringContent(content); req.Content = new StringContent(content);
// Send request // Send request
HttpResponseMessage resp = await httpClient.SendAsync(req);
try try
{ {
resp.EnsureSuccessStatusCode(); HttpResponseMessage resp = await httpClient.SendAsync(req);
if (resp.StatusCode != HttpStatusCode.OK)
{
AddLog("Post Error: " + resp.StatusCode.ToString());
AddLog(await resp.Content.ReadAsStringAsync());
AddLog(content);
return "Error";
}
return await resp.Content.ReadAsStringAsync();
} }
catch (Exception ex) catch (Exception ex)
{ {
AddLog("Post Error: " + ex.Message); AddLog("Post Error: " + ex.Message);
AddLog(await resp.Content.ReadAsStringAsync());
AddLog(content);
return "Error"; return "Error";
} }
return await resp.Content.ReadAsStringAsync();
} }
} }
public class Batch public class Batch
@@ -720,6 +932,10 @@ namespace FireWallet
return "[\"UPDATE\", \"" + domain + "\", " + records + "]"; return "[\"UPDATE\", \"" + domain + "\", " + records + "]";
} }
else if (method == "UPDATE")
{
return "[\"UPDATE\", \"" + domain + "\", {\"records\":[]}]";
}
return "[\"" + method + "\", \"" + domain + "\"]"; return "[\"" + method + "\", \"" + domain + "\"]";
} }
} }

View File

@@ -72,7 +72,7 @@
comboBoxMode.FlatStyle = FlatStyle.Flat; comboBoxMode.FlatStyle = FlatStyle.Flat;
comboBoxMode.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); comboBoxMode.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
comboBoxMode.FormattingEnabled = true; comboBoxMode.FormattingEnabled = true;
comboBoxMode.Items.AddRange(new object[] { "OPEN", "BID", "REVEAL", "REDEEM", "RENEW", "TRANSFER", "FINALIZE", "CANCEL" }); comboBoxMode.Items.AddRange(new object[] { "OPEN", "BID", "REVEAL", "REDEEM", "REGISTER", "RENEW", "TRANSFER", "FINALIZE", "CANCEL" });
comboBoxMode.Location = new Point(346, 42); comboBoxMode.Location = new Point(346, 42);
comboBoxMode.Name = "comboBoxMode"; comboBoxMode.Name = "comboBoxMode";
comboBoxMode.Size = new Size(226, 29); comboBoxMode.Size = new Size(226, 29);

View File

@@ -8,12 +8,14 @@ namespace FireWallet
Dictionary<string, string> theme; Dictionary<string, string> theme;
string[] domains; string[] domains;
public Batch[] batches { get; set; } public Batch[] batches { get; set; }
MainForm mainForm;
public BatchImportForm(string[] domains) public BatchImportForm(string[] domains, MainForm mainForm)
{ {
InitializeComponent(); InitializeComponent();
this.domains = domains; this.domains = domains;
comboBoxMode.SelectedIndex = 1; comboBoxMode.SelectedIndex = 1;
this.mainForm = mainForm;
} }
private void BatchImportForm_Load(object sender, EventArgs e) private void BatchImportForm_Load(object sender, EventArgs e)
@@ -218,7 +220,7 @@ namespace FireWallet
this.Close(); this.Close();
} }
private void buttonImport_Click(object sender, EventArgs e) private async void buttonImport_Click(object sender, EventArgs e)
{ {
if (comboBoxMode.Text == "BID") if (comboBoxMode.Text == "BID")
{ {
@@ -263,7 +265,7 @@ namespace FireWallet
} }
this.Close(); this.Close();
} }
else if (comboBoxMode.Text == "TRANSFER") else if (comboBoxMode.Text == "REGISTER")
{ {
batches = new Batch[0]; batches = new Batch[0];
foreach (string domain in listBoxDomains.Items) foreach (string domain in listBoxDomains.Items)
@@ -272,7 +274,48 @@ namespace FireWallet
{ {
Batch[] newBatch = new Batch[batches.Length + 1]; Batch[] newBatch = new Batch[batches.Length + 1];
Array.Copy(batches, newBatch, batches.Length); Array.Copy(batches, newBatch, batches.Length);
newBatch[newBatch.Length - 1] = new Batch(domain, comboBoxMode.Text, textBoxToAddress.Text); newBatch[newBatch.Length - 1] = new Batch(domain,"UPDATE",new DNS[0]);
batches = newBatch;
}
}
this.Close();
}
else if (comboBoxMode.Text == "TRANSFER")
{
if (textBoxToAddress.Text == "")
{
MessageBox.Show("Please enter a to address");
return;
}
string address = textBoxToAddress.Text;
if (address.Substring(0,1) == "@")
{
address = await mainForm.HIP02Lookup(address.Substring(1));
if (address == "ERROR")
{
NotifyForm notify = new NotifyForm("Invalid HIP-02 address");
notify.ShowDialog();
notify.Dispose();
return;
}
}
if (!(await mainForm.ValidAddress(address)))
{
NotifyForm notify = new NotifyForm("Invalid address");
notify.ShowDialog();
notify.Dispose();
return;
}
batches = new Batch[0];
foreach (string domain in listBoxDomains.Items)
{
if (domain != "")
{
Batch[] newBatch = new Batch[batches.Length + 1];
Array.Copy(batches, newBatch, batches.Length);
newBatch[newBatch.Length - 1] = new Batch(domain, comboBoxMode.Text, address);
batches = newBatch; batches = newBatch;
} }
} }

View File

@@ -27,7 +27,7 @@ namespace FireWallet
InitializeComponent(); InitializeComponent();
this.domain = domain; this.domain = domain;
this.mainForm = mainForm; this.mainForm = mainForm;
nodeSettings = mainForm.nodeSettings; nodeSettings = mainForm.NodeSettings;
cancel = true; cancel = true;
this.Text = domain + "/ DNS | FireWallet"; this.Text = domain + "/ DNS | FireWallet";
@@ -363,6 +363,12 @@ namespace FireWallet
string contentDNS = "{\"method\": \"getnameresource\", \"params\": [\"" + domain + "\"]}"; string contentDNS = "{\"method\": \"getnameresource\", \"params\": [\"" + domain + "\"]}";
string responseDNS = await APIPost("", false, contentDNS); string responseDNS = await APIPost("", false, contentDNS);
JObject jObjectDNS = JObject.Parse(responseDNS); JObject jObjectDNS = JObject.Parse(responseDNS);
if (jObjectDNS["result"].ToString() == "")
{
return;
}
JObject result = (JObject)jObjectDNS["result"]; JObject result = (JObject)jObjectDNS["result"];
JArray records = (JArray)result["records"]; JArray records = (JArray)result["records"];
// For each record // For each record
@@ -439,7 +445,7 @@ namespace FireWallet
string key = nodeSettings["Key"]; string key = nodeSettings["Key"];
string ip = nodeSettings["IP"]; string ip = nodeSettings["IP"];
string port = "1203"; string port = "1203";
if (mainForm.network == 1) if (mainForm.HSDNetwork == 1)
{ {
port = "1303"; port = "1303";
} }
@@ -478,7 +484,7 @@ namespace FireWallet
string ip = nodeSettings["IP"]; string ip = nodeSettings["IP"];
string port = "1203"; string port = "1203";
if (mainForm.network == 1) if (mainForm.HSDNetwork == 1)
{ {
port = "1303"; port = "1303";
} }

View File

@@ -32,36 +32,7 @@ namespace FireWallet
this.explorerTX = explorerTX; this.explorerTX = explorerTX;
this.explorerName = explorerName; this.explorerName = explorerName;
this.mainForm = mainForm; this.mainForm = mainForm;
} this.theme = mainForm.Theme;
#region Theming
private void UpdateTheme()
{
// Check if file exists
if (!Directory.Exists(dir))
{
CreateConfig(dir);
}
if (!File.Exists(dir + "theme.txt"))
{
CreateConfig(dir);
}
// Read file
StreamReader sr = new StreamReader(dir + "theme.txt");
theme = new Dictionary<string, string>();
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string[] split = line.Split(':');
theme.Add(split[0].Trim(), split[1].Trim());
}
sr.Dispose();
if (!theme.ContainsKey("background") || !theme.ContainsKey("background-alt") || !theme.ContainsKey("foreground") || !theme.ContainsKey("foreground-alt"))
{
return;
}
// Apply theme // Apply theme
this.BackColor = ColorTranslator.FromHtml(theme["background"]); this.BackColor = ColorTranslator.FromHtml(theme["background"]);
@@ -73,35 +44,12 @@ namespace FireWallet
// Need to specify this for each groupbox to override the black text // Need to specify this for each groupbox to override the black text
foreach (Control c in Controls) foreach (Control c in Controls)
{ {
ThemeControl(c); mainForm.ThemeControl(c);
} }
applyTransparency(mainForm.Theme);
// Transparancy
applyTransparency(theme);
} }
private void ThemeControl(Control c) #region Theme
{
if (c.GetType() == typeof(GroupBox) || c.GetType() == typeof(Panel))
{
c.ForeColor = ColorTranslator.FromHtml(theme["foreground"]);
foreach (Control sub in c.Controls)
{
ThemeControl(sub);
}
}
if (c.GetType() == typeof(TextBox) || c.GetType() == typeof(Button)
|| c.GetType() == typeof(ComboBox) || c.GetType() == typeof(StatusStrip))
{
c.ForeColor = ColorTranslator.FromHtml(theme["foreground-alt"]);
c.BackColor = ColorTranslator.FromHtml(theme["background-alt"]);
}
}
private void applyTransparency(Dictionary<string, string> theme) private void applyTransparency(Dictionary<string, string> theme)
{ {
if (theme.ContainsKey("transparent-mode")) if (theme.ContainsKey("transparent-mode"))
@@ -148,26 +96,6 @@ namespace FireWallet
} }
} }
} }
private void CreateConfig(string dir)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
StreamWriter sw = new StreamWriter(dir + "theme.txt");
sw.WriteLine("background: #000000");
sw.WriteLine("foreground: #8e05c2");
sw.WriteLine("background-alt: #3e065f");
sw.WriteLine("foreground-alt: #ffffff");
sw.WriteLine("transparent-mode: off");
sw.WriteLine("transparency-key: main");
sw.WriteLine("transparency-percent: 90");
sw.Dispose();
}
// Required for mica effect // Required for mica effect
internal enum AccentState internal enum AccentState
{ {
@@ -209,7 +137,6 @@ namespace FireWallet
private void DomainForm_Load(object sender, EventArgs e) private void DomainForm_Load(object sender, EventArgs e)
{ {
UpdateTheme();
own = false; own = false;
StreamReader sr = new StreamReader(dir + "node.txt"); StreamReader sr = new StreamReader(dir + "node.txt");
nodeSettings = new Dictionary<string, string>(); nodeSettings = new Dictionary<string, string>();
@@ -229,6 +156,11 @@ namespace FireWallet
} }
network = Convert.ToInt32(nodeSettings["Network"]); network = Convert.ToInt32(nodeSettings["Network"]);
GetName(); GetName();
if (mainForm.WatchOnly || mainForm.multiSig)
{
buttonActionMain.Enabled = false; // Only allow sending in batches for ledger and multisig to prevent confusion
}
} }
#region API #region API
private async void GetName() private async void GetName()
@@ -325,6 +257,14 @@ namespace FireWallet
{ {
labelStatusMain.Text = "Error"; labelStatusMain.Text = "Error";
} }
if (labelStatusReserved.Text == "True")
{
buttonActionAlt.Hide();
buttonActionMain.Hide();
groupBoxAction.Text = "Reserved";
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -339,6 +279,14 @@ namespace FireWallet
string contentDNS = "{\"method\": \"getnameresource\", \"params\": [\"" + domain + "\"]}"; string contentDNS = "{\"method\": \"getnameresource\", \"params\": [\"" + domain + "\"]}";
string responseDNS = await APIPost("", false, contentDNS); string responseDNS = await APIPost("", false, contentDNS);
JObject jObjectDNS = JObject.Parse(responseDNS); JObject jObjectDNS = JObject.Parse(responseDNS);
if (jObjectDNS["result"].ToString() == "")
{
// Not registered
groupBoxDNS.Visible = false;
return;
}
JObject result = (JObject)jObjectDNS["result"]; JObject result = (JObject)jObjectDNS["result"];
JArray records = (JArray)result["records"]; JArray records = (JArray)result["records"];
// For each record // For each record
@@ -766,9 +714,6 @@ namespace FireWallet
} }
else if (state == "REVEAL") else if (state == "REVEAL")
{ {
decimal bid = Convert.ToDecimal(textBoxBid.Text);
decimal blind = Convert.ToDecimal(textBoxBlind.Text);
decimal lockup = bid + blind;
string content = "{\"method\": \"sendreveal\", \"params\": [\"" + domain + "\"]}"; string content = "{\"method\": \"sendreveal\", \"params\": [\"" + domain + "\"]}";
string response = await APIPost("", true, content); string response = await APIPost("", true, content);
@@ -802,9 +747,6 @@ namespace FireWallet
} }
else if (state == "AVAILABLE") else if (state == "AVAILABLE")
{ {
decimal bid = Convert.ToDecimal(textBoxBid.Text);
decimal blind = Convert.ToDecimal(textBoxBlind.Text);
decimal lockup = bid + blind;
string content = "{\"method\": \"sendopen\", \"params\": [\"" + domain + "\"]}"; string content = "{\"method\": \"sendopen\", \"params\": [\"" + domain + "\"]}";
string response = await APIPost("", true, content); string response = await APIPost("", true, content);
@@ -880,7 +822,14 @@ namespace FireWallet
if (!DNSEdit.cancel) if (!DNSEdit.cancel)
{ {
string records = string.Join(", ", DNSEdit.DNSrecords.Select(record => record.ToString())); string records = "";
if (DNSEdit.DNSrecords != null)
{
if (DNSEdit.DNSrecords.Count() > 0)
{
records = string.Join(", ", DNSEdit.DNSrecords.Select(record => record.ToString()));
}
}
string content = "{\"method\": \"sendupdate\", \"params\": [\"" + domain + "\", {\"records\": [" + records + "]}]}"; string content = "{\"method\": \"sendupdate\", \"params\": [\"" + domain + "\", {\"records\": [" + records + "]}]}";
string response = await APIPost("", true, content); string response = await APIPost("", true, content);
@@ -1009,6 +958,9 @@ namespace FireWallet
private void buttonTransfer_Click(object sender, EventArgs e) private void buttonTransfer_Click(object sender, EventArgs e)
{ {
// Transfer // Transfer
TransferForm transferForm = new TransferForm(mainForm, domain);
transferForm.Show();
this.Close();
} }
} }
} }

BIN
FireWallet/FW.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -6,16 +6,17 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<ApplicationIcon>FW2.ico</ApplicationIcon> <ApplicationIcon>FW.ico</ApplicationIcon>
<Title>FireWallet</Title> <Title>FireWallet</Title>
<PackageProjectUrl>https://l.woodburn.au</PackageProjectUrl> <PackageProjectUrl>https://l.woodburn.au</PackageProjectUrl>
<PackageIcon>HSDBatcher.png</PackageIcon> <PackageIcon>HSDBatcher.png</PackageIcon>
<RepositoryUrl>https://github.com/Nathanwoodburn/FireWallet</RepositoryUrl> <RepositoryUrl>https://github.com/Nathanwoodburn/FireWallet</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<Version>4.0</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Content Include="FW2.ico" /> <Content Include="FW.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -26,7 +27,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DnsClient" Version="1.7.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
<PackageReference Include="QRCoder" Version="1.4.3" /> <PackageReference Include="QRCoder" Version="1.4.3" />
</ItemGroup> </ItemGroup>
@@ -36,6 +39,11 @@
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon> <DependentUpon>Resources.resx</DependentUpon>
</Compile> </Compile>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -45,4 +53,11 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
</Project> </Project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

223
FireWallet/ImportTXForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,223 @@
namespace FireWallet
{
partial class ImportTXForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImportTXForm));
groupBoxIn = new GroupBox();
panelIn = new Panel();
groupBoxOut = new GroupBox();
panelOut = new Panel();
buttonSign = new Button();
Cancelbutton2 = new Button();
label1 = new Label();
labelSigsTotal = new Label();
labelSigsReq = new Label();
labelSigsSigned = new Label();
labelSigInfo = new Label();
buttonExport = new Button();
buttonSend = new Button();
groupBoxIn.SuspendLayout();
groupBoxOut.SuspendLayout();
SuspendLayout();
//
// groupBoxIn
//
groupBoxIn.Controls.Add(panelIn);
groupBoxIn.Location = new Point(12, 83);
groupBoxIn.Name = "groupBoxIn";
groupBoxIn.Size = new Size(376, 355);
groupBoxIn.TabIndex = 3;
groupBoxIn.TabStop = false;
groupBoxIn.Text = "Inputs";
//
// panelIn
//
panelIn.AutoScroll = true;
panelIn.Dock = DockStyle.Fill;
panelIn.Location = new Point(3, 19);
panelIn.Name = "panelIn";
panelIn.Size = new Size(370, 333);
panelIn.TabIndex = 0;
//
// groupBoxOut
//
groupBoxOut.Controls.Add(panelOut);
groupBoxOut.Location = new Point(391, 80);
groupBoxOut.Name = "groupBoxOut";
groupBoxOut.Size = new Size(484, 355);
groupBoxOut.TabIndex = 0;
groupBoxOut.TabStop = false;
groupBoxOut.Text = "Outputs";
//
// panelOut
//
panelOut.AutoScroll = true;
panelOut.Dock = DockStyle.Fill;
panelOut.Location = new Point(3, 19);
panelOut.Name = "panelOut";
panelOut.Size = new Size(478, 333);
panelOut.TabIndex = 0;
//
// buttonSign
//
buttonSign.FlatStyle = FlatStyle.Flat;
buttonSign.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonSign.Location = new Point(700, 444);
buttonSign.Name = "buttonSign";
buttonSign.Size = new Size(83, 36);
buttonSign.TabIndex = 2;
buttonSign.Text = "Sign";
buttonSign.UseVisualStyleBackColor = true;
buttonSign.Click += buttonSign_Click;
//
// Cancelbutton2
//
Cancelbutton2.FlatStyle = FlatStyle.Flat;
Cancelbutton2.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
Cancelbutton2.Location = new Point(12, 441);
Cancelbutton2.Name = "Cancelbutton2";
Cancelbutton2.Size = new Size(83, 36);
Cancelbutton2.TabIndex = 2;
Cancelbutton2.Text = "Cancel";
Cancelbutton2.UseVisualStyleBackColor = true;
Cancelbutton2.Click += Cancel;
//
// label1
//
label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
label1.Location = new Point(12, 9);
label1.Name = "label1";
label1.Size = new Size(87, 21);
label1.TabIndex = 4;
label1.Text = "Signatures:";
//
// labelSigsTotal
//
labelSigsTotal.BackColor = Color.Blue;
labelSigsTotal.Location = new Point(105, 7);
labelSigsTotal.Name = "labelSigsTotal";
labelSigsTotal.Size = new Size(250, 32);
labelSigsTotal.TabIndex = 5;
//
// labelSigsReq
//
labelSigsReq.BackColor = Color.FromArgb(255, 128, 0);
labelSigsReq.Location = new Point(105, 7);
labelSigsReq.Name = "labelSigsReq";
labelSigsReq.Size = new Size(191, 32);
labelSigsReq.TabIndex = 6;
//
// labelSigsSigned
//
labelSigsSigned.BackColor = Color.Lime;
labelSigsSigned.Location = new Point(105, 7);
labelSigsSigned.Name = "labelSigsSigned";
labelSigsSigned.Size = new Size(100, 32);
labelSigsSigned.TabIndex = 7;
//
// labelSigInfo
//
labelSigInfo.AutoSize = true;
labelSigInfo.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
labelSigInfo.Location = new Point(361, 7);
labelSigInfo.Name = "labelSigInfo";
labelSigInfo.Size = new Size(19, 21);
labelSigInfo.TabIndex = 8;
labelSigInfo.Text = "#";
//
// buttonExport
//
buttonExport.Enabled = false;
buttonExport.FlatStyle = FlatStyle.Flat;
buttonExport.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonExport.Location = new Point(611, 444);
buttonExport.Name = "buttonExport";
buttonExport.Size = new Size(83, 36);
buttonExport.TabIndex = 2;
buttonExport.Text = "Export";
buttonExport.UseVisualStyleBackColor = true;
buttonExport.Click += buttonExport_Click;
//
// buttonSend
//
buttonSend.FlatStyle = FlatStyle.Flat;
buttonSend.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonSend.Location = new Point(789, 444);
buttonSend.Name = "buttonSend";
buttonSend.Size = new Size(83, 36);
buttonSend.TabIndex = 2;
buttonSend.Text = "Send";
buttonSend.UseVisualStyleBackColor = true;
buttonSend.Click += buttonSend_Click;
//
// ImportTXForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(887, 485);
Controls.Add(labelSigInfo);
Controls.Add(labelSigsSigned);
Controls.Add(labelSigsReq);
Controls.Add(labelSigsTotal);
Controls.Add(label1);
Controls.Add(groupBoxOut);
Controls.Add(groupBoxIn);
Controls.Add(buttonSend);
Controls.Add(buttonExport);
Controls.Add(Cancelbutton2);
Controls.Add(buttonSign);
FormBorderStyle = FormBorderStyle.FixedSingle;
Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "ImportTXForm";
Text = "Import TX";
Load += ImportTXForm_Load;
groupBoxIn.ResumeLayout(false);
groupBoxOut.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
}
#endregion
private GroupBox groupBoxIn;
private GroupBox groupBoxOut;
private Button buttonSign;
private Button Cancelbutton2;
private Panel panelIn;
private Panel panelOut;
private Label label1;
private Label labelSigsTotal;
private Label labelSigsReq;
private Label labelSigsSigned;
private Label labelSigInfo;
private Button buttonExport;
private Button buttonSend;
}
}

347
FireWallet/ImportTXForm.cs Normal file
View File

@@ -0,0 +1,347 @@
using System.Windows.Forms.VisualStyles;
using Newtonsoft.Json.Linq;
namespace FireWallet
{
public partial class ImportTXForm : Form
{
MainForm mainForm;
JObject tx;
int totalSigs;
int reqSigs;
int sigs;
string signedTX;
string[] domains;
public ImportTXForm(MainForm mainForm)
{
InitializeComponent();
this.mainForm = mainForm;
tx = null;
}
public ImportTXForm(MainForm mainForm, string tx)
{
InitializeComponent();
this.mainForm = mainForm;
JObject txObj = JObject.Parse(tx);
this.tx = txObj;
}
private void ImportTXForm_Load(object sender, EventArgs e)
{
// Default variables
domains = new string[0];
signedTX = "";
totalSigs = 3;
reqSigs = 2;
sigs = 0;
// Theme
this.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
this.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
foreach (Control c in Controls)
{
mainForm.ThemeControl(c);
}
if (tx == null)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Transaction files (*.json)|*.json";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string tx = System.IO.File.ReadAllText(openFileDialog.FileName);
try
{
JObject txObj = JObject.Parse(tx);
this.tx = txObj;
}
catch
{
NotifyForm notifyForm = new NotifyForm("Invalid transaction file.");
notifyForm.ShowDialog();
notifyForm.Dispose();
this.Close();
}
}
}
ParseTX();
}
private void Cancel(object sender, EventArgs e)
{
this.Close();
}
private async void ParseTX()
{
if (tx == null) this.Close();
string hex = tx["tx"].ToString();
string content = "{\"method\":\"decoderawtransaction\",\"params\":[\"" + hex + "\"]}";
string response = await mainForm.APIPost("", false, content);
if (response == null)
{
NotifyForm notifyForm = new NotifyForm("Error decoding transaction");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject json = JObject.Parse(response);
if (json["error"].ToString() != "")
{
NotifyForm notifyForm = new NotifyForm("Error decoding transaction");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject metadata = (JObject)tx["metadata"];
JArray metaInputs = (JArray)metadata["inputs"];
JArray metaOutputs = (JArray)metadata["outputs"];
JArray inputs = (JArray)json["result"]["vin"];
JArray outputs = (JArray)json["result"]["vout"];
// Get multisig info
JObject firstIn = (JObject)inputs[0];
JArray witnesses = (JArray)firstIn["txinwitness"];
string scriptSig = witnesses[witnesses.Count - 1].ToString();
// decode script
string sigGetContent = "{\"method\":\"decodescript\",\"params\":[\"" + scriptSig + "\"]}";
string sigGetResponse = await mainForm.APIPost("", false, sigGetContent);
if (sigGetResponse == null)
{
NotifyForm notifyForm = new NotifyForm("Error decoding transaction");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject sigGetJson = JObject.Parse(sigGetResponse);
if (sigGetJson["error"].ToString() != "")
{
NotifyForm notifyForm = new NotifyForm("Error decoding transaction");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject sigGetResult = (JObject)sigGetJson["result"];
string[] asm = sigGetResult["asm"].ToString().Split(" ");
string totalSigsStr = asm[asm.Length - 2];
totalSigs = int.Parse(totalSigsStr.Replace("OP_", ""));
reqSigs = int.Parse(sigGetResult["reqSigs"].ToString());
sigs = -1;
for (int i = 0; i < witnesses.Count; i++)
{
string witness = witnesses[i].ToString();
if (witness != "")
{
sigs++;
}
}
// Set sig label sizes
labelSigsReq.Width = (labelSigsTotal.Width / totalSigs) * reqSigs;
labelSigsSigned.Width = (labelSigsTotal.Width / totalSigs) * sigs;
labelSigInfo.Text = "Signed: " + sigs + "\nReq: " + reqSigs + " of " + totalSigs;
if (sigs >= totalSigs)
{
buttonSign.Enabled = false;
buttonSign.Text = "Signed";
}
for (int i = 0; i < inputs.Count; i++)
{
JObject input = (JObject)inputs[i];
JObject metaInput = (JObject)metaInputs[i];
Panel PanelInput = new Panel();
PanelInput.Size = new Size(panelIn.Width - SystemInformation.VerticalScrollBarWidth - 10, 50);
PanelInput.Location = new Point(5, panelIn.Controls.Count * 50);
PanelInput.BorderStyle = BorderStyle.FixedSingle;
if (metaInput.ContainsKey("sighashType"))
{
Label sighashType = new Label();
sighashType.Text = "Sighash Type: " + metaInput["sighashType"].ToString();
sighashType.Location = new Point(5, 25);
sighashType.AutoSize = true;
PanelInput.Controls.Add(sighashType);
}
string txid = input["txid"].ToString();
int vout = int.Parse(input["vout"].ToString());
string txInfo = await mainForm.APIGet("tx/" + txid, false);
if (txInfo == "Error" || txInfo == "")
{
NotifyForm notifyForm = new NotifyForm("Error getting transaction info");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
else
{
JObject txInfoJson = JObject.Parse(txInfo);
JArray txoutputs = (JArray)txInfoJson["outputs"];
JObject txoutput = (JObject)txoutputs[vout];
string txoutputAddress = txoutput["address"].ToString();
Label address = new Label();
string addressString = txoutputAddress.Substring(0, 5) + "..." + txoutputAddress.Substring(txoutputAddress.Length - 5, 5);
address.Text = "Address: " + addressString;
address.Location = new Point(5, 5);
address.AutoSize = true;
PanelInput.Controls.Add(address);
Label amount = new Label();
Decimal value = Decimal.Parse(txoutput["value"].ToString()) / 1000000;
amount.Text = "Amount: " + value.ToString();
amount.Location = new Point(5, 25);
amount.AutoSize = true;
PanelInput.Controls.Add(amount);
}
panelIn.Controls.Add(PanelInput);
}
for (int i = 0; i < outputs.Count; i++)
{
JObject output = (JObject)outputs[i];
JObject metaOutput = (JObject)metaOutputs[i];
Panel PanelOutput = new Panel();
PanelOutput.Size = new Size(panelOut.Width - SystemInformation.VerticalScrollBarWidth - 10, 50);
PanelOutput.Location = new Point(5, panelOut.Controls.Count * 50);
PanelOutput.BorderStyle = BorderStyle.FixedSingle;
Label address = new Label();
JObject addressRaw = (JObject)output["address"];
string addressString = addressRaw["string"].ToString().Substring(0, 5) + "..." + addressRaw["string"].ToString().Substring(addressRaw["string"].ToString().Length - 5, 5);
address.Text = "Address: " + addressString;
address.Location = new Point(5, 5);
address.AutoSize = true;
PanelOutput.Controls.Add(address);
JObject covenant = (JObject)output["covenant"];
if (covenant.ContainsKey("action"))
{
if (covenant["action"].ToString() != "NONE")
{
if (metaOutput.ContainsKey("name"))
{
Label covenantLabel = new Label();
string name = metaOutput["name"].ToString();
covenantLabel.Text = covenant["action"].ToString() + ": " + name;
covenantLabel.Location = new Point(5, 25);
covenantLabel.AutoSize = true;
PanelOutput.Controls.Add(covenantLabel);
string[] domainsNew = new string[domains.Length + 1];
for (int j = 0; j < domains.Length; j++)
{
domainsNew[j] = domains[j];
}
domainsNew[domainsNew.Length - 1] = name;
domains = domainsNew;
}
}
}
bool own = false;
string addressResp = await mainForm.APIGet("wallet/" + mainForm.Account + "/key/" + addressRaw["string"].ToString(), true);
if (addressResp != "Error") own = true;
if (own)
{
Label ownAddress = new Label();
ownAddress.Text = "Own Address";
ownAddress.Location = new Point(PanelOutput.Width - 150, 5);
ownAddress.AutoSize = true;
PanelOutput.Controls.Add(ownAddress);
}
Label amount = new Label();
Decimal value = Decimal.Parse(output["value"].ToString());
amount.Text = "Amount: " + value.ToString();
amount.Location = new Point(PanelOutput.Width - 150, 25);
amount.AutoSize = true;
PanelOutput.Controls.Add(amount);
panelOut.Controls.Add(PanelOutput);
}
}
private async void buttonSign_Click(object sender, EventArgs e)
{
if (!mainForm.WatchOnly)
{
string content = "{\"tx\":\"" + tx["tx"].ToString() + "\", \"passphrase\":\"" + mainForm.Password + "\"}";
string response = await mainForm.APIPost("wallet/" + mainForm.Account + "/sign", true, content);
if (response == "Error" || response == "")
{
NotifyForm notifyForm = new NotifyForm("Error signing transaction");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
buttonSign.Enabled = false;
buttonExport.Enabled = true;
sigs++;
// Set sig label sizes
labelSigsReq.Width = (labelSigsTotal.Width / totalSigs) * reqSigs;
labelSigsSigned.Width = (labelSigsTotal.Width / totalSigs) * sigs;
labelSigInfo.Text = "Signed: " + sigs + "\nReq: " + reqSigs + " of " + totalSigs;
signedTX = response;
} else {
NotifyForm notifyForm = new NotifyForm("Ledger signing not supported yet 😢");
notifyForm.ShowDialog();
notifyForm.Dispose();
}
}
private void buttonExport_Click(object sender, EventArgs e)
{
mainForm.ExportTransaction(signedTX,domains);
}
private async void buttonSend_Click(object sender, EventArgs e)
{
string content = "";
if (signedTX != "")
{
JObject signed = JObject.Parse(signedTX);
content = "{\"method\":\"sendrawtransaction\", \"params\":[\"" + signed["hex"].ToString() + "\"]}";
}
else
{
content = "{\"method\":\"sendrawtransaction\", \"params\":[\"" + tx["tx"].ToString() + "\"]}";
}
string response = await mainForm.APIPost("", false, content);
if (response == "Error" || response == "")
{
mainForm.AddLog(response);
NotifyForm notifyError = new NotifyForm("Error sending transaction");
notifyError.ShowDialog();
notifyError.Dispose();
return;
}
JObject responseJson = JObject.Parse(response);
if (responseJson["error"].ToString() != "")
{
mainForm.AddLog(response);
JObject error = (JObject)responseJson["error"];
NotifyForm notifyError = new NotifyForm("Error sending transaction\n" + error["message"].ToString());
notifyError.ShowDialog();
notifyError.Dispose();
return;
}
string txHash = responseJson["result"].ToString();
NotifyForm notifyForm = new NotifyForm("Transaction sent\nIf the transaction hasn't been signed it might not be mined", "Explorer", mainForm.UserSettings["explorer-tx"] + txHash);
notifyForm.ShowDialog();
notifyForm.Dispose();
this.Close();
}
}
}

View File

@@ -0,0 +1,587 @@
<?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>
<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>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAAfScAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACPQM0Aj0DNEo9AzVePQM02j0DNAI9AzQAAAAAAAAAAAI8/zQCPQM0Aj0DNNI9A
zViPQM0Sj0DNAI8/zACPQM0Uj0DNXY9AzcOPQM37j0DN1o9AzTuPQM0Ajz/NAI4/zACPQM0Aj0DNOY9A
zdWPQM37j0DNxI9AzV6PQM0Vj0DNso9AzfqPQM3/j0DN/49Azf+PQM3Wj0DNO49AzQCPQM0Aj0DNOY9A
zdSPQM3/j0DN/49Azf+PQM36j0DNtY9AzdmPQM3/j0DN/49Azf+PQM3/j0DN/49AzdaPQM05j0DNN49A
zdWPQM3/j0DN/49Azf+PQM3/j0DN/49AzdyRQ8XYkUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8X/kkPFsZJD
xa+RQ8X/kUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8Xbmkuu2JpLrv+aS67/mkuv/ppLrv6aS67/mkuu/5pL
r76aS6+9mkuu/5pLrv+aS67+mkuv/ppLrv+aS67/mkuu26VSkNilUpD/pVKQ/6RSkOajUZWrpVKQ+aVS
kP+lUpC+pVKQvKVSkP+lUpD6o1GVq6RSkOWlUpD/pVKQ/6VSkNuwVG3YsFRt/7BUbf+wVG3drlRzKq5U
c4+wVG3/sFRtv7BUbb6wVG3/rlRzka5UcymwVG3csFRt/7BUbf+wVG3cuVNI2blTSP+5U0j/uVNI3rlT
Rxy0VWELuFNOlblTSLq5U0i5uFNOlrRVYAy5U0cbuVNI3blTSP+5U0j/uVNI3MFQHtnBUB7/wVAe/8FQ
Ht/AUB4ewFAkAL5RMxC/USxQv1EsUL5RMxDAUCUAwFAeHMFQHt3BUB7/wVAe/8FQHtzDTwnZw08J/8NP
Cf/DTwnfw08JHsNPCQDETgAAx0wAAcdNAAHFTQAAw08JAMNPCR3DTwnew08J/8NPCf/DTwncw08J2MNP
Cf/DTwn/w08Jw8NPCRXDTwkAAAAAAAAAAAAAAAAAAAAAAMNPCQDDTwkUw08JwcNPCf/DTwn/w08J28NP
CdbDTwnbw08JfMNPCSHDTggAw08JAAAAAAAAAAAAAAAAAAAAAADCTwkAwU4HAMNPCSDDTwl7w08J28NP
CdjDTwlVw08JI8NOCAHDTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTwgAwk4IAcNP
CSLDTwlWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AADH4wAAA8AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAABmAAAAfg
AAAP8AAAH/gAAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zACPP8wDjz/MAo8/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCPP80Cjz/NA48/zQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACPQM0Ajz/NBY9AzTePQM2Wj0DNYo4/zAOPP80AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAj0DNAI8/zQKPQM1gj0DNl49AzTmPP80Fjz/NAAAAAAAAAAAAjz/NAI8/zQWPQM04j0DNm49A
zeuPQM3/j0DN749AzWeOP8wDjz/NAAAAAAAAAAAAAAAAAAAAAACPP80Ajz/MAo9AzWSPQM3uj0DN/49A
zeuPQM2dj0DNOY8/zQWPQM0Aj0DNN49AzZyPQM3rj0DN/49Azf+PQM3/j0DN/49Aze+PQM1njz/MA48/
zQAAAAAAAAAAAI9AzQCOP8wCj0DNZI9Aze6PQM3/j0DN/49Azf+PQM3/j0DN7I9AzZ6PQM05j0DNuY9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3vj0DNZo4/zAOPQMwAjz/NAI8/zQKPQM1jj0DN7o9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2+j0DNwY9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN749AzWeOP84Djj7OAo9AzWWPQM3uj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3Gj0DMwY9AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzPCPQMtZj0DLVo9A
zO+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMzFkkTDwJJEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JEw/+SRMOekkTDm5JEw/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMPFmEqzwJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hK
s/+YSrOfmEqznJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrPFn0+gwJ9P
oP+fT6D/n0+g/59PoP+fT6D2n0+h7J9PoP+fT6D/n0+g/59PoP+fT6Cfn0+gm59PoP+fT6D/n0+g/59P
oP+fT6Hsn0+g9p9PoP+fT6D/n0+g/59PoP+fT6DGp1OKwadTiv+nU4r/p1OK/6dTiv+nU4rdpVKPYqZT
jNynU4r/p1OK/6dTiv+nU4qfp1OKnKdTiv+nU4r/p1OK/6ZTjN6lUo9jp1OK26dTiv+nU4r/p1OK/6dT
iv+nU4rGrlRzwa5Uc/+uVHP/rlRz/65Uc/+uVHPdrlRzHKxUe0StVHTfrlRz/65Uc/+uVHOgrlRzna5U
c/+uVHP/rlR04KxUe0auVHMarlRz265Uc/+uVHP/rlRz/65Uc/+uVHPGtVRawbVUWv+1VFr/tVRa/7VU
Wv+1VFrdtVRaHLZTVgCzVWJHtFRc37VUWv+1VFqhtVRanbVUWv+0VFzhs1RiSbdTVAC1VFoatVRa27VU
Wv+1VFr/tVRa/7VUWv+1VFrHu1JBwbtSQf+7UkH/u1JB/7tSQf+7UkHdu1JBHbtSQgDAUikAuVNKR7tT
Q+K7UkGgu1JBnbtTQ+S5U0lJw1AYALtSQgC7UkEau1JB27tSQf+7UkH/u1JB/7tSQf+7UkHHwFAlwcBQ
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
zf+PQM38j0DNl48/zA+PP80AAAAAAAAAAAAAAAAAAAAAAI9AzQCPQM0Oj0DNk49AzfuPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/Y9AzdWPQM1ej0DNp49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM38j0DNl48/zA+PQM0AAAAAAAAAAACPQM0Aj0DNDo9AzZOPQM37j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Aza6PQM2oj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNl48/zRCPP80Aj0DNAI8/zQ+PQM2Uj0DN+49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DNr49AzaePQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNmo4/zQ+PP80Oj0DNlo9A
zfyPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2ukEHKp5BB
yv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr9kEHJZ5BB
yWKQQcr8kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/49B
yq6TRcGnk0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcGEk0XBf5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcH/k0XBrpdJtaeXSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtYKXSbZ9l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtf+XSbWunE2op5xNqP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2ogZxNqHycTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqK6iUZinolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGY6KFQ
mrmiUZj8olGY/6JRmP+iUZj/olGY/6JRmP+iUZiBolGYfKJRmP+iUZj/olGY/6JRmP+iUZj/olGY/KFQ
mrqiUZjnolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGYrqhTh6eoU4f/qFOH/6hTh/+oU4f/qFOH/6hT
h/+oU4fcplOLL6dTip6oU4f9qFOH/6hTh/+oU4f/qFOH/6hTh4KnU4d9qFOH/6hTh/+oU4f/qFOH/6hT
h/6nU4qiplOLLqhTh9moU4f/qFOH/6hTh/+oU4f/qFOH/6hTh/+oU4evrVR2p61Udv+tVHb/rVR2/61U
dv+tVHb/rVR2/61UdtytVHYbqlSAEaxUeaGtVHb9rVR2/61Udv+tVHb/rVR2g61Udn6tVHb/rVR2/61U
dv+tVHb+rFR5pKpUfxOtVHYYrVR22q1Udv+tVHb/rVR2/61Udv+tVHb/rVR2/61Udq+yVGSoslVk/7JV
ZP+yVWT/slVk/7JVZP+yVWT/slVk3LJUZByxVWcAsFVtFLJVZ6KyVWT+slVk/7JVZP+yVGSEslRkf7JV
ZP+yVWT/slVk/rJVZqawVW0VsVRnALJUZBmyVGTZslVk/7JVZP+yVWT/slVk/7JVZP+yVWT/slRkr7dU
Uai3VFH/t1RR/7dUUf+3VFH/t1RR/7dUUf+3VFHct1NRHLdTUQC1VFoAtVRaFLdUVKO3VFH+t1RR/7dU
UYO3VFF+t1RR/7dUUf63VFSmtVRaFrVUWQC3U1EAt1NRGbdUUdm3VFH/t1RR/7dUUf+3VFH/t1RR/7dU
Uf+3VFGwvFI+qLxSPv+8Uj7/vFI+/7xSPv+8Uj7/vFI+/7xSPty7Uj4cu1I+AMNRHQC6U0cAulNIFLtS
QaG8Uj7/vFI+gbxSPny8Uj7/u1JBpbpTSBa6U0cAv1E0ALtSPgC7Uj4ZvFI+2bxSPv+8Uj7/vFI+/7xS
Pv+8Uj7/vFI+/7xSPrC/UCqov1Eq/79RKv+/USr/v1Eq/79RKv+/USr/v1Aq3b9QKRy/UCkAAAAAANJE
AAC+UTMAvlE0E79RLZ+/UCp6v1Eqdr9RLaK+UTQUvlEzAMNNFwAAAAAAv1ApAL9QKRm/UCrZv1Eq/79R
Kv+/USr/v1Eq/79RKv+/USr/v1AqsMJPEqjCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxLdwk8SHcJP
EgAAAAAAAAAAAAAAAADBTx4AwU8eE8FPHCfBUBwnwVAeFMFQHgD/AAAAAAAAAAAAAADCTxIAwk8SGsJP
EtrCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxKww08JqMNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cd7DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNP
CADDTwgaw08J2sNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCbDDTwmow08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J3sNPCR3DTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08JAMNPCRvDTwnbw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08Jr8NPCafDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwndw08JHMNPCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDTwkAw08JGsNPCdrDTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwmuw08Jp8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J88NPCZrDTgkMw08JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCQDCTwkKw08JlsNPCfLDTwn/w08J/8NPCf/DTwn/w08J/8NP
Ca3DTwmmw08J/8NPCf/DTwn/w08J8sNPCavDTwlGw08JCcNPCQDCTgcAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08GAMNPCQDCTwgIw08JRMNPCanDTwnxw08J/8NP
Cf/DTwn/w08JrMNPCaTDTwn/w08J8cNPCazDTwlGw04ICcNPCADDTgkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFMCQDDTwkAwk8JCMNP
CUTDTwmqw08J8cNPCf/DTwmqw08JkcNPCarDTwlFw08ICcNPCQDCTAgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADCTwYAw08JAMNPCQjDTwlDw08JqcNPCZbDTwkXw08JCcNPCQC/SwUAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAw00FAMNPCQDDTgkIw04JGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////5/
/j/4P/wf4B/4B4AP8AAAB+AAAAPAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA
AgAAYAYAAHAOAAB4HgAAfD4AAH/+AAB//gAAf/4AAH/+AAD//wAD///AD///8D////z//////////ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz7LAI8+
ywCPPssAjz7LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjkDLAI4/ywCOP8sAjkDLAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5A
zACOP8wBjz/NJY9AzXmPQM1Ig0LIAI5AzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOP8wAkkfWAI9AzUOPQM17j0DNKI8/
zQKPP80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACPP8wAjj/LAY8/zCaPQM2Cj0DN3I9Azf+PQM3hj0DNToQ2wQCOP8wAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCORMsAj0DNSI9A
zd6PQM3/j0DN3o9AzYWPP80ojj7MAo8/zQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAjz/NAI8+zAGPQM0mj0DNgo9AzdyPQM3+j0DN/49Azf+PQM3/j0DN449AzU+QPcsAjz/NAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz/NAI9J
zwCPQM1Jj0DN349Azf+PQM3/j0DN/49Azf6PQM3ej0DNhY8/zSiPPswCjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACOPswCjz/NJ49AzYOPQM3dj0DN/o9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zeSPQM1QijbKAI4/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACOP8wAk0XXAI9AzUqPQM3gj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o9Azd+PQM2Gjz/NKY8/
zAKPP80AAAAAAAAAAACPP8wAjj7MAo9AzSqPQM2Fj0DN3o9Azf6PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3kjz/NT4w6xgCOP8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zQCTS84Ajz/NSo9AzeCPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3+j0DN349AzYiPP80sjj/NA44/zQCPQM0Xj0DNhI9AzeGPQM3+j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCQLsMAjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAjj/NAJJB0ACPQM1Kj0DN4I9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf6PQM3jj0DNiY8/zRqPQM1nj0DN+o9Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeOPP81PhzjFAI4/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPQM0Ak0HLAI9AzUmPQM3gj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/I8/zXOPQM11j0DN/Y9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3jj0DNT4c/wwCOP8wAAAAAAAAAAAAAAAAAAAAAAI8/zQCNSs4Aj0DNSo9AzeCPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/48/
zX+PQM11j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCNOM0Ajj/NAAAAAAAAAAAAjj/MAJdJ3gCPP81Kj0DN4I9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/o8/zX6PQM10j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeSPQM1Si0HNAY5AzQCPP80AkDjLAI9A
zU2PQM3hj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQM1zj0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3mjz/NVY07
zwGRRsoAjz/NT49AzeOPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQMtzj0DL/Y9Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL349AyymPQMslj0DL2o9Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/o9Ay32RQ8ZykUPG/ZFD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG+5FDxk2RQ8ZGkUPG+JFDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/pFD
xn2URsBylEbA/ZRGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/JRGwFCURsBJlEbA+ZRGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/pRGwH2XSbhyl0m4/ZdJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4+5dJuE6XSbhGl0m4+ZdJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/pdJuH2aS69ymkyv/ZpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv+5pM
r02aTK9Fmkyv+JpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/ppMr32dTqVynU6l/Z1Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l+51OpU2dTqVEnU6l+J1Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/p1OpX2hUJtyoVCb/aFQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm+uhUJzHoVCb/aFQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb+6FQm02hUJtFoVCb+KFQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/qFQnMihUJvpoVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/qFQ
m32lUpBypVKQ/aVSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkNqkUpI3pFKRraVS
kP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ+6VSkE2lUpBFpVKQ+KVSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/6VSkP+lUpD/pFKRsqRSkzalUpDVpVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/qVSkH6oU4VzqFOF/ahThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hT
hdupU4QaplOKGahThq+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF+6hThU6oU4VHqFOF+ahT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4a0p1OKHalThBeoU4XXqFOF/6hThf+oU4X/qFOF/6hT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThX6sVHlzrFR5/axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xU
ef+sVHn/rFR5/6xUedqsVHkbq1R7AKpUfhusVHuwrFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5+6xU
eU+sVHlIrFR5+axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUerWqVH4eq1R7AKxUeRisVHnWrFR5/6xU
ef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUeX+wVW1zsFVt/bBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbdqwVW0bsFVtAK5VcQCuVHIcr1VvsrBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt+7BVbVCwVW1IsFVt+bBVbf+wVW3/sFVt/7BVbf+wVW3/r1Vutq5Uch+uVXEAsFVtALBV
bRewVW3WsFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbX+zVGF0s1Rh/bNU
Yf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYdqzVGEbs1RhALJUZACyVWUAslVmHbNU
YrOzVGD/s1Rh/7NUYf+zVGH/s1Rh+7NUYVCzVGFJs1Rh+bNUYf+zVGH/s1Rh/7NUYP+zVGK3slVmILJV
ZQCyVGYAs1RhALNUYRezVGHVs1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NU
YX+3VFR0t1RU/bdUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVNq2VFQbtlRUAAAA
AAC5UE8AtVRZALVUWh62VFazt1RU/7dUVP+3VFT/t1RU+7dUVE+2VFRIt1RU+bdUVP+3VFT/t1RU/7ZU
Vri1VFohtVRZALZSVgAAAAAAtlNUALZTVBe2VFTVt1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dU
VP+3VFT/t1RU/7ZUVIC6U0h0ulNI/bpTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pT
SNq6U0gbulNIAAAAAAAAAAAAuFNPALlTTAC4U00euVNJs7pTSP+6U0j/uVNI+7lTSE65U0hGuVNI+bpT
SP+6U0j/uVNJt7hTTSG4U00AvlQ5AAAAAAAAAAAAuVNIALlTSBe5U0jVulNI/7pTSP+6U0j/ulNI/7pT
SP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSIC8Ujt0vFI7/bxSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xS
O/+8Ujv/vFI7/7xSO9q8UjsbvFI7AAAAAAAAAAAAAAAAALtRPwC7UkAAu1JBHbxSPbC8Ujv/vFI7+7xS
O0y8UjtEvFI7+LxSO/+8Ujy1u1JBILtSPwC7UkEAAAAAAAAAAAAAAAAAvFI7ALxSOxe8UjvVvFI7/7xS
O/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO4C/US11v1Et/b9RLf+/US3/v1Et/79R
Lf+/US3/v1Et/79RLf+/US3/v1Et/79RLdu/US0bv1EtAAAAAAAAAAAAAAAAAAAAAADAUBwAvlEzAL5R
NBq+US+rv1Et+L9RLUm/US1Cv1Et9r5RL7C+UTMdvlEzAMBOKwAAAAAAAAAAAAAAAAAAAAAAvlEtAL5R
LRe/US3Vv1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLYDBUB51wVAe/cFQ
Hv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHtvBUB4cwVAeAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwU8kAMBQJQDAUCYYwFAhm8FQH0DBUB86wVAhncBQJhvAUCUAwFAlAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwVAeAMFPHhfBUB7WwVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQ
HoDCTw51wk8O/cNPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8JPDtzCTw4cwk8OAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMM9AADCTxcAwk8WD8JPFg7CTxYNwk8WEMJPFwDETwUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8OAMJPDhjCTw7Ww08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NP
Dv/DTw7/w08O/8JPDoDDTwh0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
CdzDTggdw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMJPCBjDTwnXw08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCIDDTwl0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw04IAMNOCBnDTwnXw08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwl0w08J/cNPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCd3DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08IAMNP
CBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwlzw08J/cNP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08IAMNPCBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNP
CX7DTwlzw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdXDTgkXw04JAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8JAMJPCRTDTwnQw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/sNPCX3DTwlyw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn9w08J1cNP
CWjDTggEw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMFOCAPDTwljw08J08NPCfzDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXvDTwlxw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/cNP
CdPDTwl0w04JHsNPBwHDTwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCAC/TQcAw08JHMNP
CXHDTwnRw08J/MNPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXrDTwlww08J/cNPCf/DTwn/w08J/8NP
Cf3DTwnUw08JdMNOCR3DTQcAw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk4IAMFLBwDCTwkbw08JccNPCdHDTwn8w08J/8NPCf/DTwn/w08J/sNPCXjDTwluw08J/MNP
Cf/DTwn8w08J08NPCXXDTwkewU0EAMJOBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCTgkAv00KAMNOCBzDTwlyw08J0cNPCfzDTwn/w08J/sNP
CXbDTwltw08J+cNPCdDDTwlyw04JHcFPBgDCTggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJOCQDDTgkAw08JG8NP
CW/DTwnOw08J+cNPCXXDTwlGw08JaMJPCRrATAUAwk4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk8IAL5QBADDTwgZw08JaMNOCUrDTQgBw00IAMNNCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTggAw04IAMNPCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
RU5ErkJggg==
</value>
</data>
</root>

View File

@@ -39,7 +39,15 @@ namespace FireWallet
toolStripStatusLabelNetwork = new ToolStripStatusLabel(); toolStripStatusLabelNetwork = new ToolStripStatusLabel();
toolStripStatusLabelstatus = new ToolStripStatusLabel(); toolStripStatusLabelstatus = new ToolStripStatusLabel();
toolStripStatusLabelaccount = new ToolStripStatusLabel(); toolStripStatusLabelaccount = new ToolStripStatusLabel();
toolStripStatusLabelMultisig = new ToolStripStatusLabel();
toolStripStatusLabelLedger = new ToolStripStatusLabel();
toolStripSplitButtonlogout = new ToolStripSplitButton(); toolStripSplitButtonlogout = new ToolStripSplitButton();
toolStripDropDownButtonHelp = new ToolStripDropDownButton();
githubToolStripMenuItem = new ToolStripMenuItem();
websiteToolStripMenuItem = new ToolStripMenuItem();
supportDiscordServerToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator1 = new ToolStripSeparator();
otherProjectsToolStripMenuItem = new ToolStripMenuItem();
timerNodeStatus = new System.Windows.Forms.Timer(components); timerNodeStatus = new System.Windows.Forms.Timer(components);
panelaccount = new Panel(); panelaccount = new Panel();
groupBoxaccount = new GroupBox(); groupBoxaccount = new GroupBox();
@@ -52,12 +60,16 @@ namespace FireWallet
buttonaccountnew = new Button(); buttonaccountnew = new Button();
panelNav = new Panel(); panelNav = new Panel();
buttonNavSettings = new Button(); buttonNavSettings = new Button();
buttonMultiSign = new Button();
buttonBatch = new Button(); buttonBatch = new Button();
buttonNavDomains = new Button(); buttonNavDomains = new Button();
buttonNavReceive = new Button(); buttonNavReceive = new Button();
buttonNavSend = new Button(); buttonNavSend = new Button();
buttonNavPortfolio = new Button(); buttonNavPortfolio = new Button();
panelPortfolio = new Panel(); panelPortfolio = new Panel();
buttonSendAll = new Button();
buttonRedeemAll = new Button();
buttonRevealAll = new Button();
groupBoxTransactions = new GroupBox(); groupBoxTransactions = new GroupBox();
groupBoxinfo = new GroupBox(); groupBoxinfo = new GroupBox();
labelPendingCount = new Label(); labelPendingCount = new Label();
@@ -67,7 +79,9 @@ namespace FireWallet
labelBalanceTotal = new Label(); labelBalanceTotal = new Label();
labelLocked = new Label(); labelLocked = new Label();
labelBalance = new Label(); labelBalance = new Label();
buttonRenewAll = new Button();
panelSend = new Panel(); panelSend = new Panel();
labelSendingHIPAddress = new Label();
checkBoxSendSubFee = new CheckBox(); checkBoxSendSubFee = new CheckBox();
buttonSendMax = new Button(); buttonSendMax = new Button();
buttonSendHNS = new Button(); buttonSendHNS = new Button();
@@ -79,19 +93,30 @@ namespace FireWallet
labelSendingAmount = new Label(); labelSendingAmount = new Label();
labelSendingTo = new Label(); labelSendingTo = new Label();
labelSendPrompt = new Label(); labelSendPrompt = new Label();
labelHIPArrow = new Label();
panelRecieve = new Panel(); panelRecieve = new Panel();
buttonAddressVerify = new Button();
pictureBoxReceiveQR = new PictureBox(); pictureBoxReceiveQR = new PictureBox();
labelReceive2 = new Label(); labelReceive2 = new Label();
textBoxReceiveAddress = new TextBox(); textBoxReceiveAddress = new TextBox();
labelReceive1 = new Label(); labelReceive1 = new Label();
panelDomains = new Panel(); panelDomains = new Panel();
labelDomainSort = new Label();
comboBoxDomainSort = new ComboBox();
buttonExportDomains = new Button();
groupBoxDomains = new GroupBox(); groupBoxDomains = new GroupBox();
panelDomainList = new Panel(); panelDomainList = new Panel();
labelDomainSearch = new Label(); labelDomainSearch = new Label();
textBoxDomainSearch = new TextBox(); textBoxDomainSearch = new TextBox();
panelSettings = new Panel(); panelSettings = new Panel();
groupBoxSettingsWallet = new GroupBox();
buttonSettingsRescan = new Button();
buttonSeed = new Button();
groupBoxSettingsMisc = new GroupBox(); groupBoxSettingsMisc = new GroupBox();
labelSettings8 = new Label();
labelSettings6 = new Label(); labelSettings6 = new Label();
numericUpDownTXCount = new NumericUpDown();
labelSettings7 = new Label();
numericUpDownConfirmations = new NumericUpDown(); numericUpDownConfirmations = new NumericUpDown();
labelSettings5 = new Label(); labelSettings5 = new Label();
labelSettingsSaved = new Label(); labelSettingsSaved = new Label();
@@ -105,9 +130,7 @@ namespace FireWallet
textBoxExAddr = new TextBox(); textBoxExAddr = new TextBox();
labelSettings4 = new Label(); labelSettings4 = new Label();
textBoxExTX = new TextBox(); textBoxExTX = new TextBox();
labelSettings7 = new Label(); buttonMultiSettings = new Button();
numericUpDownTXCount = new NumericUpDown();
labelSettings8 = new Label();
statusStripmain.SuspendLayout(); statusStripmain.SuspendLayout();
panelaccount.SuspendLayout(); panelaccount.SuspendLayout();
groupBoxaccount.SuspendLayout(); groupBoxaccount.SuspendLayout();
@@ -121,16 +144,17 @@ namespace FireWallet
panelDomains.SuspendLayout(); panelDomains.SuspendLayout();
groupBoxDomains.SuspendLayout(); groupBoxDomains.SuspendLayout();
panelSettings.SuspendLayout(); panelSettings.SuspendLayout();
groupBoxSettingsWallet.SuspendLayout();
groupBoxSettingsMisc.SuspendLayout(); groupBoxSettingsMisc.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownTXCount).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownConfirmations).BeginInit(); ((System.ComponentModel.ISupportInitialize)numericUpDownConfirmations).BeginInit();
groupBoxSettingsExplorer.SuspendLayout(); groupBoxSettingsExplorer.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownTXCount).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// statusStripmain // statusStripmain
// //
statusStripmain.Dock = DockStyle.Top; statusStripmain.Dock = DockStyle.Top;
statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripSplitButtonlogout }); statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripStatusLabelMultisig, toolStripStatusLabelLedger, toolStripSplitButtonlogout, toolStripDropDownButtonHelp });
statusStripmain.Location = new Point(0, 0); statusStripmain.Location = new Point(0, 0);
statusStripmain.Name = "statusStripmain"; statusStripmain.Name = "statusStripmain";
statusStripmain.Size = new Size(1152, 22); statusStripmain.Size = new Size(1152, 22);
@@ -162,6 +186,22 @@ namespace FireWallet
toolStripStatusLabelaccount.Size = new Size(55, 17); toolStripStatusLabelaccount.Size = new Size(55, 17);
toolStripStatusLabelaccount.Text = "Account:"; toolStripStatusLabelaccount.Text = "Account:";
// //
// toolStripStatusLabelMultisig
//
toolStripStatusLabelMultisig.Margin = new Padding(50, 3, 50, 2);
toolStripStatusLabelMultisig.Name = "toolStripStatusLabelMultisig";
toolStripStatusLabelMultisig.Size = new Size(50, 17);
toolStripStatusLabelMultisig.Text = "Multisig";
toolStripStatusLabelMultisig.Visible = false;
//
// toolStripStatusLabelLedger
//
toolStripStatusLabelLedger.Margin = new Padding(50, 3, 50, 2);
toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger";
toolStripStatusLabelLedger.Size = new Size(68, 17);
toolStripStatusLabelLedger.Text = "Cold Wallet";
toolStripStatusLabelLedger.Visible = false;
//
// toolStripSplitButtonlogout // toolStripSplitButtonlogout
// //
toolStripSplitButtonlogout.DisplayStyle = ToolStripItemDisplayStyle.Text; toolStripSplitButtonlogout.DisplayStyle = ToolStripItemDisplayStyle.Text;
@@ -173,6 +213,51 @@ namespace FireWallet
toolStripSplitButtonlogout.Visible = false; toolStripSplitButtonlogout.Visible = false;
toolStripSplitButtonlogout.ButtonClick += Logout; toolStripSplitButtonlogout.ButtonClick += Logout;
// //
// toolStripDropDownButtonHelp
//
toolStripDropDownButtonHelp.DisplayStyle = ToolStripItemDisplayStyle.Text;
toolStripDropDownButtonHelp.DropDownItems.AddRange(new ToolStripItem[] { githubToolStripMenuItem, websiteToolStripMenuItem, supportDiscordServerToolStripMenuItem, toolStripSeparator1, otherProjectsToolStripMenuItem });
toolStripDropDownButtonHelp.Image = (Image)resources.GetObject("toolStripDropDownButtonHelp.Image");
toolStripDropDownButtonHelp.ImageTransparentColor = Color.Magenta;
toolStripDropDownButtonHelp.Margin = new Padding(20, 2, 0, 0);
toolStripDropDownButtonHelp.Name = "toolStripDropDownButtonHelp";
toolStripDropDownButtonHelp.Size = new Size(45, 20);
toolStripDropDownButtonHelp.Text = "Help";
toolStripDropDownButtonHelp.ToolTipText = "Help";
//
// githubToolStripMenuItem
//
githubToolStripMenuItem.Name = "githubToolStripMenuItem";
githubToolStripMenuItem.Size = new Size(194, 22);
githubToolStripMenuItem.Text = "Github";
githubToolStripMenuItem.Click += githubToolStripMenuItem_Click;
//
// websiteToolStripMenuItem
//
websiteToolStripMenuItem.Name = "websiteToolStripMenuItem";
websiteToolStripMenuItem.Size = new Size(194, 22);
websiteToolStripMenuItem.Text = "Website";
websiteToolStripMenuItem.Click += websiteToolStripMenuItem_Click;
//
// supportDiscordServerToolStripMenuItem
//
supportDiscordServerToolStripMenuItem.Name = "supportDiscordServerToolStripMenuItem";
supportDiscordServerToolStripMenuItem.Size = new Size(194, 22);
supportDiscordServerToolStripMenuItem.Text = "Support Discord Server";
supportDiscordServerToolStripMenuItem.Click += supportDiscordServerToolStripMenuItem_Click;
//
// toolStripSeparator1
//
toolStripSeparator1.Name = "toolStripSeparator1";
toolStripSeparator1.Size = new Size(191, 6);
//
// otherProjectsToolStripMenuItem
//
otherProjectsToolStripMenuItem.Name = "otherProjectsToolStripMenuItem";
otherProjectsToolStripMenuItem.Size = new Size(194, 22);
otherProjectsToolStripMenuItem.Text = "Other Projects";
otherProjectsToolStripMenuItem.Click += otherProjectsToolStripMenuItem_Click;
//
// timerNodeStatus // timerNodeStatus
// //
timerNodeStatus.Enabled = true; timerNodeStatus.Enabled = true;
@@ -277,10 +362,13 @@ namespace FireWallet
buttonaccountnew.TabStop = false; buttonaccountnew.TabStop = false;
buttonaccountnew.Text = "New"; buttonaccountnew.Text = "New";
buttonaccountnew.UseVisualStyleBackColor = true; buttonaccountnew.UseVisualStyleBackColor = true;
buttonaccountnew.Click += buttonaccountnew_Click;
// //
// panelNav // panelNav
// //
panelNav.Controls.Add(buttonNavSettings); panelNav.Controls.Add(buttonNavSettings);
panelNav.Controls.Add(buttonMultiSettings);
panelNav.Controls.Add(buttonMultiSign);
panelNav.Controls.Add(buttonBatch); panelNav.Controls.Add(buttonBatch);
panelNav.Controls.Add(buttonNavDomains); panelNav.Controls.Add(buttonNavDomains);
panelNav.Controls.Add(buttonNavReceive); panelNav.Controls.Add(buttonNavReceive);
@@ -305,6 +393,19 @@ namespace FireWallet
buttonNavSettings.UseVisualStyleBackColor = true; buttonNavSettings.UseVisualStyleBackColor = true;
buttonNavSettings.Click += buttonNavSettings_Click; buttonNavSettings.Click += buttonNavSettings_Click;
// //
// buttonMultiSign
//
buttonMultiSign.FlatStyle = FlatStyle.Flat;
buttonMultiSign.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonMultiSign.Location = new Point(12, 301);
buttonMultiSign.Name = "buttonMultiSign";
buttonMultiSign.Size = new Size(89, 30);
buttonMultiSign.TabIndex = 3;
buttonMultiSign.TabStop = false;
buttonMultiSign.Text = "Import TX";
buttonMultiSign.UseVisualStyleBackColor = true;
buttonMultiSign.Click += buttonMultiSign_Click;
//
// buttonBatch // buttonBatch
// //
buttonBatch.FlatStyle = FlatStyle.Flat; buttonBatch.FlatStyle = FlatStyle.Flat;
@@ -372,15 +473,54 @@ namespace FireWallet
// //
// panelPortfolio // panelPortfolio
// //
panelPortfolio.Controls.Add(buttonSendAll);
panelPortfolio.Controls.Add(buttonRedeemAll);
panelPortfolio.Controls.Add(buttonRevealAll);
panelPortfolio.Controls.Add(groupBoxTransactions); panelPortfolio.Controls.Add(groupBoxTransactions);
panelPortfolio.Controls.Add(groupBoxinfo); panelPortfolio.Controls.Add(groupBoxinfo);
panelPortfolio.Controls.Add(groupBoxbalance); panelPortfolio.Controls.Add(groupBoxbalance);
panelPortfolio.Location = new Point(1085, 47); panelPortfolio.Location = new Point(140, 35);
panelPortfolio.Name = "panelPortfolio"; panelPortfolio.Name = "panelPortfolio";
panelPortfolio.Size = new Size(956, 538); panelPortfolio.Size = new Size(956, 538);
panelPortfolio.TabIndex = 7; panelPortfolio.TabIndex = 7;
panelPortfolio.Visible = false; panelPortfolio.Visible = false;
// //
// buttonSendAll
//
buttonSendAll.FlatStyle = FlatStyle.Flat;
buttonSendAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonSendAll.Location = new Point(761, 12);
buttonSendAll.Name = "buttonSendAll";
buttonSendAll.Size = new Size(106, 44);
buttonSendAll.TabIndex = 9;
buttonSendAll.Text = "Send All TXs";
buttonSendAll.UseVisualStyleBackColor = true;
buttonSendAll.Click += buttonSendAll_Click;
//
// buttonRedeemAll
//
buttonRedeemAll.FlatStyle = FlatStyle.Flat;
buttonRedeemAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonRedeemAll.Location = new Point(649, 12);
buttonRedeemAll.Name = "buttonRedeemAll";
buttonRedeemAll.Size = new Size(106, 44);
buttonRedeemAll.TabIndex = 9;
buttonRedeemAll.Text = "Redeem All";
buttonRedeemAll.UseVisualStyleBackColor = true;
buttonRedeemAll.Click += buttonRedeemAll_Click;
//
// buttonRevealAll
//
buttonRevealAll.FlatStyle = FlatStyle.Flat;
buttonRevealAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonRevealAll.Location = new Point(537, 12);
buttonRevealAll.Name = "buttonRevealAll";
buttonRevealAll.Size = new Size(106, 44);
buttonRevealAll.TabIndex = 9;
buttonRevealAll.Text = "Reveal All";
buttonRevealAll.UseVisualStyleBackColor = true;
buttonRevealAll.Click += buttonRevealAll_Click;
//
// groupBoxTransactions // groupBoxTransactions
// //
groupBoxTransactions.Dock = DockStyle.Bottom; groupBoxTransactions.Dock = DockStyle.Bottom;
@@ -398,7 +538,7 @@ namespace FireWallet
groupBoxinfo.Controls.Add(labelHeight); groupBoxinfo.Controls.Add(labelHeight);
groupBoxinfo.Location = new Point(281, 3); groupBoxinfo.Location = new Point(281, 3);
groupBoxinfo.Name = "groupBoxinfo"; groupBoxinfo.Name = "groupBoxinfo";
groupBoxinfo.Size = new Size(232, 104); groupBoxinfo.Size = new Size(250, 104);
groupBoxinfo.TabIndex = 8; groupBoxinfo.TabIndex = 8;
groupBoxinfo.TabStop = false; groupBoxinfo.TabStop = false;
groupBoxinfo.Text = "Info"; groupBoxinfo.Text = "Info";
@@ -475,8 +615,21 @@ namespace FireWallet
labelBalance.TabIndex = 0; labelBalance.TabIndex = 0;
labelBalance.Text = "labelBalance"; labelBalance.Text = "labelBalance";
// //
// buttonRenewAll
//
buttonRenewAll.FlatStyle = FlatStyle.Flat;
buttonRenewAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonRenewAll.Location = new Point(813, 9);
buttonRenewAll.Name = "buttonRenewAll";
buttonRenewAll.Size = new Size(89, 32);
buttonRenewAll.TabIndex = 10;
buttonRenewAll.Text = "Renew All";
buttonRenewAll.UseVisualStyleBackColor = true;
buttonRenewAll.Click += buttonRenewAll_Click;
//
// panelSend // panelSend
// //
panelSend.Controls.Add(labelSendingHIPAddress);
panelSend.Controls.Add(checkBoxSendSubFee); panelSend.Controls.Add(checkBoxSendSubFee);
panelSend.Controls.Add(buttonSendMax); panelSend.Controls.Add(buttonSendMax);
panelSend.Controls.Add(buttonSendHNS); panelSend.Controls.Add(buttonSendHNS);
@@ -488,12 +641,23 @@ namespace FireWallet
panelSend.Controls.Add(labelSendingAmount); panelSend.Controls.Add(labelSendingAmount);
panelSend.Controls.Add(labelSendingTo); panelSend.Controls.Add(labelSendingTo);
panelSend.Controls.Add(labelSendPrompt); panelSend.Controls.Add(labelSendPrompt);
panelSend.Location = new Point(1113, 42); panelSend.Controls.Add(labelHIPArrow);
panelSend.Location = new Point(1041, 235);
panelSend.Name = "panelSend"; panelSend.Name = "panelSend";
panelSend.Size = new Size(974, 521); panelSend.Size = new Size(974, 521);
panelSend.TabIndex = 2; panelSend.TabIndex = 2;
panelSend.Visible = false; panelSend.Visible = false;
// //
// labelSendingHIPAddress
//
labelSendingHIPAddress.AutoSize = true;
labelSendingHIPAddress.Location = new Point(375, 130);
labelSendingHIPAddress.Name = "labelSendingHIPAddress";
labelSendingHIPAddress.Size = new Size(64, 15);
labelSendingHIPAddress.TabIndex = 17;
labelSendingHIPAddress.Text = "To Address";
labelSendingHIPAddress.Visible = false;
//
// checkBoxSendSubFee // checkBoxSendSubFee
// //
checkBoxSendSubFee.AutoSize = true; checkBoxSendSubFee.AutoSize = true;
@@ -536,11 +700,11 @@ namespace FireWallet
// //
labelSendingError.AutoSize = true; labelSendingError.AutoSize = true;
labelSendingError.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); labelSendingError.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
labelSendingError.Location = new Point(615, 131); labelSendingError.Location = new Point(679, 130);
labelSendingError.Name = "labelSendingError"; labelSendingError.Name = "labelSendingError";
labelSendingError.Size = new Size(52, 21); labelSendingError.Size = new Size(78, 21);
labelSendingError.TabIndex = 13; labelSendingError.TabIndex = 13;
labelSendingError.Text = "label1"; labelSendingError.Text = "labelError";
labelSendingError.Visible = false; labelSendingError.Visible = false;
// //
// labelSendingFee // labelSendingFee
@@ -611,18 +775,43 @@ namespace FireWallet
labelSendPrompt.TabIndex = 0; labelSendPrompt.TabIndex = 0;
labelSendPrompt.Text = "Send HNS"; labelSendPrompt.Text = "Send HNS";
// //
// labelHIPArrow
//
labelHIPArrow.AutoSize = true;
labelHIPArrow.Font = new Font("Segoe UI", 18F, FontStyle.Bold, GraphicsUnit.Point);
labelHIPArrow.Location = new Point(346, 119);
labelHIPArrow.Name = "labelHIPArrow";
labelHIPArrow.Size = new Size(32, 32);
labelHIPArrow.TabIndex = 18;
labelHIPArrow.Text = "⮡ ";
labelHIPArrow.Visible = false;
//
// panelRecieve // panelRecieve
// //
panelRecieve.Controls.Add(buttonAddressVerify);
panelRecieve.Controls.Add(pictureBoxReceiveQR); panelRecieve.Controls.Add(pictureBoxReceiveQR);
panelRecieve.Controls.Add(labelReceive2); panelRecieve.Controls.Add(labelReceive2);
panelRecieve.Controls.Add(textBoxReceiveAddress); panelRecieve.Controls.Add(textBoxReceiveAddress);
panelRecieve.Controls.Add(labelReceive1); panelRecieve.Controls.Add(labelReceive1);
panelRecieve.Location = new Point(1057, 62); panelRecieve.Location = new Point(1140, 24);
panelRecieve.Name = "panelRecieve"; panelRecieve.Name = "panelRecieve";
panelRecieve.Size = new Size(995, 523); panelRecieve.Size = new Size(995, 523);
panelRecieve.TabIndex = 17; panelRecieve.TabIndex = 17;
panelRecieve.Visible = false; panelRecieve.Visible = false;
// //
// buttonAddressVerify
//
buttonAddressVerify.FlatStyle = FlatStyle.Flat;
buttonAddressVerify.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonAddressVerify.Location = new Point(769, 110);
buttonAddressVerify.Name = "buttonAddressVerify";
buttonAddressVerify.Size = new Size(126, 32);
buttonAddressVerify.TabIndex = 21;
buttonAddressVerify.Text = "Create && Verify";
buttonAddressVerify.UseVisualStyleBackColor = true;
buttonAddressVerify.Visible = false;
buttonAddressVerify.Click += buttonAddressVerify_Click;
//
// pictureBoxReceiveQR // pictureBoxReceiveQR
// //
pictureBoxReceiveQR.Location = new Point(391, 190); pictureBoxReceiveQR.Location = new Point(391, 190);
@@ -664,15 +853,54 @@ namespace FireWallet
// //
// panelDomains // panelDomains
// //
panelDomains.Controls.Add(labelDomainSort);
panelDomains.Controls.Add(comboBoxDomainSort);
panelDomains.Controls.Add(buttonRenewAll);
panelDomains.Controls.Add(buttonExportDomains);
panelDomains.Controls.Add(groupBoxDomains); panelDomains.Controls.Add(groupBoxDomains);
panelDomains.Controls.Add(labelDomainSearch); panelDomains.Controls.Add(labelDomainSearch);
panelDomains.Controls.Add(textBoxDomainSearch); panelDomains.Controls.Add(textBoxDomainSearch);
panelDomains.Location = new Point(1129, 22); panelDomains.Location = new Point(1122, 35);
panelDomains.Name = "panelDomains"; panelDomains.Name = "panelDomains";
panelDomains.Size = new Size(920, 536); panelDomains.Size = new Size(920, 536);
panelDomains.TabIndex = 18; panelDomains.TabIndex = 18;
panelDomains.Visible = false; panelDomains.Visible = false;
// //
// labelDomainSort
//
labelDomainSort.AutoSize = true;
labelDomainSort.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
labelDomainSort.Location = new Point(638, 15);
labelDomainSort.Name = "labelDomainSort";
labelDomainSort.Size = new Size(42, 21);
labelDomainSort.TabIndex = 12;
labelDomainSort.Text = "Sort:";
//
// comboBoxDomainSort
//
comboBoxDomainSort.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxDomainSort.FlatStyle = FlatStyle.Flat;
comboBoxDomainSort.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
comboBoxDomainSort.FormattingEnabled = true;
comboBoxDomainSort.Items.AddRange(new object[] { "Default", "Alphabetical", "Expiring", "Value" });
comboBoxDomainSort.Location = new Point(686, 12);
comboBoxDomainSort.Name = "comboBoxDomainSort";
comboBoxDomainSort.Size = new Size(121, 29);
comboBoxDomainSort.TabIndex = 11;
comboBoxDomainSort.DropDownClosed += comboBoxDomainSort_DropDownClosed;
//
// buttonExportDomains
//
buttonExportDomains.FlatStyle = FlatStyle.Flat;
buttonExportDomains.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonExportDomains.Location = new Point(351, 9);
buttonExportDomains.Name = "buttonExportDomains";
buttonExportDomains.Size = new Size(102, 32);
buttonExportDomains.TabIndex = 3;
buttonExportDomains.Text = "Export";
buttonExportDomains.UseVisualStyleBackColor = true;
buttonExportDomains.Click += export_Click;
//
// groupBoxDomains // groupBoxDomains
// //
groupBoxDomains.Controls.Add(panelDomainList); groupBoxDomains.Controls.Add(panelDomainList);
@@ -715,17 +943,51 @@ namespace FireWallet
// //
// panelSettings // panelSettings
// //
panelSettings.Controls.Add(groupBoxSettingsWallet);
panelSettings.Controls.Add(groupBoxSettingsMisc); panelSettings.Controls.Add(groupBoxSettingsMisc);
panelSettings.Controls.Add(labelSettingsSaved); panelSettings.Controls.Add(labelSettingsSaved);
panelSettings.Controls.Add(buttonSettingsSave); panelSettings.Controls.Add(buttonSettingsSave);
panelSettings.Controls.Add(groupBoxSettingsExplorer); panelSettings.Controls.Add(groupBoxSettingsExplorer);
panelSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); panelSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
panelSettings.Location = new Point(121, 21); panelSettings.Location = new Point(1065, 51);
panelSettings.Name = "panelSettings"; panelSettings.Name = "panelSettings";
panelSettings.Size = new Size(930, 550); panelSettings.Size = new Size(930, 550);
panelSettings.TabIndex = 19; panelSettings.TabIndex = 19;
panelSettings.Visible = false; panelSettings.Visible = false;
// //
// groupBoxSettingsWallet
//
groupBoxSettingsWallet.Controls.Add(buttonSettingsRescan);
groupBoxSettingsWallet.Controls.Add(buttonSeed);
groupBoxSettingsWallet.Location = new Point(507, 16);
groupBoxSettingsWallet.Name = "groupBoxSettingsWallet";
groupBoxSettingsWallet.Size = new Size(420, 194);
groupBoxSettingsWallet.TabIndex = 9;
groupBoxSettingsWallet.TabStop = false;
groupBoxSettingsWallet.Text = "Wallet Controls";
//
// buttonSettingsRescan
//
buttonSettingsRescan.FlatStyle = FlatStyle.Flat;
buttonSettingsRescan.Location = new Point(6, 20);
buttonSettingsRescan.Name = "buttonSettingsRescan";
buttonSettingsRescan.Size = new Size(98, 50);
buttonSettingsRescan.TabIndex = 8;
buttonSettingsRescan.Text = "Rescan";
buttonSettingsRescan.UseVisualStyleBackColor = true;
buttonSettingsRescan.Click += Rescan_Click;
//
// buttonSeed
//
buttonSeed.FlatStyle = FlatStyle.Flat;
buttonSeed.Location = new Point(297, 20);
buttonSeed.Name = "buttonSeed";
buttonSeed.Size = new Size(117, 50);
buttonSeed.TabIndex = 8;
buttonSeed.Text = "Seed Phrase";
buttonSeed.UseVisualStyleBackColor = true;
buttonSeed.Click += buttonSeed_Click;
//
// groupBoxSettingsMisc // groupBoxSettingsMisc
// //
groupBoxSettingsMisc.Controls.Add(labelSettings8); groupBoxSettingsMisc.Controls.Add(labelSettings8);
@@ -741,6 +1003,15 @@ namespace FireWallet
groupBoxSettingsMisc.TabStop = false; groupBoxSettingsMisc.TabStop = false;
groupBoxSettingsMisc.Text = "Misc Settings"; groupBoxSettingsMisc.Text = "Misc Settings";
// //
// labelSettings8
//
labelSettings8.AutoSize = true;
labelSettings8.Location = new Point(255, 71);
labelSettings8.Name = "labelSettings8";
labelSettings8.Size = new Size(120, 21);
labelSettings8.TabIndex = 2;
labelSettings8.Text = "TXs on portfolio";
//
// labelSettings6 // labelSettings6
// //
labelSettings6.AutoSize = true; labelSettings6.AutoSize = true;
@@ -750,6 +1021,23 @@ namespace FireWallet
labelSettings6.TabIndex = 2; labelSettings6.TabIndex = 2;
labelSettings6.Text = "blocks"; labelSettings6.Text = "blocks";
// //
// numericUpDownTXCount
//
numericUpDownTXCount.Location = new Point(129, 69);
numericUpDownTXCount.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownTXCount.Name = "numericUpDownTXCount";
numericUpDownTXCount.Size = new Size(120, 29);
numericUpDownTXCount.TabIndex = 1;
//
// labelSettings7
//
labelSettings7.AutoSize = true;
labelSettings7.Location = new Point(71, 73);
labelSettings7.Name = "labelSettings7";
labelSettings7.Size = new Size(52, 21);
labelSettings7.TabIndex = 0;
labelSettings7.Text = "Show:";
//
// numericUpDownConfirmations // numericUpDownConfirmations
// //
numericUpDownConfirmations.Location = new Point(129, 34); numericUpDownConfirmations.Location = new Point(129, 34);
@@ -871,50 +1159,39 @@ namespace FireWallet
textBoxExTX.Size = new Size(307, 29); textBoxExTX.Size = new Size(307, 29);
textBoxExTX.TabIndex = 1; textBoxExTX.TabIndex = 1;
// //
// labelSettings7 // buttonMultiSettings
// //
labelSettings7.AutoSize = true; buttonMultiSettings.FlatStyle = FlatStyle.Flat;
labelSettings7.Location = new Point(71, 73); buttonMultiSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
labelSettings7.Name = "labelSettings7"; buttonMultiSettings.Location = new Point(12, 466);
labelSettings7.Size = new Size(52, 21); buttonMultiSettings.Name = "buttonMultiSettings";
labelSettings7.TabIndex = 0; buttonMultiSettings.Size = new Size(89, 30);
labelSettings7.Text = "Show:"; buttonMultiSettings.TabIndex = 3;
// buttonMultiSettings.TabStop = false;
// numericUpDownTXCount buttonMultiSettings.Text = "Multisig";
// buttonMultiSettings.UseVisualStyleBackColor = true;
numericUpDownTXCount.Location = new Point(129, 69); buttonMultiSettings.Click += buttonMultiSettings_Click;
numericUpDownTXCount.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownTXCount.Name = "numericUpDownTXCount";
numericUpDownTXCount.Size = new Size(120, 29);
numericUpDownTXCount.TabIndex = 1;
//
// labelSettings8
//
labelSettings8.AutoSize = true;
labelSettings8.Location = new Point(255, 71);
labelSettings8.Name = "labelSettings8";
labelSettings8.Size = new Size(120, 21);
labelSettings8.TabIndex = 2;
labelSettings8.Text = "TXs on portfolio";
// //
// MainForm // MainForm
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1152, 575); ClientSize = new Size(1152, 575);
Controls.Add(panelSettings);
Controls.Add(panelDomains); Controls.Add(panelDomains);
Controls.Add(panelRecieve);
Controls.Add(panelSend); Controls.Add(panelSend);
Controls.Add(panelPortfolio); Controls.Add(panelSettings);
Controls.Add(panelNav);
Controls.Add(panelaccount); Controls.Add(panelaccount);
Controls.Add(panelPortfolio);
Controls.Add(panelRecieve);
Controls.Add(panelNav);
Controls.Add(statusStripmain); Controls.Add(statusStripmain);
Icon = (Icon)resources.GetObject("$this.Icon"); Icon = (Icon)resources.GetObject("$this.Icon");
Name = "MainForm"; Name = "MainForm";
Opacity = 0D;
Text = "FireWallet"; Text = "FireWallet";
FormClosing += MainForm_Closing; FormClosing += MainForm_Closing;
Load += MainForm_Load; Load += MainForm_Load;
ResizeEnd += MainForm_ResizeEnd;
Resize += Form1_Resize; Resize += Form1_Resize;
statusStripmain.ResumeLayout(false); statusStripmain.ResumeLayout(false);
statusStripmain.PerformLayout(); statusStripmain.PerformLayout();
@@ -937,12 +1214,13 @@ namespace FireWallet
groupBoxDomains.ResumeLayout(false); groupBoxDomains.ResumeLayout(false);
panelSettings.ResumeLayout(false); panelSettings.ResumeLayout(false);
panelSettings.PerformLayout(); panelSettings.PerformLayout();
groupBoxSettingsWallet.ResumeLayout(false);
groupBoxSettingsMisc.ResumeLayout(false); groupBoxSettingsMisc.ResumeLayout(false);
groupBoxSettingsMisc.PerformLayout(); groupBoxSettingsMisc.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownTXCount).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownConfirmations).EndInit(); ((System.ComponentModel.ISupportInitialize)numericUpDownConfirmations).EndInit();
groupBoxSettingsExplorer.ResumeLayout(false); groupBoxSettingsExplorer.ResumeLayout(false);
groupBoxSettingsExplorer.PerformLayout(); groupBoxSettingsExplorer.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownTXCount).EndInit();
ResumeLayout(false); ResumeLayout(false);
PerformLayout(); PerformLayout();
} }
@@ -1022,5 +1300,28 @@ namespace FireWallet
private Label labelSettings8; private Label labelSettings8;
private NumericUpDown numericUpDownTXCount; private NumericUpDown numericUpDownTXCount;
private Label labelSettings7; private Label labelSettings7;
private Button buttonSeed;
private GroupBox groupBoxSettingsWallet;
private Button buttonSettingsRescan;
private ToolStripStatusLabel toolStripStatusLabelLedger;
private Button buttonAddressVerify;
private Button buttonRevealAll;
private Button buttonExportDomains;
private Button buttonRenewAll;
private ToolStripDropDownButton toolStripDropDownButtonHelp;
private ToolStripMenuItem githubToolStripMenuItem;
private ToolStripMenuItem websiteToolStripMenuItem;
private ToolStripMenuItem supportDiscordServerToolStripMenuItem;
private Label labelHIPArrow;
private Label labelSendingHIPAddress;
private ComboBox comboBoxDomainSort;
private Label labelDomainSort;
private ToolStripSeparator toolStripSeparator1;
private ToolStripMenuItem otherProjectsToolStripMenuItem;
private Button buttonRedeemAll;
private Button buttonSendAll;
private ToolStripStatusLabel toolStripStatusLabelMultisig;
private Button buttonMultiSign;
private Button buttonMultiSettings;
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,141 @@
namespace FireWallet
{
partial class MultisigSettingsForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MultisigSettingsForm));
groupBoxSigners = new GroupBox();
panelSigners = new Panel();
labelSigners = new Label();
groupBoxAddSig = new GroupBox();
buttoAddSigner = new Button();
textBoxAddSig = new TextBox();
labelAddXpub = new Label();
groupBoxSigners.SuspendLayout();
groupBoxAddSig.SuspendLayout();
SuspendLayout();
//
// groupBoxSigners
//
groupBoxSigners.Controls.Add(panelSigners);
groupBoxSigners.Location = new Point(0, 0);
groupBoxSigners.Name = "groupBoxSigners";
groupBoxSigners.Size = new Size(418, 463);
groupBoxSigners.TabIndex = 0;
groupBoxSigners.TabStop = false;
groupBoxSigners.Text = "Signers";
//
// panelSigners
//
panelSigners.Dock = DockStyle.Fill;
panelSigners.Location = new Point(3, 19);
panelSigners.Name = "panelSigners";
panelSigners.Size = new Size(412, 441);
panelSigners.TabIndex = 0;
//
// labelSigners
//
labelSigners.AutoSize = true;
labelSigners.Location = new Point(424, 9);
labelSigners.Name = "labelSigners";
labelSigners.Size = new Size(48, 15);
labelSigners.TabIndex = 1;
labelSigners.Text = "Signers:";
//
// groupBoxAddSig
//
groupBoxAddSig.Controls.Add(buttoAddSigner);
groupBoxAddSig.Controls.Add(textBoxAddSig);
groupBoxAddSig.Controls.Add(labelAddXpub);
groupBoxAddSig.Location = new Point(421, 255);
groupBoxAddSig.Name = "groupBoxAddSig";
groupBoxAddSig.Size = new Size(381, 208);
groupBoxAddSig.TabIndex = 2;
groupBoxAddSig.TabStop = false;
groupBoxAddSig.Text = "Add Signer";
//
// buttoAddSigner
//
buttoAddSigner.FlatStyle = FlatStyle.Flat;
buttoAddSigner.Location = new Point(6, 45);
buttoAddSigner.Name = "buttoAddSigner";
buttoAddSigner.Size = new Size(75, 23);
buttoAddSigner.TabIndex = 2;
buttoAddSigner.Text = "Add";
buttoAddSigner.UseVisualStyleBackColor = true;
buttoAddSigner.Click += buttoAddSigner_Click;
//
// textBoxAddSig
//
textBoxAddSig.Location = new Point(51, 16);
textBoxAddSig.Name = "textBoxAddSig";
textBoxAddSig.Size = new Size(324, 23);
textBoxAddSig.TabIndex = 1;
textBoxAddSig.KeyDown += textBoxAddSig_KeyDown;
//
// labelAddXpub
//
labelAddXpub.AutoSize = true;
labelAddXpub.Location = new Point(6, 19);
labelAddXpub.Name = "labelAddXpub";
labelAddXpub.Size = new Size(39, 15);
labelAddXpub.TabIndex = 0;
labelAddXpub.Text = "XPUB:";
//
// MultisigSettingsForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(814, 475);
Controls.Add(groupBoxAddSig);
Controls.Add(labelSigners);
Controls.Add(groupBoxSigners);
FormBorderStyle = FormBorderStyle.Fixed3D;
Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "MultisigSettingsForm";
Text = "Multisig Settings";
Load += MultisigSettingsForm_Load;
groupBoxSigners.ResumeLayout(false);
groupBoxAddSig.ResumeLayout(false);
groupBoxAddSig.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private GroupBox groupBoxSigners;
private Label labelSigners;
private Panel panelSigners;
private GroupBox groupBoxAddSig;
private Button buttoAddSigner;
private TextBox textBoxAddSig;
private Label labelAddXpub;
}
}

View File

@@ -0,0 +1,216 @@
using Newtonsoft.Json.Linq;
namespace FireWallet
{
public partial class MultisigSettingsForm : Form
{
MainForm mainForm;
int n;
int m;
int current;
string OwnKey;
public MultisigSettingsForm(MainForm mainForm)
{
InitializeComponent();
this.mainForm = mainForm;
this.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
this.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
foreach (Control c in Controls)
{
mainForm.ThemeControl(c);
}
}
private void MultisigSettingsForm_Load(object sender, EventArgs e)
{
UpdateInfo();
}
private async void UpdateInfo()
{
// Get multisig info
string infoResp = await mainForm.APIGet("wallet/" + mainForm.Account + "/account/default", true);
mainForm.AddLog(infoResp);
if (infoResp == "Error")
{
NotifyForm notifyForm = new NotifyForm("Error getting multisig info");
notifyForm.ShowDialog();
notifyForm.Dispose();
this.Close();
}
JObject info = JObject.Parse(infoResp);
n = int.Parse(info["n"].ToString());
m = int.Parse(info["m"].ToString());
labelSigners.Text = "Signers: " + m + "/" + n;
panelSigners.Controls.Clear();
Panel selfInfo = new Panel();
selfInfo.Width = panelSigners.Width - SystemInformation.VerticalScrollBarWidth;
selfInfo.Height = 50;
selfInfo.Location = new Point(0, 0);
selfInfo.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
selfInfo.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
selfInfo.BorderStyle = BorderStyle.FixedSingle;
Label selfLabel = new Label();
selfLabel.Text = "Own Key";
selfLabel.Location = new Point(10, 10);
selfLabel.AutoSize = true;
selfInfo.Controls.Add(selfLabel);
Label pubKey = new Label();
OwnKey = info["accountKey"].ToString();
string pukKeyShort = info["accountKey"].ToString().Substring(0, 10) + "..." + info["accountKey"].ToString().Substring(info["accountKey"].ToString().Length - 10);
pubKey.Text = pukKeyShort;
pubKey.Location = new Point(10, 30);
pubKey.AutoSize = true;
selfInfo.Controls.Add(pubKey);
Button copyPubKey = new Button();
copyPubKey.Text = "Copy";
copyPubKey.AutoSize = true;
copyPubKey.FlatStyle = FlatStyle.Flat;
copyPubKey.Location = new Point(selfInfo.Width - copyPubKey.Width - 10, 10);
copyPubKey.Click += (s, e) =>
{
Clipboard.SetText(OwnKey);
};
selfInfo.Controls.Add(copyPubKey);
panelSigners.Controls.Add(selfInfo);
// Get signers
int y = 50;
JArray signers = JArray.Parse(info["keys"].ToString());
current = signers.Count;
foreach (string sig in signers)
{
Panel signerInfo = new Panel();
signerInfo.Width = panelSigners.Width - SystemInformation.VerticalScrollBarWidth;
signerInfo.Height = 50;
signerInfo.Location = new Point(0, y);
signerInfo.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
signerInfo.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
signerInfo.BorderStyle = BorderStyle.FixedSingle;
Label signerLabel = new Label();
signerLabel.Text = "Signer";
signerLabel.Location = new Point(10, 10);
signerLabel.AutoSize = true;
signerInfo.Controls.Add(signerLabel);
Label signerKey = new Label();
string signerKeyShort = sig.Substring(0, 10) + "..." + sig.Substring(sig.Length - 10);
signerKey.Text = signerKeyShort;
signerKey.Location = new Point(10, 30);
signerKey.AutoSize = true;
signerInfo.Controls.Add(signerKey);
Button DelSignerKey = new Button();
DelSignerKey.Text = "Remove";
DelSignerKey.AutoSize = true;
DelSignerKey.FlatStyle = FlatStyle.Flat;
DelSignerKey.Location = new Point(signerInfo.Width - DelSignerKey.Width - 10, 10);
DelSignerKey.Click += (s, e) =>
{
RemoveSig(sig);
};
signerInfo.Controls.Add(DelSignerKey);
panelSigners.Controls.Add(signerInfo);
y += 50;
}
}
private async Task RemoveSig(string sig)
{
string path = "wallet/" + mainForm.Account + "/shared-key";
string content = "{\"accountKey\": \"" + sig + "\",\"account\":\"default\"}";
string resp = await APIPut(path, true, content);
mainForm.AddLog(resp);
UpdateInfo();
}
private async Task AddSigAsync(string sig)
{
string path = "wallet/" + mainForm.Account + "/shared-key";
string content = "{\"accountKey\": \"" + sig + "\",\"account\":\"default\"}";
string resp = await APIPut(path, true, content);
mainForm.AddLog(resp);
UpdateInfo();
}
private async void buttoAddSigner_Click(object sender, EventArgs e)
{
if (textBoxAddSig.Text.Length < 5)
{
NotifyForm notifyForm = new NotifyForm("You need to add a XPUB key");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
await AddSigAsync(textBoxAddSig.Text);
textBoxAddSig.Text = "";
}
HttpClient httpClient = new HttpClient();
/// <summary>
/// Put to HSD API
/// </summary>
/// <param name="path">Path to put to</param>
/// <param name="wallet">Whether to use port 12039</param>
/// <param name="content">Content to put</param>
/// <returns></returns>
public async Task<string> APIPut(string path, bool wallet, string content)
{
if (content == "{\"passphrase\": \"\",\"timeout\": 60}")
{
return "";
}
string key = mainForm.NodeSettings["Key"];
string ip = mainForm.NodeSettings["IP"];
string port = "1203";
if (mainForm.HSDNetwork == 1)
{
port = "1303";
}
if (wallet) port = port + "9";
else port = port + "7";
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Put, "http://" + ip + ":" + port + "/" + path);
req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("x:" + key)));
req.Content = new StringContent(content);
// Send request
try
{
HttpResponseMessage resp = await httpClient.SendAsync(req);
if (!resp.IsSuccessStatusCode)
{
mainForm.AddLog("Post Error: " + resp.StatusCode);
mainForm.AddLog(await resp.Content.ReadAsStringAsync());
return "Error";
}
return await resp.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
mainForm.AddLog("Post Error: " + ex.Message);
return "Error";
}
}
private void textBoxAddSig_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
buttoAddSigner_Click(sender, e);
e.SuppressKeyPress = true;
}
}
}
}

View File

@@ -0,0 +1,587 @@
<?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>
<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>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAAfScAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACPQM0Aj0DNEo9AzVePQM02j0DNAI9AzQAAAAAAAAAAAI8/zQCPQM0Aj0DNNI9A
zViPQM0Sj0DNAI8/zACPQM0Uj0DNXY9AzcOPQM37j0DN1o9AzTuPQM0Ajz/NAI4/zACPQM0Aj0DNOY9A
zdWPQM37j0DNxI9AzV6PQM0Vj0DNso9AzfqPQM3/j0DN/49Azf+PQM3Wj0DNO49AzQCPQM0Aj0DNOY9A
zdSPQM3/j0DN/49Azf+PQM36j0DNtY9AzdmPQM3/j0DN/49Azf+PQM3/j0DN/49AzdaPQM05j0DNN49A
zdWPQM3/j0DN/49Azf+PQM3/j0DN/49AzdyRQ8XYkUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8X/kkPFsZJD
xa+RQ8X/kUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8Xbmkuu2JpLrv+aS67/mkuv/ppLrv6aS67/mkuu/5pL
r76aS6+9mkuu/5pLrv+aS67+mkuv/ppLrv+aS67/mkuu26VSkNilUpD/pVKQ/6RSkOajUZWrpVKQ+aVS
kP+lUpC+pVKQvKVSkP+lUpD6o1GVq6RSkOWlUpD/pVKQ/6VSkNuwVG3YsFRt/7BUbf+wVG3drlRzKq5U
c4+wVG3/sFRtv7BUbb6wVG3/rlRzka5UcymwVG3csFRt/7BUbf+wVG3cuVNI2blTSP+5U0j/uVNI3rlT
Rxy0VWELuFNOlblTSLq5U0i5uFNOlrRVYAy5U0cbuVNI3blTSP+5U0j/uVNI3MFQHtnBUB7/wVAe/8FQ
Ht/AUB4ewFAkAL5RMxC/USxQv1EsUL5RMxDAUCUAwFAeHMFQHt3BUB7/wVAe/8FQHtzDTwnZw08J/8NP
Cf/DTwnfw08JHsNPCQDETgAAx0wAAcdNAAHFTQAAw08JAMNPCR3DTwnew08J/8NPCf/DTwncw08J2MNP
Cf/DTwn/w08Jw8NPCRXDTwkAAAAAAAAAAAAAAAAAAAAAAMNPCQDDTwkUw08JwcNPCf/DTwn/w08J28NP
CdbDTwnbw08JfMNPCSHDTggAw08JAAAAAAAAAAAAAAAAAAAAAADCTwkAwU4HAMNPCSDDTwl7w08J28NP
CdjDTwlVw08JI8NOCAHDTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTwgAwk4IAcNP
CSLDTwlWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AADH4wAAA8AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAABmAAAAfg
AAAP8AAAH/gAAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zACPP8wDjz/MAo8/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCPP80Cjz/NA48/zQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACPQM0Ajz/NBY9AzTePQM2Wj0DNYo4/zAOPP80AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAj0DNAI8/zQKPQM1gj0DNl49AzTmPP80Fjz/NAAAAAAAAAAAAjz/NAI8/zQWPQM04j0DNm49A
zeuPQM3/j0DN749AzWeOP8wDjz/NAAAAAAAAAAAAAAAAAAAAAACPP80Ajz/MAo9AzWSPQM3uj0DN/49A
zeuPQM2dj0DNOY8/zQWPQM0Aj0DNN49AzZyPQM3rj0DN/49Azf+PQM3/j0DN/49Aze+PQM1njz/MA48/
zQAAAAAAAAAAAI9AzQCOP8wCj0DNZI9Aze6PQM3/j0DN/49Azf+PQM3/j0DN7I9AzZ6PQM05j0DNuY9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3vj0DNZo4/zAOPQMwAjz/NAI8/zQKPQM1jj0DN7o9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2+j0DNwY9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN749AzWeOP84Djj7OAo9AzWWPQM3uj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3Gj0DMwY9AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzPCPQMtZj0DLVo9A
zO+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMzFkkTDwJJEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JEw/+SRMOekkTDm5JEw/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMPFmEqzwJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hK
s/+YSrOfmEqznJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrPFn0+gwJ9P
oP+fT6D/n0+g/59PoP+fT6D2n0+h7J9PoP+fT6D/n0+g/59PoP+fT6Cfn0+gm59PoP+fT6D/n0+g/59P
oP+fT6Hsn0+g9p9PoP+fT6D/n0+g/59PoP+fT6DGp1OKwadTiv+nU4r/p1OK/6dTiv+nU4rdpVKPYqZT
jNynU4r/p1OK/6dTiv+nU4qfp1OKnKdTiv+nU4r/p1OK/6ZTjN6lUo9jp1OK26dTiv+nU4r/p1OK/6dT
iv+nU4rGrlRzwa5Uc/+uVHP/rlRz/65Uc/+uVHPdrlRzHKxUe0StVHTfrlRz/65Uc/+uVHOgrlRzna5U
c/+uVHP/rlR04KxUe0auVHMarlRz265Uc/+uVHP/rlRz/65Uc/+uVHPGtVRawbVUWv+1VFr/tVRa/7VU
Wv+1VFrdtVRaHLZTVgCzVWJHtFRc37VUWv+1VFqhtVRanbVUWv+0VFzhs1RiSbdTVAC1VFoatVRa27VU
Wv+1VFr/tVRa/7VUWv+1VFrHu1JBwbtSQf+7UkH/u1JB/7tSQf+7UkHdu1JBHbtSQgDAUikAuVNKR7tT
Q+K7UkGgu1JBnbtTQ+S5U0lJw1AYALtSQgC7UkEau1JB27tSQf+7UkH/u1JB/7tSQf+7UkHHwFAlwcBQ
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
zf+PQM38j0DNl48/zA+PP80AAAAAAAAAAAAAAAAAAAAAAI9AzQCPQM0Oj0DNk49AzfuPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/Y9AzdWPQM1ej0DNp49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM38j0DNl48/zA+PQM0AAAAAAAAAAACPQM0Aj0DNDo9AzZOPQM37j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Aza6PQM2oj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNl48/zRCPP80Aj0DNAI8/zQ+PQM2Uj0DN+49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DNr49AzaePQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNmo4/zQ+PP80Oj0DNlo9A
zfyPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2ukEHKp5BB
yv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr9kEHJZ5BB
yWKQQcr8kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/49B
yq6TRcGnk0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcGEk0XBf5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcH/k0XBrpdJtaeXSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtYKXSbZ9l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtf+XSbWunE2op5xNqP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2ogZxNqHycTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqK6iUZinolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGY6KFQ
mrmiUZj8olGY/6JRmP+iUZj/olGY/6JRmP+iUZiBolGYfKJRmP+iUZj/olGY/6JRmP+iUZj/olGY/KFQ
mrqiUZjnolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGYrqhTh6eoU4f/qFOH/6hTh/+oU4f/qFOH/6hT
h/+oU4fcplOLL6dTip6oU4f9qFOH/6hTh/+oU4f/qFOH/6hTh4KnU4d9qFOH/6hTh/+oU4f/qFOH/6hT
h/6nU4qiplOLLqhTh9moU4f/qFOH/6hTh/+oU4f/qFOH/6hTh/+oU4evrVR2p61Udv+tVHb/rVR2/61U
dv+tVHb/rVR2/61UdtytVHYbqlSAEaxUeaGtVHb9rVR2/61Udv+tVHb/rVR2g61Udn6tVHb/rVR2/61U
dv+tVHb+rFR5pKpUfxOtVHYYrVR22q1Udv+tVHb/rVR2/61Udv+tVHb/rVR2/61Udq+yVGSoslVk/7JV
ZP+yVWT/slVk/7JVZP+yVWT/slVk3LJUZByxVWcAsFVtFLJVZ6KyVWT+slVk/7JVZP+yVGSEslRkf7JV
ZP+yVWT/slVk/rJVZqawVW0VsVRnALJUZBmyVGTZslVk/7JVZP+yVWT/slVk/7JVZP+yVWT/slRkr7dU
Uai3VFH/t1RR/7dUUf+3VFH/t1RR/7dUUf+3VFHct1NRHLdTUQC1VFoAtVRaFLdUVKO3VFH+t1RR/7dU
UYO3VFF+t1RR/7dUUf63VFSmtVRaFrVUWQC3U1EAt1NRGbdUUdm3VFH/t1RR/7dUUf+3VFH/t1RR/7dU
Uf+3VFGwvFI+qLxSPv+8Uj7/vFI+/7xSPv+8Uj7/vFI+/7xSPty7Uj4cu1I+AMNRHQC6U0cAulNIFLtS
QaG8Uj7/vFI+gbxSPny8Uj7/u1JBpbpTSBa6U0cAv1E0ALtSPgC7Uj4ZvFI+2bxSPv+8Uj7/vFI+/7xS
Pv+8Uj7/vFI+/7xSPrC/UCqov1Eq/79RKv+/USr/v1Eq/79RKv+/USr/v1Aq3b9QKRy/UCkAAAAAANJE
AAC+UTMAvlE0E79RLZ+/UCp6v1Eqdr9RLaK+UTQUvlEzAMNNFwAAAAAAv1ApAL9QKRm/UCrZv1Eq/79R
Kv+/USr/v1Eq/79RKv+/USr/v1AqsMJPEqjCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxLdwk8SHcJP
EgAAAAAAAAAAAAAAAADBTx4AwU8eE8FPHCfBUBwnwVAeFMFQHgD/AAAAAAAAAAAAAADCTxIAwk8SGsJP
EtrCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxKww08JqMNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cd7DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNP
CADDTwgaw08J2sNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCbDDTwmow08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J3sNPCR3DTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08JAMNPCRvDTwnbw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08Jr8NPCafDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwndw08JHMNPCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDTwkAw08JGsNPCdrDTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwmuw08Jp8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J88NPCZrDTgkMw08JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCQDCTwkKw08JlsNPCfLDTwn/w08J/8NPCf/DTwn/w08J/8NP
Ca3DTwmmw08J/8NPCf/DTwn/w08J8sNPCavDTwlGw08JCcNPCQDCTgcAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08GAMNPCQDCTwgIw08JRMNPCanDTwnxw08J/8NP
Cf/DTwn/w08JrMNPCaTDTwn/w08J8cNPCazDTwlGw04ICcNPCADDTgkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFMCQDDTwkAwk8JCMNP
CUTDTwmqw08J8cNPCf/DTwmqw08JkcNPCarDTwlFw08ICcNPCQDCTAgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADCTwYAw08JAMNPCQjDTwlDw08JqcNPCZbDTwkXw08JCcNPCQC/SwUAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAw00FAMNPCQDDTgkIw04JGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////5/
/j/4P/wf4B/4B4AP8AAAB+AAAAPAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA
AgAAYAYAAHAOAAB4HgAAfD4AAH/+AAB//gAAf/4AAH/+AAD//wAD///AD///8D////z//////////ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz7LAI8+
ywCPPssAjz7LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjkDLAI4/ywCOP8sAjkDLAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5A
zACOP8wBjz/NJY9AzXmPQM1Ig0LIAI5AzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOP8wAkkfWAI9AzUOPQM17j0DNKI8/
zQKPP80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACPP8wAjj/LAY8/zCaPQM2Cj0DN3I9Azf+PQM3hj0DNToQ2wQCOP8wAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCORMsAj0DNSI9A
zd6PQM3/j0DN3o9AzYWPP80ojj7MAo8/zQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAjz/NAI8+zAGPQM0mj0DNgo9AzdyPQM3+j0DN/49Azf+PQM3/j0DN449AzU+QPcsAjz/NAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz/NAI9J
zwCPQM1Jj0DN349Azf+PQM3/j0DN/49Azf6PQM3ej0DNhY8/zSiPPswCjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACOPswCjz/NJ49AzYOPQM3dj0DN/o9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zeSPQM1QijbKAI4/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACOP8wAk0XXAI9AzUqPQM3gj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o9Azd+PQM2Gjz/NKY8/
zAKPP80AAAAAAAAAAACPP8wAjj7MAo9AzSqPQM2Fj0DN3o9Azf6PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3kjz/NT4w6xgCOP8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zQCTS84Ajz/NSo9AzeCPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3+j0DN349AzYiPP80sjj/NA44/zQCPQM0Xj0DNhI9AzeGPQM3+j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCQLsMAjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAjj/NAJJB0ACPQM1Kj0DN4I9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf6PQM3jj0DNiY8/zRqPQM1nj0DN+o9Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeOPP81PhzjFAI4/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPQM0Ak0HLAI9AzUmPQM3gj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/I8/zXOPQM11j0DN/Y9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3jj0DNT4c/wwCOP8wAAAAAAAAAAAAAAAAAAAAAAI8/zQCNSs4Aj0DNSo9AzeCPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/48/
zX+PQM11j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCNOM0Ajj/NAAAAAAAAAAAAjj/MAJdJ3gCPP81Kj0DN4I9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/o8/zX6PQM10j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeSPQM1Si0HNAY5AzQCPP80AkDjLAI9A
zU2PQM3hj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQM1zj0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3mjz/NVY07
zwGRRsoAjz/NT49AzeOPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQMtzj0DL/Y9Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL349AyymPQMslj0DL2o9Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/o9Ay32RQ8ZykUPG/ZFD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG+5FDxk2RQ8ZGkUPG+JFDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/pFD
xn2URsBylEbA/ZRGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/JRGwFCURsBJlEbA+ZRGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/pRGwH2XSbhyl0m4/ZdJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4+5dJuE6XSbhGl0m4+ZdJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/pdJuH2aS69ymkyv/ZpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv+5pM
r02aTK9Fmkyv+JpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/ppMr32dTqVynU6l/Z1Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l+51OpU2dTqVEnU6l+J1Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/p1OpX2hUJtyoVCb/aFQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm+uhUJzHoVCb/aFQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb+6FQm02hUJtFoVCb+KFQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/qFQnMihUJvpoVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/qFQ
m32lUpBypVKQ/aVSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkNqkUpI3pFKRraVS
kP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ+6VSkE2lUpBFpVKQ+KVSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/6VSkP+lUpD/pFKRsqRSkzalUpDVpVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/qVSkH6oU4VzqFOF/ahThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hT
hdupU4QaplOKGahThq+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF+6hThU6oU4VHqFOF+ahT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4a0p1OKHalThBeoU4XXqFOF/6hThf+oU4X/qFOF/6hT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThX6sVHlzrFR5/axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xU
ef+sVHn/rFR5/6xUedqsVHkbq1R7AKpUfhusVHuwrFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5+6xU
eU+sVHlIrFR5+axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUerWqVH4eq1R7AKxUeRisVHnWrFR5/6xU
ef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUeX+wVW1zsFVt/bBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbdqwVW0bsFVtAK5VcQCuVHIcr1VvsrBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt+7BVbVCwVW1IsFVt+bBVbf+wVW3/sFVt/7BVbf+wVW3/r1Vutq5Uch+uVXEAsFVtALBV
bRewVW3WsFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbX+zVGF0s1Rh/bNU
Yf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYdqzVGEbs1RhALJUZACyVWUAslVmHbNU
YrOzVGD/s1Rh/7NUYf+zVGH/s1Rh+7NUYVCzVGFJs1Rh+bNUYf+zVGH/s1Rh/7NUYP+zVGK3slVmILJV
ZQCyVGYAs1RhALNUYRezVGHVs1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NU
YX+3VFR0t1RU/bdUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVNq2VFQbtlRUAAAA
AAC5UE8AtVRZALVUWh62VFazt1RU/7dUVP+3VFT/t1RU+7dUVE+2VFRIt1RU+bdUVP+3VFT/t1RU/7ZU
Vri1VFohtVRZALZSVgAAAAAAtlNUALZTVBe2VFTVt1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dU
VP+3VFT/t1RU/7ZUVIC6U0h0ulNI/bpTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pT
SNq6U0gbulNIAAAAAAAAAAAAuFNPALlTTAC4U00euVNJs7pTSP+6U0j/uVNI+7lTSE65U0hGuVNI+bpT
SP+6U0j/uVNJt7hTTSG4U00AvlQ5AAAAAAAAAAAAuVNIALlTSBe5U0jVulNI/7pTSP+6U0j/ulNI/7pT
SP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSIC8Ujt0vFI7/bxSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xS
O/+8Ujv/vFI7/7xSO9q8UjsbvFI7AAAAAAAAAAAAAAAAALtRPwC7UkAAu1JBHbxSPbC8Ujv/vFI7+7xS
O0y8UjtEvFI7+LxSO/+8Ujy1u1JBILtSPwC7UkEAAAAAAAAAAAAAAAAAvFI7ALxSOxe8UjvVvFI7/7xS
O/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO4C/US11v1Et/b9RLf+/US3/v1Et/79R
Lf+/US3/v1Et/79RLf+/US3/v1Et/79RLdu/US0bv1EtAAAAAAAAAAAAAAAAAAAAAADAUBwAvlEzAL5R
NBq+US+rv1Et+L9RLUm/US1Cv1Et9r5RL7C+UTMdvlEzAMBOKwAAAAAAAAAAAAAAAAAAAAAAvlEtAL5R
LRe/US3Vv1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLYDBUB51wVAe/cFQ
Hv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHtvBUB4cwVAeAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwU8kAMBQJQDAUCYYwFAhm8FQH0DBUB86wVAhncBQJhvAUCUAwFAlAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwVAeAMFPHhfBUB7WwVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQ
HoDCTw51wk8O/cNPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8JPDtzCTw4cwk8OAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMM9AADCTxcAwk8WD8JPFg7CTxYNwk8WEMJPFwDETwUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8OAMJPDhjCTw7Ww08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NP
Dv/DTw7/w08O/8JPDoDDTwh0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
CdzDTggdw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMJPCBjDTwnXw08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCIDDTwl0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw04IAMNOCBnDTwnXw08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwl0w08J/cNPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCd3DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08IAMNP
CBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwlzw08J/cNP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08IAMNPCBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNP
CX7DTwlzw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdXDTgkXw04JAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8JAMJPCRTDTwnQw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/sNPCX3DTwlyw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn9w08J1cNP
CWjDTggEw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMFOCAPDTwljw08J08NPCfzDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXvDTwlxw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/cNP
CdPDTwl0w04JHsNPBwHDTwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCAC/TQcAw08JHMNP
CXHDTwnRw08J/MNPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXrDTwlww08J/cNPCf/DTwn/w08J/8NP
Cf3DTwnUw08JdMNOCR3DTQcAw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk4IAMFLBwDCTwkbw08JccNPCdHDTwn8w08J/8NPCf/DTwn/w08J/sNPCXjDTwluw08J/MNP
Cf/DTwn8w08J08NPCXXDTwkewU0EAMJOBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCTgkAv00KAMNOCBzDTwlyw08J0cNPCfzDTwn/w08J/sNP
CXbDTwltw08J+cNPCdDDTwlyw04JHcFPBgDCTggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJOCQDDTgkAw08JG8NP
CW/DTwnOw08J+cNPCXXDTwlGw08JaMJPCRrATAUAwk4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk8IAL5QBADDTwgZw08JaMNOCUrDTQgBw00IAMNNCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTggAw04IAMNPCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
RU5ErkJggg==
</value>
</data>
</root>

371
FireWallet/NewAccountForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,371 @@
namespace FireWallet
{
partial class NewAccountForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewAccountForm));
buttonNext = new Button();
buttonCancel = new Button();
groupBoxMode = new GroupBox();
label1 = new Label();
buttonCold = new Button();
buttonImport = new Button();
buttonNew = new Button();
groupBoxNew = new GroupBox();
textBoxNewPass2 = new TextBox();
textBoxNewPass1 = new TextBox();
label4 = new Label();
textBoxNewName = new TextBox();
label5 = new Label();
label3 = new Label();
label2 = new Label();
groupBoxSeed = new GroupBox();
textBoxSeedPhrase = new TextBox();
groupBoxMulti = new GroupBox();
numericUpDownM = new NumericUpDown();
numericUpDownN = new NumericUpDown();
label7 = new Label();
label6 = new Label();
checkBoxMulti = new CheckBox();
groupBoxMode.SuspendLayout();
groupBoxNew.SuspendLayout();
groupBoxSeed.SuspendLayout();
groupBoxMulti.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownM).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownN).BeginInit();
SuspendLayout();
//
// buttonNext
//
buttonNext.FlatStyle = FlatStyle.Flat;
buttonNext.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonNext.Location = new Point(576, 372);
buttonNext.Name = "buttonNext";
buttonNext.Size = new Size(92, 46);
buttonNext.TabIndex = 0;
buttonNext.TabStop = false;
buttonNext.Text = "Next";
buttonNext.UseVisualStyleBackColor = true;
buttonNext.Visible = false;
buttonNext.Click += buttonNext_Click;
//
// buttonCancel
//
buttonCancel.FlatStyle = FlatStyle.Flat;
buttonCancel.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonCancel.Location = new Point(12, 372);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(92, 46);
buttonCancel.TabIndex = 0;
buttonCancel.TabStop = false;
buttonCancel.Text = "Cancel";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// groupBoxMode
//
groupBoxMode.Controls.Add(label1);
groupBoxMode.Controls.Add(buttonCold);
groupBoxMode.Controls.Add(buttonImport);
groupBoxMode.Controls.Add(buttonNew);
groupBoxMode.Font = new Font("Segoe UI", 14F, FontStyle.Regular, GraphicsUnit.Point);
groupBoxMode.Location = new Point(125, 22);
groupBoxMode.Name = "groupBoxMode";
groupBoxMode.Size = new Size(450, 319);
groupBoxMode.TabIndex = 1;
groupBoxMode.TabStop = false;
//
// label1
//
label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
label1.Location = new Point(29, 19);
label1.Name = "label1";
label1.Size = new Size(391, 42);
label1.TabIndex = 3;
label1.Text = "Welcome!\r\nYou can either create a new wallet or import an old one";
label1.TextAlign = ContentAlignment.TopCenter;
//
// buttonCold
//
buttonCold.FlatStyle = FlatStyle.Flat;
buttonCold.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonCold.Location = new Point(147, 239);
buttonCold.Name = "buttonCold";
buttonCold.Size = new Size(156, 62);
buttonCold.TabIndex = 2;
buttonCold.TabStop = false;
buttonCold.Text = "Connect Ledger";
buttonCold.UseVisualStyleBackColor = true;
buttonCold.Click += buttonCold_Click;
//
// buttonImport
//
buttonImport.FlatStyle = FlatStyle.Flat;
buttonImport.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonImport.Location = new Point(147, 171);
buttonImport.Name = "buttonImport";
buttonImport.Size = new Size(156, 62);
buttonImport.TabIndex = 1;
buttonImport.TabStop = false;
buttonImport.Text = "Import Wallet";
buttonImport.UseVisualStyleBackColor = true;
buttonImport.Click += buttonImport_Click;
//
// buttonNew
//
buttonNew.FlatStyle = FlatStyle.Flat;
buttonNew.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonNew.Location = new Point(147, 103);
buttonNew.Name = "buttonNew";
buttonNew.Size = new Size(156, 62);
buttonNew.TabIndex = 0;
buttonNew.TabStop = false;
buttonNew.Text = "Create New Wallet";
buttonNew.UseVisualStyleBackColor = true;
buttonNew.Click += buttonNew_Click;
//
// groupBoxNew
//
groupBoxNew.Controls.Add(textBoxNewPass2);
groupBoxNew.Controls.Add(textBoxNewPass1);
groupBoxNew.Controls.Add(label4);
groupBoxNew.Controls.Add(textBoxNewName);
groupBoxNew.Controls.Add(label5);
groupBoxNew.Controls.Add(label3);
groupBoxNew.Controls.Add(label2);
groupBoxNew.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
groupBoxNew.Location = new Point(125, 22);
groupBoxNew.Name = "groupBoxNew";
groupBoxNew.Size = new Size(450, 319);
groupBoxNew.TabIndex = 4;
groupBoxNew.TabStop = false;
groupBoxNew.Text = "New Wallet";
groupBoxNew.Visible = false;
//
// textBoxNewPass2
//
textBoxNewPass2.Location = new Point(128, 136);
textBoxNewPass2.Name = "textBoxNewPass2";
textBoxNewPass2.Size = new Size(316, 29);
textBoxNewPass2.TabIndex = 8;
textBoxNewPass2.UseSystemPasswordChar = true;
//
// textBoxNewPass1
//
textBoxNewPass1.Location = new Point(128, 90);
textBoxNewPass1.Name = "textBoxNewPass1";
textBoxNewPass1.Size = new Size(316, 29);
textBoxNewPass1.TabIndex = 7;
textBoxNewPass1.UseSystemPasswordChar = true;
//
// label4
//
label4.AutoSize = true;
label4.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
label4.Location = new Point(128, 57);
label4.Name = "label4";
label4.Size = new Size(195, 15);
label4.TabIndex = 6;
label4.Text = "Only lowercase letters and numbers";
//
// textBoxNewName
//
textBoxNewName.Location = new Point(128, 25);
textBoxNewName.Name = "textBoxNewName";
textBoxNewName.Size = new Size(316, 29);
textBoxNewName.TabIndex = 5;
textBoxNewName.TextChanged += textBoxNewName_TextChanged;
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(38, 139);
label5.Name = "label5";
label5.Size = new Size(70, 21);
label5.TabIndex = 1;
label5.Text = "Confirm:";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(29, 93);
label3.Name = "label3";
label3.Size = new Size(79, 21);
label3.TabIndex = 1;
label3.Text = "Password:";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(53, 28);
label2.Name = "label2";
label2.Size = new Size(55, 21);
label2.TabIndex = 0;
label2.Text = "Name:";
//
// groupBoxSeed
//
groupBoxSeed.Controls.Add(textBoxSeedPhrase);
groupBoxSeed.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
groupBoxSeed.Location = new Point(125, 22);
groupBoxSeed.Name = "groupBoxSeed";
groupBoxSeed.Size = new Size(450, 319);
groupBoxSeed.TabIndex = 5;
groupBoxSeed.TabStop = false;
groupBoxSeed.Text = "Seed Phrase";
groupBoxSeed.Visible = false;
//
// textBoxSeedPhrase
//
textBoxSeedPhrase.Location = new Point(6, 25);
textBoxSeedPhrase.Multiline = true;
textBoxSeedPhrase.Name = "textBoxSeedPhrase";
textBoxSeedPhrase.PlaceholderText = "pistol air cabbage high conduct party powder inject jungle knee spell derive";
textBoxSeedPhrase.Size = new Size(438, 288);
textBoxSeedPhrase.TabIndex = 0;
//
// groupBoxMulti
//
groupBoxMulti.Controls.Add(numericUpDownM);
groupBoxMulti.Controls.Add(numericUpDownN);
groupBoxMulti.Controls.Add(label7);
groupBoxMulti.Controls.Add(label6);
groupBoxMulti.Controls.Add(checkBoxMulti);
groupBoxMulti.Location = new Point(125, 22);
groupBoxMulti.Name = "groupBoxMulti";
groupBoxMulti.Size = new Size(450, 319);
groupBoxMulti.TabIndex = 6;
groupBoxMulti.TabStop = false;
groupBoxMulti.Text = "Multisig";
//
// numericUpDownM
//
numericUpDownM.Location = new Point(223, 91);
numericUpDownM.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownM.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownM.Name = "numericUpDownM";
numericUpDownM.Size = new Size(120, 23);
numericUpDownM.TabIndex = 2;
numericUpDownM.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// numericUpDownN
//
numericUpDownN.Location = new Point(223, 55);
numericUpDownN.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownN.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownN.Name = "numericUpDownN";
numericUpDownN.Size = new Size(120, 23);
numericUpDownN.TabIndex = 2;
numericUpDownN.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// label7
//
label7.AutoSize = true;
label7.Location = new Point(6, 93);
label7.Name = "label7";
label7.Size = new Size(211, 15);
label7.TabIndex = 1;
label7.Text = "Required Signers to send a transaction:";
//
// label6
//
label6.AutoSize = true;
label6.Location = new Point(141, 61);
label6.Name = "label6";
label6.Size = new Size(76, 15);
label6.TabIndex = 1;
label6.Text = "Total Signers:";
//
// checkBoxMulti
//
checkBoxMulti.AutoSize = true;
checkBoxMulti.Location = new Point(6, 23);
checkBoxMulti.Name = "checkBoxMulti";
checkBoxMulti.Size = new Size(115, 19);
checkBoxMulti.TabIndex = 0;
checkBoxMulti.Text = "Create a multisig";
checkBoxMulti.UseVisualStyleBackColor = true;
//
// NewAccountForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(680, 430);
Controls.Add(groupBoxMulti);
Controls.Add(groupBoxSeed);
Controls.Add(buttonCancel);
Controls.Add(buttonNext);
Controls.Add(groupBoxNew);
Controls.Add(groupBoxMode);
FormBorderStyle = FormBorderStyle.Fixed3D;
Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "NewAccountForm";
Text = "New Account | FireWallet";
Load += NewAccountForm_Load;
groupBoxMode.ResumeLayout(false);
groupBoxMode.PerformLayout();
groupBoxNew.ResumeLayout(false);
groupBoxNew.PerformLayout();
groupBoxSeed.ResumeLayout(false);
groupBoxSeed.PerformLayout();
groupBoxMulti.ResumeLayout(false);
groupBoxMulti.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownM).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownN).EndInit();
ResumeLayout(false);
}
#endregion
private Button buttonNext;
private Button buttonCancel;
private GroupBox groupBoxMode;
private Label label1;
private Button buttonCold;
private Button buttonImport;
private Button buttonNew;
private GroupBox groupBoxNew;
private Label label3;
private Label label2;
private TextBox textBoxNewName;
private Label label4;
private TextBox textBoxNewPass2;
private TextBox textBoxNewPass1;
private Label label5;
private GroupBox groupBoxSeed;
private TextBox textBoxSeedPhrase;
private GroupBox groupBoxMulti;
private CheckBox checkBoxMulti;
private NumericUpDown numericUpDownM;
private NumericUpDown numericUpDownN;
private Label label7;
private Label label6;
}
}

View File

@@ -0,0 +1,400 @@
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
namespace FireWallet
{
public partial class NewAccountForm : Form
{
MainForm mainForm;
private int page;
public NewAccountForm(MainForm main)
{
InitializeComponent();
mainForm = main;
}
private void NewAccountForm_Load(object sender, EventArgs e)
{
page = 0;
Dictionary<string, string> theme = mainForm.Theme;
this.BackColor = ColorTranslator.FromHtml(theme["background"]);
this.ForeColor = ColorTranslator.FromHtml(theme["foreground"]);
foreach (Control c in Controls)
{
mainForm.ThemeControl(c);
}
groupBoxMulti.Hide();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void buttonNew_Click(object sender, EventArgs e)
{
page = 1;
groupBoxNew.Show();
buttonNext.Show();
buttonNext.Enabled = false;
buttonNext.Text = "Create";
}
private void buttonImport_Click(object sender, EventArgs e)
{
page = 2;
groupBoxNew.Show();
buttonNext.Show();
buttonNext.Enabled = false;
groupBoxNew.Text = "Import Wallet";
}
private async void buttonCold_Click(object sender, EventArgs e)
{
if (!Directory.Exists(mainForm.dir + "hsd-ledger"))
{
if (mainForm.CheckNodeInstalled() == false)
{
mainForm.AddLog("Node not installed");
NotifyForm notify1 = new NotifyForm("Node not installed\nPlease install it to use Ledger");
notify1.ShowDialog();
notify1.Dispose();
return;
}
mainForm.AddLog("Installing hsd-ledger");
// Try to install hsd-ledger
try
{
NotifyForm Notifyinstall = new NotifyForm("Installing hsd-ledger\nThis may take a few minutes\nDo not close FireWallet", false);
Notifyinstall.Show();
// Wait for the notification to show
await Task.Delay(1000);
string repositoryUrl = "https://github.com/handshake-org/hsd-ledger.git";
string destinationPath = mainForm.dir + "hsd-ledger";
mainForm.CloneRepository(repositoryUrl, destinationPath);
Notifyinstall.CloseNotification();
Notifyinstall.Dispose();
}
catch (Exception ex)
{
NotifyForm notifyError = new NotifyForm("Error installing hsd-ledger\n" + ex.Message);
mainForm.AddLog(ex.Message);
notifyError.ShowDialog();
notifyError.Dispose();
return;
}
}
// Import HSD Wallet
groupBoxNew.Show();
groupBoxNew.Text = "Import Ledger";
buttonNext.Show();
page = 4;
}
private void textBoxNewName_TextChanged(object sender, EventArgs e)
{
if (Regex.IsMatch(textBoxNewName.Text, @"^[a-z0-9]+$"))
{
textBoxNewName.BackColor = Color.LightGreen;
buttonNext.Enabled = true;
}
else
{
textBoxNewName.BackColor = Color.LightPink;
buttonNext.Enabled = false;
}
}
private async void buttonNext_Click(object sender, EventArgs e)
{
if (textBoxNewPass1 == null)
{
NotifyForm notify = new NotifyForm("Please enter a password");
notify.ShowDialog();
notify.Dispose();
return;
}
if (textBoxNewPass1.Text.Length < 8)
{
NotifyForm notify = new NotifyForm("Password must be at least 8 characters");
notify.ShowDialog();
notify.Dispose();
return;
}
if (textBoxNewPass1.Text != textBoxNewPass2.Text)
{
NotifyForm notify = new NotifyForm("Passwords do not match");
notify.ShowDialog();
notify.Dispose();
return;
}
if (page == 1)
{
groupBoxMulti.Show();
page = 6;
}
else if (page == 2)
{
groupBoxSeed.Show();
page = 3;
}
else if (page == 3)
{
page = 5;
groupBoxMulti.Show();
buttonNext.Text = "Import";
}
else if (page == 5)
{
if (!checkBoxMulti.Checked)
{
// Import wallet from seed
buttonNext.Enabled = false;
string path = "wallet/" + textBoxNewName.Text;
string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\"}";
string response = await APIPut(path, true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error creating wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
mainForm.AddLog("Created wallet: " + textBoxNewName.Text);
NotifyForm notify2 = new NotifyForm("Imported wallet: " + textBoxNewName.Text);
notify2.ShowDialog();
notify2.Dispose();
this.Close();
}
else
{
// Import wallet from seed and create multisig
buttonNext.Enabled = false;
string path = "wallet/" + textBoxNewName.Text;
string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\", \"type\":\"multisig\",\"m\":"+numericUpDownM.Value.ToString()+ ",\"n\":" +numericUpDownN.Value.ToString() + "}";
string response = await APIPut(path, true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error creating wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
mainForm.AddLog("Created wallet: " + textBoxNewName.Text);
NotifyForm notify2 = new NotifyForm("Imported wallet: " + textBoxNewName.Text);
notify2.ShowDialog();
notify2.Dispose();
this.Close();
}
}
else if (page == 6)
{
if (!checkBoxMulti.Checked)
{
// Create new wallet
buttonNext.Enabled = false;
string path = "wallet/" + textBoxNewName.Text;
string content = "{}";
//content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\"}";
string response = await APIPut(path, true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error creating wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
mainForm.AddLog("Created wallet: " + textBoxNewName.Text);
// Show SEED PHRASE
path = "wallet/" + textBoxNewName.Text + "/master";
response = await mainForm.APIGet(path, true);
JObject resp = JObject.Parse(response);
if (resp["encrypted"].ToString() == "False")
{
JObject mnemonic = JObject.Parse(resp["mnemonic"].ToString());
string phrase = mnemonic["phrase"].ToString();
NotifyForm notifyForm = new NotifyForm("SEED PHRASE\nSTORE THIS SOMEWHERE SECURE\n" + phrase, "Copy", phrase, true);
notifyForm.ShowDialog();
notifyForm.Dispose();
}
// Select wallet
content = "{\"method\":\"selectwallet\",\"params\":[\"" + textBoxNewName.Text + "\"]}";
response = await mainForm.APIPost("", true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error selecting wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
// Encrypt wallet
content = "{\"method\":\"encryptwallet\",\"params\":[\"" + textBoxNewPass1.Text + "\"]}";
response = await mainForm.APIPost("", true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error encrypting wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
mainForm.AddLog("Encrypted wallet: " + textBoxNewName.Text);
this.Close();
} else
{
// Create new wallet
buttonNext.Enabled = false;
string path = "wallet/" + textBoxNewName.Text;
string content = "{\"type\":\"multisig\",\"m\":"+numericUpDownM.Value.ToString()+ ",\"n\":" +numericUpDownN.Value.ToString() + "}";
string response = await APIPut(path, true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error creating wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
path = "wallet/" + textBoxNewName.Text + "/master";
response = await mainForm.APIGet(path, true);
JObject resp = JObject.Parse(response);
if (resp["encrypted"].ToString() == "False")
{
JObject mnemonic = JObject.Parse(resp["mnemonic"].ToString());
string phrase = mnemonic["phrase"].ToString();
NotifyForm notifyForm = new NotifyForm("SEED PHRASE\nSTORE THIS SOMEWHERE SECURE\n" + phrase, "Copy", phrase, true);
notifyForm.ShowDialog();
notifyForm.Dispose();
}
// Select wallet
content = "{\"method\":\"selectwallet\",\"params\":[\"" + textBoxNewName.Text + "\"]}";
response = await mainForm.APIPost("", true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error selecting wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
// Encrypt wallet
content = "{\"method\":\"encryptwallet\",\"params\":[\"" + textBoxNewPass1.Text + "\"]}";
response = await mainForm.APIPost("", true, content);
if (response == "Error")
{
NotifyForm notify = new NotifyForm("Error encrypting wallet");
notify.ShowDialog();
notify.Dispose();
buttonNext.Enabled = true;
return;
}
mainForm.AddLog("Encrypted wallet: " + textBoxNewName.Text);
this.Close();
}
}
else if (page == 4)
{
try
{
// Import Ledger
buttonNext.Enabled = false;
var proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardInput = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "node.exe";
proc.StartInfo.Arguments = mainForm.dir + "hsd-ledger/bin/hsd-ledger createwallet " + textBoxNewPass1.Text + " --api-key " + mainForm.NodeSettings["Key"];
var outputBuilder = new StringBuilder();
// Event handler for capturing output data
proc.OutputDataReceived += (sender, args) =>
{
if (!string.IsNullOrEmpty(args.Data))
{
outputBuilder.AppendLine(args.Data);
}
};
proc.Start();
proc.BeginOutputReadLine();
proc.WaitForExit();
mainForm.AddLog(outputBuilder.ToString());
}
catch (Exception ex)
{
mainForm.AddLog(ex.Message);
NotifyForm notify = new NotifyForm("Error importing wallet\n" + ex.Message);
notify.ShowDialog();
notify.Dispose();
this.Close();
return;
}
}
}
HttpClient httpClient = new HttpClient();
private async Task<string> APIPut(string path, bool wallet, string content)
{
string key = mainForm.NodeSettings["Key"];
string ip = mainForm.NodeSettings["IP"];
string port = "1203";
if (mainForm.HSDNetwork == 1)
{
port = "1303";
}
if (wallet) port = port + "9";
else port = port + "7";
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Put, "http://" + ip + ":" + port + "/" + path);
req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("x:" + key)));
req.Content = new StringContent(content);
try
{
// Send request
HttpResponseMessage resp = await httpClient.SendAsync(req);
if (resp.IsSuccessStatusCode)
{
return await resp.Content.ReadAsStringAsync();
}
else
{
mainForm.AddLog("Put Error: " + await resp.Content.ReadAsStringAsync());
return "Error";
}
}
catch (Exception ex)
{
mainForm.AddLog("Put Error: " + ex.Message);
return "Error";
}
}
}
}

View File

@@ -0,0 +1,828 @@
<?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>
<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>
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
Ng+/rHaXDlcTERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER
ERERERERERERERERERERERERERERERERERERERERERERERERERERkbz1/wNrGKFswMgwBwAAAABJRU5E
rkJggg==
</value>
</data>
</root>

View File

@@ -36,6 +36,7 @@ namespace FireWallet
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NodeForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NodeForm));
labelWelcome = new Label(); labelWelcome = new Label();
groupBoxNode = new GroupBox(); groupBoxNode = new GroupBox();
checkBoxRunHSD = new CheckBox();
labelNodeStatus = new Label(); labelNodeStatus = new Label();
comboBoxNodeNetwork = new ComboBox(); comboBoxNodeNetwork = new ComboBox();
buttonSave = new Button(); buttonSave = new Button();
@@ -61,6 +62,7 @@ namespace FireWallet
// //
// groupBoxNode // groupBoxNode
// //
groupBoxNode.Controls.Add(checkBoxRunHSD);
groupBoxNode.Controls.Add(labelNodeStatus); groupBoxNode.Controls.Add(labelNodeStatus);
groupBoxNode.Controls.Add(comboBoxNodeNetwork); groupBoxNode.Controls.Add(comboBoxNodeNetwork);
groupBoxNode.Controls.Add(buttonSave); groupBoxNode.Controls.Add(buttonSave);
@@ -77,6 +79,16 @@ namespace FireWallet
groupBoxNode.TabStop = false; groupBoxNode.TabStop = false;
groupBoxNode.Text = "Node"; groupBoxNode.Text = "Node";
// //
// checkBoxRunHSD
//
checkBoxRunHSD.AutoSize = true;
checkBoxRunHSD.Location = new Point(62, 100);
checkBoxRunHSD.Name = "checkBoxRunHSD";
checkBoxRunHSD.Size = new Size(304, 19);
checkBoxRunHSD.TabIndex = 10;
checkBoxRunHSD.Text = "Run HSD (use this if you don't want to run Bob/HSD)";
checkBoxRunHSD.UseVisualStyleBackColor = true;
//
// labelNodeStatus // labelNodeStatus
// //
labelNodeStatus.AutoSize = true; labelNodeStatus.AutoSize = true;
@@ -193,5 +205,6 @@ namespace FireWallet
private Button buttonSave; private Button buttonSave;
private ComboBox comboBoxNodeNetwork; private ComboBox comboBoxNodeNetwork;
private Label labelNodeStatus; private Label labelNodeStatus;
private CheckBox checkBoxRunHSD;
} }
} }

View File

@@ -7,6 +7,7 @@ using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using System.Xml.Linq; using System.Xml.Linq;
@@ -278,18 +279,47 @@ namespace FireWallet
private void SaveSettings(object sender, EventArgs e) private void SaveSettings(object sender, EventArgs e)
{ {
buttonNodeTest.PerformClick(); if (textBoxNodeKey.Text == "")
if (labelNodeStatus.Text != "Node Connected")
{ {
NotifyForm notifyForm = new NotifyForm("Please enter a key");
notifyForm.ShowDialog();
notifyForm.Dispose();
return; return;
} }
StreamWriter sw = new StreamWriter(dir + "node.txt"); if (checkBoxRunHSD.Checked)
sw.WriteLine("IP: " + textBoxNodeIP.Text); {
sw.WriteLine("Network: " + comboBoxNodeNetwork.SelectedIndex); if (!Regex.IsMatch(textBoxNodeKey.Text, @"^[a-zA-Z0-9]+$"))
sw.WriteLine("Key: " + textBoxNodeKey.Text); {
sw.Dispose(); NotifyForm notifyForm = new NotifyForm("Please enter valid API key\nDo not use spaces or weird stuff");
this.Close(); notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
StreamWriter sw = new StreamWriter(dir + "node.txt");
sw.WriteLine("IP: " + textBoxNodeIP.Text);
sw.WriteLine("Network: " + comboBoxNodeNetwork.SelectedIndex);
sw.WriteLine("Key: " + textBoxNodeKey.Text);
sw.WriteLine("HSD: True");
sw.Dispose();
this.Close();
}
else
{
buttonNodeTest.PerformClick();
if (labelNodeStatus.Text != "Node Connected")
{
return;
}
StreamWriter sw = new StreamWriter(dir + "node.txt");
sw.WriteLine("IP: " + textBoxNodeIP.Text);
sw.WriteLine("Network: " + comboBoxNodeNetwork.SelectedIndex);
sw.WriteLine("Key: " + textBoxNodeKey.Text);
sw.Dispose();
this.Close();
}
} }
} }
} }

View File

@@ -82,8 +82,10 @@ namespace FireWallet
Controls.Add(labelmessage); Controls.Add(labelmessage);
FormBorderStyle = FormBorderStyle.FixedDialog; FormBorderStyle = FormBorderStyle.FixedDialog;
Icon = (Icon)resources.GetObject("$this.Icon"); Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "NotifyForm"; Name = "NotifyForm";
Text = "FireWallet"; Text = "FireWallet";
FormClosing += NotifyForm_FormClosing;
Load += NotifyForm_Load; Load += NotifyForm_Load;
ResumeLayout(false); ResumeLayout(false);
} }

View File

@@ -18,13 +18,18 @@ namespace FireWallet
string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FireWallet\\"; string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FireWallet\\";
Dictionary<string, string> theme; Dictionary<string, string> theme;
string altLink; string altLink;
bool Linkcopy;
bool allowClose = true;
public NotifyForm(string Message) public NotifyForm(string Message)
{ {
InitializeComponent(); InitializeComponent();
labelmessage.Text = Message; labelmessage.Text = Message;
altLink = ""; altLink = "";
} }
public void CloseNotification()
{
this.Close();
}
public NotifyForm(string Message, string altText, string altLink) public NotifyForm(string Message, string altText, string altLink)
{ {
InitializeComponent(); InitializeComponent();
@@ -33,6 +38,33 @@ namespace FireWallet
buttonALT.Visible = true; buttonALT.Visible = true;
this.altLink = altLink; this.altLink = altLink;
buttonOK.Focus(); buttonOK.Focus();
Linkcopy = false;
}
public NotifyForm(string Message, bool allowClose)
{
InitializeComponent();
labelmessage.Text = Message;
buttonOK.Focus();
Linkcopy = false;
buttonOK.Visible = allowClose;
allowClose = allowClose;
}
public NotifyForm(string Message, string altText, string altLink, bool Linkcopy)
{
InitializeComponent();
labelmessage.Text = Message;
buttonALT.Text = altText;
buttonALT.Visible = true;
this.altLink = altLink;
buttonOK.Focus();
this.Linkcopy = Linkcopy;
if (Linkcopy)
{
// Small font to fix more data
labelmessage.Font = new Font(labelmessage.Font.FontFamily, 10);
}
} }
#region Theming #region Theming
@@ -215,11 +247,18 @@ namespace FireWallet
private void OK_Click(object sender, EventArgs e) private void OK_Click(object sender, EventArgs e)
{ {
allowClose = true;
this.Close(); this.Close();
} }
private void buttonALT_Click(object sender, EventArgs e) private void buttonALT_Click(object sender, EventArgs e)
{ {
if (Linkcopy)
{
// Copy link to clipboard
Clipboard.SetText(altLink);
return;
}
// Open link // Open link
ProcessStartInfo psi = new ProcessStartInfo ProcessStartInfo psi = new ProcessStartInfo
{ {
@@ -228,5 +267,10 @@ namespace FireWallet
}; };
Process.Start(psi); Process.Start(psi);
} }
private void NotifyForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (!allowClose) e.Cancel = true;
}
} }
} }

View File

@@ -59,5 +59,15 @@ namespace FireWallet.Properties {
resourceCulture = value; resourceCulture = value;
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap FWSplash {
get {
object obj = ResourceManager.GetObject("FWSplash", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
} }
} }

View File

@@ -117,4 +117,8 @@
<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.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="FWSplash" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\FWSplash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> </root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace FireWallet.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,6 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -30,23 +30,23 @@
{ {
components = new System.ComponentModel.Container(); components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashScreen)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashScreen));
timerSplashDelay = new System.Windows.Forms.Timer(components);
label1 = new Label(); label1 = new Label();
pictureBox1 = new PictureBox(); pictureBox1 = new PictureBox();
label2 = new Label();
panelNew = new Panel();
pictureBoxNew = new PictureBox();
timerIn = new System.Windows.Forms.Timer(components);
timerOut = new System.Windows.Forms.Timer(components);
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
panelNew.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxNew).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// timerSplashDelay
//
timerSplashDelay.Enabled = true;
timerSplashDelay.Interval = 3000;
timerSplashDelay.Tick += timerSplashDelay_Tick;
//
// label1 // label1
// //
label1.AutoSize = true; label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 20F, FontStyle.Regular, GraphicsUnit.Point); label1.Font = new Font("Segoe UI", 20F, FontStyle.Regular, GraphicsUnit.Point);
label1.Location = new Point(209, 36); label1.Location = new Point(80, 9);
label1.Name = "label1"; label1.Name = "label1";
label1.Size = new Size(284, 37); label1.Size = new Size(284, 37);
label1.TabIndex = 0; label1.TabIndex = 0;
@@ -54,20 +54,66 @@
// //
// pictureBox1 // pictureBox1
// //
pictureBox1.BackColor = Color.Transparent;
pictureBox1.Image = (Image)resources.GetObject("pictureBox1.Image"); pictureBox1.Image = (Image)resources.GetObject("pictureBox1.Image");
pictureBox1.Location = new Point(142, 76); pictureBox1.Location = new Point(12, 58);
pictureBox1.Name = "pictureBox1"; pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(411, 328); pictureBox1.Size = new Size(420, 330);
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox1.TabIndex = 1; pictureBox1.TabIndex = 1;
pictureBox1.TabStop = false; pictureBox1.TabStop = false;
// //
// label2
//
label2.AutoSize = true;
label2.Font = new Font("Segoe UI", 11F, FontStyle.Regular, GraphicsUnit.Point);
label2.Location = new Point(154, 400);
label2.Name = "label2";
label2.Size = new Size(136, 20);
label2.TabIndex = 2;
label2.Text = "Nathan.Woodburn/";
label2.Click += label2_Click;
//
// panelNew
//
panelNew.Controls.Add(pictureBoxNew);
panelNew.Dock = DockStyle.Fill;
panelNew.Location = new Point(0, 0);
panelNew.Name = "panelNew";
panelNew.Size = new Size(450, 450);
panelNew.TabIndex = 3;
//
// pictureBoxNew
//
pictureBoxNew.BackColor = Color.Black;
pictureBoxNew.Dock = DockStyle.Fill;
pictureBoxNew.Image = Properties.Resources.FWSplash;
pictureBoxNew.InitialImage = null;
pictureBoxNew.Location = new Point(0, 0);
pictureBoxNew.Name = "pictureBoxNew";
pictureBoxNew.Size = new Size(450, 450);
pictureBoxNew.SizeMode = PictureBoxSizeMode.Zoom;
pictureBoxNew.TabIndex = 0;
pictureBoxNew.TabStop = false;
pictureBoxNew.Visible = false;
//
// timerIn
//
timerIn.Enabled = true;
timerIn.Tick += timerIn_Tick;
//
// timerOut
//
timerOut.Tick += timerOut_Tick;
//
// SplashScreen // SplashScreen
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.Black; BackColor = Color.Black;
ClientSize = new Size(749, 416); ClientSize = new Size(450, 450);
Controls.Add(panelNew);
Controls.Add(label2);
Controls.Add(pictureBox1); Controls.Add(pictureBox1);
Controls.Add(label1); Controls.Add(label1);
ForeColor = Color.FromArgb(142, 5, 194); ForeColor = Color.FromArgb(142, 5, 194);
@@ -77,16 +123,23 @@
ShowInTaskbar = false; ShowInTaskbar = false;
StartPosition = FormStartPosition.CenterScreen; StartPosition = FormStartPosition.CenterScreen;
Text = "FireWallet"; Text = "FireWallet";
TopMost = true;
FormClosing += SplashScreen_FormClosing; FormClosing += SplashScreen_FormClosing;
Load += SplashScreen_Load;
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
panelNew.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBoxNew).EndInit();
ResumeLayout(false); ResumeLayout(false);
PerformLayout(); PerformLayout();
} }
#endregion #endregion
private System.Windows.Forms.Timer timerSplashDelay;
private Label label1; private Label label1;
private PictureBox pictureBox1; private PictureBox pictureBox1;
private Label label2;
private Panel panelNew;
private PictureBox pictureBoxNew;
private System.Windows.Forms.Timer timerIn;
private System.Windows.Forms.Timer timerOut;
} }
} }

View File

@@ -1,29 +1,19 @@
using System; using System.Diagnostics;
using System.Collections.Generic; using System.Drawing.Imaging;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FireWallet namespace FireWallet
{ {
public partial class SplashScreen : Form public partial class SplashScreen : Form
{ {
public SplashScreen() public SplashScreen(bool timer)
{ {
InitializeComponent(); InitializeComponent();
close = false; close = false;
IsClosed = false;
} }
bool close; bool close;
private void timerSplashDelay_Tick(object sender, EventArgs e) float opacity = 0.0f;
{
close = true;
this.Close();
}
private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e) private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e)
{ {
if (!close) if (!close)
@@ -31,5 +21,74 @@ namespace FireWallet
e.Cancel = true; e.Cancel = true;
} }
} }
public bool IsClosed { get; set; }
public void CloseSplash()
{
close = true;
// Fade out
timerIn.Stop();
timerOut.Start();
}
private void label2_Click(object sender, EventArgs e)
{
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "https://nathan.woodburn.au",
UseShellExecute = true
};
Process.Start(psi);
}
Bitmap splash = new Bitmap(Properties.Resources.FWSplash);
private void SplashScreen_Load(object sender, EventArgs e)
{
pictureBoxNew.Visible = true;
this.TransparencyKey = Color.FromArgb(0, 0, 0);
pictureBoxNew.Invalidate();
}
public Image SetImageOpacity(Image image, float opacity)
{
try
{
Bitmap bmp = new Bitmap(image.Width, image.Height);
using (Graphics gfx = Graphics.FromImage(bmp))
{
ColorMatrix matrix = new ColorMatrix();
matrix.Matrix33 = opacity;
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
}
return bmp;
}
catch
{
return null;
}
}
private void timerIn_Tick(object sender, EventArgs e)
{
if (opacity >= 1)
{
timerIn.Stop();
return;
}
opacity += 0.05f;
pictureBoxNew.Image = SetImageOpacity(splash, opacity);
pictureBoxNew.Invalidate();
}
private void timerOut_Tick(object sender, EventArgs e)
{
if (opacity <= 0)
{
timerOut.Stop();
IsClosed = true;
this.Close();
return;
}
opacity -= 0.05f;
pictureBoxNew.Image = SetImageOpacity(splash, opacity);
pictureBoxNew.Invalidate();
}
} }
} }

View File

@@ -117,9 +117,6 @@
<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>
<metadata name="timerSplashDelay.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
@@ -901,6 +898,12 @@
AAAAAAAAAAAAAADQwWbM+D8RAPjBClJL0gAAAABJRU5ErkJggg== AAAAAAAAAAAAAADQwWbM+D8RAPjBClJL0gAAAABJRU5ErkJggg==
</value> </value>
</data> </data>
<metadata name="timerIn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="timerOut.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>104, 17</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAEAAAAAAAEAIAB2pAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAOEAAADAAgGAAAAfG+p9QAAIABJ AAABAAEAAAAAAAEAIAB2pAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAOEAAADAAgGAAAAfG+p9QAAIABJ

132
FireWallet/TXForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,132 @@
namespace FireWallet
{
partial class TXForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TXForm));
labelHash = new Label();
groupBoxInputs = new GroupBox();
groupBoxOutputs = new GroupBox();
buttonExplorer = new Button();
panelInputs = new Panel();
panelOutputs = new Panel();
groupBoxInputs.SuspendLayout();
groupBoxOutputs.SuspendLayout();
SuspendLayout();
//
// labelHash
//
labelHash.AutoSize = true;
labelHash.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
labelHash.Location = new Point(12, 9);
labelHash.Name = "labelHash";
labelHash.Size = new Size(48, 21);
labelHash.TabIndex = 0;
labelHash.Text = "Hash:";
//
// groupBoxInputs
//
groupBoxInputs.Controls.Add(panelInputs);
groupBoxInputs.Location = new Point(12, 60);
groupBoxInputs.Name = "groupBoxInputs";
groupBoxInputs.Size = new Size(277, 378);
groupBoxInputs.TabIndex = 1;
groupBoxInputs.TabStop = false;
groupBoxInputs.Text = "Inputs";
//
// groupBoxOutputs
//
groupBoxOutputs.Controls.Add(panelOutputs);
groupBoxOutputs.Location = new Point(295, 60);
groupBoxOutputs.Name = "groupBoxOutputs";
groupBoxOutputs.Size = new Size(493, 378);
groupBoxOutputs.TabIndex = 0;
groupBoxOutputs.TabStop = false;
groupBoxOutputs.Text = "Outputs";
//
// buttonExplorer
//
buttonExplorer.FlatStyle = FlatStyle.Flat;
buttonExplorer.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonExplorer.Location = new Point(699, 12);
buttonExplorer.Name = "buttonExplorer";
buttonExplorer.Size = new Size(89, 37);
buttonExplorer.TabIndex = 0;
buttonExplorer.Text = "Explorer";
buttonExplorer.UseVisualStyleBackColor = true;
buttonExplorer.Click += Explorer_Click;
//
// panelInputs
//
panelInputs.AutoScroll = true;
panelInputs.Dock = DockStyle.Fill;
panelInputs.Location = new Point(3, 19);
panelInputs.Name = "panelInputs";
panelInputs.Size = new Size(271, 356);
panelInputs.TabIndex = 0;
//
// panelOutputs
//
panelOutputs.AutoScroll = true;
panelOutputs.Dock = DockStyle.Fill;
panelOutputs.Location = new Point(3, 19);
panelOutputs.Name = "panelOutputs";
panelOutputs.Size = new Size(487, 356);
panelOutputs.TabIndex = 0;
//
// TXForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(buttonExplorer);
Controls.Add(groupBoxOutputs);
Controls.Add(groupBoxInputs);
Controls.Add(labelHash);
FormBorderStyle = FormBorderStyle.Fixed3D;
Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "TXForm";
Text = "TXForm";
Load += TXForm_Load;
groupBoxInputs.ResumeLayout(false);
groupBoxOutputs.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelHash;
private GroupBox groupBoxInputs;
private GroupBox groupBoxOutputs;
private Button buttonExplorer;
private Panel panelInputs;
private Panel panelOutputs;
}
}

154
FireWallet/TXForm.cs Normal file
View File

@@ -0,0 +1,154 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
namespace FireWallet
{
public partial class TXForm : Form
{
MainForm mainForm;
JObject tx;
string txid;
public TXForm(MainForm mainForm, string txid)
{
InitializeComponent();
// Theme
this.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
this.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
foreach (Control c in Controls)
{
mainForm.ThemeControl(c);
}
this.mainForm = mainForm;
this.txid = txid;
}
private async void TXForm_Load(object sender, EventArgs e)
{
tx = JObject.Parse(await mainForm.APIGet("wallet/"+mainForm.Account+"/tx/" + txid,true));
this.Text = "TX: " + tx["hash"].ToString();
labelHash.Text = "Hash: " + tx["hash"].ToString();
mainForm.AddLog("Viewing TX: " + tx["hash"].ToString());
// Disable scrolling on the panels until they are populated
panelInputs.Visible = false;
panelOutputs.Visible = false;
// For each input
JArray inputs = (JArray)tx["inputs"];
foreach (JObject input in inputs)
{
Panel PanelInput = new Panel();
PanelInput.Size = new Size(panelInputs.Width - SystemInformation.VerticalScrollBarWidth - 10, 50);
PanelInput.Location = new Point(5, panelInputs.Controls.Count * 50);
PanelInput.BorderStyle = BorderStyle.FixedSingle;
Label address = new Label();
string addressString = input["address"].ToString().Substring(0,5) + "..." + input["address"].ToString().Substring(input["address"].ToString().Length - 5, 5);
address.Text = "Address: " + addressString;
address.Location = new Point(5, 5);
address.AutoSize = true;
PanelInput.Controls.Add(address);
Label amount = new Label();
Decimal value = Decimal.Parse(input["value"].ToString())/1000000;
amount.Text = "Amount: " + value.ToString();
amount.Location = new Point(5, 25);
amount.AutoSize = true;
PanelInput.Controls.Add(amount);
if (input["path"].ToString() != "")
{
Label ownAddress = new Label();
ownAddress.Text = "Own Address";
ownAddress.Location = new Point(PanelInput.Width - 100, 5);
ownAddress.AutoSize = true;
PanelInput.Controls.Add(ownAddress);
}
panelInputs.Controls.Add(PanelInput);
}
panelInputs.Visible = true;
// For each output
JArray outputs = (JArray)tx["outputs"];
foreach (JObject output in outputs)
{
Panel PanelOutput = new Panel();
PanelOutput.Size = new Size(panelOutputs.Width - SystemInformation.VerticalScrollBarWidth - 10, 50);
PanelOutput.Location = new Point(5, panelOutputs.Controls.Count * 50);
PanelOutput.BorderStyle = BorderStyle.FixedSingle;
Label address = new Label();
string addressString = output["address"].ToString().Substring(0, 5) + "..." + output["address"].ToString().Substring(output["address"].ToString().Length - 5, 5);
address.Text = "Address: " + addressString;
address.Location = new Point(5, 5);
address.AutoSize = true;
PanelOutput.Controls.Add(address);
JObject covenant = (JObject)output["covenant"];
if (covenant.ContainsKey("action"))
{
if (covenant["action"].ToString() != "NONE")
{
JArray items = (JArray)covenant["items"];
Label covenantLabel = new Label();
string namehash = items[0].ToString();
string content = "{\"method\": \"getnamebyhash\", \"params\": [\"" +namehash +"\"]}";
JObject name = JObject.Parse(await mainForm.APIPost("",false,content));
covenantLabel.Text = covenant["action"].ToString() + ": " + name["result"].ToString();
covenantLabel.Location = new Point(5, 25);
covenantLabel.AutoSize = true;
PanelOutput.Controls.Add(covenantLabel);
}
}
Label amount = new Label();
Decimal value = Decimal.Parse(output["value"].ToString()) / 1000000;
amount.Text = "Amount: " + value.ToString();
amount.Location = new Point(PanelOutput.Width - 100, 25);
amount.AutoSize = true;
PanelOutput.Controls.Add(amount);
if (output["path"].ToString() != "")
{
Label ownAddress = new Label();
ownAddress.Text = "Own Address";
ownAddress.Location = new Point(PanelOutput.Width - 100, 5);
ownAddress.AutoSize = true;
PanelOutput.Controls.Add(ownAddress);
}
panelOutputs.Controls.Add(PanelOutput);
}
panelOutputs.Visible = true;
}
private void Explorer_Click(object sender, EventArgs e)
{
// Open the transaction in a browser
string url = mainForm.UserSettings["explorer-tx"] + tx["hash"].ToString();
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start(psi);
}
}
}

587
FireWallet/TXForm.resx Normal file
View File

@@ -0,0 +1,587 @@
<?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>
<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>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAAfScAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACPQM0Aj0DNEo9AzVePQM02j0DNAI9AzQAAAAAAAAAAAI8/zQCPQM0Aj0DNNI9A
zViPQM0Sj0DNAI8/zACPQM0Uj0DNXY9AzcOPQM37j0DN1o9AzTuPQM0Ajz/NAI4/zACPQM0Aj0DNOY9A
zdWPQM37j0DNxI9AzV6PQM0Vj0DNso9AzfqPQM3/j0DN/49Azf+PQM3Wj0DNO49AzQCPQM0Aj0DNOY9A
zdSPQM3/j0DN/49Azf+PQM36j0DNtY9AzdmPQM3/j0DN/49Azf+PQM3/j0DN/49AzdaPQM05j0DNN49A
zdWPQM3/j0DN/49Azf+PQM3/j0DN/49AzdyRQ8XYkUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8X/kkPFsZJD
xa+RQ8X/kUPF/5FDxf+RQ8X/kUPF/5FDxf+RQ8Xbmkuu2JpLrv+aS67/mkuv/ppLrv6aS67/mkuu/5pL
r76aS6+9mkuu/5pLrv+aS67+mkuv/ppLrv+aS67/mkuu26VSkNilUpD/pVKQ/6RSkOajUZWrpVKQ+aVS
kP+lUpC+pVKQvKVSkP+lUpD6o1GVq6RSkOWlUpD/pVKQ/6VSkNuwVG3YsFRt/7BUbf+wVG3drlRzKq5U
c4+wVG3/sFRtv7BUbb6wVG3/rlRzka5UcymwVG3csFRt/7BUbf+wVG3cuVNI2blTSP+5U0j/uVNI3rlT
Rxy0VWELuFNOlblTSLq5U0i5uFNOlrRVYAy5U0cbuVNI3blTSP+5U0j/uVNI3MFQHtnBUB7/wVAe/8FQ
Ht/AUB4ewFAkAL5RMxC/USxQv1EsUL5RMxDAUCUAwFAeHMFQHt3BUB7/wVAe/8FQHtzDTwnZw08J/8NP
Cf/DTwnfw08JHsNPCQDETgAAx0wAAcdNAAHFTQAAw08JAMNPCR3DTwnew08J/8NPCf/DTwncw08J2MNP
Cf/DTwn/w08Jw8NPCRXDTwkAAAAAAAAAAAAAAAAAAAAAAMNPCQDDTwkUw08JwcNPCf/DTwn/w08J28NP
CdbDTwnbw08JfMNPCSHDTggAw08JAAAAAAAAAAAAAAAAAAAAAADCTwkAwU4HAMNPCSDDTwl7w08J28NP
CdjDTwlVw08JI8NOCAHDTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTwgAwk4IAcNP
CSLDTwlWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AADH4wAAA8AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAABmAAAAfg
AAAP8AAAH/gAAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zACPP8wDjz/MAo8/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCPP80Cjz/NA48/zQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACPQM0Ajz/NBY9AzTePQM2Wj0DNYo4/zAOPP80AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAj0DNAI8/zQKPQM1gj0DNl49AzTmPP80Fjz/NAAAAAAAAAAAAjz/NAI8/zQWPQM04j0DNm49A
zeuPQM3/j0DN749AzWeOP8wDjz/NAAAAAAAAAAAAAAAAAAAAAACPP80Ajz/MAo9AzWSPQM3uj0DN/49A
zeuPQM2dj0DNOY8/zQWPQM0Aj0DNN49AzZyPQM3rj0DN/49Azf+PQM3/j0DN/49Aze+PQM1njz/MA48/
zQAAAAAAAAAAAI9AzQCOP8wCj0DNZI9Aze6PQM3/j0DN/49Azf+PQM3/j0DN7I9AzZ6PQM05j0DNuY9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3vj0DNZo4/zAOPQMwAjz/NAI8/zQKPQM1jj0DN7o9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2+j0DNwY9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN749AzWeOP84Djj7OAo9AzWWPQM3uj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3Gj0DMwY9AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzPCPQMtZj0DLVo9A
zO+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMz/j0DM/49AzP+PQMzFkkTDwJJEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JEw/+SRMOekkTDm5JEw/+SRMP/kkTD/5JEw/+SRMP/kkTD/5JE
w/+SRMP/kkTD/5JEw/+SRMPFmEqzwJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hK
s/+YSrOfmEqznJhKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrP/mEqz/5hKs/+YSrPFn0+gwJ9P
oP+fT6D/n0+g/59PoP+fT6D2n0+h7J9PoP+fT6D/n0+g/59PoP+fT6Cfn0+gm59PoP+fT6D/n0+g/59P
oP+fT6Hsn0+g9p9PoP+fT6D/n0+g/59PoP+fT6DGp1OKwadTiv+nU4r/p1OK/6dTiv+nU4rdpVKPYqZT
jNynU4r/p1OK/6dTiv+nU4qfp1OKnKdTiv+nU4r/p1OK/6ZTjN6lUo9jp1OK26dTiv+nU4r/p1OK/6dT
iv+nU4rGrlRzwa5Uc/+uVHP/rlRz/65Uc/+uVHPdrlRzHKxUe0StVHTfrlRz/65Uc/+uVHOgrlRzna5U
c/+uVHP/rlR04KxUe0auVHMarlRz265Uc/+uVHP/rlRz/65Uc/+uVHPGtVRawbVUWv+1VFr/tVRa/7VU
Wv+1VFrdtVRaHLZTVgCzVWJHtFRc37VUWv+1VFqhtVRanbVUWv+0VFzhs1RiSbdTVAC1VFoatVRa27VU
Wv+1VFr/tVRa/7VUWv+1VFrHu1JBwbtSQf+7UkH/u1JB/7tSQf+7UkHdu1JBHbtSQgDAUikAuVNKR7tT
Q+K7UkGgu1JBnbtTQ+S5U0lJw1AYALtSQgC7UkEau1JB27tSQf+7UkH/u1JB/7tSQf+7UkHHwFAlwcBQ
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
zf+PQM38j0DNl48/zA+PP80AAAAAAAAAAAAAAAAAAAAAAI9AzQCPQM0Oj0DNk49AzfuPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/Y9AzdWPQM1ej0DNp49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM38j0DNl48/zA+PQM0AAAAAAAAAAACPQM0Aj0DNDo9AzZOPQM37j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Aza6PQM2oj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNl48/zRCPP80Aj0DNAI8/zQ+PQM2Uj0DN+49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DNr49AzaePQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM38j0DNmo4/zQ+PP80Oj0DNlo9A
zfyPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM2ukEHKp5BB
yv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr9kEHJZ5BB
yWKQQcr8kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/5BByv+QQcr/kEHK/49B
yq6TRcGnk0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcGEk0XBf5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NFwf+TRcH/k0XB/5NF
wf+TRcH/k0XBrpdJtaeXSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtYKXSbZ9l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJtf+XSbX/l0m1/5dJ
tf+XSbX/l0m1/5dJtf+XSbWunE2op5xNqP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2ogZxNqHycTaj/nE2o/5xNqP+cTaj/nE2o/5xNqP+cTaf/nE2o/5xN
qP+cTaj/nE2o/5xNqP+cTaj/nE2o/5xNqK6iUZinolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGY6KFQ
mrmiUZj8olGY/6JRmP+iUZj/olGY/6JRmP+iUZiBolGYfKJRmP+iUZj/olGY/6JRmP+iUZj/olGY/KFQ
mrqiUZjnolGY/6JRmP+iUZj/olGY/6JRmP+iUZj/olGYrqhTh6eoU4f/qFOH/6hTh/+oU4f/qFOH/6hT
h/+oU4fcplOLL6dTip6oU4f9qFOH/6hTh/+oU4f/qFOH/6hTh4KnU4d9qFOH/6hTh/+oU4f/qFOH/6hT
h/6nU4qiplOLLqhTh9moU4f/qFOH/6hTh/+oU4f/qFOH/6hTh/+oU4evrVR2p61Udv+tVHb/rVR2/61U
dv+tVHb/rVR2/61UdtytVHYbqlSAEaxUeaGtVHb9rVR2/61Udv+tVHb/rVR2g61Udn6tVHb/rVR2/61U
dv+tVHb+rFR5pKpUfxOtVHYYrVR22q1Udv+tVHb/rVR2/61Udv+tVHb/rVR2/61Udq+yVGSoslVk/7JV
ZP+yVWT/slVk/7JVZP+yVWT/slVk3LJUZByxVWcAsFVtFLJVZ6KyVWT+slVk/7JVZP+yVGSEslRkf7JV
ZP+yVWT/slVk/rJVZqawVW0VsVRnALJUZBmyVGTZslVk/7JVZP+yVWT/slVk/7JVZP+yVWT/slRkr7dU
Uai3VFH/t1RR/7dUUf+3VFH/t1RR/7dUUf+3VFHct1NRHLdTUQC1VFoAtVRaFLdUVKO3VFH+t1RR/7dU
UYO3VFF+t1RR/7dUUf63VFSmtVRaFrVUWQC3U1EAt1NRGbdUUdm3VFH/t1RR/7dUUf+3VFH/t1RR/7dU
Uf+3VFGwvFI+qLxSPv+8Uj7/vFI+/7xSPv+8Uj7/vFI+/7xSPty7Uj4cu1I+AMNRHQC6U0cAulNIFLtS
QaG8Uj7/vFI+gbxSPny8Uj7/u1JBpbpTSBa6U0cAv1E0ALtSPgC7Uj4ZvFI+2bxSPv+8Uj7/vFI+/7xS
Pv+8Uj7/vFI+/7xSPrC/UCqov1Eq/79RKv+/USr/v1Eq/79RKv+/USr/v1Aq3b9QKRy/UCkAAAAAANJE
AAC+UTMAvlE0E79RLZ+/UCp6v1Eqdr9RLaK+UTQUvlEzAMNNFwAAAAAAv1ApAL9QKRm/UCrZv1Eq/79R
Kv+/USr/v1Eq/79RKv+/USr/v1AqsMJPEqjCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxLdwk8SHcJP
EgAAAAAAAAAAAAAAAADBTx4AwU8eE8FPHCfBUBwnwVAeFMFQHgD/AAAAAAAAAAAAAADCTxIAwk8SGsJP
EtrCTxL/wk8S/8JPEv/CTxL/wk8S/8JPEv/CTxKww08JqMNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cd7DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNP
CADDTwgaw08J2sNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCbDDTwmow08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J3sNPCR3DTwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08JAMNPCRvDTwnbw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08Jr8NPCafDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwndw08JHMNPCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDTwkAw08JGsNPCdrDTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwmuw08Jp8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J88NPCZrDTgkMw08JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCQDCTwkKw08JlsNPCfLDTwn/w08J/8NPCf/DTwn/w08J/8NP
Ca3DTwmmw08J/8NPCf/DTwn/w08J8sNPCavDTwlGw08JCcNPCQDCTgcAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08GAMNPCQDCTwgIw08JRMNPCanDTwnxw08J/8NP
Cf/DTwn/w08JrMNPCaTDTwn/w08J8cNPCazDTwlGw04ICcNPCADDTgkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFMCQDDTwkAwk8JCMNP
CUTDTwmqw08J8cNPCf/DTwmqw08JkcNPCarDTwlFw08ICcNPCQDCTAgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADCTwYAw08JAMNPCQjDTwlDw08JqcNPCZbDTwkXw08JCcNPCQC/SwUAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAw00FAMNPCQDDTgkIw04JGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////5/
/j/4P/wf4B/4B4AP8AAAB+AAAAPAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA
AgAAYAYAAHAOAAB4HgAAfD4AAH/+AAB//gAAf/4AAH/+AAD//wAD///AD///8D////z//////////ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz7LAI8+
ywCPPssAjz7LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjkDLAI4/ywCOP8sAjkDLAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5A
zACOP8wBjz/NJY9AzXmPQM1Ig0LIAI5AzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOP8wAkkfWAI9AzUOPQM17j0DNKI8/
zQKPP80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACPP8wAjj/LAY8/zCaPQM2Cj0DN3I9Azf+PQM3hj0DNToQ2wQCOP8wAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8/zQCORMsAj0DNSI9A
zd6PQM3/j0DN3o9AzYWPP80ojj7MAo8/zQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAjz/NAI8+zAGPQM0mj0DNgo9AzdyPQM3+j0DN/49Azf+PQM3/j0DN449AzU+QPcsAjz/NAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjz/NAI9J
zwCPQM1Jj0DN349Azf+PQM3/j0DN/49Azf6PQM3ej0DNhY8/zSiPPswCjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zACOPswCjz/NJ49AzYOPQM3dj0DN/o9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zeSPQM1QijbKAI4/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACOP8wAk0XXAI9AzUqPQM3gj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o9Azd+PQM2Gjz/NKY8/
zAKPP80AAAAAAAAAAACPP8wAjj7MAo9AzSqPQM2Fj0DN3o9Azf6PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3kjz/NT4w6xgCOP8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI8/zQCTS84Ajz/NSo9AzeCPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3+j0DN349AzYiPP80sjj/NA44/zQCPQM0Xj0DNhI9AzeGPQM3+j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCQLsMAjz/MAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAjj/NAJJB0ACPQM1Kj0DN4I9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf6PQM3jj0DNiY8/zRqPQM1nj0DN+o9Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeOPP81PhzjFAI4/
zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPQM0Ak0HLAI9AzUmPQM3gj0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/I8/zXOPQM11j0DN/Y9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3jj0DNT4c/wwCOP8wAAAAAAAAAAAAAAAAAAAAAAI8/zQCNSs4Aj0DNSo9AzeCPQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/48/
zX+PQM11j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN449AzVCNOM0Ajj/NAAAAAAAAAAAAjj/MAJdJ3gCPP81Kj0DN4I9A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/o8/zX6PQM10j0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49AzeSPQM1Si0HNAY5AzQCPP80AkDjLAI9A
zU2PQM3hj0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQM1zj0DN/Y9Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3mjz/NVY07
zwGRRsoAjz/NT49AzeOPQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/49A
zf+PQM3/j0DN/49Azf+PQM3/j0DN/49Azf+PQM3/j0DN/o8/zX2PQMtzj0DL/Y9Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL349AyymPQMslj0DL2o9Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49A
y/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/49Ay/+PQMv/j0DL/o9Ay32RQ8ZykUPG/ZFD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG+5FDxk2RQ8ZGkUPG+JFDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FD
xv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/5FDxv+RQ8b/kUPG/pFD
xn2URsBylEbA/ZRGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/JRGwFCURsBJlEbA+ZRGwP+URsD/lEbA/5RG
wP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RGwP+URsD/lEbA/5RG
wP+URsD/lEbA/pRGwH2XSbhyl0m4/ZdJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4+5dJuE6XSbhGl0m4+ZdJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJuP+XSbj/l0m4/5dJ
uP+XSbj/l0m4/5dJuP+XSbj/l0m4/pdJuH2aS69ymkyv/ZpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv+5pM
r02aTK9Fmkyv+JpMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/5pM
r/+aTK//mkyv/5pMr/+aTK//mkyv/5pMr/+aTK//mkyv/ppMr32dTqVynU6l/Z1Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l+51OpU2dTqVEnU6l+J1Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51O
pf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/51Opf+dTqX/nU6l/p1OpX2hUJtyoVCb/aFQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm+uhUJzHoVCb/aFQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/6FQm/+hUJv/oVCb+6FQm02hUJtFoVCb+KFQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQ
m/+hUJv/oVCb/qFQnMihUJvpoVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/6FQm/+hUJv/oVCb/qFQ
m32lUpBypVKQ/aVSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkNqkUpI3pFKRraVS
kP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ+6VSkE2lUpBFpVKQ+KVSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/6VSkP+lUpD/pFKRsqRSkzalUpDVpVKQ/6VSkP+lUpD/pVKQ/6VSkP+lUpD/pVKQ/6VS
kP+lUpD/pVKQ/qVSkH6oU4VzqFOF/ahThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF/6hT
hdupU4QaplOKGahThq+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4X/qFOF+6hThU6oU4VHqFOF+ahT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThf+oU4a0p1OKHalThBeoU4XXqFOF/6hThf+oU4X/qFOF/6hT
hf+oU4X/qFOF/6hThf+oU4X/qFOF/6hThX6sVHlzrFR5/axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xU
ef+sVHn/rFR5/6xUedqsVHkbq1R7AKpUfhusVHuwrFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5+6xU
eU+sVHlIrFR5+axUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUerWqVH4eq1R7AKxUeRisVHnWrFR5/6xU
ef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUef+sVHn/rFR5/6xUeX+wVW1zsFVt/bBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbdqwVW0bsFVtAK5VcQCuVHIcr1VvsrBVbf+wVW3/sFVt/7BV
bf+wVW3/sFVt+7BVbVCwVW1IsFVt+bBVbf+wVW3/sFVt/7BVbf+wVW3/r1Vutq5Uch+uVXEAsFVtALBV
bRewVW3WsFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbf+wVW3/sFVt/7BVbX+zVGF0s1Rh/bNU
Yf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYdqzVGEbs1RhALJUZACyVWUAslVmHbNU
YrOzVGD/s1Rh/7NUYf+zVGH/s1Rh+7NUYVCzVGFJs1Rh+bNUYf+zVGH/s1Rh/7NUYP+zVGK3slVmILJV
ZQCyVGYAs1RhALNUYRezVGHVs1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NUYf+zVGH/s1Rh/7NU
YX+3VFR0t1RU/bdUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dUVNq2VFQbtlRUAAAA
AAC5UE8AtVRZALVUWh62VFazt1RU/7dUVP+3VFT/t1RU+7dUVE+2VFRIt1RU+bdUVP+3VFT/t1RU/7ZU
Vri1VFohtVRZALZSVgAAAAAAtlNUALZTVBe2VFTVt1RU/7dUVP+3VFT/t1RU/7dUVP+3VFT/t1RU/7dU
VP+3VFT/t1RU/7ZUVIC6U0h0ulNI/bpTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pT
SNq6U0gbulNIAAAAAAAAAAAAuFNPALlTTAC4U00euVNJs7pTSP+6U0j/uVNI+7lTSE65U0hGuVNI+bpT
SP+6U0j/uVNJt7hTTSG4U00AvlQ5AAAAAAAAAAAAuVNIALlTSBe5U0jVulNI/7pTSP+6U0j/ulNI/7pT
SP+6U0j/ulNI/7pTSP+6U0j/ulNI/7pTSIC8Ujt0vFI7/bxSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xS
O/+8Ujv/vFI7/7xSO9q8UjsbvFI7AAAAAAAAAAAAAAAAALtRPwC7UkAAu1JBHbxSPbC8Ujv/vFI7+7xS
O0y8UjtEvFI7+LxSO/+8Ujy1u1JBILtSPwC7UkEAAAAAAAAAAAAAAAAAvFI7ALxSOxe8UjvVvFI7/7xS
O/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO/+8Ujv/vFI7/7xSO4C/US11v1Et/b9RLf+/US3/v1Et/79R
Lf+/US3/v1Et/79RLf+/US3/v1Et/79RLdu/US0bv1EtAAAAAAAAAAAAAAAAAAAAAADAUBwAvlEzAL5R
NBq+US+rv1Et+L9RLUm/US1Cv1Et9r5RL7C+UTMdvlEzAMBOKwAAAAAAAAAAAAAAAAAAAAAAvlEtAL5R
LRe/US3Vv1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLf+/US3/v1Et/79RLYDBUB51wVAe/cFQ
Hv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHtvBUB4cwVAeAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwU8kAMBQJQDAUCYYwFAhm8FQH0DBUB86wVAhncBQJhvAUCUAwFAlAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwVAeAMFPHhfBUB7WwVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQHv/BUB7/wVAe/8FQ
HoDCTw51wk8O/cNPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8JPDtzCTw4cwk8OAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMM9AADCTxcAwk8WD8JPFg7CTxYNwk8WEMJPFwDETwUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8OAMJPDhjCTw7Ww08O/8NPDv/DTw7/w08O/8NPDv/DTw7/w08O/8NP
Dv/DTw7/w08O/8JPDoDDTwh0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
CdzDTggdw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMJPCBjDTwnXw08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCIDDTwl0w08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw04IAMNOCBnDTwnXw08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwl0w08J/cNPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCd3DTwgdw08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw08IAMNP
CBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCX/DTwlzw08J/cNP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdzDTwgdw08IAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAw08IAMNPCBnDTwnYw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNP
CX7DTwlzw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCdXDTgkXw04JAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAwk8JAMJPCRTDTwnQw08J/8NPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NP
Cf/DTwn/w08J/sNPCX3DTwlyw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/8NPCf/DTwn9w08J1cNP
CWjDTggEw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwk8IAMFOCAPDTwljw08J08NPCfzDTwn/w08J/8NP
Cf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXvDTwlxw08J/cNPCf/DTwn/w08J/8NPCf/DTwn/w08J/cNP
CdPDTwl0w04JHsNPBwHDTwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJPCAC/TQcAw08JHMNP
CXHDTwnRw08J/MNPCf/DTwn/w08J/8NPCf/DTwn/w08J/sNPCXrDTwlww08J/cNPCf/DTwn/w08J/8NP
Cf3DTwnUw08JdMNOCR3DTQcAw04IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk4IAMFLBwDCTwkbw08JccNPCdHDTwn8w08J/8NPCf/DTwn/w08J/sNPCXjDTwluw08J/MNP
Cf/DTwn8w08J08NPCXXDTwkewU0EAMJOBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCTgkAv00KAMNOCBzDTwlyw08J0cNPCfzDTwn/w08J/sNP
CXbDTwltw08J+cNPCdDDTwlyw04JHcFPBgDCTggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJOCQDDTgkAw08JG8NP
CW/DTwnOw08J+cNPCXXDTwlGw08JaMJPCRrATAUAwk4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAwk8IAL5QBADDTwgZw08JaMNOCUrDTQgBw00IAMNNCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDTggAw04IAMNPCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
RU5ErkJggg==
</value>
</data>
</root>

174
FireWallet/TransferForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,174 @@
namespace FireWallet
{
partial class TransferForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TransferForm));
buttonTransfer = new Button();
buttonBatch = new Button();
buttonCancel = new Button();
label1 = new Label();
label2 = new Label();
textBoxAddress = new TextBox();
labelError = new Label();
labelSendingHIPAddress = new Label();
labelHIPArrow = new Label();
SuspendLayout();
//
// buttonTransfer
//
buttonTransfer.FlatStyle = FlatStyle.Flat;
buttonTransfer.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonTransfer.Location = new Point(451, 285);
buttonTransfer.Name = "buttonTransfer";
buttonTransfer.Size = new Size(139, 43);
buttonTransfer.TabIndex = 0;
buttonTransfer.Text = "Transfer";
buttonTransfer.UseVisualStyleBackColor = true;
buttonTransfer.Click += buttonTransfer_Click;
//
// buttonBatch
//
buttonBatch.FlatStyle = FlatStyle.Flat;
buttonBatch.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonBatch.Location = new Point(271, 285);
buttonBatch.Name = "buttonBatch";
buttonBatch.Size = new Size(139, 43);
buttonBatch.TabIndex = 1;
buttonBatch.Text = "Transfer in Batch";
buttonBatch.UseVisualStyleBackColor = true;
buttonBatch.Click += buttonBatch_Click;
//
// buttonCancel
//
buttonCancel.FlatStyle = FlatStyle.Flat;
buttonCancel.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonCancel.Location = new Point(12, 285);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(95, 43);
buttonCancel.TabIndex = 2;
buttonCancel.Text = "Cancel";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// label1
//
label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
label1.Location = new Point(12, 9);
label1.Name = "label1";
label1.Size = new Size(133, 21);
label1.TabIndex = 3;
label1.Text = "Transfer {domain}";
//
// label2
//
label2.AutoSize = true;
label2.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
label2.Location = new Point(12, 110);
label2.Name = "label2";
label2.Size = new Size(28, 21);
label2.TabIndex = 4;
label2.Text = "To:";
//
// textBoxAddress
//
textBoxAddress.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
textBoxAddress.Location = new Point(46, 107);
textBoxAddress.Name = "textBoxAddress";
textBoxAddress.Size = new Size(545, 29);
textBoxAddress.TabIndex = 5;
//
// labelError
//
labelError.AutoSize = true;
labelError.Location = new Point(492, 139);
labelError.Name = "labelError";
labelError.Size = new Size(98, 15);
labelError.TabIndex = 6;
labelError.Text = "Address not valid";
labelError.Visible = false;
//
// labelSendingHIPAddress
//
labelSendingHIPAddress.AutoSize = true;
labelSendingHIPAddress.Location = new Point(75, 150);
labelSendingHIPAddress.Name = "labelSendingHIPAddress";
labelSendingHIPAddress.Size = new Size(64, 15);
labelSendingHIPAddress.TabIndex = 19;
labelSendingHIPAddress.Text = "To Address";
labelSendingHIPAddress.Visible = false;
//
// labelHIPArrow
//
labelHIPArrow.AutoSize = true;
labelHIPArrow.Font = new Font("Segoe UI", 18F, FontStyle.Bold, GraphicsUnit.Point);
labelHIPArrow.Location = new Point(46, 139);
labelHIPArrow.Name = "labelHIPArrow";
labelHIPArrow.Size = new Size(32, 32);
labelHIPArrow.TabIndex = 20;
labelHIPArrow.Text = "⮡ ";
labelHIPArrow.Visible = false;
//
// TransferForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(602, 340);
Controls.Add(labelSendingHIPAddress);
Controls.Add(labelHIPArrow);
Controls.Add(labelError);
Controls.Add(textBoxAddress);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(buttonCancel);
Controls.Add(buttonBatch);
Controls.Add(buttonTransfer);
Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
FormBorderStyle = FormBorderStyle.Fixed3D;
Icon = (Icon)resources.GetObject("$this.Icon");
MaximizeBox = false;
Name = "TransferForm";
Text = "Transfer | FireWallet";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonTransfer;
private Button buttonBatch;
private Button buttonCancel;
private Label label1;
private Label label2;
private TextBox textBoxAddress;
private Label labelError;
private Label labelSendingHIPAddress;
private Label labelHIPArrow;
}
}

130
FireWallet/TransferForm.cs Normal file
View File

@@ -0,0 +1,130 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DnsClient.Protocol;
using DnsClient;
using Newtonsoft.Json.Linq;
namespace FireWallet
{
public partial class TransferForm : Form
{
MainForm MainForm;
string Domain;
public TransferForm(MainForm main, string domain)
{
InitializeComponent();
MainForm = main;
Domain = domain;
this.Text = "Transfer " + Domain + " | FireWallet";
label1.Text = "Transfer " + Domain;
if (MainForm.Theme.ContainsKey("error"))
{
labelError.ForeColor = ColorTranslator.FromHtml(MainForm.Theme["error"]);
}
if (MainForm.WatchOnly)
{
buttonTransfer.Enabled = false; // watch only wallet only batch
}
// Theme
this.BackColor = ColorTranslator.FromHtml(MainForm.Theme["background"]);
this.ForeColor = ColorTranslator.FromHtml(MainForm.Theme["foreground"]);
foreach (Control c in Controls)
{
MainForm.ThemeControl(c);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
this.Close();
}
string address = "";
private async void buttonTransfer_Click(object sender, EventArgs e)
{
await updateAddress();
if (!await MainForm.ValidAddress(address))
{
labelError.Show();
return;
}
string content = "{\"method\": \"sendtransfer\",\"params\": [ \"" + Domain + "\", \"" +
address + "\"]}";
string output = await MainForm.APIPost("", true, content);
JObject APIresp = JObject.Parse(output);
if (APIresp["error"].ToString() != "")
{
MainForm.AddLog("Failed:");
MainForm.AddLog(APIresp.ToString());
NotifyForm notify = new NotifyForm("Error Transaction Failed");
notify.ShowDialog();
return;
}
JObject result = JObject.Parse(APIresp["result"].ToString());
string hash = result["hash"].ToString();
string link = MainForm.UserSettings["explorer-tx"] + hash;
NotifyForm notifySuccess = new NotifyForm("Transaction Sent\nThis transaction could take up to 20 minutes to mine",
"Explorer", link);
notifySuccess.ShowDialog();
notifySuccess.Dispose();
this.Close();
}
private async void buttonBatch_Click(object sender, EventArgs e)
{
await updateAddress();
if (!await MainForm.ValidAddress(address))
{
labelError.Show();
return;
}
MainForm.AddBatch(Domain, "TRANSFER", address);
this.Close();
}
private async Task updateAddress()
{
labelError.Hide();
if (textBoxAddress.Text.Length < 1)
{
address = "";
return;
}
if (textBoxAddress.Text.Substring(0, 1) == "@")
{
string domain = textBoxAddress.Text.Substring(1);
string address = await MainForm.HIP02Lookup(domain);
if (address == "ERROR")
{
labelError.Show();
labelError.Text = "HIP-02 lookup failed";
} else
{
labelSendingHIPAddress.Text = address;
this.address = address;
labelSendingHIPAddress.Show();
labelHIPArrow.Show();
}
} else
{
address = textBoxAddress.Text;
}
}
}
}

View File

@@ -0,0 +1,828 @@
<?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>
<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>
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
Ng+/rHaXDlcTERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER
ERERERERERERERERERERERERERERERERERERERERERERERERERERkbz1/wNrGKFswMgwBwAAAABJRU5E
rkJggg==
</value>
</data>
</root>

BIN
FireWallet/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -0,0 +1,797 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:FireWalletSetup"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_04F4559CA8D64ECF91FCC8C907FEA44E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_24448DEFADA9423B92D588F3CCFCE0BE"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_57B16B55588E41459D70F9475B14B4BB"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:Debug\\FireWalletSetup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
}
}
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Release\\FireWalletSetup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
}
}
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_EFBFB4D93D6D4A0FBAC69F265F0E04DB"
{
"Name" = "8:.NET Core"
"Message" = "8:[VSDNETCOREMSG]"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
"IsNETCore" = "11:TRUE"
"Architecture" = "2:0"
"Runtime" = "2:0"
}
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_04F4559CA8D64ECF91FCC8C907FEA44E"
{
"SourcePath" = "8:..\\..\\..\\..\\Downloads\\FW.ico"
"TargetName" = "8:FW.ico"
"Tag" = "8:"
"Folder" = "8:_5E5E37B331014B2BBEB73878A5BF354B"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_57B16B55588E41459D70F9475B14B4BB"
{
"SourcePath" = "8:..\\..\\..\\..\\Downloads\\FWBanner.bmp"
"TargetName" = "8:FWBanner.bmp"
"Tag" = "8:"
"Folder" = "8:_5E5E37B331014B2BBEB73878A5BF354B"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_5E5E37B331014B2BBEB73878A5BF354B"
{
"DefaultLocation" = "8:[ProgramFilesFolder]\\FireWallet"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_BCC2277C7F2A49D9859AB85BE80771EC"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_C825708961074F0AB407ADD664E1DFA7"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1033"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:FireWallet"
"ProductCode" = "8:{E904E664-B1F3-4DEB-9FB0-91BCBEE3B5A6}"
"PackageCode" = "8:{0B16637D-C5AC-41D4-9D13-D57F3A0AEF25}"
"UpgradeCode" = "8:{0C86F725-6B01-4173-AA05-3F0EDF481362}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:4.0"
"Manufacturer" = "8:Nathan.Woodburn/"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:https://l.woodburn.au/discord"
"Title" = "8:FireWallet"
"Subject" = "8:"
"ARPCONTACT" = "8:Nathan.Woodburn/"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:The Handshake wallet that is just Fire"
"ARPURLINFOABOUT" = "8:https://github.com/Nathanwoodburn/FireWallet"
"ARPPRODUCTICON" = "8:_04F4559CA8D64ECF91FCC8C907FEA44E"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:0"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5CDEC48EDB6148E1938060F809CCE1AA"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_01E845438BDD488C9229BED4A07565D8"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E241C5D914C447D98BB058FEDA6FB2E0"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9056723452D74EEDA92F2BFD694C9C09"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_77F1CD9C54DE4F0294C9C2C3DAD59446"
{
"Name" = "8:FireWallet"
"Arguments" = "8:"
"Description" = "8:The Handshake wallet that is just Fire"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_24448DEFADA9423B92D588F3CCFCE0BE"
"Folder" = "8:_C825708961074F0AB407ADD664E1DFA7"
"WorkingFolder" = "8:_5E5E37B331014B2BBEB73878A5BF354B"
"Icon" = "8:_04F4559CA8D64ECF91FCC8C907FEA44E"
"Feature" = "8:"
}
}
"UserInterface"
{
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_324353D76F3C40A7AC383ECFFB7AD313"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9E8FABACA40B4AF19AC7837F6199E349"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_32996AB03B5A4723B065CE209D7CB353"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5F8B496BAA7C4A4A83CC46CE05F0536A"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A09B666A12A14C99B65048178A482B56"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B3830A4823DE445B8A66D38BC4EA17AD"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F1DC457477AE4898BBA3BE9EADB3A338"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:2"
"Value" = "8:WARNING: This computer program is experimental and is not guaranteed to be free of bugs. Please report any bugs to the Nathan or open an issue on the GitHub repository."
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_815C979C89AA4703BA731134B3DF354D"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D48757B8F9644017B6E349A2ADFC4926"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8F9198D340754DEE9FFB73D19BBC990E"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1B933693E12C4BD5B3C54B519C9B1F44"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B6C7BA0AF8C2424AABEAFBFD45FF0FE5"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_52696058E87E4D62B45AABE61847F970"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_DAC87040C23F42E5A149D5258B972E5E"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E63D340D36A543A8BBF49B7BC9395B62"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0315D52EA80A47BC987BE0887D3DBDEA"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:2"
"Value" = "8:WARNING: This computer program is experimental and is not guaranteed to be free of bugs. Please report any bugs to the Nathan or open an issue on the GitHub repository."
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7674CF69E98F4233B169B0E10CB27009"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:0"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E94A31E39D684EC09F27D5431F16531B"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:2"
"Value" = "8:_57B16B55588E41459D70F9475B14B4BB"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_24448DEFADA9423B92D588F3CCFCE0BE"
{
"SourcePath" = "8:..\\FireWallet\\obj\\Debug\\net6.0-windows\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_5E5E37B331014B2BBEB73878A5BF354B"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItems"
"OutputProjectGuid" = "8:{14F28C5A-34CC-4FE0-8C8B-35C9A60704BC}"
"ShowKeyOutput" = "11:TRUE"
"ExcludeFilters"
{
}
}
}
}
}

View File

@@ -2,19 +2,42 @@
Experimental wallet for Handshake chain Experimental wallet for Handshake chain
## Installation ## Installation
### Dependencies
You will need .net desktop installed. You can download it from [here](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.18-windows-x64-installer).
You will also need Node, NPM, and git installed if you want to use the internal HSD or Ledger wallets.
[Git](https://git-scm.com/downloads)
[Node](https://nodejs.org/en/download/)
[NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
### From Releases ### From Releases
You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/). You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/).
Here are some videos showing how to install and use FireWallet:
Install with a running Bob wallet: https://cloud.woodburn.au/s/pS8e2oQDidrMJWx
Install with internal HSD: https://cloud.woodburn.au/s/trwd8TyxbDfqaxF (You NEED to have Node, NPM, and git installed to use internal HSD)
### Build from source ### Build from source
You can build from source by cloning this repo. You can build from source by cloning this repo.
You will need Visual Studio (recommend a recent version) and .net desktop development tools installed. You will need Visual Studio (recommend a recent version) and .net desktop development tools installed.
## Setup ## Setup
### Create a new wallet ### Create a new wallet
Not yet implemented You can create or import a wallet by clicking on the `New` button from the login screen.
You will need to enter a password to encrypt your wallet.
This password will be used to encrypt your wallet and to login to your wallet.
**At the moment exporting your Seed Phase does not work**
![Alt text](assets/account_new.png)
## First time setup ## First time setup
When you first open the wallet you will be prompted to set your node settings. When you first open the wallet you will be prompted to set your node settings.
You can either connect to an existing HSD (or Bob) node or you can run your own node.
If you want to run your own node you should select the `Run HSD` option.
This will take a few minutes to download and install HSD.
You can get the API key from the HSD launch command or You can get the API key from the HSD launch command or
in Bob wallet under settings > Wallet > API key. in Bob wallet under settings > Wallet > API key.
If you change this key in HSD or Bob you will need to update it in FireWallet. If you change this key in HSD or Bob you will need to update it in FireWallet.
@@ -45,6 +68,9 @@ You can change the number of transactions shown in the `portfolio-tx:` settings.
<br><br> <br><br>
## Sending HNS ## Sending HNS
![Send](assets/send_hns.png) ![Send](assets/send_hns.png)
This page lets you send HNS to Handshake addresses or domains using [HIP-02](https://github.com/handshake-org/HIPs/blob/master/HIP-0002.md).
To use HIP-02 you need to have HSD resolver (or any HNS compatible DNS resolver) listening on port 5350 (default HSD port).
To enter a domain to use HIP-02 you need to prefix the domain with `@` (eg. `@nathan.woodburn`).
## Receiving HNS or Domains ## Receiving HNS or Domains
The receive page shows your current HNS address. The receive page shows your current HNS address.
@@ -87,12 +113,71 @@ You can add transactions to the batch from the domain window or the DNS editor.
You can also import a list of domains to the batch window. You can also import a list of domains to the batch window.
The "CANCEL" transaction type is used to cancel an transfer. The "CANCEL" transaction type is used to cancel an transfer.
At the momemt "UPDATE" or coin only transactions are not supported. Please not that the import syntax for BIDs is BID,LOCKUP where LOCKUP is (BID+BLIND)
![Batch Import](assets/batch_import.png) ![Batch Import](assets/batch_import.png)
## Exporting ## Exporting
You can export the batch to a file. You can export the batch to a file.
This file will store the transaction type, name, and any data needed to send the transaction. This file will store the transaction type, name, and any data needed to send the transaction.
You can then import this file to send the transactions. You can then import this file to send the transactions.
An example of this file can be found [here](example-configs/batch.txt). An example of this file can be found [here](example-configs/batch.txt).
# Ledger
You can use a Ledger device to sign transactions.
You need to have Node, NPM, and git installed to use Ledger.
The Ledger components are not included in the app.
These will install when you first send HNS (not domains) from a Ledger.
# Settings
FireWallet uses a few different settings files.
They are stored in `%appdata%\FireWallet\` (`C:\Users\{username}\AppData\Roaming\FireWallet\`)
## settings.txt
This file stores the user settings for the application.
If you want to change the default HIP-02 resolver you can add these settings
```yaml
hip-02-ip: 127.0.0.1
hip-02-port: 5350
```
## node.txt
This file stores the node (HSD/Bob connection) settings.
The Network is the network you want to connect to (default is `0` for Mainnet).
If you delete this file, FireWallet will show the node setup screen on next startup.
You can set a custom HSD launch command by setting the `hsd-command` key.
The default launch is the same as this
```yaml
HSD-command: {default-dir} --agent=FireWallet --index-tx --index-address --api-key {key} --prefix {Bob}
```
The `{default-dir}` will be replaced with the HSD directory `%appdata%\FireWallet\hsd\`.
The `{key}` will be replaced with the API key from the node.txt file.
The `{Bob}` will be replaced with the Bob wallet HSD data directory `%appdata%\Bob\hsd_data\` this is used to sync FireWallet with Bob's accounts and also stops you needing to sync the chain twice.
Other settings are here. These are the default and if they are not in the file they revert to these values.
```yaml
HideScreen: True # Hide the HSD terminal screen (Set to False for higher reliability)
Timeout: 10 # The time in seconds to wait for any API request
```
## theme.txt
This file stores the theme settings.
The theme is the color scheme of the application.
The `transparent-mode` key is used to enable or disable transparent modes.
There are 4 modes: `off` is disabled, `mica` is windows app style, `key` is to make 1 colour transparent, and `percent` is to set the opacity of the window.
## log.txt
This file stores the logs for the application.
You should check this file if you have any issues with the application.
# Support
If you have any issues with the application you can open an issue on GitHub or contact me on Discord (NathanWoodburn on most Handshake servers).
If you would like to support this project you can find out how at https://nathan.woodburn.au/#donate or you can help by contributing to the project on GitHub.
Also you can send HNS directly to `@firewallet`

BIN
assets/account_new.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

19
debugging.md Normal file
View File

@@ -0,0 +1,19 @@
# Debugging Info
## App startup errors
## Node (HSD) errors
If you have selected to run the internal node you can check these steps to see if you can fix the issue.
1. Check the HSD directory in `%appdata%\FireWallet\` (`C:\Users\{username}\AppData\Roaming\FireWallet\HSD`)
2. Try running `npm install` in the HSD directory (could have failed in the install process)
3. Look in the HSD logs for errors in `C:\Users\{username}\.hsd\debug.log`
## Ledger errors
If you are having issues with Ledger you can check these steps to see if you can fix the issue.
1. Check the Ledger directory in `%appdata%\FireWallet\` (`C:\Users\{username}\AppData\Roaming\FireWallet\hsd-ledger`)
2. Try running `npm install` in the Ledger directory (could have failed in the install process)
3. Try running `node bin\hsd-ledger createaddress --api-key {api-key} -w {cold wallet name}` in the Ledger directory. This will get you to verify your address on the ledger device. If this fails you have some bigger issue.

View File

@@ -6,4 +6,4 @@ woodburn4,BID,1,3
woodburn5,BID,1,3 woodburn5,BID,1,3
woodburn6,BID,1,4 woodburn6,BID,1,4
woodburn8,TRANSFER,hs1qlmlgnx0g3ynk4ylxkkdh9c9nernclnfq4lw6s9 woodburn8,TRANSFER,hs1qlmlgnx0g3ynk4ylxkkdh9c9nernclnfq4lw6s9
exampledomainnathan118,UPDATE,[{"type": "DS","keyTag": 20167,"algorithm": 13,"digestType": 2,"digest":"4a2ab3224727a4754a6c3d77621a5b04241a3d9c7ae7e5fa17f73121b9ff0e06"}, {"type": "NS","ns": "ns1.woodburn."}, {"type": "NS","ns": "ns2.woodburn."}, {"type": "TXT","txt": ["TEST"]}] exampledomainnathan90,UPDATE,[{"type": "NS","ns": "ns1.woodburn."};{"type": "NS","ns": "ns2.woodburn."};{"type": "DS","keyTag": 30273,"algorithm": 13,"digestType": 2,"digest":"9a3a8fb3d625d2a2073d740f10da6056ebed0e97f550aa7f3891ed450c7e60c9"};{"type": "GLUE4","ns": "ns1.exampledomainnathan90.","address": "1.2.3.4"};{"type": "TXT","txt": ["Test TXT record"]}]

View File

@@ -1,3 +1,5 @@
IP: 127.0.0.1 IP: 127.0.0.1
Network: 0 Network: 0
Key: my-super-secret-api-key Key: my-super-secret-api-key
HSD: False
HSD-command: {default-dir} --agent=FireWallet --index-tx --index-address --api-key {key} --prefix {Bob}

468
hsd-ledger Normal file
View File

@@ -0,0 +1,468 @@
#!/usr/bin/env node
'use strict';
/**
* Module imports
*/
const Config = require('bcfg');
const { NodeClient, WalletClient } = require('hs-client');
const { hd, MTX, Network } = require('hsd');
const { Rules } = require('hsd/lib/covenants');
const { hashName, types } = Rules;
const { util, HID, LedgerHSD, LedgerChange, LedgerCovenant } = require('..');
const { Device } = HID;
/**
* Global constants
*/
const VALID_CMDS = [
'createwallet',
'createaccount',
'createaddress',
'sendtoaddress',
'getwallets',
'getaccounts',
'getaccount',
'getbalance',
'sendraw'
];
const VERSION = require('../package').version;
async function createWallet(client, config, ledger, args) {
if (args.length !== 1)
throw new Error('Invalid arguments');
const id = args[0];
const index = config.uint('account-index');
const xpub = await ledger.getAccountXPUB(index);
const wallet = await client.createWallet(id, {
watchOnly: true,
accountKey: xpub.xpubkey(config.str('network'))
});
console.log(`Created wallet (id=hsd-ledger, wid=${wallet.wid}).`);
console.log(`Created account (name=default, account-index=${index}').`);
}
async function createAccount(client, config, ledger, args) {
if (args.length !== 2)
throw new Error('Invalid arguments');
const id = config.str('wallet-id');
const name = args[0];
const index = parseInt(args[1], 10);
const xpub = await ledger.getAccountXPUB(index);
await client.createAccount(id, name, {
watchOnly: true,
accountKey: xpub.xpubkey(config.str('network'))
});
console.log(`Created account (name=${name}, account-index=${index}').`);
}
async function createAddress(client, config, ledger, args) {
if (args.length !== 0)
throw new Error('Invalid arguments');
const id = config.str('wallet-id');
const name = config.str('account-name');
const addr = await client.createAddress(id, name);
const acct = await client.getAccount(id, name);
const xpub = hd.PublicKey.fromBase58(acct.accountKey, config.str('network'));
const account = (xpub.childIndex ^ hd.common.HARDENED) >>> 0;
console.log(`Verify address on Ledger device: ${addr.address}`);
await ledger.getAddress(account, addr.branch, addr.index, { confirm: true });
}
async function sendToAddress(wclient, nclient, config, ledger, args) {
if (args.length !== 2)
throw new Error('Invalid arguments');
const network = Network.get(config.str('network'));
const id = config.str('wallet-id');
const acct = config.str('account-name');
const address = args[0];
const amount = parseFloat(args[1]);
await wclient.execute('selectwallet', [id]);
const params = [address, amount, '', '', false, acct];
const json = await wclient.execute('createsendtoaddress', params);
const mtx = MTX.fromJSON(json);
let i, key;
for (i = mtx.outputs.length - 1; i >= 0; i--) {
const output = mtx.outputs[i];
const addr = output.address.toString(network.type);
key = await wclient.getKey(id, addr);
if (key && key.branch)
break;
}
if (!key || !key.branch)
throw new Error('Expected change address.');
const { account, branch, index } = key;
const coinType = network.keyPrefix.coinType;
const options = {
change: new LedgerChange({
path: `m/44'/${coinType}'/${account}'/${branch}/${index}`,
index: i,
version: 0
})
};
util.displayDetails(console, network, mtx, options);
const signed = await ledger.signTransaction(mtx, options);
const rawtx = signed.encode().toString('hex');
const txid = await nclient.execute('sendrawtransaction', [rawtx]);
console.log(`Submitted TXID: ${txid}`);
}
async function sendRaw(wclient, nclient, config, ledger, args) { // Create a function to sign raw transactions
if (args.length !== 2) // Make sure there are two arguments (batch, names)
throw new Error('Invalid arguments'); // Throw an error if there are not two arguments
const network = Network.get(config.str('network')); // Get the network
const id = config.str('wallet-id'); // Get the wallet id
const acct = config.str('account-name'); // Get the account name
// Log the arguments to the console (for debugging)
const batch = JSON.parse(args[0]); // Get the batch
const names = JSON.parse(args[1]); // Get the names
await wclient.execute('selectwallet', [id]); // Select the wallet
try {
const mtx = MTX.fromJSON(batch.result); // Create a new MTX from the JSON
const hashes = {}; // Create an empty object to store the hashes
for (const name of names) { // Loop through the names
const hash = hashName(name); // Hash the name
hashes[hash] = name; // Add the hash to the hashes object to use later
}
let i, key; // Create variables to use later
const options = []; // Create an empty array to store the options
for (i = mtx.outputs.length - 1; i >= 0; i--) { // Loop through the outputs
const output = mtx.outputs[i]; // Get the output
const addr = output.address.toString(network.type); // Get the address
key = await wclient.getKey(id, addr); // Get the key
if (!key) // If there is no key
continue; // Continue to the next output
if (key.branch === 1) { // If the key is a change address
if (options.change) // If there is already a change address
throw new Error('Transaction should only have one change output.'); // Throw an error
const path = `m/44'/${network.keyPrefix.coinType}'/${key.account}'/${key.branch}/${key.index}`; // Create the derivation path
options.change = new LedgerChange({ path: `m/44'/${network.keyPrefix.coinType}'/${key.account}'/${key.branch}/${key.index}`, index: i, version: 0 }); // Add the change address to the options
}
const { account, branch, index } = key; // Get the account, branch, and index from the key
const coinType = network.keyPrefix.coinType; // Get the coin type from the network
switch (output.covenant.type) {
case types.NONE:
case types.OPEN:
case types.BID:
case types.FINALIZE:
break;
case types.REVEAL:
case types.REDEEM:
case types.REGISTER:
case types.UPDATE:
case types.RENEW:
case types.TRANSFER:
case types.REVOKE: { // If the covenant type is any of REVEAL, REDEEM, REGISTER, UPDATE, RENEW, TRANSFER, or REVOKE
if (options.covenants == null) // If there are no covenants
options.covenants = []; // Create an empty array for the covenants
const hash = output.covenant.items[0]; // Get the hash from the covenant
const name = hashes[hash]; // Get the name from the hashes object (is needed for SPV nodes)
if (name == undefined) { // If the name is not found
console.log("Name not found in file"); // Log that the name was not found
console.log(hash); // Log the hash (for debugging)
}
options.covenants.push(new LedgerCovenant({ index: i, name })); // Add the covenant to the options
break;
}
default:
throw new Error('Unrecognized covenant type.');
}
} // end for loop
util.displayDetails(console, network, mtx, options); // Display the details to the log for user verification
const signed = await ledger.signTransaction(mtx, options); // Sign the transaction with the ledger
const rawtx = signed.encode().toString('hex'); // Encode the transaction as hex
const txid = await nclient.execute('sendrawtransaction', [rawtx]); // Send the transaction to the network
console.log(`Submitted TXID: ${txid}`); // Log the TXID to the console to view the transaction on a block explorer
} catch (err) { // Catch any errors
console.error(err); // Log the error to the console
}
}
async function getWallets(client, args) {
if (args.length)
throw new Error('Too many arguments');
const wallets = await client.getWallets();
console.log(wallets);
}
async function getAccounts(client, config, args) {
if (args.length)
throw new Error('Too many arguments');
const id = config.str('wallet-id');
const accounts = await client.getAccounts(id);
console.log(accounts);
}
async function getAccount(client, config, args) {
if (args.length !== 1)
throw new Error('Invalid arguments');
const id = config.str('wallet-id');
const name = args[0];
const account = await client.getAccount(id, name);
console.log(account);
}
async function getBalance(client, config, args) {
if (args.length !== 0)
throw new Error('Invalid arguments');
const id = config.str('wallet-id');
const name = config.str('account-name');
const balance = await client.getBalance(id, name);
console.log(balance);
}
async function main() {
const device = await Device.requestDevice();
device.set({
timeout: 300000 // 5 minutes.
});
await device.open();
const config = new Config('hsd', {
suffix: 'network',
fallback: 'main',
alias: {
'h': 'help',
'i': 'accountindex',
'a': 'accountname',
'n': 'network',
'p': 'projectsponsor',
'q': 'qrcode',
'k': 'showkey',
'w': 'walletid'
}
});
config.load({
argv: true,
env: true
});
config.inject({
accountIndex: 0,
accountName: 'default',
network: 'main',
walletId: 'hsd-ledger',
token: ''
});
const argv = config.argv;
const cmd = argv.shift();
const args = argv;
const type = config.str('network');
const network = Network.get(type);
const id = config.str('wallet-id');
const token = config.str('token');
if (config.str('help') && argv.length === 0) {
usage();
process.exit(0);
}
if (config.str('version') && argv.length === 0) {
version();
process.exit(0);
}
const ledger = new LedgerHSD({
device: device,
network: type
});
const nclient = new NodeClient({
url: config.str('url') || config.str('node-url'),
apiKey: config.str('api-key') || config.str('node-api-key'),
ssl: config.bool('ssl') || config.str('node-ssl'),
host: config.str('http-host') || config.str('node-http-host'),
port: config.uint('node-http-port') || network.rpcPort
});
const wclient = new WalletClient({
url: config.str('url') || config.str('wallet-url'),
apiKey: config.str('api-key') || config.str('wallet-api-key'),
ssl: config.bool('ssl') || config.bool('wallet-ssl'),
host: config.str('http-host') || config.str('wallet-http-host'),
port: config.uint('wallet-http-port') || network.walletPort,
token
});
await nclient.open();
await wclient.open();
try {
const wallets = await wclient.getWallets();
if (!wallets.includes(id)) {
if (id !== 'hsd-ledger')
throw new Error(`Wallet "${id}" does not exist.`);
console.log('Default hsd-ledger wallet not detected.');
await createWallet(wclient, config, ledger, [id]);
}
switch (cmd) {
case VALID_CMDS[0]:
await createWallet(wclient, config, ledger, args);
break;
case VALID_CMDS[1]:
await createAccount(wclient, config, ledger, args);
break;
case VALID_CMDS[2]:
await createAddress(wclient, config, ledger, args);
break;
case VALID_CMDS[3]:
await sendToAddress(wclient, nclient, config, ledger, args);
break;
case VALID_CMDS[4]:
await getWallets(wclient, args);
break;
case VALID_CMDS[5]:
await getAccounts(wclient, config, args);
break;
case VALID_CMDS[6]:
await getAccount(wclient, config, args);
break;
case VALID_CMDS[7]:
await getBalance(wclient, config, args);
break;
case VALID_CMDS[8]:
await sendRaw(wclient, nclient, config, ledger, args);
break;
default:
usage(new Error('Must provide valid command.'));
process.exit(1);
break;
}
} catch (e) {
throw (e);
} finally {
await wclient.close();
await nclient.close();
await device.close();
}
process.exit(0);
}
/**
* Displays application version.
*/
function version() {
console.log(`hsd-ledger v${VERSION}`);
console.log('');
}
/**
* Displays usage or error message.
* @param {String|Error} err - the error message or object
*/
function usage(err) {
if (err) {
console.error(`${err.stack}`);
console.error('');
return;
}
console.log('usage:');
console.log(' $ hsd-ledger createwallet <wallet-id>');
console.log(' $ hsd-ledger createaccount <account-name> <account-index>');
console.log(' $ hsd-ledger createaddress');
console.log(' $ hsd-ledger sendtoaddress <address> <amount>');
console.log(' $ hsd-ledger sendraw <batch> <names>');
console.log(' $ hsd-ledger getwallets');
console.log(' $ hsd-ledger getaccounts');
console.log(' $ hsd-ledger getaccount <account-name>');
console.log(' $ hsd-ledger getbalance');
console.log('');
console.log('options:');
console.log(' --help');
console.log(' --version');
console.log(' -n, --network <id> (default "main")');
console.log(' -w, --wallet-id <id> (default "hsd-ledger")');
console.log(' -a, --account-name <name> (default "default")');
console.log(' -i, --account-index <index> (default 0)');
console.log('');
console.log('The following options configure the node and wallet clients:');
console.log(' --ssl');
console.log(' --url <url>');
console.log(' --api-key <api-key>');
console.log(' --host <host> (default "localhost")');
console.log('');
console.log('The following options configure the node client only:');
console.log(' --node-ssl');
console.log(' --node-url <url>');
console.log(' --node-api-key <api-key>');
console.log(' --node-host <host> (default "localhost")');
console.log(' --node-port <port> (default 14037)');
console.log('');
console.log('The following options configure the wallet client only:');
console.log(' --wallet-ssl');
console.log(' --wallet-url <url>');
console.log(' --wallet-api-key <api-key>');
console.log(' --wallet-host <host> (default "localhost")');
console.log(' --wallet-port <port> (default 14039)');
console.log('');
}
/*
* Execute
*/
main().catch((err) => {
usage(err);
process.exit(1);
});