From effc27072411977e86bbe39d447233aaa2b69a14 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 17 Jun 2019 08:34:59 +0000 Subject: [PATCH] =?UTF-8?q?5.2.1:=20Korrekturen=20f=C3=BCr=20"Copy=20Data"?= =?UTF-8?q?..=20zur=C3=BCckspielen=20der=20historisierten=20Daten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI-2/ENI2/ENI2/App.config | 8 +- ENI-2/ENI2/ENI2/App.xaml.cs | 45 ++++++ ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs | 35 +++-- .../BorderPoliceDetailControl.xaml.cs | 6 +- .../PortNotificationDetailControl.xaml.cs | 8 +- ENI-2/ENI2/ENI2/ENI2.csproj | 5 +- .../EditControls/MessageHistoryDialog.xaml.cs | 9 +- .../SimplePropertyViewDialog.xaml | 4 +- .../ENI2/ENI2/Util/ExpandableListConverter.cs | 145 ++++++++++++++++++ Stundensheet.xlsx | Bin 41078 -> 41218 bytes nsw/Serverumzug.txt | 2 + nsw/Source/bsmd.database/BKRA.cs | 2 + nsw/Source/bsmd.database/BPOL.cs | 14 +- nsw/Source/bsmd.database/BRKD.cs | 2 + nsw/Source/bsmd.database/CallPurpose.cs | 9 +- nsw/Source/bsmd.database/DBManager.cs | 7 +- nsw/Source/bsmd.database/DatabaseEntity.cs | 17 +- nsw/Source/bsmd.database/HAZ.cs | 21 ++- nsw/Source/bsmd.database/IBCPosition.cs | 6 + nsw/Source/bsmd.database/IGCPosition.cs | 10 +- nsw/Source/bsmd.database/IMDGPosition.cs | 11 +- nsw/Source/bsmd.database/IMSBCPosition.cs | 6 + nsw/Source/bsmd.database/InfectedArea.cs | 6 + .../LastTenPortFacilitiesCalled.cs | 8 +- .../bsmd.database/MARPOL_Annex_I_Position.cs | 8 +- nsw/Source/bsmd.database/MDH.cs | 38 ++++- nsw/Source/bsmd.database/Message.cs | 8 +- nsw/Source/bsmd.database/MessageHistory.cs | 27 ++-- nsw/Source/bsmd.database/NOA_NOD.cs | 13 +- .../NoTypeConverterJsonConverter.cs | 74 +++++++++ .../bsmd.database/PortOfCallLast30Days.cs | 9 ++ .../PortOfCallLast30DaysCrewJoinedShip.cs | 4 + nsw/Source/bsmd.database/PortOfItinerary.cs | 7 +- .../Properties/AssemblyProductInfo.cs | 2 +- .../Properties/AssemblyProjectInfo.cs | 2 +- nsw/Source/bsmd.database/SEC.cs | 12 +- nsw/Source/bsmd.database/STAT.cs | 6 + .../bsmd.database/SanitaryMeasuresDetail.cs | 33 ++++ ...vitiesDuringLastTenPortFacilitiesCalled.cs | 8 +- .../bsmd.database/StowawaysJoiningLocation.cs | 5 + nsw/Source/bsmd.database/Util.cs | 15 ++ nsw/Source/bsmd.database/WAS.cs | 20 ++- nsw/Source/bsmd.database/Waste.cs | 9 +- nsw/Source/bsmd.database/bsmd.database.csproj | 1 + .../bsmd.database/bsmd.database.licenseheader | 2 +- 45 files changed, 606 insertions(+), 83 deletions(-) create mode 100644 ENI-2/ENI2/ENI2/Util/ExpandableListConverter.cs create mode 100644 nsw/Source/bsmd.database/NoTypeConverterJsonConverter.cs diff --git a/ENI-2/ENI2/ENI2/App.config b/ENI-2/ENI2/ENI2/App.config index 5951f566..1ce5b944 100644 --- a/ENI-2/ENI2/ENI2/App.config +++ b/ENI-2/ENI2/ENI2/App.config @@ -26,12 +26,12 @@ 1000 - http://192.168.2.4/LockingService/LockingService.svc - + + http://heupferd/bsmd.LockingService/LockingService.svc - Data Source=192.168.2.12;Initial Catalog=nsw;Uid=dfuser;Pwd=dfpasswd;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False - + + Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=E:\DATA\DB\NSW.MDF;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False diff --git a/ENI-2/ENI2/ENI2/App.xaml.cs b/ENI-2/ENI2/ENI2/App.xaml.cs index 4c4c46bf..f8cc4b82 100644 --- a/ENI-2/ENI2/ENI2/App.xaml.cs +++ b/ENI-2/ENI2/ENI2/App.xaml.cs @@ -11,6 +11,7 @@ using System.Windows.Input; using System; using System.Net; using ENI2.LockingServiceReference; +using ENI2.Util; using System.Threading; namespace ENI2 @@ -84,6 +85,50 @@ namespace ENI2 RuleEngine.RegisterPortAreaChecker(LocalizedLookup.PortAreaExists); RuleEngine.RegisterNationalityChecker(LocalizedLookup.CheckNationality); + // Register expandable Properties + // WAS + TypeDecorationManager.AddExpandableObjectConverter(typeof(WAS)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(Waste)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // NOA_NOD + TypeDecorationManager.AddExpandableObjectConverter(typeof(NOA_NOD)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(CallPurpose)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // SEC + TypeDecorationManager.AddExpandableObjectConverter(typeof(SEC)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(LastTenPortFacilitiesCalled)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(ShipToShipActivitiesDuringLastTenPortFacilitiesCalled)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // MDH + TypeDecorationManager.AddExpandableObjectConverter(typeof(MDH)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(SanitaryMeasuresDetail)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(StowawaysJoiningLocation)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(PortOfCallLast30Days)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(PortOfCallLast30DaysCrewJoinedShip)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(InfectedArea)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // BPOL + TypeDecorationManager.AddExpandableObjectConverter(typeof(BPOL)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(PortOfItinerary)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // HAZ + TypeDecorationManager.AddExpandableObjectConverter(typeof(HAZ)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(IMDGPosition)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(IBCPosition)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(IGCPosition)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(IMSBCPosition)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + TypeDecorationManager.AddExpandableObjectConverter(typeof(MARPOL_Annex_I_Position)); + TypeDecorationManager.AddExpandableIListConverter(typeof(IList)); + // Connect to locking service (if enabled) try { diff --git a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs index 62e8fdda..810e0757 100644 --- a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs @@ -376,24 +376,25 @@ namespace ENI2 } message.ChangedBy = string.Format("{0} at {1}", userName, DateTime.Now); DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Save(message); - if (message.MessageNotificationClass == Message.NotificationClass.CREW) - { - foreach(CREW crew in message.Elements) - { - if (crew.IsNew || crew.IsDirty) DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Save(crew); - } - } - else if (message.MessageNotificationClass == Message.NotificationClass.PAS) - { - foreach(PAS pas in message.Elements) - { - if(pas.IsNew || pas.IsDirty) DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Save(pas); - } - } - else - { + + //if (message.MessageNotificationClass == Message.NotificationClass.CREW) + //{ + // foreach(CREW crew in message.Elements) + // { + // if (crew.IsNew || crew.IsDirty) DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Save(crew); + // } + //} + //else if (message.MessageNotificationClass == Message.NotificationClass.PAS) + //{ + // foreach(PAS pas in message.Elements) + // { + // if(pas.IsNew || pas.IsDirty) DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Save(pas); + // } + //} + //else + //{ message.SaveElements(); - } + //} message.IsDirty = false; if(message.MessageNotificationClass == Message.NotificationClass.ATA) diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs index 55d8a118..9b198dfb 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs @@ -191,7 +191,7 @@ namespace ENI2.DetailViewControls // are you sure dialog is in base class _bpol.PortOfItineraries.Remove(poi); DBManager.Instance.Delete(poi); - DatabaseEntity.ResetIdentifiers(_bpol.PortOfItineraries); + DatabaseEntity.ResetIdentifiers(new List(_bpol.PortOfItineraries)); this.SublistElementChanged(Message.NotificationClass.BPOL); this.dataGridPortOfItinerary.Items.Refresh(); } @@ -475,7 +475,7 @@ namespace ENI2.DetailViewControls }; if (ofd.ShowDialog() ?? false) { - FileStream stream = null; + FileStream stream; try { stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read); @@ -549,7 +549,7 @@ namespace ENI2.DetailViewControls }; if (ofd.ShowDialog() ?? false) { - FileStream stream = null; + FileStream stream; try { stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read); diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/PortNotificationDetailControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailViewControls/PortNotificationDetailControl.xaml.cs index 2dcd4417..d4fa6218 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/PortNotificationDetailControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailViewControls/PortNotificationDetailControl.xaml.cs @@ -23,7 +23,7 @@ namespace ENI2.DetailViewControls private Message _servMessage; private Message _ladgMessage; - private static string[] shippingAreas = { + private static readonly string[] shippingAreas = { Properties.Resources.textShippingAreaNORTHBALTIC, Properties.Resources.textShippingAreaEUROPE, Properties.Resources.textShippingAreaOverseas @@ -185,8 +185,7 @@ namespace ENI2.DetailViewControls private void DataGridLADG_DeleteRequested(DatabaseEntity obj) { - LADG ladg = obj as LADG; - if (ladg != null) + if (obj is LADG ladg) { // are you sure dialog is in base class this._ladgMessage.Elements.Remove(ladg); @@ -267,8 +266,7 @@ namespace ENI2.DetailViewControls private void DataGridSERV_DeleteRequested(DatabaseEntity obj) { - SERV serv = obj as SERV; - if (serv != null) + if (obj is SERV serv) { // are you sure dialog is in base class _servMessage.Elements.Remove(serv); diff --git a/ENI-2/ENI2/ENI2/ENI2.csproj b/ENI-2/ENI2/ENI2/ENI2.csproj index 1c5367cf..d13a249d 100644 --- a/ENI-2/ENI2/ENI2/ENI2.csproj +++ b/ENI-2/ENI2/ENI2/ENI2.csproj @@ -34,8 +34,8 @@ 3.5.1.0 true publish.html - 4 - 5.2.0.%2a + 0 + 5.2.1.%2a false true true @@ -338,6 +338,7 @@ + diff --git a/ENI-2/ENI2/ENI2/EditControls/MessageHistoryDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/MessageHistoryDialog.xaml.cs index f2e2720b..36b5432c 100644 --- a/ENI-2/ENI2/ENI2/EditControls/MessageHistoryDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/MessageHistoryDialog.xaml.cs @@ -93,7 +93,10 @@ namespace ENI2.EditControls Message targetMessage = null; foreach (Message aMessage in this.Messages) { - if (aMessage.MessageNotificationClassDisplay.Equals(selectedHistory.EntityName)) + if (aMessage.MessageNotificationClassDisplay.Equals(selectedHistory.EntityName) || + (aMessage.MessageNotificationClassDisplay.Equals("BKRA") && selectedHistory.EntityName.Equals("BRKA")) || + (aMessage.MessageNotificationClassDisplay.Equals("BKRD") && selectedHistory.EntityName.Equals("BRKD")) + ) { targetMessage = aMessage; break; @@ -106,8 +109,10 @@ namespace ENI2.EditControls // Fallunterscheidung: a) ISublistElement oder nicht? Falls ja müssen die anderen Elemente zusammengesucht werden if(Message.IsListClass(targetMessage.MessageNotificationClass)) // Meldeklasse ist also z.B. LADG, CREW, PAS.. { - foreach (DatabaseEntity oldElement in targetMessage.Elements) + foreach (DatabaseEntity oldElement in targetMessage.Elements) DBManager.Instance.Delete(oldElement); + targetMessage.Elements.Clear(); + foreach (DatabaseEntity element in selectedHistory.GetGroup(this.MessageHistories)) { targetMessage.Elements.Add(element); diff --git a/ENI-2/ENI2/ENI2/EditControls/SimplePropertyViewDialog.xaml b/ENI-2/ENI2/ENI2/EditControls/SimplePropertyViewDialog.xaml index c54eba11..884c5a4a 100644 --- a/ENI-2/ENI2/ENI2/EditControls/SimplePropertyViewDialog.xaml +++ b/ENI-2/ENI2/ENI2/EditControls/SimplePropertyViewDialog.xaml @@ -8,12 +8,12 @@ xmlns:p="clr-namespace:ENI2.Properties" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" - Title="SimplePropertyViewDialog" Height="640" Width="480" WindowStyle="ToolWindow" ResizeMode="NoResize" + Title="SimplePropertyViewDialog" Height="640" Width="480" WindowStyle="ToolWindow" ResizeMode="CanResize" Background="White"> + HideInheritedProperties="True" ShowSearchBox="True" ShowSortOptions="True" /> diff --git a/ENI-2/ENI2/ENI2/Util/ExpandableListConverter.cs b/ENI-2/ENI2/ENI2/Util/ExpandableListConverter.cs new file mode 100644 index 00000000..87b61e83 --- /dev/null +++ b/ENI-2/ENI2/ENI2/Util/ExpandableListConverter.cs @@ -0,0 +1,145 @@ +// Copyright (c) 2019 schick Informatik +// Description: Hilfsklasse zur Darstellung von untergeordneten Listen +// im XCeed PropertyGrid +// Idee von der 2. Antwort hier: +// https://stackoverflow.com/questions/36286530/xceed-wpf-propertygrid-show-item-for-expanded-collection + +using System; +using System.Collections.Generic; +using System.Linq; +using System.ComponentModel; +using Xceed.Wpf.Toolkit.PropertyGrid.Attributes; +using System.Collections; + +namespace ENI2.Util +{ + + #region class ENIExpandableIListConverter + + public class ENIExpandableIListConverter : ExpandableObjectConverter + { + + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) + { + if (value is IList) + { + IList list = value as IList; + PropertyDescriptorCollection propDescriptions = new PropertyDescriptorCollection(null); + IEnumerator enumerator = list.GetEnumerator(); + int counter = -1; + while (enumerator.MoveNext()) + { + counter++; + propDescriptions.Add(new ListItemPropertyDescriptor(list, counter)); + + } + return propDescriptions; + } + else + { + return base.GetProperties(context, value, attributes); + } + } + } + + #endregion + + #region class ListItemPropertyDescriptor + + public class ListItemPropertyDescriptor : PropertyDescriptor + { + private readonly IList _owner; + private readonly int index; + + public ListItemPropertyDescriptor(IList owner, int index) : base("[" + index + "]", null) + { + this._owner = owner; + this.index = index; + + } + + public override AttributeCollection Attributes + { + get + { + var attributes = TypeDescriptor.GetAttributes(GetValue(null), false); + //If the Xceed expandable object attribute is not applied then apply it + if (!attributes.OfType().Any()) + { + attributes = AddAttribute(new ExpandableObjectAttribute(), attributes); + } + + //set the xceed order attribute + return AddAttribute(new PropertyOrderAttribute(index), attributes); + } + } + + private AttributeCollection AddAttribute(Attribute newAttribute, AttributeCollection oldAttributes) + { + Attribute[] newAttributes = new Attribute[oldAttributes.Count + 1]; + oldAttributes.CopyTo(newAttributes, 1); + newAttributes[0] = newAttribute; + + return new AttributeCollection(newAttributes); + } + + public override bool CanResetValue(object component) + { + return false; + } + + public override object GetValue(object component) + { + return Value; + } + + private T Value + => _owner[index]; + + public override void ResetValue(object component) + { + throw new NotImplementedException(); + } + + public override void SetValue(object component, object value) + { + _owner[index] = (T)value; + } + + public override bool ShouldSerializeValue(object component) + { + return false; + } + + public override Type ComponentType + => _owner.GetType(); + + public override bool IsReadOnly + => false; + + public override Type PropertyType + => Value?.GetType(); + } + + #endregion + + #region class TypeDecorationManager + + public static class TypeDecorationManager + { + public static void AddExpandableObjectConverter(Type T) + { + TypeDescriptor.AddAttributes(T, new TypeConverterAttribute(typeof(ExpandableObjectConverter))); + TypeDescriptor.AddAttributes(T, new ExpandableObjectAttribute()); + } + + public static void AddExpandableIListConverter(Type T) + { + TypeDescriptor.AddAttributes(T, new TypeConverterAttribute(typeof(ENIExpandableIListConverter))); + TypeDescriptor.AddAttributes(T, new ExpandableObjectAttribute()); + } + } + + #endregion + +} diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 7c9e4acffef3ab621dea3ec794349e0733905132..c5bce84002f9ede2a82f683af3ea1ca9b69be629 100644 GIT binary patch delta 28265 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

