initial commit

This commit is contained in:
Arin(asus)
2024-11-26 20:15:16 +09:00
commit 973524ee77
435 changed files with 103766 additions and 0 deletions

View File

@@ -0,0 +1,281 @@
using System.Collections.Generic;
using System;
using System.Drawing;
using System.Diagnostics;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using vmsnet;
namespace vmsnet
{
partial class Frm_trend_Real : System.Windows.Forms.Form
{
//Form은 Dispose를 재정의하여 구성 요소 목록을 정리합니다.
[System.Diagnostics.DebuggerNonUserCode()]protected override void Dispose(bool disposing)
{
try
{
if (disposing && components != null)
{
components.Dispose();
}
}
finally
{
base.Dispose(disposing);
}
}
//참고: 다음 프로시저는 Windows Form 디자이너에 필요합니다.
//수정하려면 Windows Form 디자이너를 사용하십시오.
//코드 편집기를 사용하여 수정하지 마십시오.
[System.Diagnostics.DebuggerStepThrough()]
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Frm_trend_Real));
this.ToolTip1 = new System.Windows.Forms.ToolTip();
this.Panel1 = new System.Windows.Forms.Panel();
this.cmb_tanks = new System.Windows.Forms.ComboBox();
this.btSelectCH = new System.Windows.Forms.Button();
this.Label4 = new System.Windows.Forms.Label();
this.TableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.Panel2 = new System.Windows.Forms.Panel();
this.bsCHList = new System.Windows.Forms.BindingSource();
this.documentElement1 = new vmsnet.DocumentElement();
this.Timer1 = new System.Windows.Forms.Timer();
this.ds1 = new vmsnet.DS1();
this.ToolStrip2 = new System.Windows.Forms.ToolStrip();
this.ToolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.cmb_volt = new System.Windows.Forms.ToolStripComboBox();
this.ToolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
this.cmb_time = new System.Windows.Forms.ToolStripComboBox();
this.prb1 = new System.Windows.Forms.ToolStripProgressBar();
this.btConfig = new System.Windows.Forms.ToolStripButton();
this.Panel1.SuspendLayout();
this.TableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bsCHList)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.documentElement1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ds1)).BeginInit();
this.ToolStrip2.SuspendLayout();
this.SuspendLayout();
//
// Panel1
//
this.Panel1.BackColor = System.Drawing.Color.WhiteSmoke;
this.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Panel1.Controls.Add(this.cmb_tanks);
this.Panel1.Controls.Add(this.btSelectCH);
this.Panel1.Controls.Add(this.Label4);
this.Panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.Panel1.Location = new System.Drawing.Point(0, 0);
this.Panel1.Margin = new System.Windows.Forms.Padding(0);
this.Panel1.Name = "Panel1";
this.Panel1.Padding = new System.Windows.Forms.Padding(3);
this.Panel1.Size = new System.Drawing.Size(1247, 39);
this.Panel1.TabIndex = 7;
this.Panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.Panel1_Paint);
//
// cmb_tanks
//
this.cmb_tanks.Dock = System.Windows.Forms.DockStyle.Fill;
this.cmb_tanks.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmb_tanks.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.cmb_tanks.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
this.cmb_tanks.FormattingEnabled = true;
this.cmb_tanks.Location = new System.Drawing.Point(72, 3);
this.cmb_tanks.Name = "cmb_tanks";
this.cmb_tanks.Size = new System.Drawing.Size(1052, 32);
this.cmb_tanks.TabIndex = 16;
this.cmb_tanks.SelectedIndexChanged += new System.EventHandler(this.cmb_group_SelectedIndexChanged);
//
// btSelectCH
//
this.btSelectCH.Dock = System.Windows.Forms.DockStyle.Right;
this.btSelectCH.Location = new System.Drawing.Point(1124, 3);
this.btSelectCH.Name = "btSelectCH";
this.btSelectCH.Size = new System.Drawing.Size(118, 31);
this.btSelectCH.TabIndex = 19;
this.btSelectCH.Text = "채널선택";
this.btSelectCH.UseVisualStyleBackColor = true;
this.btSelectCH.Click += new System.EventHandler(this.btSelectCH_Click);
//
// Label4
//
this.Label4.Dock = System.Windows.Forms.DockStyle.Left;
this.Label4.Location = new System.Drawing.Point(3, 3);
this.Label4.Name = "Label4";
this.Label4.Size = new System.Drawing.Size(69, 31);
this.Label4.TabIndex = 15;
this.Label4.Text = "그룹";
this.Label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// TableLayoutPanel1
//
this.TableLayoutPanel1.ColumnCount = 1;
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.TableLayoutPanel1.Controls.Add(this.Panel2, 0, 1);
this.TableLayoutPanel1.Controls.Add(this.Panel1, 0, 0);
this.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.TableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.TableLayoutPanel1.Name = "TableLayoutPanel1";
this.TableLayoutPanel1.RowCount = 2;
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(1247, 864);
this.TableLayoutPanel1.TabIndex = 9;
//
// Panel2
//
this.Panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.Panel2.Location = new System.Drawing.Point(3, 42);
this.Panel2.Name = "Panel2";
this.Panel2.Size = new System.Drawing.Size(1241, 819);
this.Panel2.TabIndex = 8;
//
// bsCHList
//
this.bsCHList.DataMember = "TRENDVIEWCHLIST";
this.bsCHList.DataSource = this.documentElement1;
this.bsCHList.Sort = "SHOW,IDX";
//
// documentElement1
//
this.documentElement1.DataSetName = "DocumentElement";
this.documentElement1.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// Timer1
//
this.Timer1.Interval = 200;
this.Timer1.Tick += new System.EventHandler(this.Timer1_Tick);
//
// ds1
//
this.ds1.DataSetName = "DS1";
this.ds1.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// ToolStrip2
//
this.ToolStrip2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.ToolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripLabel1,
this.cmb_volt,
this.ToolStripLabel2,
this.cmb_time,
this.prb1,
this.btConfig});
this.ToolStrip2.Location = new System.Drawing.Point(0, 864);
this.ToolStrip2.Name = "ToolStrip2";
this.ToolStrip2.Size = new System.Drawing.Size(1247, 29);
this.ToolStrip2.TabIndex = 10;
this.ToolStrip2.Text = "ToolStrip2";
//
// ToolStripLabel1
//
this.ToolStripLabel1.Name = "ToolStripLabel1";
this.ToolStripLabel1.Size = new System.Drawing.Size(55, 26);
this.ToolStripLabel1.Text = "전압범위";
//
// cmb_volt
//
this.cmb_volt.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmb_volt.Items.AddRange(new object[] {
"Auto",
"3v",
"5v",
"7v",
"9v",
"11v",
"13v",
"15v",
"17v",
"20v"});
this.cmb_volt.Name = "cmb_volt";
this.cmb_volt.Size = new System.Drawing.Size(75, 29);
this.cmb_volt.SelectedIndexChanged += new System.EventHandler(this.cmb_volt_SelectedIndexChanged);
//
// ToolStripLabel2
//
this.ToolStripLabel2.Name = "ToolStripLabel2";
this.ToolStripLabel2.Size = new System.Drawing.Size(55, 26);
this.ToolStripLabel2.Text = "시간범위";
//
// cmb_time
//
this.cmb_time.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmb_time.Items.AddRange(new object[] {
"1분",
"3분",
"5분",
"10분",
"30분",
"60분"});
this.cmb_time.Name = "cmb_time";
this.cmb_time.Size = new System.Drawing.Size(75, 29);
this.cmb_time.SelectedIndexChanged += new System.EventHandler(this.cmb_time_SelectedIndexChanged_1);
//
// prb1
//
this.prb1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.prb1.Name = "prb1";
this.prb1.Size = new System.Drawing.Size(100, 26);
//
// btConfig
//
this.btConfig.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.btConfig.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.btConfig.Image = global::vmsnet.Properties.Resources.graphsetting;
this.btConfig.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btConfig.Name = "btConfig";
this.btConfig.Size = new System.Drawing.Size(23, 26);
this.btConfig.Text = "config";
this.btConfig.Click += new System.EventHandler(this.btConfig_Click);
//
// Frm_trend_Real
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(1247, 893);
this.Controls.Add(this.TableLayoutPanel1);
this.Controls.Add(this.ToolStrip2);
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.999999F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.KeyPreview = true;
this.Name = "Frm_trend_Real";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "트렌드뷰(실시간)";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Frm_trend_FormClosing);
this.Load += new System.EventHandler(this.Frm_trend_Load);
this.Panel1.ResumeLayout(false);
this.TableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.bsCHList)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.documentElement1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ds1)).EndInit();
this.ToolStrip2.ResumeLayout(false);
this.ToolStrip2.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
internal System.Windows.Forms.ToolTip ToolTip1;
internal System.Windows.Forms.Panel Panel1;
internal System.Windows.Forms.ComboBox cmb_tanks;
internal System.Windows.Forms.Label Label4;
internal System.Windows.Forms.TableLayoutPanel TableLayoutPanel1;
internal System.Windows.Forms.Panel Panel2;
internal Button btSelectCH;
internal Timer Timer1;
private System.ComponentModel.IContainer components;
private BindingSource bsCHList;
private DocumentElement documentElement1;
private DS1 ds1;
internal ToolStrip ToolStrip2;
internal ToolStripLabel ToolStripLabel1;
internal ToolStripComboBox cmb_volt;
internal ToolStripLabel ToolStripLabel2;
internal ToolStripComboBox cmb_time;
internal ToolStripProgressBar prb1;
private ToolStripButton btConfig;
}
}

