diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config
new file mode 100644
index 00000000..18e7f2ee
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config
new file mode 100644
index 00000000..60bc4b39
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config
new file mode 100644
index 00000000..60bc4b39
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs
new file mode 100644
index 00000000..1eba1298
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs
@@ -0,0 +1,243 @@
+namespace WebsitePanel.Installer
+{
+ partial class ApplicationForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ApplicationForm));
+ this.statusBar = new System.Windows.Forms.StatusStrip();
+ this.statusBarLabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.splitContainer = new System.Windows.Forms.SplitContainer();
+ this.scopeTree = new System.Windows.Forms.TreeView();
+ this.smallImages = new System.Windows.Forms.ImageList(this.components);
+ this.pnlRight = new System.Windows.Forms.Panel();
+ this.pnlResultView = new System.Windows.Forms.Panel();
+ this.pnlDescription = new System.Windows.Forms.Panel();
+ this.lblResultViewPath = new System.Windows.Forms.Label();
+ this.lblResultViewTitle = new System.Windows.Forms.Label();
+ this.pictureBox = new System.Windows.Forms.PictureBox();
+ this.backgroundWorker = new System.ComponentModel.BackgroundWorker();
+ this.lineBox2 = new WebsitePanel.Installer.LineBox();
+ this.topLogoControl = new WebsitePanel.Installer.TopLogoControl();
+ this.statusBar.SuspendLayout();
+ this.splitContainer.Panel1.SuspendLayout();
+ this.splitContainer.Panel2.SuspendLayout();
+ this.splitContainer.SuspendLayout();
+ this.pnlRight.SuspendLayout();
+ this.pnlDescription.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+ this.SuspendLayout();
+ //
+ // statusBar
+ //
+ this.statusBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Visible;
+ this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.statusBarLabel});
+ this.statusBar.Location = new System.Drawing.Point(0, 431);
+ this.statusBar.Name = "statusBar";
+ this.statusBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.statusBar.Size = new System.Drawing.Size(632, 22);
+ this.statusBar.TabIndex = 1;
+ //
+ // statusBarLabel
+ //
+ this.statusBarLabel.Name = "statusBarLabel";
+ this.statusBarLabel.Size = new System.Drawing.Size(39, 17);
+ this.statusBarLabel.Text = "Ready";
+ //
+ // splitContainer
+ //
+ this.splitContainer.BackColor = System.Drawing.SystemColors.Control;
+ this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer.Location = new System.Drawing.Point(0, 63);
+ this.splitContainer.Name = "splitContainer";
+ //
+ // splitContainer.Panel1
+ //
+ this.splitContainer.Panel1.Controls.Add(this.scopeTree);
+ this.splitContainer.Panel1.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0);
+ //
+ // splitContainer.Panel2
+ //
+ this.splitContainer.Panel2.Controls.Add(this.pnlRight);
+ this.splitContainer.Panel2.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0);
+ this.splitContainer.Size = new System.Drawing.Size(632, 368);
+ this.splitContainer.SplitterDistance = 250;
+ this.splitContainer.SplitterWidth = 2;
+ this.splitContainer.TabIndex = 2;
+ //
+ // scopeTree
+ //
+ this.scopeTree.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.scopeTree.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.scopeTree.HideSelection = false;
+ this.scopeTree.ImageIndex = 0;
+ this.scopeTree.ImageList = this.smallImages;
+ this.scopeTree.ItemHeight = 19;
+ this.scopeTree.Location = new System.Drawing.Point(0, 1);
+ this.scopeTree.Name = "scopeTree";
+ this.scopeTree.SelectedImageIndex = 0;
+ this.scopeTree.ShowLines = false;
+ this.scopeTree.Size = new System.Drawing.Size(250, 367);
+ this.scopeTree.TabIndex = 0;
+ this.scopeTree.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnScopeTreeBeforeExpand);
+ this.scopeTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnScopeTreeAfterSelect);
+ //
+ // smallImages
+ //
+ this.smallImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+ this.smallImages.ImageSize = new System.Drawing.Size(16, 16);
+ this.smallImages.TransparentColor = System.Drawing.Color.Transparent;
+ //
+ // pnlRight
+ //
+ this.pnlRight.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.pnlRight.Controls.Add(this.pnlResultView);
+ this.pnlRight.Controls.Add(this.pnlDescription);
+ this.pnlRight.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pnlRight.Location = new System.Drawing.Point(0, 1);
+ this.pnlRight.Name = "pnlRight";
+ this.pnlRight.Size = new System.Drawing.Size(380, 367);
+ this.pnlRight.TabIndex = 0;
+ //
+ // pnlResultView
+ //
+ this.pnlResultView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pnlResultView.Location = new System.Drawing.Point(0, 63);
+ this.pnlResultView.Name = "pnlResultView";
+ this.pnlResultView.Size = new System.Drawing.Size(376, 300);
+ this.pnlResultView.TabIndex = 14;
+ //
+ // pnlDescription
+ //
+ this.pnlDescription.Controls.Add(this.lineBox2);
+ this.pnlDescription.Controls.Add(this.lblResultViewPath);
+ this.pnlDescription.Controls.Add(this.lblResultViewTitle);
+ this.pnlDescription.Controls.Add(this.pictureBox);
+ this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Top;
+ this.pnlDescription.Location = new System.Drawing.Point(0, 0);
+ this.pnlDescription.Name = "pnlDescription";
+ this.pnlDescription.Size = new System.Drawing.Size(376, 63);
+ this.pnlDescription.TabIndex = 13;
+ //
+ // lblResultViewPath
+ //
+ this.lblResultViewPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblResultViewPath.AutoEllipsis = true;
+ this.lblResultViewPath.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblResultViewPath.Location = new System.Drawing.Point(47, 28);
+ this.lblResultViewPath.Name = "lblResultViewPath";
+ this.lblResultViewPath.Size = new System.Drawing.Size(251, 21);
+ this.lblResultViewPath.TabIndex = 15;
+ this.lblResultViewPath.Text = "Path";
+ //
+ // lblResultViewTitle
+ //
+ this.lblResultViewTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblResultViewTitle.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblResultViewTitle.Location = new System.Drawing.Point(47, 8);
+ this.lblResultViewTitle.Name = "lblResultViewTitle";
+ this.lblResultViewTitle.Size = new System.Drawing.Size(318, 20);
+ this.lblResultViewTitle.TabIndex = 14;
+ this.lblResultViewTitle.Text = "Title";
+ //
+ // pictureBox
+ //
+ this.pictureBox.Location = new System.Drawing.Point(9, 8);
+ this.pictureBox.Name = "pictureBox";
+ this.pictureBox.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox.TabIndex = 13;
+ this.pictureBox.TabStop = false;
+ //
+ // lineBox2
+ //
+ this.lineBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lineBox2.Location = new System.Drawing.Point(6, 51);
+ this.lineBox2.Name = "lineBox2";
+ this.lineBox2.Size = new System.Drawing.Size(366, 2);
+ this.lineBox2.TabIndex = 16;
+ this.lineBox2.TabStop = false;
+ this.lineBox2.Text = "lineBox2";
+ //
+ // topLogoControl
+ //
+ this.topLogoControl.BackColor = System.Drawing.Color.White;
+ this.topLogoControl.Dock = System.Windows.Forms.DockStyle.Top;
+ this.topLogoControl.Location = new System.Drawing.Point(0, 0);
+ this.topLogoControl.Name = "topLogoControl";
+ this.topLogoControl.Size = new System.Drawing.Size(632, 63);
+ this.topLogoControl.TabIndex = 3;
+ //
+ // ApplicationForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(632, 453);
+ this.Controls.Add(this.splitContainer);
+ this.Controls.Add(this.statusBar);
+ this.Controls.Add(this.topLogoControl);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimumSize = new System.Drawing.Size(640, 480);
+ this.Name = "ApplicationForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "WebsitePanel Installer";
+ this.Shown += new System.EventHandler(this.OnApplicationFormShown);
+ this.statusBar.ResumeLayout(false);
+ this.statusBar.PerformLayout();
+ this.splitContainer.Panel1.ResumeLayout(false);
+ this.splitContainer.Panel2.ResumeLayout(false);
+ this.splitContainer.ResumeLayout(false);
+ this.pnlRight.ResumeLayout(false);
+ this.pnlDescription.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.StatusStrip statusBar;
+ private System.Windows.Forms.SplitContainer splitContainer;
+ private System.Windows.Forms.Panel pnlRight;
+ private TopLogoControl topLogoControl;
+ private System.Windows.Forms.TreeView scopeTree;
+ private System.Windows.Forms.Panel pnlDescription;
+ private LineBox lineBox2;
+ private System.Windows.Forms.Label lblResultViewPath;
+ private System.Windows.Forms.Label lblResultViewTitle;
+ private System.Windows.Forms.PictureBox pictureBox;
+ private System.Windows.Forms.ToolStripStatusLabel statusBarLabel;
+ private System.Windows.Forms.ImageList smallImages;
+ private System.Windows.Forms.Panel pnlResultView;
+ private System.ComponentModel.BackgroundWorker backgroundWorker;
+ }
+}
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs
new file mode 100644
index 00000000..75c23392
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs
@@ -0,0 +1,650 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Net;
+using System.Configuration;
+using System.Threading;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Microsoft.Win32;
+
+using WebsitePanel.Installer.Common;
+using WebsitePanel.Installer.Controls;
+using WebsitePanel.Installer.Services;
+using WebsitePanel.Installer.Configuration;
+using System.Xml;
+using System.Runtime.Remoting.Lifetime;
+using WebsitePanel.Installer.Core;
+
+namespace WebsitePanel.Installer
+{
+ ///
+ /// Main application form
+ ///
+ internal partial class ApplicationForm : Form
+ {
+ private ProgressManager progressManager;
+ private ScopeNode activeScopeNode;
+ private static ApplicationForm instance;
+ delegate void VoidCallback();
+
+ #region Constructor
+
+ ///
+ /// Initializes a new instance of the ApplicationForm class.
+ ///
+ internal ApplicationForm()
+ {
+ InitializeComponent();
+ if (DesignMode)
+ {
+ return;
+ }
+ }
+ #endregion
+
+ #region Scope tree
+
+ ///
+ /// Adds predefined nodes
+ ///
+ private void AddDefaultNodes()
+ {
+ scopeTree.Nodes.Clear();
+ ScopeNode componentsNode = AddScopeNode(null, "Components", Properties.Resources.Folder32, Properties.Resources.Folder16, new ComponentsControl(), NodeType.Components, null);
+ AddScopeNode(null, "Application Settings", Properties.Resources.Tool32, Properties.Resources.Tool16, new SettingsControl(), NodeType.Settings, null);
+ componentsNode.Expand();
+ ExpandScopeNode(componentsNode);
+ scopeTree.SelectedNode = componentsNode;
+
+ }
+
+ ///
+ /// Adds scope node to the scope tree
+ ///
+ internal ScopeNode AddScopeNode(ScopeNode parent, string text, Icon largeIcon, Icon smallIcon, ResultViewControl resultView, NodeType nodeType, object tag)
+ {
+ string smallIconName = smallIcon.GetHashCode().ToString();
+ if (!this.smallImages.Images.ContainsKey(smallIconName))
+ {
+ this.smallImages.Images.Add(smallIconName, smallIcon);
+ }
+ ScopeNode node = new ScopeNode();
+ node.Text = text;
+ node.ResultView = resultView;
+ node.SmallIcon = smallIcon;
+ node.LargeIcon = largeIcon;
+ node.ImageKey = smallIconName;
+ node.SelectedImageKey = smallIconName;
+ node.NodeType = nodeType;
+ node.Populated = false;
+ node.Tag = tag;
+ if (parent == null)
+ {
+ scopeTree.Nodes.Add(node);
+ }
+ else
+ {
+ parent.Nodes.Add(node);
+ }
+ //add fake node to show +
+ node.Nodes.Add(" ");
+ return node;
+ }
+
+
+ ///
+ /// Adds component node to the scope tree
+ ///
+ internal ScopeNode AddComponentNode(ScopeNode parent, string text, object tag)
+ {
+ return AddScopeNode(parent, text, Properties.Resources.Service32, Properties.Resources.Service16, new ComponentControl(), NodeType.Component, tag);
+ }
+
+ ///
+ /// Actions on select node in the scope tree
+ ///
+ private void OnScopeTreeAfterSelect(object sender, TreeViewEventArgs e)
+ {
+ ScopeNode node = e.Node as ScopeNode;
+ //node.ContextMenuStrip = scopeItemContextMenu;
+ ExpandScopeNode(node);
+ PopulateResultView(node);
+ activeScopeNode = node;
+ }
+
+ ///
+ /// Expands scope node in the scope tree
+ ///
+ private void ExpandScopeNode(ScopeNode node)
+ {
+ if (node != null)
+ {
+ if (!node.Populated)
+ {
+ node.Nodes.Clear();
+ StartProgress("Loading...");
+ string text = node.Text;
+ node.Text += " expanding...";
+ scopeTree.Update();
+ scopeTree.BeginUpdate();
+ switch (node.NodeType)
+ {
+ /*case NodeType.Servers:
+ LoadServers(node);
+ break;
+ case NodeType.Server:
+ LoadServerComponents(node);
+ break;*/
+ case NodeType.Components:
+ LoadInstalledComponents(node);
+ break;
+ }
+ node.Text = text;
+ node.Populated = true;
+ node.Expand();
+ scopeTree.EndUpdate();
+ FinishProgress();
+ }
+ }
+ }
+
+ ///
+ /// Action on expanding scope tree node
+ ///
+ ///
+ ///
+ private void OnScopeTreeBeforeExpand(object sender, TreeViewCancelEventArgs e)
+ {
+ ScopeNode node = e.Node as ScopeNode;
+ ExpandScopeNode(node);
+ }
+ #endregion
+
+ #region Result view
+
+ ///
+ /// Displays result view control
+ ///
+ ///
+ private void PopulateResultView(ScopeNode parentNode)
+ {
+ this.SuspendLayout();
+ pnlResultView.Controls.Clear();
+ if (parentNode.LargeIcon != null)
+ {
+ pictureBox.Image = parentNode.LargeIcon.ToBitmap();
+ }
+ else
+ {
+ pictureBox.Image = Properties.Resources.Folder32.ToBitmap();
+ }
+ lblResultViewTitle.Text = parentNode.Text;
+ lblResultViewPath.Text = parentNode.FullPath;
+ ResultViewControl control = parentNode.ResultView;
+ if (control != null)
+ {
+ pnlResultView.Controls.Add(control);
+ control.Dock = DockStyle.Fill;
+ try
+ {
+ AppContext context = new AppContext();
+ context.AppForm = this;
+ context.ScopeNode = parentNode;
+ control.ShowControl(context);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Console error", ex);
+ ShowError(ex);
+ }
+ }
+ this.ResumeLayout(false);
+ this.PerformLayout();
+ }
+
+ #endregion
+
+ #region Console
+
+ ///
+ /// Application form instance
+ ///
+ internal static ApplicationForm Instance
+ {
+ get { return instance; }
+ }
+
+ ///
+ /// Current version
+ ///
+ public string Version
+ {
+ get
+ {
+ return this.GetType().Assembly.GetName().Version.ToString();
+ }
+ }
+
+ ///
+ /// Reloads application
+ ///
+ internal void ReloadApplication()
+ {
+ //thread safe call
+ if (this.InvokeRequired)
+ {
+ VoidCallback callback = new VoidCallback(ReloadApplication);
+ this.Invoke(callback);
+ }
+ else
+ {
+ AppConfigManager.LoadConfiguration();
+ Update();
+ //LoadConfiguration();
+ ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode;
+ componentsNode.Nodes.Clear();
+ componentsNode.Populated = false;
+ OnScopeTreeAfterSelect(scopeTree, new TreeViewEventArgs(componentsNode));
+ }
+ }
+
+ ///
+ /// Initializes application
+ ///
+ internal void InitializeApplication()
+ {
+ CheckForIllegalCrossThreadCalls = false;
+ LifetimeServices.LeaseTime = TimeSpan.Zero;
+
+ this.splitContainer.Panel2MinSize = 380;
+ this.splitContainer.Panel1MinSize = 150;
+ this.progressManager = new ProgressManager(this, this.statusBarLabel);
+ instance = this;
+
+ AddDefaultNodes();
+
+ }
+
+ ///
+ /// Disables application content
+ ///
+ internal void DisableContent()
+ {
+ scopeTree.Enabled = false;
+ pnlResultView.Enabled = false;
+ }
+
+ ///
+ /// Enables application content
+ ///
+ internal void EnableContent()
+ {
+ scopeTree.Enabled = true;
+ pnlResultView.Enabled = true;
+ }
+
+ ///
+ /// Shows error message
+ ///
+ /// Message
+ internal void ShowError(string message)
+ {
+ MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ ///
+ /// Shows default web error message
+ ///
+ internal void ShowServerError()
+ {
+ ShowError("An error occurred while connecting to the remote server. Please check your internet connection.");
+ }
+
+ ///
+ /// Shows default error message
+ ///
+ internal void ShowError()
+ {
+ ShowError("An unexpected error has occurred. We apologize for this inconvenience.\n" +
+ "Please contact Technical Support at support@websitepanel.net.\n\n" +
+ "Make sure you include a copy of the Installer.log file from the\n" +
+ "WebsitePanel Installer home directory.");
+ }
+
+ ///
+ /// Shows security error message
+ ///
+ internal void ShowSecurityError()
+ {
+ ShowError(Global.Messages.NotEnoughPermissionsError);
+ }
+
+ internal void ShowError(Exception ex)
+ {
+ if (Utils.IsSecurityException(ex))
+ ShowSecurityError();
+ else
+ ShowError();
+ }
+
+
+ ///
+ /// Shows info message
+ ///
+ ///
+ internal void ShowInfo(string message)
+ {
+ MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ ///
+ /// Shows warning message
+ ///
+ ///
+ internal void ShowWarning(string message)
+ {
+ MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ ///
+ /// Loads installed components from configuration file
+ ///
+ private void LoadInstalledComponents(ScopeNode node)
+ {
+ Log.WriteStart("Loading installed components");
+ node.Nodes.Clear();
+
+ foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
+ {
+ string instance = string.Empty;
+ if (componentConfig.Settings["Instance"] != null &&
+ !string.IsNullOrEmpty(componentConfig.Settings["Instance"].Value))
+ {
+ instance = "(" + componentConfig.Settings["Instance"].Value + ")";
+ }
+ string title = string.Format("{0} {1} {2} {3}",
+ componentConfig.Settings["ApplicationName"].Value,
+ componentConfig.Settings["ComponentName"].Value,
+ componentConfig.Settings["Release"].Value,
+ instance);
+
+ AddComponentNode(node, title, componentConfig);
+ }
+ node.Populated = true;
+ Log.WriteEnd(string.Format("{0} installed component(s) loaded", AppConfigManager.AppConfiguration.Components.Count));
+ }
+
+ ///
+ /// Returns installer web service
+ ///
+ internal InstallerService WebService
+ {
+ get
+ {
+ return ServiceProviderProxy.GetInstallerWebService();
+ }
+ }
+
+ ///
+ /// Checks for the application update
+ ///
+ /// File name
+ /// true if update is available for download; otherwise false
+ internal bool CheckForUpdate(out string fileName)
+ {
+ bool ret = false;
+ fileName = string.Empty;
+ Log.WriteStart("Checking for a new version");
+ //
+ var webService = ServiceProviderProxy.GetInstallerWebService();
+ DataSet ds = webService.GetLatestComponentUpdate("cfg core");
+ //
+ Log.WriteEnd("Checked for a new version");
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ DataRow row = ds.Tables[0].Rows[0];
+ Version currentVersion = GetType().Assembly.GetName().Version;
+ Version newVersion = null;
+ try
+ {
+ newVersion = new Version(row["Version"].ToString());
+ }
+ catch (FormatException e)
+ {
+ Log.WriteError("Version error", e);
+ return false;
+ }
+ if (newVersion > currentVersion)
+ {
+ ret = true;
+ fileName = row["UpgradeFilePath"].ToString();
+ Log.WriteInfo(string.Format("Version {0} is available for download", newVersion));
+ }
+ }
+ return ret;
+ }
+
+ ///
+ /// Runs application updater
+ ///
+ /// File name
+ /// true if updater started successfully
+ internal bool StartUpdateProcess(string fileName)
+ {
+ Log.WriteStart("Starting updater");
+ string tmpFile = Path.ChangeExtension(Path.GetTempFileName(), ".exe");
+ using (Stream writeStream = File.Create(tmpFile))
+ {
+ using (Stream readStream = typeof(Program).Assembly.GetManifestResourceStream("WebsitePanel.Installer.Updater.exe"))
+ {
+ byte[] buffer = new byte[(int)readStream.Length];
+ readStream.Read(buffer, 0, buffer.Length);
+ writeStream.Write(buffer, 0, buffer.Length);
+ }
+ }
+ string targetFile = GetType().Module.FullyQualifiedName;
+ //
+ var webService = ServiceProviderProxy.GetInstallerWebService();
+ string url = webService.Url;
+ //
+ string proxyServer = string.Empty;
+ string user = string.Empty;
+ string password = string.Empty;
+
+ // check if we need to add a proxy to access Internet
+ bool useProxy = AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy);
+ if (useProxy)
+ {
+ proxyServer = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Address].Value;
+ user = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_UserName].Value;
+ password = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Password].Value;
+ }
+
+ ProcessStartInfo info = new ProcessStartInfo();
+ info.FileName = tmpFile;
+
+ //prepare command line args
+ StringBuilder sb = new StringBuilder();
+ sb.AppendFormat("\\url:\"{0}\" ", url);
+ sb.AppendFormat("\\target:\"{0}\" ", targetFile);
+ sb.AppendFormat("\\file:\"{0}\" ", fileName);
+ sb.AppendFormat("\\proxy:\"{0}\" ", proxyServer);
+ sb.AppendFormat("\\user:\"{0}\" ", user);
+ sb.AppendFormat("\\password:\"{0}\" ", password);
+ info.Arguments = sb.ToString();
+ Process process = Process.Start(info);
+ if (process.Handle != IntPtr.Zero)
+ {
+ User32.SetForegroundWindow(process.Handle);
+ }
+ Log.WriteEnd("Updater started");
+ return (process.Handle != IntPtr.Zero);
+ }
+ #endregion
+
+ #region Progress indication
+
+ ///
+ /// Starts progress indication
+ ///
+ /// Title
+ internal void StartProgress(string title)
+ {
+ StartProgress(title, false);
+ }
+
+ ///
+ /// Starts progress indication
+ ///
+ /// Title
+ /// Disable content
+ internal void StartProgress(string title, bool disableContent)
+ {
+ if (disableContent)
+ {
+ DisableContent();
+ }
+ progressManager.StartProgress(title);
+ }
+
+ ///
+ /// Starts async progress indication
+ ///
+ /// Title
+ /// Disable content
+ internal void StartAsyncProgress(string title, bool disableContent)
+ {
+ if (disableContent)
+ {
+ DisableContent();
+ }
+ topLogoControl.ShowProgress();
+ progressManager.StartProgress(title);
+ }
+
+ ///
+ /// Finishes progress indication
+ ///
+ internal void FinishProgress()
+ {
+ topLogoControl.HideProgress();
+ progressManager.FinishProgress();
+ EnableContent();
+ }
+
+ #endregion
+
+ private void OnApplicationFormShown(object sender, EventArgs e)
+ {
+ StartUnattendedSetup();
+ }
+
+ private void StartUnattendedSetup()
+ {
+ XmlDocument doc = Global.SetupXmlDocument;
+ if (doc != null)
+ {
+ XmlNode root = doc.SelectSingleNode("setup");
+ if (root == null)
+ {
+ Log.WriteError("Incorrect setup xml file");
+ Close();
+ }
+ Log.WriteStart("Starting unattended setup");
+ ProceedUnattendedSetup();
+ }
+ }
+
+ public void ProceedUnattendedSetup()
+ {
+ XmlDocument doc = Global.SetupXmlDocument;
+ XmlNode root = doc.SelectSingleNode("setup");
+ if (root.ChildNodes.Count == 0)
+ {
+ Log.WriteEnd("Unuttended setup finished");
+ Close();
+ return;
+ }
+ XmlNode node = root.ChildNodes[0];
+ switch (node.Name.ToLower())
+ {
+ case "install":
+ ParseInstallNode(node);
+ break;
+ }
+ }
+
+ private void ParseInstallNode(XmlNode installNode)
+ {
+ XmlNodeList components = installNode.SelectNodes("component");
+ if (components.Count == 0)
+ {
+ //remove parent install node
+ installNode.ParentNode.RemoveChild(installNode);
+ ProceedUnattendedSetup();
+ }
+ else
+ {
+ //remove current node and start installation
+ XmlElement componentNode = (XmlElement)components[0];
+ string componentCode = componentNode.GetAttribute("code");
+ string componentVersion = componentNode.GetAttribute("version");
+ string xml = componentNode.InnerXml;
+ installNode.RemoveChild(componentNode);
+
+ if (!string.IsNullOrEmpty(componentCode))
+ {
+ ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode;
+ scopeTree.SelectedNode = componentsNode;
+ ComponentsControl ctrl = componentsNode.ResultView as ComponentsControl;
+ ctrl.InstallComponent(componentCode, componentVersion, xml);
+ }
+ }
+ }
+
+ public override object InitializeLifetimeService()
+ {
+ ILease lease = (ILease)base.InitializeLifetimeService();
+
+ //Set lease properties
+ lease.InitialLeaseTime = TimeSpan.Zero;
+ return lease;
+ }
+
+ }
+}
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx
new file mode 100644
index 00000000..37d70fbb
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx
@@ -0,0 +1,1571 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 115, 17
+
+
+ 229, 17
+
+
+
+
+ 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
+ nI5yAJmLdgCZjHUAnI97AJ2QcwCekHQAn5J4AKCTdwCgk3kAopV6AKSXewCjl3wApJd+AKWZfgCpmn4A
+ x5hEAMKVSADInVUAxZ9eAMifWgDKoVgAyKFcAMKeYgDDoW4AxaVxAKGWgwCkl4MAppqBAKmbgACpnYIA
+ qZ2EAKidigCsoYYAraKJAK2kiQCuo40ArqSNALCihwCwpYoAsKWNALSpjwC8qokAq6GRAK+kkgCvpZUA
+ saaQALarkQC1rJMAtKqWALWslAC1q5sAt66YALWsnwC4rpkAuK+fAL2wkwC6sZYAvLCXALmwmwC9tJoA
+ u7GcAL21nQCzr6MAtbGmAL61oQC7s6UAv7ihALazrgC+uq0Au7m0AL+8tADEqoUAwa6KAM2xhwDOtogA
+ y7GPAMu3jQDQt44Ay7SXAMS5mwDAuJ4AxbqfAMm4mgDSvZYAwLejAMC3pADCuqEAxbmhAMW8owDBuKYA
+ wrykAMW+pgDKuqEAwLeqAMO6qADEu6oAxb2pAMC6rgDGvqwAyL6rAMi/rgDBu7AAwbywAMvApQDHwaoA
+ x8CvAMjBqQDIwa0AzcevANPBoADYyq0AycKxAM3DsADKxLIAzcaxAMnCtgDLxbQAzMa1AM3IsQDOyLcA
+ w8C6AMXDvgDGxL8AzMa7AMnFvgDOybgAysi/AM/JvADSx7UA0cy1ANHKugDRzLsA1c24ANDKvQDSzL0A
+ 1M69ANrPuwDX0boA1tG9ANjTvADh1b0AyMbBAMnIwwDNysEAz83CAMvJxQDNy8UAzszHAM3LyADPzckA
+ 0czBANTOwQDQzcQA1dDCANbSxADY0sIA2NTDANzXwQDY0sUA2tXFANzXxwDd2MEA3tnEANrVyADc18sA
+ 3djJANzZzADb2NIA3NnSAN/d0ADb2dQA3trUAN7c1QDh28cA4dzGAOLeyADg288A4d3OAODd0gDh3tUA
+ 4d/aAObhzADp480A4+DSAOTg0gDi4NUA5OHWAOvm0QDp5NUA7urWAO/s1wDk4tgA5uTaAOfl3ADp5toA
+ 7OfbAOjm3QDv69sA6ujeAO3q3gDv7N8A8e3aAPPv3gDz8N8A9PDeAOrp4QDs6uIA7uziAOzq5ADt7OUA
+ 7+7oAPHt4ADw7uYA8O7pAPTx4QDx8OoA9fPpAPLx7QD08u4A9PTvAPn37QD6+O8A9PPwAPX18QD39vQA
+ +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
+ //8AAP4//////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgA
+ AAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAJyPdwCiln4Au6V9AMWeWQDGomMAx6JpAMeocADMsH0A
+ pZmBAKabhQCqnYIAqJ2FAKmeiACtoYYAq6CKAKygigCroY4ArqOMAK6kjQC0o4IAsKaNAK6kkQCwppEA
+ saiQALSrkwCzqpQAtKqVALaulwCzqZkAt62YALmvmwC5sZkAurCdALy1ngC7saEAvLOgAL21oAC7s6UA
+ vbSmAL+4pgC+vLcAz7OHAMGxjQDOto4AyribAMC2oQDAt6UAwLmiAMK5pQDDvKQAxbynAMi7pgDCuqkA
+ xb2pAMK7rwDGvq4AyL+rAMe/sADVwJwAzsGhAMvCrwDMxq4AxsCyAMfBtADJwrEAysSzAMzEswDKxLUA
+ zMa1AM3IsADJxbkAy8e9AM7IuADOyb0A0ce2AN3PsQDazLQA0cq6ANbNuQDRyr0A0828ANTOvgDV0LkA
+ zcrBAM3KxQDPzMYA0s7BANTOwADUz8UA0s/KANPQwwDV0MIA19HEANjSwgDe18IA2NPHANrVxQDc2MEA
+ 2tbKANzWyADb2MsA3dnKAN3ZzgDe2dAA393RAODbygDj38kA4NvSAOHd0QDh3tQA5N/WAOXgyQDl4NEA
+ 4uDUAOTh1gDn5NcA6OPSAOrm0QDr5tcA7enWAOTi2ADm5NoA5+XcAOrn2gDo5t0A7urZAOzp3gDw7NoA
+ 6ujgAOzq4gDs6+QA7uzmAO/u6ADx7+cA8O7pAPHw6gD08ukA8vHtAPTz7wD19O8A9fXxAPf29AD59/AA
+ +Pf0APn48QD5+PYA+vr4APz7+gD8/PoA/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRXV0cpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFtm
+ c4SGZigAAAAAAAAAAAAAAAAAAAAAAAAAVFRUW2h8ipOWlpNmMAAAAAAAAAAAAAAAAAAAAABUVFRbbYSK
+ lpaWlpaWk2YwAAAAAAAAAAAAAAAAVEdHVF5thpOWlpaWlpaWlpaTZi4AAAAAAAAAAFpHQDhHZHyKlpaW
+ lpaWlpaWlpaWlpBkIgAAAAAAAABAL0VohJaWlpaWlpaWlpaWlpaWlpOWimQiAAAAAAAAVziIlpaWlpaW
+ lpaWlpaWlpaTk5CQjo6KZBwAAAAAAAA6ZpaWlpaWlpaWlpaWlpOQk5OQjo6OioRbHAAAAAAAADptlpaW
+ lpaWlpOTk46TkJOOjoqOioqKhFIcAAAAAAAAOm2WlpaWk5OTk5OQk46Oio6KioqGiIR8VxwAAAAAAAA6
+ bZaWkJOTk5CQkI6OipOKioqEhISEhHpSFwAAAAAAADptlpCWkJOQk46OjoqOioqGhH+Ef3yBc1ISAAAA
+ AAAAOGiWk46TkI6OjoqOioqKhH96fHp6enpoSRIAAAAAAAA4aJaOk5CQjo6KjoqKhnx6enp6enp6emZJ
+ EgAAAAAAADhmlo6Qjo6OipOKin96enp6enptc25zZkUSAAAAAAAAOmiTk46OjoqThoRzc3Nzc25oc2hm
+ W1QwOAwAAAAAAAA4ZpaOjo6OioRzc3NzbWhmW0UoHhwSFQ4uDAAAAAAAADpok5COiop8c2ZmUkAiHAoL
+ DBQDKwQ8PjAMAAAAAAAAOGaWjohzUkUiHAoLDBIcMAUHCAQ7BUxfMAkAAAAAAAA4UmQ4EgwLChIcMD5S
+ YnBwKixMLVI0OUUXEgAAAAAAAEUSHBwwMElTYnB2doB2dmZLPkU4MDAhDAEAAAAAAAAAZG1zf3+AgIB2
+ f3NfW0tFMC4XDAkNFi4AAAAAAAAAAABtk5GRhn9oZEs+MCIXCgoNHjoAAAAAAAAAAAAAAAAAAGSEhHNS
+ OBwODA0XJwAAAAAAAAAAAAAAAAAAAAAAAAAAADgSDBciAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////8H///wB///AAf/+AAH
+ /4AAB/gAAAfwAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH
+ 4AAAB+AAAAfgAAAP4AAAP+AAB//gAf//8H///////////////////ygAAAAYAAAAMAAAAAEACAAAAAAA
+ QAIAAAAAAAAAAAAAAAEAAAABAAAAAAAAtqF5ALumfgDBo2wAyaZrAK+ljQCwpo0At6iJAK+lkwCwppIA
+ tqySALKplgC0qpYAtayVALiulwC2rZsAuK+dALqwmQC6sJ0AvLKfAL+3ngC6sqEAvbWhAL62pQC/uqsA
+ ybGFANG5jgDPuZYAwbmmAMW8pgDKvKIAwrqpAMO9qwDEvKkAw7utAMO+rQDFvq4Ax8CqAMnArgDLxKwA
+ 0sSpAMfBsADIwrEAzcewAMjBtQDNx7YAysW6AMrHvQDOyLkAzcm8ANDItQDQyrkA0Mq+ANPNvgDW0boA
+ 3NO6AM/MwwDRzcAA1c/DANDNxQDW0MEA1dHEANjTxQDa1MQA39rFANHQygDY08gA2tXJAN7ZyQDc2MwA
+ 39vRAN/c0QDh3MYA4dzOAOHd0QDh3tQA5uHPAOjkzwDi4NUA5OHXAOrl0wDq5tUA4+DYAOTh2ADm5NoA
+ 5+PcAOfk3ADo5t4A6ejfAPDt3wDq6OEA7OniAOzr5ADt7OUA7+7oAPDu5QDw7ukA9PHmAPTy6ADy8ewA
+ 9PLuAPb18QD39/QA+Pf0APj49gD6+vkA/Pz6AP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzsvAAAAAAAAAAAAAAAAAAAAAABBOz5HW2RJGAAA
+ AAAAAAAAAAAAAAA4Oz5PXmdra2tKIwAAAAAAAAAAADsxMUNWZGtra2tra2tKKgAAAAAAAC8qL0VbZ2tr
+ a2tra2tra2tJIwAAAAAAI0pga2tra2tra2tra2tnZ2ZFIwAAAAA7Smtra2tra2tra2dnZ2ZmZmQ+IwAA
+ AAA0V2tra2trZ2tmZ2dnZmRkZGA+HAAAAAA0VmtrZ2tmZ2ZmZmZkZFtkW1s+FwAAAAA0VmtnZ2dnZmZm
+ ZGRgW1tbW1Y0FwAAAAA0Umtna2ZmZmRkZFtbW1ZWVk8zFgAAAAA0SmtmZmZmZGRgWFZWT1ZPT04tFgAA
+ AAA0VmdnZmRkZFtWT09PTkVFPi0cFgAAAAAxUmtmZmRbVk9FRTQqHBENBw0REAAAAAA7SmtkW0c+JRYN
+ BgcBAgMZBDccEAAAAAA0Oz4jDQUFDRQnNkQaGhsoHjMOFgAAAAA+FBwlJzdETVBQTEQzJyMRDgUIAAAA
+ AABKXmRhWVBJPjMjEA0FCxYqAAAAAAAAAABKXlc+KhEODQ4jAAAAAAAAAAAAAAAAAAAAKhYfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wD//8cA//wDAP/gAwD+AAMA8AADAOAAAwDAAAMAwAADAMAAAwDAAAMAwAADAMAAAwDAAAMA
+ wAADAMAAAwDAAAMAwAAHAMAAPwDAD/8A4///AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAA
+ AAAAAAAAAAAAAQAAAAEAAAAAAAC+ro0AvrKXAL20ngC8s6EAvrSgAL+3pwDBsI0Ay7OJAM24kgDMu5cA
+ zr6fAMG3oQDCu6MAw7qkAMK5qQDFva0Ayb+sAMa/sQDHwK4Ay8WuAMvDtwDKxbQAyMW6AM/JvQDRy7oA
+ 0cq9ANPOvwDUz7wA19G/ANjTvwDRy8AA087BANTPwwDSzcQA1tHFANjTxQDf2cYA1NHKANbTzQDa1coA
+ 2dXNAN3YywDc2c0A29nRAN7a0gDi3coA4d3SAOHd1QDj4dcA5eLXAOXi2ADm5NsA5uXcAOnm3QDq6N8A
+ 6efgAOrp4QDs6uMA7erlAO7s5gDx8OsA8vHsAPTz7gD29fEA+Pf0APn49gD6+vgA/Pz7AP7+/gAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAA
+ ACksNT4yFwAAAAAAACYmLDlARERENyMAAAAiIiw8Q0RERERERDUjAAAAMEREREREREREQ0EwIwAALDlE
+ RERERENBQD4+JSIAADA5RERDQUBAPjk5OSQiAAAwOURDQEA+PDk4NzUiGgAAMDhDQEA+OTUyMCUjExoA
+ ADA4Qz43JSIWDQIBBwMYAAAsKSQTBQUNFAoICgsMAAAANRoaHiUuJR0RAwUFEgAAADk3MhoTDw8XAAAA
+ AAAAAAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP/7AAD/gQAA+AEAAMABAADAAQAA
+ gAEAAIABAACAAQAAgAEAAIABAACAAwAAgAMAAIB/AADf/wAA//8AAIlQTkcNChoKAAAADUlIRFIAAAEA
+ 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
+ qCoM+LCbUQ/keqiYUzXq89e6BUBlkH9XzA/MBMCMPh2UwnAVE04L2wlCKLuX806pysgv31f98fntimYC
+ YEafJpIFAR8OlAuG3aIDXR5ljJ/+rSoMAPUc/00xPzATADP69NNu1IWd2g905aRUZfTXPS8THDdNMwEw
+ o88alRkT+fvdCAYdVUUBO/m7JzQTADP6LFNVdJBeVzH8yVN9kO6nGQZ18VV53jTNBMCMZpRTmTGvqmFR
+ RTtlbl38PaeZAJjRjIrEj+LT1hvI1zraCYOn5e4b46c0EwAzmlE1qmo70NE0KL/vzK6imQCY0Yx2Rjp0
+ ID9P48jEp7slTD+jGc1o70m3UAiopiLMaEYzmtGMZjSjGc1oRjOa0YxmNKMZzWhGM5rRjGY0oxnNaEYz
+ mtGMZjSjGc1oRjOa0e7o/weShWoRQ/D8BAAAAABJRU5ErkJggigAAAAwAAAAYAAAAAEAIAAAAAAAgCUA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAACAAAABAAAAAgAAAAMAAAADAAAAAoAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAIAAAACAAAABgAAAAwAAAAQAAAAFgAAAB4GBQYoCgkKKgEBASAAAAAaAAAAEAAAAAYAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAIAAAAEAAAACAAAAA4AAAAUAAAAGgMDAyYtLCs6aGZiXJaTjI2tqaG5q6edwYeDeo8qKShAAAAA
+ JgAAABQAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AgAAAAQAAAAGAAAADAAAABAAAAAWAAAAIB8eHTBYVlNOioeBequon63BvrTX0M3A89nUxv/c18f/3NjJ
+ /87JuP2bloi7JSQjRAAAACYAAAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AgAAAAYAAAAKAAAADgAAABQAAAAcEhISKklIRUR/fHZqo6CYnby4r83Nyb3r1tLE/dvWx//d2cn/4t7P
+ /+nm2//w7ub/4+DS/9zXx//DvKX9e3dtjQAAADIAAAAeAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA
+ BAAAAAgAAAAMAAAAEAAAABYHBwciPDo5OnNxbF6cmZGNt7Sqv8nFuuXUz8L52NPE/9rVxP/e2cn/5eLV
+ /+7s4//29fD//Pz6////////////6+je/9vWx//Iwaj/mZSEvQQEBjgAAAAgAAAACAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA
+ BgAAAAoAAAAOAAAAFAEBARwrKikwZ2VhUpOQiXyxrqWxxsK329HMwPXV0MH/1tDA/9jSwf/e2cr/6OXa
+ //Lx6v/6+ff//v7+////////////////////////////6+je/9vWx//Hv6b/nZeHvwoKDCwAAAAWAAAA
+ BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAA
+ CAAAAAwAAAAQAAAAGBoaGShaWFVGiYaAbquooKHBvrTPzsq+79PNv/3SzLv/0su6/9bQv//g28//7eri
+ //f18v/9/fz/////////////////////////////////////////////////6+je/9vWx//FvKP/o52L
+ tRQVGRQAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAA
+ CgAAAA4AAAAUDQwMIEpIRTqAfXhipKGakb26scPMyLzp0cy++8/JuP/NxbP/zse1/9fRwv/l4df/8vDr
+ //v6+f//////////////////////////////////////////////////////////////////////6+je
+ /9rWx//DuqH/pqCNrz5BUQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAA
+ DAAAABADAwMaODY1LnVyblSempSDubats8nGut/Pyr35zce3/8jArv/Gvqv/zMW0/9vWyv/r6eL/9/b0
+ //7+/v//////////////////////////////////////////////////////////////////////////
+ ////////////6+je/9rWxv/AuJ7/pp+Mr11geQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ BAAAABAICAgeWlhVPpWSjHK0samlx8O5087KvfPMxrb/xb2q/8C3o//Cuab/z8m6/+Pf1v/z8e3//Pz7
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v/+/v7//v7+//7+/f/9/v3/6ebc/9rVxv+/tpz/pJ2LrVxhfQQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAACDk3NiSppp6NzMi948zGt/3Du6j/ubCb/7iumf/Duqn/2NLH/+zp5P/5+Pb////+
+ ///////////////////////////////////////////////////////////////////////+/v7//v7+
+ //7+/f/+/f3//f39//39/P/8/Pz//Pz7//z8+//7/Pv/5+Ta/9rVxf+9tJr/o5yJrV9kggQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAASEVFCL+7so3Pybv7saaQ/7Sqlv/Kw7X/49/X//Tz8P/9/f3/////
+ ///////////////////////////////////////////////////////////////+//7+/v/+/v7//v79
+ //39/f/9/fz//fz8//z8+//8+/v/+/v6//v7+f/6+vn/+vr4//r5+P/6+fj/5uPX/9nUxf+7spf/opuI
+ rWFpiAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLexQNLNwO+toYv/083C//v7+v//////////
+ ///////////////////////////////////////////////////////+/v7//v7+//7+/f/+/v3//f38
+ //39/P/9/Pz//Pz7//z8+//7+/r/+/v6//v7+f/7+vn/+vr4//n59//5+Pb/+Pj2//j39f/49/X/5OHV
+ /9nUxP+5sJX/oZqHq2VtjgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycW8i8W9rP+9tKP//v7+
+ //////////////////////////////////////////7//v7+//7+/v/+/v7//v79//39/f/9/f3//f38
+ //38+//8/Pv//Pz7//v7+v/7+/r/+/r5//r6+P/6+vj/+fn3//n59//5+Pb/+Pf1//f29P/39vP/9/Xz
+ //b18v/29fL/4t7S/9jTxP+3rZP/oZiFq2dxkwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4cncEy8e+
+ rb+2o//TzcL////////////////////////////+/v7//v7+//7+/f/9/f3//f39//39/P/9/fz//fz7
+ //z8+//8/Pv//Pv6//v7+v/7+/n/+/r5//r6+P/6+fj/+vn3//n49v/5+Pb/+Pj1//j39P/39vP/9vXy
+ //X08f/19PD/9PTw//Tz7//08+//4NzQ/9jSw/+2q5H/n5eFqWh0nQIAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACBe38Ey8e+r7+2o//UzsP////////+/v/+/v7//v7+//7+/f/+/f3//f38//39/P/9/fz//Pz8
+ //z8+//8+/v/+/v6//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/4+Pb/+Pj1//j39P/39vT/9/bz
+ //b28v/09PD/9PPv//Pz7v/z8u7/8vLt//Lx7f/y8e3/39rN/9fSwv+0qY//npaDp2d1qQIAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACDfYEEzMi/r7+2o//UzsP///////39/f/9/f3//f38//39/P/9/fz//Pz7
+ //z8+//8+/r/+/v6//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/5+Pb/+Pf1//j39P/39/T/9/fz
+ //b28//29fL/9fXx//Pz7v/y8ez/8vHs//Hw7P/x8Ov/8e/q//Dv6v/w7+r/3djL/9fRwv+yp43/npWC
+ pWR5vAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFfoIEzci/r7+2o//TzcL///////39/P/8/Pv//Pz7
+ //z8+//8+/r//Pv6//v7+f/7+vn/+vr5//r6+P/6+fj/+fn3//n49v/5+Pb/+Pj1//j39f/39/T/9/b0
+ //f28//29fL/9vXy//X08f/19PD/8/Lt//Hv6v/w7+r/8O/p/+/u6f/v7uj/7+3n/+7t5//u7ef/29bI
+ /9bRwf+wpYr/nZSBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGgIQEzci/r7+2ov/TzcH//v/+
+ //z8+//8/Pv//Pz6//v7+v/7+/n/+/r5//v6+P/6+vj/+vn3//n59//5+Pb/+fj2//j39f/49/X/9/f0
+ //f28//39vP/9vXy//b18f/19PH/9fTw//Tz7//y8Oz/7+7o/+/u5//u7ef/7u3m/+7s5v/t7OX/7ezk
+ /+3r5P/s6+X/2dTG/9bQwP+uo4j/nJOAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJgoYEzcnA
+ r7+2ov/TzMH//v79//z7+v/7+/r/+/r5//v6+f/7+vj/+vn4//n59//5+ff/+fj2//j49f/4+PX/9/f0
+ //f39P/39vP/9vby//b18v/29fH/9fTw//T07//08+//8/Lu//Dv6v/u7Ob/7ezl/+3r5f/s6+T/7Ovj
+ /+zq4//r6uL/6+nh/+vp4f/q6eH/19HD/9XPwP+soYb/m5J+nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACLhIYEzsnAr7+1ov/SzMD//f79//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/4+Pb/+Pj1
+ //j39P/39/T/9/bz//b28v/29fL/9fXx//X08P/18/D/9PPv//Py7v/z8u3/8O7o/+zq5P/s6uP/6+ri
+ /+vp4v/q6eH/6ujh/+ro4P/p6N//6eff/+nn3//o597/1c/A/9TPv/+rn4P/mpB9nQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACMhogEzsrAr7+2ov/SzL///f38//v6+f/6+vj/+vn4//r59//5+fb/+fj2
+ //j49f/49/X/9/f0//f28//39vP/9vby//b18f/19PH/9fTw//Tz7//08+//8/Lu//Lx7P/u7OX/6unh
+ /+ro4P/q6OD/6ejf/+nn3//p597/6Ofd/+jm3f/o5t3/5+bc/+fl2//n5dz/0829/9TOvv+pnYL/mZB8
+ nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPh4oEz8rBr7+2ov/Sy7///f37//r6+P/6+ff/+fn3
+ //n49v/4+Pb/+Pf1//j39P/39/T/9/bz//b28v/29fL/9fXx//X08P/09PD/9PPv//Py7v/z8u3/8O/q
+ /+vq4v/p59//6efe/+jm3f/o5t3/5+bd/+fl3P/n5dv/5+Xb/+bk2//m5Nr/5ePZ/+Xj2f/l49n/0cu6
+ /9POvf+nm3//mI97mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRiYwEz8vBr761ov/Ry77//Pz7
+ //r59//5+ff/+fj2//n49v/49/X/+Pf0//f39P/39vP/9vXy//b18f/19fH/9fTw//Tz7//08+7/8/Lu
+ //Lx7P/u7eb/6eff/+fl3P/n5dz/5+Xb/+bk2//m5Nr/5uTa/+Xj2f/l49n/5eLY/+Ti2P/k4df/4+HW
+ /+Ph1v/j4Nb/zsm4/9PNvf+lmX3/mI56mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRi48Ez8vC
+ r761ov/Ry77//Pz7//n59//5+Pb/+fj2//j49f/49/T/9/fz//f28//29fL/9vXx//X08f/19PD/9PPv
+ //Tz7v/z8u7/8fDq/+vq4v/n5dv/5uTa/+bk2v/l49n/5ePZ/+Ti2P/k4tf/5OLX/+Th1//j4db/4+HV
+ /+Lg1f/i4NT/4t/U/+Hf0//h39P/zca1/9LMvP+kl3v/l4x6mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACTjZEE0MzCr761of/Ryr7//Pz6//n59v/5+Pb/+Pj1//j39P/39/T/9/bz//b28v/29fL/9fTx
+ //X08P/08+//9PPv//Py7f/u7Ob/5+Xc/+Xj2P/k4tj/5OLX/+Th1//j4db/4+HW/+Lg1f/i4NX/4uDU
+ /+Lf1P/h39P/4d7S/+He0v/h3tL/4d7S/+De0v/g3dH/ysSy/9HMu/+ilXn/lox4lwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACVj5ME0MzDr761of/Ryr3/+/z6//n49v/5+PX/+Pj1//j39P/39vP/9vby
+ //b18v/19fH/9fTw//T07//08+7/7+/p/+jn3v/k4tf/4+HW/+Pg1v/i4NX/4uDV/+Lf1P/h39T/4d/T
+ /+He0v/h3tL/4d7S/+He0v/g3tL/393Q/9zZzP/X08T/z8q6/8a/rf++tqH/tqyU/9HKuv+gk3f/lYt3
+ lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXj5QE0czDr761of/Ryr3/+/v6//n49v/4+PX/+Pf1
+ //f39P/39vP/9vXy//b18f/19PH/9fTw//Hw6//q6OD/5OHX/+Lg1P/i39T/4d/T/+Hf0//h3tP/4d7S
+ /+He0v/h3tP/4d7S/9/d0P/c2cz/1dHD/8zGtf/Buab/t66Y/7Cljf+qn4b/qZ2C/6qeg/+pm4D/qZp+
+ /8/It/+fkXX/lIp3lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZkZYE0c3Dr761of/Qyr3/+/v6
+ //n49v/4+PX/+Pf0//f38//39vP/9vXy//b18f/y8ez/6+nh/+Ph1//h3tP/4d7S/+De0v/h3tL/4d7S
+ /+He0v/g3dH/3NnM/9XRw//KxLP/vLSg/6+ljv+nm4L/opV7/6KVe/+mmoH/qp+E/7Gnjf+8qon/vbCT
+ /7+5of/BuqL/sKKH/8/It/+dj3P/lIl1kwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbk5cE0c3E
+ r760of/Qyb3/+/v6//n49v/4+PX/9/f0//f29P/29vP/8/Lt/+vp4f/j4db/4N7S/+De0v/h3tL/4N3R
+ /93azf/W0sP/y8W0/720of+uo43/pJd+/52QdP+cjnL/oJN4/6qdgv+uooj/tKyT/8Guiv/FpXH/xbqf
+ /8u3jf/GkDT/yKFc/9fRuf/d2cL/vLCX/8/It/+bjXH/k4h1kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACdlZkE0s3Er760oP/Qybz/+/v6//n49v/4+PX/+Pf0//Ty7v/r6uL/5OLX/+Dd0f/d2s3/19PE
+ /8zGtf++taH/rqSN/6OXff+cj3P/m41w/5+Sdv+mmn//raSK/7WtlP+8tZ3/xLmb/8idVf/Fn17/y8Cl
+ /8qhWP/EjSv/zraI/9C3jv/In1r/wp5i/+njzf/x7dn/xbmh/8/It/+Wh2r/k4h1jwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACfl5sE087Fr720oP/Qybz//f38//r59//z8+7/5+Xc/9rWyf/Nx7b/v7ai
+ /7Cljf+jlnv/nI5y/5qMb/+dkXT/pZp+/62jif+1rZT/vLWd/8K8pP/Hwar/zcev/9HMtf/W0rz/0r2W
+ /8eYRP/ClUj/2Mqt/82xh//DoW7/08Gg/+HVv//LtJf/ybia/+Hbx//Vzrj/x72o/8W9qf+Kelv/lox8
+ cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChmZ0E087Fr720oP/JwbL/4t7V/8fAr/+xp5D/opV7
+ /5uNcP+Zi27/nZBz/6SZfv+tpIn/tq6V/722nv/DvaX/yMKr/83HsP/SzbX/19K7/9zXwf/h3Mb/5uLM
+ /+vm0f/v7Nf/4dW8/8uxj//EqoX/5+DM/9rPu//KuqH/1c24/9XNvP/Ivqv/wbej/7uxnf/Bt6T/0cu6
+ /5uNcf+Jel/loJmRMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjm58E087Fr8C3pP+YiWz/n5F2
+ /6OXfP+toor/tayV/7uznP+/uKH/xL6m/8nDrP/NyLH/0s22/9jTvP/d2MH/4t3H/+fizf/r59L/7+vW
+ //Hu2f/z79v/8u/b//Ds2v/t6Nf/5eDR/9LHtf/Nw7D/zca0/8e+rf/BuKf/v7Wj/8C3pv/Gvq3/y8Oz
+ /83Gtv/Iwa//nZB0/4NzVfmWjHx2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjm58E0czD
+ r9bRwv/Mx7X/0s69/9jUw//a1sX/29fF/9vXxP/d2MT/39rE/+LeyP/n483/6+fS/+/r1v/y7tr/9PDc
+ //Tw3v/z797/7+vb/+nk1f/h3M3/2dLD/9DIuP/Iv67/w7qp/8S7qv/Gvq3/ysOy/83Gtv/MxbT/xr6s
+ /7uxnf+toYr/n5J4/5SFav+Jel71h3he2ZaNfHCvra4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACjm58E0MzCr+Dc0P/r6N7/6ufb/+3q3v/v7N//8O3g//Lv4P/z8N//9PHf//Xx3//18uH/9PDi
+ //Ht4P/s59v/5ODT/9vVyP/Ryrv/ysKy/8a+rf/Gvq7/ysOy/83Gt//Nxrb/ycGx/7+2o/+wpY//oJN5
+ /5GCZ/+IeFv7hXVa7YV1XNWIemOzjoFti5OId2KbkoZAqKOfHMvP2gIAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACjm58E0MvCr+Xi1v/5+PH/+vjv//r48P/7+fD/+vjv//n37f/18+n/7+zh
+ /+bh1v/b1cj/0su8/8zEtf/KwrL/y8Oz/83Gtv/Ox7f/zMW1/8W8qv+4rpn/qJyE/5mKb/+NfWH9h3Za
+ 84RzWeGFdl3DiXtmn46Cb3SWi3xMopqRLrGurBbR1d4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkm6AEzce9r+Xi1v/5+PP//Pv4//r59f/18+//7uvl
+ /+Xg2P/c18v/1c/B/9HKu//PyLj/zsi3/8nCsP+/tqL/sKWP/6GTev+UhWn/jHxg+Yd3W+mHd17Ri3xl
+ r4+CboeWinleoJeKOq+poyDIx8sM+v3/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbmug9fSxf/q597/7uzl
+ /+rn3//j39X/29fK/9LMvP/Gvqz/uK6Z/6mchP+bjXL/koNn/Yx7X/GKel/bjX5lwZCCbJuXindwoJWG
+ SqykmyrAvLsU4ubuBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAurOr
+ Hrqxorm+taL9vbSg/7Cljv+hlHr/mIht/5CAZPeNfGHljn5lzZKEba2XinWFoJSEWquilja7tbAc19fb
+ CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAALSspBalmYhslohxq4+AZrWWiHKZn5OAbqmfkUa4sKgmz8vMEPDx+AQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Pb+BPL1/gYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8A
+ AP///////wAA//////APAAD/////AAcAAP////gAAwAA////gAABAAD///wAAAEAAP//wAAAAQAA//4A
+ AAABAAD/4AAAAAMAAP8AAAAABwAA+AAAAAAHAADwAAAAAAcAAPAAAAAABwAA8AAAAAAHAADwAAAAAAcA
+ APAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAA
+ AAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8A
+ AOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAB8AAOAAAAAAHwAA4AAA
+ AAA/AADgAAAAB/8AAOAAAAD//wAA8AAAP///AADwAA////8AAPgB/////wAA/n//////AAD///////8A
+ AP///////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAgAAAAGAAAA
+ BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAADgcHBxpDQj80bWtm
+ UlVTTkIHBwceAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAoAAAEULy4tKm1rZkyYlY18tbGn
+ r8nFuNvRzcDzxL+x54B8cYEAAAAmAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAADh4eHSBgX1tAkI2GbK+roZ/Dv7LP0c2/
+ 793Yy/3m4tb/7+3k//Hv5//e2cn/uLGd4z48OE4AAAAWAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAoQEBAYVFJQNIeFf1yppZyRvrmuwcvGuOfV0cL739vO
+ /+nm3P/z8ev/+vr3//7+/f//////+vn3/97ay/++t6D1YV5WWAAAABAAAAACAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAIAAAAGBgYHEkNCQSh/fXhMo6CYfri0qLPFwLPdzsm699bRw//h3ND/7Ori
+ //b18f/9/Pv////////////////////////////6+ff/3tnK/722n/OFgHRAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAACAAAABAAAAAwxMTAednRwQJ2ak261sKajwLuu08fBsvHOyLj/19HE/+Tf1v/w7uj/+vn3
+ //7+/v////////////////////////////////////////////r59//d2cr/u7Oc8ZyWiDQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAgcHBxCAfnlIsKyjkby3qsXBu6vpxb2s/czFtf/Y08f/6OXd//X08f/9/fz/////
+ ///////////////////////////////////////+/v7//v7+//7+/f/9/f3/+Pf0/9zXyP+5sZnxm5WH
+ NAAAAAAAAAAAAAAAAAAAAAAAAAAAsK2lVMG7rOXAt6X/zMW2/93Yz//u7Of/+vr4////////////////
+ ///////////////////////+/v7//v7+//7+/v/9/f3//f38//z8+//7+/r/+/v5//v6+f/19O//29bG
+ /7eulvGalIY0AAAAAAAAAAAAAAAAAAAAALu3sxLIwrTFwrqp//Lw7f/+/v7/////////////////////
+ /////////////v7+//7+/v/+/v3//f39//39/P/8/Pv//Pv6//v7+f/7+vn/+vn4//n49v/49/X/+Pf1
+ //Lx7P/Z1MT/tKyU75qThTIAAAAAAAAAAAAAAAAAAAAAxcG7MMO7q+3e2dD//////////////////v7+
+ //7+/v/+/v3//f39//39/P/8/Pz//Pz7//z8+//7+/r/+/r5//r6+P/6+ff/+fn2//j49f/39vT/9vXy
+ //X18f/19PH/7+3n/9jSwv+yqZHvmZKEMgAAAAAAAAAAAAAAAAAAAADGwrs2w7yr8eHd1f///////v7+
+ //7+/f/9/f3//fz8//z8+//8/Pr/+/v6//v7+f/6+vj/+vn4//n59//5+Pb/+Pj1//f39P/39vP/9vXy
+ //Tz7//z8u7/8vHt//Lx7f/s6uP/1tDA/7Cmj++YkYMwAAAAAAAAAAAAAAAAAAAAAMbDvDbDvKvx4dzU
+ /////v/9/Pz//Pz7//z8+//7+/r/+/v5//v6+f/6+fj/+vn3//n49v/4+PX/+Pf0//f28//29vL/9vXx
+ //X08P/y8ez/8fDq//Dv6f/w7un/7+7o/+nn3//Uz77/rqSM7ZiRgi4AAAAAAAAAAAAAAAAAAAAAyMS9
+ NsO8q/Hg29P//v79//v7+v/7+/n/+/r5//r6+P/6+ff/+fn2//n49v/4+PX/9/f0//f28//29fL/9fXx
+ //X08P/z8u7/8O/p/+7t5//u7Ob/7ezl/+3r5P/s6+T/5+Tb/9PNvP+soontl4+BLgAAAAAAAAAAAAAA
+ AAAAAADJxL42w7yr8eDb0v/9/fz/+/r5//r6+P/6+ff/+fn3//n49v/4+PX/9/f0//f28//29fL/9fTx
+ //T08P/08+//8vHs/+7t5v/s6uP/7Ori/+vp4f/q6eH/6ujg/+no4P/j4db/0cu6/6qfhuuWj4AsAAAA
+ AAAAAAAAAAAAAAAAAMrGvzbEvKvx39rR//z8+//6+vj/+fn3//n49v/4+PX/9/f0//f28//29fL/9fXx
+ //X08P/08+//8/Lu//Hv6v/s6uP/6ujg/+nn3//p597/6Obd/+jm3f/n5dz/5+Xc/+De0v/Pybj/qJ2E
+ 65aOfyoAAAAAAAAAAAAAAAAAAAAAy8fANsS8q/He2tD//Pv6//n59//5+Pb/+Pf1//j39P/39vP/9vXy
+ //X18f/09PD/9PPv//Py7f/u7eb/6eff/+fm3P/n5dz/5uXb/+bk2v/l49n/5ePY/+Ti2P/k4tf/3drO
+ /83Htf+lmoHrlY1+KgAAAAAAAAAAAAAAAAAAAADMyMA2xLyr8d7Z0P/7+/n/+fj2//j39f/39/T/9/bz
+ //b18v/19fH/9fTw//Tz7//x8Or/6+nh/+bk2v/l49n/5ePZ/+Ti2P/k4df/4+HW/+Lg1f/i4NX/4uDU
+ /+Lf1f/b2Mv/zMWz/6SYf+mVjX4qAAAAAAAAAAAAAAAAAAAAAMzIwTbEvKvx3tnP//v7+f/4+PX/+Pf0
+ //f28//29fL/9fXx//X08P/z8u3/7evk/+bk2v/j4db/4+HW/+Lg1f/i4NX/4uDU/+Lg1P/h39P/393R
+ /9zZzP/W0sP/z8m4/8S8qP/Gvqv/opZ96ZSMfSgAAAAAAAAAAAAAAAAAAAAAzcnCNsS8q/Hd2c//+/r4
+ //j39f/39/T/9/bz//b18v/08+//7u3n/+bk2//i4NX/4t/U/+Lg1P/i39P/4N3R/9vXyv/TzsD/ysSz
+ /7+4pf+3rpn/sqiQ/7Gmjf+xp43/raGG/8C2of+glHvnlIt8KAAAAAAAAAAAAAAAAAAAAADOysM2xLyr
+ 8d3Zz//7+vj/+Pf1//f39P/29fH/8O7p/+jm3f/i4NT/393R/9vYy//Uz8D/yMKx/7yzoP+xp5H/qp+G
+ /6qcgf+rn4P/tKOC/7ulff/BsY3/xJ1a/87Bof/Nxq7/w7mk/56ReOeUi3wmAAAAAAAAAAAAAAAAAAAA
+ AM/LxDbEvKvx3tnP//z8+//49/T/7+7o/+Lf1f/V0MH/ycKx/721oP+xp5D/qZ6E/6ebgf+pnoT/sKaN
+ /7mxmP/CuqH/xqJj/8eocP/MsH3/x59Z/9XAnP/Homn/3c+x/97Xwv/FvKf/l4pv45aNgCIAAAAAAAAA
+ AAAAAAAAAAAA0czFNsO7qvHRyr3/2tXK/8K7qf+yqJH/qZ2E/6abgP+pnoP/sKeM/7mxmP/DvKT/zMav
+ /9XQuf/c2MH/49/J/+bgyf/Ps4f/zraO/9rMtP/KuJv/1s25/8i7pv/Iv6v/y8Kv/7Gmjv+MfmS5paGe
+ DAAAAAAAAAAAAAAAAAAAAADQy8Q2yMGx8a6jjP+0q5P/urKb/8C5ov/Gv6j/zciw/9bRuv/d2cL/5ODK
+ /+rm0f/u6tb/7+vY/+3p1//o49L/4NvK/9HHtv/LwrD/zMSz/8e/rv/Du6n/wLel/7qwnf+rn4j/jX5j
+ 3ZOIdkIAAAAAAAAAAAAAAAAAAAAAAAAAAMvFvTbb18rx4+HU/+fk1//q59r/7OnZ/+7r2f/w7Nn/8e3b
+ /+/r2//r5tf/5eDR/9zWyP/Uzr//zse3/8nCsf/Du6n/vbSg/7Splf+pnYb9oJN78ZmMdN2Thm69j4Fq
+ mYx+aHCVi3ssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMO7NuHd0vH5+PH/+vny//n38P/08un/7One
+ /+Ld0P/X0cP/0cq6/8rCsv/Cuqf/ua+b/7ClkP+mmoP5nI5255OFbMuOgGerinxlg4h6ZFqKfWk2koh6
+ HKKdmgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAua8m1tHE4+7r4//u7OX/49/V
+ /9TOwP/Gvav/t62Y/6ygiv2jl3/vm4112ZSGbbuPgGiVjn9oapCDbkaUiHgonpSKEMbGzAIAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALexswK8tKZoua+d
+ 3aygifOhk3rlmoxzyZaHbqWUhW5+k4VvVpeKdjSglogYubSyCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AKmgnQKfk4MgmIp1OJ+Tgiavp54O2trfAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAP////////8H///4A///gAH//AAA/8AAAP4AAAPgAAADwAAAA+AAAAPAAAADwAAA
+ A8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAfAAAAPwAAA
+ f8AAD//AA///4H//////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAwrKikeLiwr
+ HgAAAAwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAABh0dHBZhX1o0kI2FYLCsoZfEwbXHvLirx3FtY2AAAAAUAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDg4ODlVUUSiIhX5QqKWahb+7r7nRzcDj4N3R
+ +ezp4f/08uz/4d3P/62nlMcXFhUuAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgQIR0dF
+ HIF+eECinpRyuLOnq8jDttfX0sb15OHX//Du5//5+PT//v79///////+/v3/49/S/7ewm9E+PDgiAAAA
+ AgAAAAAAAAAAAAAAAAAAAAQ5OTkUe3l0Mp2ZkGKxrKCZv7qsy8zHue3a1cn95+Tc//Py7f/7+/n////+
+ ///////////////////////+/v3/4t7R/7mynMuFgXcOAAAAAAAAAAAAAAAAWVhWFqail3S4saO9wrus
+ 5c7Iuvvc2M3/6+ji//f28//+/f3////////////////////////////+/v7//v79//39/P/7+/r/4NzP
+ /7evmcmMh30OAAAAAAAAAAAAAAAAwbuvcsW9rvvf29H/8O7q//v6+f///////////////////////v7+
+ //7+/v/9/f3//f38//z8+//7+/r/+vr5//n59//49/T/3tnL/7SslcmLhnwOAAAAAAAAAADDwsEKxL2u
+ weHd1f////////////7+/v/+/v7//v79//39/f/9/fz//Pz7//v7+v/7+vn/+vr4//n59//4+PX/9/bz
+ //b18f/08+//29bI/7KpksmLhnwMAAAAAAAAAADFwb4OxL2uy+fk3v///////v39//39/P/8/Pv//Pz6
+ //v7+v/6+vn/+vn3//n49v/49/X/9/f0//b28v/08+//8/Lt//Lx7P/w7+n/2dPE/7Cmj8eKhXsMAAAA
+ AAAAAADGxMAOxL6uy+fj3P/+/v3//Pz6//v7+v/7+vn/+vr4//n59//4+PX/9/f0//f28//29fL/9fTw
+ //Lx7P/v7uj/7+7n/+7t5v/s6uP/1tDB/62jjMWKhHoMAAAAAAAAAADIxcIOxb6uy+bi2//8/Pv/+/r4
+ //r59//5+Pb/+Pj1//f39P/39vP/9vXx//X08P/08u7/8O7p/+zr5P/s6uP/6+ni/+rp4f/o5t7/0829
+ /6qgicOJgnkKAAAAAAAAAADKyMQOxb6uy+Xh2f/7+/r/+fn3//j49v/49/T/9/bz//b18v/19PD/9PPv
+ //Lx7P/t7OX/6ujg/+nn3v/o5t3/5+Xc/+bk2//k4tj/0Mq5/6idhsOJgnkKAAAAAAAAAADMycYOxb6u
+ y+Tg2P/7+vn/+fj2//j39P/39vP/9vXx//X08P/08+7/8O/p/+no3//m5Nv/5ePa/+Xj2f/k4tj/5OHX
+ /+Ph1v/h39T/zce2/6abg8GJgnkKAAAAAAAAAADOysgOxb6uy+Tg2P/6+vj/+Pf1//f28//29fL/9fTw
+ //Lx7P/r6uL/5ePZ/+Ph1//j4db/4+HW/+Lg1P/g3dH/3NnM/9bSxP/Nx7b/xLyo/6SYgb+JgnoIAAAA
+ AAAAAADPzMkOxb6vy+Pg2P/6+vf/+Pf0//f28//08+//7ezl/+bk2v/i4NX/4N3R/9vXyv/Tzr//ycOy
+ /8C5pv+6sJr/tqyT/7eoif+2rJL/u7CZ/6KWfr+JgnoIAAAAAAAAAADRzswOxr6vy+Tg2P/7+/n/9vXy
+ /+zr5P/f3NH/08/A/8jCsP++tqL/tauV/7Cmjv+wp47/tqF5/7umfv/Bo2z/ybGF/8mma//c07r/xbym
+ /52Reb2MhX4IAAAAAAAAAADU0c8Oxb2ty9XPw//Y08f/w7up/7Wslf+vpY3/sKaN/7atk/+/t57/y8Ss
+ /9bQuf/f2sX/0rmO/9C5j//PuZb/0sSp/8q8ov/QyLT/uK6X/5GEa5kAAAAAAAAAAAAAAADPy8cOy8W2
+ y761of/Cu6b/x8Cq/83HsP/X0rv/4dzG/+jkz//r59T/6uXT/+bhz//f2cj/0ci3/8nArv/Du6n/vLKf
+ /7Wrl/2soYvxlYhvv4+DcCwAAAAAAAAAAAAAAADAubMO3trPy/Du5P/08uj/9PHm//Dt3//q5db/4t3O
+ /9rUxP/PyLj/xbyq/7qwnf+wpZD3qJyG5Z+TfMuXinKnk4ZugY+CbFiMf2k0kIV2EgAAAAAAAAAAAAAA
+ AAAAAAC1rqYK2NPHve7r5P/q59//2tXJ/8nBsf+6sJz9r6SP76eahNmekXm5mIpyk5OEbWqMfmdEiXxn
+ JIh8bRCEfHsCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvrapQretm7monIXHoJJ7
+ pZqMdHqVh29UkoRuMpKFchiUiH4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCBcAiVh3cMopiVAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD//4EA//wBAP/AAAD+AAAA4AABAMAAAQDAAAEAgAAB
+ AIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAADAIAAAwCAAAcAgAB/AMAf/wDj//8A////
+ ACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJBltZUxyRjoRCsq6keLWxpZNraF86AAAABAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAk5MSBKJhn00qaWaZsG9sZ/U0cfR5ePb8fLx7P/l4tf/o56MlwAAAAwAAAAAAAAA
+ AEZGRAiDf3cmoZ2RVLaxpY3JxLnD29fN6ero4f329fH//fz7////////////6ebc/7ewnJMAAAAAAAAA
+ AKGdkyS5s6alzci8397b0vnu6+b/+fj2//7+/v////////////7+/v/9/fz//fz8/+bi2P+4sJuPAAAA
+ AAAAAADEva944t7W//z8+/////////////7+/v/9/fz//Pz7//v7+f/6+ff/+Pf1//f28//h3dL/tKyW
+ jQAAAAAAAAAAx8Cyj+3r5v/+/v7//Pz7//v7+v/6+vj/+fn3//j49f/39vP/9fTw//Lx7P/x8Ov/3djL
+ /7GokosAAAAAAAAAAMfAso/r6eP//Pz7//r6+P/5+Pb/+Pf0//b28v/19PH/8vHs/+7s5v/s6uP/6+ri
+ /9jTxf+upI6JAAAAAAAAAADIwbKP6ufh//r6+P/4+PX/9/bz//b18f/08+7/7+3n/+no3//n5t3/5+Xb
+ /+bk2//Tzr//qqCKiQAAAAAAAAAAyMGyj+nn4P/5+ff/9/bz//b18f/x8Ov/6ung/+Xj2f/j4df/4d7T
+ /9zZzf/W0sX/x8Cu/6echocAAAAAAAAAAMjBs4/q5+H/+vr3//Tz7v/p59//3drO/9PPwP/KxbT/w7qk
+ /76yl/++ro3/wbCN/760nf+kmYKFAAAAAAAAAADHwLGP2tXK/9fSxv/Fv6z/vbWf/721nv/Cu6P/y8Wu
+ /8y7l//Ls4n/zbiS/86+n//Bt6H/mo11cAAAAAAAAAAA0Mu9j9HLuv/Uz7z/2NO//9/axv/i3cr/39nH
+ /9fRv//Jv6z/vLKd97Wrl+WupJDJn5J7lY6BaxoAAAAAAAAAANvWzIXr6d//49/T/9LLu/vDuqjtt62a
+ 162ijbekl4KRm494ZpOGb0KLfWYkgXNfDmBRQAIAAAAAAAAAAAAAAADDu64kuK6cg6mdh3iekXpQlYdv
+ MIx9ZhZ1ZVAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//MAAP+AAAD4AAAAwAEA
+ AIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIADAACA/wAA//8AAA==
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs
new file mode 100644
index 00000000..89fbbc7d
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs
@@ -0,0 +1,57 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace WebsitePanel.Installer.Common
+{
+ internal class AppContext
+ {
+ private ApplicationForm appForm;
+ private ScopeNode scopeNode;
+
+ public ApplicationForm AppForm
+ {
+ get { return appForm; }
+ set { appForm = value; }
+ }
+
+ public ScopeNode ScopeNode
+ {
+ get { return scopeNode; }
+ set { scopeNode = value; }
+ }
+
+ public string CurrentPath
+ {
+ get { return FileUtils.GetCurrentDirectory(); }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs
new file mode 100644
index 00000000..c03f3e98
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs
@@ -0,0 +1,66 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Windows.Forms;
+using System.Collections.Generic;
+using System.Text;
+
+namespace WebsitePanel.Installer.Common
+{
+ internal class ProgressManager
+ {
+ private Form form;
+ private ToolStripStatusLabel label;
+ private Cursor cursor;
+
+ public ProgressManager(Form form, ToolStripStatusLabel label)
+ {
+ this.form = form;
+ this.label = label;
+ }
+
+ public void StartProgress(string title)
+ {
+ cursor = form.Cursor;
+ form.Cursor = Cursors.WaitCursor;
+ label.Text = title;
+ if (label.Owner != null)
+ label.Owner.Refresh();
+ }
+
+ public void FinishProgress()
+ {
+ form.Cursor = cursor;
+ label.Text = "Ready";
+ if ( label.Owner != null )
+ label.Owner.Refresh();
+ }
+ }
+
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs
new file mode 100644
index 00000000..c0a1f98a
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs
@@ -0,0 +1,98 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Collections.Generic;
+using System.Text;
+using WebsitePanel.Installer.Controls;
+
+namespace WebsitePanel.Installer.Common
+{
+ internal enum NodeType
+ {
+ Servers,
+ Server,
+ Components,
+ Component,
+ Module,
+ Settings,
+ Service
+ };
+
+ internal class ScopeNode : TreeNode
+ {
+ private bool populated;
+ private Icon largeIcon;
+ private Icon smallIcon;
+ private ResultViewControl resultView;
+ private NodeType nodeType;
+ private object dataObject;
+
+ public ScopeNode()
+ {
+ }
+
+ public bool Populated
+ {
+ get { return populated; }
+ set { populated = value; }
+ }
+
+ public Icon LargeIcon
+ {
+ get { return largeIcon; }
+ set { largeIcon = value; }
+ }
+
+ public Icon SmallIcon
+ {
+ get { return smallIcon; }
+ set { smallIcon = value; }
+ }
+
+ public ResultViewControl ResultView
+ {
+ get { return resultView; }
+ set { resultView = value; }
+ }
+
+ public NodeType NodeType
+ {
+ get { return nodeType; }
+ set { nodeType = value; }
+ }
+
+ public object DataObject
+ {
+ get { return dataObject; }
+ set { dataObject = value; }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs
new file mode 100644
index 00000000..ffef6e32
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs
@@ -0,0 +1,54 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace WebsitePanel.Installer.Common
+{
+ internal sealed class User32
+ {
+ ///
+ /// Win32 API Constants for ShowWindowAsync()
+ ///
+ internal const int SW_HIDE = 0;
+ internal const int SW_SHOWNORMAL = 1;
+ internal const int SW_SHOWMINIMIZED = 2;
+ internal const int SW_SHOWMAXIMIZED = 3;
+ internal const int SW_SHOWNOACTIVATE = 4;
+ internal const int SW_RESTORE = 9;
+ internal const int SW_SHOWDEFAULT = 10;
+
+ [DllImport("user32.dll")]
+ internal static extern bool SetForegroundWindow(IntPtr hWnd);
+ [DllImport("user32.dll")]
+ internal static extern bool IsIconic(IntPtr hWnd);
+ [DllImport("user32.dll")]
+ internal static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs
new file mode 100644
index 00000000..d94f9863
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs
@@ -0,0 +1,65 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.IO;
+using System.Windows.Forms;
+using System.Configuration;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+using System.DirectoryServices;
+using System.DirectoryServices.ActiveDirectory;
+
+using System.Security.Principal;
+using System.Security;
+using System.Security.Permissions;
+using System.Runtime.InteropServices;
+using System.Threading;
+using WebsitePanel.Installer.Core;
+
+namespace WebsitePanel.Installer.Common
+{
+ public static class UiUtils
+ {
+ public static void ShowRunningInstance()
+ {
+ Process currentProcess = Process.GetCurrentProcess();
+ foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
+ {
+ if (process.Id != currentProcess.Id)
+ {
+ //set focus
+ User32.SetForegroundWindow(process.MainWindowHandle);
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs
new file mode 100644
index 00000000..323cce2f
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs
@@ -0,0 +1,213 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class ComponentControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentControl));
+ this.grpInfo = new System.Windows.Forms.GroupBox();
+ this.txtVersion = new System.Windows.Forms.TextBox();
+ this.lblVersion = new System.Windows.Forms.Label();
+ this.txtComponent = new System.Windows.Forms.TextBox();
+ this.lblComponent = new System.Windows.Forms.Label();
+ this.txtApplication = new System.Windows.Forms.TextBox();
+ this.lblApplication = new System.Windows.Forms.Label();
+ this.grpDescription = new System.Windows.Forms.GroupBox();
+ this.lblDescription = new System.Windows.Forms.Label();
+ this.btnCheckUpdate = new System.Windows.Forms.Button();
+ this.btnSettings = new System.Windows.Forms.Button();
+ this.btnRemove = new System.Windows.Forms.Button();
+ this.grpInfo.SuspendLayout();
+ this.grpDescription.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpInfo
+ //
+ this.grpInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpInfo.Controls.Add(this.txtVersion);
+ this.grpInfo.Controls.Add(this.lblVersion);
+ this.grpInfo.Controls.Add(this.txtComponent);
+ this.grpInfo.Controls.Add(this.lblComponent);
+ this.grpInfo.Controls.Add(this.txtApplication);
+ this.grpInfo.Controls.Add(this.lblApplication);
+ this.grpInfo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpInfo.Location = new System.Drawing.Point(14, 43);
+ this.grpInfo.Name = "grpInfo";
+ this.grpInfo.Size = new System.Drawing.Size(379, 122);
+ this.grpInfo.TabIndex = 3;
+ this.grpInfo.TabStop = false;
+ this.grpInfo.Text = "Summary";
+ //
+ // txtVersion
+ //
+ this.txtVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtVersion.Location = new System.Drawing.Point(122, 82);
+ this.txtVersion.Name = "txtVersion";
+ this.txtVersion.ReadOnly = true;
+ this.txtVersion.Size = new System.Drawing.Size(234, 21);
+ this.txtVersion.TabIndex = 5;
+ //
+ // lblVersion
+ //
+ this.lblVersion.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblVersion.Location = new System.Drawing.Point(16, 82);
+ this.lblVersion.Name = "lblVersion";
+ this.lblVersion.Size = new System.Drawing.Size(100, 21);
+ this.lblVersion.TabIndex = 4;
+ this.lblVersion.Text = "Version";
+ //
+ // txtComponent
+ //
+ this.txtComponent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtComponent.Location = new System.Drawing.Point(122, 55);
+ this.txtComponent.Name = "txtComponent";
+ this.txtComponent.ReadOnly = true;
+ this.txtComponent.Size = new System.Drawing.Size(234, 21);
+ this.txtComponent.TabIndex = 3;
+ //
+ // lblComponent
+ //
+ this.lblComponent.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblComponent.Location = new System.Drawing.Point(16, 55);
+ this.lblComponent.Name = "lblComponent";
+ this.lblComponent.Size = new System.Drawing.Size(100, 21);
+ this.lblComponent.TabIndex = 2;
+ this.lblComponent.Text = "Component";
+ //
+ // txtApplication
+ //
+ this.txtApplication.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtApplication.Location = new System.Drawing.Point(122, 28);
+ this.txtApplication.Name = "txtApplication";
+ this.txtApplication.ReadOnly = true;
+ this.txtApplication.Size = new System.Drawing.Size(234, 21);
+ this.txtApplication.TabIndex = 1;
+ //
+ // lblApplication
+ //
+ this.lblApplication.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblApplication.Location = new System.Drawing.Point(16, 28);
+ this.lblApplication.Name = "lblApplication";
+ this.lblApplication.Size = new System.Drawing.Size(100, 21);
+ this.lblApplication.TabIndex = 0;
+ this.lblApplication.Text = "Application";
+ //
+ // grpDescription
+ //
+ this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpDescription.Controls.Add(this.lblDescription);
+ this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpDescription.Location = new System.Drawing.Point(14, 171);
+ this.grpDescription.Name = "grpDescription";
+ this.grpDescription.Size = new System.Drawing.Size(379, 117);
+ this.grpDescription.TabIndex = 4;
+ this.grpDescription.TabStop = false;
+ this.grpDescription.Text = "Description";
+ //
+ // lblDescription
+ //
+ this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.lblDescription.Location = new System.Drawing.Point(3, 17);
+ this.lblDescription.Name = "lblDescription";
+ this.lblDescription.Size = new System.Drawing.Size(373, 97);
+ this.lblDescription.TabIndex = 0;
+ //
+ // btnCheckUpdate
+ //
+ this.btnCheckUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnCheckUpdate.Image")));
+ this.btnCheckUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCheckUpdate.Location = new System.Drawing.Point(14, 9);
+ this.btnCheckUpdate.Name = "btnCheckUpdate";
+ this.btnCheckUpdate.Size = new System.Drawing.Size(128, 28);
+ this.btnCheckUpdate.TabIndex = 0;
+ this.btnCheckUpdate.Text = " &Check For Updates";
+ this.btnCheckUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+ this.btnCheckUpdate.UseVisualStyleBackColor = true;
+ this.btnCheckUpdate.Click += new System.EventHandler(this.OnCheckUpdateClick);
+ //
+ // btnSettings
+ //
+ this.btnSettings.Image = ((System.Drawing.Image)(resources.GetObject("btnSettings.Image")));
+ this.btnSettings.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnSettings.Location = new System.Drawing.Point(262, 9);
+ this.btnSettings.Name = "btnSettings";
+ this.btnSettings.Size = new System.Drawing.Size(108, 28);
+ this.btnSettings.TabIndex = 2;
+ this.btnSettings.Text = "&Settings";
+ this.btnSettings.UseVisualStyleBackColor = true;
+ this.btnSettings.Click += new System.EventHandler(this.OnSettingsClick);
+ //
+ // btnRemove
+ //
+ this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image")));
+ this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnRemove.Location = new System.Drawing.Point(148, 9);
+ this.btnRemove.Name = "btnRemove";
+ this.btnRemove.Size = new System.Drawing.Size(108, 28);
+ this.btnRemove.TabIndex = 1;
+ this.btnRemove.Text = "&Uninstall";
+ this.btnRemove.Click += new System.EventHandler(this.OnRemoveClick);
+ //
+ // ComponentControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.grpDescription);
+ this.Controls.Add(this.grpInfo);
+ this.Controls.Add(this.btnCheckUpdate);
+ this.Controls.Add(this.btnSettings);
+ this.Controls.Add(this.btnRemove);
+ this.Name = "ComponentControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpInfo.ResumeLayout(false);
+ this.grpInfo.PerformLayout();
+ this.grpDescription.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnRemove;
+ private System.Windows.Forms.Button btnSettings;
+ private System.Windows.Forms.Button btnCheckUpdate;
+ private System.Windows.Forms.GroupBox grpInfo;
+ private System.Windows.Forms.TextBox txtVersion;
+ private System.Windows.Forms.Label lblVersion;
+ private System.Windows.Forms.TextBox txtComponent;
+ private System.Windows.Forms.Label lblComponent;
+ private System.Windows.Forms.TextBox txtApplication;
+ private System.Windows.Forms.Label lblApplication;
+ private System.Windows.Forms.GroupBox grpDescription;
+ private System.Windows.Forms.Label lblDescription;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs
new file mode 100644
index 00000000..2420e91a
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs
@@ -0,0 +1,393 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Threading;
+using System.IO;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+using WebsitePanel.Installer.Common;
+using WebsitePanel.Installer.Services;
+using WebsitePanel.Installer.Core;
+using WebsitePanel.Installer.Configuration;
+
+namespace WebsitePanel.Installer.Controls
+{
+ ///
+ /// Component control
+ ///
+ internal partial class ComponentControl : ResultViewControl
+ {
+ delegate void ReloadApplicationCallback();
+
+ ///
+ /// Initializes a new instance of the ComponentControl class.
+ ///
+ public ComponentControl()
+ {
+ InitializeComponent();
+ }
+
+ ///
+ /// Shows control
+ ///
+ ///
+ public override void ShowControl(AppContext context)
+ {
+ base.ShowControl(context);
+ if (!IsInitialized)
+ {
+ ComponentConfigElement element = context.ScopeNode.Tag as ComponentConfigElement;
+ if (element != null)
+ {
+ txtApplication.Text = element.GetStringSetting("ApplicationName");
+ txtComponent.Text = element.GetStringSetting("ComponentName");
+ txtVersion.Text = element.GetStringSetting("Release");
+ lblDescription.Text = element.GetStringSetting("ComponentDescription");
+
+ string installer = element.GetStringSetting("Installer");
+ string path = element.GetStringSetting("InstallerPath");
+ string type = element.GetStringSetting("InstallerType");
+ if ( string.IsNullOrEmpty(installer) ||
+ string.IsNullOrEmpty(path) ||
+ string.IsNullOrEmpty(type))
+ {
+ btnRemove.Enabled = false;
+ btnSettings.Enabled = false;
+ }
+ }
+ IsInitialized = true;
+ }
+ }
+
+ ///
+ /// Action on Remove button click
+ ///
+ ///
+ ///
+ private void OnRemoveClick(object sender, EventArgs e)
+ {
+ UninstallComponent();
+ }
+
+ ///
+ /// Action on Settings button click
+ ///
+ ///
+ ///
+ private void OnSettingsClick(object sender, EventArgs e)
+ {
+ SetupComponent();
+ }
+
+ ///
+ /// Action on Check For Update button click
+ ///
+ ///
+ ///
+ private void OnCheckUpdateClick(object sender, EventArgs e)
+ {
+ //start check in the separate thread
+ AppContext.AppForm.StartAsyncProgress("Connecting...", true);
+ ThreadStart threadDelegate = new ThreadStart(CheckForUpdate);
+ Thread newThread = new Thread(threadDelegate);
+ newThread.Start();
+ }
+
+ ///
+ /// Checks for component update
+ ///
+ private void CheckForUpdate()
+ {
+ Log.WriteStart("Checking for component update");
+ ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
+
+ string componentName = element.GetStringSetting("ComponentName");
+ string componentCode = element.GetStringSetting("ComponentCode");
+ string release = element.GetStringSetting("Release");
+
+ // call web service
+ DataSet ds;
+ try
+ {
+ Log.WriteInfo(string.Format("Checking {0} {1}", componentName, release));
+ //
+ var webService = ServiceProviderProxy.GetInstallerWebService();
+ ds = webService.GetComponentUpdate(componentCode, release);
+ //
+ Log.WriteEnd("Component update checked");
+ AppContext.AppForm.FinishProgress();
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Service error", ex);
+ AppContext.AppForm.FinishProgress();
+ AppContext.AppForm.ShowServerError();
+ return;
+ }
+
+ string appName = AppContext.AppForm.Text;
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ DataRow row = ds.Tables[0].Rows[0];
+ string newVersion = row["Version"].ToString();
+ Log.WriteInfo(string.Format("Version {0} is available for download", newVersion));
+
+ string message = string.Format("{0} {1} is available now.\nWould you like to install new version?", componentName, newVersion);
+ if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
+ {
+ string fileToDownload = row["UpgradeFilePath"].ToString();
+ string installerPath = row["InstallerPath"].ToString();
+ string installerType = row["InstallerType"].ToString();
+ UpdateComponent(fileToDownload, installerPath, installerType, newVersion);
+ }
+ }
+ else
+ {
+ string message = string.Format("Current version of {0} is up to date.", componentName);
+ Log.WriteInfo(message);
+ AppContext.AppForm.ShowInfo(message);
+ }
+ }
+
+ delegate void UpdateComponentCallback(string fileName, string path, string type, string version);
+
+ ///
+ /// Runs component update
+ ///
+ ///
+ ///
+ ///
+ private void UpdateComponent(string fileName, string path, string type, string version)
+ {
+ // InvokeRequired required compares the thread ID of the
+ // calling thread to the thread ID of the creating thread.
+ // If these threads are different, it returns true.
+ if (this.InvokeRequired)
+ {
+ UpdateComponentCallback callBack = new UpdateComponentCallback(UpdateComponent);
+ Invoke(callBack, new object[] { fileName, path, type, version });
+ }
+ else
+ {
+ Log.WriteStart("Updating component");
+
+ ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
+ string componentId = element.ID;
+ string componentName = element.GetStringSetting("ComponentName");
+
+ try
+ {
+ Log.WriteInfo(string.Format("Updating {0}", componentName));
+ //download installer
+ Loader form = new Loader(this.AppContext, fileName);
+ DialogResult result = form.ShowDialog(this);
+ if (result == DialogResult.OK)
+ {
+ //run installer
+ string tmpFolder = FileUtils.GetTempDirectory();
+ string installerPath = Path.Combine(tmpFolder, path);
+ Update();
+ string method = "Update";
+ Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
+ Hashtable args = new Hashtable();
+ args["ComponentId"] = componentId;
+ args["ShellVersion"] = AppContext.AppForm.Version;
+ args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
+ args["UpdateVersion"] = version;
+ args["Installer"] = Path.GetFileName(fileName);
+ args["InstallerType"] = type;
+ args["InstallerPath"] = path;
+ args["InstallerFolder"] = tmpFolder;
+ args["IISVersion"] = Global.IISVersion;
+ args["ParentForm"] = FindForm();
+
+ result = (DialogResult)AssemblyLoader.Execute(installerPath, type, method, new object[] { args });
+ Log.WriteInfo(string.Format("Installer returned {0}", result));
+ Log.WriteEnd("Installer finished");
+ Update();
+ if (result == DialogResult.OK)
+ {
+ ReloadApplication();
+ }
+ FileUtils.DeleteTempDirectory();
+ }
+ Log.WriteEnd("Update completed");
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Installer error", ex);
+ AppContext.AppForm.ShowError(ex);
+ }
+ }
+ }
+
+ ///
+ /// Uninstalls component
+ ///
+ private void UninstallComponent()
+ {
+ Log.WriteStart("Uninstalling component");
+
+ ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
+ string installer = element.GetStringSetting(Global.Parameters.Installer);
+ string path = element.GetStringSetting(Global.Parameters.InstallerPath);
+ string type = element.GetStringSetting(Global.Parameters.InstallerType);
+ string componentId = element.ID;
+ string componentCode = element.GetStringSetting(Global.Parameters.ComponentCode);
+ string componentName = element.GetStringSetting(Global.Parameters.ComponentName);
+ string release = element.GetStringSetting(Global.Parameters.Release);
+
+ try
+ {
+ Log.WriteInfo(string.Format("Uninstalling {0}", componentName));
+ //download installer
+ Loader form = new Loader(this.AppContext, installer, componentCode, release);
+ DialogResult result = form.ShowDialog(this);
+ if (result == DialogResult.OK)
+ {
+ //run installer
+ string tmpFolder = FileUtils.GetTempDirectory();
+ path = Path.Combine(tmpFolder, path);
+ Update();
+ string method = "Uninstall";
+ //
+ Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
+ //
+ var args = new Hashtable
+ {
+ { Global.Parameters.ComponentId, componentId },
+ { Global.Parameters.ComponentCode, componentCode },
+ { Global.Parameters.ShellVersion, AppContext.AppForm.Version },
+ { Global.Parameters.BaseDirectory, FileUtils.GetCurrentDirectory() },
+ { Global.Parameters.IISVersion, Global.IISVersion },
+ { Global.Parameters.ParentForm, FindForm() },
+ };
+ //
+ result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
+ //
+ Log.WriteInfo(string.Format("Installer returned {0}", result));
+ Log.WriteEnd("Installer finished");
+ Update();
+ ReloadApplication();
+ FileUtils.DeleteTempDirectory();
+
+ }
+ Log.WriteEnd("Uninstall completed");
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Installer error", ex);
+ AppContext.AppForm.ShowError(ex);
+ }
+ }
+
+ ///
+ /// Setup component
+ ///
+ private void SetupComponent()
+ {
+ Log.WriteStart("Starting component setup");
+
+ var element = AppContext.ScopeNode.Tag as ComponentConfigElement;
+
+ string installer = element.GetStringSetting("Installer");
+ string path = element.GetStringSetting("InstallerPath");
+ string type = element.GetStringSetting("InstallerType");
+ string componentId = element.ID;
+ string componentCode = element.GetStringSetting("ComponentCode");
+ string componentName = element.GetStringSetting("ComponentName");
+ string release = element.GetStringSetting("Release");
+
+ try
+ {
+ Log.WriteInfo(string.Format("Setup {0} {1}", componentName, release));
+ //download installer
+ Loader form = new Loader(this.AppContext, installer, componentCode, release);
+ DialogResult result = form.ShowDialog(this);
+ if (result == DialogResult.OK)
+ {
+ string tmpFolder = Path.Combine(AppContext.CurrentPath, "Tmp");
+ path = Path.Combine(tmpFolder, path);
+ Update();
+ string method = "Setup";
+ Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
+ Hashtable args = new Hashtable();
+ args["ComponentId"] = componentId;
+ args["ShellVersion"] = AppContext.AppForm.Version;
+ args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
+ args["IISVersion"] = Global.IISVersion;
+ args["ParentForm"] = FindForm();
+ args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
+ //
+ result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
+ //
+ Log.WriteInfo(string.Format("Installer returned {0}", result));
+ Log.WriteEnd("Installer finished");
+
+ if (result == DialogResult.OK)
+ {
+ ReloadApplication();
+ }
+ FileUtils.DeleteTempDirectory();
+ }
+ Log.WriteEnd("Component setup completed");
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Installer error", ex);
+ this.AppContext.AppForm.ShowError(ex);
+ }
+ }
+
+ ///
+ /// Thread safe application reload
+ ///
+ private void ReloadApplication()
+ {
+ // InvokeRequired required compares the thread ID of the
+ // calling thread to the thread ID of the creating thread.
+ // If these threads are different, it returns true.
+ if (this.InvokeRequired)
+ {
+ ReloadApplicationCallback callback = new ReloadApplicationCallback(ReloadApplication);
+ Invoke(callback, null);
+ }
+ else
+ {
+ AppContext.AppForm.ReloadApplication();
+ }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx
new file mode 100644
index 00000000..9e393425
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI
+ k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0
+ MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh
+ /Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV
+ wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS
+ eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3
+ 3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2
+ A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG
+ IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH
+ COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn
+ jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ
+ EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC
+ ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I
+ u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy
+ W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV
+ gSO8kwAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYZJREFUOE+lU8tK
+ AlEYdhf0FNUbtKo3aNcL1APUIwTtctHOCtQSallkG3cSBUUXEBkhKTWNbmIkrmbOnJkzOpev/wyOzGiQ
+ 5Bk+Bob5bv/PicUmPYm9NCZBTJIf6x9/Ym1j1/8n/JZcX6ColP6FgQBCxwM9ngfXdWE7DjbLTawX32BZ
+ FoQpYBgGOOfQdd2v7if4VYDIh402Fi4qSFRaEMKCaZokQGSug+lsVCDs/vClYvZUweplDZYQMIUkk7vO
+ wRgJaNqoQIdbYKILx3GxfFLCTOoOtY5K7jK6OYjOGIM2LOBRj5WjWyzuXGE7V8DUVh7Jmxdyp+gDdx26
+ TyaoajSBHFwmX8AcEafj51hKXoNx0ydn9s+QSUtkcSCRykKNCJC9FHhuNKC8fmM+nsPxfdXvbtDgOJfd
+ qXc/uqZqUYFgbc16C5+NJp7KVSjv7X73/toCMnWX7pEEnkt7p8HZto1urwerSzuXkzcl2fB3HrgH5IjA
+ RHdBXkZawAiGv491acNCYxHopx/g8N5q3Wv/UAAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAmpJREFUOE99kl1P
+ 01AYx4eJmhj9Bt557f0u/QTe7UN4ZbiRK++8MyaGEEwUEgnIS8db5F26dQy2udVuK7jRlm5gC6wr29qN
+ zZa15E9bZYEAO8k/5zwn5/97nnOe0wPAd3VkeClg2+c+y5Ft2z7TNHx22/L13OvxPXxw3/fo8RPZ//zZ
+ z47HBbgK04I/uJYgIukCqKwMipURSu9jKc5hlmIRJDOYDqUxF2akFSpOXPo8swdgCgE6VwBfaoE7bmFb
+ biJdrGFhM4eR7wl8mQ7j63wEVHIbCWbHsfzzdQCxvBIoljTwioHfR0YHQNJ7mKOyWI6mkWR5lCo6eEn9
+ cBOQK/sPlIYk6zZ2yxbyyn+V28g7KlYtqKcWGoYN4bAauAFwN5zSiYOKiYTYwq5iQqxY4NS2p+O6jZPG
+ Gep/LQhy5XZA/k+NCO1o6P3MORJA7xteZrcqWbOgG+eo1I27AYygEExBxyqr4dUAB5KteVmVhoWTpmM+
+ bUNrmtiT1Nsr+JWXiPmUCqnaxv6JgfezMpJiE9WGidrpGZqmjaNqq9PCa11wgyx/SCynVcQFp4qsjpdv
+ WbwbP/DuXXcer22dQy5rdwNciHjcAMUU8bqfxoteGiMLGeR4ESW1CsuyIUrl7oA8JyCyGUNoi8HaBgtq
+ I4rxySBi8QQ0XQe7K3YHjI59A0mSyGYzYBgGyRSNjWjUizmOw+JqqDtgYnLKA8RjW0ilUlhfX8fo2Bg+
+ DQ5ieHgYM/OL3QGLPzb9ZDhCcPxenOd5DA0Noa/vDT72DxBTwZlr5htduPye7ryyRj5dWl4JEMR0YHxi
+ stP3q2fc9QWwyhndJ+hSfwAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs
new file mode 100644
index 00000000..407a0c63
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs
@@ -0,0 +1,156 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class ComponentsControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentsControl));
+ this.grpDescription = new System.Windows.Forms.GroupBox();
+ this.lblDescription = new System.Windows.Forms.Label();
+ this.grdComponents = new System.Windows.Forms.DataGridView();
+ this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colLink = new System.Windows.Forms.DataGridViewLinkColumn();
+ this.btnLoadComponents = new System.Windows.Forms.Button();
+ this.grpDescription.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.grdComponents)).BeginInit();
+ this.SuspendLayout();
+ //
+ // grpDescription
+ //
+ this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpDescription.Controls.Add(this.lblDescription);
+ this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpDescription.Location = new System.Drawing.Point(14, 198);
+ this.grpDescription.Name = "grpDescription";
+ this.grpDescription.Size = new System.Drawing.Size(379, 117);
+ this.grpDescription.TabIndex = 2;
+ this.grpDescription.TabStop = false;
+ this.grpDescription.Text = "Description";
+ //
+ // lblDescription
+ //
+ this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.lblDescription.Location = new System.Drawing.Point(3, 17);
+ this.lblDescription.Name = "lblDescription";
+ this.lblDescription.Size = new System.Drawing.Size(373, 97);
+ this.lblDescription.TabIndex = 0;
+ //
+ // grdComponents
+ //
+ this.grdComponents.AllowUserToAddRows = false;
+ this.grdComponents.AllowUserToDeleteRows = false;
+ this.grdComponents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grdComponents.BackgroundColor = System.Drawing.SystemColors.Window;
+ this.grdComponents.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.grdComponents.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.colName,
+ this.colVersion,
+ this.colLink});
+ this.grdComponents.Location = new System.Drawing.Point(14, 43);
+ this.grdComponents.MultiSelect = false;
+ this.grdComponents.Name = "grdComponents";
+ this.grdComponents.ReadOnly = true;
+ this.grdComponents.RowHeadersWidth = 21;
+ this.grdComponents.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.grdComponents.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
+ this.grdComponents.Size = new System.Drawing.Size(379, 149);
+ this.grdComponents.TabIndex = 1;
+ this.grdComponents.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnRowEnter);
+ this.grdComponents.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnInstallLinkClick);
+ //
+ // colName
+ //
+ this.colName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.colName.DataPropertyName = "Component";
+ this.colName.HeaderText = "Component Name";
+ this.colName.Name = "colName";
+ this.colName.ReadOnly = true;
+ //
+ // colVersion
+ //
+ this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+ this.colVersion.DataPropertyName = "Version";
+ this.colVersion.HeaderText = "Version";
+ this.colVersion.Name = "colVersion";
+ this.colVersion.ReadOnly = true;
+ this.colVersion.Width = 67;
+ //
+ // colLink
+ //
+ this.colLink.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
+ this.colLink.DataPropertyName = "Id";
+ this.colLink.HeaderText = "";
+ this.colLink.Name = "colLink";
+ this.colLink.ReadOnly = true;
+ this.colLink.Resizable = System.Windows.Forms.DataGridViewTriState.False;
+ this.colLink.Text = "Install";
+ this.colLink.TrackVisitedState = false;
+ this.colLink.UseColumnTextForLinkValue = true;
+ this.colLink.Width = 5;
+ //
+ // btnLoadComponents
+ //
+ this.btnLoadComponents.Image = ((System.Drawing.Image)(resources.GetObject("btnLoadComponents.Image")));
+ this.btnLoadComponents.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnLoadComponents.Location = new System.Drawing.Point(14, 9);
+ this.btnLoadComponents.Name = "btnLoadComponents";
+ this.btnLoadComponents.Size = new System.Drawing.Size(170, 28);
+ this.btnLoadComponents.TabIndex = 0;
+ this.btnLoadComponents.Text = " &View Available Components";
+ this.btnLoadComponents.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+ this.btnLoadComponents.Click += new System.EventHandler(this.OnLoadComponentsClick);
+ //
+ // ComponentsControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.btnLoadComponents);
+ this.Controls.Add(this.grpDescription);
+ this.Controls.Add(this.grdComponents);
+ this.Name = "ComponentsControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpDescription.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.grdComponents)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpDescription;
+ private System.Windows.Forms.Label lblDescription;
+ private System.Windows.Forms.DataGridView grdComponents;
+ private System.Windows.Forms.Button btnLoadComponents;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colName;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colVersion;
+ private System.Windows.Forms.DataGridViewLinkColumn colLink;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs
new file mode 100644
index 00000000..2cfb8907
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs
@@ -0,0 +1,317 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.IO;
+using System.Threading;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+using WebsitePanel.Installer.Common;
+using WebsitePanel.Installer.Services;
+using WebsitePanel.Installer.Core;
+using WebsitePanel.Installer.Configuration;
+
+namespace WebsitePanel.Installer.Controls
+{
+ ///
+ /// Components control
+ ///
+ internal partial class ComponentsControl : ResultViewControl
+ {
+ delegate void SetGridDataSourceCallback(object dataSource, string dataMember);
+
+ private string componentCode = null;
+ private string componentVersion = null;
+ private string componentSettingsXml = null;
+
+ public ComponentsControl()
+ {
+ InitializeComponent();
+ grdComponents.AutoGenerateColumns = false;
+ }
+
+ ///
+ /// Action on click Install link
+ ///
+ ///
+ ///
+ private void OnInstallLinkClick(object sender, DataGridViewCellEventArgs e)
+ {
+ if (e.ColumnIndex == grdComponents.Columns.IndexOf(colLink))
+ {
+ DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView;
+ if (row != null)
+ {
+ StartInstaller(row);
+ StartLoadingComponents();
+ }
+ }
+ }
+
+ private void StartInstaller(DataRowView row)
+ {
+ string applicationName = Utils.GetDbString(row[Global.Parameters.ApplicationName]);
+ string componentName = Utils.GetDbString(row[Global.Parameters.ComponentName]);
+ string componentCode = Utils.GetDbString(row[Global.Parameters.ComponentCode]);
+ string componentDescription = Utils.GetDbString(row[Global.Parameters.ComponentDescription]);
+ string component = Utils.GetDbString(row[Global.Parameters.Component]);
+ string version = Utils.GetDbString(row[Global.Parameters.Version]);
+ string fileName = row[Global.Parameters.FullFilePath].ToString();
+ string installerPath = Utils.GetDbString(row[Global.Parameters.InstallerPath]);
+ string installerType = Utils.GetDbString(row[Global.Parameters.InstallerType]);
+
+ if (CheckForInstalledComponent(componentCode))
+ {
+ AppContext.AppForm.ShowWarning(Global.Messages.ComponentIsAlreadyInstalled);
+ return;
+ }
+ try
+ {
+ // download installer
+ Loader form = new Loader(this.AppContext, fileName);
+ DialogResult result = form.ShowDialog(this);
+
+ if (result == DialogResult.OK)
+ {
+ string tmpFolder = FileUtils.GetTempDirectory();
+ string path = Path.Combine(tmpFolder, installerPath);
+ Update();
+ string method = "Install";
+ Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", installerType, method, path));
+
+ //prepare installer args
+ Hashtable args = new Hashtable();
+
+ args[Global.Parameters.ComponentName] = componentName;
+ args[Global.Parameters.ApplicationName] = applicationName;
+ args[Global.Parameters.ComponentCode] = componentCode;
+ args[Global.Parameters.ComponentDescription] = componentDescription;
+ args[Global.Parameters.Version] = version;
+ args[Global.Parameters.InstallerFolder] = tmpFolder;
+ args[Global.Parameters.InstallerPath] = installerPath;
+ args[Global.Parameters.InstallerType] = installerType;
+ args[Global.Parameters.Installer] = Path.GetFileName(fileName);
+ args[Global.Parameters.ShellVersion] = AssemblyLoader.GetShellVersion();
+ args[Global.Parameters.BaseDirectory] = FileUtils.GetCurrentDirectory();
+ args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
+ args[Global.Parameters.IISVersion] = Global.IISVersion;
+ args[Global.Parameters.SetupXml] = this.componentSettingsXml;
+ args[Global.Parameters.ParentForm] = FindForm();
+
+ //run installer
+ DialogResult res = (DialogResult)AssemblyLoader.Execute(path, installerType, method, new object[] { args });
+ Log.WriteInfo(string.Format("Installer returned {0}", res));
+ Log.WriteEnd("Installer finished");
+ Update();
+ if (res == DialogResult.OK)
+ {
+ AppContext.AppForm.ReloadApplication();
+ }
+ FileUtils.DeleteTempDirectory();
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Installer error", ex);
+ AppContext.AppForm.ShowError(ex);
+ }
+ finally
+ {
+ this.componentSettingsXml = null;
+ this.componentCode = null;
+ }
+
+ }
+
+ private bool CheckForInstalledComponent(string componentCode)
+ {
+ bool ret = false;
+ List installedComponents = new List();
+ foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
+ {
+ string code = componentConfig.Settings["ComponentCode"].Value;
+ installedComponents.Add(code);
+ if (code == componentCode)
+ {
+ ret = true;
+ break;
+ }
+ }
+ if (componentCode == "standalone")
+ {
+ if (installedComponents.Contains("server") ||
+ installedComponents.Contains("enterprise server") ||
+ installedComponents.Contains("portal"))
+ ret = true;
+ }
+ return ret;
+ }
+
+ ///
+ /// Displays component description when entering grid row
+ ///
+ ///
+ ///
+ private void OnRowEnter(object sender, DataGridViewCellEventArgs e)
+ {
+ DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView;
+ if (row != null)
+ {
+ lblDescription.Text = Utils.GetDbString(row["ComponentDescription"]);
+ }
+ }
+
+ ///
+ /// Start new thread to load components
+ ///
+ ///
+ ///
+ private void OnLoadComponentsClick(object sender, EventArgs e)
+ {
+ StartLoadingComponents();
+ }
+
+ private void StartLoadingComponents()
+ {
+ //load list of available components in the separate thread
+ AppContext.AppForm.StartAsyncProgress("Connecting...", true);
+ ThreadStart threadDelegate = new ThreadStart(LoadComponents);
+ Thread newThread = new Thread(threadDelegate);
+ newThread.Start();
+ }
+
+ ///
+ /// Loads list of available components via web service
+ ///
+ private void LoadComponents()
+ {
+ try
+ {
+ Log.WriteStart("Loading list of available components");
+ lblDescription.Text = string.Empty;
+ //load components via web service
+ var webService = ServiceProviderProxy.GetInstallerWebService();
+ DataSet dsComponents = webService.GetAvailableComponents();
+ //remove already installed components
+ foreach (DataRow row in dsComponents.Tables[0].Rows)
+ {
+ string componentCode = Utils.GetDbString(row["ComponentCode"]);
+ if (CheckForInstalledComponent(componentCode))
+ {
+ row.Delete();
+ }
+ }
+ dsComponents.AcceptChanges();
+ Log.WriteEnd("Available components loaded");
+ SetGridDataSource(dsComponents, dsComponents.Tables[0].TableName);
+ AppContext.AppForm.FinishProgress();
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Web service error", ex);
+ AppContext.AppForm.FinishProgress();
+ AppContext.AppForm.ShowServerError();
+ }
+ }
+
+ ///
+ /// Thread safe grid binding.
+ ///
+ /// Data source
+ /// Data member
+ private void SetGridDataSource(object dataSource, string dataMember)
+ {
+ // InvokeRequired required compares the thread ID of the
+ // calling thread to the thread ID of the creating thread.
+ // If these threads are different, it returns true.
+ if (this.grdComponents.InvokeRequired)
+ {
+ SetGridDataSourceCallback callBack = new SetGridDataSourceCallback(SetGridDataSource);
+ this.grdComponents.Invoke(callBack, new object[] { dataSource, dataMember });
+ }
+ else
+ {
+ this.grdComponents.DataSource = dataSource;
+ this.grdComponents.DataMember = dataMember;
+ }
+ }
+
+ ///
+ /// Installs component during unattended setup
+ ///
+ ///
+ internal void InstallComponent(string componentCode, string componentVersion, string settingsXml)
+ {
+ //load list of available components in the separate thread
+ this.componentCode = componentCode;
+ this.componentVersion = componentVersion;
+ this.componentSettingsXml = settingsXml;
+ AppContext.AppForm.StartAsyncProgress("Connecting...", true);
+ ThreadStart threadDelegate = new ThreadStart(Install);
+ Thread newThread = new Thread(threadDelegate);
+ newThread.Start();
+ }
+
+ ///
+ /// Loads list of available components via web service and install specified component
+ /// during unattended setup
+ ///
+ private void Install()
+ {
+ LoadComponents();
+ foreach (DataGridViewRow gridRow in grdComponents.Rows)
+ {
+ DataRowView row = gridRow.DataBoundItem as DataRowView;
+ if (row != null)
+ {
+ string code = Utils.GetDbString(row["ComponentCode"]);
+ string version = Utils.GetDbString(row["Version"]);
+ if (code == componentCode)
+ {
+ //check component version if specified
+ if (!string.IsNullOrEmpty(componentVersion))
+ {
+ if (version != componentVersion)
+ continue;
+ }
+ StartInstaller(row);
+ AppContext.AppForm.ProceedUnattendedSetup();
+ break;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx
new file mode 100644
index 00000000..207ce9e2
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk11I
+ U2EYx9vCiBS6GKyP+UWY0yYlZkYRM0Oi3IUEUlAG3QRFN1ERFTnNhWs2q7WtqTQLwhhBSp8YRQxcEslg
+ 82KHzWidrbXNWTowc2du/953NFN4u4gOPJwPzu/3/s/7PEcEYNl/HVSQreTMaKHD9x5ddiOaHh1FXa8K
+ ylv7cHlQAzfPTQvxkSN6u4W8/odZgBORfsng2Es0Pm+G2q+FNmDEFU6PVq4TJz6cQ+2dBrj8HpTf3MYW
+ cKHxKQpf9d+AauAQpK0bsFazEcfspzKiNu56RlKsU7AFF560odlxEtsNe9A1ZMJYwAtfmEd+uzyTKlvr
+ NCVswQHrYSh79mPA+QLJ+bRCmE/nRmPf4Q56l0gkLUVsQU1PHc4/VlO4kpRISKZFNudTFGkrUKAtA12Z
+ wqsvytiCLaadGP3kRmTiWw7d5VA4lh/8Gs35Ep5YGYrEVpB7MR+MrPF+5NkCsiJ+115yXp4Q0ruCoajo
+ ZyIlnp1LiX6QmplN5aqHdWxBlbUWmy07UHa7eqq4syIu65Cje+QB5oSUhCYikvru4XsoN/2ljVutSugC
+ 5kzLSvSVcPIe+jkgCQpoChfvQ8PDJqxvKWUn2GSuWRBQidxQDednD5nAcfQ6+jNTSVt5/P5ptoDERum1
+ qiU9p1AWpLBMLcfdtza2oLBDgWeu15CRwVkMZQeIwtpXRsSmk7uZ/4LlTR/IRuEd58QlWztU5oPIOytF
+ 3hkp6g2NMA31YTKeXBWaFMRMweKH/3L9C8malnY23w2wAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs
new file mode 100644
index 00000000..db6fe2aa
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs
@@ -0,0 +1,36 @@
+namespace WebsitePanel.Installer
+{
+ partial class LineBox
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs
new file mode 100644
index 00000000..d9b581b4
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs
@@ -0,0 +1,95 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace WebsitePanel.Installer
+{
+ ///
+ /// 3D line box.
+ ///
+ internal partial class LineBox : Control
+ {
+ ///
+ /// Initializes a new instance of the LineBox class.
+ ///
+ public LineBox() : base()
+ {
+ SetStyle(ControlStyles.UserPaint, true);
+ SetStyle(ControlStyles.FixedHeight, true);
+ SetStyle(ControlStyles.DoubleBuffer, true);
+ SetStyle(ControlStyles.ResizeRedraw, true);
+ SetStyle(ControlStyles.StandardClick, false);
+ SetStyle(ControlStyles.Selectable, false);
+ this.TabStop = false;
+ }
+
+ ///
+ /// Raises the Paint event.
+ ///
+ /// A PaintEventArgs that contains the event data.
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ Graphics graphics = e.Graphics;
+ Rectangle rectangle = this.ClientRectangle;
+ Pen lightPen = new Pen(ControlPaint.Light(this.BackColor, 1));
+ Pen darkPen = new Pen(ControlPaint.Dark(this.BackColor, 0));
+ graphics.DrawLine(darkPen, rectangle.X, rectangle.Y, rectangle.X+rectangle.Width, rectangle.Y);
+ graphics.DrawLine(lightPen, rectangle.X, rectangle.Y+1, rectangle.X+rectangle.Width, rectangle.Y+1);
+ base.OnPaint(e);
+ }
+
+ ///
+ /// Gets the default size of the control.
+ ///
+ protected override Size DefaultSize
+ {
+ get
+ {
+ return new Size(10, 2);
+ }
+ }
+
+
+ ///
+ /// Performs the work of setting the specified bounds of this control.
+ ///
+ /// The new Left property value of the control.
+ /// The new Right property value of the control.
+ /// The new Width property value of the control.
+ /// The new Height property value of the control.
+ /// A bitwise combination of the BoundsSpecified values.
+ [EditorBrowsable(EditorBrowsableState.Advanced)]
+ protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
+ {
+ base.SetBoundsCore(x, y, width, 2, specified);
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs
new file mode 100644
index 00000000..a0f17fa9
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs
@@ -0,0 +1,112 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class Loader
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.grpFiles = new System.Windows.Forms.GroupBox();
+ this.lblValue = new System.Windows.Forms.Label();
+ this.progressBar = new System.Windows.Forms.ProgressBar();
+ this.lblProcess = new System.Windows.Forms.Label();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.grpFiles.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpFiles
+ //
+ this.grpFiles.Controls.Add(this.lblValue);
+ this.grpFiles.Controls.Add(this.progressBar);
+ this.grpFiles.Controls.Add(this.lblProcess);
+ this.grpFiles.Location = new System.Drawing.Point(12, 9);
+ this.grpFiles.Name = "grpFiles";
+ this.grpFiles.Size = new System.Drawing.Size(448, 88);
+ this.grpFiles.TabIndex = 4;
+ this.grpFiles.TabStop = false;
+ //
+ // lblValue
+ //
+ this.lblValue.Location = new System.Drawing.Point(294, 24);
+ this.lblValue.Name = "lblValue";
+ this.lblValue.Size = new System.Drawing.Size(138, 16);
+ this.lblValue.TabIndex = 2;
+ this.lblValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // progressBar
+ //
+ this.progressBar.Location = new System.Drawing.Point(16, 40);
+ this.progressBar.Name = "progressBar";
+ this.progressBar.Size = new System.Drawing.Size(416, 23);
+ this.progressBar.Step = 1;
+ this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ this.progressBar.TabIndex = 1;
+ //
+ // lblProcess
+ //
+ this.lblProcess.Location = new System.Drawing.Point(16, 24);
+ this.lblProcess.Name = "lblProcess";
+ this.lblProcess.Size = new System.Drawing.Size(272, 16);
+ this.lblProcess.TabIndex = 0;
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(385, 112);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // Loader
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(473, 148);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.grpFiles);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "Loader";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "WebsitePanel Installer";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnLoaderFormClosing);
+ this.grpFiles.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpFiles;
+ private System.Windows.Forms.ProgressBar progressBar;
+ private System.Windows.Forms.Label lblProcess;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Label lblValue;
+ }
+}
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs
new file mode 100644
index 00000000..81eeab02
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs
@@ -0,0 +1,156 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.IO;
+using System.Threading;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Ionic.Zip;
+
+using WebsitePanel.Installer.Services;
+using WebsitePanel.Installer.Common;
+
+namespace WebsitePanel.Installer.Controls
+{
+ public delegate void OperationProgressDelegate(int percentage);
+
+ ///
+ /// Loader form.
+ ///
+ internal partial class Loader : Form
+ {
+ private AppContext appContext;
+ private Core.Loader appLoader;
+
+ public Loader()
+ {
+ InitializeComponent();
+ DialogResult = DialogResult.Cancel;
+ }
+
+ public Loader(AppContext context, string remoteFile)
+ : this()
+ {
+ this.appContext = context;
+ //
+ appLoader = new Core.Loader(remoteFile);
+ //
+ Start();
+ }
+
+ public Loader(AppContext context, string localFile, string componentCode, string version)
+ : this()
+ {
+ this.appContext = context;
+ //
+ appLoader = new Core.Loader(localFile, componentCode, version);
+ //
+ Start();
+ }
+
+ private void Start()
+ {
+ //
+ appLoader.OperationFailed += new EventHandler>(appLoader_OperationFailed);
+ appLoader.ProgressChanged += new EventHandler>(appLoader_ProgressChanged);
+ appLoader.StatusChanged += new EventHandler>(appLoader_StatusChanged);
+ appLoader.OperationCompleted += new EventHandler(appLoader_OperationCompleted);
+ //
+ appLoader.LoadAppDistributive();
+ }
+
+ void appLoader_OperationCompleted(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ void appLoader_StatusChanged(object sender, Core.LoaderEventArgs e)
+ {
+ lblProcess.Text = e.StatusMessage;
+ lblValue.Text = e.EventData;
+ // Adjust Cancel button availability for an operation being performed
+ if (btnCancel.Enabled != e.Cancellable)
+ {
+ btnCancel.Enabled = e.Cancellable;
+ }
+ // This check allows to avoid extra form redrawing operations
+ if (ControlBox != e.Cancellable)
+ {
+ ControlBox = e.Cancellable;
+ }
+ }
+
+ void appLoader_ProgressChanged(object sender, Core.LoaderEventArgs e)
+ {
+ progressBar.Value = e.EventData;
+ // Adjust Cancel button availability for an operation being performed
+ if (btnCancel.Enabled != e.Cancellable)
+ {
+ btnCancel.Enabled = e.Cancellable;
+ }
+ // This check allows to avoid extra form redrawing operations
+ if (ControlBox != e.Cancellable)
+ {
+ ControlBox = e.Cancellable;
+ }
+ }
+
+ void appLoader_OperationFailed(object sender, Core.LoaderEventArgs e)
+ {
+ appContext.AppForm.ShowError(e.EventData);
+ //
+ DialogResult = DialogResult.Abort;
+ Close();
+ }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ Log.WriteInfo("Execution was canceled by user");
+ Close();
+ }
+
+ private void OnLoaderFormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (this.DialogResult == DialogResult.Cancel)
+ {
+ appLoader.AbortOperation();
+ }
+ // Remove event handlers
+ appLoader.OperationFailed -= new EventHandler>(appLoader_OperationFailed);
+ appLoader.ProgressChanged -= new EventHandler>(appLoader_ProgressChanged);
+ appLoader.StatusChanged -= new EventHandler>(appLoader_StatusChanged);
+ appLoader.OperationCompleted -= new EventHandler(appLoader_OperationCompleted);
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx
new file mode 100644
index 00000000..ff31a6db
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs
new file mode 100644
index 00000000..99bd9de9
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs
@@ -0,0 +1,248 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using System.Threading;
+
+namespace WebsitePanel.Installer.Controls
+{
+ ///
+ /// Animated Icon.
+ ///
+ [ToolboxItem(true)]
+ public class ProgressIcon : System.Windows.Forms.UserControl
+ {
+ private Thread thread = null;
+ private int currentFrame = 0;
+ private int delayInterval = 50;
+ private int pause = 0;
+ private int loopCount = 0;
+ private int currentLoop = 0;
+ private int firstFrame = 0;
+ private int lastFrame = 13;
+ private ImageList images;
+ private IContainer components;
+
+ /// Initializes a new instance of the AnimatedIcon class.
+ ///
+ public ProgressIcon()
+ {
+ CheckForIllegalCrossThreadCalls = false;
+ InitializeComponent();
+
+ this.SetStyle(ControlStyles.UserPaint, true);
+ this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+ this.SetStyle(ControlStyles.DoubleBuffer, true);
+ this.SetStyle(ControlStyles.ResizeRedraw, true);
+ }
+
+ #region Dispose
+ /// Clean up any resources being used.
+ /// to release both managed
+ /// and unmanaged resources; to release
+ /// only unmanaged resources.
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if( components != null )
+ components.Dispose();
+
+ if( thread != null )
+ thread.Abort();
+ }
+ base.Dispose( disposing );
+ }
+ #endregion
+
+ #region Component Designer generated code
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProgressIcon));
+ this.images = new System.Windows.Forms.ImageList(this.components);
+ this.SuspendLayout();
+ //
+ // images
+ //
+ this.images.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("images.ImageStream")));
+ this.images.TransparentColor = System.Drawing.Color.Transparent;
+ this.images.Images.SetKeyName(0, "ProgressImage00.bmp");
+ this.images.Images.SetKeyName(1, "ProgressImage01.bmp");
+ this.images.Images.SetKeyName(2, "ProgressImage02.bmp");
+ this.images.Images.SetKeyName(3, "ProgressImage03.bmp");
+ this.images.Images.SetKeyName(4, "ProgressImage04.bmp");
+ this.images.Images.SetKeyName(5, "ProgressImage05.bmp");
+ this.images.Images.SetKeyName(6, "ProgressImage06.bmp");
+ this.images.Images.SetKeyName(7, "ProgressImage07.bmp");
+ this.images.Images.SetKeyName(8, "ProgressImage08.bmp");
+ this.images.Images.SetKeyName(9, "ProgressImage09.bmp");
+ this.images.Images.SetKeyName(10, "ProgressImage10.bmp");
+ this.images.Images.SetKeyName(11, "ProgressImage11.bmp");
+ this.images.Images.SetKeyName(12, "ProgressImage12.bmp");
+ //
+ // ProgressIcon
+ //
+ this.Name = "ProgressIcon";
+ this.Size = new System.Drawing.Size(30, 30);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ /// Starts animation from the beginning.
+ ///
+ public void StartAnimation()
+ {
+ StopAnimation();
+ CheckRange(); // Check the first and the last frames
+
+ thread = new Thread( new ThreadStart( threadFunc ) );
+ thread.IsBackground = true;
+ thread.Start();
+ }
+
+ /// Stops animation not changing current frame number.
+ ///
+ public void StopAnimation()
+ {
+ if( thread != null )
+ {
+ thread.Abort();
+ thread = null;
+ }
+ currentLoop = 0;
+ }
+
+ /// Displays the specified frame.
+ /// An index of the image stored in the .
+ public void ShowFrame2(int frame)
+ {
+ StopAnimation();
+
+ if( frame >= 0 && frame < images.Images.Count )
+ currentFrame = frame;
+ else
+ currentFrame = 0;
+
+ Refresh();
+ }
+
+ /// Occurs when the control is redrawn.
+ /// A that contains
+ /// the event data.
+ /// The OnPaint method draws current image from
+ /// the if exists.
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ // Draw a crossed rectangle if there is no frame to display
+
+ if( images == null ||
+ currentFrame < 0 ||
+ currentFrame >= images.Images.Count )
+ {
+ if( this.Size.Width == 0 || this.Size.Height == 0 )
+ return;
+
+ Pen pen = new Pen( SystemColors.ControlText );
+ e.Graphics.DrawRectangle( pen, 0, 0, this.Size.Width-1, this.Size.Height-1 );
+ e.Graphics.DrawLine( pen, 0, 0, this.Size.Width, this.Size.Height );
+ e.Graphics.DrawLine( pen, 0, this.Size.Height-1, this.Size.Width-1, 0 );
+ pen.Dispose();
+ }
+ else
+ {
+ // Draw the current frame
+
+ e.Graphics.DrawImage( images.Images[currentFrame], 0, 0, this.Size.Width, this.Size.Height );
+ }
+ }
+
+ /// The method to be invoked when the thread begins executing.
+ ///
+ private void threadFunc()
+ {
+ bool wasPause = false;
+ currentFrame = firstFrame;
+
+ while( thread != null && thread.IsAlive )
+ {
+ Refresh(); // Redraw the current frame
+ wasPause = false;
+
+ if( images != null )
+ {
+ currentFrame++;
+ if( currentFrame > lastFrame ||
+ currentFrame >= images.Images.Count )
+ {
+ if( pause > 0 ) // Sleep after every loop
+ {
+ Thread.Sleep( pause );
+ wasPause = true;
+ }
+
+ currentFrame = firstFrame;
+ if( loopCount != 0 ) // 0 is infinitive loop
+ {
+ currentLoop++;
+ }
+ }
+
+ if( loopCount != 0 && currentLoop >= loopCount )
+ {
+ StopAnimation(); // The loop is completed
+ }
+ }
+ if( !wasPause ) // That prevents summation (pause + delayInterval)
+ Thread.Sleep( delayInterval );
+ }
+ }
+
+ /// Check if the last frame is no less than the first one.
+ /// Otherwise, swap them.
+ private void CheckRange()
+ {
+ if( lastFrame < firstFrame )
+ {
+ int tmp = firstFrame;
+ firstFrame = lastFrame;
+ lastFrame = tmp;
+ }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx
new file mode 100644
index 00000000..bd3b1f7d
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx
@@ -0,0 +1,855 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
+ qQAAAk1TRnQBSQFMAgEBDQEAAQ4BAAEEAQABHgEAAR4BAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAF4
+ AwABeAMAAQEBAAEgBgAB4RIAIP8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/
+ A+wB/wP5Af8D/gH/A/4h//8AaQAY/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPp
+ Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Gf//AGkAFP8D/gH/AfUB9AH1Af8B9QH0
+ AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/
+ AfUB9AH1Af8B9QH0AfUB/wP+Ff//AGkAEP8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZ
+ Af8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wH1AfQB9QH/A+IB/wPZAf8D7AH/A/4R//8A
+ aQAM/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/
+ A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4N//8AaQAI/wP+Af8D8QH/A9kB/wPZ
+ Af8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/AfUB9AH1Af8D4gH/A9wB/wPZ
+ Af8D3AH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Cf//AGkABP8D/gH/A/kB/wPZAf8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/EB/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wPxAf8B9QH0
+ AfUB/wPpAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wP+Bf//AGkABP8D/gH/A/kB/wPp
+ Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZ
+ Af8D2QH/A+IB/wP5Af8D/gX//wBpAAP+Af8D8QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A9kB/wPZ
+ Af8D8QH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D8QH/A/4B//8A
+ aQAD/gH/A+IB/wPWAf8D2QH/A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPp
+ Af8D2QH/A9YB/wPiAf8D/gH//wBpAAP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPx
+ Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af//AGkAA/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+
+ Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8AaQAD6QH/A9kB/wPZAf8D2QH/A9kB/wPZ
+ Af8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAD4gH/A9kB/wPZAf8D2QH/A9kB/wPi
+ Af8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAB9QH0AfUB/wPxAf8D8QH/A/EB/wPx
+ Af8B9QH0AfUB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af//AGkAA+kB/wPi
+ Af8D4gH/A+IB/wPiAf8D7AH/A/5B/wP+Af8D7AH/A+IB/wPiAf8D4gH/A+IB/wPpAf//AGkAA+IB/wPW
+ Af8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf//AGkAA+kB/wPZ
+ Af8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPiAf//AGkAA/EB/wPZ
+ Af8D2QH/A9kB/wPZAf8D1gH/A+wB/wP+Of8D/gH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8A
+ aQAD+QH/A9wB/wPZAf8D2QH/A9kB/wHoAeQB6AH/AfUB9AH1Af8B+QH8Afk5/wP+Af8D+QH/A+kB/wPZ
+ Af8D2QH/A9kB/wPZAf8D+QH//wBpAAP+Af8D4gH/A9YB/wHhAd4B4QH/AfgB8gH3Af8B6gH4AesB/wF8
+ Ad4BgQH/AYUB2gGKAf8D/jH/A/4B/wPpAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D1gH/A+IB/wP+
+ Af//AGkAA/4B/wH1AfQB9QH/AfAB6wHvAf8B8AH5AfEB/wG8AfsBwQH/AYkB+gGRAf8BagHoAXQB/wE1
+ AcUBPgH/AZsB4gGgAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+
+ Af//AGkABP8D/gH/AeAB+AHiAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6AZEB/wFqAegBdAH/
+ ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
+ A/EB/wP+Bf//AGkABP8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJ
+ AfoBkQH/AWoB6AF0Af8BoQHqAaYB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+
+ Af8D/gH/A/kB/wPsAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gX//wBpAAj/
+ A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHmAfsB6AH/
+ AUIBogFEAf8BDwGGAREB/wEhAYwBIwH/ATQBlQE2Af8BkgHJAZMB/wH4AfIB+AH/A9wB/wPZAf8D2QH/
+ A9kB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D/gn//wBpAAz/A/4B/wHRAfoB1AH/AYkB+gGR
+ Af8BgwH5AYwB/wGDAfkBjAH/AdgB+gHbAf8BmQHLAZkB/wEyAaMBNAH/ATsBqQE9Af8BMgGjATQB/wEc
+ AZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/A9kB/wPZ
+ Af8D7AH/A/4N//8AaQAQ/wP+Af8B2AH6AdsB/wGSAfsBmQH/AaoB/AGxAf8B0gHqAdIB/wFDAasBRQH/
+ ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ATIBowE0Af8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D8QH/A+kB/wPZAf8D8QH/A/4R//8AaQAU/wP+Af8B6gH4AesB/wHqAfgB6wH/AXwBwgF9
+ Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/AYkByAGKAf8B9AHwAfQB/wPZ
+ Af8D2QH/A9kB/wPZAf8D1gH/A+IB/wP5Af8D+QH/A/4V//8AaQAY/wP+Af8D/gH/Ac4B6wHQAf8BhAHI
+ AYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYQByAGGAf8B8QHsAfEB/wPWAf8D1gH/
+ A9kB/wPcAf8D4gH/AfUB9AH1Af8D/gH/A/4Z//8AaQAg/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGS
+ AdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/A/kB/wP+Af8D/iH//wBpACD/
+ A/4B/wP+Af8B2wHsAdsB/wGgAdEBoQH/AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGi
+ AUQB/wFqAbQBawH/AZkBywGZAf8B2wHsAdsB/wP+Af8D/kH/A/4B/wP+Af8B3AHwAd0B/wGgAdEBoQH/
+ AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGiAUQB/wFqAbQBawH/AZkBywGZAf8B2wHs
+ AdsB/wP+Af8D/kH/A/4B/wP+Af8B4AH4AeIB/wG0AewBuAH/AZAB5gGWAf8BbAHbAXQB/wGkAesBqQH/
+ AfQB8AH0Af8D4gH/A+IB/wPsAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/
+ A/EB/wPiAf8D4gH/A+wB/wP5Af8D/gH/A/45/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/
+ ARwBkAEeAf8BFwGMARkB/wEQAYgBEQH/AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGI
+ ARUB/wEiAZIBJAH/AVkBrAFbAf8BswHbAbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/
+ ASoBmgEtAf8BHAGQAR4B/wEXAYwBGQH/ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGI
+ ARUB/wETAYgBFQH/ASIBkgEkAf8BWQGsAVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHNAfMB0AH/
+ AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGVAeoBmwH/AfEB7AHxAf8D1gH/
+ A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/
+ A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Lf8D/gH/AckB4gHJAf8BuQHg
+ AboB/wGSAckBkwH/ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/
+ AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHi
+ AckB/wHBAeIBwgH/A/4p/wP+Af8ByQHiAckB/wG/AeABwAH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/
+ ASIBkgEkAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BIgGS
+ ASQB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHWAfQB2AH/AdAB8wHTAf8D/in/A/4B/wHJAeIByQH/
+ AbgB3QG5Af8BrQHyAbIB/wFLAdkBVAH/AVUB2wFeAf8BVQHbAV4B/wFVAdsBXgH/AUkB0gFSAf8BmAHq
+ AZ0B/wHxAewB8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Kf8D/gH/
+ AfUB9AH1Af8B9QH0AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/
+ A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Jf8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/
+ AdcB6gHYAf8BTwGqAVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHL
+ AZkB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0AHnAdAB/wFJAaUBTAH/
+ ARoBjAEcAf8BmQHLAZkB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdcB6gHYAf8BTwGq
+ AVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/
+ ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0gHqAdIB/wFsAdsBdAH/AUIBywFKAf8BrAHq
+ AbAB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdwB8AHdAf8BfAHnAYMB/wFVAdsBXgH/
+ AVoB3QFjAf8BVQHbAV4B/wFJAdIBUgH/AZUB6gGbAf8B8QHsAfEB/wPZAf8D2QH/A9kB/wPZAf8D3AH/
+ AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/
+ A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0AfUB/wPiAf8D2QH/A+wB/wP+Hf8D/gH/
+ AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/AR8BkgEhAf8BkgHJAZMB/wG5AeABugH/ASIBkgEkAf8BJgGY
+ ASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHIAYoB/wGaAdIBmwH/ARwBkAEeAf8BJgGYASkB/wEiAZIBJAH/
+ ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/
+ A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/
+ ASIBkgEkAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHSAZsB/wEcAZABHgH/ASYBmAEpAf8BIgGS
+ ASQB/wETAYgBFQH/AZABxQGRAf8BvAHxAcAB/wFCAdABSwH/AUIBywFKAf8BPAHLAUUB/wGbAeIBoAH/
+ A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGSASEB/wGJAcIBigH/Ac4B+gHRAf8BVQHb
+ AV4B/wFaAd0BYwH/AVoB4AFjAf8BWgHgAWMB/wGlAfIBqgH/AfEB7AHxAf8D1gH/A9kB/wPZAf8D2QH/
+ A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4Z/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/
+ A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/
+ A/4V/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/ATEBnQEzAf8B0gHq
+ AdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHiAcIB/wFtAcABbwH/
+ AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/ASIBkgEkAf8BGgGM
+ ARwB/wESAYQBFAH/AZIByQGTAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGaAS0B/wEuAZwBMQH/
+ ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/AWIBugFjAf8BuQHg
+ AboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AU8BqgFRAf8B3AHwAd0B/wFlAdoBbQH/
+ AUIB0AFLAf8BSQHSAVIB/wFCAdABSwH/ATwBywFFAf8BqQHpAa0B/wP+Ef8D/gH/AasB2AGsAf8BJgGY
+ ASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BlAHwAZoB/wFnAewBcQH/
+ AYIB8QGKAf8BmgH5AaEB/wHRAfoB1AH/AfQB8AH0Af8D4gH/A9wB/wPZAf8D3AH/A/kB/wPcAf8D2QH/
+ A9kB/wPZAf8D2QH/A+wB/wP+Ef8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/
+ A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/
+ A9kB/wPsAf8D/g3/A/4B/wHcAfAB3QH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/AS4BnAExAf8BLgGc
+ ATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/A/4B/wP+Af8D/gH/
+ AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/ASIBkgEkAf8BIQGM
+ ASMB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGjATQB/wEmAZgBKQH/
+ AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/AasB2AGsAf8B6gH4
+ AesB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BxQH6AckB/wFaAeABYwH/
+ AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHLAUoB/wHWAfQB2AH/A/4J/wP+Af8B3AHw
+ Ad0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGSASEB/wFhAbEBYgH/
+ AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/
+ A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/
+ A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wHgAfEB4QH/AZIByQGTAf8BMgGj
+ ATQB/wEjAZkBJgH/AS4BnAExAf8BJgGYASkB/wEmAZgBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/
+ AasB2AGsAf8BRQGwAUcB/wEqAZoBLQH/AR8BigEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B3AHw
+ Ad0B/wP+Cf8D/gH/AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BKgGaAS0B/wEmAZgBKQH/
+ ASYBmAEpAf8BkgHJAZMB/wP+Af8D/hn/A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHS
+ AVEB/wFCAdABSwH/AUIBywFKAf8BgQHgAYYB/wHgAfgB4gH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/
+ ATIBowE0Af8BIwGZASYB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/
+ A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/4J/wP+Af8B8AH5AfEB/wHxAewB8QH/
+ AdwB2gHcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D4gH/A/kB/wP+Bf8D/gH/AbkB4AG6Af8BUgGyAVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8
+ AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/AcEB4gHCAf8BRQGwAUcB/wEiAZIBJAH/
+ AVMBqQFVAf8BwQHiAcIB/wHJAeIByQH/AVMBqQFVAf8BqgHSAasB/wP+Af8D/gH/AbkB4AG6Af8BUgGy
+ AVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/
+ Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AWwB2wF0Af8BxQH6AckB/wH4AfIB+AH/A+IB/wPxAf8D/gH/
+ A/4B/wG5AeABugH/AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/
+ AaoB0gGrAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/
+ A/4B/wHRAfoB1AH/AYIB8QGKAf8BzgH6AdEB/wH4AfIB+AH/AegB5AHoAf8D2QH/A9kB/wPxAf8D/in/
+ A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/A/4B/wFyAbwBdAH/
+ ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHbAbQB/wGZAcsBmQH/A/4x/wP+Af8BswHb
+ AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/
+ AXIBvAF0Af8BIwGZASYB/wEqAZoBLQH/AXABuQFyAf8B0gHqAdIB/wGzAdsBtAH/AZkBywGZAf8D/jH/
+ A/4B/wHRAfoB1AH/Ac4B+gHRAf8B8AH5AfEB/wHxAewB8QH/A9kB/wPWAf8D4gH/A/4B/wP+Af8BcgG8
+ AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHLAZkB/wP+Mf8D/gH/
+ A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/
+ AZQB8AGaAf8B4AH4AeIB/wH0AfAB9AH/A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/
+ A+IB/wP+Af8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL
+ AZkB/wP+Of8D/gH/AcEB4gHCAf8BPwGpAUEB/wETAYgBFQH/AR8BigEhAf8BGgGMARwB/wEiAZIBJAH/
+ AdIB6gHSAf8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL
+ AZkB/wP+Of8D/gH/AfQB8AH0Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8B4AHxAeEB/wE/AakBQQH/
+ ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHLAZkB/wP+Of8D/gH/A/EB/wPcAf8D2QH/
+ A9kB/wPZAf8D2QH/A/kB/wHqAfgB6wH/AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHd
+ AWMB/wGkAesBqQH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/AasB2AGsAf8BLgGi
+ ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/
+ ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGi
+ ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wPsAf8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPsAf8BqwHYAawB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/
+ ARMBiAEVAf8BkgHJAZMB/wP+Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wHKAfkBzQH/
+ AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BQAHPAUoB/wGkAeYBqAH/A/45/wP+Af8D7AH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/AYQByAGGAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BKgGa
+ AS0B/wEhAYwBIwH/AdsB7AHbQf8B6AH1AegB/wFLAbABTQH/ASYBmAEpAf8BIgGSASQB/wEiAZIBJAH/
+ ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGM
+ ASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wGEAcgBhgH/ASkBoAEsAf8BNgGk
+ ATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGMASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/
+ A+IB/wGqAfwBsQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AWgB5QFxAf8BQgHLAUoB/wHgAfEB4UH/
+ A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/
+ ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wFtAcABbwH/ASMBmQEmAf8BHwGKASEB/wEfAZIBIQH/
+ ARcBjAEZAf8BSQGlAUwB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGb
+ AUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGk
+ ATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/
+ A+IB/wGaAfkBoQH/AXoB8gGBAf8BegHyAYEB/wF6AfIBgQH/AVoB4AFjAf8BWwHQAWIB/wH5AfwB+UH/
+ A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wHLAegBywH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/
+ AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHb
+ AbQB/wG/AeABwAH/AcsB6AHLAf8BuQHgAboB/wG5AeABugH/AbkB4AG6Af8BswHbAbQB/wHBAeIBwgH/
+ A/5B/wP+Af8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wHLAegBywH/AbkB4AG6Af8BuQHg
+ AboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/
+ AfUB9AH1Af8B3QH7AeAB/wHRAfoB1AH/AdQB/AHYAf8B1AH8AdgB/wHFAfIByAH/Ac0B8wHQAf8D/kH/
+ A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/
+ AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BzgH6AdEB/wGeAfMBpAH/AYwB5gGSAf8BjAHm
+ AZIB/wGMAeYBkgH/AZwB7AGhAf8BkgHQAZMB/wF8AcIBfQH/AXwBwgF9Af8BfAHCAX0B/wFpAbsBawH/
+ AYkBwgGKAf8D/kH/A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wGSAdABkwH/AXwBwgF9Af8BfAHC
+ AX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/A+wB/wPiAf8D4gH/A+IB/wPiAf8D6QH/
+ AZIByQGTAf8BdQHAAXYB/wF4AcABeQH/AXwBwgF9Af8BagG0AWsB/wGIAb8BiQH/A/5B/wP+Af8D7AH/
+ A+IB/wPiAf8D4gH/A+IB/wPpAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/
+ ATQBlQE2Af8B+QH8AflB/wP+Af8BngHzAaQB/wFfAeIBaQH/AUkB0gFSAf8BSwHZAVQB/wFCAdABSwH/
+ AWwB2wF0Af8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5
+ AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGj
+ ATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7
+ AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/
+ A9YB/wPZAf8D2QH/A9YB/wPiAf8BiQHIAYoB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wEyAaMBNAH/
+ AR8BigEhAf8B1wHqAdhB/wHvAfwB8AH/AYIB8QGKAf8BXwHiAWkB/wFVAdsBXgH/AVUB2wFeAf8BSQHS
+ AVIB/wGMAeYBkgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/
+ AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/
+ ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/
+ AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/
+ A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
+ AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wHFAfoByQH/AWcB7AFxAf8BWgHdAWMB/wFaAd0BYwH/
+ AVUB2wFeAf8BSwHZAVQB/wGwAewBtAH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOQGh
+ ATsB/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPsAf8BswHb
+ AbQB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wE5AaEBOwH/AQoBgwEMAf8BiQHCAYoB/wP+Of8D/gH/
+ A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wGzAdsBtAH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/
+ ATkBoQE7Af8BCgGDAQwB/wGJAcIBigH/A/45/wP+Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
+ AegB9QHoAf8BSwGwAU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8
+ Afk5/wP+Af8B6gH4AesB/wGeAfMBpAH/AVoB3QFjAf8BVQHbAV4B/wFVAdsBXgH/AVoB3QFjAf8B4AH4
+ AeIB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/
+ AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGp
+ AT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/
+ A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2
+ AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Af8BfAHC
+ AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/
+ A+kB/wPiAf8B+AHyAfgB/wHRAfoB1AH/AXwB5wGDAf8BSwHZAVQB/wGDAeEBiQH/A/4B/wP+Af8BfAHC
+ AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/
+ A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/
+ AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0
+ AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHg
+ AboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/
+ A+IB/wPWAf8D4gH/A/4B/wP+Af8BzgHrAdAB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/
+ ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/Ae0B6AHtAf8B9QH0
+ AfUB/wG0AfMBuAH/AdAB8wHTAf8D/gH/A/4B/wHLAegBywH/AZ8B1QGhAf8B3AHwAd0B/wGaAdIBmwH/
+ AUMBqwFFAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/
+ A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AcsB6AHLAf8BnwHVAaEB/wHcAfAB3QH/AZoB0gGbAf8BQwGr
+ AUUB/wEmAZgBKQH/ARIBhAEUAf8BkAHFAZEB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPpAf8D+QH/
+ A/EB/wH1AfQB9QH/A/4B/wP+Af8BywHoAcsB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/
+ ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/A+kB/wP5Af8D8QH/
+ AfUB9AH1Af8D/gX/A/4B/wHSAeoB0gH/AVIBsgFUAf8BMgGjATQB/wE7AakBPQH/AT8BqQFBAf8BLgGc
+ ATEB/wESAYQBFAH/AYIBvQGDAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
+ A9wB/wH0AfAB9AH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
+ AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
+ AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
+ AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D8QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATgBqAE6Af8BPwGpAUEB/wE7AakBPQH/
+ AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/
+ A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Cf8D/gH/
+ AeAB8QHhAf8BSwGwAU0B/wE4AagBOgH/AT8BqQFBAf8BOwGpAT0B/wE/AakBQQH/ASMBmQEmAf8BiQHC
+ AYoB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+Af8D/gH/A/kB/wPsAf8D7AH/
+ A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gn/A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGo
+ AToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/
+ AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wP5Af8D7AH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D+QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATsBqQE9Af8BPwGpAUEB/wE7AakBPQH/
+ AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/
+ A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Df8D/gH/
+ AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGi
+ AUQB/wEQAYgBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/
+ A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/
+ AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGV
+ ATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
+ A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/
+ AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/
+ A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGp
+ AT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/
+ ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/
+ A9kB/wPZAf8D2QH/A/EB/wP+Ff8D/gH/AbMB2wG0Af8BOwGpAT0B/wE4AagBOgH/ATYBpAE5Af8BuQHg
+ AboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/
+ A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPsAf8D/hn/A/4B/wGzAdsBtAH/
+ ATsBqQE9Af8BOAGoAToB/wE2AaQBOQH/AbkB4AG6Af8BmgHSAZsB/wEyAaMBNAH/ATsBqQE9Af8BMgGj
+ ATQB/wEcAZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/
+ A9kB/wPZAf8D7AH/A/4Z/wP+Af8BswHbAbQB/wE7AakBPQH/ATgBqAE6Af8BNgGkATkB/wG5AeABugH/
+ AZoB0gGbAf8BMgGjATQB/wE7AakBPQH/ATIBowE0Af8BHAGQAR4B/wF8AcIBfQH/AfQB8AH0Af8D1gH/
+ A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp
+ AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/
+ ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/
+ A9kB/wPsAf8D/h3/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGp
+ AT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/
+ AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHA
+ AW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/
+ AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/
+ AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BMgGj
+ ATQB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iX/
+ A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
+ AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
+ A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
+ AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
+ A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
+ AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
+ A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
+ AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/i3/
+ A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHI
+ AYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9AHwAfQB/wP+Af8D/jH/A/4B/wP+Af8BzgHr
+ AdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wH0AfAB9AH/
+ A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/
+ AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/
+ A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGo
+ AToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0
+ AfUB/wP+Af8D/jn/A/4B/wP+Af8B8AH5AfEB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/
+ AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHqAfgB6wH/AbkB4AG6Af8BkgHQ
+ AZMB/wFtAcABbwH/AaQB2AGlAf8B9AHwAfQB/wPiAf8D6QH/A/EB/wP5Af8D/gH/A/5B/wP+Af8D/gH/
+ AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/
+ A/kB/wP+Af8D/kH/A/4B/wP+Af8B6gH4AesB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/
+ AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHgAfgB4gH/AbQB7AG4Af8BkAHm
+ AZYB/wFsAdsBdAH/AbEB8QG1Af8BoAHRAaEB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/
+ A/4B/wP+Qf8D/gH/A/4B/wHbAewB2wH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHS
+ AasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/
+ AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHL
+ AZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/
+ AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Of8D/gH/
+ A/4B/wHNAfMB0AH/AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGhAeoBpgH/
+ AZIByQGTAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGSASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/
+ A/4x/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/ARoBjAEcAf8BFwGMARkB/wEQAYgBEQH/
+ AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGIARUB/wEiAZIBJAH/AVkBrAFbAf8BswHb
+ AbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/ASoBmgEtAf8BGgGMARwB/wEXAYwBGQH/
+ ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGIARUB/wETAYgBFQH/ASIBkgEkAf8BWQGs
+ AVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHBAeIBwgH/AWEBsQFiAf8BKgGaAS0B/wEcAZABHgH/
+ ARcBjAEZAf8BEAGIAREB/wGFAcIBhgH/AZYByQGYAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGS
+ ASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/A/4t/wP+Af8B9QH0AfUB/wH4AfIB+AH/AakB6QGtAf8BSwHZ
+ AVQB/wFVAdsBXgH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AaQB6wGpAf8BlgHJAZgB/wETAYgBFQH/
+ ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/in/
+ A/4B/wHJAeIByQH/AbkB4AG6Af8BkgHJAZMB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEiAZIBJAH/
+ ARcBjAEZAf8BiQHCAYoB/wGZAcsBmQH/ARMBiAEVAf8BIgGSASQB/wEfAZIBIQH/ARoBjAEcAf8BCgGD
+ AQwB/wFqAbQBawH/AckB4gHJAf8BwQHiAcIB/wP+Kf8D/gH/AckB4gHJAf8BvwHgAcAB/wGSAckBkwH/
+ ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGI
+ ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHiAckB/wHBAeIBwgH/
+ A/4p/wP+Af8ByQHiAckB/wG5AeABugH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BIgGS
+ ASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/
+ AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/iX/A/4B/wPxAf8D2QH/A9wB/wHvAfwB8AH/
+ AXUB5QF9Af8BVQHbAV4B/wFaAd0BYwH/AVUB2wFeAf8BSQHSAVIB/wGkAesBqQH/AZIByQGTAf8BEwGI
+ ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/
+ AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGS
+ ASQB/wEnAZYBKQH/AScBlgEpAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/
+ ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/
+ A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/
+ ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGM
+ ARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/
+ AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/AScBlgEpAf8BFwGM
+ ARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/
+ AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/h3/A/4B/wPsAf8D2QH/A9kB/wPZAf8B8QHs
+ AfEB/wHFAfIByAH/AVUB2wFeAf8BWgHdAWMB/wFaAeABYwH/AVoB4AFjAf8BsQH7AbYB/wGZAcsBmQH/
+ ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGM
+ ARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/
+ AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/AScBlgEpAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHS
+ AZsB/wEcAZABHgH/AScBlgEpAf8BIgGSASQB/wETAYgBFQH/AZYByQGYAf8BqgHSAasB/wETAYgBFQH/
+ ARoBjAEcAf8BEgGEARQB/wGHAcIBiAH/A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGS
+ ASEB/wGSAckBkwH/AbgB3QG5Af8BIgGSASQB/wEnAZYBKQH/ASYBmAEpAf8BHAGQAR4B/wGJAcgBigH/
+ AZoB0gGbAf8BHAGQAR4B/wEnAZYBKQH/ASIBkgEkAf8BEwGIARUB/wGWAckBmAH/AaoB0gGrAf8BEwGI
+ ARUB/wEaAYwBHAH/ARIBhAEUAf8BhwHCAYgB/wP+Gf8D/gH/AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/
+ AR8BkgEhAf8BkgHJAZMB/wG4Ad0BuQH/ASIBkgEkAf8BJwGWASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHI
+ AYoB/wGaAdIBmwH/ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/
+ ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hX/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/
+ AdwB2gHcAf8B9QH0AfUB/wGKAewBkQH/AWcB7AFxAf8BggHxAYoB/wGaAfkBoQH/AdgB+gHbAf8BwQHi
+ AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/
+ ASIBkgEkAf8BGgGMARwB/wESAYQBFAH/AZYByQGYAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGa
+ AS0B/wEqAZoBLQH/ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/
+ AWIBugFjAf8BuQHgAboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AVMBqQFVAf8B2wHs
+ AdsB/wE/AZ0BQQH/ARoBjAEcAf8BIgGSASQB/wEaAYwBHAH/ARIBhAEUAf8BlgHJAZgB/wP+Ef8D/gH/
+ AasB2AGsAf8BJgGYASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BaQG7
+ AWsB/wEjAZkBJgH/AUoBrAFNAf8BYgG6AWMB/wG5AeABugH/AcEB4gHCAf8BbQHAAW8B/wFSAbIBVAH/
+ ATIBowE0Af8BUwGpAVUB/wHbAewB2wH/AT8BnQFBAf8BGgGMARwB/wEiAZIBJAH/ARoBjAEcAf8BEgGE
+ ARQB/wGWAckBmAH/A/4R/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/
+ ATEBnQEzAf8B0gHqAdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHi
+ AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/
+ ASIBkgEkAf8BGgGMARwB/wETAYgBFQH/AZYByQGYAf8D/g3/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D4gH/AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wHwAfkB8QH/
+ AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEfAZIBIQH/ASEBjAEjAf8BGgGM
+ ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wHbAewB2wH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/
+ AS4BnAExAf8BLgGcATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/
+ A/4B/wP+Af8D/gH/AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/
+ AR8BkgEhAf8BHwGSASEB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGj
+ ATQB/wEmAZgBKQH/AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/
+ AasB2AGsAf8B6AH1AegB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BkgHQ
+ AZMB/wEfAZIBIQH/AR8BkgEhAf8BIgGSASQB/wEiAZIBJAH/ARoBjAEcAf8BGgGMARwB/wHJAeIByQH/
+ A/4J/wP+Af8B3AHwAd0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGS
+ ASEB/wFhAbEBYgH/AdIB6gHSAf8BqwHYAawB/wHqAfgB6wH/A/4B/wP+Af8D/gH/A/4B/wHqAfgB6wH/
+ AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEiAZIBJAH/ASEBjAEjAf8BGgGM
+ ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wP5Af8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
+ A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/AUUBsAFHAf8BKgGaAS0B/wEfAZIBIQH/ARcBjAEZAf8BGgGM
+ ARwB/wFqAbQBawH/AdsB7AHbAf8D/gn/A/4B/wHgAfEB4QH/AYkByAGKAf8BMgGjATQB/wEjAZkBJgH/
+ AS4BnAExAf8BKgGaAS0B/wEnAZYBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/AasB2AGsAf8BRQGw
+ AUcB/wEqAZoBLQH/AR8BkgEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B2wHsAdsB/wP+Cf8D/gH/
+ AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BLgGcATEB/wEqAZoBLQH/AScBlgEpAf8BkgHJ
+ AZMB/wP+Af8D/hn/A/4B/wP+Af8BqwHYAawB/wFFAbABRwH/ASoBmgEtAf8BHwGKASEB/wEXAYwBGQH/
+ ARoBjAEcAf8BagG0AWsB/wHcAfAB3QH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/ATIBowE0Af8BIwGZ
+ ASYB/wEuAZwBMQH/ASoBmgEtAf8BJwGWASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/
+ AUUBsAFHAf8BKgGaAS0B/wEfAYoBIQH/ARcBjAEZAf8BGgGMARwB/wFqAbQBawH/AdwB8AHdAf8D/gX/
+ A/4B/wPxAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D2QH/A9kB/wPxAf8D/in/A/4B/wHBAeIBwgH/
+ AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/
+ A/4B/wHRAfoB1AH/AYkB8wGQAf8B1AH8AdgB/wHSAeoB0gH/AXIBvAF0Af8BIgGSASQB/wEcAZABHgH/
+ AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHi
+ AckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/AVYBsQFZAf8BwQHiAcIB/wHSAeoB0gH/
+ AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGS
+ ASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/
+ AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/
+ A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/
+ AaoB0gGrAf8D/gH/A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8BswHb
+ AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/
+ AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/AZ4B8wGkAf8B4AH4AeIB/wGzAdsBtAH/AZkBywGZAf8D/jH/
+ A/4B/wGzAdsBtAH/AbMB2wG0Af8B2wHsAdsB/wF5AbwBewH/ASIBkgEkAf8BCgGDAQwB/wFTAakBVQH/
+ A/4B/wP+Af8BcgG8AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHL
+ AZkB/wP+Mf8D/gH/AbMB2wG0Af8BswHbAbQB/wHbAewB2wH/AXkBvAF7Af8BIgGSASQB/wEKAYMBDAH/
+ AVMBqQFVAf8D/gH/A/4B/wFyAbwBdAH/ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHb
+ AbQB/wGZAcsBmQH/A/4x/wP+Af8BswHbAbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/
+ AQoBgwEMAf8BUwGpAVUB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8BwQHi
+ AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHqAfgB6wH/
+ AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHgAWMB/wGsAeoBsAH/A/45/wP+Af8BwQHi
+ AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/
+ AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi
+ AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/
+ AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi
+ AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wPxAf8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
+ ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AcgB9AHMAf8BdQHxAX4B/wF6AfIBgQH/AXoB8gGBAf8BcQHr
+ AXoB/wFAAc8BSgH/AaQB5gGoAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
+ ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
+ ATQB/wESAYQBFAH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
+ ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
+ ATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
+ ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHoAfUB6AH/
+ AUsBsAFNAf8BJgGYASkB/wEfAZIBIQH/AR8BkgEhAf8BEwGIARUB/wFqAbQBawH/AaoB/AGxAf8BdQHx
+ AX4B/wF6AfIBgQH/AXoB8gGBAf8BaAHlAXEB/wFCAcsBSgH/AeAB8QHhQf8B6AH1AegB/wFLAbABTQH/
+ ASYBmAEpAf8BHwGSASEB/wEfAZIBIQH/ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGk
+ ATkB/wE2AaQBOQH/ASoBmgEtAf8BIgGSASQB/wHbAewB20H/AegB9QHoAf8BSwGwAU0B/wEmAZgBKQH/
+ ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AWoBtAFrAf8BhAHIAYYB/wEpAaABLAH/ATYBpAE5Af8BNgGk
+ ATkB/wEqAZoBLQH/ASEBjAEjAf8B2wHsAdtB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/
+ ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/5B/wP+Af8BbQHA
+ AW8B/wEmAZgBKQH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BmgH5AaEB/wF4AfIBgQH/
+ AXoB8gGBAf8BegHyAYEB/wFaAeABYwH/AVkBzwFhAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/
+ AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGk
+ ATkB/wEiAZIBJAH/AT8BnQFBAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/AR8BigEhAf8BIgGS
+ ASQB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEiAZIBJAH/
+ AT4BmwFAAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEjAZkBJgH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/
+ AUkBpQFMAf8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wP+Qf8D/gH/AdIB6gHSAf8BuAHd
+ AbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/Ad0B+wHgAf8B0QH6AdQB/wHRAfoB1AH/
+ AdQB/AHYAf8ByAH0AcwB/wHIAfQBzAH/A/5B/wP+Af8B0gHqAdIB/wG5AeABugH/AbMB2wG0Af8BswHb
+ AbQB/wGzAdsBtAH/AcEB4gHCAf8ByQHiAckB/wG5AeABugH/AbkB4AG6Af8BuQHgAboB/wGzAdsBtAH/
+ AcEB4gHCAf8D/kH/A/4B/wHSAeoB0gH/AbkB4AG6Af8BswHbAbQB/wGzAdsBtAH/AbMB2wG0Af8BvwHg
+ AcAB/wHJAeIByQH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/
+ AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/A+kB/wPiAf8D4gH/
+ A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/
+ AX8BvAGBAf8B7QHoAe0B/wHoAeQB6AH/AegB5AHoAf8B6AHkAegB/wHoAeQB6AH/AfEB7AHxAf8D/kH/
+ A/4B/wGkAdgBpQH/AXABuQFyAf8BagG0AWsB/wFqAbQBawH/AWoBtAFrAf8BfwG8AYEB/wGSAdABkwH/
+ AXwBwgF9Af8BfAHCAX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/AaQB2AGlAf8BcAG5
+ AXIB/wFqAbQBawH/AWoBtAFrAf8BagG0AWsB/wF/AcEBgQH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/
+ AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0
+ AWsB/wFqAbQBawH/AX8BvAGBAf8D4gH/A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wFiAboBYwH/
+ AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGlAUwB/wPiAf8D1gH/A9kB/wPZAf8D1gH/
+ A9wB/wP+Qf8B+QH8AfkB/wFiAboBYwH/AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGl
+ AUwB/wFpAbsBawH/ASkBoAEsAf8BMgGjATQB/wEyAaMBNAH/ARwBkAEeAf8BNAGVATYB/wH5AfwB+UH/
+ AfkB/AH5Af8BYgG6AWMB/wEfAZIBIQH/ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8BaQG7
+ AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B+QH8AflB/wH7Af4B/AH/
+ AWIBugFjAf8BHwGSASEB/wEaAYwBHAH/ARwBkAEeAf8BEwGIARUB/wFJAaUBTAH/A+kB/wPZAf8D2QH/
+ A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGaAS0B/wEiAZIBJAH/ASIBkgEkAf8BGgGM
+ ARwB/wFwAbkBcgH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGa
+ AS0B/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wFwAbkBcgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/
+ ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8B5wH1AegB/wFDAasBRQH/ASoBmgEtAf8BIgGS
+ ASQB/wEiAZIBJAH/ARcBjAEZAf8BcAG5AXIB/wGJAcgBigH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/
+ ATIBowE0Af8BHwGKASEB/wHXAeoB2EH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGS
+ ASQB/wEXAYwBGQH/AXABuQFyAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BqwHY
+ AawB/wEjAZkBJgH/AScBlgEpAf8BJwGWASkB/wEnAZYBKQH/ARoBjAEcAf8BmQHLAZkB/wPxAf8D2QH/
+ A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
+ AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
+ AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
+ AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
+ AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
+ AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/A/4B/wPcAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D/jn/
+ AfkB/AH5Af8B2wHsAdsB/wF/AcEBgQH/AScBlgEpAf8BHwGSASEB/wEiAZIBJAH/ASoBmgEtAf8B2wHs
+ AdsB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/AdsB7AHbAf8BfwHB
+ AYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8B5wH1AegB/wFKAawBTQH/
+ ATsBqQE9Af8BMgGjATQB/wEyAaMBNAH/AWEBsQFiAf8ByQHiAckB/wP+Of8B+QH8AfkB/wHbAewB2wH/
+ AX8BwQGBAf8BJwGWASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wH/AeAB8QHhAf8BSwGw
+ AU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8Afk5/wH5AfwB+QH/
+ AdsB7AHbAf8BfwHBAYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8D/gH/
+ A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/
+ AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wPiAf8D1gH/A+IB/wPxAf8D+QH/
+ A+IB/wPpAf8D/jH/A/4B/wGJAcgBigH/AVsBsQFdAf8B0gHqAdIB/wHJAeIByQH/AVsBsQFdAf8BEwGI
+ ARUB/wFhAbEBYgH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHqAfgB6wH/
+ AYMB4QGJAf8BhQHaAYoB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGx
+ AV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wF8AcIBfQH/ASkBoAEsAf8BWwGxAV0B/wG5AeABugH/
+ AeAB8QHhAf8BYQGxAWIB/wF0AbUBdQH/A/4x/wP+Af8BiQHIAYoB/wFbAbEBXQH/AdIB6gHSAf8ByQHi
+ AckB/wFbAbEBXQH/ARMBiAEVAf8BYQGxAWIB/wP+Af8D/gH/AfUB9AH1Af8D7AH/A/kB/wPsAf8D3AH/
+ A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGaAS0B/wF8AcIBfQH/
+ AdIB6gHSAf8BoAHRAaEB/wHBAeIBwgH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/
+ A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASIBkgEkAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHq
+ AdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHLAegBywH/AZoB0gGbAf8B4AH4AeIB/wHFAfoByQH/
+ AZIB+wGZAf8BagHoAXQB/wE1AcUBPgH/AZsB4gGgAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGS
+ ASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHOAesB0AH/
+ AZoB0gGbAf8B3AHwAd0B/wGaAdIBmwH/AUUBsAFHAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/
+ A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/
+ AcEB4gHCAf8D/gX/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/
+ A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc
+ ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/
+ A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/
+ AS4BnAExAf8BuAHdAbkB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6
+ AZEB/wFqAegBdAH/ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/
+ ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGcATEB/wG4Ad0BuQH/A/4J/wP+Af8B0gHq
+ AdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/
+ A/4B/wP+Gf8D/gH/A/4B/wGZAcsBmQH/ARwBkAEeAf8BKgGaAS0B/wEuAZwBMQH/ASoBmgEtAf8BHwGS
+ ASEB/wEuAZwBMQH/AbgB3QG5Af8D/gn/A/4B/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D6QH/
+ A/EB/wPsAf8D+QH/A/4B/wP+Af8D/gH/AfkB/AH5Af8B4AHvAeAB/wGJAcIBigH/AZYByQGYAf8BqgHS
+ AasB/wEjAZkBJgH/AS4BnAExAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BMQGdATMB/wHSAeoB0gH/
+ A/4J/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/
+ A/4B/wH5AfwB+QH/AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/
+ AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AS4BnAExAf8B0gHqAdIB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7
+ AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AWoB6AF0Af8BmAHlAZwB/wH1AfQB9QH/
+ A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAfEB4QH/AYkBwgGKAf8BlgHJAZgB/wGqAdIBqwH/
+ ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wEuAZwBMQH/AdIB6gHSAf8D/gn/
+ A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGoAToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/
+ AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wHgAfEB4QH/
+ AZ4B8wGkAf8BqQHpAa0B/wGqAdIBqwH/ASIBkgEkAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGY
+ ASkB/wEuAZwBMQH/AdIB6gHSAf8D/g3/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/
+ A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/
+ AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/
+ A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHS
+ AasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/
+ AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6
+ AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHwAfkB8QH/AeEB3gHhAf8D1gH/AdwB2gHcAf8D3AH/
+ AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8
+ AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wG5AeABugH/
+ ATsBqQE9Af8BOwGpAT0B/wE/AakBQQH/ATYBpAE5Af8BXwG6AWEB/wHgAfEB4QH/AUIBogFEAf8BEAGI
+ AREB/wEfAYoBIQH/ATQBlQE2Af8BmQHLAZkB/wG5AewBvAH/AUwBzQFUAf8BTAHNAVQB/wFMAc0BVAH/
+ AWIB4gFsAf8B4AH4AeIB/wFyAbwBdAH/ASYBmAEpAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BqwHY
+ AawB/wP+Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/
+ AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGj
+ ATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/
+ A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGa
+ AS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/
+ AdEB+gHUAf8BiQH6AZEB/wGDAfkBjAH/AYMB+QGMAf8B0QH6AdQB/wHxAewB8QH/A9kB/wPZAf8D2QH/
+ A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/
+ AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp
+ AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/
+ ARwBkAEeAf8BhQHCAYYB/wG0AfMBuAH/AVQB4AFdAf8BagHoAXQB/wFxAesBegH/AWoB6AF0Af8BngHz
+ AaQB/wHSAeoB0gH/ATIBowE0Af8BJgGYASkB/wEqAZoBLQH/AaAB0QGhAf8D/h3/A/4B/wPxAf8D3AH/
+ A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGk
+ ATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/
+ A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHS
+ AZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/
+ ATYBpAE5Af8BswHbAbQB/wP+If8D/gH/AdgB+gHbAf8BkgH7AZkB/wGkAfoBqwH/AfUB9AH1Af8B3AHa
+ AdwB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/
+ ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8BwQHi
+ AcIB/wFLAbABTQH/AW0BwAFvAf8B0gHqAdIB/wFDAasBRQH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
+ AS4BogEyAf8BkgHJAZMB/wHFAfoByQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BagHo
+ AXQB/wHRAfoB1AH/AYUBwgGGAf8BNgGkATkB/wGzAdsBtAH/A/4l/wP+Af8D+QH/A/kB/wPiAf8D1gH/
+ A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
+ ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/A/kB/wPiAf8D1gH/
+ A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
+ ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B6gH4AesB/wHqAfgB6wH/
+ AegB5AHoAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
+ ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B4AHx
+ AeEB/wHcAfAB3QH/AXwBwgF9Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/
+ AZIByQGTAf8BxQH6AckB/wF1AfEBfgH/AXoB8gGBAf8BegHyAYEB/wFxAesBegH/AWoB6AF0Af8BggHx
+ AYoB/wHgAfEB4QH/AdwB8AHdAf8D/i3/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/
+ AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl
+ AcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHS
+ AZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/
+ A/4B/wP+Af8B9QH0AfUB/wHoAeQB6AH/A9wB/wPZAf8D1gH/A9YB/wHxAewB8QH/AZoB0gGbAf8BIwGZ
+ ASYB/wEpAaABLAH/ATIBowE0Af8BQwGrAUUB/wF8AcIBfQH/AccB5QHIAf8D/gH/A/4x/wP+Af8D/gH/
+ Ac4B6wHQAf8BhAHIAYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYkByAGKAf8BxQH6
+ AckB/wF1AfEBfgH/AXUB8QF+Af8BdQHxAX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jn/
+ A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/AY4BzQGQAf8BuQHg
+ AboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHyAfgB/wGzAdsBtAH/
+ AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/5B/wP+Af8D/gH/A/4B/wH1AfQB9QH/
+ A+wB/wPiAf8B+AHyAfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/
+ A/5B/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BqgHSAasB/wHRAfoB1AH/
+ AZ4B8wGkAf8BtAHzAbgB/wHRAfoB1AH/AfAB+QHxAf8D/gH/A/5J/wP+Af8D9gH/A+wB/wPjAf8D9QH/
+ A/cB/wPiAf8D6wH/A/YB/wP+Sf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/
+ A+wB/wP5Af8D/gH/A/5B/wP+Af8D/gH/A/kB/wPxAf8D6QH/A+IB/wPsAf8D8QH/A+IB/wPiAf8D7AH/
+ A/kB/wP+Af8D/kH/A/4B/wP+Af8D+QH/A/EB/wPpAf8D4gH/A+wB/wPxAf8D4gH/A+IB/wPsAf8D+QH/
+ A/4B/wP+Qf8D+wH/A+cB/wPbAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPbAf8D5gH/
+ A/k5/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/
+ A9kB/wPiAf8D8QH/A/4B/wP+Mf8D/gH/A/4B/wH1AfQB9QH/A+IB/wPZAf8D2QH/A9kB/wPWAf8D6QH/
+ A+wB/wPWAf8D2QH/A9kB/wPZAf8D4gH/A/EB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPiAf8D2QH/
+ A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP9Af8D+wH/
+ A/MB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/AB/wP0Af8D2gH/A9oB/wPaAf8D2gH/A9oB/wPsAf8D/QH/
+ A/wt/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/
+ A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/
+ A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0
+ AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/
+ A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wHoAeQB6AH/AdAB8wHTAf8BzQHzAdAB/wP+Kf8D9wH/
+ A9sB/wPeAf8D/gH/A+IB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D3QH/
+ A/0B/wPlAf8D2gH/A/Ul/wP+Af8D8QH/A9kB/wPcAf8D+QH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D6QH/
+ A+wB/wPZAf8D2QH/A9kB/wPZAf8D3AH/AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/
+ A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0
+ AfUB/wPiAf8D2QH/A+wB/wP+If8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
+ A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wHzAfcB8wH/AWwB2wF0Af8BQgHLAUoB/wGsAeoBsAH/
+ A/4h/wPzAf8D2gH/A9oB/wPaAf8D8gH/A/sB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/
+ A9oB/wPaAf8D9QH/A/kB/wPaAf8D2gH/A9oB/wPwHf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/
+ A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/
+ A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/
+ A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/
+ A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wHxAewB8QH/
+ AbQB7AG4Af8BQgHLAUoB/wFCAcsBSgH/ATwBywFFAf8BmwHiAaAB/wP+Gf8D9wH/A9oB/wPaAf8D2gH/
+ A9oB/wPcAf8D/QH/A+kB/wPaAf8D3QH/A+UB/wP6Af8D+wH/A+UB/wPeAf8D2gH/A+EB/wP+Af8D4AH/
+ A9oB/wPaAf8D2gH/A9oB/wP0Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/
+ A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/
+ A9kB/wPsAf8D/hH/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wH1AfQB9QH/A+IB/wPWAf8D3AH/
+ A+IB/wPxAf8B9QH0AfUB/wPiAf8D3AH/A9kB/wPcAf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
+ A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/
+ AfUB9AH1Af8D4gH/A9wB/wPZAf8B4QHeAeEB/wHqAfgB6wH/AVoB3QFjAf8BQgHQAUsB/wFJAdIBUgH/
+ AUIB0AFLAf8BPAHLAUUB/wGpAekBrQH/A/4R/wP+Af8D3AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D6AH/
+ A/0B/wP5Gf8D+QH/A/wB/wPwAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/Q3/A/4B/wP5Af8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
+ AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
+ AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
+ AfgB8gH4Af8BvAH7AcEB/wFaAeABYwH/AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHL
+ AUoB/wHWAfQB2AH/A/4N/wP+Af8D8AH/A9sB/wPaAf8D2gH/A9oB/wPaAf8D9Cn/A/YB/wPbAf8D2gH/
+ A9oB/wPaAf8D2gH/A+oB/wP+Df8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/
+ A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D/gn/A/4B/wP5Af8D6QH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPiAf8D+QH/A/4J/wP+Af8D+QH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/
+ A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHSAVEB/wFCAdABSwH/AUIB0AFLAf8BiAHi
+ AY8B/wHgAfgB4gH/A/4J/wP6Af8D4QH/A/oB/wP9Af8D6QH/A9oB/wPaAf8D+TH/A/sB/wPbAf8D2gH/
+ A+QB/wP8Af8D/AH/A+UB/wP5Bf8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/
+ A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/
+ A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/
+ A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/
+ A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AXQB3AF7Af8BzQHz
+ AdAB/wHJAeIByQH/AVQBpwFVAf8BqgHSAasB/wP+Bf8D6AH/A9oB/wPaAf8D6AH/A/0B/wP5Af8D9zn/
+ A/cB/wP2Af8D/gH/A+4B/wPbAf8D2gH/A+UF/wP+Af8D4gH/A9YB/wPZAf8D4gH/AfUB9AH1Af8D8QH/
+ A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/A+IB/wPWAf8D2QH/
+ A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPpAf8D2QH/A9YB/wPiAf8D/gH/
+ A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8B0QH6AdQB/wHUAfwB2AH/
+ AdsB7AHbAf8BcgG8AXQB/wEfAYoBIQH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/A9wB/wPaAf8D2gH/
+ A9oB/wPaAf8D9kH/A/oB/wPdAf8D2gH/A9oB/wPaAf8D2wH/A/0B/wP5Af8D3AH/A9kB/wPZAf8D2QH/
+ A9kB/wPsAf8D/jn/A/4B/wPxAf8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D+QH/A9wB/wPZAf8D2QH/
+ A9kB/wPZAf8D7AH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/kB/wPcAf8D2QH/
+ A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/AbkB4AG6Af8BQAGnAUIB/wETAYgBFQH/AR8BigEhAf8BGgGM
+ ARwB/wEiAZIBJAH/AdIB6gHSAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/
+ A9oB/wPaAf8D2gH/A/UB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPsAf8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8D7AH/
+ A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/
+ AbMB2wG0Af8BMgGjATQB/wEiAZIBJAH/ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AZIByQGTAf8D7QH/
+ A9oB/wPaAf8D2gH/A9oB/wPcSf8D3QH/A9oB/wPaAf8D2gH/A9oB/wPrAf8D6QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPpAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wP5Qf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
+ A/lB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/
+ A+YB/wPaAf8D2gH/A9oB/wPaAf8D4kn/A+YB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A+IB/wPZAf8D2QH/
+ A9kB/wPZAf8D4gH/A/5B/wP+Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D4gH/A9kB/wPZAf8D2QH/
+ A9kB/wPiAf8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
+ A+IB/wP+Qf8D/gH/AW0BwAFvAf8BJgGYASkB/wEfAYoBIQH/AR8BkgEhAf8BFwGMARkB/wFJAaUBTAH/
+ A/sB/wP5Af8D+QH/A/kB/wP5Af8D/Un/A/0B/wP5Af8D+QH/A/kB/wP5Af8D+wH/AfUB9AH1Af8D8QH/
+ A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/
+ AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/
+ AfQB8QHzAf8B9QH0AfUB/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/A/5B/wP+Af8B0gHq
+ AdIB/wG4Ad0BuQH/AbMB2wG0Af8BswHbAbQB/wGzAdsBtAH/AcEB4gHCAf8D8AH/A+kB/wPqAf8D6gH/
+ A+kB/wP0Sf8D9gH/A+kB/wPqAf8D6gH/A+kB/wPvAf8D6QH/A+IB/wPiAf8D4gH/A+IB/wPsAf8D/kH/
+ A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wPpAf8D4gH/A+IB/wPiAf8D4gH/A+wB/wP+Qf8D/gH/
+ AcUB+gHJAf8BlAHwAZoB/wGDAeEBiQH/AYMB4QGJAf8BgQHgAYYB/wGSAeYBmAH/A+kB/wPiAf8D4gH/
+ A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/
+ AX8BvAGBAf8D5gH/A9oB/wPaAf8D2gH/A9oB/wPhSf8D5QH/A9oB/wPaAf8D2gH/A9oB/wPjAf8D4gH/
+ A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wPiAf8D1gH/A9kB/wPZAf8D1gH/A+IB/wPiAf8D1gH/
+ A9kB/wPZAf8D1gH/A9wB/wP+Qf8D/gH/AZoB+QGhAf8BXwHiAWkB/wFJAdIBUgH/AUsB2QFUAf8BQgHQ
+ AUsB/wFsAdsBdAH/A+IB/wPWAf8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8BYgG6AWMB/wEfAZIBIQH/
+ ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8D7gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/kX/
+ A90B/wPaAf8D2gH/A9oB/wPaAf8D6wH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/
+ A9kB/wPZAf8D2QH/A9kB/wPiAf8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+UH/Ae8B/AHwAf8BggHx
+ AYoB/wFiAeIBbAH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AYwB5gGSAf8D6QH/A9kB/wPZAf8D2QH/
+ A9kB/wPZAf8D+UH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/
+ AXABuQFyAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D2gH/
+ A/YB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/
+ A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BxQH6AckB/wFnAewBcQH/
+ AVoB3QFjAf8BWgHdAWMB/wFVAdsBXgH/AUsB2QFUAf8BsAHsAbQB/wPxAf8D2QH/A9kB/wPZAf8D2QH/
+ A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/AScBlgEpAf8BGgGM
+ ARwB/wGZAcsBmQH/A/4B/wPdAf8D2gH/A9oB/wPaAf8D5gH/A/1B/wP+Af8D7AH/A9sB/wPaAf8D2gH/
+ A9wB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8D/gH/A/kB/wPpAf8D2QH/
+ A9kB/wPZAf8D2QH/A/kB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/
+ AeAB+AHiAf8BpQHyAaoB/wFaAd0BYwH/AVUB2wFeAf8BVQHbAV4B/wFaAd0BYwH/AeAB+AHiAf8D+QH/
+ A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8B+QH8AfkB/wHbAewB2wH/AX8BwQGBAf8BJwGW
+ ASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wX/A+oB/wPaAf8D4AH/A/kB/wP+Af8D6gH/
+ A/A5/wPzAf8D5AH/A/0B/wP8Af8D5QH/A9oB/wPnBf8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/
+ A+kB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8D4gH/
+ A9YB/wPiAf8D8QH/A/kB/wPiAf8D6QH/A/4x/wP+Af8BiQHIAYoB/wFZAawBWwH/AckB4gHJAf8B2AH6
+ AdsB/wGDAesBiwH/AUsB2QFUAf8BgwHhAYkB/wP+Af8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/
+ A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/
+ AWEBsQFiAf8D/gX/A/wB/wPyAf8D/gH/A/MB/wPcAf8D2gH/A9oB/wP3Mf8D+QH/A9oB/wPaAf8D2gH/
+ A+4B/wP+Af8D9gH/A/sF/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/
+ A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AfUB9AH1Af8D7AH/
+ A/kB/wPsAf8D3AH/A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGa
+ AS0B/wF5AbwBewH/AdcB6gHYAf8BvAHxAcAB/wHQAfMB0wH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/
+ A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/
+ AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gn/A/wB/wPeAf8D2gH/A9oB/wPaAf8D2gH/
+ A9oB/wPyKf8D9gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2wH/A/oN/wP+Af8B9QH0AfUB/wPcAf8D2QH/
+ A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
+ A9kB/wPxAf8D/gn/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/
+ A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc
+ ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/
+ A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/
+ AS4BnAExAf8BuAHdAbkB/wP+Df8D/gH/A90B/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/IB/wP6Af8D9Rn/
+ A/YB/wP2Af8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D3AH/A/0N/wP+Af8D+QH/A9wB/wPZAf8D2QH/
+ A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH7Af4B/AH/AeAB8QHhAf8BmwHi
+ AaAB/wGhAeoBpgH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/4J/wP+Af8D+QH/
+ A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH5AfwB+QH/
+ AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/AS4BnAExAf8BKgGa
+ AS0B/wEmAZgBKQH/ATEBnQEzAf8B0gHqAdIB/wP+Cf8D/gH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/
+ A9YB/wPpAf8D8QH/A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAe8B4AH/AYkBwgGKAf8BlgHJ
+ AZgB/wGqAdIBqwH/ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wExAZ0BMwH/
+ AdIB6gHSAf8D/hH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D4gH/A/4B/wPgAf8D2gH/A9sB/wPhAf8D+AH/
+ A/oB/wPhAf8D3AH/A9oB/wPcAf8D/QH/A+kB/wPaAf8D2gH/A9oB/wPaAf8D9xX/A/4B/wPxAf8D2QH/
+ A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BtAHsAbgB/wFTAc0BWwH/
+ AUgBzQFRAf8BQgHQAUsB/wFaAeABYwH/AeAB+AHiAf8B6AHkAegB/wPZAf8D2QH/A9kB/wPZAf8D8QH/
+ A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/
+ AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGY
+ ASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGrAdgBrAH/A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/
+ A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/
+ ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGYASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGY
+ ASkB/wGrAdgBrAH/A/4Z/wP3Af8D2gH/A9oB/wPaAf8D+gH/A/MB/wPaAf8D2gH/A9oB/wPaAf8D8AH/
+ A/QB/wPaAf8D2gH/A9oB/wPaAf8D6gH/A/0B/wPbAf8D2gH/A9oB/wP0Hf8D/gH/A/EB/wPZAf8D2QH/
+ A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/Aa0B8gGyAf8BVAHgAV0B/wFqAegBdAH/
+ AXEB6wF6Af8BagHoAXQB/wGYAfMBnwH/AfUB9AH1Af8B3AHaAdwB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/
+ A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGR
+ ARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/
+ ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/
+ A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/
+ AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+If8D+gH/A9wB/wPmAf8D/QH/
+ A9wB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/sB/wPvAf8D2wH/
+ A/gl/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BwQH9
+ AcUB/wF1AfEBfgH/AXoB8gGBAf8BeAHyAYEB/wFxAesBegH/AWoB6AF0Af8BygH5Ac0B/wHtAegB7QH/
+ A9kB/wPxAf8D/iH/A/4B/wPxAf8D3AH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHs
+ AfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/
+ AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/
+ A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHSAZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/
+ ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/ATYBpAE5Af8BswHbAbQB/wP+Kf8D/gH/A/4B/wPrAf8D2gH/
+ A9oB/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A/4B/wP+Lf8D/gH/
+ A/kB/wP5Af8D4gH/A9YB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wHBAf0BxQH/AXUB8QF+Af8BegHy
+ AYEB/wF6AfIBgQH/AXEB6wF6Af8BagHoAXQB/wGJAfMBkAH/AfAB+QHxAf8D+QH/A/4p/wP+Af8D+QH/
+ A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
+ ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/
+ A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
+ ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/41/wP8Af8D6wH/
+ A90B/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A90B/wPqAf8D+zn/A/4B/wP+Af8B9QH0
+ AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BvAH7AcEB/wF1AfEBfgH/AXUB8QF+Af8BdQHx
+ AX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/
+ A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/
+ AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/
+ AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl
+ AcgB/wP+Af8D/kH/A/4B/wP5Af8D7wH/A+YB/wP1Af8D+AH/A+UB/wPvAf8D+QH/A/5J/wP+Af8D/gH/
+ A/4B/wPxAf8D6QH/A+IB/wHxAewB8QH/Ac4B+gHRAf8BmgH5AaEB/wG0AfsBugH/AdEB+gHUAf8B8AH5
+ AfEB/wP+Af8D/kH/A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/
+ AY4BzQGQAf8BuQHgAboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHy
+ AfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/4h/wFCAU0BPgcA
+ AT4DAAEoAwABeAMAAXgDAAEBAQABAQUAAYABBxYAA///AP8A/wD/AP8A/wD/AIgACw==
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs
new file mode 100644
index 00000000..47bec400
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs
@@ -0,0 +1,57 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Windows.Forms;
+using WebsitePanel.Installer.Common;
+
+namespace WebsitePanel.Installer.Controls
+{
+ internal class ResultViewControl : UserControl
+ {
+ private AppContext appContext;
+ private bool isInitialized;
+
+ public AppContext AppContext
+ {
+ get { return appContext; }
+ set { appContext = value; }
+ }
+
+ protected bool IsInitialized
+ {
+ get { return isInitialized; }
+ set { isInitialized = value; }
+ }
+
+ public virtual void ShowControl(AppContext context)
+ {
+ this.AppContext = context;
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs
new file mode 100644
index 00000000..6fdaf6a2
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs
@@ -0,0 +1,180 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class ServerControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerControl));
+ this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.lblPassword = new System.Windows.Forms.Label();
+ this.txtPort = new System.Windows.Forms.TextBox();
+ this.lblPort = new System.Windows.Forms.Label();
+ this.txtServer = new System.Windows.Forms.TextBox();
+ this.lblServer = new System.Windows.Forms.Label();
+ this.btnUpdate = new System.Windows.Forms.Button();
+ this.btnTest = new System.Windows.Forms.Button();
+ this.btnRemove = new System.Windows.Forms.Button();
+ this.grpConnectionSettings.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpConnectionSettings
+ //
+ this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpConnectionSettings.Controls.Add(this.txtPassword);
+ this.grpConnectionSettings.Controls.Add(this.lblPassword);
+ this.grpConnectionSettings.Controls.Add(this.txtPort);
+ this.grpConnectionSettings.Controls.Add(this.lblPort);
+ this.grpConnectionSettings.Controls.Add(this.txtServer);
+ this.grpConnectionSettings.Controls.Add(this.lblServer);
+ this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpConnectionSettings.Location = new System.Drawing.Point(14, 43);
+ this.grpConnectionSettings.Name = "grpConnectionSettings";
+ this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122);
+ this.grpConnectionSettings.TabIndex = 0;
+ this.grpConnectionSettings.TabStop = false;
+ this.grpConnectionSettings.Text = "Connection settings";
+ //
+ // txtPassword
+ //
+ this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtPassword.Location = new System.Drawing.Point(122, 82);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '*';
+ this.txtPassword.Size = new System.Drawing.Size(234, 21);
+ this.txtPassword.TabIndex = 5;
+ //
+ // lblPassword
+ //
+ this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblPassword.Location = new System.Drawing.Point(16, 82);
+ this.lblPassword.Name = "lblPassword";
+ this.lblPassword.Size = new System.Drawing.Size(100, 21);
+ this.lblPassword.TabIndex = 4;
+ this.lblPassword.Text = "Password";
+ //
+ // txtPort
+ //
+ this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtPort.Location = new System.Drawing.Point(122, 55);
+ this.txtPort.Name = "txtPort";
+ this.txtPort.Size = new System.Drawing.Size(234, 21);
+ this.txtPort.TabIndex = 3;
+ //
+ // lblPort
+ //
+ this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblPort.Location = new System.Drawing.Point(16, 55);
+ this.lblPort.Name = "lblPort";
+ this.lblPort.Size = new System.Drawing.Size(100, 21);
+ this.lblPort.TabIndex = 2;
+ this.lblPort.Text = "Port";
+ //
+ // txtServer
+ //
+ this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtServer.Location = new System.Drawing.Point(122, 28);
+ this.txtServer.Name = "txtServer";
+ this.txtServer.Size = new System.Drawing.Size(234, 21);
+ this.txtServer.TabIndex = 1;
+ //
+ // lblServer
+ //
+ this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblServer.Location = new System.Drawing.Point(16, 28);
+ this.lblServer.Name = "lblServer";
+ this.lblServer.Size = new System.Drawing.Size(100, 21);
+ this.lblServer.TabIndex = 0;
+ this.lblServer.Text = "Server";
+ //
+ // btnUpdate
+ //
+ this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image")));
+ this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnUpdate.Location = new System.Drawing.Point(148, 171);
+ this.btnUpdate.Name = "btnUpdate";
+ this.btnUpdate.Size = new System.Drawing.Size(128, 28);
+ this.btnUpdate.TabIndex = 9;
+ this.btnUpdate.Text = "Update";
+ this.btnUpdate.UseVisualStyleBackColor = true;
+ //
+ // btnTest
+ //
+ this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
+ this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnTest.Location = new System.Drawing.Point(14, 171);
+ this.btnTest.Name = "btnTest";
+ this.btnTest.Size = new System.Drawing.Size(128, 28);
+ this.btnTest.TabIndex = 8;
+ this.btnTest.Text = "Test connection";
+ this.btnTest.UseVisualStyleBackColor = true;
+ //
+ // btnRemove
+ //
+ this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image")));
+ this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnRemove.Location = new System.Drawing.Point(14, 9);
+ this.btnRemove.Name = "btnRemove";
+ this.btnRemove.Size = new System.Drawing.Size(128, 28);
+ this.btnRemove.TabIndex = 10;
+ this.btnRemove.Text = "Remove server";
+ this.btnRemove.UseVisualStyleBackColor = true;
+ //
+ // ServerControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.btnRemove);
+ this.Controls.Add(this.btnUpdate);
+ this.Controls.Add(this.btnTest);
+ this.Controls.Add(this.grpConnectionSettings);
+ this.Name = "ServerControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpConnectionSettings.ResumeLayout(false);
+ this.grpConnectionSettings.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpConnectionSettings;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Label lblPassword;
+ private System.Windows.Forms.TextBox txtPort;
+ private System.Windows.Forms.Label lblPort;
+ private System.Windows.Forms.TextBox txtServer;
+ private System.Windows.Forms.Label lblServer;
+ private System.Windows.Forms.Button btnUpdate;
+ private System.Windows.Forms.Button btnTest;
+ private System.Windows.Forms.Button btnRemove;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs
new file mode 100644
index 00000000..242c4b72
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs
@@ -0,0 +1,46 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace WebsitePanel.Installer.Controls
+{
+ internal partial class ServerControl : ResultViewControl
+ {
+ public ServerControl()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx
new file mode 100644
index 00000000..89b7bc69
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+NJREFUOE89jmlM
+ GwQYhj9iKbBgskgky7jdkjknCmwglMIqoDCQa61QObQMSLElhEMJ0LkSaDkHowdyDNlCgQETVgcydBgR
+ 4tzCOCz3gJbSFTXgohhRM/C1McYfz8/neV+rnA+Laf8AV13dXvA5+Ht/4+DpvonBsNpkMq1Nh2yZ5kN2
+ tj8xbWx2rK2Zu4xnGGBYM+n+5CQZDBvEYDCI3st83yq3SDqzs7uP5c1f8fX0Jrq+0KG6YwwfKLQQV2r2
+ RLKrW7kVTTMltc3D9a0dTQUS6bmkC0JKzRQRSeVVz6rbusw7vwFL5j9xffxn5HdvIbXtMc43bSJctQF2
+ 3SpOV83j5YpZxBQ2IiUtvYebLCBechpR32dDx0cnHv71YG0Pma16CFrWUXLzMUr6zRB1m5DYbkToxwb4
+ NBhwSr2FCFE5IqNjykKjYiksKo5oRjfH0Y6v4N0mA5QjP6Ltm23k9pgQ36xHqHIdgYp1nLFwqkEPz0Yj
+ zosl8AtgpZ/2Z9OZgCCi5eVFgVB5H+q72xBrjHjpo0U4F8/D+eIiXEqX4SJ/BLeaNThf1sOn2YCSahV4
+ Cfw3uPxk4vFTiMYmvisv7ZxBtEIPxzwdXEsW4CFdgodsBe4Vq3C3yC51ejx3xYSgri10aoeeSstkx6Xl
+ FXSpTE50o3+w61yNDs/nL8Bd8p9cbpErH8G9dg1H6zfg3baJvN45aPrHcW9waE/Z2MjJys6mlBTLA+mV
+ T+YDyybhU7mKE5UGuFVuwLnKAKcaPY7UGxHUuow76jYsiTKhS03CLJeL2aysP2olksJYLpcoNiG5JSk9
+ az69QPp7mrQJSTVaxCi/BadlBa+26HFNrsBaUQFWVSpMR0ZiSiDAVPoFzMbHQyQURlBAcCj5ss4y/FjB
+ HhFRb4Xw+fyiTKFwKiOnAPkXy3EvS4iFoiLsmM14qFDgtkaDu5bA2uHDqIuO1lLg629SQoqApLJK6rzR
+ 6zk4ONTTPzDwQ2lFNSR5+ZjMyMADX1+MRkejc2ICA3I55ohgsnDNz2+OSuVV1N7RRZ29N52Gvxzdnf5e
+ h7mFRfTd0kKlVGEsLAwjTk7oVqtxSyzGoiWyVViIHUtAHRb2OSUmJRP37USK5yU41jUoDYN3RvCp9jba
+ Nd1QXNegLy4OX1nuDoeH/7u86e+PJzwejI6OqJPJ4okVyCYWm02vBbAogBXoIRJnN1bVXF6yxH6R19bv
+ Fl8qNQ6EhGwv29nBZGWFJ5aI0dUVypwceUhUFFHQWc7/eHl704kXT5Kn5ytML2+fIw4ODm7WNjbOR48d
+ 836HzZZLOZyevODgFh8vLy7D3t6eiGz/AfbnLf28f482AAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs
new file mode 100644
index 00000000..e3b60262
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs
@@ -0,0 +1,166 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class ServersControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServersControl));
+ this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.lblPassword = new System.Windows.Forms.Label();
+ this.txtPort = new System.Windows.Forms.TextBox();
+ this.lblPort = new System.Windows.Forms.Label();
+ this.txtServer = new System.Windows.Forms.TextBox();
+ this.lblServer = new System.Windows.Forms.Label();
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.btnTest = new System.Windows.Forms.Button();
+ this.grpConnectionSettings.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpConnectionSettings
+ //
+ this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpConnectionSettings.Controls.Add(this.txtPassword);
+ this.grpConnectionSettings.Controls.Add(this.lblPassword);
+ this.grpConnectionSettings.Controls.Add(this.txtPort);
+ this.grpConnectionSettings.Controls.Add(this.lblPort);
+ this.grpConnectionSettings.Controls.Add(this.txtServer);
+ this.grpConnectionSettings.Controls.Add(this.lblServer);
+ this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3);
+ this.grpConnectionSettings.Name = "grpConnectionSettings";
+ this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122);
+ this.grpConnectionSettings.TabIndex = 0;
+ this.grpConnectionSettings.TabStop = false;
+ this.grpConnectionSettings.Text = "Connection settings";
+ //
+ // txtPassword
+ //
+ this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtPassword.Location = new System.Drawing.Point(122, 82);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '*';
+ this.txtPassword.Size = new System.Drawing.Size(234, 21);
+ this.txtPassword.TabIndex = 5;
+ //
+ // lblPassword
+ //
+ this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblPassword.Location = new System.Drawing.Point(16, 82);
+ this.lblPassword.Name = "lblPassword";
+ this.lblPassword.Size = new System.Drawing.Size(100, 21);
+ this.lblPassword.TabIndex = 4;
+ this.lblPassword.Text = "Password";
+ //
+ // txtPort
+ //
+ this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtPort.Location = new System.Drawing.Point(122, 55);
+ this.txtPort.Name = "txtPort";
+ this.txtPort.Size = new System.Drawing.Size(234, 21);
+ this.txtPort.TabIndex = 3;
+ //
+ // lblPort
+ //
+ this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblPort.Location = new System.Drawing.Point(16, 55);
+ this.lblPort.Name = "lblPort";
+ this.lblPort.Size = new System.Drawing.Size(100, 21);
+ this.lblPort.TabIndex = 2;
+ this.lblPort.Text = "Port";
+ //
+ // txtServer
+ //
+ this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtServer.Location = new System.Drawing.Point(122, 28);
+ this.txtServer.Name = "txtServer";
+ this.txtServer.Size = new System.Drawing.Size(234, 21);
+ this.txtServer.TabIndex = 1;
+ //
+ // lblServer
+ //
+ this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblServer.Location = new System.Drawing.Point(16, 28);
+ this.lblServer.Name = "lblServer";
+ this.lblServer.Size = new System.Drawing.Size(100, 21);
+ this.lblServer.TabIndex = 0;
+ this.lblServer.Text = "Server";
+ //
+ // btnAdd
+ //
+ this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image")));
+ this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnAdd.Location = new System.Drawing.Point(148, 131);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(128, 28);
+ this.btnAdd.TabIndex = 9;
+ this.btnAdd.Text = "Add server";
+ this.btnAdd.UseVisualStyleBackColor = true;
+ //
+ // btnTest
+ //
+ this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
+ this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnTest.Location = new System.Drawing.Point(14, 131);
+ this.btnTest.Name = "btnTest";
+ this.btnTest.Size = new System.Drawing.Size(128, 28);
+ this.btnTest.TabIndex = 8;
+ this.btnTest.Text = "Test connection";
+ this.btnTest.UseVisualStyleBackColor = true;
+ //
+ // ServersControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.btnAdd);
+ this.Controls.Add(this.btnTest);
+ this.Controls.Add(this.grpConnectionSettings);
+ this.Name = "ServersControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpConnectionSettings.ResumeLayout(false);
+ this.grpConnectionSettings.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpConnectionSettings;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Label lblPassword;
+ private System.Windows.Forms.TextBox txtPort;
+ private System.Windows.Forms.Label lblPort;
+ private System.Windows.Forms.TextBox txtServer;
+ private System.Windows.Forms.Label lblServer;
+ private System.Windows.Forms.Button btnAdd;
+ private System.Windows.Forms.Button btnTest;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs
new file mode 100644
index 00000000..6aa328ec
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs
@@ -0,0 +1,46 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace WebsitePanel.Installer.Controls
+{
+ internal partial class ServersControl : ResultViewControl
+ {
+ public ServersControl()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx
new file mode 100644
index 00000000..4166a35a
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs
new file mode 100644
index 00000000..b98a918b
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs
@@ -0,0 +1,250 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class ServiceControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceControl));
+ this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.btnTest = new System.Windows.Forms.Button();
+ this.lblStatus = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.textBox2 = new System.Windows.Forms.TextBox();
+ this.button2 = new System.Windows.Forms.Button();
+ this.textBox3 = new System.Windows.Forms.TextBox();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.textBox4 = new System.Windows.Forms.TextBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.grpConnectionSettings.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpConnectionSettings
+ //
+ this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpConnectionSettings.Controls.Add(this.pictureBox1);
+ this.grpConnectionSettings.Controls.Add(this.btnAdd);
+ this.grpConnectionSettings.Controls.Add(this.btnTest);
+ this.grpConnectionSettings.Controls.Add(this.lblStatus);
+ this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3);
+ this.grpConnectionSettings.Name = "grpConnectionSettings";
+ this.grpConnectionSettings.Size = new System.Drawing.Size(379, 66);
+ this.grpConnectionSettings.TabIndex = 0;
+ this.grpConnectionSettings.TabStop = false;
+ this.grpConnectionSettings.Text = "Status";
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
+ this.pictureBox1.Location = new System.Drawing.Point(13, 20);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox1.TabIndex = 12;
+ this.pictureBox1.TabStop = false;
+ //
+ // btnAdd
+ //
+ this.btnAdd.Enabled = false;
+ this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image")));
+ this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnAdd.Location = new System.Drawing.Point(258, 20);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(83, 28);
+ this.btnAdd.TabIndex = 11;
+ this.btnAdd.Text = "Stop";
+ this.btnAdd.UseVisualStyleBackColor = true;
+ //
+ // btnTest
+ //
+ this.btnTest.Enabled = false;
+ this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
+ this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnTest.Location = new System.Drawing.Point(169, 20);
+ this.btnTest.Name = "btnTest";
+ this.btnTest.Size = new System.Drawing.Size(83, 28);
+ this.btnTest.TabIndex = 10;
+ this.btnTest.Text = "Start";
+ this.btnTest.UseVisualStyleBackColor = true;
+ //
+ // lblStatus
+ //
+ this.lblStatus.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblStatus.Location = new System.Drawing.Point(51, 26);
+ this.lblStatus.Name = "lblStatus";
+ this.lblStatus.Size = new System.Drawing.Size(112, 21);
+ this.lblStatus.TabIndex = 0;
+ this.lblStatus.Text = "Not installed";
+ //
+ // label1
+ //
+ this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.label1.Location = new System.Drawing.Point(16, 82);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(100, 21);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "Password";
+ //
+ // label2
+ //
+ this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.label2.Location = new System.Drawing.Point(16, 55);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(100, 21);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "Port";
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.Location = new System.Drawing.Point(122, 28);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(234, 21);
+ this.textBox1.TabIndex = 1;
+ //
+ // label3
+ //
+ this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.label3.Location = new System.Drawing.Point(16, 28);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(100, 21);
+ this.label3.TabIndex = 0;
+ this.label3.Text = "Server";
+ //
+ // textBox2
+ //
+ this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox2.Location = new System.Drawing.Point(122, 55);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.Size = new System.Drawing.Size(234, 21);
+ this.textBox2.TabIndex = 3;
+ //
+ // button2
+ //
+ this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image")));
+ this.button2.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.button2.Location = new System.Drawing.Point(14, 240);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(128, 28);
+ this.button2.TabIndex = 11;
+ this.button2.Text = "Update settings";
+ this.button2.UseVisualStyleBackColor = true;
+ //
+ // textBox3
+ //
+ this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox3.Location = new System.Drawing.Point(122, 82);
+ this.textBox3.Name = "textBox3";
+ this.textBox3.PasswordChar = '*';
+ this.textBox3.Size = new System.Drawing.Size(234, 21);
+ this.textBox3.TabIndex = 5;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox1.Controls.Add(this.textBox4);
+ this.groupBox1.Controls.Add(this.label4);
+ this.groupBox1.Controls.Add(this.textBox3);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Controls.Add(this.textBox2);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.textBox1);
+ this.groupBox1.Controls.Add(this.label3);
+ this.groupBox1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.groupBox1.Location = new System.Drawing.Point(14, 81);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(379, 150);
+ this.groupBox1.TabIndex = 10;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Connection settings";
+ //
+ // textBox4
+ //
+ this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox4.Location = new System.Drawing.Point(122, 109);
+ this.textBox4.Name = "textBox4";
+ this.textBox4.PasswordChar = '*';
+ this.textBox4.Size = new System.Drawing.Size(234, 21);
+ this.textBox4.TabIndex = 7;
+ //
+ // label4
+ //
+ this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.label4.Location = new System.Drawing.Point(16, 109);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(100, 21);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "Confirm password";
+ //
+ // ServiceControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.button2);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.grpConnectionSettings);
+ this.Name = "ServiceControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpConnectionSettings.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpConnectionSettings;
+ private System.Windows.Forms.Label lblStatus;
+ private System.Windows.Forms.Button btnAdd;
+ private System.Windows.Forms.Button btnTest;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox textBox2;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.TextBox textBox3;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.TextBox textBox4;
+ private System.Windows.Forms.Label label4;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs
new file mode 100644
index 00000000..7380d425
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs
@@ -0,0 +1,46 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace WebsitePanel.Installer.Controls
+{
+ internal partial class ServiceControl : ResultViewControl
+ {
+ public ServiceControl()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx
new file mode 100644
index 00000000..2c91c02e
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAACHBJREFUWEedVwtQ
+ lWUa/v7D/XCJZEhtrEDyNlmZjXkpU3N07aI2o+a44q3a1PHSoDKra6toXlLJG+aqTKlcJHQhF1e8EAgE
+ LIIgi4QeEgFruYU0gBy5P/u85z9nl5Oa5j/zzH/7vvd53uf9vu//fk095NFqNA5V7sYpqofPEIOv70BH
+ T8/eCnDsbGio6ayvL8Uv9QVaY0Pyz0q70KeltfUhwz64Waury5LOAQNvdk2cCHz4IbBqFRASAmzaBKxb
+ B6xcCXzwATBtGrrGjEFbQMDtSg+PA2uV6vPg6L/RokVT4zr8/UsxYQLw/vvAmjVAaCgQHg5ERQGRkfr1
+ zp26kKVLgTlzgLffBkaMwC/PPIMzTo5/fSQRLUbj6s7nngOmTAEWLQLWrwf27gWOHAGio4GYGCAiAjh4
+ UBewcSMQHKy3nTVLFzFqFDBgAPLd3bOMSvk+tBCzl+duvPgiMHky8NFHwCefADt2APv2Afv3A3v2ANu3
+ 61mvXq2XIChId0BKNHs28O67wPjxwCuvAP3745KX548uSg18oIgmN7egLslc6i12Ll8OrF2r13zDBj3L
+ hQuBGTOAN9/U202apDs1fTowc6ZOLu/GjrWUwvz88zD7+SHR1bXMUamA+4poMBiGtbAhXn1Vzz4w0OJA
+ B7O6M2+eTipZvfQS4O8P9O4N9OoF9OkD9OunPx8+HObRo9E1ciQwbBjw8stoGzwYtXxf/eSTCHFwSKOA
+ nvcUUe/jc6XzhRd05VLDqVPR/s472LB4MUKWLEG7kPToAXh6os3FBU2Ojmh0ckKzszM6jEbAwwO3SbJw
+ /nzskjIEBFjsb+c4qOnbF+VPPYVCb2/0U+ozCnC1E1Ht4hx4S7IaMgR47TXg9dfRQicOsbbJ167hvMmE
+ g6xxg1IwEzVEJVFFVBPNxA1i1Xvv4UBSEsLT0vC1uNazJ9roVBVdMvH8g68vQp2cGkk+3k7Aj97eprpn
+ nwVYL4uVHISHOfgSSG47UisqsJ9ulHcT8BOv64giIoij/8uUFEvzTuJYcTEurFgBM7P+6YknUEzyyz4+
+ yKSD/kpFUEAPiwhm0vc6lYpNrbRMpg4opnjuXKSWlaH5fxKAdN6HM2ipNXNx4t/EX+bNR1R6ereWQBvv
+ yuhINUtUThFFjz+Ofz32GPK9vDDNYLhJ6j9YBNxwdQ4upj2VtKnx6afBxQfgGdKRgzG3shK3u4XOqa1F
+ JGeGyZr5Nk7DE7m5duRyU88xJA5VuLujhFnnc4ykEyJiN2OTejPhpK66uUUV0Z5ycYGjupEDqZlootKf
+ GaCQ06ygrs7OieL6eiRt3oy4rVuRWVqKrl/R3+S0LGTfHzhITSS9QhE5HKgpxLe8jqYATsl/UICfyvPw
+ yJfaXOUIr+C5hqgjqthR6n2dyOMaX8jMzd2IpDRNd+UNXOdUzRHh4hCJrpA039UVWUQSZ88/eT7F516a
+ xqGjxqksd/fai6xRATMuISpo0U2iXKxzcECx1ercN97A9zU1aL8HqTjQStzgApTF9pdEtKbhMokuk/Qi
+ z9/RjTNEHK/P8pmPpsk4mKouGI0tUpuLJCwgrhHXWTMTlX5PAZKJJRsic9JEVLYKlf0hzuRz7RfyXOIi
+ kcO+OSQUZBApXDcSiFhenyN8NY0VVjNVkptb9Xk3N6STMIcoIIp4X0SVhQxSYCVP5zme34DaO3cs7F1d
+ XRbIIZKyw8LwHdtkEyIkiw5kkTBTyBkn0WDA34lIXsfTBTpwiwL+qM45O+eelvrwYQYhduURBWIfO0jm
+ ycQWfheSS0ruUQD9UUlzM6L4vfhWnCIyiDSSCflZxjlJHCOO8v4w4aEUlxA1S513cjwax2xPkzCJitOp
+ OJvItdp/noH+vGABTmRl3Zfc9iKPY+QLbljOsI84lkwXhDyBOM7rwzx/xbjbeOYs4BKkZqgUzbAshoTx
+ JE/kyyQijY3zGOAcsZyLSXRq6l3kl7lUX+WXTxac7otVdnk5di1bhgT2PUtwruEE40USh4ivSP4xQXJO
+ MDVZ0S6/SJLHEHF8cYqNxMaTxEp+WGIzMu4m5wdLAp+SmnPOl5nNdlM0t6oKYVygYoWciCLCGXcv44cT
+ I3lNcpqkhltWw2MODlcjmHm0DBQ2FvWfc7MRzRWu41f0+Vzh4vn+NJFobZvMr6epsREt3doWtbQgnjsl
+ Lvr4kthH0j2MH0p4a6qTtIeJXhYBf9K0wAQKEHtE7XEilh+k1EuX7JfhceMsAiVzG0RsnAjiAmS6dctO
+ 7jdDh+ILvttL7KCAMMafoWf/H+JjC7ntiDAYrskAOcTGR4ijYt+gQZYay5H91luI5rNvrIhnoJOE3Iso
+ eZcouyPrEc8P2i4+201sswoIYXuOfhGQRIywE7BIU2NlmuwTsJEIOUBc4OqWwS232BgjzohDDCSIJb4m
+ hFyslj6Z3Aec4qK0XUiJLcSnbCMOsOC27NeQ3M1OgNws1rTNURSwh41FudgXRuwnRICQ2BBpvRanWEyE
+ E38jPrcSi4BNxHpr9tN1cu5nFA1TQ+4itz1YqGnHZSzspIhQdhIbpYYiRhw5aD0Loc0lIRbXpK1kvZXY
+ aCX/jHFm6+QdBNcnNe2+5NYX2ixNiw5jRxEh9ROIGJsgcccGG6lkLHYL8Tpig1yz/9T/k/MzoeYR9vvB
+ +6hxGKXUjtUydQgJzt2DHYRMIDYLWYg1Y7mWtivYjz5L5twyKn4m1AKC/yi/75g+WtMygxlsi7hBSHDJ
+ 0kYqxIJPrc+Xs80Ygj8i7aQqJzhMuOIpxUePdvRltyD+aaZwE3d7DoMvJVaRMJhYSszl/QTCj9eaUk1s
+ z02y4nqllhD9H43WvpcDbwcRgQTHmeL0V/KTwc2PktpyC2C5l+esmJpLDCb4zfnt479hJfyQufY7HQAA
+ AABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA5FJREFUOE81U21M
+ m1UUvg3LmJMlilvUaJzsDzr/7AeJmdkWcW5LlwmYQCmLIZotISbEqSzMQaY4iGYxTaYuQmGwQUtbPtrS
+ 0Q9aoKUv/aKlLf2iLYVVsTgXOhyxMWQzeTx9wZs8uSf3nue555x7jqCqqorl1+7CQravqCiPXSWvHzz6
+ 6msHy4v37z/89MnT3F+Psr4Ha2uW7MZG+u9cjm1ubrKtrS0mEAgYywvk8SHh6pUrpy0z9rAzmYY5nsZY
+ eAm6SAoWsmejiSeq4WHZZ42NL9XX1zOxWMzq6uq2Bc4Khaz5ctOl2XAc2sgyBubCGPCEeNx1h9DrCqKX
+ dl3sPgzTtvSFTz5+s6amhhdhQiJ/dP58pcntxVAwgcG5CGQ7AipfFIPeCPrprJ/ObjuD0C6mcWdQERWe
+ ObOvoqKCsXdPnHjmZmdXXBNO8c55sjGcxMqDh1hd+wORRBLT8wtQ5O9I8I4nDN1CApebmq6La2sZq/zg
+ XKXK6oDSv8iTDeEEcrkcqHBYTqXg83pht07DZLNvR+aNQhlKQdLVff/UyfeeYxcuXpSM+iIYJHU5Ofz6
+ cJ3IjxCLxWCz2aBWq6FQKjGu1UA2xaHTFUK3N4Zbo/dwTig8zr5sbh4dptfllKfaH8Pq7xkE/H7o9Xoo
+ FArIZDJoNBo4OA4W1xx6yW8gkIDUMAVRdXUd+6q1VcUXi9Dn8MPudMJoMPBkuVzOk/ORpJJJuCMxyOix
+ EfoN6bgZoppqEWtpabmudPkhdQRxTc+hX2fACIX8P3lmZgbxeBwb2XVMBKPQxFagX87gR7nq37paURm7
+ KZEcl2oNaDM50WacxQ2jHQOqIT5nB2dHaimJx1RQbzwJDTXWxNIqzCTw7fc3Ap82NOxmkxYzuyXt4drG
+ bWifcOIHqxc/T7mgtNhg83jhjS5iciHKd+XkSgb2zDpUVg5t33zd0NHRwRgViVlMpiN3NbrH35mdkNh8
+ +IXS6ck3D9VFGYhDR82TJ3OZLPSBCHr7+u719HSz9vZ2xopogOgrmdloODZkmMh2cfPodEfQN7/I//cY
+ zYGJQrb+9icsFIlCqdK3tlzdW1paygoKCvhB3EXYS0tw7J2jb136/AuNdEj9j8LuwYhnAWO+ELScGz91
+ 316rFYmuHTpU8mx+eAl7CDSO28YBwiuEFwnFB14oPvJ2WZn49Kn3G0+WlzccfqP07J7CwhK6e37H7+Ud
+ u+A/uGZ/VDhOBqoAAAAASUVORK5CYII=
+
+
+
+
+ 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
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs
new file mode 100644
index 00000000..63ce6b5e
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs
@@ -0,0 +1,229 @@
+namespace WebsitePanel.Installer.Controls
+{
+ partial class SettingsControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsControl));
+ this.grpWebUpdate = new System.Windows.Forms.GroupBox();
+ this.btnCheck = new System.Windows.Forms.Button();
+ this.chkAutoUpdate = new System.Windows.Forms.CheckBox();
+ this.btnUpdate = new System.Windows.Forms.Button();
+ this.grpProxy = new System.Windows.Forms.GroupBox();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.lblPassword = new System.Windows.Forms.Label();
+ this.txtUserName = new System.Windows.Forms.TextBox();
+ this.lblUsername = new System.Windows.Forms.Label();
+ this.txtAddress = new System.Windows.Forms.TextBox();
+ this.lblAddress = new System.Windows.Forms.Label();
+ this.chkUseHTTPProxy = new System.Windows.Forms.CheckBox();
+ this.btnViewLog = new System.Windows.Forms.Button();
+ this.grpWebUpdate.SuspendLayout();
+ this.grpProxy.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // grpWebUpdate
+ //
+ this.grpWebUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpWebUpdate.Controls.Add(this.btnCheck);
+ this.grpWebUpdate.Controls.Add(this.chkAutoUpdate);
+ this.grpWebUpdate.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpWebUpdate.Location = new System.Drawing.Point(14, 3);
+ this.grpWebUpdate.Name = "grpWebUpdate";
+ this.grpWebUpdate.Size = new System.Drawing.Size(379, 83);
+ this.grpWebUpdate.TabIndex = 0;
+ this.grpWebUpdate.TabStop = false;
+ this.grpWebUpdate.Text = "Web update";
+ //
+ // btnCheck
+ //
+ this.btnCheck.Image = ((System.Drawing.Image)(resources.GetObject("btnCheck.Image")));
+ this.btnCheck.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCheck.Location = new System.Drawing.Point(19, 44);
+ this.btnCheck.Name = "btnCheck";
+ this.btnCheck.Size = new System.Drawing.Size(128, 28);
+ this.btnCheck.TabIndex = 1;
+ this.btnCheck.Text = "&Check For Updates";
+ this.btnCheck.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+ this.btnCheck.UseVisualStyleBackColor = true;
+ this.btnCheck.Click += new System.EventHandler(this.OnCheckClick);
+ //
+ // chkAutoUpdate
+ //
+ this.chkAutoUpdate.Checked = true;
+ this.chkAutoUpdate.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.chkAutoUpdate.Location = new System.Drawing.Point(19, 20);
+ this.chkAutoUpdate.Name = "chkAutoUpdate";
+ this.chkAutoUpdate.Size = new System.Drawing.Size(184, 18);
+ this.chkAutoUpdate.TabIndex = 0;
+ this.chkAutoUpdate.Text = "Automatically check for updates";
+ this.chkAutoUpdate.UseVisualStyleBackColor = true;
+ //
+ // btnUpdate
+ //
+ this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image")));
+ this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnUpdate.Location = new System.Drawing.Point(14, 236);
+ this.btnUpdate.Name = "btnUpdate";
+ this.btnUpdate.Size = new System.Drawing.Size(128, 28);
+ this.btnUpdate.TabIndex = 2;
+ this.btnUpdate.Text = "&Save Settings";
+ this.btnUpdate.Click += new System.EventHandler(this.OnUpdateClick);
+ //
+ // grpProxy
+ //
+ this.grpProxy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.grpProxy.Controls.Add(this.txtPassword);
+ this.grpProxy.Controls.Add(this.lblPassword);
+ this.grpProxy.Controls.Add(this.txtUserName);
+ this.grpProxy.Controls.Add(this.lblUsername);
+ this.grpProxy.Controls.Add(this.txtAddress);
+ this.grpProxy.Controls.Add(this.lblAddress);
+ this.grpProxy.Controls.Add(this.chkUseHTTPProxy);
+ this.grpProxy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.grpProxy.Location = new System.Drawing.Point(14, 91);
+ this.grpProxy.Name = "grpProxy";
+ this.grpProxy.Size = new System.Drawing.Size(379, 139);
+ this.grpProxy.TabIndex = 1;
+ this.grpProxy.TabStop = false;
+ this.grpProxy.Text = "Proxy";
+ //
+ // txtPassword
+ //
+ this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtPassword.Enabled = false;
+ this.txtPassword.Location = new System.Drawing.Point(125, 101);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '*';
+ this.txtPassword.Size = new System.Drawing.Size(234, 21);
+ this.txtPassword.TabIndex = 6;
+ //
+ // lblPassword
+ //
+ this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblPassword.Location = new System.Drawing.Point(19, 101);
+ this.lblPassword.Name = "lblPassword";
+ this.lblPassword.Size = new System.Drawing.Size(100, 21);
+ this.lblPassword.TabIndex = 5;
+ this.lblPassword.Text = "Password";
+ //
+ // txtUserName
+ //
+ this.txtUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtUserName.Enabled = false;
+ this.txtUserName.Location = new System.Drawing.Point(125, 74);
+ this.txtUserName.Name = "txtUserName";
+ this.txtUserName.Size = new System.Drawing.Size(234, 21);
+ this.txtUserName.TabIndex = 4;
+ //
+ // lblUsername
+ //
+ this.lblUsername.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblUsername.Location = new System.Drawing.Point(19, 74);
+ this.lblUsername.Name = "lblUsername";
+ this.lblUsername.Size = new System.Drawing.Size(100, 21);
+ this.lblUsername.TabIndex = 3;
+ this.lblUsername.Text = "User name";
+ //
+ // txtAddress
+ //
+ this.txtAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtAddress.Enabled = false;
+ this.txtAddress.Location = new System.Drawing.Point(125, 47);
+ this.txtAddress.Name = "txtAddress";
+ this.txtAddress.Size = new System.Drawing.Size(234, 21);
+ this.txtAddress.TabIndex = 2;
+ //
+ // lblAddress
+ //
+ this.lblAddress.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblAddress.Location = new System.Drawing.Point(19, 47);
+ this.lblAddress.Name = "lblAddress";
+ this.lblAddress.Size = new System.Drawing.Size(100, 21);
+ this.lblAddress.TabIndex = 1;
+ this.lblAddress.Text = "Address";
+ //
+ // chkUseHTTPProxy
+ //
+ this.chkUseHTTPProxy.Location = new System.Drawing.Point(19, 22);
+ this.chkUseHTTPProxy.Name = "chkUseHTTPProxy";
+ this.chkUseHTTPProxy.Size = new System.Drawing.Size(184, 18);
+ this.chkUseHTTPProxy.TabIndex = 0;
+ this.chkUseHTTPProxy.Text = "Use HTTP Proxy";
+ this.chkUseHTTPProxy.UseVisualStyleBackColor = true;
+ this.chkUseHTTPProxy.CheckedChanged += new System.EventHandler(this.OnUseHTTPProxyCheckedChanged);
+ //
+ // btnViewLog
+ //
+ this.btnViewLog.Image = ((System.Drawing.Image)(resources.GetObject("btnViewLog.Image")));
+ this.btnViewLog.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnViewLog.Location = new System.Drawing.Point(148, 236);
+ this.btnViewLog.Name = "btnViewLog";
+ this.btnViewLog.Size = new System.Drawing.Size(128, 28);
+ this.btnViewLog.TabIndex = 3;
+ this.btnViewLog.Text = "&View System Log";
+ this.btnViewLog.Click += new System.EventHandler(this.OnViewLogClick);
+ //
+ // SettingsControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.btnViewLog);
+ this.Controls.Add(this.grpProxy);
+ this.Controls.Add(this.btnUpdate);
+ this.Controls.Add(this.grpWebUpdate);
+ this.Name = "SettingsControl";
+ this.Size = new System.Drawing.Size(406, 327);
+ this.grpWebUpdate.ResumeLayout(false);
+ this.grpProxy.ResumeLayout(false);
+ this.grpProxy.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox grpWebUpdate;
+ private System.Windows.Forms.Button btnUpdate;
+ private System.Windows.Forms.CheckBox chkAutoUpdate;
+ private System.Windows.Forms.Button btnCheck;
+ private System.Windows.Forms.GroupBox grpProxy;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Label lblPassword;
+ private System.Windows.Forms.TextBox txtUserName;
+ private System.Windows.Forms.Label lblUsername;
+ private System.Windows.Forms.TextBox txtAddress;
+ private System.Windows.Forms.Label lblAddress;
+ private System.Windows.Forms.CheckBox chkUseHTTPProxy;
+ private System.Windows.Forms.Button btnViewLog;
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs
new file mode 100644
index 00000000..436b810f
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs
@@ -0,0 +1,182 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Threading;
+using System.Diagnostics;
+using System.IO;
+using System.Configuration;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+using WebsitePanel.Installer.Common;
+using WebsitePanel.Installer.Core;
+using WebsitePanel.Installer.Configuration;
+
+namespace WebsitePanel.Installer.Controls
+{
+ ///
+ /// Settings control
+ ///
+ internal partial class SettingsControl : ResultViewControl
+ {
+ ///
+ /// Initializes a new instance of the SettingsControl class.
+ ///
+ public SettingsControl()
+ {
+ InitializeComponent();
+ }
+
+ ///
+ /// Shows control
+ ///
+ ///
+ public override void ShowControl(AppContext context)
+ {
+ base.ShowControl(context);
+ if (!IsInitialized)
+ {
+ AppContext = context;
+ LoadSettings();
+ IsInitialized = true;
+ }
+ }
+
+ ///
+ /// Loads application settings
+ ///
+ private void LoadSettings()
+ {
+ InstallerSection appConfig = AppConfigManager.AppConfiguration;
+ chkAutoUpdate.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_AutoCheck);
+ chkUseHTTPProxy.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy);
+ txtAddress.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Address);
+ txtUserName.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_UserName);
+ txtPassword.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Password);
+ }
+
+ private void OnUseHTTPProxyCheckedChanged(object sender, EventArgs e)
+ {
+ txtAddress.Enabled = chkUseHTTPProxy.Checked;
+ txtUserName.Enabled = chkUseHTTPProxy.Checked;
+ txtPassword.Enabled = chkUseHTTPProxy.Checked;
+ }
+
+ ///
+ /// Save application configuration
+ ///
+ ///
+ ///
+ private void OnUpdateClick(object sender, EventArgs e)
+ {
+ KeyValueConfigurationCollection settings = AppConfigManager.AppConfiguration.Settings;
+ settings[ConfigKeys.Web_AutoCheck].Value = chkAutoUpdate.Checked.ToString();
+ settings[ConfigKeys.Web_Proxy_UseProxy].Value = chkUseHTTPProxy.Checked.ToString();
+ settings[ConfigKeys.Web_Proxy_Address].Value = txtAddress.Text;
+ settings[ConfigKeys.Web_Proxy_UserName].Value = txtUserName.Text;
+ settings[ConfigKeys.Web_Proxy_Password].Value = txtPassword.Text;
+ //
+ AppConfigManager.SaveConfiguration(true);
+ }
+
+ ///
+ /// Checks for updates
+ ///
+ ///
+ ///
+ private void OnCheckClick(object sender, EventArgs e)
+ {
+ //start check in the separated thread
+ AppContext.AppForm.StartAsyncProgress("Connecting...", true);
+ ThreadStart threadDelegate = new ThreadStart(StartCheck);
+ Thread newThread = new Thread(threadDelegate);
+ newThread.Start();
+ }
+
+ ///
+ /// Starts check
+ ///
+ private void StartCheck()
+ {
+ bool startUpdate = CheckForUpdate();
+ if (startUpdate)
+ {
+ AppContext.AppForm.Close();
+ }
+ }
+
+ ///
+ /// Checks for update
+ ///
+ ///
+ private bool CheckForUpdate()
+ {
+ string fileName;
+ bool updateAvailable = false;
+ try
+ {
+ updateAvailable = AppContext.AppForm.CheckForUpdate(out fileName);
+ AppContext.AppForm.FinishProgress();
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Service error", ex);
+ AppContext.AppForm.FinishProgress();
+ AppContext.AppForm.ShowServerError();
+ return false;
+ }
+
+ string appName = AppContext.AppForm.Text;
+ if (updateAvailable)
+ {
+ string message = string.Format("This version of {0} is out of date.\nWould you like to download the latest version?", appName);
+ if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
+ {
+ return AppContext.AppForm.StartUpdateProcess(fileName);
+ }
+ }
+ else
+ {
+ string message = string.Format("This version of {0} is up to date.", appName);
+ Log.WriteInfo(message);
+ AppContext.AppForm.ShowInfo(message);
+ }
+ return false;
+ }
+
+ private void OnViewLogClick(object sender, EventArgs e)
+ {
+ Log.ShowLogFile();
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx
new file mode 100644
index 00000000..bca2e66c
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI
+ k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0
+ MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh
+ /Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV
+ wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS
+ eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3
+ 3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2
+ A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG
+ IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH
+ COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn
+ jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ
+ EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC
+ ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I
+ u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy
+ W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV
+ gSO8kwAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAg1JREFUOE+tk+9L
+ U1EYx/fXFPQierHeDXphtZmFUBLcjNYLLcyiH26lkIbZFMfd1cwNXS0N07iL5na31tyVkshl5Cimc7AN
+ 8dZWLdLSpTbb+nbvCVYnrAg88Hlznuf5POccnqNSbcR64F+GV8hiaHAeNx0Z2KxpcBYJraYkGuqjBKNh
+ Goa6qSKHK+0o9vZ6sxgVAXPHPP62/I8i2FrmgplNYMv2kp+CYdfiPwWruTwE8QU273ZCV2qiBTy/gNHg
+ +idYWytA4dPnL7gXmMSmXTzU6hpa4LjxDvd9OTSZUsUbFArf8DVfwIePqwTp7SKGPE+J4NTZcVpgs6bg
+ dq/A0DSLaDyN8NQcxsMJPAzNYHgkTOB9EzByPwTHa8doQScnwelcgtkmgamdRNnRx9AcDGDbXjcp+BVN
+ pQB9lUgL2ttmcXtwAb32N+iySrBwSbS2x3CpJYJz5ycIJ888wbETY9BXi2D0flpwuTmOvv4MurolsB0J
+ qEur1kXpzBzx4wAj0ILGizH02NNgLUlS+CqVQV5+QIXsSo7A9gVJbD/jwb4KFy2ovxDF1WtzuNI2Q5KU
+ wopDAoKhGF6/XyIM+KZJTCnWlTtpgUEeU7Mljsbml38U9HsiJKYt51Gy585vAnnGjQ3PcbouRJLuep/B
+ 1D0CziHKBAns9QCJ7dAOQLPzFi2Qp0el07aQzf9hIz6y6juAficIctTi+AAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAiFJREFUOE+lk/9P
+ EmEcx+tPdLVaqx9arbH1Rbf8ha10Za3N1dJNB6sEhkFcXid+IcRSQjlJhJqAfJETIowvhzlLZjV4znfP
+ c4xDg7a2bnvfPXf7vF/vz/N8dicBnPiviwGa4ld3urhApWr3lzHuK8CyuI1nbz5jjPPAxLkguBZgdQjf
+ l7zevqZHM7MPjhW5FP1SQ0pWkGQqK1gJxzAyFYaYKuInLVrLyrDwc4okpW+q3bPb35KNc1k8tTnBBQuQ
+ 9oC4DCR2AU+0BGFyWtIAnZITNH2jSGCxC/hIjemvQHkf2DkAkhRmsgl1DfB8qai2vVlpiK0ZIF5SYH0x
+ geX0HuQfwC8C7CuAN16CwWBMagAzPaxNmVAjwUaJIFYgiFJFtusQnK9hn/Ehla+ARYakAgwmGwmHw90a
+ 4Ml8jiY3TO+zNYhbNQQyNbyaFcHzAvS378I8zoHjXmLYYEFkff3GsSmMurYQo8mBTB1+qSHeHUQ+l4fu
+ ei9EiaBn1E+3UseVhwvU2xq9OoUhZwprOdIyT3qQ/5THJV033iUOaEcEV4d8EDOHuPhgvh0wOBGn6UQt
+ ZFpdXoR+4DHM0yH6rqhiyQxwfsDdDrhvj2iFTUPreaglO8QKzvbPVtq20G/9cATQMPwplnymb6Z66tZU
+ VxtAPxbcdYa+dTQyUKfkY1PoNQZO94z4q9eGfdA98uLy4Fv1sC7cc+PcHVfH5I4/09HW/nX9G9TaBKNr
+ RrciAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs
new file mode 100644
index 00000000..e43adea9
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs
@@ -0,0 +1,115 @@
+namespace WebsitePanel.Installer
+{
+ partial class TopLogoControl
+ {
+ private System.Windows.Forms.Panel pnlLogo;
+ private System.Windows.Forms.PictureBox imgLogo;
+ private System.Windows.Forms.Label lblVersion;
+ private LineBox line;
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TopLogoControl));
+ this.pnlLogo = new System.Windows.Forms.Panel();
+ this.progressIcon = new WebsitePanel.Installer.Controls.ProgressIcon();
+ this.lblVersion = new System.Windows.Forms.Label();
+ this.imgLogo = new System.Windows.Forms.PictureBox();
+ this.line = new WebsitePanel.Installer.LineBox();
+ this.pnlLogo.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.imgLogo)).BeginInit();
+ this.SuspendLayout();
+ //
+ // pnlLogo
+ //
+ this.pnlLogo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.pnlLogo.BackColor = System.Drawing.Color.White;
+ this.pnlLogo.Controls.Add(this.progressIcon);
+ this.pnlLogo.Controls.Add(this.lblVersion);
+ this.pnlLogo.Controls.Add(this.imgLogo);
+ this.pnlLogo.Location = new System.Drawing.Point(0, 0);
+ this.pnlLogo.Name = "pnlLogo";
+ this.pnlLogo.Size = new System.Drawing.Size(496, 63);
+ this.pnlLogo.TabIndex = 2;
+ //
+ // progressIcon
+ //
+ this.progressIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.progressIcon.Location = new System.Drawing.Point(452, 15);
+ this.progressIcon.Name = "progressIcon";
+ this.progressIcon.Size = new System.Drawing.Size(30, 30);
+ this.progressIcon.TabIndex = 4;
+ this.progressIcon.Visible = false;
+ //
+ // lblVersion
+ //
+ this.lblVersion.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.lblVersion.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.lblVersion.Location = new System.Drawing.Point(317, 31);
+ this.lblVersion.Name = "lblVersion";
+ this.lblVersion.Size = new System.Drawing.Size(42, 13);
+ this.lblVersion.TabIndex = 2;
+ this.lblVersion.Text = "v1.0";
+ //
+ // imgLogo
+ //
+ this.imgLogo.Image = ((System.Drawing.Image)(resources.GetObject("imgLogo.Image")));
+ this.imgLogo.Location = new System.Drawing.Point(13, 7);
+ this.imgLogo.Name = "imgLogo";
+ this.imgLogo.Size = new System.Drawing.Size(303, 48);
+ this.imgLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.imgLogo.TabIndex = 0;
+ this.imgLogo.TabStop = false;
+ //
+ // line
+ //
+ this.line.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.line.Location = new System.Drawing.Point(0, 61);
+ this.line.Name = "line";
+ this.line.Size = new System.Drawing.Size(496, 2);
+ this.line.TabIndex = 3;
+ this.line.TabStop = false;
+ //
+ // TopLogoControl
+ //
+ this.BackColor = System.Drawing.Color.White;
+ this.Controls.Add(this.line);
+ this.Controls.Add(this.pnlLogo);
+ this.Name = "TopLogoControl";
+ this.Size = new System.Drawing.Size(496, 64);
+ this.pnlLogo.ResumeLayout(false);
+ this.pnlLogo.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.imgLogo)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private WebsitePanel.Installer.Controls.ProgressIcon progressIcon;
+
+
+ }
+}
+
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs
new file mode 100644
index 00000000..d1f65db9
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs
@@ -0,0 +1,62 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace WebsitePanel.Installer
+{
+ ///
+ /// Top logo
+ ///
+ internal partial class TopLogoControl : UserControl
+ {
+ ///
+ /// Initializes a new instance of the TopLogoControl class.
+ ///
+ public TopLogoControl()
+ {
+ // This call is required by the Windows Form Designer.
+ InitializeComponent();
+ lblVersion.Text = "v" + this.GetType().Assembly.GetName().Version.ToString(3);
+ }
+
+ internal void ShowProgress()
+ {
+ progressIcon.Visible = true;
+ progressIcon.StartAnimation();
+ }
+
+ internal void HideProgress()
+ {
+ progressIcon.Visible = false;
+ progressIcon.StopAnimation();
+ }
+ }
+}
+
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx
new file mode 100644
index 00000000..d8f29bf1
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ R0lGODlhLwEwAIcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8P
+ DxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMj
+ IyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3
+ Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktL
+ S0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9f
+ X2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNz
+ c3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeH
+ h4iIiImJiYuLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5yc
+ nJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7Cw
+ sLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TE
+ xMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY
+ 2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs
+ 7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///wAA
+ ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQJAAD/ACwAAAAALwEwAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAj
+ SpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0BT+htKtKjR
+ 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
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs
new file mode 100644
index 00000000..4843375d
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs
@@ -0,0 +1,255 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+using System.Security;
+using System.Security.Permissions;
+
+using WebsitePanel.Installer.Common;
+using WebsitePanel.Installer.Services;
+using System.Xml;
+using System.Runtime.Remoting.Lifetime;
+using System.Security.Principal;
+using WebsitePanel.Installer.Core;
+using WebsitePanel.Installer.Configuration;
+using System.Reflection;
+
+namespace WebsitePanel.Installer
+{
+ ///
+ /// Entry point class
+ ///
+ static class Program
+ {
+ public const string SetupFromXmlFileParam = "setupxml";
+
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ //
+ Utils.FixConfigurationSectionDefinition();
+
+ //check security permissions
+ if (!Utils.CheckSecurity())
+ {
+ ShowSecurityError();
+ return;
+ }
+
+ //check administrator permissions
+ if (!Utils.IsAdministrator())
+ {
+ ShowSecurityError();
+ return;
+ }
+
+ //check for running instance
+ if ( !Utils.IsNewInstance())
+ {
+ UiUtils.ShowRunningInstance();
+ return;
+ }
+
+ Log.WriteApplicationStart();
+ //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
+ Application.ApplicationExit += new EventHandler(OnApplicationExit);
+ Application.ThreadException += new ThreadExceptionEventHandler(OnThreadException);
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+
+ //check OS version
+ Log.WriteInfo("{0} detected", Global.OSVersion);
+
+ //check IIS version
+ if (Global.IISVersion.Major == 0)
+ Log.WriteError("IIS not found.");
+ else
+ Log.WriteInfo("IIS {0} detected", Global.IISVersion);
+
+ ApplicationForm mainForm = new ApplicationForm();
+
+ if (!CheckCommandLineArgument("/nocheck"))
+ {
+ //Check for new versions
+ if (CheckForUpdate(mainForm))
+ {
+ return;
+ }
+ }
+ // Load setup parameters from an XML file
+ LoadSetupXmlFile();
+ //start application
+ mainForm.InitializeApplication();
+ Application.Run(mainForm);
+ //
+ Utils.SaveMutex();
+ }
+
+ private static void LoadSetupXmlFile()
+ {
+ string file = GetCommandLineArgumentValue(SetupFromXmlFileParam);
+ if (!string.IsNullOrEmpty(file))
+ {
+ if (FileUtils.FileExists(file))
+ {
+ try
+ {
+ XmlDocument doc = new XmlDocument();
+ doc.Load(file);
+ Global.SetupXmlDocument = doc;
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("I/O error", ex);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Application thread exception handler
+ ///
+ static void OnThreadException(object sender, ThreadExceptionEventArgs e)
+ {
+ Log.WriteError("Fatal error occured.", e.Exception);
+ string message = "A fatal error has occurred. We apologize for this inconvenience.\n" +
+ "Please contact Technical Support at support@websitepanel.net.\n\n" +
+ "Make sure you include a copy of the Installer.log file from the\n" +
+ "WebsitePanel Installer home directory.";
+ MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ Application.Exit();
+ }
+
+ ///
+ /// Application exception handler
+ ///
+ static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ Log.WriteError("Fatal error occured.", (Exception)e.ExceptionObject);
+ string message = "A fatal error has occurred. We apologize for this inconvenience.\n" +
+ "Please contact Technical Support at support@websitepanel.net.\n\n" +
+ "Make sure you include a copy of the Installer.log file from the\n" +
+ "WebsitePanel Installer home directory.";
+ MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ Process.GetCurrentProcess().Kill();
+ }
+
+ private static void ShowSecurityError()
+ {
+ string message = "You do not have the appropriate permissions to perform this operation. Make sure you are running the application from the local disk and you have local system administrator privileges.";
+ MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ ///
+ /// Writes to log on application exit
+ ///
+ private static void OnApplicationExit(object sender, EventArgs e)
+ {
+ Log.WriteApplicationEnd();
+ }
+
+ ///
+ /// Check whether application is up-to-date
+ ///
+ private static bool CheckForUpdate(ApplicationForm mainForm)
+ {
+ if (!AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_AutoCheck))
+ return false;
+
+ string appName = mainForm.Text;
+ string fileName;
+ bool updateAvailable;
+ try
+ {
+ updateAvailable = mainForm.CheckForUpdate(out fileName);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError("Update error", ex);
+ mainForm.ShowServerError();
+ return false;
+ }
+
+ if (updateAvailable)
+ {
+ string message = string.Format("An updated version of {0} is available now.\nWould you like to download and install the latest version?", appName);
+ if (MessageBox.Show(message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
+ {
+ return mainForm.StartUpdateProcess(fileName);
+ }
+ }
+ return false;
+ }
+
+ ///
+ /// Check for existing command line argument
+ ///
+ private static bool CheckCommandLineArgument(string argName)
+ {
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ string arg = args[i];
+ if (string.Equals(arg, argName, StringComparison.InvariantCultureIgnoreCase))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ ///
+ /// Check for existing command line argument
+ ///
+ private static string GetCommandLineArgumentValue(string argName)
+ {
+ string key = "/"+argName.ToLower()+":";
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ string arg = args[i].ToLower();
+ if (arg.StartsWith(key))
+ {
+ return arg.Substring(key.Length);
+ }
+ }
+ return null;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..30bd80b6
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs
@@ -0,0 +1,49 @@
+// Copyright (c) 2011, Outercurve Foundation.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// - Neither the name of the Outercurve Foundation nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("WebsitePanel Installer")]
+[assembly: AssemblyDescription("WebsitePanel Installer")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyProduct("WebsitePanel Installer")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("45D4837C-45BA-426A-B41C-BCD17AD97FCD")]
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..d051c368
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs
@@ -0,0 +1,147 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace WebsitePanel.Installer.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.Installer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ internal static System.Drawing.Icon Computer16 {
+ get {
+ object obj = ResourceManager.GetObject("Computer16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Computer32 {
+ get {
+ object obj = ResourceManager.GetObject("Computer32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Folder16 {
+ get {
+ object obj = ResourceManager.GetObject("Folder16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Folder32 {
+ get {
+ object obj = ResourceManager.GetObject("Folder32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Network16 {
+ get {
+ object obj = ResourceManager.GetObject("Network16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Network32 {
+ get {
+ object obj = ResourceManager.GetObject("Network32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Service16 {
+ get {
+ object obj = ResourceManager.GetObject("Service16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Service32 {
+ get {
+ object obj = ResourceManager.GetObject("Service32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Tool16 {
+ get {
+ object obj = ResourceManager.GetObject("Tool16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon Tool32 {
+ get {
+ object obj = ResourceManager.GetObject("Tool32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon World16 {
+ get {
+ object obj = ResourceManager.GetObject("World16", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+
+ internal static System.Drawing.Icon World32 {
+ get {
+ object obj = ResourceManager.GetObject("World32", resourceCulture);
+ return ((System.Drawing.Icon)(obj));
+ }
+ }
+ }
+}
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx
new file mode 100644
index 00000000..1e11f25c
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\Computer16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Computer32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Folder16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Folder32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Network16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Network32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Service16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Service32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Tool16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Tool32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\World16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\World32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico
new file mode 100644
index 00000000..c897d0b1
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico
new file mode 100644
index 00000000..3a748010
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico
new file mode 100644
index 00000000..9a3997fe
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico
new file mode 100644
index 00000000..74b3cfed
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico
new file mode 100644
index 00000000..cc3e55e4
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico
new file mode 100644
index 00000000..079bf865
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico
new file mode 100644
index 00000000..24450b83
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico
new file mode 100644
index 00000000..93487a27
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico
new file mode 100644
index 00000000..fabc1ac5
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico
new file mode 100644
index 00000000..b1b76737
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico
new file mode 100644
index 00000000..10fcb36c
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico
new file mode 100644
index 00000000..3809be96
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico
new file mode 100644
index 00000000..7e774ed4
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe
new file mode 100644
index 00000000..7e9327c6
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj
new file mode 100644
index 00000000..2e547b11
--- /dev/null
+++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj
@@ -0,0 +1,297 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {A358C6E2-F57D-4AB9-B13D-FD3048134143}
+ WinExe
+ Properties
+ WebsitePanel.Installer
+ WebsitePanel.Installer
+ websitepanel.ico
+
+
+ 3.5
+
+
+ v4.0
+ false
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ true
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ AllRules.ruleset
+ false
+
+
+ none
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ AllRules.ruleset
+
+
+ Always
+
+
+
+ False
+ ..\..\Lib\Ionic.Zip.Reduced.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VersionInfo.cs
+
+
+ Form
+
+
+ ApplicationForm.cs
+
+
+
+
+ Code
+
+
+ UserControl
+
+
+ Form
+
+
+ Loader.cs
+
+
+
+
+ UserControl
+
+
+ ComponentsControl.cs
+
+
+ UserControl
+
+
+ ComponentControl.cs
+
+
+ UserControl
+
+
+ UserControl
+
+
+ SettingsControl.cs
+
+
+ UserControl
+
+
+ ServiceControl.cs
+
+
+ UserControl
+
+
+ ServerControl.cs
+
+
+ Component
+
+
+ LineBox.cs
+
+
+ UserControl
+
+
+ ServersControl.cs
+
+
+ UserControl
+
+
+ TopLogoControl.cs
+
+
+
+
+ Designer
+ ApplicationForm.cs
+
+
+ ComponentsControl.cs
+ Designer
+
+
+ ComponentControl.cs
+ Designer
+
+
+ Designer
+ Loader.cs
+
+
+ SettingsControl.cs
+ Designer
+
+
+ ServiceControl.cs
+ Designer
+
+
+ ServerControl.cs
+ Designer
+
+
+ Designer
+ ServersControl.cs
+
+
+ Designer
+ TopLogoControl.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+ ProgressIcon.cs
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ true
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+ {0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}
+ WebsitePanel.Installer.Core
+
+
+
+
+
+
+
+
+ COPY "$(ProjectDir)App.$(ConfigurationName).config" "$(ProjectDir)App.config" /Y
+
+
+
\ No newline at end of file
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico
new file mode 100644
index 00000000..09b98f81
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico differ
diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico
new file mode 100644
index 00000000..10fcb36c
Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico differ