ngY 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%0A7v*O z^x6Eh1N}aLf}Dj@l0j8bDgG6$=`_!urhtppfj}u9NwPftyW(=H{F~7q*!N3$!m(v$ zyi_|$4JMyIKgw>w`qN7bv;pdTa=={zfeT!uf%bDOD^!1!nE_cxp^lTOeu!>-riLHp zu395-VWHCCv0;VZ<789zpvZ}Il9H8Q;N*vAh@5zrBiiEew$b15+XfDWLA@UH2oz)z zRMQ`I8XG>+r@@FOm;A_!LMVH%UyPf)aJbj4k@w3SCgqUyNB+E8NflN)zxH_hW;FV#=%yn9NUz6w0hxXCdiMJtk}H8?TeokW7r7)wiE`&7L#B)M}5$GjU!zJUt4VD9w zp_$oplp^hJuHPYHrMQYSfY$EhQ}3RfWIPuP?6e_75CvR1Pe~$ zFz0F5Rb{x*qev`7$8i`$D~vU$o#_fe&e(ST3gadEaihZm+3Ge=@Cp_}qpFBMnKZb< zigh)n9#g6V=+qX$rL_EXY2O?1QQazm(}{sCiC&h->=gVVFbb;E^Q|}w%qszmm$~G^ zKL%Keg{-qq?fz=%UBlb0$uaBg?K+(R+PC1J<4#8|+^*!%iYq*Z0uIu5${|1fg$q~c zyDzTJNm^~!?E|3rdiBkT^H?!4joT8|O(fAkE4=_@i%nE8wVpiYOsP+QQZSXcVxr^c z=S)>gOJnx)$=kut>)5_8JUs5=u>7F)s?)$u4@wvYzgbHKxL-YTSMmcpaOKD?MtRh>x52O4S}9iI3!ZfxkiydVU2j`;%ZOD5!t` zK0&D}euBk?T-qTuP(gIy!Od&xn>v?Kp(Jbb z{P%hBGmq%et^NASS#foxv*6a&^uo(Wa7DytZE@)pP|~vdBXign{AQVTzA|w9rDNYo zz)uM6xcnQS#M3A@XXa(4Bt5S5MsSk7<%OU1;P}#+G-skG?yp6+*zm5sXw3etm$mCg z`%ydLV%TP#*TwmXzLEBEab$b@>&wO~0yKquH;tRRV6Qs8Pa#e~aus48HYKlMVbsJ8 z)EJH6CQ=_9q&Lz&HIi@4^KZSy~!r9B5GCpTqb;W!N2M-r4^^J(Dg#*I3G@h;(4@ zxo8Y2_za20L9))y!$s~VDUzFU{3k-eklAfv1uM0O zF=^Vx<;e%!<3a3YPX39?5=`Sj1y!>y*jfCanvcpy637jhuD?M-pBN`4W`hoKI1~FH zsH5)IQbE0PFV7B`t{?SO>qzZiR-V#-&DK;87&S0tal`z-e{!?P(fZ&|fOO}O1O6x0 zrV9my`(f4pd+@tLo^t3&{_m#<8Vc(4!}PKK7yY=}gb3z}e&m)xI3SFW!dxckFvxVS eI1ENA1T&9{KT znHkUqd>^lFdk>8L?|quvfY;-_l=~du>EB3>|NYa(`@&3Trg7)f)7cuE$e-tj$CQ+f zKX1Un$il+=(<|_%yz%;aozm&|dOb4Iq&?KbW(?dvO>A_$KHZIFRA0QmTpg_~v`ut& zyu|xIK3=CNUvv}#{*N;m)t&y{-uE*;Q^he(f1jUsGL$cbU#@)W{@sm`5$6DJkG;<+ zCkOYy>&?|j)7W52N(|)7gZHNc%ufFhph5ZKKK1$Le8l+e>7=v${pD!k+jb1Ou>Zr| z#N6SDcFua|Ym><9)#FH;h`&PnJNxLxdhgv6rq$a_=)JKp@cMGy)b{Os>@GL^dT(q` zvG(TGQv@u7mTU{$?(H2wRDAt+H?VX0cAIh0sc&}(0A7#J3)}C;VBh-zk#@k(&-?vs zuXt9a+8F%&asq%KA6GEh$VH0EV|Mm#%ir%GuZtmM_m_K}Yz^5Fq0h6~^75~j*9V=< z`0p%+zB!I>9u4)YFKf?Eo^3voy};%b>Uo|ZpLv}IjKNPeH`BAc7jM7cUhmI9*N={Z_cJwu%%|x4>9SR_ zz)t#>BN=9~oA;D6JHeQ%>QkG`lotm_csf}PSCapjug3D=)v{Xgq$ z^_~lT&Yc>!pgk9UE60{Uig+DM>27CQ3!WS6;P?i1f18yt2Ea{GG`%Y~n=YO* zuO{7Z{?JZqv;fz|!ffID-RrBT(_8Y>q3?G=Bx<3|uL!7*ViZS?D1}q`uI&rw}6HpSsUWY$le<;2ky9Qevk#&MTB5gx5HBg{0w}LclwE`J z@J6u39mBs1Y^TA4BiC&?zU#ffB_NYM3L%)8%aA@I-_z5le;WDCW|{C|;EQRr3!oMA z@ENIO$fXyT&LKks{pU{P}QVOn%8wRXKPwwKsqyzLU%l(R!dTi0;m0X zwXkT<3_Nq&*8;Im=rhKK`Y0tsuD#!qtrm>ov7RvnWtNP~RVOF$5GoHdUNr-wX$R2N zo!#Bc#54rMFg^a+iwS_>1%lwnECiwjXP_Z!a%woclSzEg#N39dwp!&i0a_%GpWTSD z)$4U3tkuj2(Lv+mK}dPi`Xif`88t;iPSHFLT6s+Cx@we;t6O};qAbyY40`dOBA7l9 zON*Ruvi1wuL@ZtWN{r5hCEoky?sgPMsK|SffG?`AI$txfduszH@3jh{-g3Eo8{$=yWzCY~9LePpf!wxjR4{^bSj(C5-h z-{leT+!3)IQ?1-~E2j8zOE%K9wI6cGgE(ymTtf-)#Fu&vc>NLc@R>GMhZ`%Nrf8Bj z;+CRc=qF0G6L_u=0#%c3&SJH`280dJtmbc8N7!F=j6@dk^!cg|xJa*yLc#;~nSg?k zL_U-O`K1gqtJM!UjIey~(S;4ryC^V0iLN5;AJO7{s(^Mp*;y_f39W)y1#*~9G8Bpd zd(hk`N2AmwG~A(g`%7JW-b9j9dO_Plcw<*aHz**Vg7NIo4Z*81m$c0lK|PVv`NT%R z6~V0Ju>4dcAj~S=E4G%j+>TLQ`>%&k0_AUq5Xv5#*xPAQDJJCAQXnP&}{2Qj62w!-* zgA&0F3Y0qUi+D#0Vg;O+21L1*0**gWq8$zJ`tF2Xx$*Dm`LuR2TbRamr(T3PqyzLw z;MJXXflxxDd_Wi3?Nm*i#Ejy4HxB z;CcYBxSGGKqu4TGh~W;gv=R#R?Cu~&V(3M=PAPNH78%WeZLP_*;~ii@unHf#0SnuH$F_rJ(K7RCG@TR=M74|;Z+ zK2>mEfutT5D~7LGx_b(D$-%@hJWxEAKGn+%2Ew{dT9pye|do#h)LrK>jGS;U=VD3_94F4ay>f3APqRj z#G7;N@_|AG|MTO+f1-s7B4Qx)$yt1*EU*w5x^RbQS-RwDn}+jWP34K>~y(R3O{J zO_}Cg)wP1wE84JoJi-!)KDYlVL8=%{a{7-prF^xl_G=&_1D{q5l=IVO1C2Rr@QoN2tH;3B4YcwuXfOtqZq-7IB8C3i_T z^)_<}0dB&uU!T-AoAJYjL2(22&S{5J4(g9+-<@qEyF39g`|^=L z1+OHZ8Qu03vnsderE${C0%zGe*tqg>%2Vz5Ema#)3)r4fgo^~6iJ zMB2FK)OOXu^|iG>Fv#eV@R>qf#p`>SPrRit95~TAB7}A}9qDxKD<~`4#uVv-(kM*A zhX!9Fn^E^snx`s_8R3L#PzcQ-XTB=|uAU)#iLZi9d+GrI?LOR4=hD8SC%i6)7r&Xo z|IQHj7_%{QZ{TQvacU7K^kKDO+6|*I_=<88Vy8ZM^$!Q`P#<{px&;u)>X1oSTn++T z7-~n`%$nU|kxZ>_AfeAk_ce79QZqSfVjlijyRJ4<8;wP0LMZUYz**|vP+Z||pgtTY z3u&@FfNZZkdL_BO967;FyXTuEr$h8Al zCrs`k5PC7$}mtm zQ~LU?W!sr+``*P{k|H0vI9lAdDM)fH;cG%WoIkK?*`A%hat`d$v(cR<($1231>;cntQwnC@$!Rkd11Y*~n zW{qS%tLhu3k*V-nhJpB|Z#d+BW2Evw4y(&*8vpmaW*56aQ}B#5lFE#}jl)v|A8C}+ zd&ajhHe8;zh}sBWciS*LNj_F*%X=DDbnI@wFM`eyn<*1ej`vNhW5G?T@0a>q;sI|+ zfZmFNESv2BJzMaHka2k>gf*}vnAHdD=)k~elOkEvpsl+~W>ZD+Yn%Vc^5(BQYHncb z42<3vU-k8}s|W)8#P(#oQwPGS3zW4V&-9=jkhVto7Bu6bKpaJjep1I@0RELj4<`*f z^)gHNXzmU`u9IZXoVnKfxo!`R*k1KJZWYRG>=5|;UJ}sLV3TI^ZcELx>Pe%^&8w)Z zq;zV>YkA3?kZZNFMcG{D%UAxhZv3sJ+oWvhcJb!F24TF^>e;~75J%aJ7WeDcY8 z8TMrv*-<0TW#7SYmIX}?ST#odt*KJ6 zXufB_WnproPkC-SBF*Fq=P)qfAYZT{v-p;^Dk0?Q>vVe}<>rPBTrf_P25LE<~wNaZoqe zO)VL4k>^OLOAEhgF#(6)f;=b7zMk^?=v@ z&7kGYyfanNmpqadSGBW75T@|)goWUDc{xwp;S#qSzI>U|xR9F}sCx5#G?k)@J3K~e z!JjFIC)qzpRPskBtCg}tHScTkZ-b89M2%I>y2EHEcfMQ2uk_9ptLH6Q2QnlQKF!Gj z?$|en>B^#FQ&Ihy)GJZzr!S{=x^BWAZ~F>*0C(2LL?Ir5La|n5-)ki~vdGi?M*a(L z&CSkXeLEgD9X1MT%XP2q(o@lB$8&j=8RDx62k9h%M%}geCDw5^mD9f5)8uxAcuTbO zYl}VD!0b>vMf`_w;UN0>cUmV66^#r)Sh>hsUOUg}p3!RoC7=|llQHi{-uVW>M+yG; zcGvsQr&#fD^f9mPElipLqu=e$E(j!VuxH+GOK%o=l8m-i-;78Mla-gxCe&@%+}S+K z_u~K6*?>Fw<8d__qYP%Bz&JMay6L|+3e^H^XNqa!ryP1#g(WmS!LGzRPb!vxUT3QU z2eYyNu}ndgvm-b~2D(f!Cs|Ia3D3>9Ia6*YhI`0?8QiItXPGyD5&8VdVXCgUlkPkS zR1*E#UXs2JMqae7VhekA4!3#rSzRdR=NDb9JAG-7$oSDA0qx}<)NtVU>(*G9J6t$;)$zMXkG)Y5O?kNCagVABjDa~F{i7V!^Sdoi zd2^A%9C!f{WIJ}Otb^vkFhq?obMGIS^I2n!kI_{uez)(0z9$$#&? zgO|NdEiBf*vO&%zQp)_w%JjHc!RMCW2J#D3F=m9 zWUgN!prJ)h6s~GUC zO!)!5!9oIPVEcyMGEN-#8FGxvp?Lr1fG1O_85BEo7>+&H5sRFj-H6zx^09_nJ0h*f zx2X;V#2DwCOUa+gvAs+nW`zc zHf9=Zx10es`aC#3DF{h29tXrp*|lsigsdE-e-o57Y)3k%wT&!Z1y=g#8sBKRrhx8`N_ykL=S%w9tjTz{NZhTGUzu z24a)z&yM#IA?B+kxN9pgDdxZ6Y)y)cn$+P zwujX=Sg0q_@)*Qu6ubL$Hs<=OW8%Db>rga!YF)kVC6Z0218Ew0SXD8Y>;q2 zI}o~@MP}zJ*sRP+DnpFndh?}47VA{wRVgB%CSAQ5g zepkF=rq^eD=-(<=89iU%J*;r4$kUvZwgAyTNH(_i+pFx9gK6%LWhW4;ZsnIqjzD zJBhpQfHWao{F`2=Neja*lJtS_a;mxg{UY`3+vkh7yFVkYa1oKs)FgkNk`ut3WPm!L z>S8c&90Br(qlW0UZK7|$Ba>ve`TZwc(OGXXt4Aocbc+Qty0*VQIqv)}ihf$TJ}Xw3 z^X*l2bDXUFu%zn9ovbCshq8KmLuzE5q50}Pn53iDZaoTXJ#r&>jx?{qSjQaVAAW^} zCmiDe4aC~3HMJgj;X#WwHR$u$!0~n}Y`J+OjTW~TN*0TLN>;G7MMfp>_UOEYS-;X* z1A6f1%V5(H*0g}vZfa_J7Ht9r7)YwxM2*fVhW9BY*~R`X88OBv7ygE*Ei0r`#hMz- zZIMyFIBc*c_h+%xmE~Sf20NeCi?3oijMRXK+!zg57?Vhs$uQ>~xKaHBXvF!T(ed8V z)kg94n7yXcaaCf?50O0!M0K;13KVh#{Sj0fHVqvdRjxa27xVGRL zF1$P}mgho9dFsh>8V7iMiE|tX8|;l2vBCwU>}iN(z#ScYpHDb}z)Ip8Xyger>MF5G z)8R0?jZ+adcZD`F!;xXQ_A$*sjMKR6mvu%pj{@a845=#BOm)K^m%|z7)y;Zh;cdn# z(Ts99(zNmnrY|8R>TL*O(uPegIt}Oo>pCvimein)ne~cw{#yi_zxdkW^0xWvAKYjA zi9+2rFn-{TpB;Aqe1CNR3?)VLDF`~rQMsIW+1W0bto0>MJuj!!eSgb$(B^@Kt5^%Q zSfg$#N6qYyKDEW%Z!==#{Ml#mLB>91uppm6KD+NP&iVyX#TW?o2 zYX(Pltb88BRGG|57Z1ir%C zeF+&7vqrUxx!%JxXY)gk&}ESwyim(gmUvxY1V5;X78IxtTD1lq26IXl9*8hWdl{Ax zLmOW~qeLeI`lJM_i7(ZCn8yH?eL#pqxIQ#P% zxJG@4s1G`}II8)sA9~WZ-eBz%=f6WS_G_|?+0YezLP|B8Cuc%p74q{)Sc)#|mewUY zNLphfT9e-q>DH**X{X%D_G$~E=y2f(Jk>M<79(?#&?;v3Zg`N)mXG?M1n{E19LK$2 zJDyJm*4o)?bPb4*=Fs17RmIv7lyz*&yi23V#%c~b6FHzM@8UV)=)BIdEnHbygRc*7 z(MYnvK<%jeVz94b4=H*P+)_x?=|-bDfBjW-GMLVCQl+!OWm$S7FeXdMZH!@ngEoc* zuD8@m%o<$@-n^x}0KH{Xr~KLM(i1ZZD~j3uZ{^=EL2dq{sG2Btb%jE>bt_wiAlujG zRhHits?M^54NN{nlquHF>}=``6=O;HbmKWjbK`&KCPblYUYnyzOUOOX#7KX|TQ9j* zl+OmQ|**g6?3(khvn3icUTxc-d> zm=S!Y)EWN!odx=CZZEWF`^Qc4Ro6sMBt(WcQ6Ac)}8ePNUd?;H|4QxRqPB;cMTQ1>H@jmRWNpL76YRg!Y+7& zf0I0LFYEU7T5Sa~D^Vgy&lsy_UH8I!>06_CmXp@5Mpt+twn$3C{P#bi?d5}HM3=&3 zCbnJb#~p`GjW$DIiKPxz=8Q2`4(XGKew9bD;0@m%-gth(bIBtT#9;z^ONzuM#djS~ z1qhC$A^PCyEGmu9ifv@PTh)-j0}UBil^Xt(FJgTQ&T(j)H@qsdTe|F!`_$v=Vftm3 zW5s~4wA&-O8Kq#pO1Sj9d=KahRV3Hj+s;1TPcnmvjtjuZ3|5F=s+^g9SZcIOJIwuE z%2dk!6=$ZgJc9$07{jtZ1Ik6q62#~O@nz8k&1Y-Dff-cwOf3357El#K_!K|0F#KZW zowNzVDNl7>xhxtjaNeWgTU|oh;!=KCV&==AypCQhf7!R_XC)iW_o1;9qB9CvtxHtYVZ*i=Guhcm|3tDYKnR3xn#rC zK@gQizx!?+cXX6*0Uq>p;nEU=JR`MH`rJyYkx>r*{SbY0T$C9<`C)Sel|74iuh#x? zV*^9M-#MqxlXN%8hc0s;PY?IDZ%52dgM*2vd;EiVlt}ZM}ccmM^CqDmHe}Diyx{o*97H!+} zSipiX8ycbH^*Dlor~L#;zgBk=!62@hjW(O$W0ZW}q3!XAam7EWY~V0#h(AuE|mHt`_I;#x6`^rGp0~d<{wW5MO>$;mI;NK zF-CtwAeo`E>cU$9W;DOV${H?8a?zAt1w^tXZDWqUF~_X??vgd>7t3f-IovbIglHV# zNv*2ZCVF%a)aUK@A%K-b2P` zv%W5yDJSVM<~jR22nU2aQ)9$;VZvpVqscrAOa<{f$P(l(vb*I^666CiH|$w9`pb6-Ku0#6fB~$Zay>=?` z^p|V>8*o9vmBd#t6ZY<84kWIJ8SK^03$?8Bm^yV9(8C6Xqwq4fS$F|Q14U7bcVlUi z{*a-?;t1NVZjE+cQUm~9%Phuu&RhAz@C{BSVy$%O)**ey)=w!$gtYUFHOod}Vie2)Pg3a(2w0jE-S|SJ7SM=bpn{>})(Wpu1E|)o<=+JHJ z7um1pF0ZHNjcj2Gic0A0;X-W%3e!(pssQ&(lRWc#ZPdd(i?sNce_EJ}oLfIw_AV0M zwDM!kLi>yz&4C9ei)298^6|bDKl+#L))4$b0M`bT7K@;l6_gCk*1wVo_4xpUZ?;{D zs^~W@;?*Udq^er2VZ9vcLhHSfUJmvKNkVXd*1arxc_?o*Z7Dx#U;$$`!Y7&`6z?!^ z!PUa7e*~}U*B=Ii?^}BK#CAFqg<Mij|P5n+LU#AjM)f^7(~N0+mIZCkYzT ztzRC2DR3$k_~G}e+_P+jfF?>!YAoAV@sVL`eGZ$p(OV0iU*G?lX4LtZ z)K{;3gBM8pQai;7ci>v#Nc(-mzW==XCcez$_%`&vP%e)Qv2hy@>gxbypRZDTPB@@ry0YL30(O#afTTMiU!HaKDw=J5UsTjR@FZI@Y-X;k3g4{(noBJQu zC|yHEOXKyF0x|1=2^T_4eoNzR-j?HFLh8+*{x-G5q_P614vaLul^50kgo?G7)2LTf z#YN-{k-0LxE?fDszZCC)<8T;|6ZGRIbMNA-ZP)V4lGp_634#FEo7kHnEBlg_`hTgp z@iWg|x;quM7TWF#kscGoiiwDX(1wFv9`ht>0b^9fp=mN)fqY~|mZ}p?&C<@S*TF&q2P}`3vMK04y$`r>)f@;4+uK-eCNM8x z#a1G$nrSqu{M&GJcucYA>zufj?g_#IT#nDky0SNNDEiJAgT#_qnID|ASpHX8`eEWe znyS&dp0PQ0jOCa^ucPKH8&f0=(*1$9%`f?0IXW+@E5#)m`Pp{>Mi!jtNO^?clD=5? z5tj5T7{_Y?a417gutDYqz7b0*+7m3L(~p$UKA9EDbbUS|ZXsH%RkZ=-tHphk@BjX9s(}@}YC^ zRW2BIwcR9U^4Ie8-Ti?=<)mqBF=AIAyqGn8b1tF+01gZwUX9?e(dES@rOAlRUXuj?dZdd*ap7mJ@NNzm$^!{Rw>6VYS`d z%>d2OTK&#gaT`ca@A*OLj-J|I3YnX@+4qqzVbC~@<8 zLf>zhgfx@~ESRtE(=^PKz;LPEz>w2+sV$<0#D+AVGnrf(t?UBExv%*@@+uePMU2RP2*XCH5oekqeW zN6bPeIA`p1QpMypasWm&8ZtC8K;KN_xY#iByDh%yu{zr7rlX0o7)RpUGAwKeVzKYU zh9%Z2G$NQx9ab!W0uvV=3Ctge6Z~4?wh7nPv&gl#x3K*1vwcP|7iVIOlMKM58g_|ZZ)*C0H>1k1R621;uoQSLHm9>_up zzp6wVq5&IhpYI&|mWqfb$<@Ule8R&wXGT7dTw!=IK0(2?e0pvG!@G?m0xP3N(9|^! z_B7Z@D(}oQV)?(VHI-=Yq^k!fJY;8JLp3~fR+C{;j7>+|xEF^dOO(bj(x{B(5*YEz z;$$B_fD2fHNgNPN;f5_3o3zvVULH?_4Y}nSi%MF1w^*wGV&C6hlf|j7--v&+cU#r0Kd~tym z(-XV8$7Jv$$P}aruvL|$XzjccVR_KGs49FG^WLa(QI_9lefH zg^9P>*=6}xM)v%vG6@4!DXnC?9REEyQ#r^kN7eU+X)d|rcZIW$rcD0{+*49BHBr{n z4O6j9C&y9f)nUDKr<#LB6>9<-WO?lhP&Y@>9v>&E=lJX)6lY1RL^4|in=gAO4jx8L zRtEoe-wTJl6u2?sr=mU@rVJPU7Zsbtlz^3uMRqanC!K&~n@FY0ccK#t_4ZYW2kfrgCq-w;mv zsH^@Wx5=7NXok!82(KOlOCrTLx2j-6fRd7B<{B&c}CtXf+`1!_Wk6JBLLhLA74!vpS&>E4z?N&5SA57X{@q0n%0e zAcMq&B!aiDjAhLQ_Zk6GC1$(l(G(ib)GSN z!@rWA>T@Xx&7Tnk0}8oIBEBd?DSn#v1Ih8Dq-loyCJaYl4d(d_Z0gJ<2U9}}Rr}kW;RF>P-_$Y5`mJk170ygY`yMi-l)^^B< zWX#P+4~$a2!0F2K5hYuzRxWY{K#)x8HQO}4zKt`P=-sqLNb?63_e<>Wjoy=5k z;J9FVHNCg<>oUmo$6IYb<+W!V+^PMGO^xE&|0i2AkR!YgmnF-I(5zg=STRHnsq-l% zFa^_ZOJDb6YU4W@AdE7oqHD*xt~@#6AaD!l*V?}*daa={ifyvmK5&JTNZVrbMDg2X zENT&1$39a$es`RQ+~0NDn-9KZVFqWFVM2Ay1}t)MsU)jn9!Azi>nBQbZSG?SG}wvS z?-4o6ht#OwLPMnzeQ5iCHjq*IBIWc5sU%z!Q)%;1PU3A!HR>0zw)r37hf4ruOP$ZS zf8fD!xz=%NhTrQ4GhKbeA#3#I`I-7S2jNr5Y zAmx1DBk-?f+M5tFabUEM-amH~7_AlstEGduB1~mlU8^NJ-*b1~38Ug4)q10o5(40U zenag{ficg<{4E<7yl0_plmp#gGqTxGc6V?A?qA%mTx^T6u`Ey@6-9NA&=nw9=Q{LL ziOoiWh$10Cd*dx0H$(l#`Ux_p<@jxlvuJ%9lD*wDgXvnn?Gm1HA_O4wjB?*Z5gAMll7R*$xCJZj2qFwE z6hs&|Dt~>_(^=_23W31LQ5ltq=!&OI(hij?G)s^li14fGtAX12EeX5mG3pv!H?8O~ z*N0tc=eW}EKK=#DuI|`k%Ez#*;z&Am2vEaZn^)!m8djl8Qg@;BOm|W%Xzndd`;dbgAv_gX*3KZ$dJswZo(+n3l=Sie;*21j56xkKF*B0nqW%kTUy;zA>;v7|j~Dy&@nc_L^I$vd ztxk>n&@F#B#j%cMm{R0=pDw4wYBXf`c@Uai3^&i&M{T^)kg@1Hi^QlXgWYqw2kAZks z<6q8o`aqwcb7P@I5o04Q%VP`&`QY_iSI;?p>1nH;2eZKXzsZ>vLh@Pm6_Ujn(zRbI zi>AubXOjn&6l%JS;%bh&e+&Z}_?-89!XuS{nqD{V?a3z29qe5)S~~pyE@!(0IAJhg zS}vtV!Jl%7GqrHy6>u7Yd-Rxb3*LH$G8qe&u&==jWZ~%Ny#G$6O&u^Yp`ABkH3i0a z%+A$u);1xJyd6Rs_zH~2nAb~X%d&_`TKBi==mUw!;|lN%jj`EQ_Pf@X&;HG?tQ`XK zh8;fmn#$W<9eNN>r{!7M`O8bZyZhW!GplqXE!~F3X2zBOX+CGQ&RGcJ#z^91yDl?m zSs8I~9{4WQ(6daksGj4!k+9q{g&|~g&R_jC{^+ARA5}{Mp=>MhUC6c13Ki=xXFMm@ zYQl1V6gA$*!riT&<`d z$>hILI{5OzuM^gAv)$<^0a|Add>ncetEAFGzwO5P#M7r5QzK8H>^RLuKrX^ipyScu zc2@S2^w9BG?fOxJdPJQJLSLTZ)bghCKjwRm+}oO#rV00UBa)*Z6zkg!;2_r(1Y?S9 zf=zN4siNFQZ==yLc|cRe&7MH&5c3R&o69e2A#Uw-tANdZR;4X%%7&?q(JHmbq`F1Y z_B`DR9P2De_Dck|^nN1*VdGqot@T|81;^Wcp>e;Anc~OF&oNDrAUq@AZSi2(yVn z%kL)M><<ny%3nqN zQ_?pc(+4|}o0C%0N@0+=dA(E7dfL8QEYH%*N)#r01tf+QvYH`W)$o7PgD=0!kf~)g z%iz_3vYh=k`@F3dOMlk-16f99$9-9{3Lc*<#IinK{$1G#N1}od(i7A`Fk|8d>ADLS ztXeorZOF@cZbb!-@m+p;^l`!HkJA#IA(4+xrxNy7abEVmWC5;O|H=}VOMSBK^Goo& zrPKkYD(1O}M9BuVeKpW*1T~L+WwUOOwd8sU-f*EoX8i@4fPN*MDFsxah*VlBUW@io z%(Zx{%Y2yRc}WsIPVd(_%xl|QtwfmEJ3P-ov9npb{+zAJNQKH~A-~e%NgOeC z`C55i$uUfYdRRKX8e3lTS+*(y4XTBs+hM?ccco%hGZ?Mmry)}A+s^w}QMwRQ9|>mN1gecfFS$Yz!L z>2|n_lmfl*dDZD|y+E45%*Wq0qJQZIQ#-`Ce62^ZyZ<;Y+QNxtTdc(+W)MmD#R*XT zumD5g{i~x{i<+ra$)EyLr%j2s%0sP>^VHs>hX@<8lVB4wK;svi(+#Yc2lIH&%Hb~Y>u&1KvaRH^h_+}M)MJJ{Q1E+K zH8E_E8JHbYhuK|IJ!Pv^6|R*foREaM6ftWJf3;*+TIYHTi*&_^_xO`DTeVLi8|BvS ze0-Z$tsC{vXywtXgXxZC5jO*CXLX7+50^M}8?(;(+xj5}N&Ki|9;`saxeCB4E1UX5 zUcr+-2p7_S6>u))iKtf-5o+!zy1PRKY&m+BXcYP<_C1gSF*oP=Dc=%#R|u`cbZF;- z^l1?*3^7TpNnUD9l3R6RP5(M52sP(^`onBNI45qbLJ5=Jx4}~LAJ7vEnMunwEk0+S zmD*wstbzHFm#tFtS50zF2ROx5RV;(%;e)O)gv}%pP@5J;ue5}hjU1bCiX0JbJXzG56_~ zuvhxHaFEt;1HY3V>l8L1LF5S?P)nB!LGy&vD(H#fRis=WXj*vzH2+k|oBA_6Xb435 zDlOVbvfL)DPW}xMyCyNaz8I}1x>hD=?onSTd%pV z9!Q(aySrEk#tm;!s>|R%#j?xNt+?HmXv0$jU;}S7Ddx+5eLJAyK`&w%~oj;!aM|nZ}xk7 zuavWVv37GD*Z7H-pZ>sGD7cqnQV-Pk6I;6d{REfgSWfJ(D}q3GoMDhM;fme_?Q-ki_3r5MU9ToKjeS&* zDG;nm08~=rgN<0Qv!j;HVzfu{;_URP@jF=h#(%!e9;AFa8Vu_t>x9#9p~*C^osQ%4 zDh3^1GY@ptk)${P(znc+guV*8)gF2<6Y-3z-uR1}6R!2yd!zCX6E*3LU;N+KCN|#p z8SwtmA&lGf8lRD&6B2 zlP$pL5BD%EO$5}hndhAEk{l_~;=z(7-ybSLu06XIT}`EVHA43^bzC|VVrHpk=!i)o zg~s6zZs+Fk`LWj;;_y8Ok?bZ_#>>55A-Uq%~{-yY3}dticXkOz?RdldIlp5 zZOJD73@H`|J;aFFv$gyw2_CG)@-@FmV)D-|{#eV<;jo9aj{f(kTEzP-*DNP-okaGi zkj=GxUpXR$-p>6!|u)C&3MbLDQX*415H!HVrKAK+OG%#M?v8;u-^k4Zmt@tYLlvA9f3@X)@ zn_uVyrZE}cE8i!U=FS_FRwuQQU!bZA%L!#86$5x9YG0@Fx`e+sxztLvod8{zj^BmB z-Uk?b;@OY({_yy0)zSMwBpBZGC(!hTyB-c3BL7Mhqr@2)L#>9e%$mjXJa$|Hu)pFT znWS=ZD8v`V%bZmrRUTncC4?<~LcnCLq4g}U3T?TTFL+av+OH={Q{Q>PCYPiA>%VmJ z{Wc<;&trmZKTdOC^wAO7MIC$7t&}EK{9S$wp+Pg+5vFR-&EG zJxbMEp0mBI10`Xx)oedzE4(dozQ-Ds9?T5BNDWr0_#bE@--i9-tJRSrCN6)I%K6#P zn)W&7QTf^DF>QtR>mQg$&Pj*Qusp+~Xqz)@Kf&+!c++6;9Dj!C>aja_0JT;Xlm%Ra6Oob@&Yqvw@FFRmGQk*ow+s+6eHZuo?U(j={4v z@ootUXmK+N=Zhu^>w1XEyw*wCY$7R639^i?Geq0ldC`j^R~0Z3GG(mkRg3}{^jEGb zrXFHao$$?G1V+-N9`b?g<2mc;xUqn*!?+_!pa8xd@}q^sOOfio@0n2|1;_)TeGjm+ z{~7L5gm@?B3opcUp)A@R0whjMMll&w+ADqC4@>F+VGU88Nd3Py$iJr>NL1XnIJ~AI zWV{{iBQ0>dM2^(vu1D$+rwn=WeZ?p^Tyi$mO+ca;3(Ckh1y=f?)5dnOesgoU0a{;+ z&L`vsB@m;R5(z<)uG|^AV&>c?KP2hLBu~P^{!dq5859T5q`kPi!(xj&1lQm$i@RH} z;K5nkeIW#Qm*7rtcMom}PH=*AdGD+G?&{{()O2;vkD2M}o_U@g`GCo5Ac3`+(T*9} zmKnb*F*n&a!utDf8T}PBvpuo74WZPO=?8nMyB@)J7%uuN>Vs=-v})d+NTO@vr!u#T za>^b%M%hAh9lZ!hqmB|WQO(I25a3=>d;|6eYh0x&We=(b5#hEhgkOIw0&9e-Y`x6Q zSxU7Dht@`wbuMu}P|K(}vBw||@>=$9cgkCrCDwl>g}Mxdt@E)%&kg$tWb9Sry2_iz zOB=j5jVrK6acyuLf+eYNQUc~W9(jng3BP-)abs{=Xx@4d5k2m?mBoq#K`57%HW~|W;YYV>yus?U$FBP2?~Z=HU!l2{lUsvQ<$(wLDvb3R`T$thlwX6@D8g|sDwV1ep6mCxn zDgHb-qqu2ja-8j$tJlLaY%&O$I#{2N+mI$EtNvSF5au}jhYK%D7LhP#Xzhl}pe77$ z#1SvL%`s`<%0aR1pR#7NozaeAgC3bKk9`Ol=|o$3SqzIk<8Edn#CP(r)HT?7%)-fN zu9(h<&vaWx6es=hfd-we{Q(_Zc*5b$xi67XHgI~5s_t#Us1!c4DRP8ko9`@ zR$Oj##Mb_|(uK8QXsXUvp4vw0QYb5v6}Nl$Sz}rz>DPc=s}0hcdjEXw4ap6 zhr~I!pEnF>5&FPb!>i8p63PWjsKnSyX_Jg0lMBIc7zVYjhyt6Aog(yndi*MhicRA; z7rP(XDIW`dJsa$M6LjxAvzJOl4KR{Jh+G2(xP7+H|9FUP+N8;mJ^@#fSllpjs3$e| zNSVWY(AQ@hLc0Jy=Igte`-pCncAMz|%FN%LtiqN}Av zIb?=lCknCl*rT3ZUlq)Eq*v^PE%=Mh>-9JOpl1&`=@$dlNKp<3WYIxeE8cUqiMyrx zHMVM{Ne#Z<9JFcz_1iEEmy2}6ec!i1-<1Y|)!cHf^iTY!4xh6)=5E0wti*G{)p+Uh zU-(vRoxdX-5$WhUHW!KSn2_+c7B|(2Qb1mWax1deB6#+>?L-O+s>*8;ZT-JHh9hOs zO1cL3dw)*ENGK~bIL_+A9YXcQYTOr;tlvW)8gCexFe9|<+z-~Y+6Z8tD^BG^{}s|9 z?TULy3#N~j_Zz{|0^t#(%EjPDB6S0Owp z=>3DBuI-E9j#0aglr>DE2SIw-LYI8T_`%WOesBV-UzfdY@^s87ME+a@kL4re`NZ|S5f4RClB=1DyQ%K(axqkx6xhI6z3O9_ zdawbG3w1w86pOLWTe&)#cy-~F6oM(6OeQ_YNzi3as3foxH4e(rPBvA=sE(0T9Nxv8 zMyyRrQI{;JSRx$HUgW;n)6-nnU{p*Mi@~KsZ9b{5vIxT+B2mQe2Ov2SMiW<>U-e>t zASLW+lV>bUDF1v{(S1wSV4N#k z42ios4Z;mTx-$!#W6?|R2UMub_xnkV?+Oq!$P4Tf!QSorsT!kNA^Mbx)`G zo)yrP9rbl5BroBi!DS4?H+&*pd}|HW#M1O=N3t9 zT1>V1+{}FZ(IfVLzp%fs0=XRdEY4Bh@O7eg%x}aZhZsKgO4*pz7P&x2S2xK&nP*32 zYQXY!;zeGyFa@)MiMG1$)2;7lp`Ik-7GDqcUoeIGT=35WTu%S7VFH^I`8DcOduoR= za(av)hlKA#X%7bF@5SWYgr{*C){go?r_v^$oV2{?wYmJ@JE#{Zc+{%j&|1bY%+V`on_vI3pfZ zzKIBGK4AgU9%GZuJ(#Z@bNwv=jlF-kJ~Jq8&@8&+*&L6yPq-!aBI8ArmmOvy1SX>3 z%Q!?b%1#@94G8wN8t5UZ237?^v%vVODg$UT?wAg1QgzdLgamtUWo`)`lBD0n;HG zqh~8y-x3Bl-76){{yAaP8n5*f_K7=2&z+Su84ZE-e9b2L-XD@lJuZWVH^2jxaa(c|Hn#(IW*7EbsYw=FU?L|qDVTI?A3kDGei>Fmkv;8<;O zE?l-|EB4s)EO%Gde+=xYxpsjAUG*O$6kQXzIZC@)pHYknkH{G~&Z=YE!^Ut6(3-iz z>xt{vzs_0*t3sSr@j4dwO3DN~$p_6Lu-lVO_~#er^QM^}+pstHzJo9Wyrr*lc?%8Qt6Be%btN%0&e4J9 z);Puu+=k;9u~ALBbHK(J7OpC=lx8od8(zAe`rZ#mCI}QoYH^{DGrb;LpKtL+_~O%B z4xJ^;9?Mk*&#S6Sp;hw|*&ib+E7t7D4}^P`q5K;$3`LY2wm(psTcr-g`1_&Mk{=kH ze&D_KOSQ@$wi^~xefAnc7|++M-uG+JLmL8<`j~YS_sGQ1l05OibzcEvdH;SPR3z?o zwoIPh`U4?&l;tP;gvY-se#q zo_v}#T8ssgV&5Mz-Op2dTUuUb*Vb+mYHMC{EzF$KK5y1g242XG;z-Lc6W;Cs!L}Qz|^pq?GSy4h8 zc$P-fu!`aLTj<@0f7#Nm!HzAT4KANSk{m4k(2OhH)3|xnxrm%u`*T?3_wAK5qB%FM z#iQ#2jygnB^A=Xd_g-^HbskKojw0;eqph_+aL-y!aYu^h>U_Sx!eUKr;Ww)^PrmHL z%Zh%x61yHD(Tx*4nB`~;*zMq&K?vd6j;A#s!qLGy?6$x@;_$CsUCAO6$Y5QD81b+U zl5yfJtxm$sl#TL70e|AwP!hX&7L>vrG>2;po>y@w zL(~qN*Q1L0(okOp?Sinp3w&~4h! z-4O~LF|o9J*ObjKIelr2%{+1-sQ*$B6;8t0cV{Yej99gO|9qG(B(f}JbliU zm61y&c(o^04u5`XSfJ%^bp#c<*kRlcHXwk<2=b$R*Zy1s4TBD^1DaS>k74&pfg$(D_F+ISxMGc*!%)Uh66QI(*2}rNrs5jkw9>mQp}MXGvDQ#VSJGV5 zUAmZv51se-exNj~#7Zy>PpB9E8;C`0o&=QmlfY@jR{I%{p;RZ zUUD@IYVK^4w<^I151UPdrmVe@TLPeEBZ8KfEeSt@xyFL>oKx*9$SWX1qYd3)(3?He z*^+bj!?PcPT&0|uRQEDJvue>Sr6^yAduGiCvV>GXOTSw1cu z)Qvhc@DX3PR%1lGL9&Zv z;1Bv_v)?Y%Ef~`hwyFOFjXkov;I9k|07$v^z(AsuX4Z)(1NRHKn^)-0#@aGgd6uSn z-DTP-kfPA*^~gd|W){e4Cg};Z#}*LLV=9W3XLx^;A`C|8L8{~X;g60D;KAj9fO8Eo z{Aes9YVTU66=EvFehVk`4y8WH6;O~wnnrQ(hkZ`lP7B@^p>~RCtIm1jAeFRk-$41Z zl!Y&Lt$JJUYWEr1(M}(w4kOn|d&;rG$MGy1NrIb|xwt09^S-LE)cf%}qg%u`>DhM# z2G@@@FunWhLb6ON<2rf_hdOLR`v~`Z2^}n=BuNkjx@D5RPt65a-mYI)Mn+a922KY$ zDSJfy176k#CRWO}dwL%K?h`!)UwlTHp3rF}d3%3)VSBmrm>fG_@h>yYHLVzJyx#qu zh?Pfax{MXg{O%#wgt6W;yM8=zbK`I>#q4U>vow?VT^-`@cXPhGzCSUe_8#ExC$)e5 z`}p_s>Bpmip7*PDj@`#B{uvIn#GW3pE-}&fxBG+jn~Bqjfdv-ohu!0w^{n)sz%2x! zgLjdh7na_@zaL?sL8%0dpPhapqU525gROx8Kmt_Fg9GwpJ<$S8Wo)(*jZ8K0^5s^i zm1vl>AaE8f{@R(kc73fp_L+ z$)q(a{t)6uVwGb>XZi9$W!^ezAF`m&Z&>o-o0U7$jrHPY!0S_h7fIOFS7HX4Y|G6R z=XzC~$amIX1y2j>Se=H?A8mKvW**;+lcGruC}wW*Iv?L=jGr2xj#;DKABP@qjIl@V zX9K~bO}r56_W)AXYY>L@$t3QCh}zk%c~_Ls9v{SA*0gNw!Yw(LDtAnN`r3&r^*BJ_ zYX)+R@&?B9p@0ml57S&stkw>cqhK+Wpxea9u2C(!g zq7>s>-SGDeBn2l36+|#>Wyb$DvV9Ioj)Q<$nHN@XRvyN7NkQEQP*GP3WzJg)B0pY` ziCZ*Z5|lG--)Mt;6J0g3@U>O{4N7ccmboGrD~qll!}=q&tR! z=oRnsMCD>wjQre*s!@V9ll5wWzlB5*QIa1t3th8A_Qxl$LQ zhB2we+Eb zy^w;&_<$kmLMnx;UYL~XA|c+A+1Z%u=_qzyLz84)N-*-+;Uq&;ODTuD-MP*0#pQ`}T;Bj&JB;)f#KV*{RPF80k7JUv>0HkOPZ^~GP_xEq!JDUBVDaL& zT3YSn7EB|2gW6pK``nl)b7q$PNINPpciY70{9edOzDT<0U41H4ozsMvwuk;A@n1R? z{*#n8so!5oP?X!KOoOYKSFzEVLrO8FHsxDtbtlv7x&=Vv6U$cl+h1ucU+gBVp>xk3 zFL!Cz#eKyNO2)j@=%ED1TKST_EItu86uvpx$d^}dzJNErP@j$R2jig{)o!goolv`N zN_>fAk(k{JL9!Z|!nOS^LR%Ds=-m)Fsz}#M8dfc`;52+D8^pDptf&2B>^_V=_6!NC zQQkYj?DU4DvkNd|*SgOFl*EsL`vei#pV^yxW9B{QrJq@CgN-z2NiQhioMXfPAVql4 zGJF+jPy#Qmn>5za{fk+vURO*B>h321!v?MP6NR+q@W(U5nz+1udRouYVN}!GRsQ{Q z@iwn}@jkChdG=kP_rsqb8WS88%_cAx+$`?>K_IF!+Hm_!8;3l( zr4rGwYlg&cD?TWRCSfiiC>(d!`P;k;N2bdVw)h{ApXb*V-)bJq`srEBFxS1i7e>eF zol}3<=tfU20s7d^`&;d1Ta)165YNtv#cwn+&)X?>2#^jZ zNtx!UPU&p7JJf;?qla-58CQkGA9n-?dj;5bCMk4jLx87Mw_f_lpBRB2jDdtZc|0Zx zD~s!ac}Y#;1pA0Rm~5qad0pDLPaK_DYDrw!sS{fLlTV=qlyet83QBSbfsnFka3DG6 zL|Vd|?r_Ud)@X~PEPeXDC}Lg>+4Rab+AeEx36kTRf~d^TO6~omSUlWOCXpLqC=aKz zxvgVM_4c7(%-5{2f!OY%HH;9Gu&>xX7+Hxg_L`uUIccE{m@!9wXiM#_oIc}5KL-7{ zz?0f$up>f&_Y3Qe`yzj4USh+gb80NiEHPwz%5~4Ww!wc`j-pV%R zaWHm8?z!lY*F}L{{mK_IeL3zxhhl#L;!o)9x$#?mb$Z~!U?3|c0-L3gN$&mSJOyTB z_!_@Vpj2ULECQ3(+qLYB%{Z8k&69)APHl@jt11@@(P3uimDlBiYtS4H|i z!aE6GkLJ7Wcl^?O1iRA}ge|3L@17-FiI^%GI8TOCCS0E61!(3DlOn~V{FKcfmS~T$ z&HTXOzyoJBLXh?JrFEZiVa@>7yL5%Q#r`B+6 z7*G8zzr*31=afS2DZ5rm#OIR4#Sa_s@X5XDnUZ6;)o*O#V-bpV&x=YrNZgEELyiU9 zC}h>(oE=P^*&WuiFM-}y*_euE(%b>~MpRB2?C=$AZbT~34!&+Pgpv5)A~>91+TeUb z7H#Ejm#IVrL&H2bA;X6#_9evwBevO*lI*63*Q~?t{cj&h-gWj>?VI_Gt|}8o=~GeN z(J^WDJVsm>UIu`aQyrSKon5QTrpwFkR|EhjBSTimE_tOoWWh;$z$;>4uMKi1rOTzAfaW}9G-otxzB*MT6RW`qh;<1qo8Ejy z+s^$VS&8UbaqrWtFTLC{ z>SV%`u!g6avhC&l+c+w5sXV6H3ve8?NpmRWt5o9)uU_wejvmM?IjN%e^sdv^1ASu`auABBmz~V2%J~>J?1ka^&1LxJpmhCH_`9z0pVxyQmc5VXE zG?AIK?oha@osbP{HvS?Ex_-wcRR^-+P5Eo9!AKerBbz?=!kK>|Wgb8SE-5j;1I^zkct|-?5Z-tR=>Z(G*75VP#&q@|3tC zI6m1!1`)yRLi=<#?cM`R(UsfBQ(#2AM;|1;E?e?-}^6_lkQhz1PZid?> z1TlR(2tqhCdlLA8wDQWF@W)+X8+nFlMR}et*msnC1U$4q2p@qKf5l_Ft6@68Iyjd) zOoI!29Q=`L2_zyQop8gZq_1Iz^c0L%R_Y;SxqPmG)oRuMss-dpaSyW9Lbq?syb|Rm zU@O}6v`>x#&8u+@!fBKmIhtmmto#^i6djgWlx-uUE-7V@|3EurLTvY*pIJiWCgSAmx)Lvp zs?W&RTkRG6@i`6};;QK4Ym65@H$dLG%P(gbtBGJ|b(iMAVpaRyoRm@F57b56@etZ0?fO=nP z%oq)DWw_b}*tXSFR&cBG9gqix;zx4h6HS-ZiQxzFJP^KGHK(W>GBnK4K@B72VZWb4 zOCoh3{5gNg$&BsFvAJSCAF-5EopFE?)6-}`4mxwl(qMZK{mjRX-w6T?0I8Gr>t1 z?$5fjo0C;R+T>#{epx%ZYek=H|NJKcQ1HejMGzj}lA6fZmzOa;$vkhb1w-SafHb!s zL2wyt*`~w@@G%R|XO7)IPZ|o?F4A|m#ic7^lcWleZRkXlED9;bCiw8r(#|}TG@1z} z94Z}ci~mPcA*@}lEffFx!MN{9K1y^W+8x>x%?Mw(d4dW(jRwM~K#^mZ5nb6wAI=D& z0x|k9gwT{26BteCRSYRY3J7{G48@Kmf!p~7g|fzy!+1dzV;OLS!r^64FCW{Xu-x26 zDxQmS(2!VF1ZADXb4%z_EIR~JRIXJi`7-u{Zp6@`F;TPPQMnau-chx^Pe^x+<7*OL zOMX{E(Yt3mugWzhrU!3bwFbOc@#!nTpv~G?_C9^XxLW>fQ>WM=$}fgG|c+(rwJ2 zOvq)xC1oc$Mnt#wVGkAV_;HYla@o;Wn(2IYhe1-jnyIwF2&>aO#Xu<8s@k79PTot~ zBSrrSo;KxDV`)_>4FE~Fk+D>FSRyza$XWUR7+g1Ua3Iso{XF$D;z>N!E-Kw?YeN-Nft2j=Jzo1m9WHJR-CQcnR^-wN^^)fV_|8RHi*u zWM-ab*gN;u-=+Ddj6DIx2#gIwsBDkdFFU|RF|-Bj<0i6;#%WG}NGDIcnGgAzF0vMc zn+w>)CJk+6hecF#dqDffM7zGW!!UQs~P?ONJk9$~b?> z9_*3#SRzN0c0%TQ%FF8b2jI3>&L}GsyEcZ{+Je;iKpWb~wefn5Nne>0V7*Lkk+#Uw z$f`rAHshqLuHm&B0D)(bN_X3h~Zyo|b1Kg(WK_ z_h-3f$UxE#e&b5m#Vxu@qcGwYYZ-;L2QK#oi!sWX_|b+5zT|fRoU@1jq%{nzt(`w? zi2F8&hO&Ty_UY#-w+rCNIsQ^%NIE-eg`7%aoUU+`X8+W}c&j``cPTmr7G|cQ(N*g5 z`V<|M^sr9MvCNjp*^%z4u3h^DzX$W{{|G)2OM{GJneN&4d=GypJpES)G!RY4)pJYr z5H1bHx*X20upeKfr6HoFVR8L<3+tIcIcN$n7mM(r6jFOw%;Hck|`1Q>Z!@cFK+$~Y6|PKIn`Uxp$l7RqGinw=AF+s->*_IaN(!IZsP5MKyu1hjL`3#_{{_n^(`-FTGG-?mYw=X{E?V zOc=IRNofqtUM#!hI;N$PTzz|wz9b|J_*{D_-Q+U!u%CIN%}<=K)!_4~xJ>ykbC_N4 z?@&l8A%X^F^K3-pWfB(*gh91mY6w-r9;XbX4ZB#$zhcr$=gPW{{qQV=2@kH?>Jr|c zJDawFTI$0i&B|)I#icOH!pQ5mQuA9j8BF&x;1es+mC4YV$Eljl(n9=4zk#afFH2bv z)=)WvHB%xud1Vb92>O2h%UKtt6R64CYCRNcSnd#6#=m&L3B>P1sM-58RN02&&B}#j zJih*_hHCj4d&5j~;)6q)5E;}%z8j%+@IV4DM==`l?~6B-Z97}nvYX9D#7O6GPCF7# za$9#_7#=L&IxdSMB>6fmg0ADZEyCHTW-jlJO>ExpFeY2hYh3^f;!Y)o`7FTRK2Ek& zPn6~z!{BChE>IVr;J8shRssp#yUR?+?b_UKEmGtOYXYb(o|)2tcNOU6-~_oY>(PEO+FE8(w(t2<1WD<<>po z&j6faG+cOT@Y0U}&5B&9;oPjWdw=eceb*0|>wmXblAY+wVA_LhXv)x1()-( z*7X2l+v}VAw)>gK?GZWdO-d<9w(7uTmkH@+i?MqS#>qeWiRhQ+i;c?KX?Fro&&R*5 zk68U^--uwNKGdZU1poRYOwIR2mgw{fFh=`j4W%9)yXv5n@Sa3?2?YZ}6;#R1^u5lmnROW?EBKWC()XD#tAU$7Zg=oWbr6AW60UsEaVySqX5AP>~jcq$l=C2e9Qh zenZn0RFVeYrLUj^m{bI8wJqi?MgS@-=;@5GO{ zO5yV31pUJx{73jX{P&kzp><4J8xYKQUAr@|8kH+vjCC2Ls8NC9UpLOXg*<(jkC{3; z3%U37MKE|!rT9?#A3!UmEgH}@E$bgNsN&*TmpfaPkSlK~p=2rH)Ibw4$ebLcTXlOS znm>YzCvi!`>wo&k>ZU3d#PB$0!Q}WGgR?8GbwCH z0|L2oe3JTE;Wxdya)R*>sE+!sqlp#F50hn{&Xh!UiUNH2kvr5@7;@k@%O+lwKOY^= zzi~7+W%I!P?=R1;b9G>k9HEMNl)(T0Jf;r-;Q!ms|I>Qiq2YP-|IZIW>+%R-bfLp} qVlenngnTU+Sg1k1IBd*UXm&n`?EfB#|FPi+UCpOK))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class BPOL : DatabaseEntity, ISublistContainer { - - private ObservableCollection poi = new ObservableCollection(); - public BPOL() { this.tablename = "[dbo].[BPOL]"; @@ -36,7 +38,7 @@ namespace bsmd.database [ENI2Validation] public bool? CruiseShip { get; set; } - public ObservableCollection PortOfItineraries { get { return this.poi; } } + public ObservableCollection PortOfItineraries { get; private set; } = new ObservableCollection(); #endregion @@ -135,6 +137,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 1; } @@ -198,7 +202,7 @@ namespace bsmd.database { BPOL bpol = this.MemberwiseClone() as BPOL; bpol.id = null; - bpol.poi = new ObservableCollection(); + bpol.PortOfItineraries = new ObservableCollection(); foreach (PortOfItinerary po in this.PortOfItineraries) { diff --git a/nsw/Source/bsmd.database/BRKD.cs b/nsw/Source/bsmd.database/BRKD.cs index 54d95d43..e2067245 100644 --- a/nsw/Source/bsmd.database/BRKD.cs +++ b/nsw/Source/bsmd.database/BRKD.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using System.ComponentModel; namespace bsmd.database { @@ -37,6 +38,7 @@ namespace bsmd.database public string Identifier { get; set; } + [Browsable(false)] public string SublistCollectionKey { get { return "bkrd"; } } #endregion diff --git a/nsw/Source/bsmd.database/CallPurpose.cs b/nsw/Source/bsmd.database/CallPurpose.cs index d92bbeee..fb4d33b5 100644 --- a/nsw/Source/bsmd.database/CallPurpose.cs +++ b/nsw/Source/bsmd.database/CallPurpose.cs @@ -12,9 +12,13 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class CallPurpose : DatabaseEntity, ISublistElement { @@ -26,6 +30,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public NOA_NOD NOA_NOD { get; set; } [ShowReport] @@ -65,7 +70,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET CallPurposeCode = @P2, CallPurposeDescription = @P3, Identifier = @P4 " + "WHERE Id = @ID", this.Tablename); } @@ -119,5 +124,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index 672cf9e0..1ea53535 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -773,9 +773,9 @@ namespace bsmd.database mh.EntityValues = JsonConvert.SerializeObject(entity); if (ReportingParty.CurrentReportingParty != null) mh.ReportingPartyId = ReportingParty.CurrentReportingParty.Id.Value; - if (entity is ISublistElement) + if (entity is ISublistElement sublistElement) { - string stringIdentifier = ((ISublistElement)entity).Identifier; + string stringIdentifier = (sublistElement).Identifier; Regex re = new Regex(@"\d+"); Match m = re.Match(stringIdentifier); if (m.Success) @@ -819,7 +819,8 @@ namespace bsmd.database { typeof(TIEFD), typeof(TIEFD).Name }, { typeof(TOWA), typeof(TOWA).Name }, { typeof(TOWD), typeof(TOWD).Name }, - { typeof(WAS), typeof(WAS).Name } + { typeof(WAS), typeof(WAS).Name }, + { typeof(BPOL), typeof(BPOL).Name } }; } diff --git a/nsw/Source/bsmd.database/DatabaseEntity.cs b/nsw/Source/bsmd.database/DatabaseEntity.cs index af047ad0..36f1abec 100644 --- a/nsw/Source/bsmd.database/DatabaseEntity.cs +++ b/nsw/Source/bsmd.database/DatabaseEntity.cs @@ -18,6 +18,7 @@ using System.Xml.Serialization; using System.IO; using Newtonsoft.Json; using log4net; +using System.ComponentModel; namespace bsmd.database { @@ -55,9 +56,11 @@ namespace bsmd.database /// Nachrichtentyp der abgeleiteten Meldeklassen /// [JsonIgnore] + [Browsable(false)] public Message.NotificationClass MessageNotificationClass { get; set; } [JsonIgnore] + [Browsable(false)] public string MessageNotificationClassDisplay { get @@ -70,35 +73,42 @@ namespace bsmd.database /// Referenz zur eigentlichen Schiffankunft /// [JsonIgnore] + [Browsable(false)] public MessageCore MessageCore { get; set; } ///