View File

@@ -0,0 +1,555 @@
using System.Collections.Generic;
using System;
using System.Drawing;
using System.Diagnostics;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using TrendCtrlII;
using AR;
using System.Data.SqlTypes;
using System.Diagnostics.Eventing.Reader;
using System.Data.Linq;
namespace vmsnet
{
public partial class Frm_trend_Real
{
private string lasttime = "";
private DateTime EndDate = DateTime.Now;
private bool init = false;
private HMI.DispCtrl DispCtrl1;
readonly ScottPlot.WinForms.FormsPlot formsPlot1;
ScottPlot.Plottables.Scatter[] Streamer1;
List<float>[] dataVolt = null;
List<double>[] dataTime = null;
short voltlimit = 0;
short timelimit = 10;
public Frm_trend_Real(HMI.DispCtrl dispctrl)
{
// 디자이너에서 이 호출이 필요합니다.
InitializeComponent();
// InitializeComponent() 호출 뒤에 초기화 코드를 추가하세요.
//현재데이터베이스를 복제한다.
MakeTempDatabase();
formsPlot1 = new ScottPlot.WinForms.FormsPlot() { Dock = DockStyle.Fill };
formsPlot1.MouseDown += FormsPlot1_MouseDown;
formsPlot1.MouseUp += FormsPlot1_MouseUp;
formsPlot1.MouseMove += FormsPlot1_MouseMove;
CrossHair = formsPlot1.Plot.Add.Crosshair(0, 0);
CrossHair.TextColor = ScottPlot.Colors.White;
CrossHair.TextBackgroundColor = CrossHair.HorizontalLine.Color;
formsPlot1.Plot.YLabel("VOLTAGE");
formsPlot1.Plot.XLabel("COUNT");
formsPlot1.Plot.Axes.Bottom.MinimumSize = PUB.TREND.graph_bottom_minsize;
this.formsPlot1.Plot.ShowLegend();
formsPlot1.Plot.Axes.DateTimeTicksBottom();
this.formsPlot1.Plot.Axes.ContinuouslyAutoscale = true;
this.formsPlot1.Plot.RenderManager.RenderStarting += (s1, e1) =>
{
ScottPlot.Tick[] ticks = formsPlot1.Plot.Axes.Bottom.TickGenerator.Ticks;
for (int i = 0; i < ticks.Length; i++)
{
DateTime dt = DateTime.FromOADate(ticks[i].Position);
string label = $"{dt:yy-MM-dd\nHH:mm:ss}";
ticks[i] = new ScottPlot.Tick(ticks[i].Position, label);
}
};
Panel2.Controls.Clear();
this.Panel2.Controls.Add(this.formsPlot1);
////그룹데이터목록
this.cmb_tanks.Items.Clear();
for (int i = 0; i <= dispctrl.GROUPS.Length - 1; i++)
{
var grp = dispctrl.GROUPS[i];
this.cmb_tanks.Items.Add(grp.);
}
DispCtrl1 = dispctrl;
PUB.RemoteCommandEvent += Pub_RemoteCommandEvent;
Refresh_전해조목록();
if (this.cmb_tanks.Items.Count > 0)
this.cmb_tanks.SelectedIndex = 0;
Streamer1 = new ScottPlot.Plottables.Scatter[0];
dataVolt = new List<float>[0];
dataTime = new List<double>[0];
}
public void Frm_trend_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
saveviewSetting();
PUB.RemoteCommandEvent -= Pub_RemoteCommandEvent;
formsPlot1.MouseDown -= FormsPlot1_MouseDown;
formsPlot1.MouseUp -= FormsPlot1_MouseUp;
formsPlot1.MouseMove -= FormsPlot1_MouseMove;
Timer1.Stop();
}
void MakeTempDatabase()
{
//현재데이터베이스를 복제한다.
this.documentElement1.Clear();
this.documentElement1.GRP.Merge(PUB.DS.GRP);
this.documentElement1.CHANNEL.Merge(PUB.DS.CHANNEL);
this.documentElement1.AcceptChanges();
this.ds1.Clear();
this.ds1.AcceptChanges();
}
private void Refresh_전해조목록()
{
this.cmb_tanks.Items.Clear();
var grplist = this.documentElement1.GRP.Where(t => t.USE == 1);
if (grplist.Any() == false)
{
UTIL.MsgE("활성화된 그룹이 없습니다");
return;
}
var namelist = grplist.Select(t => $"[{t.IDX:00}] {t.TITLE}").ToArray();
this.cmb_tanks.Items.AddRange(namelist);
}
public void Frm_trend_Load(System.Object sender, System.EventArgs e)
{
EndDate = DateTime.Now;
////마지막으로 선택한 그룹을 선택해준다.
var selidx0 = (PUB.CONFIG.tvr_selectgroup0); // XMl.Data("trendview", "selectgroup0", "0")
this.cmb_tanks.SelectedIndex = selidx0;
loadviewSetting();
init = true;
Timer1.Start();
}
private void Pub_RemoteCommandEvent(object sender, RemoteCommand e)
{
if (e.Command == rCommand.ValueUpdate)
{
//스트리머,데이터,선택된 채널 정보가 있어야 업데이트 가능하다
if (e.Data != null && this.Streamer1 != null && this.selectchlist.Any())
{
var data = e.Data as List<NotifyData>;
//선택된 채널의 정보만 사용
var recvdatas = data.Where(t => selectchlist.Contains(t.chno)).Select(t => t);
if (recvdatas.Any() == false) return; //대상채널데이터가 없다.
//받은데이터를 화면에 추가한다.
foreach (var newdata in recvdatas)
{
var ch = newdata.chno - 1;
var val = newdata.value;
var time = newdata.time;
//자료가없거나 스트리머가 없는 경우
if (ch >= this.Streamer1.Length || this.Streamer1[ch] == null) continue;
float value = 0;
if (PUB.CONFIG.datadiv != 0 && PUB.CONFIG.datadiv != 1)
value = (newdata.value) / PUB.CONFIG.datadiv;
else
value = (newdata.value);
//채널정보를 통해서 소수점위치와 옾셋값을 가져온다
if (newdata.decpos > 0) value = (float)(value / Math.Pow(10, newdata.decpos));
//최종옵셋
value += newdata.offset;
//데이터 추가
if (this.Streamer1[ch].IsVisible)
{
var v_time = DateTime.Parse(time);
this.dataTime[ch].Add(v_time.ToOADate());
this.dataVolt[ch].Add(value);
var mintime = DateTime.FromOADate(dataTime[ch].First());
var maxtime = DateTime.FromOADate(dataTime[ch].Last());
var ts = (maxtime - mintime);
if (ts.TotalMinutes >= this.timelimit)
{
//10개지운다
if (dataTime[ch].Count > 10)
{
dataTime[ch].RemoveRange(0, 10);
dataVolt[ch].RemoveRange(0, 10);
}
}
}
}
this.BeginInvoke(new Action(() =>
{
if (voltlimit != 0) formsPlot1.Plot.Axes.AutoScaleX();
this.formsPlot1.Refresh();
}));
}
}
}
#region "scott plot mouse event"
ScottPlot.Plottables.Crosshair CrossHair;
ScottPlot.Plottables.VerticalLine[] CursorLine;
private ScottPlot.Plottables.AxisLine GetLineUnderMouse(float x, float y)
{
ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(x, y, radius: 10);
foreach (var axLine in formsPlot1.Plot.GetPlottables<ScottPlot.Plottables.AxisLine>().Reverse())
{
if (axLine.IsUnderMouse(rect))
return axLine;
}
return null;
}
private void FormsPlot1_MouseDown(object sender, MouseEventArgs e)
{
var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
if (lineUnderMouse != null)
{
PlottableBeingDragged = lineUnderMouse;
formsPlot1.Interaction.Disable(); // disable panning while dragging
}
}
private void FormsPlot1_MouseUp(object sender, MouseEventArgs e)
{
PlottableBeingDragged = null;
formsPlot1.Interaction.Enable(); // enable panning again
formsPlot1.Refresh();
}
ScottPlot.Plottables.AxisLine PlottableBeingDragged = null;
private void FormsPlot1_MouseMove(object sender, MouseEventArgs e)
{
//update cross line
ScottPlot.Pixel mousePixel = new ScottPlot.Pixel(e.X, e.Y);
ScottPlot.Coordinates mouseCoordinates = formsPlot1.Plot.GetCoordinates(mousePixel);
if (mouseCoordinates.X is double.NaN || mouseCoordinates.Y is double.NaN ||
mouseCoordinates.X is double.PositiveInfinity || mouseCoordinates.Y is double.PositiveInfinity ||
mouseCoordinates.X is double.NegativeInfinity || mouseCoordinates.Y is double.NegativeInfinity)
{
return;
}
if (CrossHair != null)
{
CrossHair.Position = mouseCoordinates;
var time = DateTime.FromOADate(mouseCoordinates.X);
CrossHair.VerticalLine.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
CrossHair.HorizontalLine.Text = $"{mouseCoordinates.Y:N2}v";
formsPlot1.Refresh();
}
// this rectangle is the area around the mouse in coordinate units
ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(e.X, e.Y, radius: 10);
if (PlottableBeingDragged is null)
{
// set cursor based on what's beneath the plottable
var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
if (lineUnderMouse is null) Cursor = Cursors.Default;
else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.VerticalLine) Cursor = Cursors.SizeWE;
else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.HorizontalLine) Cursor = Cursors.SizeNS;
}
else
{
// update the position of the plottable being dragged
if (PlottableBeingDragged is ScottPlot.Plottables.HorizontalLine hl)
{
hl.Y = rect.VerticalCenter;
hl.Text = $"{hl.Y:0.00}v";
}
else if (PlottableBeingDragged is ScottPlot.Plottables.VerticalLine vl)
{
vl.X = rect.HorizontalCenter;
var time = DateTime.FromOADate(vl.X);
//vl.Text = $"{vl.X:0.00}";
vl.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
}
formsPlot1.Refresh();
}
}
#endregion
//그룹이 선택된 경우
public void cmb_group_SelectedIndexChanged(System.Object sender, System.EventArgs e)
{
if (cmb_tanks.SelectedIndex < 0) return;
if (System.Diagnostics.Debugger.IsAttached) Console.WriteLine($"grp selectedindex val={cmb_tanks.SelectedIndex}");
//현재등록된 목록을 모두 삭제
this.ds1.channel.Clear();
this.formsPlot1.Plot.Remove<ScottPlot.Plottables.DataStreamer>(); //데이터스트림삭제
this.formsPlot1.Refresh();
var grpName = cmb_tanks.Text.Substring(4).Trim();
var grpNo = int.Parse(cmb_tanks.Text.Substring(1, 2));
var grpdr = this.documentElement1.GRP.Where(t => t.TITLE.Equals(grpName)).FirstOrDefault();
if (grpdr == null) return;
var chlist = this.documentElement1.CHANNEL.Where(t => t.GIDX == grpdr.IDX);
if (chlist.Any() == false) return;
// 미리저장된 목록을 확인한다.
var chstr = "";
if (grpNo == 0) chstr = PUB.CONFIG.grp0chlist;
else if (grpNo == 1) chstr = PUB.CONFIG.grp1chlist;
else if (grpNo == 2) chstr = PUB.CONFIG.grp2chlist;
else if (grpNo == 3) chstr = PUB.CONFIG.grp3chlist;
else if (grpNo == 4) chstr = PUB.CONFIG.grp4chlist;
else if (grpNo == 5) chstr = PUB.CONFIG.grp5chlist;
else if (grpNo == 6) chstr = PUB.CONFIG.grp6chlist;
else if (grpNo == 7) chstr = PUB.CONFIG.grp7chlist;
else if (grpNo == 8) chstr = PUB.CONFIG.grp8chlist;
else if (grpNo == 9) chstr = PUB.CONFIG.grp9chlist;
var chbuf = chstr.Split((char[])(new[] { ',' }), StringSplitOptions.RemoveEmptyEntries);
//목록은 추가하지만 스트립을 추가하지 않으니 최초 선택시에는 데이터가 나오지 않는다.
//사용자는 채널 선택을 사용해야 데이터가 보인다.
this.ds1.channel.Clear();
this.selectchlist.Clear();
foreach (var dr in chlist)
{
var newdr = ds1.channel.NewchannelRow();
newdr.idx = dr.IDX;
newdr.use = chbuf.Contains(dr.IDX.ToString()) ? true : false;
newdr.c1 = "";
newdr.c2 = "";
newdr.cname = dr.TITLE;
newdr.cc = dr.COLOR;
ds1.channel.AddchannelRow(newdr);
}
ds1.channel.AcceptChanges();
formsPlot1.Refresh();
}
public void ToolStripButton1_Click_1(object sender, EventArgs e)
{
string dir = System.IO.Path.Combine(PUB.CONFIG.GetDatabasePath(), "DataBase", "volt");
UTIL.RunExplorer(dir);
}
private void loadviewSetting()
{
cmb_volt.SelectedIndex = (PUB.CONFIG.cell_voltindex); // Xml.Data("rtlview", "voltindex", "1")
cmb_time.SelectedIndex = (PUB.CONFIG.cell_timeindex); // XMl.Data("rtlview", "timeindex", "0")
}
private void saveviewSetting()
{
PUB.CONFIG.cell_voltindex = (cmb_volt.SelectedIndex);
PUB.CONFIG.cell_timeindex = (cmb_time.SelectedIndex);
PUB.CONFIG.Save();
}
public void bs_grp_CurrentChanged(object sender, EventArgs e)
{
////사용자가 그룹을 선택하면 해당 그룹에 연결된 채널목록을 가지고 사용 데이터 그룹을 결정함
}
/// <summary>
/// 1부터시작하는 채널의 번호입니다.(인덱스가 아님)
/// 채널선택화면에서 선택된 채널 번호만 들어있다.
/// docuementElement1 에는 모든 그룹/채널 정보가 들어있다
/// </summary>
List<int> selectchlist = new List<int>();
public void btSelectCH_Click(object sender, EventArgs e)
{
var grpName = cmb_tanks.Text.Substring(4).Trim();
var grpNo = int.Parse(cmb_tanks.Text.Substring(1, 2));
//현재선택된 그룹의 채널목록을 추출해야한다.
if (grpName.isEmpty())
{
UTIL.MsgE("채널 그룹을 선택하세요");
return;
}
var drGrp = documentElement1.GRP.Where(t => t.TITLE == grpName).FirstOrDefault();
if (drGrp == null)
{
UTIL.MsgE("선택된 채널 그룹 정보가 없습니다");
return;
}
//채널목록을 확인한다.
var chrows = documentElement1.CHANNEL.Where(t => t.GIDX == drGrp.IDX);
if (chrows.Any() == false)
{
UTIL.MsgE("해당 그룹에 등록된 채널정보가 없습니다");
return;
}
//현재 등록된 채널정보를 토대로 데이터를 선택한다
using (var f = new Frm_SelectCH(ds1.channel))
{
if (f.ShowDialog() == DialogResult.OK)
{
//현재등록된 목록을 모두 삭제
this.formsPlot1.Plot.Remove<ScottPlot.Plottables.Scatter>(); //데이터스트림삭제
this.formsPlot1.Refresh();
this.selectchlist.Clear();
//기존에 선택된 자료 선택하제
foreach (var item in ds1.channel.Where(t => t.use))
{
item.use = false;
}
ds1.channel.AcceptChanges();
foreach (ListViewItem item in f.CheckedListBox1.Items) //선택된 목록만 가져온다
{
int idx = int.Parse(item.Tag.ToString()); //.SubItems(0).Text)
//지정된 플롯의 표시여부를 변경한다.
if (this.Streamer1.Length < idx)
{
Array.Resize(ref Streamer1, idx);
Array.Resize(ref dataVolt, idx);
Array.Resize(ref dataTime, idx);
}
if (dataTime[idx - 1] == null) dataTime[idx - 1] = new List<double>();
if (dataVolt[idx - 1] == null) dataVolt[idx - 1] = new List<float>();
if (Streamer1[idx - 1] != null) this.Streamer1[idx - 1] = null;
Streamer1[idx - 1] = this.formsPlot1.Plot.Add.ScatterPoints(dataTime[idx - 1], dataVolt[idx - 1]);
Streamer1[idx - 1].LineWidth = 1;
Streamer1[idx - 1].MarkerSize = 0;
Streamer1[idx - 1].LegendText = $"CH{idx}";
Streamer1[idx - 1].IsVisible = item.Checked;
var dr = ds1.channel.Where(t => t.idx == idx).FirstOrDefault();
if (dr != null)
{
dr.use = item.Checked;
dr.EndEdit();
}
if (item.Checked) selectchlist.Add(idx); //선택채널에 추가한다.
}
ds1.channel.AcceptChanges();
//사용자목록에 저장한다
string chstr = string.Join(",", selectchlist.ToArray());
if (grpNo == 0) PUB.CONFIG.grp0chlist = chstr;
else if (grpNo == 1) PUB.CONFIG.grp1chlist = chstr;
else if (grpNo == 2) PUB.CONFIG.grp2chlist = chstr;
else if (grpNo == 3) PUB.CONFIG.grp3chlist = chstr;
else if (grpNo == 4) PUB.CONFIG.grp4chlist = chstr;
else if (grpNo == 5) PUB.CONFIG.grp5chlist = chstr;
else if (grpNo == 6) PUB.CONFIG.grp6chlist = chstr;
else if (grpNo == 7) PUB.CONFIG.grp7chlist = chstr;
else if (grpNo == 8) PUB.CONFIG.grp8chlist = chstr;
else if (grpNo == 9) PUB.CONFIG.grp9chlist = chstr;
PUB.CONFIG.Save();
if (CrossHair == null)
{
CrossHair = formsPlot1.Plot.Add.Crosshair(0, 0);
CrossHair.TextColor = ScottPlot.Colors.White;
CrossHair.TextBackgroundColor = CrossHair.HorizontalLine.Color;
}
formsPlot1.Plot.Axes.ContinuouslyAutoscale = true;
this.formsPlot1.Refresh();
}
}
}
public void Timer1_Tick(object sender, EventArgs e)
{
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{
}
private void cmb_volt_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmb_volt.SelectedIndex < 0) return;
if (cmb_volt.SelectedIndex == 0) voltlimit = 0;
else voltlimit = short.Parse(this.cmb_volt.Text.Replace("v", ""));
if (this.formsPlot1 != null)
{
if (voltlimit == 0)
this.formsPlot1.Plot.Axes.ContinuouslyAutoscale = true;
else
{
this.formsPlot1.Plot.Axes.ContinuouslyAutoscale = false;
this.formsPlot1.Plot.Axes.SetLimitsY(0, voltlimit);
}
}
}
private void cmb_time_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (cmb_time.SelectedIndex < 0) return;
timelimit = short.Parse(this.cmb_time.Text.Replace("분", ""));
}
private void btConfig_Click(object sender, EventArgs e)
{
if (UTIL.ShowPropertyDialog(PUB.TREND) == DialogResult.OK)
{
PUB.TREND.Save();
formsPlot1.Plot.Axes.Bottom.MinimumSize = PUB.TREND.graph_bottom_minsize;
if (PUB.TREND.y_scale_auto)
formsPlot1.Plot.Axes.AutoScaleY();
else
formsPlot1.Plot.Axes.SetLimitsY(PUB.TREND.graph_y_start, PUB.TREND.graph_y_end);
formsPlot1.Refresh();
}
}
}
}

View File

@@ -0,0 +1,398 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ToolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>176, 17</value>
</metadata>
<metadata name="bsCHList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>476, 17</value>
</metadata>
<metadata name="documentElement1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>385, 17</value>
</metadata>
<metadata name="ds1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>577, 17</value>
</metadata>
<metadata name="ToolStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>650, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>81</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcrvQCHK70BByu
9AYcrvQKHK70DByu9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu
9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu
9A0crvQNHK70DRyu9A0crvQNHK70DRyu9A0crvQNHK70DRyu9AwcrvQKHK70Bxyu9AQcrvQCAAAAAByu
9AIcrvQGHK70DByu9BUcrvQdHK70Ixyu9CYcrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu
9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu
9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jxyu9CccrvQnHK70Jhyu9CMcrvQdHK70FRyu
9AwcrvQGHK70Ahyu9AMcrvQMHK70GRyu9CocrvQ7HK70Rhyu9EwcrvROHK70Thyu9E4crvROHK70Thyu
9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70Thyu
9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70Thyu9E4crvROHK70TRyu
9EYcrvQ7HK70Kxyu9BkcrvQMHK70BByu9AUcrvQSHK70Jwuh7VYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ
6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ
6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ6WYAmelmAJnpZgCZ
6WYAmelmAJnpZgCZ6WYAmelmCqDtWByu9CgcrvQTHK70Bhyu9AYcrvQWHK70Lgmi7nEYsvzXHLb//xy2
//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2
//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2//8ctv//HLb//xy2
//8ctv//HLb//xy2//8ctv//HLb//xy2//8Zs/3fC6PweRyu9C4crvQWHK70Bxyu9AYcrvQUHK70Kxex
+8Actv//HLb//x23//8et///ILj//yK6//8lu///Kb3//yzA//8wwv//NcT//znH//89yv//Qcv//0bN
//9Kz///TdH//1HS//9T1P//V9X//1nW//9X1f//U9T//1HS//9N0f//Ss///0bN//9By///Pcr//znH
//81xP//MML//yzA//8pvf//Jbv//yK6//8guP//Hrf//xy2//8ctv//GbP81Ryu9CwcrvQVHK70Bhyu
9AQcrvQPHK70IBu1/tUctv//HLb//x63//8nuv//JLv//ym9//8uwP//M8P//zrH//9By///R87//0/R
//9X1f//Xdj//2Tb//9r3f//cd///3bi//974///f+X//4Dm//9/5f//e+P//3bi//9x3///a93//2Tb
//9d2P//V9X//0/R//9Hzv//Qcv//zrH//8zw///LsD//ym9//8mu///JLr//x63//8ctv//HLb/8hyu
9CAcrvQQHK70BRyu9AIcrvQIHK70Ehy1/qIctv//HLb//za+//8juf//Irn//yW8//8rv///MML//zbF
//89yf//RM3//0rQ//9S0///Wdb//1/Z//9m3P//a97//3Hg//904v//d+L//3jk//934v//dOL//3Hg
//9r3v//Ztz//1/Z//9Z1v//UtP//0rQ//9Ezf//Pcn//zbF//8wwv//K7///yW8//8iuf//Mr7//x23
//8ctv//HLb/xRyu9BIcrvQIHK70Ahyu9AEcrvQEHK70CBy0/C8ctv/8HLb//1PJ//8kuv//Ibn//yW7
//8qv///MMH//zXE//87yP//Qsv//0nP//9Q0///Vtb//13Y//9j2v//ad3//23e//9x4P//c+H//3Ti
//9z4f//ceD//23e//9p3f//Y9r//13Y//9W1v//UNP//0nP//9Cy///O8j//zXE//8wwf//Kr///yW7
//8iuf//Q8P//yO5//8ctv//HLX+TByu9AgcrvQEHK70AQAAAAAcrvQBHK70Ahyu9AMctv+bHLb//0/H
//83wP//Irn//yS7//8ovf//LsD//zTE//86yP//QMv//0bO//9N0f//VNT//1nW//9f2f//ZNv//2nd
//9r3v//bd7//27g//9t3v//a97//2nd//9k2///X9n//1nW//9U1P//TdH//0bO//9Ay///Osj//zTE
//8uwP//KL3//yS7//8lu///ac///x+4//8ctv++HK70Axyu9AIcrvQBAAAAAAAAAAAAAAAAAAAAAAAA
AAActv8bHLb/9iS4//9mz///I7r//yK6//8nvf//LL///zLC//83xf//Pcn//0PN//9K0P//UNP//1XV
//9a1///X9n//2Pa//9r3f//zvT//+37//+w7f//Ztz//2Pa//9f2f//Wtf//1XV//9Q0///StD//0PN
//89yf//N8X//zLC//8sv///J73//yS6//89wf//Usn//xy2//8ctv82AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAHLb/jRy2//9Vyv//OMD//yO5//8lvP//Kr///y7B//80xP//Osj//0DL
//9Gzf//StD//1DT//9V1f//Wdb//13Y//+f6P//////////////////dN7//13Y//9Z1v//VdX//1DT
//9K0P//Rs3//0DL//86yP//NMT//y7B//8qv///Jbz//ya7//9q0P//JLn//xy2/64AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/Ehy2//Mluf//aM///yS6//8juv//J73//yy/
//8xwv//NsX//zvI//9By///Rs7//0rQ//9Q0///VNT//1bW//+T5P/////////////7/v//adr//1bW
//9U1P//UNP//0rQ//9Gzv//Qcv//zvI//82xf//McL//yy///8nvf//JLr//z7C//9SyP//HLb//By2
/yoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/34ctv//VMr//zrA
//8juf//Jbz//ym9//8uwP//MsL//zfF//88yf//Qcv//0bN//9K0P//TdH//1DT//9U1P//nuf//8fx
//+C4P//UtP//1DT//9N0f//StD//0bN//9By///PMn//zfF//8ywv//LsD//ym9//8lvP//Jrv//2rQ
//8kuf//HLb/ogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2
/wwctv/tJLn//2nP//8nu///Jrv//yq9//8twP//MsL//zbE//87x///P8n//0TM//9Izf//S8///03Q
//9P0f//UdH//1HS//9R0f//T9H//03Q//9Lz///SM3//0TM//8/yf//O8f//zbE//8ywv//LcD//yq9
//8nu///QsL//1HI//8ctv/5HLb/IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAActv9yHLb//1TJ//8/wv//J7v//yq8//8uvv//MsH//zXD//86xP//Psf//0LK
//9Fy///SMz//0rN//9Mzv//Tc///07P//9Nz///TM7//0rN//9IzP//Rcv//0LK//8+x///OsT//zXD
//8ywf//Lr7//yq8//8svP//bdH//yS5//8ctv+TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv8GHLb/5CS4//9s0f//Lbz//yy8//8vvf//Mr///zXC
//85w///PcX//0DI//9Dyf//Rsr//0nL//9Ozf//1fP///n9//+K3v//Ssz//0nL//9Gyv//Q8n//0DI
//89xf//OcP//zXC//8yv///L73//yy8//9GxP//UMj//xy2//Mctv8YAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/Zhy2//9Vyf//RcP//y68
//8wvf//Mr7//zbA//85wf//PMP//0DE//9Cx///RMf//0bJ//9w1f/////////////Q8f//R8n//0bJ
//9Ex///Qsf//0DE//88w///OcH//zbA//8yvv//ML3//zK+//9w0v//I7n//xy2/4cAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/Axy2
/9siuP//b9H//zW+//8yvv//NL///zbA//84wv//O8L//z7D//9Axf//QsX//0TH//9x1f//////////
///U8v//Rcj//0TH//9Cxf//QMX//z7D//87wv//OML//zbA//80v///Mr7//03F//9PyP//HLb/7Ry2
/xIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABy2/1cctv//VMn//0zF//81vv//Nr///ze///85wP//O8H//zzC//8/w///QcT//0LE
//9v0//////////////T8v//Q8X//0LE//9BxP//P8P//zzC//87wf//OcD//ze///82v///OMD//3LS
//8guP//HLb/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/wMctv/PIrj//3TT//88wP//OsD//zvA//88wf//PsL//z/C
//9Aw///QsP//0PD//9w0//////////////T8v//RMX//0PD//9Cw///QMP//z/C//8+wv//PMH//zvA
//87wP//VMn//1DI//8ctv/nHLb/DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv9OHLb//1PJ//9Vyf//PsD//z7B
//8/wf//QMH//0HC//9Cwv//Q8P//0PD//9w0v/////////////T8f//RMP//0PD//9Dw///QsL//0HC
//9Awf//P8H//z7B//9Bwv//d9X//x+3//8ctv9sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/xiK4
//961f//RsT//0LC//9Cwv//Q8P//0TD//9Fw///RcP//0bE//9x0//////////////U8f//RsT//0bE
//9Fw///RcP//0TD//9Dw///QsL//0PC//9dzP//Ucj//xy2/94ctv8GAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHLb/Pxy2//9Vyf//Xs3//0nE//9IxP//SMT//0jE//9IxP//ScT//0nF//900///////////
///V8v//SsX//0nF//9JxP//SMT//0jE//9IxP//SMT//0zH//991f//H7f//xy2/10AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/7oiuP//ftb//1LI//9Ox///Tsf//07H//9Ox///Tsf//07H
//931P/////////////W8v//Tsf//07H//9Ox///Tsf//07H//9Ox///Tsf//2bP//9RyP//HLb/1Ry2
/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/zMctv//Vsn//2jP//9Uyf//U8n//1PJ
//9Tyf//U8n//1PJ//971v/////////////X8v//U8n//1PJ//9Tyf//U8n//1PJ//9Tyf//V8r//4HY
//8ft///HLb/UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv+rIbj//4XZ
//9dzP//Wsv//1rL//9ay///Wsv//1rL//+B1//////////////Y8///Wsv//1rL//9ay///Wsv//1rL
//9ay///cdL//1LJ//8ctv/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAActv8nHLb//FfK//900///Yc3//2DN//9gzf//YM3//2DN//+F2f/////////////a8///YM3//2DN
//9gzf//YM3//2DN//9kzv//h9n//x+3//8ctv9CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAHLb/nB+3//+L2///atD//2bP//9mz///Zs///2bP//+K2v//////////
///b9P//Zs///2bP//9mz///Zs///2fP//981f//Usn//xy2/70AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/Gxy2//lYyv//f9b//23R//9t0f//bdH//23R
//+P3P/////////////d9P//bdH//23R//9t0f//bdH//3DR//+M2v//Hrf//xy2/zYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/40ft///ktz//3bU
//9z0///c9P//3PT//+U3f/////////////e9f//c9P//3PT//9z0///c9P//4bZ//9SyP//HLb/rgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2
/xUctv/zWMr//4ra//961f//etX//3rV//+Z3//////////////g9f//etX//3rV//961f//fdX//5Hc
//8et//8HLb/KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAActv+BH7f//5be//+C2P//gNf//4DX//+Q3P///v/////////Q8P//gNf//4DX
//+A1///kd3//1TJ//8ctv+iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv8MHLb/7VnK//+V3f//htn//4bZ//+G2f//m+D//6/m
//+K2v//htn//4bZ//+J2f//lt3//x63//kctv8hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/ciC3//+a3///j9z//43b
//+N2///jdv//43b//+N2///jdv//43b//+b4P//VMn//xy2/5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/Bhy2
/+RZyv//n+H//5Pd//+T3f//k93//5Pd//+T3f//k93//5bd//+a3///Hrf/8xy2/xsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABy2/2Met///oOH//5vg//+a3///mt///5rf//+a3///mt///6bj//9Uyf//HLb/hwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/wMctv/YWcr//6rk//+f4f//n+H//5/h//+f4f//ouH//57h
//8et//tHLb/EgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv9UHrf//6Ti//+m4///peL//6Xi
//+l4v//r+X//1LI//8ctv97AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLb/zFrL
//+z6P//quX//6rl//+s5f//oeL//x63/+cctv8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHLb/RR63//+p5P//tuj//7Pn//+96v//VMn//xy2/2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/71GxP//wuz//8Xt//+S3f//HLb/3hy2/wYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABy2/zYctv//Mr3//1HI//8iuP//HLb/YAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAActv+HHLb//xy2
//8ctv+lHLb/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHLb/Jxy2/zYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP////////z9gAAAAAAB/P0AAAAAAAD8/QAAAAAAAPz9AAAAAAAA/P0AAAAAAAD8/QAA
AAAAAPz9AAAAAAAA/P0AAAAAAAD8/QAAAAAAAPz9gAAAAAAB/P3wAAAAAA/8/fgAAAAAH/z9+AAAAAAf
/P38AAAAAD/8/fwAAAAAP/z9/gAAAAB//P3+AAAAAH/8/f8AAAAA//z9/wAAAAD//P3/gAAAAf/8/f+A
AAAB//z9/8AAAAP//P3/4AAAA//8/f/gAAAH//z9//AAAAf//P3/8AAAD//8/f/4AAAf//z9//gAAB//
/P3//AAAP//8/f/8AAA///z9//4AAH///P3//gAAf//8/f//AAD///z9//8AAP///P3//4AB///8/f//
gAH///z9///AA////P3//8AD///8/f//4Af///z9///wB////P3///AP///8/f//+A////z9///4H///
/P3///wf///8/f///n////z9/////////P3////////8/SgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAHK70ARuu9AIcrvQEG670BByu9AQbrvQEHK70BBuu9AQcrvQEG670BByu
9AQbrvQEHK70BBuu9AQcrvQEG670BByu9AQbrvQEHK70BBuu9AQcrvQEG670BByu9AQbrvQEHK70BBuu
9AQcrvQEG670BByu9AMbrvQBAAAAABuu9AIbrvQIG670Ehuu9BobrvQeG670Hhuu9B4brvQeG670Hhuu
9B4brvQeG670Hhuu9B4brvQeG670Hhuu9B4brvQeG670Hhuu9B4brvQeG670Hhuu9B4brvQeG670Hhuu
9B4brvQeG670Hhuu9B4brvQaG670Ehuu9AgbrvQCG670Bxyu9BgVqPE+EqfwThKn8FUSp/BWEqfwVhKn
8FYSp/BWEqfwVhKn8FYSp/BWEqfwVhKn8FYSp/BWEqfwVhKn8FYSp/BWEqfwVhKn8FYSp/BWEqfwVhKn
8FYSp/BWEqfwVhKn8FYSp/BWEqfwVhKn8E4UqPE/G670GRyu9AgbrvQLG670JAuk8IARq/bDEqz3zBKs
98wSrPfMEqz3zBKs98wSrPfMEqz3zBKs98wSrPfMEqz3zBKs98wSrPfMEqz3zBKs98wSrPfMEqz3zBKs
98wSrPfMEqz3zBKs98wSrPfMEqz3zBKs98wSrPfMEqv3xQyk8YYbrvQkG670Cxuu9AocrvQgGbP92hy2
//8et///Ibj//yW7//8qvv//MsP//znG//9Cy///SM7//1HS//9X1f//Xtf//2PZ//9l2///Ydn//1vW
//9W1P//TtD//0fO//8+yf//N8X//y/B//8pvf//I7r//yC4//8ctv//GrT96Ruu9CEcrvQKG670BRuu
9BMbtf7MG7b//yq6//8juf//KL3//y/B//85x///Qsz//07R//9Y1f//Ytr//2vd//9z4f//eOL//3rk
//934v//cN///2nd//9e2P//VdT//0nP//9Ayv//NcT//y3A//8lu///Krv//xy2//8btv/iG670Exuu
9AYbrvQBHK70BRuz+18ctv/zRMT//yS6//8mvP//Lb///zbF//8/yv//Ss///1PU//9d2P//Zdv//2ze
//9w3///ceD//2/f//9q3f//Y9r//1nW//9R0///Rc3//zzJ//8ywv//K7///yS6//9Awv//H7f/+Byz
/HAbrvQFHK70AQAAAAAbrvQBG7L6GBu2/70+wf//M7///yS7//8qvv//NMP//zvI//9Gzv//T9L//1jW
//9f2f//Z9v//5fn//+17v//eOD//2Pa//9d2P//VNT//03R//9CzP//Osf//zDB//8pvf//Kbv//03H
//8ctv/LG7L6Ihuu9AEAAAAAAAAAAAAAAAAAAAAAHLb/Qym6//xHxP//I7r//ye9//8vwf//NsX//0DK
//9Hzv//T9L//1bV//9w3P//3fb///7+//+f6P//Wdb//1TU//9M0f//Rc3//zzJ//80xP//K7///ya8
//8/wv//Nr///hu2/1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbtv8EHLb/w0bE//8tvP//JLv//yu+
//8xwv//Osf//0HL//9Iz///TtH//1nV//+h5///yfH//3Tc//9R0///TdH//0XN//8/yv//NsX//zDB
//8ovf//Jbv//07G//8juP/VG7b/CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbtv9HH7f/61HH
//8pu///K73//zDA//83xP//Pcf//0TL//9Jzf//TM///0/Q//9P0P//TtD//0vO//9IzP//Qcr//zzG
//80w///LsD//ym8//9Dw///Nb7/8hy2/1YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABu2
/w4btv+sQcL//zvB//8svP//ML7//zbC//88xP//Qcn//0XK//9KzP//id7//6fm//9Y0P//SMv//0TK
//8/x///OsT//zTB//8vvv//Mb3//1DH//8dtv+6G7b/FgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABy2/y4puv/3Tsb//zC8//8yvv//NsD//zrC//9AxP//Qsb//1PM///P8f//7/r//3TW
//9Ex///Qsb//z7D//85wf//NL///zG9//9Jxf//N7//+xu2/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAG7b/ARy2/6xIxP//PsH//zS+//83v///OsH//z3C//9AxP//Ucn//8/w
///w+v//c9T//0LE//9Aw///PML//znA//82v///Nb///1PI//8iuP+/G7b/BAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG7b/OB62/+Fcy///PsH//zzA//8+wf//QML//0HC
//9SyP//z/D///D6//9z0///QsP//0HC//8/wf//PcH//zzA//9UyP//M77/6Ry2/0UAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbtv8JG7b/mUbE//9Rx///QMH//0HC
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
rEHwD6xB+B+sQfgfrEH8P6xB/j+sQf5/rEE=
</value>
</data>
</root>