/// gemeinschaftliche Daten /// [JsonIgnore] + [Browsable(false)] public Message MessageHeader { get; set; } /// /// SQL Table name to construct queries /// [JsonIgnore] + [Browsable(false)] public virtual string Tablename { get { return this.tablename; } } /// /// primary key - /// + /// + [JsonIgnore] + [Browsable(false)] public Guid? Id { get { return this.id; } } /// /// IsNew Flag /// [JsonIgnore] + [Browsable(false)] public bool IsNew { get { return !this.id.HasValue; } } /// /// Flag zeigt an ob das Objekt geändert wurde /// [JsonIgnore] + [Browsable(false)] public bool IsDirty { get; set; } #endregion @@ -314,6 +324,7 @@ namespace bsmd.database #region IMessageParagraph implementation [JsonIgnore] + [Browsable(false)] public virtual string Title { get @@ -324,12 +335,14 @@ namespace bsmd.database } [JsonIgnore] + [Browsable(false)] public virtual string Subtitle { get { return string.Empty; } } [JsonIgnore] + [Browsable(false)] public virtual bool ShowChildrenAsTable { get { return false; } @@ -339,6 +352,7 @@ namespace bsmd.database /// must be overridden if it must make sense /// [JsonIgnore] + [Browsable(false)] public virtual List> MessageText { get { @@ -399,6 +413,7 @@ namespace bsmd.database } [JsonIgnore] + [Browsable(false)] public virtual List ChildParagraphs { get { return null; } } #endregion diff --git a/nsw/Source/bsmd.database/HAZ.cs b/nsw/Source/bsmd.database/HAZ.cs index af02f625..932e976d 100644 --- a/nsw/Source/bsmd.database/HAZ.cs +++ b/nsw/Source/bsmd.database/HAZ.cs @@ -7,12 +7,17 @@ // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. +using Newtonsoft.Json; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Data.SqlClient; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class HAZ : DatabaseEntity, ISublistContainer { @@ -82,6 +87,8 @@ namespace bsmd.database [ENI2Validation] public string TransmissionType { get; set; } + [Browsable(false)] + [JsonIgnore] public bool HasPositions { get @@ -98,6 +105,8 @@ namespace bsmd.database /// /// Hilfsstruktur für Packagetype Darstellung (IMDG) im ENI-2 /// + [JsonIgnore] + [Browsable(false)] public static Dictionary PackageTypes { get; set; } #endregion @@ -324,6 +333,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 0; } } public IGCPosition GetIGCPositionWithIdentifier(string identifier) @@ -434,7 +445,7 @@ namespace bsmd.database { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IMDGPositions"; - List sublist = new List(); + //List sublist = new List(); foreach (IMessageParagraph imp in this.IMDGPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); @@ -444,7 +455,7 @@ namespace bsmd.database { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IBCPositions"; - List sublist = new List(); + //List sublist = new List(); foreach (IMessageParagraph imp in this.IBCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); @@ -454,7 +465,7 @@ namespace bsmd.database { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IGCPositions"; - List sublist = new List(); + //List sublist = new List(); foreach (IMessageParagraph imp in this.IGCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); @@ -464,7 +475,7 @@ namespace bsmd.database { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IMSBCPositions"; - List sublist = new List(); + //List sublist = new List(); foreach (IMessageParagraph imp in this.IMSBCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); @@ -474,7 +485,7 @@ namespace bsmd.database { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "MARPOLPositions"; - List sublist = new List(); + //List sublist = new List(); foreach (IMessageParagraph imp in this.MARPOLPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); diff --git a/nsw/Source/bsmd.database/IBCPosition.cs b/nsw/Source/bsmd.database/IBCPosition.cs index ab2626ca..49a2ebdd 100644 --- a/nsw/Source/bsmd.database/IBCPosition.cs +++ b/nsw/Source/bsmd.database/IBCPosition.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Reflection; @@ -17,6 +18,9 @@ using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class IBCPosition : DatabaseEntity, ISublistElement { @@ -58,6 +62,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public HAZ HAZ { get; set; } [ShowReport] @@ -158,6 +163,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "ibc"; } } #endregion diff --git a/nsw/Source/bsmd.database/IGCPosition.cs b/nsw/Source/bsmd.database/IGCPosition.cs index 5f14edc7..e7c790c7 100644 --- a/nsw/Source/bsmd.database/IGCPosition.cs +++ b/nsw/Source/bsmd.database/IGCPosition.cs @@ -9,12 +9,16 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using Newtonsoft.Json; namespace bsmd.database -{ +{ + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class IGCPosition : DatabaseEntity, ISublistElement { @@ -26,6 +30,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public HAZ HAZ { get; set; } [ShowReport] @@ -75,6 +80,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "igc"; } } #endregion @@ -106,7 +112,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET UNNumber = @P2, IMOClass = @P3, ProductName = @P4, " + "Quantity_KGM = @P5, StowagePosition = @P6, PortOfLoading = @P7, PortOfDischarge = @P8, Remarks = @P9, " + "Identifier = @P10 WHERE ID = @ID", this.Tablename); diff --git a/nsw/Source/bsmd.database/IMDGPosition.cs b/nsw/Source/bsmd.database/IMDGPosition.cs index 5be004bd..0f39d541 100644 --- a/nsw/Source/bsmd.database/IMDGPosition.cs +++ b/nsw/Source/bsmd.database/IMDGPosition.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Text; @@ -17,6 +18,9 @@ using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class IMDGPosition : DatabaseEntity, ISublistElement { public IMDGPosition() @@ -27,6 +31,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public HAZ HAZ { get; set; } [ShowReport] @@ -326,7 +331,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET UNNumber = @P2, PackingGroup = @P3, ProperShippingName = @P4, " + "IMOClass = @P5, CompatibilityGroup = @P6, TechnicalName = @P7, NetExplosiveMass_KGM = @P8, " + "Flashpoint_CEL = @P9, Class7NuclideName = @P10, Class7MaxActivity_BQL = @P11, Class7Category = @P12, " + @@ -454,7 +459,7 @@ namespace bsmd.database if (!this.Flashpoint_CEL.IsNullOrEmpty()) { - string pattern = @"^[<>]?\-?[0-9]+(\.[0-9]+)?$"; + const string pattern = @"^[<>]?\-?[0-9]+(\.[0-9]+)?$"; Regex regex = new Regex(pattern); if (!regex.IsMatch(this.Flashpoint_CEL)) @@ -463,7 +468,7 @@ namespace bsmd.database if(!this.IMOClass.IsNullOrEmpty()) { - string pattern = @"^[1-9]{1}(\.[1-9]{1}([A-Z]{1})?)?$"; + const string pattern = @"^[1-9]{1}(\.[1-9]{1}([A-Z]{1})?)?$"; Regex regex = new Regex(pattern); if (!regex.IsMatch(this.IMOClass)) diff --git a/nsw/Source/bsmd.database/IMSBCPosition.cs b/nsw/Source/bsmd.database/IMSBCPosition.cs index 8ae483bd..01f8d106 100644 --- a/nsw/Source/bsmd.database/IMSBCPosition.cs +++ b/nsw/Source/bsmd.database/IMSBCPosition.cs @@ -9,12 +9,16 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class IMSBCPosition : DatabaseEntity, ISublistElement { @@ -26,6 +30,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public HAZ HAZ { get; set; } [ShowReport] @@ -80,6 +85,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "imsbc"; } } #endregion diff --git a/nsw/Source/bsmd.database/InfectedArea.cs b/nsw/Source/bsmd.database/InfectedArea.cs index ce3c491b..6e14c0dc 100644 --- a/nsw/Source/bsmd.database/InfectedArea.cs +++ b/nsw/Source/bsmd.database/InfectedArea.cs @@ -9,12 +9,16 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class InfectedArea : DatabaseEntity, ISublistElement { @@ -26,6 +30,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public MDH MDH { get; set; } [ShowReport] @@ -40,6 +45,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "infectedarea"; } } #endregion diff --git a/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs b/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs index ecaa4903..bee4171d 100644 --- a/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs +++ b/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs @@ -12,9 +12,13 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class LastTenPortFacilitiesCalled : DatabaseEntity, ISublistElement { @@ -26,6 +30,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public SEC SEC { get; set; } [ShowReport] @@ -79,6 +84,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "l10pfc"; } } #endregion @@ -191,6 +197,6 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs b/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs index f1108a3d..7533ab85 100644 --- a/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs +++ b/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Text.RegularExpressions; @@ -16,6 +17,9 @@ using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class MARPOL_Annex_I_Position : DatabaseEntity, ISublistElement { @@ -27,6 +31,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public HAZ HAZ { get; set; } [ShowReport] @@ -45,7 +50,7 @@ namespace bsmd.database { get { - if (this.FlashpointInformation.HasValue && (this.FlashpointInformation.Value >= 0) && (this.FlashpointInformation.Value < IBCPosition.flashpointInformations.Length)) + if (this.FlashpointInformation.HasValue && (this.FlashpointInformation.Value < IBCPosition.flashpointInformations.Length)) return IBCPosition.flashpointInformations[this.FlashpointInformation.Value]; return ""; } @@ -88,6 +93,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "marpol"; } } #endregion diff --git a/nsw/Source/bsmd.database/MDH.cs b/nsw/Source/bsmd.database/MDH.cs index cc47c5c7..af94aecc 100644 --- a/nsw/Source/bsmd.database/MDH.cs +++ b/nsw/Source/bsmd.database/MDH.cs @@ -12,9 +12,13 @@ using System.Data.SqlClient; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; +using System.ComponentModel; +using Newtonsoft.Json; namespace bsmd.database -{ +{ + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class MDH : DatabaseEntity, ISublistContainer { public MDH() @@ -467,6 +471,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 37; } @@ -557,6 +563,8 @@ namespace bsmd.database } } + [Browsable(false)] + [JsonIgnore] public override List ChildParagraphs { get @@ -669,4 +677,32 @@ namespace bsmd.database #endregion } + + #region class MDHConverter + + public class MDHConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value is string) + { + string s = value.ToString(); + //s = s.Replace("\\", ""); + return JsonConvert.DeserializeObject(s); + } + return base.ConvertFrom(context, culture, value); + } + } + + #endregion + } diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index 71c58767..f4933479 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -1,9 +1,13 @@ -using System; +// Copyright (c) 2015-present schick Informatik +// Description: Container für alle Meldeklassen + +using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using Newtonsoft.Json; namespace bsmd.database { @@ -629,6 +633,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get diff --git a/nsw/Source/bsmd.database/MessageHistory.cs b/nsw/Source/bsmd.database/MessageHistory.cs index 235de4eb..b6e09fac 100644 --- a/nsw/Source/bsmd.database/MessageHistory.cs +++ b/nsw/Source/bsmd.database/MessageHistory.cs @@ -93,29 +93,32 @@ namespace bsmd.database int selIndex = tmpList.IndexOf(this); tmpResult.AddLast(refEntity); - int myIdentifier = Int32.Parse((sublistElement).Identifier); - + // Elemente vor dem ausgewählten Element der Linked List hinzufügen - int indexIdentifier = myIdentifier; - - for (int tmpIndex = selIndex - 1; (indexIdentifier != 1) && (tmpIndex >= 0); tmpIndex--) + int indexIdentifier = Util.GetNumericIdentifier(sublistElement).Value; + int refIdentifier = indexIdentifier; + + for (int tmpIndex = selIndex - 1; tmpIndex >= 0; tmpIndex--) { DatabaseEntity prevEntity = tmpList[tmpIndex].CreateObjectFromValues() as DatabaseEntity; - indexIdentifier = Int32.Parse(((ISublistElement)prevEntity).Identifier); + int nextIdentifier = Util.GetNumericIdentifier((ISublistElement)prevEntity).Value; + if (nextIdentifier >= indexIdentifier) break; + indexIdentifier = nextIdentifier; tmpResult.AddFirst(prevEntity); } // Elemente nach dem ausgewählten Element hinzufügen (wenn sie zur gleichen Gruppe gehören) if ((tmpList.Count - 1) > selIndex) { - DatabaseEntity nextEntity = tmpList[selIndex + 1].CreateObjectFromValues() as DatabaseEntity; - indexIdentifier = Int32.Parse(((ISublistElement)nextEntity).Identifier); + indexIdentifier = refIdentifier; - for (int tmpIndex = selIndex + 2; (indexIdentifier != 1) && (tmpIndex < tmpList.Count); tmpIndex++) + for (int tmpIndex = selIndex + 2; tmpIndex < tmpList.Count; tmpIndex++) { - tmpResult.AddLast(nextEntity); - nextEntity = tmpList[tmpIndex].CreateObjectFromValues() as DatabaseEntity; - indexIdentifier = Int32.Parse(((ISublistElement)nextEntity).Identifier); + DatabaseEntity nextEntity = tmpList[tmpIndex].CreateObjectFromValues() as DatabaseEntity; + int nextIdentifier = Util.GetNumericIdentifier((ISublistElement)nextEntity).Value; + if (nextIdentifier <= indexIdentifier) break; + indexIdentifier = nextIdentifier; + tmpResult.AddLast(nextEntity); } } } diff --git a/nsw/Source/bsmd.database/NOA_NOD.cs b/nsw/Source/bsmd.database/NOA_NOD.cs index 911539d1..5443ea41 100644 --- a/nsw/Source/bsmd.database/NOA_NOD.cs +++ b/nsw/Source/bsmd.database/NOA_NOD.cs @@ -12,9 +12,14 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; +using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class NOA_NOD : DatabaseEntity, ISublistContainer { public NOA_NOD() @@ -35,7 +40,7 @@ namespace bsmd.database public DateTime? ETDFromPortOfCall { get; set; } [Validation1(ValidationCode.LIST_EMPTY)] - public ObservableCollection CallPurposes { get; } = new ObservableCollection(); + public ObservableCollection CallPurposes { get; set; } = new ObservableCollection(); [ShowReport] [Validation2(ValidationCode.NOT_NULL)] @@ -184,6 +189,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 3; } @@ -210,6 +217,7 @@ namespace bsmd.database #region IMessageParagraph implementation + [Browsable(false)] public override string Subtitle { get @@ -218,6 +226,7 @@ namespace bsmd.database } } + [Browsable(false)] public override List ChildParagraphs { get @@ -350,5 +359,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/NoTypeConverterJsonConverter.cs b/nsw/Source/bsmd.database/NoTypeConverterJsonConverter.cs new file mode 100644 index 00000000..6f3b291f --- /dev/null +++ b/nsw/Source/bsmd.database/NoTypeConverterJsonConverter.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2015-2017 schick Informatik +// Description: Helper Klasse damit die Deserialisierung richtig funktioniert, auch wenn man +// einen TypeConverter auf die Klasse loslässt.. + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.ComponentModel; + +namespace bsmd.database +{ + public class NoTypeConverterJsonConverter : JsonConverter + { + private static readonly IContractResolver resolver = new NoTypeConverterContractResolver(); + + private class NoTypeConverterContractResolver : DefaultContractResolver + { + protected override JsonContract CreateContract(Type objectType) + { + if (typeof(T).IsAssignableFrom(objectType)) + { + var contract = this.CreateObjectContract(objectType); + contract.Converter = null; // Also null out the converter to prevent infinite recursion. + return contract; + } + return base.CreateContract(objectType); + } + } + + public override bool CanConvert(Type objectType) + { + return typeof(T).IsAssignableFrom(objectType); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + return JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Deserialize(reader, objectType); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Serialize(writer, value); + } + + } + + #region class MessageClassConverter + + public class MessageClassConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value is string) + { + string s = value.ToString(); + //s = s.Replace("\\", ""); + return JsonConvert.DeserializeObject(s); + } + return base.ConvertFrom(context, culture, value); + } + } + + #endregion + +} diff --git a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs index ad329b0b..4aa741a7 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs @@ -13,9 +13,13 @@ using System.Text; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class PortOfCallLast30Days : DatabaseEntity, ISublistElement, ISublistContainer { public PortOfCallLast30Days() @@ -26,9 +30,11 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public MDH MDH { get; set; } public List CrewJoinedShip { get; private set; } = new List(); + [ShowReport] [Validation2(ValidationCode.LOCODE)] [MaxLength(5)] @@ -48,6 +54,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "pocl30d"; } } /// @@ -205,6 +212,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 1; } diff --git a/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs b/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs index c2d384d8..f4bb32c1 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs @@ -12,9 +12,13 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class PortOfCallLast30DaysCrewJoinedShip : DatabaseEntity, ISublistElement { diff --git a/nsw/Source/bsmd.database/PortOfItinerary.cs b/nsw/Source/bsmd.database/PortOfItinerary.cs index aa9ff25e..84f094f5 100644 --- a/nsw/Source/bsmd.database/PortOfItinerary.cs +++ b/nsw/Source/bsmd.database/PortOfItinerary.cs @@ -12,9 +12,12 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class PortOfItinerary : DatabaseEntity, ISublistElement { @@ -26,6 +29,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public BPOL BPOL { get; set; } [ShowReport] @@ -46,6 +50,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "poi"; } } #endregion @@ -72,7 +77,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET PortOfItineraryName = @P2, PortOfItineraryETA = @P3, " + "PortOfItineraryLocode = @P5, Identifier = @P4 WHERE Id = @ID", this.Tablename); } diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs index fa20ec3d..d27d6b86 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs @@ -2,6 +2,6 @@ [assembly: AssemblyCompany("schick Informatik")] [assembly: AssemblyProduct("BSMD NSW interface")] -[assembly: AssemblyInformationalVersion("5.2.0")] +[assembly: AssemblyInformationalVersion("5.2.1")] [assembly: AssemblyCopyright("Copyright © 2014-2019 schick Informatik")] [assembly: AssemblyTrademark("")] \ No newline at end of file diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs index 7cb9a222..f648c0b9 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("5.2.0.*")] +[assembly: AssemblyVersion("5.2.1.*")] diff --git a/nsw/Source/bsmd.database/SEC.cs b/nsw/Source/bsmd.database/SEC.cs index ff01aa3a..878f232a 100644 --- a/nsw/Source/bsmd.database/SEC.cs +++ b/nsw/Source/bsmd.database/SEC.cs @@ -12,9 +12,14 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; +using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class SEC : DatabaseEntity, ISublistContainer { public SEC() @@ -84,6 +89,7 @@ namespace bsmd.database [ENI2Validation] public byte? ISSCType { get; set; } + [JsonIgnore] [ShowReport] [ReportDisplayName("ISSC type")] public string ISSCTypeDisplay { get { return Util.GetISSCTypeDisplay(this.ISSCType); } } @@ -93,6 +99,7 @@ namespace bsmd.database // [LookupName("SEC.ISSCIssuerType")] // wird manuell gescannt und konvertiert public byte? ISSCIssuerType { get; set; } + [JsonIgnore] [ShowReport] [ReportDisplayName("ISSC issuer type")] public string ISSCIssuerTypeDisplay { get { return Util.GetISSCIssuerTypeDisplay(this.ISSCIssuerType); } } @@ -337,6 +344,7 @@ namespace bsmd.database #region IMessageParagraph implementation + [Browsable(false)] public override string Subtitle { get @@ -358,6 +366,8 @@ namespace bsmd.database } } + [Browsable(false)] + [JsonIgnore] int ISublistContainer.NumberOfExcelRows { get @@ -489,5 +499,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/STAT.cs b/nsw/Source/bsmd.database/STAT.cs index 01ff340f..4b352d2d 100644 --- a/nsw/Source/bsmd.database/STAT.cs +++ b/nsw/Source/bsmd.database/STAT.cs @@ -11,6 +11,8 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { @@ -89,6 +91,7 @@ namespace bsmd.database public string TransportMode { get; set; } [ShowReport] + [JsonIgnore] public string TransportModeDisplay { get @@ -145,6 +148,7 @@ namespace bsmd.database [ENI2Validation] public string ISMCompanyCountry { get; set; } + [Browsable(false)] public override string Subtitle { get @@ -166,8 +170,10 @@ namespace bsmd.database [ENI2Validation] public string CertificateOfRegistryNumber { get; set; } + [JsonIgnore] public static Dictionary VesselTypeDict { get; set; } + [JsonIgnore] public static Dictionary TransportModeDict { get; set; } #endregion diff --git a/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs b/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs index d65e11f8..aec6b9cd 100644 --- a/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs +++ b/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs @@ -13,9 +13,13 @@ using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class SanitaryMeasuresDetail : DatabaseEntity, ISublistElement { @@ -48,6 +52,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "smd"; } } #endregion @@ -125,4 +130,32 @@ namespace bsmd.database } + + #region class SanitaryMeasuresDetailConverter + + public class SanitaryMeasuresDetailConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value is string) + { + string s = value.ToString(); + //s = s.Replace("\\", ""); + return JsonConvert.DeserializeObject(s); + } + return base.ConvertFrom(context, culture, value); + } + } + + #endregion + } diff --git a/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs b/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs index 2ce4267e..ddf72238 100644 --- a/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs +++ b/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs @@ -12,9 +12,12 @@ using System.Data; using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class ShipToShipActivitiesDuringLastTenPortFacilitiesCalled : DatabaseEntity, ISublistElement { @@ -26,6 +29,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public SEC SEC { get; set; } [ShowReport] @@ -74,6 +78,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "s2s"; } } #endregion @@ -109,7 +114,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET ShipToShipActivityLocationName = @P2, ShipToShipActivityLocationLoCode = @P3, " + "ShipToShipActivityLocationCoordinatesLatitude = @P4, ShipToShipActivityLocationCoordinatesLongitude = @P5, ShipToShipActivityDateFrom = @P6," + "ShipToShipActivityDateTo = @P7, ShipToShipActivityType = @P8, ShipToShipActivitySecurityMattersToReport = @P9, Identifier = @P10, " + @@ -210,4 +215,5 @@ namespace bsmd.database #endregion } + } \ No newline at end of file diff --git a/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs b/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs index 8accc63f..9b5bdb30 100644 --- a/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs +++ b/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs @@ -13,9 +13,13 @@ using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class StowawaysJoiningLocation : DatabaseEntity, ISublistElement { @@ -27,6 +31,7 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public MDH MDH { get; set; } [ShowReport] diff --git a/nsw/Source/bsmd.database/Util.cs b/nsw/Source/bsmd.database/Util.cs index 10fbe4b5..b0aa2f6c 100644 --- a/nsw/Source/bsmd.database/Util.cs +++ b/nsw/Source/bsmd.database/Util.cs @@ -212,6 +212,21 @@ namespace bsmd.database return result; } + public static int? GetNumericIdentifier(ISublistElement element) + { + if (element != null) + { + string stringIdentifier = element.Identifier; + Regex re = new Regex(@"\d+"); + Match m = re.Match(stringIdentifier); + if (m.Success) + { + return Int32.Parse(m.Value); + } + } + return null; + } + #region CoordinateTransformation public static double NSWToDecimalDegrees(int nswCoordinate) diff --git a/nsw/Source/bsmd.database/WAS.cs b/nsw/Source/bsmd.database/WAS.cs index f47c8255..5fd3815e 100644 --- a/nsw/Source/bsmd.database/WAS.cs +++ b/nsw/Source/bsmd.database/WAS.cs @@ -12,9 +12,14 @@ using System.Text; using System.Data.SqlClient; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; +using Newtonsoft.Json; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class WAS : DatabaseEntity, ISublistContainer { public WAS() @@ -25,12 +30,16 @@ namespace bsmd.database #region Properties + [JsonIgnore] public static int[] DKWasteCodes { get; } = { 1100, 1200, 1300, 2100, 2200, 2300, 2311, 2308, 2600, 2300, 2309, 3000, 5100, 5200, 5300, 2300 }; + [JsonIgnore] public static string[] DKWasteTypes { get; } = { "Waste oils - Sludge", "Waste oils - Bilge water", "Waste oils - Other", "Garbage - Food waste", "Garbage - Plastic", "Garbage - Other", "Garbage - Other - Cooking oil", "Garbage - Other - Incinerator ashes and clinkers", "Operational wastes", "Garbage - Other", "Garbage - Other - Animal carcasses", "Sewage", "Cargo residues - Marpol Annex I - Other", "Cargo residues - Marpol Annex II - Other", "Cargo residues - Marpol Annex V - Other", "Garbage - Other" }; + [JsonIgnore] public static int[] RequiredCodes { get; } = { 1100, 1200, 1300, 2100, 2200, 2300, 2311, 2308, 2600, 2309, 3000, 5100, 5200, 5300 }; + [JsonIgnore] public static string[] RequiredTypes { get; } = { "Oily Residues (sludge)", "Oily Bilge Water", "Waste oil - others (specify)", "Food waste", "Plastics", "Domestic wastes", "Cooking oil", "Incinerator ashes", "Operational wastes", "Animal carcass(es)", "Sewage", "Cargo residues - Marpol Annex I", "Cargo residues - Marpol Annex II", "Cargo residues - Marpol Annex V" }; [ShowReport] @@ -64,9 +73,10 @@ namespace bsmd.database [LookupName("WAS.ConfirmationOfSufficiency")] [ENI2Validation] public bool? ConfirmationOfSufficiency { get; set; } - + public ObservableCollection Waste { get; private set; } = new ObservableCollection(); + [Browsable(false)] public ObservableCollection WasteDisposalServiceProvider { get; private set; } = new ObservableCollection(); /// @@ -270,6 +280,8 @@ namespace bsmd.database return null; } + [Browsable(false)] + [JsonIgnore] public int NumberOfExcelRows { get { return 15; } @@ -307,6 +319,8 @@ namespace bsmd.database #region IMessageParagraph implementation + [Browsable(false)] + [JsonIgnore] public override string Subtitle { get @@ -315,6 +329,8 @@ namespace bsmd.database } } + [Browsable(false)] + [JsonIgnore] public override List ChildParagraphs { get @@ -514,5 +530,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/Waste.cs b/nsw/Source/bsmd.database/Waste.cs index 1618c6f5..2cb3a737 100644 --- a/nsw/Source/bsmd.database/Waste.cs +++ b/nsw/Source/bsmd.database/Waste.cs @@ -10,9 +10,13 @@ using System.Data.SqlClient; using System.Collections.Generic; using Newtonsoft.Json; +using System.ComponentModel; namespace bsmd.database { + + [TypeConverter(typeof(MessageClassConverter))] + [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class Waste : DatabaseEntity, ISublistElement { @@ -24,9 +28,11 @@ namespace bsmd.database #region Properties [JsonIgnore] + [Browsable(false)] public WAS WAS { get; set; } [JsonIgnore] + [Browsable(false)] [ShowReport] public string WasteTypeDisplay { @@ -128,6 +134,7 @@ namespace bsmd.database public string Identifier { get; set; } [JsonIgnore] + [Browsable(false)] public string SublistCollectionKey { get { return "waste"; } } [JsonIgnore] @@ -261,5 +268,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/nsw/Source/bsmd.database/bsmd.database.csproj b/nsw/Source/bsmd.database/bsmd.database.csproj index d4f21d48..92383c70 100644 --- a/nsw/Source/bsmd.database/bsmd.database.csproj +++ b/nsw/Source/bsmd.database/bsmd.database.csproj @@ -81,6 +81,7 @@ + diff --git a/nsw/Source/bsmd.database/bsmd.database.licenseheader b/nsw/Source/bsmd.database/bsmd.database.licenseheader index 19cf4bb6..d6f3d796 100644 --- a/nsw/Source/bsmd.database/bsmd.database.licenseheader +++ b/nsw/Source/bsmd.database/bsmd.database.licenseheader @@ -5,7 +5,7 @@ extensions: .cs .cpp .h extensions: .aspx .ascx <%-- -Copyright (c) 2015-2017 schick Informatik +Copyright (c) 2015-present schick Informatik --%> extensions: .vb 'Sample license text.