From 9a760d823a0288669e438c56897025b92396eb29 Mon Sep 17 00:00:00 2001 From: SMSAPI Date: Fri, 7 Feb 2020 12:53:45 +0100 Subject: [PATCH 001/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 485e39a..294a5c2 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ try var result = smsApi.ActionSend() .SetText("test message") - .SetTo("694562829") + .SetTo("0000000000") .SetSender("Test") //Sender name .Execute(); From 704dbd712bcc27e66ddf2e4187e865538785c657 Mon Sep 17 00:00:00 2001 From: SMSAPI Date: Mon, 10 Feb 2020 10:25:47 +0100 Subject: [PATCH 002/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 294a5c2..8e4aea7 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ catch (SMSApi.Api.ProxyException e) } ``` -## Wymagania +## Requirements * C# >= 3.5 + System.Runtime.Serialization, System.ServiceModel.Web * C# >= 4.0 From b8673405dcd55d1a54d34fc6ff6c591c1316fb0a Mon Sep 17 00:00:00 2001 From: SMSAPI Date: Wed, 12 Feb 2020 09:09:59 +0100 Subject: [PATCH 003/101] Adding generated dll files --- dll_files.zip | Bin 0 -> 243925 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dll_files.zip diff --git a/dll_files.zip b/dll_files.zip new file mode 100644 index 0000000000000000000000000000000000000000..ff7676b558b97298a17ebd7c35649b40373c8c37 GIT binary patch literal 243925 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ྞo#*``N3qzFC9zxby%l1CS?c?6Ma=3B;^AhEb05opd zE)bB-A7s$A*&zLNVtS*KYkuz7V!Eok@MFZqxZI2j5?93Z}zWxVf(*GeX!tl__YxNtM0Q8MnAV6! z$=IbmCa?_qDxXQ`g)g6|vAjvAVCDy10w_vRM8w?HeD3Kup|D8Arda9Ii(!g)1dShP zE>QACjjpF0@XFIMrpg?Jxp2BU=8V$0HYs8=TKBY*(D4x}2CZxpF!-5*&J)#Q7 zu3g0%>>agYN4gp_w{_4tmd}^?ZJ&Td)$*Frr2!6o4k zk-*8)F;(s^wmJZBxvpw7i+=o}OwWq{0c)AO!)=7}>H#Fzt8_OXTb(ipU>|Bx-J5{t zlfWPp%qVlWS6N)xq?RJ&6DX29O`omii_1r9JH!HME2!xSy-I`Qnb68l)7Ei2$}5nutzOE^J+#0t>hCX|B{3DdkH>X3mfMvw~)ov^Y zL$2PJ&e|hk7w0XBKD10d2=8&~w|G{1L6;>SHm6r~2VS*JU{cS zQ;?RDOQwn(Kd;nnxFQ|Ud}p;?HoMh_B^SL~mP^>GGFh*R3N*ec<}N{F;5${&9pu(d z@7#nXmVDRgvk$R3)hk&Izakcl?x7qPzo@kIukSXfEBZ1wysHwkKWg;Fu~1-Vc_sbv zOh?35AD~ks?sn?ZYLZqvfPds%R^>oFpJq9YE@=C#Tj^-JL=IOSG}zDhjrhITgNOW3 z7*KzF2+D}Q|Nh`V-(aA~{`2VRf2ygj6*DUXJk+!A&mTbHKxvm)@B{k{Ix7w&ssS+0-b(vo+-)&m9g^v}M3^!bDFqc6||sA+CUuVZZdcS3NC(su%A z@CV_Z^eX`*+c49~0tHoS@hc(Yj{6hg?#*L=Cn)wyeJ9-i?f3OB!au!1{!_yr-o$%; zCuo~l>S~&sGts~N$)jw{f$#k(8U6mNM?w0gGfj8h;vPUj5&hZ!+1*b%{?Y&5D_wIS z{YRjg>EHEWl=uA)JwGzJo<-QW`XiG*sJkTZv;KqE=Jl(dd*094*qi^z=3d!-{mZ!@ zB-fX>_Co)8Pv6g^v(bMc{l8~qh4A2yqu|es7=Ox$y1MwgXM?i;J)@czUpJcX9QtQQ z$^Yno@7eD%+JG2?*I%8BWoWQ^{Kr)OBcmk5U-jJcexFgJ(+_3$3V$Wh zv;YT%f1A;y%D<3)$%xzS#~ihCeg3YA8tq5@i}b(dNG|N}B<5e{XdKk=-Lrco|D4kw zM_b6Er|a+M$o(Jv?>+lnM)lLR-+7fnKXlyJzx4dz#kpDt!2UL)PvO7nx##_y5d(|z zPs;8U{z?jxpUims+l=a#|Aq8RM%Jf4GRiagq3OQ=oaY zz;ylhIm$?;7XAGkY5$}Dy=TA6XlbYPJMUh{ef>+%kBs84upUDHHX|*(U-jJcexK3X zvmeUt75+-{(KM#`{TwBH{1?*yLq;fnp1=RN9^oZ_CjqTAO?5Oab$-1d>0p$7H;t9p z|G!?49yvQ^KYR!Ur3noMMf@k=*&RUmpMZPUewWgY>yNYDeLDB`SMTh+)jvr6XO)2a z6VN;LABygQKgV=`NxIi|Uw=h~MN7`zUy^=Cp&b4j>R)nt0R3ZS!hQ3<&v!rP6hQIl zk6HRFr=N#OV=V7`PV_?mJtvbl(2^Z@skGcJ9DdHJ>Yspn+kTgm+SHftKy2b4itg*L z<{`&n68=7?ddhz&x(EK8)BUoJ+~kM0dyT)Me%=n??~4>+yMIIdl9Sei{C8E?3_n!e Z*Y{%3Fn6v&;op5;!9zhc=Rdl8_J1l{^&$WO literal 0 HcmV?d00001 From 044685d4ed955a87c9b555c7a91ab4f391494095 Mon Sep 17 00:00:00 2001 From: knowak Date: Mon, 9 Mar 2020 23:25:14 +0100 Subject: [PATCH 004/101] Language version 4 compability. --- smsapi/ClientOAuth.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index 280bfbc..d40f3bd 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -5,13 +5,13 @@ namespace SMSApi.Api { public class ClientOAuth : IClient { - public string Token { get; } + public string Token { get; private set; } public ClientOAuth(string token) { if (string.IsNullOrEmpty(token)) { - throw new ArgumentNullException(nameof(token)); + throw new ArgumentNullException("token"); } Token = token; From 40251e90923afa3e125c9b9833ebd3677ba325b1 Mon Sep 17 00:00:00 2001 From: knowak Date: Mon, 30 Mar 2020 19:46:06 +0200 Subject: [PATCH 005/101] Error Code migrated from int to string --- smsapi/ActionException.cs | 2 +- smsapi/Api/Action/Base.cs | 32 +++++++++++++++++--------------- smsapi/Api/Response/Error.cs | 8 ++++---- smsapi/ClientException.cs | 2 +- smsapi/HostException.cs | 4 ++-- smsapi/SmsapiException.cs | 6 +++--- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/smsapi/ActionException.cs b/smsapi/ActionException.cs index 044da23..07996ea 100644 --- a/smsapi/ActionException.cs +++ b/smsapi/ActionException.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api { public class ActionException : SMSApi.Api.SmsapiException { - public ActionException(string message, int code) + public ActionException(string message, string code) : base(message, code) { } diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index d89ecde..19c9e4d 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -91,7 +91,7 @@ protected void HandleError(Stream data) { { var error = ResponseToObject(data); - if (error.Code != 0) + if (error.isError()) { if (isHostError(error.Code)) { @@ -107,7 +107,9 @@ protected void HandleError(Stream data) { } } } - catch (System.Runtime.Serialization.SerializationException) { } + catch (System.Runtime.Serialization.SerializationException e) + { + } data.Position = 0; } @@ -121,15 +123,15 @@ protected void HandleError(Stream data) { * 1000 Akcja dostępna tylko dla użytkownika głównego * 1001 Nieprawidłowa akcja */ - private bool isClientError(int code) + private bool isClientError(string code) { - if (code == 101) return true; - if (code == 102) return true; - if (code == 103) return true; - if (code == 105) return true; - if (code == 110) return true; - if (code == 1000) return true; - if (code == 1001) return true; + if (code == "101") return true; + if (code == "102") return true; + if (code == "103") return true; + if (code == "105") return true; + if (code == "110") return true; + if (code == "1000") return true; + if (code == "1001") return true; return false; } @@ -140,12 +142,12 @@ private bool isClientError(int code) * 999 Wewnętrzny błąd systemu * 201 Wewnętrzny błąd systemu */ - private bool isHostError(int code) + private bool isHostError(string code) { - if (code == 8) return true; - if (code == 201) return true; - if (code == 666) return true; - if (code == 999) return true; + if (code == "8") return true; + if (code == "201") return true; + if (code == "666") return true; + if (code == "999") return true; return false; } diff --git a/smsapi/Api/Response/Error.cs b/smsapi/Api/Response/Error.cs index c4374ef..123d4d7 100644 --- a/smsapi/Api/Response/Error.cs +++ b/smsapi/Api/Response/Error.cs @@ -7,19 +7,19 @@ public class Error { public Error() { - Code = 0; + Code = "0"; Message = ""; } - [DataMember(Name = "error", IsRequired = true)] - public readonly int Code; + [DataMember(Name = "error", IsRequired = false)] + public readonly string Code; [DataMember(Name = "message", IsRequired = true)] public readonly string Message; public bool isError() { - return (Code != 0); + return !string.IsNullOrEmpty(Code) && (Code != "0"); } } } diff --git a/smsapi/ClientException.cs b/smsapi/ClientException.cs index bfd8be8..f1e9a02 100644 --- a/smsapi/ClientException.cs +++ b/smsapi/ClientException.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api { public class ClientException : SMSApi.Api.SmsapiException { - public ClientException(string message, int code) + public ClientException(string message, string code) : base(message, code) { } diff --git a/smsapi/HostException.cs b/smsapi/HostException.cs index 41af65f..2079eda 100644 --- a/smsapi/HostException.cs +++ b/smsapi/HostException.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api { public class HostException : SMSApi.Api.SmsapiException { - public static readonly int E_JSON_DECODE = -1; + public static readonly string E_JSON_DECODE = "-1"; - public HostException(string message, int code) + public HostException(string message, string code) : base(message, code) { } diff --git a/smsapi/SmsapiException.cs b/smsapi/SmsapiException.cs index c5ce93c..d746f31 100644 --- a/smsapi/SmsapiException.cs +++ b/smsapi/SmsapiException.cs @@ -7,15 +7,15 @@ namespace SMSApi.Api { public class SmsapiException : SMSApi.Api.Exception { - private int Code; + private string Code; - public SmsapiException(string message, int code) + public SmsapiException(string message, string code) : base(message) { Code = code; } - public int GetCode() + public string GetCode() { return Code; } From f666457d8646e190a8feb6f992c0acfd8ee3b3de Mon Sep 17 00:00:00 2001 From: knowak Date: Sun, 10 May 2020 23:42:26 +0200 Subject: [PATCH 006/101] UserAgent added --- smsapi/Client.cs | 5 +++-- smsapi/ClientBase.cs | 33 +++++++++++++++++++++++++++++++++ smsapi/ClientOAuth.cs | 5 +++-- smsapi/IClient.cs | 1 + smsapi/ProxyHTTP.cs | 8 +++++++- smsapi/smsapi.csproj | 2 +- 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 smsapi/ClientBase.cs diff --git a/smsapi/Client.cs b/smsapi/Client.cs index a702116..2aa31a8 100644 --- a/smsapi/Client.cs +++ b/smsapi/Client.cs @@ -3,12 +3,13 @@ namespace SMSApi.Api { - public class Client : IClient + public class Client : ClientBase, IClient { protected string username; protected string password; public Client(string username) + : base() { SetUsername(username); } @@ -38,7 +39,7 @@ public void SetPasswordRAW(string password) SetPasswordHash(hash.ToString()); } - public string GetAuthenticationHeader() + public override string GetAuthenticationHeader() { return "Basic " + System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password)); } diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs new file mode 100644 index 0000000..3b51a74 --- /dev/null +++ b/smsapi/ClientBase.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace SMSApi.Api +{ + public abstract class ClientBase + { + private string _clientAgent; + + public ClientBase() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + + _clientAgent = String.Format( + "smsapi/csharp-client:{0};assemblyFile:{1};.net:{2}", + assembly.GetName().Version.ToString(), + fvi.FileVersion, + Environment.Version.ToString()); + } + + public string GetClientAgentHeader() + { + return _clientAgent; + } + + public abstract string GetAuthenticationHeader(); + } +} diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index d40f3bd..2a688a9 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -3,11 +3,12 @@ namespace SMSApi.Api { - public class ClientOAuth : IClient + public class ClientOAuth : ClientBase, IClient { public string Token { get; private set; } public ClientOAuth(string token) + : base() { if (string.IsNullOrEmpty(token)) { @@ -17,7 +18,7 @@ public ClientOAuth(string token) Token = token; } - public string GetAuthenticationHeader() + public override string GetAuthenticationHeader() { return "Bearer " + Token; } diff --git a/smsapi/IClient.cs b/smsapi/IClient.cs index 1a079b4..5167358 100644 --- a/smsapi/IClient.cs +++ b/smsapi/IClient.cs @@ -8,5 +8,6 @@ namespace SMSApi.Api public interface IClient { string GetAuthenticationHeader(); + string GetClientAgentHeader(); } } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 374d7af..b405386 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -120,7 +120,13 @@ public Stream Execute(string uri, NameValueCollection data, Dictionary SMSAPI.pl - 1.0.0 + 1.0.9 false https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE https://www.smsapi.pl From 23cf67f829a053252507f80c9d5022e8deef68f7 Mon Sep 17 00:00:00 2001 From: knowak Date: Tue, 12 May 2020 11:23:21 +0200 Subject: [PATCH 007/101] Version update --- smsapi/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smsapi/Properties/AssemblyInfo.cs b/smsapi/Properties/AssemblyInfo.cs index 721a9d9..d7f037f 100644 --- a/smsapi/Properties/AssemblyInfo.cs +++ b/smsapi/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.*")] -[assembly: AssemblyFileVersion("2.0.0.0")] +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] From 39d3edc38e74f1a14f7635d8fb22806178254d08 Mon Sep 17 00:00:00 2001 From: knowak Date: Wed, 20 Oct 2021 16:30:54 +0200 Subject: [PATCH 008/101] Test removal of scheduled vms --- smsapiTests/VmsTest.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/smsapiTests/VmsTest.cs b/smsapiTests/VmsTest.cs index dcfd674..b5f7c74 100644 --- a/smsapiTests/VmsTest.cs +++ b/smsapiTests/VmsTest.cs @@ -19,11 +19,8 @@ public override void SetUp() [TestMethod] public void Send_Get_Delete() { - DateTime date = DateTime.Now; - if (date.Hour > 21 || date.Hour < 8) - { - date = date.AddHours(12); - } + DateTime tomorrow = DateTime.Now.AddDays(1); + DateTime date = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, 12, 0, 0); var sendResponse = _factory.ActionSend() From 4afd59b5c7cc7b1ae1c7f3df08958e9e891b1a49 Mon Sep 17 00:00:00 2001 From: knowak Date: Wed, 20 Oct 2021 16:40:34 +0200 Subject: [PATCH 009/101] Update README --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index 8e4aea7..e9bf1f0 100644 --- a/README.md +++ b/README.md @@ -64,18 +64,6 @@ try { System.Console.WriteLine("ID: " + status.ID + " NUmber: " + status.Number + " Points:" + status.Points + " Status:" + status.Status + " IDx: " + status.IDx); } - - for (int i = 0, l = 0; i < result.List.Count; i++) - { - if (!result.List[i].isError()) - { - var deleted = - smsApi.ActionDelete() - .Id(result.List[i].ID) - .Execute(); - System.Console.WriteLine("Deleted: " + deleted.Count); - } - } } catch (SMSApi.Api.ActionException e) { From bc88e0a5bf17f630f5592a83e51f16e9e2245f99 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 22 Oct 2021 13:34:27 +0200 Subject: [PATCH 010/101] Update tests --- smsapiTests/MmsTest.cs | 29 +++++++++++++++++++++++++---- smsapiTests/SmsTest.cs | 21 ++++++++++++++++++++- smsapiTests/VmsTest.cs | 30 ++++++++++++++++++++++++++---- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/smsapiTests/MmsTest.cs b/smsapiTests/MmsTest.cs index aac45f6..89055e8 100644 --- a/smsapiTests/MmsTest.cs +++ b/smsapiTests/MmsTest.cs @@ -17,7 +17,7 @@ public override void SetUp() } [TestMethod] - public void Send_Get_Delete() + public void ScheduledSend_Get_Delete() { var sendResponse = _factory.ActionSend() @@ -32,10 +32,9 @@ public void Send_Get_Delete() string[] ids = new string[sendResponse.Count]; - for (int i = 0, l = 0; i < sendResponse.List.Count; i++) + for (int i = 0; i < sendResponse.List.Count; i++) { - ids[l] = sendResponse.List[i].ID; - l++; + ids[i] = sendResponse.List[i].ID; } System.Console.WriteLine("Get:"); @@ -59,5 +58,27 @@ public void Send_Get_Delete() Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } + + [TestMethod] + public void DeletingSentMessage_EmptyResponse() + { + var sendResponse = + _factory.ActionSend(). + SetSubject("test subject"). + SetSmil(""). + SetTo(_validTestNumber). + Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + var deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); + + Assert.AreEqual(0, deletedResponse.Count); + } } } diff --git a/smsapiTests/SmsTest.cs b/smsapiTests/SmsTest.cs index 7667c3e..f77094a 100644 --- a/smsapiTests/SmsTest.cs +++ b/smsapiTests/SmsTest.cs @@ -17,7 +17,7 @@ public override void SetUp() } [TestMethod] - public void Send_Get_Delete() + public void ScheduledSend_Get_Delete() { var sendResponse = _factory.ActionSend() @@ -68,6 +68,25 @@ public void Send_Get_Delete() Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } + [TestMethod] + public void DeletingSentMessage_ExceptionThrown() + { + var sendResponse = + _factory.ActionSend() + .SetText("test message") + .SetTo(_validTestNumber) + .Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + Assert.ThrowsException(() => _factory.ActionDelete().Id(ids[0]).Execute()); + } + [TestMethod] public void SendMessageWithParams() { diff --git a/smsapiTests/VmsTest.cs b/smsapiTests/VmsTest.cs index b5f7c74..306eaa6 100644 --- a/smsapiTests/VmsTest.cs +++ b/smsapiTests/VmsTest.cs @@ -17,7 +17,7 @@ public override void SetUp() } [TestMethod] - public void Send_Get_Delete() + public void ScheduledSend_Get_Delete() { DateTime tomorrow = DateTime.Now.AddDays(1); DateTime date = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, 12, 0, 0); @@ -36,10 +36,9 @@ public void Send_Get_Delete() string[] ids = new string[sendResponse.Count]; - for (int i = 0, l = 0; i < sendResponse.List.Count; i++) + for (int i = 0; i < sendResponse.List.Count; i++) { - ids[l] = sendResponse.List[i].ID; - l++; + ids[i] = sendResponse.List[i].ID; } System.Console.WriteLine("Get:"); @@ -63,5 +62,28 @@ public void Send_Get_Delete() Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } + + [TestMethod] + public void DeletingSentMessage_EmptyResponse() + { + var sendResponse = + _factory.ActionSend(). + SetTTS("test message"). + SetTo(_validTestNumber). + SetTry(4). + SetTryInterval(300). + Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + var deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); + + Assert.AreEqual(0, deletedResponse.Count); + } } } From 99abfc7e8745fabdde4d6f609671ea8116b2edc4 Mon Sep 17 00:00:00 2001 From: knowak Date: Thu, 4 Nov 2021 14:15:28 +0100 Subject: [PATCH 011/101] Update net35 to net452 and cleanup deprecated netcore --- smsapi/smsapi.csproj | 10 +++++----- smsapiTests/smsapiTests.csproj | 24 +++--------------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 7c4b4db..8b43dde 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -3,7 +3,7 @@ 8.0.30703 2.0 - net35;netcoreapp2.0;netcoreapp2.1;netcoreapp3.0;netcoreapp3.1;netstandard2.0;netstandard2.1 + net452;netcoreapp3.1;netstandard2.0;netstandard2.1 false false @@ -11,13 +11,13 @@ SMSAPI.pl 1.0.9 false - https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE + https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE https://www.smsapi.pl - SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. + SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. - smsapi + smsapi - + diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index 01c6961..f0bb712 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -1,10 +1,10 @@  - net45;netcoreapp2.0;netcoreapp2.1;netcoreapp3.0;netcoreapp3.1; + net452;netcoreapp3.1; false - + @@ -23,33 +23,15 @@ - + - - - - 4.7.0 - - 4.7.0 - - - - 4.7.0 - - - - - - 4.7.0 - - From e02c5465f9c842a7645021c9c63aea482ff970ad Mon Sep 17 00:00:00 2001 From: knowak Date: Thu, 4 Nov 2021 14:35:05 +0100 Subject: [PATCH 012/101] Cleanup and formatting --- smsapi/ActionException.cs | 16 +- smsapi/Api/Action/Base.cs | 325 ++++++++------ smsapi/Api/Action/BaseArray.cs | 7 +- .../Api/Action/Contacts/BindContactToGroup.cs | 30 +- smsapi/Api/Action/Contacts/CreateContact.cs | 225 ++++++---- smsapi/Api/Action/Contacts/CreateField.cs | 79 ++-- smsapi/Api/Action/Contacts/CreateGroup.cs | 100 +++-- .../Action/Contacts/CreateGroupPermission.cs | 131 +++--- smsapi/Api/Action/Contacts/DeleteContact.cs | 25 +- smsapi/Api/Action/Contacts/DeleteField.cs | 25 +- smsapi/Api/Action/Contacts/DeleteGroup.cs | 25 +- .../Action/Contacts/DeleteGroupPermission.cs | 30 +- smsapi/Api/Action/Contacts/EditContact.cs | 236 ++++++---- smsapi/Api/Action/Contacts/EditField.cs | 69 +-- smsapi/Api/Action/Contacts/EditGroup.cs | 111 +++-- .../Action/Contacts/EditGroupPermission.cs | 117 ++--- smsapi/Api/Action/Contacts/GetContact.cs | 25 +- smsapi/Api/Action/Contacts/GetContactGroup.cs | 30 +- smsapi/Api/Action/Contacts/GetGroup.cs | 25 +- .../Api/Action/Contacts/GetGroupPermission.cs | 30 +- .../Api/Action/Contacts/ListContactGroups.cs | 25 +- smsapi/Api/Action/Contacts/ListContacts.cs | 246 +++++----- .../Api/Action/Contacts/ListFieldOptions.cs | 25 +- smsapi/Api/Action/Contacts/ListFields.cs | 18 +- .../Action/Contacts/ListGroupPermissions.cs | 25 +- smsapi/Api/Action/Contacts/ListGroups.cs | 81 ++-- .../Action/Contacts/UnbindContactFromGroup.cs | 30 +- smsapi/Api/Action/HLR/CheckNumber.cs | 28 +- smsapi/Api/Action/MMS/Delete.cs | 34 +- smsapi/Api/Action/MMS/Get.cs | 34 +- smsapi/Api/Action/MMS/Send.cs | 160 ++++--- smsapi/Api/Action/Phonebook/ContactAdd.cs | 112 +++-- smsapi/Api/Action/Phonebook/ContactDelete.cs | 24 +- smsapi/Api/Action/Phonebook/ContactEdit.cs | 124 +++-- smsapi/Api/Action/Phonebook/ContactGet.cs | 24 +- smsapi/Api/Action/Phonebook/ContactList.cs | 119 +++-- smsapi/Api/Action/Phonebook/GroupAdd.cs | 38 +- smsapi/Api/Action/Phonebook/GroupDelete.cs | 43 +- smsapi/Api/Action/Phonebook/GroupEdit.cs | 45 +- smsapi/Api/Action/Phonebook/GroupGet.cs | 24 +- smsapi/Api/Action/Phonebook/GroupList.cs | 11 +- smsapi/Api/Action/Rest.cs | 56 ++- smsapi/Api/Action/SMS/Delete.cs | 24 +- smsapi/Api/Action/SMS/Get.cs | 36 +- smsapi/Api/Action/SMS/Send.cs | 326 +++++++------- smsapi/Api/Action/Send.cs | 11 +- smsapi/Api/Action/Sender/Add.cs | 12 +- smsapi/Api/Action/Sender/Delete.cs | 14 +- smsapi/Api/Action/Sender/List.cs | 13 +- smsapi/Api/Action/Sender/SetDefault.cs | 14 +- smsapi/Api/Action/User/Add.cs | 147 +++--- smsapi/Api/Action/User/Edit.cs | 152 ++++--- smsapi/Api/Action/User/Get.cs | 26 +- smsapi/Api/Action/User/GetPoints.cs | 42 +- smsapi/Api/Action/User/List.cs | 27 +- smsapi/Api/Action/VMS/Delete.cs | 36 +- smsapi/Api/Action/VMS/Get.cs | 37 +- smsapi/Api/Action/VMS/Send.cs | 250 ++++++----- smsapi/Api/ContactsFactory.cs | 423 +++++++++--------- smsapi/Api/Factory.cs | 71 ++- smsapi/Api/HLRFactory.cs | 58 ++- smsapi/Api/MMSFactory.cs | 44 +- smsapi/Api/PhonebookFactory.cs | 269 ++++++----- smsapi/Api/Response/Array.cs | 14 +- smsapi/Api/Response/Base.cs | 14 +- smsapi/Api/Response/BasicCollection.cs | 85 ++-- smsapi/Api/Response/CheckNumber.cs | 10 +- smsapi/Api/Response/Contact.cs | 208 +++++---- smsapi/Api/Response/Contacts.cs | 14 +- smsapi/Api/Response/Countable.cs | 26 +- smsapi/Api/Response/Error.cs | 14 +- smsapi/Api/Response/Field.cs | 30 +- smsapi/Api/Response/FieldOption.cs | 16 +- smsapi/Api/Response/FieldOptions.cs | 11 +- smsapi/Api/Response/Fields.cs | 11 +- smsapi/Api/Response/Group.cs | 131 +++--- smsapi/Api/Response/GroupPermission.cs | 31 +- smsapi/Api/Response/GroupPermissions.cs | 12 +- smsapi/Api/Response/Groups.cs | 3 +- smsapi/Api/Response/MessageStatus.cs | 67 +-- smsapi/Api/Response/NumberStatus.cs | 52 +-- smsapi/Api/Response/Points.cs | 41 +- smsapi/Api/Response/Sender.cs | 6 +- smsapi/Api/Response/Senders.cs | 10 +- smsapi/Api/Response/Status.cs | 26 +- smsapi/Api/Response/User.cs | 27 +- smsapi/Api/SMSFactory.cs | 130 +++--- smsapi/Api/SenderFactory.cs | 46 +- smsapi/Api/UserFactory.cs | 50 +-- smsapi/Api/VMSFactory.cs | 126 +++--- smsapi/Client.cs | 41 +- smsapi/ClientBase.cs | 17 +- smsapi/ClientException.cs | 14 +- smsapi/ClientOAuth.cs | 9 +- smsapi/Exception.cs | 16 +- smsapi/HostException.cs | 20 +- smsapi/IClient.cs | 7 +- smsapi/Properties/AssemblyInfo.cs | 1 - smsapi/Proxy.cs | 40 +- smsapi/ProxyAddress.cs | 7 +- smsapi/ProxyException.cs | 14 +- smsapi/ProxyHTTP.cs | 239 +++++----- smsapi/SmsapiException.cs | 17 +- smsapiTests/AuthorizationType.cs | 8 +- smsapiTests/ConfigurationTest.cs | 19 +- smsapiTests/Contacts/ContactsTest.cs | 90 ++-- smsapiTests/Contacts/ContactsTestBase.cs | 5 - smsapiTests/Contacts/FieldsTest.cs | 34 +- smsapiTests/Contacts/GroupsTest.cs | 88 ++-- smsapiTests/HlrTest.cs | 20 +- smsapiTests/MmsTest.cs | 82 ++-- smsapiTests/Properties/AssemblyInfo.cs | 13 +- smsapiTests/SenderTest.cs | 39 +- smsapiTests/SmsTest.cs | 87 ++-- smsapiTests/TestBase.cs | 14 +- smsapiTests/UserTest.cs | 50 +-- smsapiTests/VmsTest.cs | 86 ++-- 117 files changed, 3919 insertions(+), 3388 deletions(-) diff --git a/smsapi/ActionException.cs b/smsapi/ActionException.cs index 07996ea..3cbf849 100644 --- a/smsapi/ActionException.cs +++ b/smsapi/ActionException.cs @@ -1,11 +1,9 @@ - -namespace SMSApi.Api +namespace SMSApi.Api { - public class ActionException : SMSApi.Api.SmsapiException - { - public ActionException(string message, string code) - : base(message, code) - { - } - } + public class ActionException : SmsapiException + { + public ActionException(string message, string code) + : base(message, code) + { } + } } diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 19c9e4d..d277f18 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -1,119 +1,122 @@ -using System.IO; -using System.Runtime.Serialization.Json; -using System.Collections.Specialized; -using System.Collections.Generic; -using System; - -namespace SMSApi.Api.Action -{ - public abstract class Base - { - protected IClient client; - protected Proxy proxy; - - abstract protected string Uri(); - - protected virtual RequestMethod Method { get { return RequestMethod.POST; } } - - public void Client(IClient client) - { - this.client = client; - } - - public void Proxy(Proxy proxy) - { - this.proxy = proxy; - } - - protected TT ResponseToObject(Stream data) - { - TT result; - if (data.Length > 0) - { - data.Position = 0; - var serializer = new DataContractJsonSerializer(typeof(TT)); - result = (TT)serializer.ReadObject(data); - data.Position = 0; - } - else - { - result = Activator.CreateInstance(); - } - return result; - } - - abstract protected NameValueCollection Values(); - protected virtual void Validate() { } - - protected virtual Dictionary Files() - { - return null; - } - - protected abstract TResult ConvertResponse(T response); - -/* protected virtual TResult ConvertResponse(T response) - { - return (TResult)Convert.ChangeType(response, typeof(TResult)); - }*/ - - public TResult Execute() - { - Validate(); - - Stream data = proxy.Execute(Uri(), Values(), Files(), Method); - - TResult result = default(TResult); - - HandleError(data); - - try - { - T response = ResponseToObject(data); - result = ConvertResponse(response); - } - catch (System.Runtime.Serialization.SerializationException e) - { - //Problem z prasowaniem json'a - throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); - } - - data.Close(); - - return result; - } - - protected void HandleError(Stream data) { - - data.Position = 0; - - try - { - var error = ResponseToObject(data); - - if (error.isError()) +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Json; +using SMSApi.Api.Response; + +namespace SMSApi.Api.Action +{ + public abstract class Base + { + protected IClient client; + protected Proxy proxy; + + protected virtual RequestMethod Method => RequestMethod.POST; + + public void Client(IClient client) + { + this.client = client; + } + + /* protected virtual TResult ConvertResponse(T response) { - if (isHostError(error.Code)) - { - throw new HostException(error.Message, error.Code); - } - if (isClientError(error.Code)) - { - throw new ClientException(error.Message, error.Code); - } - else - { - throw new ActionException(error.Message, error.Code); - } - } - } - catch (System.Runtime.Serialization.SerializationException e) - { - } - - data.Position = 0; - } - + return (TResult)Convert.ChangeType(response, typeof(TResult)); + }*/ + + public TResult Execute() + { + Validate(); + + Stream data = proxy.Execute(Uri(), Values(), Files(), Method); + + var result = default(TResult); + + HandleError(data); + + try + { + var response = ResponseToObject(data); + result = ConvertResponse(response); + } + catch (SerializationException e) + { + //Problem z prasowaniem json'a + throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); + } + + data.Close(); + + return result; + } + + public void Proxy(Proxy proxy) + { + this.proxy = proxy; + } + + protected abstract TResult ConvertResponse(T response); + + protected virtual Dictionary Files() + { + return null; + } + + protected void HandleError(Stream data) + { + data.Position = 0; + + try + { + var error = ResponseToObject(data); + + if (error.isError()) + { + if (isHostError(error.Code)) + { + throw new HostException(error.Message, error.Code); + } + + if (isClientError(error.Code)) + { + throw new ClientException(error.Message, error.Code); + } + + throw new ActionException(error.Message, error.Code); + } + } + catch (SerializationException e) + { } + + data.Position = 0; + } + + protected TT ResponseToObject(Stream data) + { + TT result; + if (data.Length > 0) + { + data.Position = 0; + var serializer = new DataContractJsonSerializer(typeof(TT)); + result = (TT)serializer.ReadObject(data); + data.Position = 0; + } + else + { + result = Activator.CreateInstance(); + } + + return result; + } + + protected abstract string Uri(); + + protected virtual void Validate() + { } + + protected abstract NameValueCollection Values(); + /** * 101 Niepoprawne lub brak danych autoryzacji. * 102 Nieprawidłowy login lub hasło @@ -122,34 +125,76 @@ protected void HandleError(Stream data) { * 110 Usługa nie jest dostępna na danym koncie * 1000 Akcja dostępna tylko dla użytkownika głównego * 1001 Nieprawidłowa akcja - */ - private bool isClientError(string code) - { - if (code == "101") return true; - if (code == "102") return true; - if (code == "103") return true; - if (code == "105") return true; - if (code == "110") return true; - if (code == "1000") return true; - if (code == "1001") return true; - - return false; - } - + */ + private bool isClientError(string code) + { + if (code == "101") + { + return true; + } + + if (code == "102") + { + return true; + } + + if (code == "103") + { + return true; + } + + if (code == "105") + { + return true; + } + + if (code == "110") + { + return true; + } + + if (code == "1000") + { + return true; + } + + if (code == "1001") + { + return true; + } + + return false; + } + /** * 8 Błąd w odwołaniu * 666 Wewnętrzny błąd systemu * 999 Wewnętrzny błąd systemu * 201 Wewnętrzny błąd systemu - */ - private bool isHostError(string code) - { - if (code == "8") return true; - if (code == "201") return true; - if (code == "666") return true; - if (code == "999") return true; - - return false; - } - } + */ + private bool isHostError(string code) + { + if (code == "8") + { + return true; + } + + if (code == "201") + { + return true; + } + + if (code == "666") + { + return true; + } + + if (code == "999") + { + return true; + } + + return false; + } + } } diff --git a/smsapi/Api/Action/BaseArray.cs b/smsapi/Api/Action/BaseArray.cs index a87b732..4237def 100644 --- a/smsapi/Api/Action/BaseArray.cs +++ b/smsapi/Api/Action/BaseArray.cs @@ -1,12 +1,13 @@ using System.Collections.Generic; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public abstract class BaseArray : Base, SMSApi.Api.Response.Array> + public abstract class BaseArray : Base, Array> { - protected override SMSApi.Api.Response.Array ConvertResponse(List response) + protected override Array ConvertResponse(List response) { - return new SMSApi.Api.Response.Array(response); + return new Array(response); } } } diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index f746823..aa72c1a 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -1,25 +1,21 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class BindContactToGroup : Rest - { - public BindContactToGroup(string contactId, string groupId) - : base() - { - ContactId = contactId; - GroupId = groupId; - } + public class BindContactToGroup : Rest + { + public BindContactToGroup(string contactId, string groupId) + { + ContactId = contactId; + GroupId = groupId; + } - protected override string Resource { get { return "contacts/" + contactId + "/groups/" + groupId; } } + public string ContactId { get; } - protected override RequestMethod Method { get { return RequestMethod.PUT; } } + public string GroupId { get; } - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } + protected override RequestMethod Method => RequestMethod.PUT; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + } } diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index 3adfa7f..da54ba7 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -1,98 +1,139 @@ using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class CreateContact : Rest - { - public CreateContact() - : base() - { - } - - protected override string Resource { get { return "contacts"; } } - - protected override RequestMethod Method { get { return RequestMethod.POST; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (PhoneNumber != null) parameters.Add("phone_number", PhoneNumber); - if (Email != null) parameters.Add("email", Email); - if (FirstName != null) parameters.Add("first_name", FirstName); - if (LastName != null) parameters.Add("last_name", LastName); - if (Gender != null) parameters.Add("gender", Gender); - if (BirthdayDate != null) parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - if (Description != null) parameters.Add("description", Description); - if (City != null) parameters.Add("city", City); - if (Source != null) parameters.Add("source", Source); - return parameters; - } - } - - public string PhoneNumber; - public CreateContact SetPhoneNumber(string phoneNumber) - { - PhoneNumber = phoneNumber; - return this; - } - - public string Email; - public CreateContact SetEmail(string email) - { - Email = email; - return this; - } - - public string FirstName; - public CreateContact SetFirstName(string firstName) - { - FirstName = firstName; - return this; - } - - public string LastName; - public CreateContact SetLastName(string lastName) - { - LastName = lastName; - return this; - } - - public string Gender; - public CreateContact SetGender(string gender) - { - Gender = gender; - return this; - } - - public DateTime? BirthdayDate; - public CreateContact SetBirthdayDate(DateTime? birthdayDate) - { - BirthdayDate = birthdayDate; - return this; - } - - public string Description; - public CreateContact SetDescription(string description) - { - Description = description; - return this; - } - - public string City; - public CreateContact SetCity(string city) - { - City = city; - return this; - } - - public string Source; - public CreateContact SetSource(string source) - { - Source = source; - return this; - } - } + public class CreateContact : Rest + { + public DateTime? BirthdayDate; + + public string City; + + public string Description; + + public string Email; + + public string FirstName; + + public string Gender; + + public string LastName; + + public string PhoneNumber; + + public string Source; + + protected override RequestMethod Method => RequestMethod.POST; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (PhoneNumber != null) + { + parameters.Add("phone_number", PhoneNumber); + } + + if (Email != null) + { + parameters.Add("email", Email); + } + + if (FirstName != null) + { + parameters.Add("first_name", FirstName); + } + + if (LastName != null) + { + parameters.Add("last_name", LastName); + } + + if (Gender != null) + { + parameters.Add("gender", Gender); + } + + if (BirthdayDate != null) + { + parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); + } + + if (Description != null) + { + parameters.Add("description", Description); + } + + if (City != null) + { + parameters.Add("city", City); + } + + if (Source != null) + { + parameters.Add("source", Source); + } + + return parameters; + } + } + + protected override string Resource => "contacts"; + + public CreateContact SetBirthdayDate(DateTime? birthdayDate) + { + BirthdayDate = birthdayDate; + return this; + } + + public CreateContact SetCity(string city) + { + City = city; + return this; + } + + public CreateContact SetDescription(string description) + { + Description = description; + return this; + } + + public CreateContact SetEmail(string email) + { + Email = email; + return this; + } + + public CreateContact SetFirstName(string firstName) + { + FirstName = firstName; + return this; + } + + public CreateContact SetGender(string gender) + { + Gender = gender; + return this; + } + + public CreateContact SetLastName(string lastName) + { + LastName = lastName; + return this; + } + + public CreateContact SetPhoneNumber(string phoneNumber) + { + PhoneNumber = phoneNumber; + return this; + } + + public CreateContact SetSource(string source) + { + Source = source; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/CreateField.cs b/smsapi/Api/Action/Contacts/CreateField.cs index 9c78d29..b76529d 100644 --- a/smsapi/Api/Action/Contacts/CreateField.cs +++ b/smsapi/Api/Action/Contacts/CreateField.cs @@ -1,42 +1,47 @@ -using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class CreateField : Rest - { - public CreateField() - : base() - { - } - - protected override string Resource { get { return "contacts/fields"; } } - - protected override RequestMethod Method { get { return RequestMethod.POST; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) parameters.Add("name", Name); - if (Type != null) parameters.Add("type", Type); - return parameters; - } - } - - public string Name; - public CreateField SetName(string name) - { - Name = name; - return this; - } - - public string Type; - public CreateField SetType(string type) - { - Type = type; - return this; - } - } + public class CreateField : Rest + { + public string Name; + + public string Type; + + protected override RequestMethod Method => RequestMethod.POST; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Name != null) + { + parameters.Add("name", Name); + } + + if (Type != null) + { + parameters.Add("type", Type); + } + + return parameters; + } + } + + protected override string Resource => "contacts/fields"; + + public CreateField SetName(string name) + { + Name = name; + return this; + } + + public CreateField SetType(string type) + { + Type = type; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/CreateGroup.cs b/smsapi/Api/Action/Contacts/CreateGroup.cs index 709ba8b..6061873 100644 --- a/smsapi/Api/Action/Contacts/CreateGroup.cs +++ b/smsapi/Api/Action/Contacts/CreateGroup.cs @@ -1,50 +1,60 @@ -using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class CreateGroup : Rest - { - public CreateGroup() - : base() - { - } - - protected override string Resource { get { return "contacts/groups"; } } - - protected override RequestMethod Method { get { return RequestMethod.POST; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) parameters.Add("name", Name); - if (Description != null) parameters.Add("desciption", Description); - if (Idx != null) parameters.Add("idx", Idx); - return parameters; - } - } - - public string Name; - public CreateGroup SetName(string name) - { - Name = name; - return this; - } - - public string Description; - public CreateGroup SetDescription(string description) - { - Description = description; - return this; - } - - public string Idx; - public CreateGroup SetIdx(string idx) - { - Idx = idx; - return this; - } - } + public class CreateGroup : Rest + { + public string Description; + + public string Idx; + + public string Name; + + protected override RequestMethod Method => RequestMethod.POST; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Name != null) + { + parameters.Add("name", Name); + } + + if (Description != null) + { + parameters.Add("desciption", Description); + } + + if (Idx != null) + { + parameters.Add("idx", Idx); + } + + return parameters; + } + } + + protected override string Resource => "contacts/groups"; + + public CreateGroup SetDescription(string description) + { + Description = description; + return this; + } + + public CreateGroup SetIdx(string idx) + { + Idx = idx; + return this; + } + + public CreateGroup SetName(string name) + { + Name = name; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs index cc6886b..6d9a735 100644 --- a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs @@ -1,62 +1,81 @@ using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class CreateGroupPermission : Rest - { - public CreateGroupPermission(string groupId) - : base() - { - GroupId = groupId; - } - - protected override string Resource { get { return "contacts/groups/" + GroupId + "/permissions"; } } - - protected override RequestMethod Method { get { return RequestMethod.POST; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Username != null) parameters.Add("username", Username); - if (Read != null) parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); - if (Write != null) parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); - if (Send != null) parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); - return parameters; - } - } - - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - - public string Username; - public CreateGroupPermission SetUsername(string username) - { - Username = username; - return this; - } - - public bool? Read; - public CreateGroupPermission SetRead(bool? read) - { - Read = read; - return this; - } - - public bool? Write; - public CreateGroupPermission SetWrite(bool? write) - { - Write = write; - return this; - } - - public bool? Send; - public CreateGroupPermission SetSend(bool? send) - { - Send = send; - return this; - } - } + public class CreateGroupPermission : Rest + { + public bool? Read; + + public bool? Send; + + public string Username; + + public bool? Write; + + public CreateGroupPermission(string groupId) + { + GroupId = groupId; + } + + public string GroupId { get; } + + protected override RequestMethod Method => RequestMethod.POST; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Username != null) + { + parameters.Add("username", Username); + } + + if (Read != null) + { + parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); + } + + if (Write != null) + { + parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); + } + + if (Send != null) + { + parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); + } + + return parameters; + } + } + + protected override string Resource => "contacts/groups/" + GroupId + "/permissions"; + + public CreateGroupPermission SetRead(bool? read) + { + Read = read; + return this; + } + + public CreateGroupPermission SetSend(bool? send) + { + Send = send; + return this; + } + + public CreateGroupPermission SetUsername(string username) + { + Username = username; + return this; + } + + public CreateGroupPermission SetWrite(bool? write) + { + Write = write; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index 200fd63..a9fa3b0 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class DeleteContact : Rest - { - public DeleteContact(string contactId) - : base() - { - ContactId = contactId; - } + public class DeleteContact : Rest + { + public DeleteContact(string contactId) + { + ContactId = contactId; + } - protected override string Resource { get { return "contacts/" + ContactId; } } + public string ContactId { get; } - protected override RequestMethod Method { get { return RequestMethod.DELETE; } } + protected override RequestMethod Method => RequestMethod.DELETE; - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } - } + protected override string Resource => "contacts/" + ContactId; + } } diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index d04a5f8..8301724 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class DeleteField : Rest - { - public DeleteField(string fieldId) - : base() - { - FieldId = fieldId; - } + public class DeleteField : Rest + { + public DeleteField(string fieldId) + { + FieldId = fieldId; + } - protected override string Resource { get { return "contacts/fields/" + FieldId; } } + public string FieldId { get; } - protected override RequestMethod Method { get { return RequestMethod.DELETE; } } + protected override RequestMethod Method => RequestMethod.DELETE; - private string fieldId; - public string FieldId { get { return fieldId; } private set { fieldId = value; } } - } + protected override string Resource => "contacts/fields/" + FieldId; + } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index b54024c..e3b4301 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class DeleteGroup : Rest - { - public DeleteGroup(string groupId) - : base() - { - GroupId = groupId; - } + public class DeleteGroup : Rest + { + public DeleteGroup(string groupId) + { + GroupId = groupId; + } - protected override string Resource { get { return "contacts/groups/" + GroupId; } } + public string GroupId { get; } - protected override RequestMethod Method { get { return RequestMethod.DELETE; } } + protected override RequestMethod Method => RequestMethod.DELETE; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/groups/" + GroupId; + } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs index f7a3f0c..1ac7668 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs @@ -1,25 +1,21 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class DeleteGroupPermission : Rest - { - public DeleteGroupPermission(string groupId, string username) - : base() - { - GroupId = groupId; - Username = username; - } + public class DeleteGroupPermission : Rest + { + public DeleteGroupPermission(string groupId, string username) + { + GroupId = groupId; + Username = username; + } - protected override string Resource { get { return "contacts/groups/" + GroupId + "/permissions/" + Username; } } + public string GroupId { get; } - protected override RequestMethod Method { get { return RequestMethod.DELETE; } } + public string Username { get; } - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } + protected override RequestMethod Method => RequestMethod.DELETE; - private string username; - public string Username { get { return username; } private set { username = value; } } - } + protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; + } } diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index 4635421..bf470f4 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -1,102 +1,146 @@ using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class EditContact : Rest - { - public EditContact(string contactId) - : base() - { - ContactId = contactId; - } - - protected override string Resource { get { return "contacts/" + ContactId; } } - - protected override RequestMethod Method { get { return RequestMethod.PUT; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (PhoneNumber != null) parameters.Add("phone_number", PhoneNumber); - if (Email != null) parameters.Add("email", Email); - if (FirstName != null) parameters.Add("first_name", FirstName); - if (LastName != null) parameters.Add("last_name", LastName); - if (Gender != null) parameters.Add("gender", Gender); - if (BirthdayDate != null) parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - if (Description != null) parameters.Add("description", Description); - if (City != null) parameters.Add("city", City); - if (Source != null) parameters.Add("source", Source); - return parameters; - } - } - - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } - - public string PhoneNumber; - public EditContact SetPhoneNumber(string phoneNumber) - { - PhoneNumber = phoneNumber; - return this; - } - - public string Email; - public EditContact SetEmail(string email) - { - Email = email; - return this; - } - - public string FirstName; - public EditContact SetFirstName(string firstName) - { - FirstName = firstName; - return this; - } - - public string LastName; - public EditContact SetLastName(string lastName) - { - LastName = lastName; - return this; - } - - public string Gender; - public EditContact SetGender(string gender) - { - Gender = gender; - return this; - } - - public DateTime? BirthdayDate; - public EditContact SetBirthdayDate(DateTime? birthdayDate) - { - BirthdayDate = birthdayDate; - return this; - } - - public string Description; - public EditContact SetDescription(string description) - { - Description = description; - return this; - } - - public string City; - public EditContact SetCity(string city) - { - City = city; - return this; - } - - public string Source; - public EditContact SetSource(string source) - { - Source = source; - return this; - } - } + public class EditContact : Rest + { + public DateTime? BirthdayDate; + + public string City; + + public string Description; + + public string Email; + + public string FirstName; + + public string Gender; + + public string LastName; + + public string PhoneNumber; + + public string Source; + + public EditContact(string contactId) + { + ContactId = contactId; + } + + public string ContactId { get; } + + protected override RequestMethod Method => RequestMethod.PUT; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (PhoneNumber != null) + { + parameters.Add("phone_number", PhoneNumber); + } + + if (Email != null) + { + parameters.Add("email", Email); + } + + if (FirstName != null) + { + parameters.Add("first_name", FirstName); + } + + if (LastName != null) + { + parameters.Add("last_name", LastName); + } + + if (Gender != null) + { + parameters.Add("gender", Gender); + } + + if (BirthdayDate != null) + { + parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); + } + + if (Description != null) + { + parameters.Add("description", Description); + } + + if (City != null) + { + parameters.Add("city", City); + } + + if (Source != null) + { + parameters.Add("source", Source); + } + + return parameters; + } + } + + protected override string Resource => "contacts/" + ContactId; + + public EditContact SetBirthdayDate(DateTime? birthdayDate) + { + BirthdayDate = birthdayDate; + return this; + } + + public EditContact SetCity(string city) + { + City = city; + return this; + } + + public EditContact SetDescription(string description) + { + Description = description; + return this; + } + + public EditContact SetEmail(string email) + { + Email = email; + return this; + } + + public EditContact SetFirstName(string firstName) + { + FirstName = firstName; + return this; + } + + public EditContact SetGender(string gender) + { + Gender = gender; + return this; + } + + public EditContact SetLastName(string lastName) + { + LastName = lastName; + return this; + } + + public EditContact SetPhoneNumber(string phoneNumber) + { + PhoneNumber = phoneNumber; + return this; + } + + public EditContact SetSource(string source) + { + Source = source; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/EditField.cs b/smsapi/Api/Action/Contacts/EditField.cs index 428a0ce..c748043 100644 --- a/smsapi/Api/Action/Contacts/EditField.cs +++ b/smsapi/Api/Action/Contacts/EditField.cs @@ -1,38 +1,41 @@ -using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class EditField : Rest - { - public EditField(string fieldId) - : base() - { - FieldId = fieldId; - } - - protected override string Resource { get { return "contacts/fields/" + FieldId; } } - - protected override RequestMethod Method { get { return RequestMethod.PUT; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) parameters.Add("name", Name); - return parameters; - } - } - - private string fieldId; - public string FieldId { get { return fieldId; } private set { fieldId = value; } } - - public string Name; - public EditField SetName(string name) - { - Name = name; - return this; - } - } + public class EditField : Rest + { + public string Name; + + public EditField(string fieldId) + { + FieldId = fieldId; + } + + public string FieldId { get; } + + protected override RequestMethod Method => RequestMethod.PUT; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Name != null) + { + parameters.Add("name", Name); + } + + return parameters; + } + } + + protected override string Resource => "contacts/fields/" + FieldId; + + public EditField SetName(string name) + { + Name = name; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/EditGroup.cs b/smsapi/Api/Action/Contacts/EditGroup.cs index 85bf232..822f68d 100644 --- a/smsapi/Api/Action/Contacts/EditGroup.cs +++ b/smsapi/Api/Action/Contacts/EditGroup.cs @@ -1,54 +1,67 @@ -using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class EditGroup : Rest - { - public EditGroup(string groupId) - : base() - { - GroupId = groupId; - } - - protected override string Resource { get { return "contacts/groups/" + GroupId; } } - - protected override RequestMethod Method { get { return RequestMethod.PUT; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) parameters.Add("name", Name); - if (Description != null) parameters.Add("desciption", Description); - if (Idx != null) parameters.Add("idx", Idx); - return parameters; - } - } - - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - - public string Name; - public EditGroup SetName(string name) - { - Name = name; - return this; - } - - public string Description; - public EditGroup SetDescription(string description) - { - Description = description; - return this; - } - - public string Idx; - public EditGroup SetIdx(string idx) - { - Idx = idx; - return this; - } - } + public class EditGroup : Rest + { + public string Description; + + public string Idx; + + public string Name; + + public EditGroup(string groupId) + { + GroupId = groupId; + } + + public string GroupId { get; } + + protected override RequestMethod Method => RequestMethod.PUT; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Name != null) + { + parameters.Add("name", Name); + } + + if (Description != null) + { + parameters.Add("desciption", Description); + } + + if (Idx != null) + { + parameters.Add("idx", Idx); + } + + return parameters; + } + } + + protected override string Resource => "contacts/groups/" + GroupId; + + public EditGroup SetDescription(string description) + { + Description = description; + return this; + } + + public EditGroup SetIdx(string idx) + { + Idx = idx; + return this; + } + + public EditGroup SetName(string name) + { + Name = name; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/EditGroupPermission.cs b/smsapi/Api/Action/Contacts/EditGroupPermission.cs index 55f052f..bada62d 100644 --- a/smsapi/Api/Action/Contacts/EditGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/EditGroupPermission.cs @@ -1,58 +1,71 @@ using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class EditGroupPermission : Rest - { - public EditGroupPermission(string groupId, string username) - : base() - { - GroupId = groupId; - Username = username; - } - - protected override string Resource { get { return "contacts/groups/" + GroupId + "/permissions/" + Username; } } - - protected override RequestMethod Method { get { return RequestMethod.PUT; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Read != null) parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); - if (Write != null) parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); - if (Send != null) parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); - return parameters; - } - } - - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - - private string username; - public string Username { get { return username; } private set { username = value; } } - - public bool? Read; - public EditGroupPermission SetRead(bool? read) - { - Read = read; - return this; - } - - public bool? Write; - public EditGroupPermission SetWrite(bool? write) - { - Write = write; - return this; - } - - public bool? Send; - public EditGroupPermission SetSend(bool? send) - { - Send = send; - return this; - } - } + public class EditGroupPermission : Rest + { + public bool? Read; + + public bool? Send; + + public bool? Write; + + public EditGroupPermission(string groupId, string username) + { + GroupId = groupId; + Username = username; + } + + public string GroupId { get; private set; } + + public string Username { get; private set; } + + protected override RequestMethod Method => RequestMethod.PUT; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Read != null) + { + parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); + } + + if (Write != null) + { + parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); + } + + if (Send != null) + { + parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); + } + + return parameters; + } + } + + protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; + + public EditGroupPermission SetRead(bool? read) + { + Read = read; + return this; + } + + public EditGroupPermission SetSend(bool? send) + { + Send = send; + return this; + } + + public EditGroupPermission SetWrite(bool? write) + { + Write = write; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/GetContact.cs b/smsapi/Api/Action/Contacts/GetContact.cs index 4bad4ab..7014083 100644 --- a/smsapi/Api/Action/Contacts/GetContact.cs +++ b/smsapi/Api/Action/Contacts/GetContact.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class GetContact : Rest - { - public GetContact(string contactId) - : base() - { - ContactId = contactId; - } + public class GetContact : Rest + { + public GetContact(string contactId) + { + ContactId = contactId; + } - protected override string Resource { get { return "contacts/" + ContactId; } } + public string ContactId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + protected override RequestMethod Method => RequestMethod.GET; - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } - } + protected override string Resource => "contacts/" + ContactId; + } } diff --git a/smsapi/Api/Action/Contacts/GetContactGroup.cs b/smsapi/Api/Action/Contacts/GetContactGroup.cs index 8bf4eb4..f030469 100644 --- a/smsapi/Api/Action/Contacts/GetContactGroup.cs +++ b/smsapi/Api/Action/Contacts/GetContactGroup.cs @@ -1,25 +1,21 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class GetContactGroup : Rest - { - public GetContactGroup(string contactId, string groupId) - : base() - { - ContactId = contactId; - GroupId = groupId; - } + public class GetContactGroup : Rest + { + public GetContactGroup(string contactId, string groupId) + { + ContactId = contactId; + GroupId = groupId; + } - protected override string Resource { get { return "contacts/" + contactId + "/groups/" + groupId; } } + public string ContactId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + public string GroupId { get; private set; } - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } + protected override RequestMethod Method => RequestMethod.GET; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + } } diff --git a/smsapi/Api/Action/Contacts/GetGroup.cs b/smsapi/Api/Action/Contacts/GetGroup.cs index 24f7d4f..bf6e2e2 100644 --- a/smsapi/Api/Action/Contacts/GetGroup.cs +++ b/smsapi/Api/Action/Contacts/GetGroup.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class GetGroup : Rest - { - public GetGroup(string groupId) - : base() - { - GroupId = groupId; - } + public class GetGroup : Rest + { + public GetGroup(string groupId) + { + GroupId = groupId; + } - protected override string Resource { get { return "contacts/groups/" + GroupId; } } + public string GroupId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + protected override RequestMethod Method => RequestMethod.GET; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/groups/" + GroupId; + } } diff --git a/smsapi/Api/Action/Contacts/GetGroupPermission.cs b/smsapi/Api/Action/Contacts/GetGroupPermission.cs index bf1304a..3068f0d 100644 --- a/smsapi/Api/Action/Contacts/GetGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/GetGroupPermission.cs @@ -1,25 +1,21 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class GetGroupPermission : Rest - { - public GetGroupPermission(string groupId, string username) - : base() - { - GroupId = groupId; - Username = username; - } + public class GetGroupPermission : Rest + { + public GetGroupPermission(string groupId, string username) + { + GroupId = groupId; + Username = username; + } - protected override string Resource { get { return "contacts/groups/" + GroupId + "/permissions/" + Username; } } + public string GroupId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + public string Username { get; private set; } - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } + protected override RequestMethod Method => RequestMethod.GET; - private string username; - public string Username { get { return username; } private set { username = value; } } - } + protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; + } } diff --git a/smsapi/Api/Action/Contacts/ListContactGroups.cs b/smsapi/Api/Action/Contacts/ListContactGroups.cs index 3dddeaa..811f5b0 100644 --- a/smsapi/Api/Action/Contacts/ListContactGroups.cs +++ b/smsapi/Api/Action/Contacts/ListContactGroups.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListContactGroups : Rest - { - public ListContactGroups(string contactId) - : base() - { - ContactId = contactId; - } + public class ListContactGroups : Rest + { + public ListContactGroups(string contactId) + { + ContactId = contactId; + } - protected override string Resource { get { return "contacts/" + ContactId + "/groups"; } } + public string ContactId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + protected override RequestMethod Method => RequestMethod.GET; - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } - } + protected override string Resource => "contacts/" + ContactId + "/groups"; + } } diff --git a/smsapi/Api/Action/Contacts/ListContacts.cs b/smsapi/Api/Action/Contacts/ListContacts.cs index a729b88..f4d9876 100644 --- a/smsapi/Api/Action/Contacts/ListContacts.cs +++ b/smsapi/Api/Action/Contacts/ListContacts.cs @@ -1,106 +1,152 @@ using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListContacts : Rest - { - public ListContacts () - : base() - { - } - - protected override string Resource { get { return "contacts"; } } - - protected override RequestMethod Method { get { return RequestMethod.GET; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Search != null) parameters.Add("q", Search); - if (Offset != null) parameters.Add("offset", Offset.Value.ToString()); - if (Limit != null) parameters.Add("limit", Limit.Value.ToString()); - if (PhoneNumber != null) parameters.Add("phone_number", PhoneNumber); - if (Email != null) parameters.Add("email", Email); - if (FirstName != null) parameters.Add("first_name", FirstName); - if (LastName != null) parameters.Add("last_name", LastName); - if (GroupId != null) parameters.Add("group_id", GroupId.Value.ToString()); - if (Gender != null) parameters.Add("gender", Gender); - if (BirthdayDate != null) parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - return parameters; - } - } - - public string Search; - public ListContacts SetSearch(string search) - { - Search = search; - return this; - } - - public int? Offset; - public ListContacts SetOffset(int? offset) - { - Offset = offset; - return this; - } - - public int? Limit; - public ListContacts SetLimit(int? limit) - { - Limit = limit; - return this; - } - - public string PhoneNumber; - public ListContacts SetPhoneNumber(string phoneNumber) - { - PhoneNumber = phoneNumber; - return this; - } - - public string Email; - public ListContacts SetEmail(string email) - { - Email = email; - return this; - } - - public string FirstName; - public ListContacts SetFirstName(string firstName) - { - FirstName = firstName; - return this; - } - - public string LastName; - public ListContacts SetLastName(string lastName) - { - LastName = lastName; - return this; - } - - public int? GroupId; - public ListContacts SetGroupId(int? groupId) - { - GroupId = groupId; - return this; - } - - public string Gender; - public ListContacts SetGender(string gender) - { - Gender = gender; - return this; - } - - public DateTime? BirthdayDate; - public ListContacts SetBirthdayDate(DateTime? birthdayDate) - { - BirthdayDate = birthdayDate; - return this; - } - } + public class ListContacts : Rest + { + public DateTime? BirthdayDate; + + public string Email; + + public string FirstName; + + public string Gender; + + public int? GroupId; + + public string LastName; + + public int? Limit; + + public int? Offset; + + public string PhoneNumber; + + public string Search; + + protected override RequestMethod Method => RequestMethod.GET; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + if (Search != null) + { + parameters.Add("q", Search); + } + + if (Offset != null) + { + parameters.Add("offset", Offset.Value.ToString()); + } + + if (Limit != null) + { + parameters.Add("limit", Limit.Value.ToString()); + } + + if (PhoneNumber != null) + { + parameters.Add("phone_number", PhoneNumber); + } + + if (Email != null) + { + parameters.Add("email", Email); + } + + if (FirstName != null) + { + parameters.Add("first_name", FirstName); + } + + if (LastName != null) + { + parameters.Add("last_name", LastName); + } + + if (GroupId != null) + { + parameters.Add("group_id", GroupId.Value.ToString()); + } + + if (Gender != null) + { + parameters.Add("gender", Gender); + } + + if (BirthdayDate != null) + { + parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); + } + + return parameters; + } + } + + protected override string Resource => "contacts"; + + public ListContacts SetBirthdayDate(DateTime? birthdayDate) + { + BirthdayDate = birthdayDate; + return this; + } + + public ListContacts SetEmail(string email) + { + Email = email; + return this; + } + + public ListContacts SetFirstName(string firstName) + { + FirstName = firstName; + return this; + } + + public ListContacts SetGender(string gender) + { + Gender = gender; + return this; + } + + public ListContacts SetGroupId(int? groupId) + { + GroupId = groupId; + return this; + } + + public ListContacts SetLastName(string lastName) + { + LastName = lastName; + return this; + } + + public ListContacts SetLimit(int? limit) + { + Limit = limit; + return this; + } + + public ListContacts SetOffset(int? offset) + { + Offset = offset; + return this; + } + + public ListContacts SetPhoneNumber(string phoneNumber) + { + PhoneNumber = phoneNumber; + return this; + } + + public ListContacts SetSearch(string search) + { + Search = search; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/ListFieldOptions.cs b/smsapi/Api/Action/Contacts/ListFieldOptions.cs index b637819..42a2d9d 100644 --- a/smsapi/Api/Action/Contacts/ListFieldOptions.cs +++ b/smsapi/Api/Action/Contacts/ListFieldOptions.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListFieldOptions : Rest - { - public ListFieldOptions(string fieldId) - : base() - { - FieldId = fieldId; - } + public class ListFieldOptions : Rest + { + public ListFieldOptions(string fieldId) + { + FieldId = fieldId; + } - protected override string Resource { get { return "contacts/fields/" + FieldId + "/options"; } } + public string FieldId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + protected override RequestMethod Method => RequestMethod.GET; - private string fieldId; - public string FieldId { get { return fieldId; } private set { fieldId = value; } } - } + protected override string Resource => "contacts/fields/" + FieldId + "/options"; + } } diff --git a/smsapi/Api/Action/Contacts/ListFields.cs b/smsapi/Api/Action/Contacts/ListFields.cs index 61f3b67..df254b2 100644 --- a/smsapi/Api/Action/Contacts/ListFields.cs +++ b/smsapi/Api/Action/Contacts/ListFields.cs @@ -1,17 +1,11 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListFields : Rest - { - public ListFields () - : base() - { - } + public class ListFields : Rest + { + protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource { get { return "contacts/fields"; } } - - protected override RequestMethod Method { get { return RequestMethod.GET; } } - } + protected override string Resource => "contacts/fields"; + } } diff --git a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs index 1857022..9fc814f 100644 --- a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs +++ b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListGroupPermissions : Rest - { - public ListGroupPermissions(string groupId) - : base() - { - GroupId = groupId; - } + public class ListGroupPermissions : Rest + { + public ListGroupPermissions(string groupId) + { + GroupId = groupId; + } - protected override string Resource { get { return "contacts/groups/" + GroupId + "/permissions"; } } + public string GroupId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.GET; } } + protected override RequestMethod Method => RequestMethod.GET; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/groups/" + GroupId + "/permissions"; + } } diff --git a/smsapi/Api/Action/Contacts/ListGroups.cs b/smsapi/Api/Action/Contacts/ListGroups.cs index c1c8544..b6369f4 100644 --- a/smsapi/Api/Action/Contacts/ListGroups.cs +++ b/smsapi/Api/Action/Contacts/ListGroups.cs @@ -1,43 +1,48 @@ -using System; using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class ListGroups : Rest - { - public ListGroups () - : base() - { - } - - protected override string Resource { get { return "contacts/groups"; } } - - protected override RequestMethod Method { get { return RequestMethod.GET; } } - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - parameters.Add("with", "contacts_count"); - if (Id != null) parameters.Add("id", Id); - if (Name != null) parameters.Add("name", Name); - return parameters; - } - } - - public string Id; - public ListGroups SetId(string id) - { - Id = id; - return this; - } - - public string Name; - public ListGroups SetName(string name) - { - Name = name; - return this; - } - } + public class ListGroups : Rest + { + public string Id; + + public string Name; + + protected override RequestMethod Method => RequestMethod.GET; + + protected override NameValueCollection Parameters + { + get + { + NameValueCollection parameters = base.Parameters; + parameters.Add("with", "contacts_count"); + if (Id != null) + { + parameters.Add("id", Id); + } + + if (Name != null) + { + parameters.Add("name", Name); + } + + return parameters; + } + } + + protected override string Resource => "contacts/groups"; + + public ListGroups SetId(string id) + { + Id = id; + return this; + } + + public ListGroups SetName(string name) + { + Name = name; + return this; + } + } } diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index a6da74d..42eafdb 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -1,25 +1,21 @@ -using System; -using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class UnbindContactFromGroup : Rest - { - public UnbindContactFromGroup(string contactId, string groupId) - : base() - { - ContactId = contactId; - GroupId = groupId; - } + public class UnbindContactFromGroup : Rest + { + public UnbindContactFromGroup(string contactId, string groupId) + { + ContactId = contactId; + GroupId = groupId; + } - protected override string Resource { get { return "contacts/" + contactId + "/groups/" + groupId; } } + public string ContactId { get; private set; } - protected override RequestMethod Method { get { return RequestMethod.DELETE; } } + public string GroupId { get; private set; } - private string contactId; - public string ContactId { get { return contactId; } private set { contactId = value; } } + protected override RequestMethod Method => RequestMethod.DELETE; - private string groupId; - public string GroupId { get { return groupId; } private set { groupId = value; } } - } + protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + } } diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index 032cf79..e830668 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -1,37 +1,39 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class HLRCheckNumber : BaseSimple + public class HLRCheckNumber : BaseSimple { - public HLRCheckNumber() : base() { } - - protected override string Uri() { return "hlrsync.do"; } - protected string[] numbers; public HLRCheckNumber SetNumber(string number) { - this.numbers = new string[] { number }; + numbers = new[] { number }; return this; } -/* - public HLRCheckNumber SetNumber(string[] numbers) + protected override string Uri() { - this.numbers = numbers; - return this; + return "hlrsync.do"; } -*/ + + /* + public HLRCheckNumber SetNumber(string[] numbers) + { + this.numbers = numbers; + return this; + } + */ protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("number", string.Join(",", numbers)); return collection; } - } + } } diff --git a/smsapi/Api/Action/MMS/Delete.cs b/smsapi/Api/Action/MMS/Delete.cs index c0ca5f5..8d6df3c 100644 --- a/smsapi/Api/Action/MMS/Delete.cs +++ b/smsapi/Api/Action/MMS/Delete.cs @@ -1,28 +1,15 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class MMSDelete : BaseSimple + public class MMSDelete : BaseSimple { - public MMSDelete() : base() { } - - protected override string Uri() { return "mms.do"; } - protected string[] ids; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("sch_del", string.Join("|", ids)); - - return collection; - } - public MMSDelete Id(string id) { - this.ids = new string[] { id }; + ids = new[] { id }; return this; } @@ -31,5 +18,20 @@ public MMSDelete Ids(string[] ids) this.ids = ids; return this; } + + protected override string Uri() + { + return "mms.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("sch_del", string.Join("|", ids)); + + return collection; + } } } diff --git a/smsapi/Api/Action/MMS/Get.cs b/smsapi/Api/Action/MMS/Get.cs index d76a055..f26e643 100644 --- a/smsapi/Api/Action/MMS/Get.cs +++ b/smsapi/Api/Action/MMS/Get.cs @@ -1,28 +1,15 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class MMSGet : BaseSimple + public class MMSGet : BaseSimple { - public MMSGet() : base() { } - - protected override string Uri() { return "mms.do"; } - protected string[] ids; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", ids)); - - return collection; - } - public MMSGet Id(string id) { - this.ids = new string[] { id }; + ids = new[] { id }; return this; } @@ -31,5 +18,20 @@ public MMSGet Ids(string[] ids) this.ids = ids; return this; } + + protected override string Uri() + { + return "mms.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("status", string.Join("|", ids)); + + return collection; + } } } diff --git a/smsapi/Api/Action/MMS/Send.cs b/smsapi/Api/Action/MMS/Send.cs index a11a401..397e502 100644 --- a/smsapi/Api/Action/MMS/Send.cs +++ b/smsapi/Api/Action/MMS/Send.cs @@ -5,131 +5,145 @@ namespace SMSApi.Api.Action { public class MMSSend : Send { - public MMSSend() : base() { } + private string Smil; - protected override string Uri() { return "mms.do"; } + private string Subject; - protected override NameValueCollection Values() + public MMSSend SetCheckIDx(bool check = true) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - - if (To != null) - collection.Add("to", string.Join(",", To)); - - if (Group != null) - collection.Add("group", Group); - - if (Subject != null) - collection.Add("subject", Subject); - - collection.Add("smil", Smil); - - if (DateSent != null) - collection.Add("date", DateSent); - - if (Partner != null) - collection.Add("partner_id", Partner); - - if (Test == true) - collection.Add("test", "1"); - - if (Idx != null && Idx.Length > 0) - { - collection.Add("check_idx", (IdxCheck ? "1" : "0")); - collection.Add("idx", string.Join("|", Idx)); - } - - return collection; + IdxCheck = check; + return this; } - protected override void Validate() + public MMSSend SetDateSent(string data) { - if( To != null && Group != null ) - { - throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); - } - - if (Smil == null || Smil.Length < 1) - { - throw new ArgumentException("Cannot send message without smil!"); - } + DateSent = data; + return this; } - private string Subject; - private string Smil; - - public MMSSend SetTo(string to) + public MMSSend SetDateSent(DateTime data) { - this.To = new string[] { to }; + DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); return this; } - public MMSSend SetTo(string[] to) + public MMSSend SetGroup(string group) { - this.To = to; + Group = group; return this; } - public MMSSend SetGroup(string group) + public MMSSend SetIDx(string idx) { - this.Group = group; + Idx = new[] { idx }; return this; } - public MMSSend SetDateSent(string data) + public MMSSend SetIDx(string[] idx) { - this.DateSent = data; + Idx = idx; return this; } - public MMSSend SetDateSent(DateTime data) + public MMSSend SetPartner(string partner) { - this.DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + Partner = partner; return this; } - public MMSSend SetIDx(string idx) + public MMSSend SetSmil(string smil) { - this.Idx = new string[] { idx }; + Smil = smil; return this; } - public MMSSend SetIDx(string[] idx) + public MMSSend SetSubject(string subject) { - this.Idx = idx; + Subject = subject; return this; } - public MMSSend SetCheckIDx(bool check = true) + public MMSSend SetTest(bool test = true) { - this.IdxCheck = check; + Test = test; return this; } - public MMSSend SetSubject(string subject) + public MMSSend SetTo(string to) { - this.Subject = subject; + To = new[] { to }; return this; } - public MMSSend SetSmil(string smil) + public MMSSend SetTo(string[] to) { - this.Smil = smil; + To = to; return this; } - public MMSSend SetPartner(string partner) + protected override string Uri() { - this.Partner = partner; - return this; + return "mms.do"; } - public MMSSend SetTest(bool test = true) + protected override void Validate() { - this.Test = test; - return this; + if (To != null && Group != null) + { + throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); + } + + if (Smil == null || Smil.Length < 1) + { + throw new ArgumentException("Cannot send message without smil!"); + } + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + + if (To != null) + { + collection.Add("to", string.Join(",", To)); + } + + if (Group != null) + { + collection.Add("group", Group); + } + + if (Subject != null) + { + collection.Add("subject", Subject); + } + + collection.Add("smil", Smil); + + if (DateSent != null) + { + collection.Add("date", DateSent); + } + + if (Partner != null) + { + collection.Add("partner_id", Partner); + } + + if (Test) + { + collection.Add("test", "1"); + } + + if (Idx != null && Idx.Length > 0) + { + collection.Add("check_idx", IdxCheck ? "1" : "0"); + collection.Add("idx", string.Join("|", Idx)); + } + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs index 34aa350..d2f1c4b 100644 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ b/smsapi/Api/Action/Phonebook/ContactAdd.cs @@ -1,43 +1,29 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookContactAdd : BaseSimple + public class PhonebookContactAdd : BaseSimple { - public PhonebookContactAdd() : base() { } - - protected override string Uri() { return "phonebook.do"; } - - protected string number; - protected string firstName; - protected string lastName; - protected string info; protected int birthday; protected string city; + protected string firstName; protected string gender; protected string[] groups; + protected string info; + protected string lastName; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("add_contact", number); - - if (firstName != null) collection.Add("first_name", firstName); - if (lastName != null) collection.Add("last_name", lastName); - if (info != null) collection.Add("info", info); - if (birthday != 0) collection.Add("birthday", birthday.ToString()); - if (city != null) collection.Add("city", city); - if (gender != null) collection.Add("gender", gender); - if (groups != null) collection.Add("groups", string.Join(",", groups)); + protected string number; - return collection; + public PhonebookContactAdd SetBirthday(int birthday) + { + this.birthday = birthday; + return this; } - public PhonebookContactAdd SetNumber(string number) + public PhonebookContactAdd SetCity(string city) { - this.number = number; + this.city = city; return this; } @@ -47,46 +33,90 @@ public PhonebookContactAdd SetFirstName(string firstName) return this; } - public PhonebookContactAdd SetLastName(string lastName) + public PhonebookContactAdd SetGender(string gender) { - this.lastName = lastName; + this.gender = gender; return this; } - public PhonebookContactAdd SetInfo(string info) + public PhonebookContactAdd SetGroup(string group) { - this.info = info; + groups = new[] { group }; return this; } - public PhonebookContactAdd SetBirthday(int birthday) + public PhonebookContactAdd SetGroups(string[] groups) { - this.birthday = birthday; + this.groups = groups; return this; } - public PhonebookContactAdd SetCity(string city) + public PhonebookContactAdd SetInfo(string info) { - this.city = city; + this.info = info; return this; } - public PhonebookContactAdd SetGender(string gender) + public PhonebookContactAdd SetLastName(string lastName) { - this.gender = gender; + this.lastName = lastName; return this; } - public PhonebookContactAdd SetGroup(string group) + public PhonebookContactAdd SetNumber(string number) { - this.groups = new string[] {group}; + this.number = number; return this; } - public PhonebookContactAdd SetGroups(string[] groups) + protected override string Uri() { - this.groups = groups; - return this; + return "phonebook.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("add_contact", number); + + if (firstName != null) + { + collection.Add("first_name", firstName); + } + + if (lastName != null) + { + collection.Add("last_name", lastName); + } + + if (info != null) + { + collection.Add("info", info); + } + + if (birthday != 0) + { + collection.Add("birthday", birthday.ToString()); + } + + if (city != null) + { + collection.Add("city", city); + } + + if (gender != null) + { + collection.Add("gender", gender); + } + + if (groups != null) + { + collection.Add("groups", string.Join(",", groups)); + } + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index cdb50b6..f0ab115 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -1,29 +1,31 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookContactDelete : BaseSimple + public class PhonebookContactDelete : BaseSimple { - public PhonebookContactDelete() : base() { } + protected string number; - protected override string Uri() { return "phonebook.do"; } + public PhonebookContactDelete Number(string number) + { + this.number = number; + return this; + } - protected string number; + protected override string Uri() + { + return "phonebook.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("delete_contact", number); return collection; } - - public PhonebookContactDelete Number(string number) - { - this.number = number; - return this; - } } } diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs index da77213..14f7566 100644 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ b/smsapi/Api/Action/Phonebook/ContactEdit.cs @@ -1,51 +1,36 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookContactEdit : BaseSimple + public class PhonebookContactEdit : BaseSimple { - public PhonebookContactEdit() : base() { } - - protected override string Uri() { return "phonebook.do"; } - - protected string oldNumber; - protected string newNumber; - protected string firstName; - protected string lastName; - protected string info; protected int birthday; protected string city; + protected string firstName; protected string gender; protected string[] groups; + protected string info; + protected string lastName; + protected string newNumber; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("edit_contact", oldNumber); - - if (newNumber != null) collection.Add("new_number", newNumber); - if (firstName != null) collection.Add("first_name", firstName); - if (lastName != null) collection.Add("last_name", lastName); - if (info != null) collection.Add("info", info); - if (birthday != 0) collection.Add("birthday", birthday.ToString()); - if (city != null) collection.Add("city", city); - if (gender != null) collection.Add("gender", gender); - if (groups != null) collection.Add("groups", string.Join(",", groups)); + protected string oldNumber; - return collection; + public PhonebookContactEdit Number(string number) + { + oldNumber = number; + return this; } - public PhonebookContactEdit Number(string number) + public PhonebookContactEdit SetBirthday(int birthday) { - this.oldNumber = number; + this.birthday = birthday; return this; } - public PhonebookContactEdit SetNumber(string number) + public PhonebookContactEdit SetCity(string city) { - this.newNumber = number; + this.city = city; return this; } @@ -55,46 +40,95 @@ public PhonebookContactEdit SetFirstName(string firstName) return this; } - public PhonebookContactEdit SetLastName(string lastName) + public PhonebookContactEdit SetGender(string gender) { - this.lastName = lastName; + this.gender = gender; return this; } - public PhonebookContactEdit SetInfo(string info) + public PhonebookContactEdit SetGroup(string group) { - this.info = info; + groups = new[] { group }; return this; } - public PhonebookContactEdit SetBirthday(int birthday) + public PhonebookContactEdit SetGroups(string[] groups) { - this.birthday = birthday; + this.groups = groups; return this; } - public PhonebookContactEdit SetCity(string city) + public PhonebookContactEdit SetInfo(string info) { - this.city = city; + this.info = info; return this; } - public PhonebookContactEdit SetGender(string gender) + public PhonebookContactEdit SetLastName(string lastName) { - this.gender = gender; + this.lastName = lastName; return this; } - public PhonebookContactEdit SetGroup(string group) + public PhonebookContactEdit SetNumber(string number) { - this.groups = new string[] {group}; + newNumber = number; return this; } - public PhonebookContactEdit SetGroups(string[] groups) + protected override string Uri() { - this.groups = groups; - return this; + return "phonebook.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("edit_contact", oldNumber); + + if (newNumber != null) + { + collection.Add("new_number", newNumber); + } + + if (firstName != null) + { + collection.Add("first_name", firstName); + } + + if (lastName != null) + { + collection.Add("last_name", lastName); + } + + if (info != null) + { + collection.Add("info", info); + } + + if (birthday != 0) + { + collection.Add("birthday", birthday.ToString()); + } + + if (city != null) + { + collection.Add("city", city); + } + + if (gender != null) + { + collection.Add("gender", gender); + } + + if (groups != null) + { + collection.Add("groups", string.Join(",", groups)); + } + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs index 24c3849..a7c11c7 100644 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ b/smsapi/Api/Action/Phonebook/ContactGet.cs @@ -1,29 +1,31 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookContactGet : BaseSimple + public class PhonebookContactGet : BaseSimple { - public PhonebookContactGet() : base() { } + protected string number; - protected override string Uri() { return "phonebook.do"; } + public PhonebookContactGet Number(string number) + { + this.number = number; + return this; + } - protected string number; + protected override string Uri() + { + return "phonebook.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("get_contact", number); return collection; } - - public PhonebookContactGet Number(string number) - { - this.number = number; - return this; - } } } diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs index 76a91d9..2abf2e6 100644 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ b/smsapi/Api/Action/Phonebook/ContactList.cs @@ -1,55 +1,35 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookContactList : BaseSimple + public class PhonebookContactList : BaseSimple { - public PhonebookContactList() - : base() - { - offset = 0; - limit = 0; - } - - protected override string Uri() { return "phonebook.do"; } + protected string gender; + protected string[] groups; + protected uint limit; protected string number; - protected string[] groups; - protected string searchText; - protected string gender; + protected uint offset; protected string orderBy; protected string orderDir; - protected uint limit; - protected uint offset; + protected string searchText; - protected override NameValueCollection Values() + public PhonebookContactList() { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("list_contacts", ""); - - if (number != null && number.Length > 0) collection.Add("number", number); - if (groups != null && groups.Length > 0) collection.Add("groups", string.Join(";", groups)); - if (searchText != null && searchText.Length > 0) collection.Add("text_search", searchText); - if (gender != null && gender.Length > 0) collection.Add("gender", gender); - if (orderBy != null && orderBy.Length > 0) collection.Add("order_by", orderBy); - if (orderDir != null && orderDir.Length > 0) collection.Add("order_dir", orderDir); - if (limit > 0) collection.Add("limit", limit.ToString()); - if (offset > 0) collection.Add("offset", offset.ToString()); - - return collection; + offset = 0; + limit = 0; } - public PhonebookContactList Number(string number) + public PhonebookContactList Gender(string gender) { - this.number = number; + this.gender = gender; return this; } public PhonebookContactList Group(string group) { - this.groups = new string[] { group }; + groups = new[] { group }; return this; } @@ -59,15 +39,21 @@ public PhonebookContactList Groups(string[] groups) return this; } - public PhonebookContactList Text(string text) + public PhonebookContactList Limit(uint limit) { - this.searchText = text; + this.limit = limit; return this; } - public PhonebookContactList Gender(string gender) + public PhonebookContactList Number(string number) { - this.gender = gender; + this.number = number; + return this; + } + + public PhonebookContactList Offset(uint offset) + { + this.offset = offset; return this; } @@ -83,16 +69,65 @@ public PhonebookContactList OrderDir(string orderDir) return this; } - public PhonebookContactList Limit(uint limit) + public PhonebookContactList Text(string text) { - this.limit = limit; + searchText = text; return this; } - public PhonebookContactList Offset(uint offset) + protected override string Uri() { - this.offset = offset; - return this; + return "phonebook.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("list_contacts", ""); + + if (number != null && number.Length > 0) + { + collection.Add("number", number); + } + + if (groups != null && groups.Length > 0) + { + collection.Add("groups", string.Join(";", groups)); + } + + if (searchText != null && searchText.Length > 0) + { + collection.Add("text_search", searchText); + } + + if (gender != null && gender.Length > 0) + { + collection.Add("gender", gender); + } + + if (orderBy != null && orderBy.Length > 0) + { + collection.Add("order_by", orderBy); + } + + if (orderDir != null && orderDir.Length > 0) + { + collection.Add("order_dir", orderDir); + } + + if (limit > 0) + { + collection.Add("limit", limit.ToString()); + } + + if (offset > 0) + { + collection.Add("offset", offset.ToString()); + } + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs index b9135d4..8beec9b 100644 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ b/smsapi/Api/Action/Phonebook/GroupAdd.cs @@ -1,25 +1,18 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookGroupAdd : BaseSimple + public class PhonebookGroupAdd : BaseSimple { - public PhonebookGroupAdd() : base() { } - - protected override string Uri() { return "phonebook.do"; } + protected string info; protected string name; - protected string info; - protected override NameValueCollection Values() + public PhonebookGroupAdd SetInfo(string info) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("add_group", name); - if (info != null) collection.Add("info", info); - - return collection; + this.info = info; + return this; } public PhonebookGroupAdd SetName(string name) @@ -28,10 +21,23 @@ public PhonebookGroupAdd SetName(string name) return this; } - public PhonebookGroupAdd SetInfo(string info) + protected override string Uri() { - this.info = info; - return this; + return "phonebook.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("add_group", name); + if (info != null) + { + collection.Add("info", info); + } + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs index 66e41c6..25e6b27 100644 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ b/smsapi/Api/Action/Phonebook/GroupDelete.cs @@ -1,43 +1,48 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookGroupDelete : BaseSimple + public class PhonebookGroupDelete : BaseSimple { - public PhonebookGroupDelete() : base() { + protected string name; + protected bool removeContacts; + + public PhonebookGroupDelete() + { removeContacts = false; } - protected override string Uri() { return "phonebook.do"; } + public PhonebookGroupDelete Contacts(bool flag) + { + removeContacts = flag; + return this; + } - protected string name; - protected bool removeContacts; + public PhonebookGroupDelete Name(string name) + { + this.name = name; + return this; + } + + protected override string Uri() + { + return "phonebook.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("delete_group", name); - if (removeContacts == true) + if (removeContacts) { collection.Add("remove_contacts", "1"); } return collection; } - - public PhonebookGroupDelete Name(string name) - { - this.name = name; - return this; - } - - public PhonebookGroupDelete Contacts(bool flag) - { - this.removeContacts = flag; - return this; - } } } diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs index 095e8f2..fcd257b 100644 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ b/smsapi/Api/Action/Phonebook/GroupEdit.cs @@ -1,45 +1,48 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookGroupEdit : BaseSimple + public class PhonebookGroupEdit : BaseSimple { - public PhonebookGroupEdit() : base() { } - - protected override string Uri() { return "phonebook.do"; } + protected string info; + protected string newName; protected string oldName; - protected string newName; - protected string info; - protected override NameValueCollection Values() + public PhonebookGroupEdit Name(string name) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("edit_group", oldName); - collection.Add("name", newName); - collection.Add("info", info); - - return collection; + oldName = name; + return this; } - public PhonebookGroupEdit Name(string name) + public PhonebookGroupEdit SetInfo(string info) { - this.oldName = name; + this.info = info; return this; } public PhonebookGroupEdit SetName(string name) { - this.newName = name; + newName = name; return this; } - public PhonebookGroupEdit SetInfo(string info) + protected override string Uri() { - this.info = info; - return this; + return "phonebook.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("edit_group", oldName); + collection.Add("name", newName); + collection.Add("info", info); + + return collection; } } } diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs index 3557537..a631731 100644 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ b/smsapi/Api/Action/Phonebook/GroupGet.cs @@ -1,29 +1,31 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookGroupGet : BaseSimple + public class PhonebookGroupGet : BaseSimple { - public PhonebookGroupGet() : base() { } + protected string name; - protected override string Uri() { return "phonebook.do"; } + public PhonebookGroupGet Name(string name) + { + this.name = name; + return this; + } - protected string name; + protected override string Uri() + { + return "phonebook.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("get_group", name); return collection; } - - public PhonebookGroupGet Name(string name) - { - this.name = name; - return this; - } } } diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs index 3841511..0959735 100644 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ b/smsapi/Api/Action/Phonebook/GroupList.cs @@ -1,19 +1,18 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class PhonebookGroupList : BaseSimple + public class PhonebookGroupList : BaseSimple { - public PhonebookGroupList() - : base() + protected override string Uri() { + return "phonebook.do"; } - protected override string Uri() { return "phonebook.do"; } - protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("list_groups", ""); diff --git a/smsapi/Api/Action/Rest.cs b/smsapi/Api/Action/Rest.cs index c70206f..8f6d729 100644 --- a/smsapi/Api/Action/Rest.cs +++ b/smsapi/Api/Action/Rest.cs @@ -1,39 +1,37 @@ -using System; using System.Collections.Specialized; -using System.Linq; using System.Web; namespace SMSApi.Api.Action { - public abstract class Rest : BaseSimple - { - public Rest() - : base() - { - } + public abstract class Rest : BaseSimple + { + protected virtual NameValueCollection Parameters => HttpUtility.ParseQueryString(string.Empty); - protected override string Uri() - { - string uri = Resource; - if (RequestMethod.GET.Equals(Method)) - { - if (Parameters.Count > 0) uri += "?" + Parameters.ToString(); - } - return uri; - } + protected abstract string Resource { get; } - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - if (RequestMethod.POST.Equals(Method) || RequestMethod.PUT.Equals(Method)) - { - collection = Parameters; - } - return collection; - } + protected override string Uri() + { + string uri = Resource; + if (RequestMethod.GET.Equals(Method)) + { + if (Parameters.Count > 0) + { + uri += "?" + Parameters; + } + } - protected abstract string Resource { get; } + return uri; + } - protected virtual NameValueCollection Parameters { get { return HttpUtility.ParseQueryString(string.Empty); } } - } + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + if (RequestMethod.POST.Equals(Method) || RequestMethod.PUT.Equals(Method)) + { + collection = Parameters; + } + + return collection; + } + } } diff --git a/smsapi/Api/Action/SMS/Delete.cs b/smsapi/Api/Action/SMS/Delete.cs index 6ff1321..73d8699 100644 --- a/smsapi/Api/Action/SMS/Delete.cs +++ b/smsapi/Api/Action/SMS/Delete.cs @@ -1,29 +1,31 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SMSDelete : BaseSimple + public class SMSDelete : BaseSimple { - public SMSDelete() : base() { } + protected string id; - protected override string Uri() { return "sms.do"; } + public SMSDelete Id(string id) + { + this.id = id; + return this; + } - protected string id; + protected override string Uri() + { + return "sms.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("sch_del", id); return collection; } - - public SMSDelete Id(string id) - { - this.id = id; - return this; - } } } diff --git a/smsapi/Api/Action/SMS/Get.cs b/smsapi/Api/Action/SMS/Get.cs index b99b885..f6f8cfb 100644 --- a/smsapi/Api/Action/SMS/Get.cs +++ b/smsapi/Api/Action/SMS/Get.cs @@ -1,35 +1,37 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SMSGet : BaseSimple + public class SMSGet : BaseSimple { - public SMSGet() : base() { } - - protected override string Uri() { return "sms.do"; } - protected string[] id; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", id)); - - return collection; - } - public SMSGet Id(string id) { - this.id = new string[] { id }; + this.id = new[] { id }; return this; } public SMSGet Ids(string[] ids) { - this.id = ids; + id = ids; return this; } + + protected override string Uri() + { + return "sms.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("status", string.Join("|", id)); + + return collection; + } } } diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 2b309b4..769049a 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -5,262 +5,284 @@ namespace SMSApi.Api.Action { public class SMSSend : Send { - public SMSSend() : base() { } + private string DataCoding; + private string DateExpire; + private bool Details = true; + private string Encoding = "UTF-8"; + private bool Fast; + private bool Flash; + private int MaxParts; + private bool Normalize; + private bool NoUnicode; + private string[] Params; + private string Sender; + private bool Single; - protected override string Uri() { return "sms.do"; } + private string Text; + private string udh; - protected override NameValueCollection Values() + public SMSSend SetCheckIDx(bool check = true) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - - if (Sender != null) - collection.Add("from", Sender); - - if (To != null) - collection.Add("to", string.Join(",", To)); - - if (Group != null) - collection.Add("group", Group); - - collection.Add("message", Text); - - collection.Add("single", (Single ? "1" : "0") ); - collection.Add("nounicode", (NoUnicode ? "1" : "0") ); - collection.Add("flash", (Flash ? "1" : "0") ); - collection.Add("fast", (Fast ? "1" : "0") ); - - if (DataCoding != null) - collection.Add("datacoding", DataCoding); - - if (MaxParts > 0) - collection.Add("max_parts", MaxParts.ToString()); - - if (DateSent != null) - collection.Add("date", DateSent); - - if (DateExpire != null) - collection.Add("expiration_date", DateExpire); - - if (Partner != null) - collection.Add("partner_id", Partner); - - collection.Add("encoding", Encoding); - - if (Normalize == true) - collection.Add("normalize", "1"); - - if (Test == true) - collection.Add("test", "1"); - - if (Idx != null && Idx.Length > 0) - { - collection.Add("check_idx", (IdxCheck ? "1" : "0")); - collection.Add("idx", string.Join("|", Idx)); - } - - if (Details == true) - { - collection.Add("details", "1"); - } - - if (this.Params != null) - { - for (int i = 0; i < this.Params.Length; i++) - { - if (this.Params[i] != null) - { - collection.Add("param" + ((i + 1).ToString()), this.Params[i]); - } - } - } - - return collection; + IdxCheck = check; + return this; } - protected override void Validate() + public SMSSend SetDataCoding(string dataCoding) { - if( To != null && Group != null ) - { - throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); - } + DataCoding = dataCoding; + return this; + } - if (Text == null) - { - throw new ArgumentException("Cannot send message without text!"); - } + public SMSSend SetDateExpire(string data) + { + DateExpire = data; + return this; } - private string Text; - private string DateExpire; - private string Sender; - private bool Single = false; - private bool NoUnicode = false; - private string DataCoding; - private string udh; - private bool Flash = false; - private string Encoding = "UTF-8"; - private bool Fast = false; - private bool Normalize = false; - private int MaxParts = 0; - private string[] Params = null; - private bool Details = true; + public SMSSend SetDateExpire(DateTime data) + { + DateExpire = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + return this; + } - public SMSSend SetTo(string to) + public SMSSend SetDateSent(string data) { - this.To = new string[] { to }; + DateSent = data; return this; } - public SMSSend SetTo(string[] to) + public SMSSend SetDateSent(DateTime data) { - this.To = to; + DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); return this; } - public SMSSend SetGroup(string group) + /* + public SMSSend SetEncoding(string encoding) + { + this.encoding = encoding; + return this; + } + */ + + public SMSSend SetFast(bool fast = true) { - this.Group = group; + Fast = fast; return this; } - public SMSSend SetDateSent(string data) + public SMSSend SetFlash(bool flash = true) { - this.DateSent = data; + Flash = flash; return this; } - public SMSSend SetDateSent(DateTime data) + public SMSSend SetGroup(string group) { - this.DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + Group = group; return this; } public SMSSend SetIDx(string idx) { - this.Idx = new string[] { idx }; + Idx = new[] { idx }; return this; } public SMSSend SetIDx(string[] idx) { - this.Idx = idx; + Idx = idx; return this; } - public SMSSend SetCheckIDx(bool check = true) + public SMSSend SetNormalize(bool flag = true) { - this.IdxCheck = check; + Normalize = flag; return this; } - public SMSSend SetPartner(string partner) + public SMSSend SetNoUnicode(bool noUnicode = true) { - this.Partner = partner; + NoUnicode = noUnicode; return this; } - public SMSSend SetText(string text) + public SMSSend SetParam(int i, string[] text) { - this.Text = text; - return this; + return SetParam(i, string.Join("|", text)); } - public SMSSend SetDateExpire(string data) + public SMSSend SetParam(int i, string text) { - this.DateExpire = data; + if (i > 3 || i < 0) + { + throw new IndexOutOfRangeException(); + } + + if (Params == null) + { + Params = new string[4]; + } + + Params[i] = text; + return this; } - public SMSSend SetDateExpire(DateTime data) + public SMSSend SetPartner(string partner) { - this.DateExpire = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + Partner = partner; return this; } public SMSSend SetSender(string sender) { - this.Sender = sender; + Sender = sender; return this; } public SMSSend SetSingle(bool single = true) { - this.Single = single; + Single = single; return this; } - public SMSSend SetNoUnicode(bool noUnicode = true) + public SMSSend SetTest(bool test = true) { - this.NoUnicode = noUnicode; + Test = test; return this; } - public SMSSend SetDataCoding(string dataCoding) + public SMSSend SetText(string text) { - this.DataCoding = dataCoding; + Text = text; return this; } - public SMSSend SetUdh(string udh) + public SMSSend SetTo(string to) { - this.udh = udh; + To = new[] { to }; return this; } - public SMSSend SetFlash(bool flash = true) + public SMSSend SetTo(string[] to) { - this.Flash = flash; + To = to; return this; } -/* - public SMSSend SetEncoding(string encoding) + public SMSSend SetUdh(string udh) { - this.encoding = encoding; + this.udh = udh; return this; } -*/ - public SMSSend SetFast(bool fast = true) + protected override string Uri() { - this.Fast = fast; - return this; + return "sms.do"; } - public SMSSend SetTest(bool test = true) + protected override void Validate() { - this.Test = test; - return this; - } + if (To != null && Group != null) + { + throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); + } - public SMSSend SetParam(int i, string[] text) - { - return this.SetParam(i, string.Join("|", text)); + if (Text == null) + { + throw new ArgumentException("Cannot send message without text!"); + } } - public SMSSend SetParam(int i, string text) + protected override NameValueCollection Values() { - if (i > 3 || i < 0) + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + + if (Sender != null) { - throw new IndexOutOfRangeException(); + collection.Add("from", Sender); } - if (this.Params == null) + if (To != null) { - this.Params = new string[4]; + collection.Add("to", string.Join(",", To)); } - this.Params[i] = text; + if (Group != null) + { + collection.Add("group", Group); + } - return this; - } + collection.Add("message", Text); - public SMSSend SetNormalize(bool flag = true) - { - this.Normalize = flag; - return this; - } + collection.Add("single", Single ? "1" : "0"); + collection.Add("nounicode", NoUnicode ? "1" : "0"); + collection.Add("flash", Flash ? "1" : "0"); + collection.Add("fast", Fast ? "1" : "0"); + + if (DataCoding != null) + { + collection.Add("datacoding", DataCoding); + } + + if (MaxParts > 0) + { + collection.Add("max_parts", MaxParts.ToString()); + } + + if (DateSent != null) + { + collection.Add("date", DateSent); + } + + if (DateExpire != null) + { + collection.Add("expiration_date", DateExpire); + } + + if (Partner != null) + { + collection.Add("partner_id", Partner); + } + + collection.Add("encoding", Encoding); + + if (Normalize) + { + collection.Add("normalize", "1"); + } + + if (Test) + { + collection.Add("test", "1"); + } + + if (Idx != null && Idx.Length > 0) + { + collection.Add("check_idx", IdxCheck ? "1" : "0"); + collection.Add("idx", string.Join("|", Idx)); + } + + if (Details) + { + collection.Add("details", "1"); + } + + if (Params != null) + { + for (int i = 0; i < Params.Length; i++) + { + if (Params[i] != null) + { + collection.Add("param" + (i + 1), Params[i]); + } + } + } + + return collection; + } } } diff --git a/smsapi/Api/Action/Send.cs b/smsapi/Api/Action/Send.cs index 012934b..0a7753b 100644 --- a/smsapi/Api/Action/Send.cs +++ b/smsapi/Api/Action/Send.cs @@ -1,17 +1,16 @@ -using System.IO; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public abstract class Send : BaseSimple + public abstract class Send : BaseSimple { - protected Send() : base() {} - - protected string[] To; - protected string Group; protected string DateSent; + protected string Group; protected string[] Idx; protected bool IdxCheck = false; protected string Partner; protected bool Test = false; + + protected string[] To; } } diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index 25bcf5b..571ee8e 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -1,22 +1,26 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SenderAdd : BaseSimple + public class SenderAdd : BaseSimple { private string name; - protected override string Uri() { return "sender.do"; } - public SenderAdd SetName(string name) { this.name = name; return this; } + protected override string Uri() + { + return "sender.do"; + } + protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("add", name); diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index 5de5fa6..e95135c 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -1,11 +1,10 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SenderDelete : BaseSimple + public class SenderDelete : BaseSimple { - protected override string Uri() { return "sender.do"; } - private string name; public SenderDelete Name(string name) @@ -14,12 +13,17 @@ public SenderDelete Name(string name) return this; } + protected override string Uri() + { + return "sender.do"; + } + protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); - collection.Add("delete", this.name); + collection.Add("delete", name); return collection; } diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index cf888bb..9f310f3 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -1,15 +1,18 @@ -using System.Collections.Generic; -using System.Collections.Specialized; +using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SenderList : BaseArray + public class SenderList : BaseArray { - protected override string Uri() { return "sender.do"; } + protected override string Uri() + { + return "sender.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("list", "1"); diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index d259d62..8598114 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -1,11 +1,10 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SenderSetDefault : BaseSimple + public class SenderSetDefault : BaseSimple { - protected override string Uri() { return "sender.do"; } - private string name; public SenderSetDefault Name(string name) @@ -14,12 +13,17 @@ public SenderSetDefault Name(string name) return this; } + protected override string Uri() + { + return "sender.do"; + } + protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); - collection.Add("default", this.name); + collection.Add("default", name); return collection; } diff --git a/smsapi/Api/Action/User/Add.cs b/smsapi/Api/Action/User/Add.cs index c04191a..f0879e1 100644 --- a/smsapi/Api/Action/User/Add.cs +++ b/smsapi/Api/Action/User/Add.cs @@ -1,4 +1,5 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; /** * add_user * Nazwa dodawanego podużytkownika bez prefiksu użytkownika głównego @@ -14,113 +15,147 @@ */ namespace SMSApi.Api.Action { - public class UserAdd : BaseSimple + public class UserAdd : BaseSimple { - public UserAdd() : base() - { - limit = -1; - monthLimit = -1; - active = false; - phonebook = -1; - senders = -1; - } - - protected override string Uri() { return "user.do"; } + private const int PHONEBOOK_NOSHARE = 0; + private const int PHONEBOOK_SHARE = 1; - const int SENDERS_NOSHARE = 0; - const int SENDERS_SHARE = 1; - - const int PHONEBOOK_NOSHARE = 0; - const int PHONEBOOK_SHARE = 1; + private const int SENDERS_NOSHARE = 0; + private const int SENDERS_SHARE = 1; + protected bool active; + protected string info; + protected double limit; + protected double monthLimit; protected string newUsername; protected string password; protected string passwordApi; - protected double limit; - protected double monthLimit; - protected int senders; protected int phonebook; - protected bool active; - protected string info; - protected bool withoutPrefix = false; + protected int senders; + protected bool withoutPrefix; - protected override NameValueCollection Values() + public UserAdd() { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("add_user", newUsername); - if (password != null) collection.Add("pass", password); - if (passwordApi != null) collection.Add("pass_api", passwordApi); - if (limit >= 0) collection.Add("limit", limit.ToString()); - if (monthLimit >= 0) collection.Add("month_limit", monthLimit.ToString()); - if (senders >= 0) collection.Add("senders", senders.ToString()); - if (phonebook >= 0) collection.Add("phonebook", phonebook.ToString()); - collection.Add("active", (active == true ? "1" : "0") ); - if (info != null) collection.Add("info", info); - if (withoutPrefix) collection.Add("without_prefix", "1"); - - return collection; + limit = -1; + monthLimit = -1; + active = false; + phonebook = -1; + senders = -1; } - public UserAdd SetUsername(string username) + public UserAdd SetActive(bool flag) { - this.newUsername = username; + active = flag; return this; } - public UserAdd SetPassword(string password) + public UserAdd SetInfo(string text) { - this.password = password; + info = text; return this; } - public UserAdd SetPasswordApi(string password) + public UserAdd SetLimit(double limit) { - this.passwordApi = password; + this.limit = limit; return this; } - public UserAdd SetLimit(double limit) + public UserAdd SetMonthLimit(double limit) { - this.limit = limit; + monthLimit = limit; return this; } - public UserAdd SetMonthLimit(double limit) + public UserAdd SetPassword(string password) { - this.monthLimit = limit; + this.password = password; return this; } - public UserAdd SetSenders(int flag) + public UserAdd SetPasswordApi(string password) { - this.senders = flag; + passwordApi = password; return this; } public UserAdd SetPhonebook(int flag) { - this.phonebook = flag; + phonebook = flag; return this; } - public UserAdd SetActive(bool flag) + public UserAdd SetSenders(int flag) { - this.active = flag; + senders = flag; return this; } - public UserAdd SetInfo(string text) + public UserAdd SetUsername(string username) { - this.info = text; + newUsername = username; return this; } public UserAdd SetWithoutPrefix(bool flag) { - this.withoutPrefix = flag; + withoutPrefix = flag; return this; } + + protected override string Uri() + { + return "user.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("add_user", newUsername); + if (password != null) + { + collection.Add("pass", password); + } + + if (passwordApi != null) + { + collection.Add("pass_api", passwordApi); + } + + if (limit >= 0) + { + collection.Add("limit", limit.ToString()); + } + + if (monthLimit >= 0) + { + collection.Add("month_limit", monthLimit.ToString()); + } + + if (senders >= 0) + { + collection.Add("senders", senders.ToString()); + } + + if (phonebook >= 0) + { + collection.Add("phonebook", phonebook.ToString()); + } + + collection.Add("active", active ? "1" : "0"); + if (info != null) + { + collection.Add("info", info); + } + + if (withoutPrefix) + { + collection.Add("without_prefix", "1"); + } + + return collection; + } } } diff --git a/smsapi/Api/Action/User/Edit.cs b/smsapi/Api/Action/User/Edit.cs index 622767f..27c3cbc 100644 --- a/smsapi/Api/Action/User/Edit.cs +++ b/smsapi/Api/Action/User/Edit.cs @@ -1,4 +1,5 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; /** * add_user * Nazwa dodawanego podużytkownika bez prefiksu użytkownika głównego @@ -14,10 +15,26 @@ */ namespace SMSApi.Api.Action { - public class UserEdit : BaseSimple + public class UserEdit : BaseSimple { + private const int PHONEBOOK_NOSHARE = 0; + private const int PHONEBOOK_SHARE = 1; + + private const int SENDERS_NOSHARE = 0; + private const int SENDERS_SHARE = 1; + protected int active; + protected string info; + protected double limit; + protected double monthLimit; + protected string password; + protected string passwordApi; + protected int phonebook; + protected int senders; + + protected string username; + protected bool withoutPrefix; + public UserEdit() - : base() { limit = -1; monthLimit = -1; @@ -26,102 +43,123 @@ public UserEdit() senders = -1; } - protected override string Uri() { return "user.do"; } - - const int SENDERS_NOSHARE = 0; - const int SENDERS_SHARE = 1; - - const int PHONEBOOK_NOSHARE = 0; - const int PHONEBOOK_SHARE = 1; - - protected string username; - protected string password; - protected string passwordApi; - protected double limit; - protected double monthLimit; - protected int senders; - protected int phonebook; - protected int active; - protected string info; - protected bool withoutPrefix = false; - - protected override NameValueCollection Values() + public UserEdit SetActive(bool flag) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("set_user", username); - if (password != null) collection.Add("pass", password); - if (passwordApi != null) collection.Add("pass_api", passwordApi); - if (limit >= 0) collection.Add("limit", limit.ToString()); - if (monthLimit >= 0) collection.Add("month_limit", monthLimit.ToString()); - if (senders >= 0) collection.Add("senders", senders.ToString()); - if (phonebook >= 0) collection.Add("phonebook", phonebook.ToString()); - if (active >= 0) collection.Add("active", (active > 0 ? "1" : "0")); - if (info != null) collection.Add("info", info); - if (withoutPrefix) collection.Add("without_prefix", "1"); + active = flag ? 1 : 0; + return this; + } - return collection; + public UserEdit SetInfo(string text) + { + info = text; + return this; } - public UserEdit Username(string username) + public UserEdit SetLimit(double limit) { - this.username = username; + this.limit = limit; return this; } - public UserEdit SetPassword(string password) + public UserEdit SetMonthLimit(double limit) { - this.password = password; + monthLimit = limit; return this; } - public UserEdit SetPasswordApi(string password) + public UserEdit SetPassword(string password) { - this.passwordApi = password; + this.password = password; return this; } - public UserEdit SetLimit(double limit) + public UserEdit SetPasswordApi(string password) { - this.limit = limit; + passwordApi = password; return this; } - public UserEdit SetMonthLimit(double limit) + public UserEdit SetPhonebook(int flag) { - this.monthLimit = limit; + phonebook = flag; return this; } public UserEdit SetSenders(int flag) { - this.senders = flag; + senders = flag; return this; } - public UserEdit SetPhonebook(int flag) + public UserEdit SetWithoutPrefix(bool flag) { - this.phonebook = flag; + withoutPrefix = flag; return this; } - public UserEdit SetActive(bool flag) + public UserEdit Username(string username) { - this.active = (flag ? 1 : 0); + this.username = username; return this; } - public UserEdit SetInfo(string text) + protected override string Uri() { - this.info = text; - return this; + return "user.do"; } - public UserEdit SetWithoutPrefix(bool flag) + protected override NameValueCollection Values() { - this.withoutPrefix = flag; - return this; + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("set_user", username); + if (password != null) + { + collection.Add("pass", password); + } + + if (passwordApi != null) + { + collection.Add("pass_api", passwordApi); + } + + if (limit >= 0) + { + collection.Add("limit", limit.ToString()); + } + + if (monthLimit >= 0) + { + collection.Add("month_limit", monthLimit.ToString()); + } + + if (senders >= 0) + { + collection.Add("senders", senders.ToString()); + } + + if (phonebook >= 0) + { + collection.Add("phonebook", phonebook.ToString()); + } + + if (active >= 0) + { + collection.Add("active", active > 0 ? "1" : "0"); + } + + if (info != null) + { + collection.Add("info", info); + } + + if (withoutPrefix) + { + collection.Add("without_prefix", "1"); + } + + return collection; } } } diff --git a/smsapi/Api/Action/User/Get.cs b/smsapi/Api/Action/User/Get.cs index 681ee56..02ffb3a 100644 --- a/smsapi/Api/Action/User/Get.cs +++ b/smsapi/Api/Action/User/Get.cs @@ -1,29 +1,31 @@ using System.Collections.Specialized; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class UserGet : BaseSimple + public class UserGet : BaseSimple { - public UserGet() : base() { } + protected string username; - protected override string Uri() { return "user.do"; } + public UserGet Username(string username) + { + this.username = username; + return this; + } + + protected override string Uri() + { + return "user.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("get_user", username); return collection; } - - protected string username; - - public UserGet Username(string username) - { - this.username = username; - return this; - } } } diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index d74a870..f6ff4ac 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -1,22 +1,24 @@ -using System.Collections.Specialized; - -namespace SMSApi.Api.Action -{ - public class UserGetCredits : BaseSimple - { - public UserGetCredits() : base() { } - - protected override string Uri() { return "user.do"; } - - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); +using System.Collections.Specialized; +using SMSApi.Api.Response; + +namespace SMSApi.Api.Action +{ + public class UserGetCredits : BaseSimple + { + protected override string Uri() + { + return "user.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); collection.Add("credits", "1"); - collection.Add("details", "1"); - - return collection; - } - } + collection.Add("details", "1"); + + return collection; + } + } } diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index 7dc6c74..2ae1aea 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -1,30 +1,31 @@ using System.Collections.Specialized; -using System.Collections.Generic; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class UserList : BaseArray + public class UserList : BaseArray { - public UserList() : base() { } + protected string username; - protected override string Uri() { return "user.do"; } + public UserList Username(string username) + { + this.username = username; + return this; + } + + protected override string Uri() + { + return "user.do"; + } protected override NameValueCollection Values() { - NameValueCollection collection = new NameValueCollection(); + var collection = new NameValueCollection(); collection.Add("format", "json"); collection.Add("list", "1"); return collection; } - - protected string username; - - public UserList Username(string username) - { - this.username = username; - return this; - } } } diff --git a/smsapi/Api/Action/VMS/Delete.cs b/smsapi/Api/Action/VMS/Delete.cs index 3d69888..a8ef6fc 100644 --- a/smsapi/Api/Action/VMS/Delete.cs +++ b/smsapi/Api/Action/VMS/Delete.cs @@ -1,30 +1,15 @@ using System.Collections.Specialized; -using System.IO; -using System.Runtime.Serialization.Json; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class VMSDelete : BaseSimple + public class VMSDelete : BaseSimple { - public VMSDelete() : base() { } - - protected override string Uri() { return "vms.do"; } - protected string[] ids; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("sch_del", string.Join("|", ids)); - - return collection; - } - public VMSDelete Id(string id) { - this.ids = new string[] { id }; + ids = new[] { id }; return this; } @@ -33,5 +18,20 @@ public VMSDelete Ids(string[] ids) this.ids = ids; return this; } + + protected override string Uri() + { + return "vms.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("sch_del", string.Join("|", ids)); + + return collection; + } } } diff --git a/smsapi/Api/Action/VMS/Get.cs b/smsapi/Api/Action/VMS/Get.cs index 33273c8..ea1fed3 100644 --- a/smsapi/Api/Action/VMS/Get.cs +++ b/smsapi/Api/Action/VMS/Get.cs @@ -1,38 +1,37 @@ using System.Collections.Specialized; -using System.IO; -using System.Runtime.Serialization.Json; +using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class VMSGet : BaseSimple + public class VMSGet : BaseSimple { - public VMSGet() : base() { } - - protected override string Uri() { return "vms.do"; } - protected string[] ids; - protected override NameValueCollection Values() - { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", ids)); - - return collection; - } - public VMSGet Id(string id) { - this.ids = new string[] { id }; + ids = new[] { id }; return this; } - public VMSGet Ids(string[] ids) { this.ids = ids; return this; } + + protected override string Uri() + { + return "vms.do"; + } + + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + collection.Add("status", string.Join("|", ids)); + + return collection; + } } } diff --git a/smsapi/Api/Action/VMS/Send.cs b/smsapi/Api/Action/VMS/Send.cs index 340902b..5833176 100644 --- a/smsapi/Api/Action/VMS/Send.cs +++ b/smsapi/Api/Action/VMS/Send.cs @@ -7,196 +7,216 @@ namespace SMSApi.Api.Action { public class VMSSend : Send { - public VMSSend() : base() { } - - protected override string Uri() { return "vms.do"; } - - protected override Dictionary Files() - { - Dictionary files = null; - - if (File != null && File.Length > 0) - { - files = new Dictionary(); - files.Add("file", File); - } + private Stream File; - return files; - } + private string From; + private int Interval; + private bool SkipGSM; + private int Try; + private string TTS; + private string TTSLector; - protected override NameValueCollection Values() + public VMSSend SetCheckIDx(bool check = true) { - NameValueCollection collection = new NameValueCollection(); - - collection.Add("format", "json"); - - if (To != null) - collection.Add("to", string.Join(",", To)); - - if (From != null) - collection.Add("from", From); - - if (TTS != null) - collection.Add("tts", TTS); - - if (DateSent != null) - collection.Add("date", DateSent); - - if (Try > 0) - collection.Add("try", Try.ToString()); - - if (Interval > 0) - collection.Add("interval", Interval.ToString()); - - if (Partner != null) - collection.Add("partner_id", Partner); - - if (SkipGSM == true) - collection.Add("skip_gsm", "1"); - - if (TTSLector != null) - collection.Add("tts_lector", TTSLector); - - if (Test == true) - collection.Add("test", "1"); - - if (Idx != null && Idx.Length > 0) - { - collection.Add("check_idx", (IdxCheck ? "1" : "0")); - collection.Add("idx", string.Join("|", Idx)); - } - - return collection; + IdxCheck = check; + return this; } - protected override void Validate() + public VMSSend SetDateSent(string data) { - if( To != null && Group != null ) - { - throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); - } - - if ( (TTS == null || TTS.Length < 1) && (File == null || File.Length == 0) ) - { - throw new ArgumentException("Cannot send message without content!"); - } - - if (TTS != null && File != null) - { - throw new ArgumentException("Cannot send TTS and file at the same time"); - } + DateSent = data; + return this; } - private string From; - private Stream File; - private string TTS; - private string TTSLector; - private int Try = 0; - private int Interval = 0; - private bool SkipGSM = false; - - public VMSSend SetTo(string to) + public VMSSend SetDateSent(DateTime data) { - this.To = new string[] { to }; + DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); return this; } - public VMSSend SetTo(string[] to) + public VMSSend SetFile(Stream file) { - this.To = to; + File = file; return this; } public VMSSend SetFrom(string from) { - this.From = from; + From = from; return this; } public VMSSend SetGroup(string group) { - this.Group = group; + Group = group; return this; } - public VMSSend SetDateSent(string data) + public VMSSend SetIDx(string idx) { - this.DateSent = data; + Idx = new[] { idx }; return this; } - public VMSSend SetDateSent(DateTime data) + public VMSSend SetIDx(string[] idx) { - this.DateSent = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + Idx = idx; return this; } - public VMSSend SetIDx(string idx) + public VMSSend SetPartner(string partner) { - this.Idx = new string[] { idx }; + Partner = partner; return this; } - public VMSSend SetIDx(string[] idx) + public VMSSend SetSkipGSM(bool flag) { - this.Idx = idx; + SkipGSM = flag; return this; } - public VMSSend SetCheckIDx(bool check = true) + public VMSSend SetTest(bool test = true) { - this.IdxCheck = check; + Test = test; return this; } - public VMSSend SetFile(Stream file) + public VMSSend SetTo(string to) { - this.File = file; + To = new[] { to }; return this; } - public VMSSend SetTTS(string tts) + public VMSSend SetTo(string[] to) { - this.TTS = tts; + To = to; return this; } - public VMSSend SetTTSLector(string lector) + public VMSSend SetTry(int retry) { - this.TTSLector = lector; + Try = retry; return this; } - public VMSSend SetPartner(string partner) + public VMSSend SetTryInterval(int sec) { - this.Partner = partner; + Interval = sec; return this; } - public VMSSend SetTest(bool test = true) + public VMSSend SetTTS(string tts) { - this.Test = test; + TTS = tts; return this; } - public VMSSend SetTry(int retry) + public VMSSend SetTTSLector(string lector) { - this.Try = retry; + TTSLector = lector; return this; } - public VMSSend SetTryInterval(int sec) + protected override Dictionary Files() { - this.Interval = sec; - return this; + Dictionary files = null; + + if (File != null && File.Length > 0) + { + files = new Dictionary(); + files.Add("file", File); + } + + return files; } - public VMSSend SetSkipGSM(bool flag) + protected override string Uri() { - this.SkipGSM = flag; - return this; + return "vms.do"; + } + + protected override void Validate() + { + if (To != null && Group != null) + { + throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); + } + + if ((TTS == null || TTS.Length < 1) && (File == null || File.Length == 0)) + { + throw new ArgumentException("Cannot send message without content!"); + } + + if (TTS != null && File != null) + { + throw new ArgumentException("Cannot send TTS and file at the same time"); + } } - + protected override NameValueCollection Values() + { + var collection = new NameValueCollection(); + + collection.Add("format", "json"); + + if (To != null) + { + collection.Add("to", string.Join(",", To)); + } + + if (From != null) + { + collection.Add("from", From); + } + + if (TTS != null) + { + collection.Add("tts", TTS); + } + + if (DateSent != null) + { + collection.Add("date", DateSent); + } + + if (Try > 0) + { + collection.Add("try", Try.ToString()); + } + + if (Interval > 0) + { + collection.Add("interval", Interval.ToString()); + } + + if (Partner != null) + { + collection.Add("partner_id", Partner); + } + + if (SkipGSM) + { + collection.Add("skip_gsm", "1"); + } + + if (TTSLector != null) + { + collection.Add("tts_lector", TTSLector); + } + + if (Test) + { + collection.Add("test", "1"); + } + + if (Idx != null && Idx.Length > 0) + { + collection.Add("check_idx", IdxCheck ? "1" : "0"); + collection.Add("idx", string.Join("|", Idx)); + } + + return collection; + } } } diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index 78905d3..306e2e2 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -1,214 +1,211 @@ -using System; - -namespace SMSApi.Api -{ - public class ContactsFactory : Factory - { - public ContactsFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } - - public ContactsFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } - - public ContactsFactory(IClient client, Proxy proxy) : base(client, proxy) - { - } - - public SMSApi.Api.Action.ListContacts ListContacts() - { - SMSApi.Api.Action.ListContacts action = new SMSApi.Api.Action.ListContacts(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.CreateContact CreateContact() - { - SMSApi.Api.Action.CreateContact action = new SMSApi.Api.Action.CreateContact(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.DeleteContact DeleteContact(string contactId) - { - SMSApi.Api.Action.DeleteContact action = new SMSApi.Api.Action.DeleteContact(contactId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.GetContact GetContact(string contactId) - { - SMSApi.Api.Action.GetContact action = new SMSApi.Api.Action.GetContact(contactId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.EditContact EditContact(string contactId) - { - SMSApi.Api.Action.EditContact action = new SMSApi.Api.Action.EditContact(contactId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.ListGroups ListGroups() - { - SMSApi.Api.Action.ListGroups action = new SMSApi.Api.Action.ListGroups(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.CreateGroup CreateGroup() - { - SMSApi.Api.Action.CreateGroup action = new SMSApi.Api.Action.CreateGroup(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.DeleteGroup DeleteGroup(string groupId) - { - SMSApi.Api.Action.DeleteGroup action = new SMSApi.Api.Action.DeleteGroup(groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.GetGroup GetGroup(string groupId) - { - SMSApi.Api.Action.GetGroup action = new SMSApi.Api.Action.GetGroup(groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.EditGroup EditGroup(string groupId) - { - SMSApi.Api.Action.EditGroup action = new SMSApi.Api.Action.EditGroup(groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.ListGroupPermissions ListGroupPermissions(string groupId) - { - SMSApi.Api.Action.ListGroupPermissions action = new SMSApi.Api.Action.ListGroupPermissions(groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.ListFields ListFields() - { - SMSApi.Api.Action.ListFields action = new SMSApi.Api.Action.ListFields(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.CreateField CreateField() - { - SMSApi.Api.Action.CreateField action = new SMSApi.Api.Action.CreateField(); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.DeleteField DeleteField(string fieldId) - { - SMSApi.Api.Action.DeleteField action = new SMSApi.Api.Action.DeleteField(fieldId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.EditField EditField(string fieldId) - { - SMSApi.Api.Action.EditField action = new SMSApi.Api.Action.EditField(fieldId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.ListFieldOptions ListFieldOptions(string fieldId) - { - SMSApi.Api.Action.ListFieldOptions action = new SMSApi.Api.Action.ListFieldOptions(fieldId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.BindContactToGroup BindContactToGroup(string contactId, string groupId) - { - SMSApi.Api.Action.BindContactToGroup action = new SMSApi.Api.Action.BindContactToGroup(contactId, groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.UnbindContactFromGroup UnbindContactFromGroup(string contactId, string groupId) - { - SMSApi.Api.Action.UnbindContactFromGroup action = new SMSApi.Api.Action.UnbindContactFromGroup(contactId, groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.ListContactGroups ListContactGroups(string contactId) - { - SMSApi.Api.Action.ListContactGroups action = new SMSApi.Api.Action.ListContactGroups(contactId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.GetContactGroup GetContactGroup(string contactId, string groupId) - { - SMSApi.Api.Action.GetContactGroup action = new SMSApi.Api.Action.GetContactGroup(contactId, groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.CreateGroupPermission CreateGroupPermission(string groupId) - { - SMSApi.Api.Action.CreateGroupPermission action = new SMSApi.Api.Action.CreateGroupPermission(groupId); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.DeleteGroupPermission DeleteGroupPermission(string groupId, string username) - { - SMSApi.Api.Action.DeleteGroupPermission action = new SMSApi.Api.Action.DeleteGroupPermission(groupId, username); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.GetGroupPermission GetGroupPermission(string groupId, string username) - { - SMSApi.Api.Action.GetGroupPermission action = new SMSApi.Api.Action.GetGroupPermission(groupId, username); - action.Client(client); - action.Proxy(proxy); - return action; - } - - public SMSApi.Api.Action.EditGroupPermission EditGroupPermission(string groupId, string username) - { - SMSApi.Api.Action.EditGroupPermission action = new SMSApi.Api.Action.EditGroupPermission(groupId, username); - action.Client(client); - action.Proxy(proxy); - return action; - } - } +using SMSApi.Api.Action; + +namespace SMSApi.Api +{ + public class ContactsFactory : Factory + { + public ContactsFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } + + public ContactsFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } + + public ContactsFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } + + public BindContactToGroup BindContactToGroup(string contactId, string groupId) + { + var action = new BindContactToGroup(contactId, groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public CreateContact CreateContact() + { + var action = new CreateContact(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public CreateField CreateField() + { + var action = new CreateField(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public CreateGroup CreateGroup() + { + var action = new CreateGroup(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public CreateGroupPermission CreateGroupPermission(string groupId) + { + var action = new CreateGroupPermission(groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public DeleteContact DeleteContact(string contactId) + { + var action = new DeleteContact(contactId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public DeleteField DeleteField(string fieldId) + { + var action = new DeleteField(fieldId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public DeleteGroup DeleteGroup(string groupId) + { + var action = new DeleteGroup(groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public DeleteGroupPermission DeleteGroupPermission(string groupId, string username) + { + var action = new DeleteGroupPermission(groupId, username); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public EditContact EditContact(string contactId) + { + var action = new EditContact(contactId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public EditField EditField(string fieldId) + { + var action = new EditField(fieldId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public EditGroup EditGroup(string groupId) + { + var action = new EditGroup(groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public EditGroupPermission EditGroupPermission(string groupId, string username) + { + var action = new EditGroupPermission(groupId, username); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public GetContact GetContact(string contactId) + { + var action = new GetContact(contactId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public GetContactGroup GetContactGroup(string contactId, string groupId) + { + var action = new GetContactGroup(contactId, groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public GetGroup GetGroup(string groupId) + { + var action = new GetGroup(groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public GetGroupPermission GetGroupPermission(string groupId, string username) + { + var action = new GetGroupPermission(groupId, username); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListContactGroups ListContactGroups(string contactId) + { + var action = new ListContactGroups(contactId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListContacts ListContacts() + { + var action = new ListContacts(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListFieldOptions ListFieldOptions(string fieldId) + { + var action = new ListFieldOptions(fieldId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListFields ListFields() + { + var action = new ListFields(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListGroupPermissions ListGroupPermissions(string groupId) + { + var action = new ListGroupPermissions(groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public ListGroups ListGroups() + { + var action = new ListGroups(); + action.Client(client); + action.Proxy(proxy); + return action; + } + + public UnbindContactFromGroup UnbindContactFromGroup(string contactId, string groupId) + { + var action = new UnbindContactFromGroup(contactId, groupId); + action.Client(client); + action.Proxy(proxy); + return action; + } + } } - diff --git a/smsapi/Api/Factory.cs b/smsapi/Api/Factory.cs index f8703c6..67df9cc 100644 --- a/smsapi/Api/Factory.cs +++ b/smsapi/Api/Factory.cs @@ -1,60 +1,59 @@ - -using System.Collections.Generic; +using System.Collections.Generic; -namespace SMSApi.Api -{ - public abstract class Factory - { +namespace SMSApi.Api +{ + public abstract class Factory + { private static Dictionary _addresses = - new Dictionary + new Dictionary { { ProxyAddress.SmsApiPl, "https://api.smsapi.pl/" }, { ProxyAddress.BackupSmsApiPl, "https://api2.smsapi.pl/" }, { ProxyAddress.SmsApiCom, "https://api.smsapi.com/" }, { ProxyAddress.BackupSmsApiCom, "https://api2.smsapi.com/" } - }; - - protected IClient client; - protected Proxy proxy; - - public Factory(ProxyAddress address = ProxyAddress.SmsApiPl) - { - Proxy(address); - } - - public Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : this(address) - { - Client(client); + }; + + protected IClient client; + protected Proxy proxy; + + public Factory(ProxyAddress address = ProxyAddress.SmsApiPl) + { + Proxy(address); + } + + public Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : this(address) + { + Client(client); } - public Factory(IClient client, Proxy proxy) + public Factory(IClient client, Proxy proxy) { Client(client); Proxy(proxy); } - public void Client(IClient client) - { - this.client = client; + public void Client(IClient client) + { + this.client = client; if (proxy != null) { proxy.Authentication(client); - } - } - - public void Proxy(Proxy proxy) - { - this.proxy = proxy; + } + } + + public void Proxy(Proxy proxy) + { + this.proxy = proxy; if (proxy != null) { proxy.Authentication(client); - } - } - + } + } + public void Proxy(ProxyAddress address) { Proxy(new ProxyHTTP(_addresses[address])); - } - } + } + } } diff --git a/smsapi/Api/HLRFactory.cs b/smsapi/Api/HLRFactory.cs index 75a3493..b4ed560 100644 --- a/smsapi/Api/HLRFactory.cs +++ b/smsapi/Api/HLRFactory.cs @@ -1,37 +1,31 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SMSApi.Api -{ - public class HLRFactory : Factory - { - public HLRFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } - - public HLRFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } +using SMSApi.Api.Action; + +namespace SMSApi.Api +{ + public class HLRFactory : Factory + { + public HLRFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } - public HLRFactory(IClient client, Proxy proxy) + public HLRFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } + + public HLRFactory(IClient client, Proxy proxy) : base(client, proxy) + { } + + public HLRCheckNumber ActionCheckNumber(string number = null) { - } + var action = new HLRCheckNumber(); + + action.Client(client); + action.Proxy(proxy); - public SMSApi.Api.Action.HLRCheckNumber ActionCheckNumber(string number = null) - { - var action = new SMSApi.Api.Action.HLRCheckNumber(); - - action.Client(client); - action.Proxy(proxy); - - action.SetNumber(number); - - return action; - } - } + action.SetNumber(number); + + return action; + } + } } diff --git a/smsapi/Api/MMSFactory.cs b/smsapi/Api/MMSFactory.cs index 6d274f3..df20b2f 100644 --- a/smsapi/Api/MMSFactory.cs +++ b/smsapi/Api/MMSFactory.cs @@ -1,26 +1,24 @@ - +using SMSApi.Api.Action; + namespace SMSApi.Api { public class MMSFactory : Factory { - public MMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } + public MMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } - public MMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } + public MMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } - public MMSFactory(IClient client, Proxy proxy) - : base(client, proxy) - { - } + public MMSFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } - public SMSApi.Api.Action.MMSDelete ActionDelete(string id = null) + public MMSDelete ActionDelete(string id = null) { - SMSApi.Api.Action.MMSDelete action = new SMSApi.Api.Action.MMSDelete(); + var action = new MMSDelete(); action.Client(client); action.Proxy(proxy); @@ -29,9 +27,9 @@ public SMSApi.Api.Action.MMSDelete ActionDelete(string id = null) return action; } - public SMSApi.Api.Action.MMSGet ActionGet(string id = null) + public MMSGet ActionGet(string id = null) { - SMSApi.Api.Action.MMSGet action = new SMSApi.Api.Action.MMSGet(); + var action = new MMSGet(); action.Client(client); action.Proxy(proxy); @@ -40,9 +38,9 @@ public SMSApi.Api.Action.MMSGet ActionGet(string id = null) return action; } - public SMSApi.Api.Action.MMSGet ActionGet(string[] id) + public MMSGet ActionGet(string[] id) { - SMSApi.Api.Action.MMSGet action = new SMSApi.Api.Action.MMSGet(); + var action = new MMSGet(); action.Client(client); action.Proxy(proxy); @@ -51,15 +49,15 @@ public SMSApi.Api.Action.MMSGet ActionGet(string[] id) return action; } - public SMSApi.Api.Action.MMSSend ActionSend(string to = null) + public MMSSend ActionSend(string to = null) { - string[] tos = ( to == null ? null : new string[] { to } ); + string[] tos = to == null ? null : new[] { to }; return ActionSend(tos); } - public SMSApi.Api.Action.MMSSend ActionSend(string[] to) + public MMSSend ActionSend(string[] to) { - SMSApi.Api.Action.MMSSend action = new SMSApi.Api.Action.MMSSend(); + var action = new MMSSend(); action.Client(client); action.Proxy(proxy); action.SetTo(to); diff --git a/smsapi/Api/PhonebookFactory.cs b/smsapi/Api/PhonebookFactory.cs index 4f95eb2..914815f 100644 --- a/smsapi/Api/PhonebookFactory.cs +++ b/smsapi/Api/PhonebookFactory.cs @@ -1,142 +1,137 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SMSApi.Api -{ - [Obsolete("use ContactsFactory instead")] - public class PhonebookFactory : Factory - { - public PhonebookFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } - - public PhonebookFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { +using System; +using SMSApi.Api.Action; + +namespace SMSApi.Api +{ + [Obsolete("use ContactsFactory instead")] + public class PhonebookFactory : Factory + { + public PhonebookFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } + + public PhonebookFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } + + public PhonebookFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } + + public PhonebookContactAdd ActionContactAdd(string number = null) + { + var action = new PhonebookContactAdd(); + + action.Client(client); + action.Proxy(proxy); + + action.SetNumber(number); + + return action; + } + + public PhonebookContactDelete ActionContactDelete(string number = null) + { + var action = new PhonebookContactDelete(); + + action.Client(client); + action.Proxy(proxy); + + action.Number(number); + + return action; } - public PhonebookFactory(IClient client, Proxy proxy) - : base(client, proxy) - { + public PhonebookContactEdit ActionContactEdit(string number = null) + { + var action = new PhonebookContactEdit(); + + action.Client(client); + action.Proxy(proxy); + + action.Number(number); + + return action; + } + + public PhonebookContactGet ActionContactGet(string number = null) + { + var action = new PhonebookContactGet(); + + action.Client(client); + action.Proxy(proxy); + + action.Number(number); + + return action; + } + + public PhonebookContactList ActionContactList() + { + var action = new PhonebookContactList(); + + action.Client(client); + action.Proxy(proxy); + + return action; } - public SMSApi.Api.Action.PhonebookContactAdd ActionContactAdd(string number = null) - { - var action = new SMSApi.Api.Action.PhonebookContactAdd(); - - action.Client(client); - action.Proxy(proxy); - - action.SetNumber(number); - - return action; - } - - public SMSApi.Api.Action.PhonebookContactGet ActionContactGet(string number = null) - { - var action = new SMSApi.Api.Action.PhonebookContactGet(); - - action.Client(client); - action.Proxy(proxy); - - action.Number(number); - - return action; - } - - public SMSApi.Api.Action.PhonebookContactEdit ActionContactEdit(string number = null) - { - var action = new SMSApi.Api.Action.PhonebookContactEdit(); - - action.Client(client); - action.Proxy(proxy); - - action.Number(number); - - return action; - } - - public SMSApi.Api.Action.PhonebookContactDelete ActionContactDelete(string number = null) - { - var action = new SMSApi.Api.Action.PhonebookContactDelete(); - - action.Client(client); - action.Proxy(proxy); - - action.Number(number); - - return action; - } - - public SMSApi.Api.Action.PhonebookContactList ActionContactList() - { - var action = new SMSApi.Api.Action.PhonebookContactList(); - - action.Client(client); - action.Proxy(proxy); - - return action; - } - - public SMSApi.Api.Action.PhonebookGroupAdd ActionGroupAdd(string name = null) - { - var action = new SMSApi.Api.Action.PhonebookGroupAdd(); - - action.Client(client); - action.Proxy(proxy); - - action.SetName(name); - - return action; - } - - public SMSApi.Api.Action.PhonebookGroupEdit ActionGroupEdit(string name = null) - { - var action = new SMSApi.Api.Action.PhonebookGroupEdit(); - - action.Client(client); - action.Proxy(proxy); - - action.Name(name); - - return action; - } - - public SMSApi.Api.Action.PhonebookGroupGet ActionGroupGet(string name = null) - { - var action = new SMSApi.Api.Action.PhonebookGroupGet(); - - action.Client(client); - action.Proxy(proxy); - - action.Name(name); - - return action; - } - - public SMSApi.Api.Action.PhonebookGroupDelete ActionGroupDelete(string name = null) - { - var action = new SMSApi.Api.Action.PhonebookGroupDelete(); - - action.Client(client); - action.Proxy(proxy); - - action.Name(name); - - return action; - } - - public SMSApi.Api.Action.PhonebookGroupList ActionGroupList() - { - var action = new SMSApi.Api.Action.PhonebookGroupList(); - - action.Client(client); - action.Proxy(proxy); - - return action; - } - } + public PhonebookGroupAdd ActionGroupAdd(string name = null) + { + var action = new PhonebookGroupAdd(); + + action.Client(client); + action.Proxy(proxy); + + action.SetName(name); + + return action; + } + + public PhonebookGroupDelete ActionGroupDelete(string name = null) + { + var action = new PhonebookGroupDelete(); + + action.Client(client); + action.Proxy(proxy); + + action.Name(name); + + return action; + } + + public PhonebookGroupEdit ActionGroupEdit(string name = null) + { + var action = new PhonebookGroupEdit(); + + action.Client(client); + action.Proxy(proxy); + + action.Name(name); + + return action; + } + + public PhonebookGroupGet ActionGroupGet(string name = null) + { + var action = new PhonebookGroupGet(); + + action.Client(client); + action.Proxy(proxy); + + action.Name(name); + + return action; + } + + public PhonebookGroupList ActionGroupList() + { + var action = new PhonebookGroupList(); + + action.Client(client); + action.Proxy(proxy); + + return action; + } + } } diff --git a/smsapi/Api/Response/Array.cs b/smsapi/Api/Response/Array.cs index 371cf6c..4d3385f 100644 --- a/smsapi/Api/Response/Array.cs +++ b/smsapi/Api/Response/Array.cs @@ -1,19 +1,21 @@ -using System.Runtime.Serialization; +using System.Collections.Generic; +using System.Runtime.Serialization; namespace SMSApi.Api.Response { [DataContract] public class Array : Countable { - protected Array() : base() { } + [DataMember(Name = "list", IsRequired = true)] + public readonly List List; - public Array(System.Collections.Generic.List list) + public Array(List list) : base(list.Count) { - this.List = list; + List = list; } - [DataMember(Name = "list", IsRequired = true)] - public readonly System.Collections.Generic.List List; + protected Array() + { } } } diff --git a/smsapi/Api/Response/Base.cs b/smsapi/Api/Response/Base.cs index b6bc364..e73a722 100644 --- a/smsapi/Api/Response/Base.cs +++ b/smsapi/Api/Response/Base.cs @@ -5,21 +5,21 @@ namespace SMSApi.Api.Response [DataContract] public class Base { - public Base() - { - ErrorCode = 0; - ErrorMessage = ""; - } - [DataMember(Name = "error", IsRequired = false)] public readonly int ErrorCode; [DataMember(Name = "message", IsRequired = false)] public readonly string ErrorMessage; + public Base() + { + ErrorCode = 0; + ErrorMessage = ""; + } + public bool isError() { - return (ErrorCode != 0); + return ErrorCode != 0; } } } diff --git a/smsapi/Api/Response/BasicCollection.cs b/smsapi/Api/Response/BasicCollection.cs index 5a96f29..de11817 100644 --- a/smsapi/Api/Response/BasicCollection.cs +++ b/smsapi/Api/Response/BasicCollection.cs @@ -1,38 +1,59 @@ using System; +using System.Collections.Generic; using System.Runtime.Serialization; namespace SMSApi.Api.Response { - [DataContract] - public class BasicCollection : Countable - { - protected BasicCollection() : base() { } - - [DataMember(Name = "size", IsRequired = false)] - protected int size; - - public int Size { get { if (size == 0) return base.Count; return size; } } - - [DataMember(Name = "collection", IsRequired = false)] - protected System.Collections.Generic.List collection; - - [Obsolete("use Size instead")] - public override int Count { get { return Size; } } - - public System.Collections.Generic.List Collection - { - get - { - if (collection == null) - collection = new System.Collections.Generic.List(); - return collection; - } - - set { } - } - - [Obsolete("use Collection instead")] - [DataMember(Name = "list", IsRequired = false)] - public System.Collections.Generic.List List { get { return Collection; } protected set { collection = value; } } - } + [DataContract] + public class BasicCollection : Countable + { + [DataMember(Name = "collection", IsRequired = false)] + protected List collection; + + [DataMember(Name = "size", IsRequired = false)] + protected int size; + + protected BasicCollection() + { } + + public List Collection + { + get + { + if (collection == null) + { + collection = new List(); + } + + return collection; + } + + set + { } + } + + [Obsolete("use Size instead")] + public override int Count => Size; + + [Obsolete("use Collection instead")] + [DataMember(Name = "list", IsRequired = false)] + public List List + { + get => Collection; + protected set => collection = value; + } + + public int Size + { + get + { + if (size == 0) + { + return base.Count; + } + + return size; + } + } + } } diff --git a/smsapi/Api/Response/CheckNumber.cs b/smsapi/Api/Response/CheckNumber.cs index 23223da..c9765cd 100644 --- a/smsapi/Api/Response/CheckNumber.cs +++ b/smsapi/Api/Response/CheckNumber.cs @@ -6,22 +6,26 @@ namespace SMSApi.Api.Response [DataContract] public class CheckNumber : Countable { - protected CheckNumber() : base() { } - [DataMember(Name = "list", IsRequired = true)] private List list; + protected CheckNumber() + { } + public List List { get { if (list == null) + { list = new List(); + } return list; } - set { } + set + { } } } } diff --git a/smsapi/Api/Response/Contact.cs b/smsapi/Api/Response/Contact.cs index 212aa06..ea37498 100644 --- a/smsapi/Api/Response/Contact.cs +++ b/smsapi/Api/Response/Contact.cs @@ -3,84 +3,132 @@ namespace SMSApi.Api.Response { - [DataContract] - public class Contact : Base - { - public const string MaleGender = "male"; - public const string FemaleGender = "female"; - public const string UndefinedGender = "undefined"; - - public Contact() : base() { } - - [DataMember(Name = "id", IsRequired = false)] - public readonly string Id; - - [DataMember(Name = "idx", IsRequired = false)] - public readonly string Idx; - - [DataMember(Name = "first_name", IsRequired = false)] - public readonly string FirstName; - - [DataMember(Name = "last_name", IsRequired = false)] - public readonly string LastName; - - private DateTime? birthdayDate; - - [DataMember(Name = "birthday_date", IsRequired = false)] - private string BirthdayDateSerializationHelper { set { if (value != null) birthdayDate = DateTime.Parse(value); } get { return ""; } } - - public DateTime? BirthdayDate { get { return birthdayDate; } } - - [DataMember(Name = "phone_number", IsRequired = false)] - public readonly string PhoneNumber; - - [DataMember(Name = "email", IsRequired = false)] - public readonly string Email; - - [DataMember(Name = "gender", IsRequired = false)] - public readonly string Gender; - - [DataMember(Name = "city", IsRequired = false)] - public readonly string City; - - [DataMember(Name = "source", IsRequired = false)] - public readonly string Source; - - private DateTime? dateCreated; - [DataMember(Name = "date_created", IsRequired = false)] - private string DateCreatedSerializationHelper { set { dateCreated = DateTime.Parse(value); } get { return ""; } } - public DateTime? DateCreated { get { return dateCreated; } } - - private DateTime? dateUpdated; - [DataMember(Name = "date_updated", IsRequired = false)] - private string DateUpdatedSerializationHelper { set { dateUpdated = DateTime.Parse(value); } get { return ""; } } - public DateTime? DateUpdated { get { return dateUpdated; } } - - [DataMember(Name = "description", IsRequired = false)] - public readonly string Description; - - [Obsolete("use Id instead")] - [DataMember(Name = "number", IsRequired = false)] - public readonly string Number; - - [Obsolete("use Description instead")] - [DataMember(Name = "info", IsRequired = false)] - public readonly string info; - - [Obsolete("use BirthdayDate instead")] - [DataMember(Name = "birthday", IsRequired = false)] - public readonly string Birthday; - - [DataMember(Name = "date_add", IsRequired = false)] - private uint DateAddSerializationHelper { set { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); dateCreated = origin.AddSeconds(value); } get { return 0; } } - - [Obsolete("use DateCreated instead")] - public uint DateAdd { get { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return dateCreated != null ? (uint)(dateCreated.Value.ToUniversalTime() - origin).TotalSeconds : 0; } } - - [DataMember(Name = "date_mod", IsRequired = false)] - private uint DateModSerializationHelper { set { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); dateUpdated = origin.AddSeconds(value); } get { return 0; } } - - [Obsolete("use DateUpdated instead")] - public uint DateMod { get { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return dateUpdated != null? (uint)(dateUpdated.Value.ToUniversalTime() - origin).TotalSeconds : 0; } } - } + [DataContract] + public class Contact : Base + { + public const string FemaleGender = "female"; + public const string MaleGender = "male"; + public const string UndefinedGender = "undefined"; + + [Obsolete("use BirthdayDate instead")] + [DataMember(Name = "birthday", IsRequired = false)] + public readonly string Birthday; + + [DataMember(Name = "city", IsRequired = false)] + public readonly string City; + + [DataMember(Name = "description", IsRequired = false)] + public readonly string Description; + + [DataMember(Name = "email", IsRequired = false)] + public readonly string Email; + + [DataMember(Name = "first_name", IsRequired = false)] + public readonly string FirstName; + + [DataMember(Name = "gender", IsRequired = false)] + public readonly string Gender; + + [DataMember(Name = "id", IsRequired = false)] + public readonly string Id; + + [DataMember(Name = "idx", IsRequired = false)] + public readonly string Idx; + + [Obsolete("use Description instead")] + [DataMember(Name = "info", IsRequired = false)] + public readonly string info; + + [DataMember(Name = "last_name", IsRequired = false)] + public readonly string LastName; + + [Obsolete("use Id instead")] + [DataMember(Name = "number", IsRequired = false)] + public readonly string Number; + + [DataMember(Name = "phone_number", IsRequired = false)] + public readonly string PhoneNumber; + + [DataMember(Name = "source", IsRequired = false)] + public readonly string Source; + + private DateTime? dateCreated; + + private DateTime? dateUpdated; + + public DateTime? BirthdayDate { get; private set; } + + [Obsolete("use DateCreated instead")] + public uint DateAdd + { + get + { + var origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return dateCreated != null ? (uint)(dateCreated.Value.ToUniversalTime() - origin).TotalSeconds : 0; + } + } + + public DateTime? DateCreated => dateCreated; + + [Obsolete("use DateUpdated instead")] + public uint DateMod + { + get + { + var origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return dateUpdated != null ? (uint)(dateUpdated.Value.ToUniversalTime() - origin).TotalSeconds : 0; + } + } + + public DateTime? DateUpdated => dateUpdated; + + [DataMember(Name = "birthday_date", IsRequired = false)] + private string BirthdayDateSerializationHelper + { + set + { + if (value != null) + { + BirthdayDate = DateTime.Parse(value); + } + } + get => ""; + } + + [DataMember(Name = "date_add", IsRequired = false)] + private uint DateAddSerializationHelper + { + set + { + var origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + dateCreated = origin.AddSeconds(value); + } + get => 0; + } + + [DataMember(Name = "date_created", IsRequired = false)] + private string DateCreatedSerializationHelper + { + set => dateCreated = DateTime.Parse(value); + get => ""; + } + + [DataMember(Name = "date_mod", IsRequired = false)] + private uint DateModSerializationHelper + { + set + { + var origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + dateUpdated = origin.AddSeconds(value); + } + get => 0; + } + + [DataMember(Name = "date_updated", IsRequired = false)] + private string DateUpdatedSerializationHelper + { + set => dateUpdated = DateTime.Parse(value); + get => ""; + } + } } diff --git a/smsapi/Api/Response/Contacts.cs b/smsapi/Api/Response/Contacts.cs index 708d2f3..9816c3a 100644 --- a/smsapi/Api/Response/Contacts.cs +++ b/smsapi/Api/Response/Contacts.cs @@ -3,11 +3,11 @@ namespace SMSApi.Api.Response { - [DataContract] - public class Contacts : BasicCollection - { - [Obsolete("")] - [DataMember(Name = "total", IsRequired = false)] - public readonly int Total; - } + [DataContract] + public class Contacts : BasicCollection + { + [Obsolete("")] + [DataMember(Name = "total", IsRequired = false)] + public readonly int Total; + } } diff --git a/smsapi/Api/Response/Countable.cs b/smsapi/Api/Response/Countable.cs index 2c19b80..4cf8f93 100644 --- a/smsapi/Api/Response/Countable.cs +++ b/smsapi/Api/Response/Countable.cs @@ -2,17 +2,21 @@ namespace SMSApi.Api.Response { - [DataContract] - public class Countable /*: Base*/ - { - protected Countable(int count = 0) : base() - { - this.count = count; - } + [DataContract] + public class Countable /*: Base*/ + { + private int count; - private int count; + protected Countable(int count = 0) + { + this.count = count; + } - [DataMember(Name = "count", IsRequired = false)] - public virtual int Count { get { return count; } private set { count = value; } } - } + [DataMember(Name = "count", IsRequired = false)] + public virtual int Count + { + get => count; + private set => count = value; + } + } } diff --git a/smsapi/Api/Response/Error.cs b/smsapi/Api/Response/Error.cs index 123d4d7..86c059e 100644 --- a/smsapi/Api/Response/Error.cs +++ b/smsapi/Api/Response/Error.cs @@ -5,21 +5,21 @@ namespace SMSApi.Api.Response [DataContract] public class Error { - public Error() - { - Code = "0"; - Message = ""; - } - [DataMember(Name = "error", IsRequired = false)] public readonly string Code; [DataMember(Name = "message", IsRequired = true)] public readonly string Message; + public Error() + { + Code = "0"; + Message = ""; + } + public bool isError() { - return !string.IsNullOrEmpty(Code) && (Code != "0"); + return !string.IsNullOrEmpty(Code) && Code != "0"; } } } diff --git a/smsapi/Api/Response/Field.cs b/smsapi/Api/Response/Field.cs index ed4d3d2..bfa9824 100644 --- a/smsapi/Api/Response/Field.cs +++ b/smsapi/Api/Response/Field.cs @@ -2,22 +2,22 @@ namespace SMSApi.Api.Response { - [DataContract] - public class Field - { - public const string TextType = "TEXT"; - public const string DateType = "DATE"; - public const string EmailType = "EMAIL"; - public const string PhoneNumberType = "PHONE_NUMBER"; - public const string NumberType = "NUMBER"; + [DataContract] + public class Field + { + public const string DateType = "DATE"; + public const string EmailType = "EMAIL"; + public const string NumberType = "NUMBER"; + public const string PhoneNumberType = "PHONE_NUMBER"; + public const string TextType = "TEXT"; - [DataMember(Name = "id", IsRequired = false)] - public readonly string Id; + [DataMember(Name = "id", IsRequired = false)] + public readonly string Id; - [DataMember(Name = "name", IsRequired = false)] - public readonly string Name; + [DataMember(Name = "name", IsRequired = false)] + public readonly string Name; - [DataMember(Name = "type", IsRequired = false)] - public readonly string Type; - } + [DataMember(Name = "type", IsRequired = false)] + public readonly string Type; + } } diff --git a/smsapi/Api/Response/FieldOption.cs b/smsapi/Api/Response/FieldOption.cs index 29ea42d..0c26c13 100644 --- a/smsapi/Api/Response/FieldOption.cs +++ b/smsapi/Api/Response/FieldOption.cs @@ -2,13 +2,13 @@ namespace SMSApi.Api.Response { - [DataContract] - public class FieldOption - { - [DataMember(Name = "name", IsRequired = false)] - public readonly string Name; + [DataContract] + public class FieldOption + { + [DataMember(Name = "name", IsRequired = false)] + public readonly string Name; - [DataMember(Name = "value", IsRequired = false)] - public readonly string Value; - } + [DataMember(Name = "value", IsRequired = false)] + public readonly string Value; + } } diff --git a/smsapi/Api/Response/FieldOptions.cs b/smsapi/Api/Response/FieldOptions.cs index 0bf0aaa..f59f20e 100644 --- a/smsapi/Api/Response/FieldOptions.cs +++ b/smsapi/Api/Response/FieldOptions.cs @@ -2,9 +2,10 @@ namespace SMSApi.Api.Response { - [DataContract] - public class FieldOptions : BasicCollection - { - private FieldOptions() : base() { } - } + [DataContract] + public class FieldOptions : BasicCollection + { + private FieldOptions() + { } + } } diff --git a/smsapi/Api/Response/Fields.cs b/smsapi/Api/Response/Fields.cs index df7f10b..a4bc83a 100644 --- a/smsapi/Api/Response/Fields.cs +++ b/smsapi/Api/Response/Fields.cs @@ -2,9 +2,10 @@ namespace SMSApi.Api.Response { - [DataContract] - public class Fields : BasicCollection - { - private Fields() : base() { } - } + [DataContract] + public class Fields : BasicCollection + { + private Fields() + { } + } } diff --git a/smsapi/Api/Response/Group.cs b/smsapi/Api/Response/Group.cs index 624e45a..42a2c64 100644 --- a/smsapi/Api/Response/Group.cs +++ b/smsapi/Api/Response/Group.cs @@ -1,64 +1,81 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Runtime.Serialization; namespace SMSApi.Api.Response { - [DataContract] - public class Group : Base - { - private Group() : base() { } - - [DataMember(Name = "id", IsRequired = false)] - public readonly string Id; - - [DataMember(Name = "name", IsRequired = true)] - public readonly string Name; - - private int contactsCount; - [DataMember(Name = "contacts_count", IsRequired = false)] - public int ContactsCount { get { return contactsCount; } private set { contactsCount = value; } } - - private DateTime? dateCreated; - [DataMember(Name = "date_created", IsRequired = false)] - private string DateCreatedSerializationHelper { set { dateCreated = DateTime.Parse(value); } get { return ""; } } - public DateTime? DateCreated { get { return dateCreated; } } - - private DateTime? dateUpdated; - [DataMember(Name = "date_updated", IsRequired = false)] - private string DateUpdatedSerializationHelper { set { dateUpdated = DateTime.Parse(value); } get { return ""; } } - public DateTime? DateUpdated { get { return dateUpdated; } } - - private string description; - [DataMember(Name = "description", IsRequired = false)] - public string Description { get { return description; } private set { description = value; } } - - [DataMember(Name = "created_by", IsRequired = false)] - public readonly string CreatedBy; - - [DataMember(Name = "idx", IsRequired = false)] - public readonly string Idx; - - [DataMember(Name = "permissions", IsRequired = false)] - private System.Collections.Generic.List permissions; - public System.Collections.Generic.List Permissions - { - get - { - if (permissions == null) - permissions = new System.Collections.Generic.List(); - return permissions; - } - } - - [Obsolete("use Description instead")] - [DataMember(Name = "info", IsRequired = false)] - public string Info { get { return Description; } private set { Description = value; } } - - [Obsolete("use ContactsCount instead")] - [DataMember(Name = "numbers_count", IsRequired = false)] - public uint NumbersCount { get { return (uint)ContactsCount; } private set { ContactsCount = (int)value; } } - } + [DataContract] + public class Group : Base + { + [DataMember(Name = "created_by", IsRequired = false)] + public readonly string CreatedBy; + + [DataMember(Name = "id", IsRequired = false)] + public readonly string Id; + + [DataMember(Name = "idx", IsRequired = false)] + public readonly string Idx; + + [DataMember(Name = "name", IsRequired = true)] + public readonly string Name; + + [DataMember(Name = "permissions", IsRequired = false)] + private List permissions; + + private Group() + { } + + [DataMember(Name = "contacts_count", IsRequired = false)] + public int ContactsCount { get; private set; } + + public DateTime? DateCreated { get; private set; } + + public DateTime? DateUpdated { get; private set; } + + [DataMember(Name = "description", IsRequired = false)] + public string Description { get; private set; } + + [Obsolete("use Description instead")] + [DataMember(Name = "info", IsRequired = false)] + public string Info + { + get => Description; + private set => Description = value; + } + + [Obsolete("use ContactsCount instead")] + [DataMember(Name = "numbers_count", IsRequired = false)] + public uint NumbersCount + { + get => (uint)ContactsCount; + private set => ContactsCount = (int)value; + } + + public List Permissions + { + get + { + if (permissions == null) + { + permissions = new List(); + } + + return permissions; + } + } + + [DataMember(Name = "date_created", IsRequired = false)] + private string DateCreatedSerializationHelper + { + set => DateCreated = DateTime.Parse(value); + get => ""; + } + + [DataMember(Name = "date_updated", IsRequired = false)] + private string DateUpdatedSerializationHelper + { + set => DateUpdated = DateTime.Parse(value); + get => ""; + } + } } diff --git a/smsapi/Api/Response/GroupPermission.cs b/smsapi/Api/Response/GroupPermission.cs index f6f4860..72e942c 100644 --- a/smsapi/Api/Response/GroupPermission.cs +++ b/smsapi/Api/Response/GroupPermission.cs @@ -1,26 +1,23 @@ -using System; using System.Runtime.Serialization; namespace SMSApi.Api.Response { - [DataContract] - public class GroupPermission : Base - { - public GroupPermission() : base() { } + [DataContract] + public class GroupPermission : Base + { + [DataMember(Name = "group_id", IsRequired = false)] + public readonly string GroupId; - [DataMember(Name = "group_id", IsRequired = false)] - public readonly string GroupId; - - [DataMember(Name = "username", IsRequired = false)] - public readonly string Username; + [DataMember(Name = "read", IsRequired = false)] + public readonly bool Read; - [DataMember(Name = "write", IsRequired = false)] - public readonly bool Write; + [DataMember(Name = "send", IsRequired = false)] + public readonly bool Send; - [DataMember(Name = "read", IsRequired = false)] - public readonly bool Read; + [DataMember(Name = "username", IsRequired = false)] + public readonly string Username; - [DataMember(Name = "send", IsRequired = false)] - public readonly bool Send; - } + [DataMember(Name = "write", IsRequired = false)] + public readonly bool Write; + } } diff --git a/smsapi/Api/Response/GroupPermissions.cs b/smsapi/Api/Response/GroupPermissions.cs index 79298b1..ce6bab7 100644 --- a/smsapi/Api/Response/GroupPermissions.cs +++ b/smsapi/Api/Response/GroupPermissions.cs @@ -1,11 +1,11 @@ -using System; using System.Runtime.Serialization; namespace SMSApi.Api.Response { - [DataContract] - public class GroupPermissions : BasicCollection - { - private GroupPermissions() : base() { } - } + [DataContract] + public class GroupPermissions : BasicCollection + { + private GroupPermissions() + { } + } } diff --git a/smsapi/Api/Response/Groups.cs b/smsapi/Api/Response/Groups.cs index 715551d..45a0b55 100644 --- a/smsapi/Api/Response/Groups.cs +++ b/smsapi/Api/Response/Groups.cs @@ -5,6 +5,7 @@ namespace SMSApi.Api.Response [DataContract] public class Groups : BasicCollection { - private Groups() : base() { } + private Groups() + { } } } diff --git a/smsapi/Api/Response/MessageStatus.cs b/smsapi/Api/Response/MessageStatus.cs index 3eb9bd0..7c64400 100644 --- a/smsapi/Api/Response/MessageStatus.cs +++ b/smsapi/Api/Response/MessageStatus.cs @@ -5,7 +5,25 @@ namespace SMSApi.Api.Response [DataContract] public class MessageStatus { - private MessageStatus() + [DataMember(Name = "error", IsRequired = false)] + public readonly string Error; + + [DataMember(Name = "id", IsRequired = true)] + public readonly string ID; + + [DataMember(Name = "idx", IsRequired = false)] + public readonly string IDx; + + [DataMember(Name = "number", IsRequired = true)] + public readonly string Number; + + [DataMember(Name = "points", IsRequired = true)] + public readonly double Points; + + [DataMember(Name = "status", IsRequired = true)] + public readonly string Status; + + private MessageStatus() { ID = ""; Points = 0; @@ -17,38 +35,37 @@ private MessageStatus() public bool isError() { - if (ID == null || ID.Length == 0) return true; - if (Error != null) return true; - + if (ID == null || ID.Length == 0) + { + return true; + } + + if (Error != null) + { + return true; + } + return false; } public bool isFinal() { - if (isError()) return true; + if (isError()) + { + return true; + } - if (Status.Equals("QUEUE")) return false; - if (Status.Equals("SENT")) return false; + if (Status.Equals("QUEUE")) + { + return false; + } + + if (Status.Equals("SENT")) + { + return false; + } return true; } - - [DataMember(Name = "id", IsRequired = true)] - public readonly string ID; - - [DataMember(Name = "points", IsRequired = true)] - public readonly double Points; - - [DataMember(Name = "number", IsRequired = true)] - public readonly string Number; - - [DataMember(Name = "status", IsRequired = true)] - public readonly string Status; - - [DataMember(Name = "error", IsRequired = false)] - public readonly string Error; - - [DataMember(Name = "idx", IsRequired = false)] - public readonly string IDx; } } diff --git a/smsapi/Api/Response/NumberStatus.cs b/smsapi/Api/Response/NumberStatus.cs index 88e27dc..8a32df8 100644 --- a/smsapi/Api/Response/NumberStatus.cs +++ b/smsapi/Api/Response/NumberStatus.cs @@ -5,40 +5,26 @@ namespace SMSApi.Api.Response [DataContract] public class NumberStatus { - private NumberStatus() - { - ID = ""; - Number = ""; - MCC = 0; - MNC = 0; - Info = null; - Status = null; - Date = 0; - Ported = 0; - PortedFrom = 0; - Points = 0; - } + [DataMember(Name = "date", IsRequired = false)] + public readonly int Date; [DataMember(Name = "id", IsRequired = false)] public readonly string ID; - [DataMember(Name = "number", IsRequired = true)] - public readonly string Number; - + [DataMember(Name = "info", IsRequired = false)] + public readonly string Info; + [DataMember(Name = "mcc", IsRequired = false)] public readonly int MCC; [DataMember(Name = "mnc", IsRequired = false)] public readonly int MNC; - - [DataMember(Name = "info", IsRequired = false)] - public readonly string Info; - [DataMember(Name = "status", IsRequired = false)] - public readonly string Status; - - [DataMember(Name = "date", IsRequired = false)] - public readonly int Date; + [DataMember(Name = "number", IsRequired = true)] + public readonly string Number; + + [DataMember(Name = "price", IsRequired = false)] + public readonly double Points; [DataMember(Name = "ported", IsRequired = false)] public readonly int Ported; @@ -46,7 +32,21 @@ private NumberStatus() [DataMember(Name = "ported_from", IsRequired = false)] public readonly int PortedFrom; - [DataMember(Name = "price", IsRequired = false)] - public readonly double Points; + [DataMember(Name = "status", IsRequired = false)] + public readonly string Status; + + private NumberStatus() + { + ID = ""; + Number = ""; + MCC = 0; + MNC = 0; + Info = null; + Status = null; + Date = 0; + Ported = 0; + PortedFrom = 0; + Points = 0; + } } } diff --git a/smsapi/Api/Response/Points.cs b/smsapi/Api/Response/Points.cs index 6691a1e..6f29256 100644 --- a/smsapi/Api/Response/Points.cs +++ b/smsapi/Api/Response/Points.cs @@ -1,24 +1,29 @@ -using System.Runtime.Serialization; - -namespace SMSApi.Api.Response -{ - [DataContract] - public class Credits : Base - { - private Credits() : base() { } - - [DataMember(Name = "points", IsRequired = true)] - public readonly double Points; +using System.Runtime.Serialization; - [DataMember(Name = "proCount", IsRequired = false)] - public readonly int ProCount; - [DataMember(Name = "ecoCount", IsRequired = false)] +namespace SMSApi.Api.Response +{ + [DataContract] + public class Credits : Base + { + [DataMember(Name = "ecoCount", IsRequired = false)] public readonly int EcoCount; - [DataMember(Name = "mmsCount", IsRequired = false)] + + [DataMember(Name = "mmsCount", IsRequired = false)] public readonly int MmsCount; - [DataMember(Name = "vmsGsmCount", IsRequired = false)] + + [DataMember(Name = "points", IsRequired = true)] + public readonly double Points; + + [DataMember(Name = "proCount", IsRequired = false)] + public readonly int ProCount; + + [DataMember(Name = "vmsGsmCount", IsRequired = false)] public readonly int VmsGsmCount; + [DataMember(Name = "vmsLandCount", IsRequired = false)] - public readonly int VmsLandCount; - } + public readonly int VmsLandCount; + + private Credits() + { } + } } diff --git a/smsapi/Api/Response/Sender.cs b/smsapi/Api/Response/Sender.cs index 91e1e73..39e5a91 100644 --- a/smsapi/Api/Response/Sender.cs +++ b/smsapi/Api/Response/Sender.cs @@ -5,13 +5,13 @@ namespace SMSApi.Api.Response [DataContract] public class Sender { + [DataMember(Name = "default", IsRequired = true)] + public readonly bool Default; + [DataMember(Name = "sender", IsRequired = true)] public readonly string Name; [DataMember(Name = "status", IsRequired = true)] public readonly string Status; - - [DataMember(Name = "default", IsRequired = true)] - public readonly bool Default; } } diff --git a/smsapi/Api/Response/Senders.cs b/smsapi/Api/Response/Senders.cs index 58fcb0a..dc74d4b 100644 --- a/smsapi/Api/Response/Senders.cs +++ b/smsapi/Api/Response/Senders.cs @@ -6,22 +6,26 @@ namespace SMSApi.Api.Response [DataContract] public class Senders : Countable { - private Senders() : base() { } - [DataMember(Name = "list", IsRequired = false)] private List list; + private Senders() + { } + public List List { get { if (list == null) + { list = new List(); + } return list; } - set { } + set + { } } } } diff --git a/smsapi/Api/Response/Status.cs b/smsapi/Api/Response/Status.cs index b33fcf8..0f3e74a 100644 --- a/smsapi/Api/Response/Status.cs +++ b/smsapi/Api/Response/Status.cs @@ -6,31 +6,35 @@ namespace SMSApi.Api.Response [DataContract] public class Status : Countable { - private Status() : base() { } + [DataMember(Name = "length", IsRequired = false)] + public readonly int? Length; + + [DataMember(Name = "message", IsRequired = false)] + public readonly string Message; + + [DataMember(Name = "parts", IsRequired = false)] + public readonly int? Parts; [DataMember(Name = "list", IsRequired = false)] private List list; + private Status() + { } + public List List { get { if (list == null) + { list = new List(); + } return list; } - set { } + set + { } } - - [DataMember(Name = "message", IsRequired = false)] - public readonly string Message; - - [DataMember(Name = "length", IsRequired = false)] - public readonly int? Length; - - [DataMember(Name = "parts", IsRequired = false)] - public readonly int? Parts; } } diff --git a/smsapi/Api/Response/User.cs b/smsapi/Api/Response/User.cs index 119cbae..28d2ae1 100644 --- a/smsapi/Api/Response/User.cs +++ b/smsapi/Api/Response/User.cs @@ -1,18 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.Serialization; +using System.Runtime.Serialization; namespace SMSApi.Api.Response { [DataContract] public class User : Base { - private User() : base() { } + [DataMember(Name = "active", IsRequired = true)] + public readonly bool Active; - [DataMember(Name = "username", IsRequired = true)] - public readonly string Username; + [DataMember(Name = "info", IsRequired = true)] + public readonly string Info; [DataMember(Name = "limit", IsRequired = true)] public readonly double Limit; @@ -20,16 +17,16 @@ private User() : base() { } [DataMember(Name = "month_limit", IsRequired = true)] public readonly double MonthLimit; - [DataMember(Name = "senders", IsRequired = true)] - public readonly uint Senders; - [DataMember(Name = "phonebook", IsRequired = true)] public readonly uint Phonebook; - [DataMember(Name = "active", IsRequired = true)] - public readonly bool Active; + [DataMember(Name = "senders", IsRequired = true)] + public readonly uint Senders; - [DataMember(Name = "info", IsRequired = true)] - public readonly string Info; + [DataMember(Name = "username", IsRequired = true)] + public readonly string Username; + + private User() + { } } } diff --git a/smsapi/Api/SMSFactory.cs b/smsapi/Api/SMSFactory.cs index c365089..8884528 100644 --- a/smsapi/Api/SMSFactory.cs +++ b/smsapi/Api/SMSFactory.cs @@ -1,71 +1,69 @@ - -namespace SMSApi.Api -{ - public class SMSFactory : Factory - { - public SMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } - - public SMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { +using SMSApi.Api.Action; + +namespace SMSApi.Api +{ + public class SMSFactory : Factory + { + public SMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } + + public SMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } + + public SMSFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } + + public SMSDelete ActionDelete(string id = null) + { + var action = new SMSDelete(); + + action.Client(client); + action.Proxy(proxy); + action.Id(id); + + return action; + } + + public SMSGet ActionGet(string id = null) + { + var action = new SMSGet(); + + action.Client(client); + action.Proxy(proxy); + action.Id(id); + + return action; + } + + public SMSGet ActionGet(string[] id) + { + var action = new SMSGet(); + + action.Client(client); + action.Proxy(proxy); + action.Ids(id); + + return action; } - public SMSFactory(IClient client, Proxy proxy) - : base(client, proxy) - { + public SMSSend ActionSend(string to = null, string text = null) + { + string[] tos = to == null ? null : new[] { to }; + return ActionSend(tos, text); } - public SMSApi.Api.Action.SMSDelete ActionDelete(string id = null) - { - SMSApi.Api.Action.SMSDelete action = new SMSApi.Api.Action.SMSDelete(); - - action.Client(client); - action.Proxy(proxy); - action.Id(id); - - return action; - } - - public SMSApi.Api.Action.SMSGet ActionGet(string id = null) - { - SMSApi.Api.Action.SMSGet action = new SMSApi.Api.Action.SMSGet(); - - action.Client(client); - action.Proxy(proxy); - action.Id(id); - - return action; - } - - public SMSApi.Api.Action.SMSGet ActionGet(string[] id) - { - SMSApi.Api.Action.SMSGet action = new SMSApi.Api.Action.SMSGet(); - - action.Client(client); - action.Proxy(proxy); - action.Ids(id); - - return action; - } - - public SMSApi.Api.Action.SMSSend ActionSend(string to = null, string text = null) - { - string[] tos = ( to == null ? null : new string[] { to } ); - return ActionSend(tos, text); - } - - public SMSApi.Api.Action.SMSSend ActionSend(string[] to, string text = null) - { - SMSApi.Api.Action.SMSSend action = new SMSApi.Api.Action.SMSSend(); - action.Client(client); - action.Proxy(proxy); - action.SetTo(to); - action.SetText(text); - - return action; - } - } + public SMSSend ActionSend(string[] to, string text = null) + { + var action = new SMSSend(); + action.Client(client); + action.Proxy(proxy); + action.SetTo(to); + action.SetText(text); + + return action; + } + } } diff --git a/smsapi/Api/SenderFactory.cs b/smsapi/Api/SenderFactory.cs index 7a85e5d..5e53595 100644 --- a/smsapi/Api/SenderFactory.cs +++ b/smsapi/Api/SenderFactory.cs @@ -1,30 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using SMSApi.Api.Action; namespace SMSApi.Api { public class SenderFactory : Factory { - public SenderFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } + public SenderFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } - public SenderFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } + public SenderFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } - public SenderFactory(IClient client, Proxy proxy) - : base(client, proxy) - { - } + public SenderFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } - public SMSApi.Api.Action.SenderAdd ActionAdd(string name = null) + public SenderAdd ActionAdd(string name = null) { - var action = new SMSApi.Api.Action.SenderAdd(); + var action = new SenderAdd(); action.Client(client); action.Proxy(proxy); @@ -34,9 +28,9 @@ public SMSApi.Api.Action.SenderAdd ActionAdd(string name = null) return action; } - public SMSApi.Api.Action.SenderDelete ActionDelete(string name = null) + public SenderDelete ActionDelete(string name = null) { - var action = new SMSApi.Api.Action.SenderDelete(); + var action = new SenderDelete(); action.Client(client); action.Proxy(proxy); @@ -46,25 +40,25 @@ public SMSApi.Api.Action.SenderDelete ActionDelete(string name = null) return action; } - public SMSApi.Api.Action.SenderSetDefault ActionSetDefault(string name = null) + public SenderList ActionList() { - var action = new SMSApi.Api.Action.SenderSetDefault(); + var action = new SenderList(); action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } - public SMSApi.Api.Action.SenderList ActionList() + public SenderSetDefault ActionSetDefault(string name = null) { - var action = new SMSApi.Api.Action.SenderList(); + var action = new SenderSetDefault(); action.Client(client); action.Proxy(proxy); + action.Name(name); + return action; } } diff --git a/smsapi/Api/UserFactory.cs b/smsapi/Api/UserFactory.cs index 312fb27..b7ff32b 100644 --- a/smsapi/Api/UserFactory.cs +++ b/smsapi/Api/UserFactory.cs @@ -1,30 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using SMSApi.Api.Action; namespace SMSApi.Api { public class UserFactory : Factory { - public UserFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } + public UserFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } - public UserFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } + public UserFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } - public UserFactory(IClient client, Proxy proxy) - : base(client, proxy) - { - } + public UserFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } - public SMSApi.Api.Action.UserGetCredits ActionGetCredits() + public UserAdd ActionAdd() { - var action = new SMSApi.Api.Action.UserGetCredits(); + var action = new UserAdd(); action.Client(client); action.Proxy(proxy); @@ -32,19 +26,21 @@ public SMSApi.Api.Action.UserGetCredits ActionGetCredits() return action; } - public SMSApi.Api.Action.UserAdd ActionAdd() + public UserEdit ActionEdit(string username = null) { - var action = new SMSApi.Api.Action.UserAdd(); + var action = new UserEdit(); action.Client(client); action.Proxy(proxy); + action.Username(username); + return action; } - public SMSApi.Api.Action.UserEdit ActionEdit(string username = null) + public UserGet ActionGet(string username = null) { - var action = new SMSApi.Api.Action.UserEdit(); + var action = new UserGet(); action.Client(client); action.Proxy(proxy); @@ -54,21 +50,19 @@ public SMSApi.Api.Action.UserEdit ActionEdit(string username = null) return action; } - public SMSApi.Api.Action.UserGet ActionGet(string username = null) + public UserGetCredits ActionGetCredits() { - var action = new SMSApi.Api.Action.UserGet(); + var action = new UserGetCredits(); action.Client(client); action.Proxy(proxy); - action.Username(username); - return action; } - public SMSApi.Api.Action.UserList ActionList() + public UserList ActionList() { - var action = new SMSApi.Api.Action.UserList(); + var action = new UserList(); action.Client(client); action.Proxy(proxy); diff --git a/smsapi/Api/VMSFactory.cs b/smsapi/Api/VMSFactory.cs index f676dc3..e0bed2e 100644 --- a/smsapi/Api/VMSFactory.cs +++ b/smsapi/Api/VMSFactory.cs @@ -1,70 +1,68 @@ - -namespace SMSApi.Api -{ - public class VMSFactory : Factory - { - public VMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) - : base(address) - { - } - - public VMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) - : base(client, address) - { - } +using SMSApi.Api.Action; + +namespace SMSApi.Api +{ + public class VMSFactory : Factory + { + public VMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + : base(address) + { } + + public VMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + : base(client, address) + { } - public VMSFactory(IClient client, Proxy proxy) + public VMSFactory(IClient client, Proxy proxy) : base(client, proxy) + { } + + public VMSDelete ActionDelete(string id = null) + { + var action = new VMSDelete(); + + action.Client(client); + action.Proxy(proxy); + action.Id(id); + + return action; + } + + public VMSGet ActionGet(string id = null) + { + var action = new VMSGet(); + + action.Client(client); + action.Proxy(proxy); + action.Id(id); + + return action; + } + + public VMSGet ActionGet(string[] id) { + var action = new VMSGet(); + + action.Client(client); + action.Proxy(proxy); + action.Ids(id); + + return action; } - public SMSApi.Api.Action.VMSDelete ActionDelete(string id = null) - { - SMSApi.Api.Action.VMSDelete action = new SMSApi.Api.Action.VMSDelete(); - - action.Client(client); - action.Proxy(proxy); - action.Id(id); - - return action; - } - - public SMSApi.Api.Action.VMSGet ActionGet(string id = null) - { - SMSApi.Api.Action.VMSGet action = new SMSApi.Api.Action.VMSGet(); - - action.Client(client); - action.Proxy(proxy); - action.Id(id); - - return action; - } - - public SMSApi.Api.Action.VMSGet ActionGet(string[] id) - { - SMSApi.Api.Action.VMSGet action = new SMSApi.Api.Action.VMSGet(); - - action.Client(client); - action.Proxy(proxy); - action.Ids(id); - - return action; - } - - public SMSApi.Api.Action.VMSSend ActionSend(string to = null) - { - string[] tos = ( to == null ? null : new string[] { to } ); - return ActionSend(tos); - } - - public SMSApi.Api.Action.VMSSend ActionSend(string[] to) - { - SMSApi.Api.Action.VMSSend action = new SMSApi.Api.Action.VMSSend(); - action.Client(client); - action.Proxy(proxy); - action.SetTo(to); - - return action; - } - } + public VMSSend ActionSend(string to = null) + { + string[] tos = to == null ? null : new[] { to }; + return ActionSend(tos); + } + + public VMSSend ActionSend(string[] to) + { + var action = new VMSSend(); + action.Client(client); + action.Proxy(proxy); + action.SetTo(to); + + return action; + } + } } diff --git a/smsapi/Client.cs b/smsapi/Client.cs index 2aa31a8..c1354cc 100644 --- a/smsapi/Client.cs +++ b/smsapi/Client.cs @@ -1,22 +1,33 @@ -using System.Security.Cryptography; +using System; +using System.Security.Cryptography; using System.Text; namespace SMSApi.Api { - public class Client : ClientBase, IClient + public class Client : ClientBase, + IClient { - protected string username; protected string password; + protected string username; public Client(string username) - : base() { SetUsername(username); } - public void SetUsername(string username) + public override string GetAuthenticationHeader() { - this.username = username; + return "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(username + ":" + password)); + } + + public string GetPassword() + { + return password; + } + + public string GetUsername() + { + return username; } public void SetPasswordHash(string password) @@ -26,9 +37,9 @@ public void SetPasswordHash(string password) public void SetPasswordRAW(string password) { - StringBuilder hash = new StringBuilder(); + var hash = new StringBuilder(); - MD5 md5 = MD5.Create(); + var md5 = MD5.Create(); byte[] hashbin = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); for (int i = 0; i < hashbin.Length; i++) @@ -39,19 +50,9 @@ public void SetPasswordRAW(string password) SetPasswordHash(hash.ToString()); } - public override string GetAuthenticationHeader() - { - return "Basic " + System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password)); - } - - public string GetUsername() - { - return username; - } - - public string GetPassword() + public void SetUsername(string username) { - return password; + this.username = username; } } } diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs index 3b51a74..7e6f1f9 100644 --- a/smsapi/ClientBase.cs +++ b/smsapi/ClientBase.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Reflection; -using System.Text; namespace SMSApi.Api { @@ -13,21 +10,21 @@ public abstract class ClientBase public ClientBase() { - Assembly assembly = Assembly.GetExecutingAssembly(); + var assembly = Assembly.GetExecutingAssembly(); FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); - - _clientAgent = String.Format( + + _clientAgent = string.Format( "smsapi/csharp-client:{0};assemblyFile:{1};.net:{2}", - assembly.GetName().Version.ToString(), + assembly.GetName().Version, fvi.FileVersion, - Environment.Version.ToString()); + Environment.Version); } + public abstract string GetAuthenticationHeader(); + public string GetClientAgentHeader() { return _clientAgent; } - - public abstract string GetAuthenticationHeader(); } } diff --git a/smsapi/ClientException.cs b/smsapi/ClientException.cs index f1e9a02..f2a2d66 100644 --- a/smsapi/ClientException.cs +++ b/smsapi/ClientException.cs @@ -1,11 +1,9 @@ - -namespace SMSApi.Api +namespace SMSApi.Api { - public class ClientException : SMSApi.Api.SmsapiException - { + public class ClientException : SmsapiException + { public ClientException(string message, string code) - : base(message, code) - { - } - } + : base(message, code) + { } + } } diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index 2a688a9..d3fd8f1 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -1,14 +1,11 @@ using System; -using System.Text; namespace SMSApi.Api { - public class ClientOAuth : ClientBase, IClient + public class ClientOAuth : ClientBase, + IClient { - public string Token { get; private set; } - public ClientOAuth(string token) - : base() { if (string.IsNullOrEmpty(token)) { @@ -18,6 +15,8 @@ public ClientOAuth(string token) Token = token; } + public string Token { get; } + public override string GetAuthenticationHeader() { return "Bearer " + Token; diff --git a/smsapi/Exception.cs b/smsapi/Exception.cs index 58c8bc4..5078194 100644 --- a/smsapi/Exception.cs +++ b/smsapi/Exception.cs @@ -1,9 +1,13 @@ - -namespace SMSApi.Api +namespace SMSApi.Api { - public class Exception : System.Exception - { - public Exception(string message) : base(message) { } - public Exception(string message, System.Exception inner) : base(message, inner) { } + public class Exception : System.Exception + { + public Exception(string message) + : base(message) + { } + + public Exception(string message, System.Exception inner) + : base(message, inner) + { } } } diff --git a/smsapi/HostException.cs b/smsapi/HostException.cs index 2079eda..e2da60a 100644 --- a/smsapi/HostException.cs +++ b/smsapi/HostException.cs @@ -1,13 +1,11 @@ - -namespace SMSApi.Api +namespace SMSApi.Api { - public class HostException : SMSApi.Api.SmsapiException - { - public static readonly string E_JSON_DECODE = "-1"; - - public HostException(string message, string code) - : base(message, code) - { - } - } + public class HostException : SmsapiException + { + public static readonly string E_JSON_DECODE = "-1"; + + public HostException(string message, string code) + : base(message, code) + { } + } } diff --git a/smsapi/IClient.cs b/smsapi/IClient.cs index 5167358..3c6dae6 100644 --- a/smsapi/IClient.cs +++ b/smsapi/IClient.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SMSApi.Api +namespace SMSApi.Api { public interface IClient { diff --git a/smsapi/Properties/AssemblyInfo.cs b/smsapi/Properties/AssemblyInfo.cs index d7f037f..f98ac94 100644 --- a/smsapi/Properties/AssemblyInfo.cs +++ b/smsapi/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index f332f43..a2c14d6 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -1,17 +1,27 @@ -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; - -namespace SMSApi.Api -{ - public enum RequestMethod { GET, POST, PUT, DELETE }; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; - public interface Proxy - { - Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST); - Stream Execute(string uri, NameValueCollection data, Stream file, RequestMethod method = RequestMethod.POST); - Stream Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method = RequestMethod.POST); - - void Authentication(IClient client); - } +namespace SMSApi.Api +{ + public enum RequestMethod + { + GET, + POST, + PUT, + DELETE + } + + public interface Proxy + { + void Authentication(IClient client); + Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST); + Stream Execute(string uri, NameValueCollection data, Stream file, RequestMethod method = RequestMethod.POST); + + Stream Execute( + string uri, + NameValueCollection data, + Dictionary files, + RequestMethod method = RequestMethod.POST); + } } diff --git a/smsapi/ProxyAddress.cs b/smsapi/ProxyAddress.cs index b262b03..1bd1976 100644 --- a/smsapi/ProxyAddress.cs +++ b/smsapi/ProxyAddress.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SMSApi.Api +namespace SMSApi.Api { public enum ProxyAddress { diff --git a/smsapi/ProxyException.cs b/smsapi/ProxyException.cs index 153299d..144705e 100644 --- a/smsapi/ProxyException.cs +++ b/smsapi/ProxyException.cs @@ -1,9 +1,13 @@ - -namespace SMSApi.Api +namespace SMSApi.Api { - public class ProxyException : SMSApi.Api.Exception + public class ProxyException : Exception { - public ProxyException(string message) : base(message) { } - public ProxyException(string message, System.Exception inner) : base(message, inner) { } + public ProxyException(string message) + : base(message) + { } + + public ProxyException(string message, System.Exception inner) + : base(message, inner) + { } } } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index b405386..6ec5125 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -4,7 +4,7 @@ using System.Collections.Specialized; using System.IO; using System.Net; -using System.Security.Authentication; +using System.Text; namespace SMSApi.Api { @@ -14,13 +14,124 @@ public class ProxyHTTP : Proxy private const SecurityProtocolType _Tls12 = (SecurityProtocolType)0x00000C00; protected string baseUrl; - IClient authentication; + private IClient authentication; - public ProxyHTTP(string baseUrl) + public ProxyHTTP(string baseUrl) { this.baseUrl = baseUrl; } + public static string RequestMethodToString(RequestMethod method) + { + switch (method) + { + case RequestMethod.GET: + return "GET"; + + case RequestMethod.PUT: + return "PUT"; + + case RequestMethod.POST: + return "POST"; + + case RequestMethod.DELETE: + return "DELETE"; + + default: + throw new ProxyException("Invalid request method"); + } + } + + public void Authentication(IClient client) + { + authentication = client; + } + + public Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST) + { + var files = new Dictionary(); + return Execute(uri, data, files, method); + } + + public Stream Execute( + string uri, + NameValueCollection data, + Stream file, + RequestMethod method = RequestMethod.POST) + { + var files = new Dictionary(); + files.Add("file", file); + return Execute(uri, data, files, method); + } + + public Stream Execute( + string uri, + NameValueCollection data, + Dictionary files, + RequestMethod method = RequestMethod.POST) + { + string boundary = "SMSAPI-" + DateTime.Now.ToString("yyyy-MM-dd_HH:mm:ss") + + new Random().Next(int.MinValue, int.MaxValue) + "-boundary"; + + ServicePointManager.SecurityProtocol = _Tls12; + var webRequest = WebRequest.Create(baseUrl + uri); + webRequest.Method = RequestMethodToString(method); + + if (authentication != null) + { + webRequest.Headers.Add("Authorization", authentication.GetAuthenticationHeader()); + + var httpRequest = webRequest as HttpWebRequest; + if (httpRequest != null) + { + httpRequest.UserAgent = authentication.GetClientAgentHeader(); + } + } + + if (RequestMethod.POST.Equals(method) || RequestMethod.PUT.Equals(method)) + { + Stream stream; + + if (files != null && files.Count > 0) + { + webRequest.ContentType = "multipart/form-data; boundary=" + boundary; + stream = PrepareMultipartContent(boundary, data, files); + } + else + { + webRequest.ContentType = "application/x-www-form-urlencoded"; + stream = PrepareContent(data); + } + + webRequest.ContentLength = stream.Length; + + try + { + stream.Position = 0; + CopyStream(stream, webRequest.GetRequestStream()); + stream.Close(); + } + catch (WebException e) + { + throw new ProxyException(e.Message, e); + } + } + + var response = new MemoryStream(); + + try + { + CopyStream(webRequest.GetResponse().GetResponseStream(), response); + } + catch (WebException e) + { + throw new ProxyException("Failed to get response from " + webRequest.RequestUri, e); + } + + response.Position = 0; + return response; + } + protected Stream PrepareContent(NameValueCollection data) { Stream stream = new MemoryStream(); @@ -33,8 +144,8 @@ protected Stream PrepareContent(NameValueCollection data) foreach (string key in data.Keys) { - String param = Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(data[key]) + "&"; - byte[] bytes = System.Text.Encoding.UTF8.GetBytes(param); + string param = Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(data[key]) + "&"; + byte[] bytes = Encoding.UTF8.GetBytes(param); stream.Write(bytes, 0, bytes.Length); } @@ -49,7 +160,10 @@ protected Stream PrepareContent(NameValueCollection data) return stream; } - protected Stream PrepareMultipartContent(string boundary, NameValueCollection data, Dictionary files) + protected Stream PrepareMultipartContent( + string boundary, + NameValueCollection data, + Dictionary files) { Stream stream = new MemoryStream(); @@ -57,24 +171,25 @@ protected Stream PrepareMultipartContent(string boundary, NameValueCollection da enumerator.Reset(); - String template = Environment.NewLine + "--" + boundary + Environment.NewLine + "Content-Disposition: form-data; name=\"{0}\";" + Environment.NewLine + Environment.NewLine + "{1}"; + string template = Environment.NewLine + "--" + boundary + Environment.NewLine + + "Content-Disposition: form-data; name=\"{0}\";" + Environment.NewLine + Environment.NewLine + "{1}"; foreach (string key in data.Keys) { string param = string.Format(template, key, data[key]); - byte[] bytes = System.Text.Encoding.UTF8.GetBytes(param); + byte[] bytes = Encoding.UTF8.GetBytes(param); stream.Write(bytes, 0, bytes.Length); } - - template = + + template = Environment.NewLine + "--" + boundary + Environment.NewLine + "Content-Disposition: form-data; name=\"{0}\"; filename=\"{0}\"" + Environment.NewLine + "Content-Type: application/octet-stream" + Environment.NewLine + Environment.NewLine; - foreach( KeyValuePair file in files ) + foreach (KeyValuePair file in files) { string param = string.Format(template, file.Key); - byte[] bytes = System.Text.Encoding.UTF8.GetBytes(param); + byte[] bytes = Encoding.UTF8.GetBytes(param); stream.Write(bytes, 0, bytes.Length); Stream fileStream = file.Value; @@ -88,7 +203,7 @@ protected Stream PrepareMultipartContent(string boundary, NameValueCollection da } } - byte[] footBytes = System.Text.Encoding.UTF8.GetBytes(Environment.NewLine + "--" + boundary + "--"); + byte[] footBytes = Encoding.UTF8.GetBytes(Environment.NewLine + "--" + boundary + "--"); stream.Write(footBytes, 0, footBytes.Length); stream.Position = 0; @@ -96,82 +211,6 @@ protected Stream PrepareMultipartContent(string boundary, NameValueCollection da return stream; } - public Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST) - { - Dictionary files = new Dictionary(); - return Execute(uri, data, files, method); - } - - public Stream Execute(string uri, NameValueCollection data, System.IO.Stream file, RequestMethod method = RequestMethod.POST) - { - Dictionary files = new Dictionary(); - files.Add("file", file); - return Execute(uri, data, files, method); - } - - public Stream Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method = RequestMethod.POST) - { - String boundary = "SMSAPI-" + DateTime.Now.ToString("yyyy-MM-dd_HH:mm:ss") + (new Random()).Next(int.MinValue, int.MaxValue).ToString() + "-boundary"; - - ServicePointManager.SecurityProtocol = _Tls12; - WebRequest webRequest = WebRequest.Create(baseUrl + uri); - webRequest.Method = RequestMethodToString(method); - - if (authentication != null) - { - webRequest.Headers.Add("Authorization", authentication.GetAuthenticationHeader()); - - var httpRequest = webRequest as HttpWebRequest; - if (httpRequest != null) - { - httpRequest.UserAgent = authentication.GetClientAgentHeader(); - } - } - - if (RequestMethod.POST.Equals(method) || RequestMethod.PUT.Equals(method)) - { - Stream stream; - - if (files != null && files.Count > 0) - { - webRequest.ContentType = "multipart/form-data; boundary=" + boundary; - stream = PrepareMultipartContent(boundary, data, files); - } - else - { - webRequest.ContentType = "application/x-www-form-urlencoded"; - stream = PrepareContent(data); - } - - webRequest.ContentLength = stream.Length; - - try - { - stream.Position = 0; - CopyStream(stream, webRequest.GetRequestStream()); - stream.Close(); - } - catch (System.Net.WebException e) - { - throw new ProxyException(e.Message, e); - } - } - - MemoryStream response = new MemoryStream(); - - try - { - CopyStream(webRequest.GetResponse().GetResponseStream(), response); - } - catch (System.Net.WebException e) - { - throw new ProxyException("Failed to get response from " + webRequest.RequestUri.ToString(), e); - } - - response.Position = 0; - return response; - } - private void CopyStream(Stream input, Stream output) { byte[] buffer = new byte[2048]; @@ -180,28 +219,6 @@ private void CopyStream(Stream input, Stream output) { output.Write(buffer, 0, read); } - } - - public void Authentication(IClient client) - { - authentication = client; - } - - public static string RequestMethodToString(RequestMethod method) - { - switch(method) - { - case RequestMethod.GET: - return "GET"; - case RequestMethod.PUT: - return "PUT"; - case RequestMethod.POST: - return "POST"; - case RequestMethod.DELETE: - return "DELETE"; - default: - throw new ProxyException("Invalid request method"); - } } } } diff --git a/smsapi/SmsapiException.cs b/smsapi/SmsapiException.cs index d746f31..d81f6b0 100644 --- a/smsapi/SmsapiException.cs +++ b/smsapi/SmsapiException.cs @@ -1,18 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SMSApi.Api +namespace SMSApi.Api { - public class SmsapiException : SMSApi.Api.Exception + public class SmsapiException : Exception { private string Code; - public SmsapiException(string message, string code) - : base(message) - { - Code = code; + public SmsapiException(string message, string code) + : base(message) + { + Code = code; } public string GetCode() diff --git a/smsapiTests/AuthorizationType.cs b/smsapiTests/AuthorizationType.cs index f00521c..61345bc 100644 --- a/smsapiTests/AuthorizationType.cs +++ b/smsapiTests/AuthorizationType.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SMSApi.Api.Tests +namespace SMSApi.Api.Tests { public enum AuthorizationType { diff --git a/smsapiTests/ConfigurationTest.cs b/smsapiTests/ConfigurationTest.cs index 25ed25f..013601d 100644 --- a/smsapiTests/ConfigurationTest.cs +++ b/smsapiTests/ConfigurationTest.cs @@ -1,21 +1,16 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using SMSApi.Api; -using System; -using System.Collections.Generic; +using System; using System.Configuration; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; namespace SMSApi.Api.Tests { - [TestClass()] + [TestClass] public class ConfigurationTest { - [TestMethod()] + [TestMethod] public void VerifyConfiguration() { - var authorizationType = ConfigurationManager.AppSettings["authorizationType"]; + string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; if (authorizationType == AuthorizationType.basic.ToString()) { string password = ConfigurationManager.AppSettings["password"]; @@ -33,7 +28,7 @@ public void VerifyConfiguration() Assert.IsNotNull(username); Assert.AreNotEqual("", username); - var validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; + string validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; Assert.IsNotNull(validTestNumber); Assert.AreNotEqual("", validTestNumber); @@ -41,4 +36,4 @@ public void VerifyConfiguration() Assert.IsTrue(Enum.TryParse(ConfigurationManager.AppSettings["addressType"], out proxy)); } } -} \ No newline at end of file +} diff --git a/smsapiTests/Contacts/ContactsTest.cs b/smsapiTests/Contacts/ContactsTest.cs index 5663b0f..431ffce 100644 --- a/smsapiTests/Contacts/ContactsTest.cs +++ b/smsapiTests/Contacts/ContactsTest.cs @@ -9,57 +9,38 @@ public class ContactsTest : ContactsTestBase private Contact _contact; private Group _group; - [TestInitialize] - public override void SetUp() + [TestMethod] + public void BindContactToGroup() { - base.SetUp(); - - var contactsResponse = _factory.ListContacts().SetPhoneNumber(_validTestNumber).Execute(); - if (contactsResponse.Collection.Count > 0) - _contact = contactsResponse.Collection[0]; - else - _contact = _factory.CreateContact().SetPhoneNumber(_validTestNumber).Execute(); + Base response = _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); + Assert.IsFalse(response.isError()); - var groupsResponse = _factory.ListGroups().SetName("exampleGroup").Execute(); - if (groupsResponse.Collection.Count > 0) - _group = groupsResponse.Collection[0]; - else - _group = _factory.CreateGroup().SetName("exampleGroup").Execute(); + _factory.DeleteGroup(_group.Id).Execute(); } [TestCleanup] public void Cleanup() { - var contactsResponse = _factory.ListContacts().SetPhoneNumber(_validTestNumber).Execute(); - foreach (var contact in contactsResponse.Collection) + SMSApi.Api.Response.Contacts contactsResponse = + _factory.ListContacts().SetPhoneNumber(_validTestNumber).Execute(); + foreach (Contact contact in contactsResponse.Collection) { _factory.DeleteContact(contact.Id).Execute(); } - var groups = _factory.ListGroups().Execute(); - foreach (var group in groups.Collection) + Groups groups = _factory.ListGroups().Execute(); + foreach (Group group in groups.Collection) { _factory.DeleteGroup(group.Id).Execute(); } } - [TestMethod] - public void BindContactToGroup() - { - var response = _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); - Assert.IsFalse(response.isError()); - - _factory.DeleteGroup(_group.Id).Execute(); - } - [TestMethod] public void CreateContact() { Cleanup(); - var createdContact = _factory.CreateContact() - .SetPhoneNumber(_validTestNumber) - .Execute(); + Contact createdContact = _factory.CreateContact().SetPhoneNumber(_validTestNumber).Execute(); Assert.IsNotNull(createdContact); Assert.AreEqual(_validTestNumber, createdContact.PhoneNumber); @@ -68,9 +49,7 @@ public void CreateContact() [TestMethod] public void EditContact() { - var editContact = _factory.EditContact(_contact.Id) - .SetFirstName("Tester") - .Execute(); + Contact editContact = _factory.EditContact(_contact.Id).SetFirstName("Tester").Execute(); Assert.AreEqual(_contact.Id, editContact.Id); Assert.AreEqual("Tester", editContact.FirstName); @@ -79,23 +58,17 @@ public void EditContact() [TestMethod] public void GetContact() { - var getResponse = _factory.GetContact(_contact.Id).Execute(); + Contact getResponse = _factory.GetContact(_contact.Id).Execute(); Assert.AreEqual(_contact.PhoneNumber, getResponse.PhoneNumber); } - [TestMethod] - public void ListContacts() - { - _factory.ListContacts().Execute(); - } - [TestMethod] public void GetContactGroup() { _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); - var groupResponse = _factory.GetContactGroup(_contact.Id, _group.Id).Execute(); + Group groupResponse = _factory.GetContactGroup(_contact.Id, _group.Id).Execute(); Assert.AreEqual(_group.Id, groupResponse.Id); } @@ -105,10 +78,43 @@ public void ListContactGroups() { _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); - var groupsResponse = _factory.ListContactGroups(_contact.Id).Execute(); + Groups groupsResponse = _factory.ListContactGroups(_contact.Id).Execute(); Assert.AreEqual(1, groupsResponse.Collection.Count); Assert.AreEqual(_group.Id, groupsResponse.Collection[0].Id); } + + [TestMethod] + public void ListContacts() + { + _factory.ListContacts().Execute(); + } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + + SMSApi.Api.Response.Contacts contactsResponse = + _factory.ListContacts().SetPhoneNumber(_validTestNumber).Execute(); + if (contactsResponse.Collection.Count > 0) + { + _contact = contactsResponse.Collection[0]; + } + else + { + _contact = _factory.CreateContact().SetPhoneNumber(_validTestNumber).Execute(); + } + + Groups groupsResponse = _factory.ListGroups().SetName("exampleGroup").Execute(); + if (groupsResponse.Collection.Count > 0) + { + _group = groupsResponse.Collection[0]; + } + else + { + _group = _factory.CreateGroup().SetName("exampleGroup").Execute(); + } + } } } diff --git a/smsapiTests/Contacts/ContactsTestBase.cs b/smsapiTests/Contacts/ContactsTestBase.cs index af55dde..9de8369 100644 --- a/smsapiTests/Contacts/ContactsTestBase.cs +++ b/smsapiTests/Contacts/ContactsTestBase.cs @@ -1,10 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace smsapiTests.Contacts { diff --git a/smsapiTests/Contacts/FieldsTest.cs b/smsapiTests/Contacts/FieldsTest.cs index 6f24f39..e5e07f1 100644 --- a/smsapiTests/Contacts/FieldsTest.cs +++ b/smsapiTests/Contacts/FieldsTest.cs @@ -8,21 +8,11 @@ public class FieldsTest : ContactsTestBase { private Field _field; - [TestInitialize] - public override void SetUp() - { - base.SetUp(); - _field = _factory.CreateField() - .SetName("FieldX") - .SetType(Field.TextType) - .Execute(); - } - [TestCleanup] public void Cleanup() { - var fields = _factory.ListFields().Execute(); - foreach (var field in fields.Collection) + Fields fields = _factory.ListFields().Execute(); + foreach (Field field in fields.Collection) { _factory.DeleteField(field.Id).Execute(); } @@ -31,10 +21,7 @@ public void Cleanup() [TestMethod] public void CreateField() { - _field = _factory.CreateField() - .SetName("FieldXX") - .SetType(Field.TextType) - .Execute(); + _field = _factory.CreateField().SetName("FieldXX").SetType(Field.TextType).Execute(); Assert.IsNotNull(_field.Id); Assert.AreEqual("FieldXX", _field.Name); @@ -43,9 +30,7 @@ public void CreateField() [TestMethod] public void EditField() { - var editedField = _factory.EditField(_field.Id) - .SetName("FieldY") - .Execute(); + Field editedField = _factory.EditField(_field.Id).SetName("FieldY").Execute(); Assert.IsNotNull(editedField.Id); Assert.AreEqual(_field.Id, editedField.Id); @@ -61,9 +46,9 @@ public void ListFieldOptions() [TestMethod] public void ListFields() { - var fields = _factory.ListFields().Execute(); + Fields fields = _factory.ListFields().Execute(); - foreach (var field in fields.Collection) + foreach (Field field in fields.Collection) { Assert.IsNotNull("", field.Name); Assert.AreNotEqual("", field.Name); @@ -71,5 +56,12 @@ public void ListFields() Assert.AreNotEqual("", field.Type); } } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + _field = _factory.CreateField().SetName("FieldX").SetType(Field.TextType).Execute(); + } } } diff --git a/smsapiTests/Contacts/GroupsTest.cs b/smsapiTests/Contacts/GroupsTest.cs index 5465a13..e855fb9 100644 --- a/smsapiTests/Contacts/GroupsTest.cs +++ b/smsapiTests/Contacts/GroupsTest.cs @@ -8,19 +8,11 @@ public class GroupsTest : ContactsTestBase { private Group _group; - [TestInitialize] - public override void SetUp() - { - base.SetUp(); - - _group = _factory.CreateGroup().SetName("exampleGroup").Execute(); - } - [TestCleanup] public void Cleanup() { - var groups = _factory.ListGroups().Execute(); - foreach (var group in groups.Collection) + Groups groups = _factory.ListGroups().Execute(); + foreach (Group group in groups.Collection) { _factory.DeleteGroup(group.Id).Execute(); } @@ -29,16 +21,29 @@ public void Cleanup() [TestMethod] public void CreateGroup() { - var group = _factory.CreateGroup().SetName("exampleGroup1").Execute(); + Group group = _factory.CreateGroup().SetName("exampleGroup1").Execute(); Assert.AreEqual("exampleGroup1", group.Name); Assert.IsNotNull(group.Id); } + [TestMethod] + public void CreateGroupPermission() + { + GroupPermission groupPermission = _factory.CreateGroupPermission(_group.Id). + SetUsername(_username). + SetRead(true). + SetWrite(false). + SetSend(false). + Execute(); + + Assert.AreEqual(_username, groupPermission.Username); + } + [TestMethod] public void EditGroup() { - var response = _factory.EditGroup(_group.Id).SetName("GroupY").Execute(); + Group response = _factory.EditGroup(_group.Id).SetName("GroupY").Execute(); Assert.AreEqual(_group.Id, response.Id); Assert.AreNotEqual(_group.Name, response.Name); @@ -47,10 +52,24 @@ public void EditGroup() Assert.AreEqual(_group.Description, response.Description); } + [TestMethod] + public void EditGroupPermission() + { + GroupPermission groupPermission = _factory.EditGroupPermission(_group.Id, _username). + SetRead(true). + SetWrite(true). + SetSend(true). + Execute(); + + Assert.IsTrue(groupPermission.Read); + Assert.IsTrue(groupPermission.Write); + Assert.IsTrue(groupPermission.Send); + } + [TestMethod] public void GetGroup() { - var response = _factory.GetGroup(_group.Id).Execute(); + Group response = _factory.GetGroup(_group.Id).Execute(); Assert.AreEqual(_group.Id, response.Id); Assert.AreEqual(_group.Name, response.Name); @@ -58,6 +77,12 @@ public void GetGroup() Assert.AreEqual(_group.Description, response.Description); } + [TestMethod] + public void ListGroupPermissions() + { + _factory.ListGroupPermissions(_group.Id).Execute(); + } + [TestMethod] public void ListGroups() { @@ -67,7 +92,7 @@ public void ListGroups() [TestMethod] public void ListGroupsWithFilterByName() { - var listResponse = _factory.ListGroups().SetName("exampleGroup").Execute(); + Groups listResponse = _factory.ListGroups().SetName("exampleGroup").Execute(); Assert.AreEqual(1, listResponse.Collection.Count); } @@ -75,42 +100,17 @@ public void ListGroupsWithFilterByName() [TestMethod] public void ListWithFilterByName_ShouldNotFound() { - var listResponse = _factory.ListGroups().SetName("missingGroup").Execute(); + Groups listResponse = _factory.ListGroups().SetName("missingGroup").Execute(); Assert.AreEqual(0, listResponse.Collection.Count); } - [TestMethod] - public void CreateGroupPermission() - { - var groupPermission = _factory.CreateGroupPermission(_group.Id) - .SetUsername(_username) - .SetRead(true) - .SetWrite(false) - .SetSend(false) - .Execute(); - - Assert.AreEqual(_username, groupPermission.Username); - } - - [TestMethod] - public void EditGroupPermission() + [TestInitialize] + public override void SetUp() { - var groupPermission = _factory.EditGroupPermission(_group.Id, _username) - .SetRead(true) - .SetWrite(true) - .SetSend(true) - .Execute(); - - Assert.IsTrue(groupPermission.Read); - Assert.IsTrue(groupPermission.Write); - Assert.IsTrue(groupPermission.Send); - } + base.SetUp(); - [TestMethod] - public void ListGroupPermissions() - { - _factory.ListGroupPermissions(_group.Id).Execute(); + _group = _factory.CreateGroup().SetName("exampleGroup").Execute(); } } } diff --git a/smsapiTests/HlrTest.cs b/smsapiTests/HlrTest.cs index e0a432d..80e60dd 100644 --- a/smsapiTests/HlrTest.cs +++ b/smsapiTests/HlrTest.cs @@ -1,8 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using SMSApi.Api.Tests; -using System; -using System.Configuration; +using SMSApi.Api.Response; namespace smsapiTests { @@ -11,20 +9,20 @@ public class HlrTest : TestBase { private HLRFactory _factory; - [TestInitialize] - public override void SetUp() - { - base.SetUp(); - _factory = new HLRFactory(_client, _proxyAddress); - } - [TestMethod] public void CheckNumber() { - var response = _factory.ActionCheckNumber(_validTestNumber).Execute(); + CheckNumber response = _factory.ActionCheckNumber(_validTestNumber).Execute(); Assert.AreEqual(1, response.List.Count); Assert.IsNotNull(response.List[0].ID); } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + _factory = new HLRFactory(_client, _proxyAddress); + } } } diff --git a/smsapiTests/MmsTest.cs b/smsapiTests/MmsTest.cs index 89055e8..3462fe5 100644 --- a/smsapiTests/MmsTest.cs +++ b/smsapiTests/MmsTest.cs @@ -1,6 +1,7 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using System; +using SMSApi.Api.Response; namespace smsapiTests { @@ -9,23 +10,40 @@ public class MmsTest : TestBase { private MMSFactory _factory; - [TestInitialize] - public override void SetUp() + [TestMethod] + public void DeletingSentMessage_EmptyResponse() { - base.SetUp(); - _factory = new MMSFactory(_client, _proxyAddress); + Status sendResponse = + _factory.ActionSend(). + SetSubject("test subject"). + SetSmil( + ""). + SetTo(_validTestNumber). + Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + Countable deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); + + Assert.AreEqual(0, deletedResponse.Count); } [TestMethod] public void ScheduledSend_Get_Delete() { - var sendResponse = - _factory.ActionSend() - .SetSubject("test subject") - .SetSmil("") - .SetTo(_validTestNumber) - .SetDateSent(DateTime.Now.AddHours(2)) - .Execute(); + Status sendResponse = + _factory.ActionSend(). + SetSubject("test subject"). + SetSmil( + ""). + SetTo(_validTestNumber). + SetDateSent(DateTime.Now.AddHours(2)). + Execute(); Assert.AreEqual(1, sendResponse.Count); Assert.IsTrue(sendResponse.List[0].Points > 0, "Points must be greather then 0"); @@ -37,11 +55,9 @@ public void ScheduledSend_Get_Delete() ids[i] = sendResponse.List[i].ID; } - System.Console.WriteLine("Get:"); - var getResponse = - _factory.ActionGet() - .Ids(ids) - .Execute(); + Console.WriteLine("Get:"); + Status getResponse = + _factory.ActionGet().Ids(ids).Execute(); Assert.AreEqual(sendResponse.Count, getResponse.Count); Assert.AreEqual(_validTestNumber, getResponse.List[0].Number); @@ -50,35 +66,17 @@ public void ScheduledSend_Get_Delete() Assert.AreEqual(sendResponse.List[0].Points, getResponse.List[0].Points); Assert.AreEqual(sendResponse.List[0].Status, getResponse.List[0].Status); - var deletedResponse = - _factory - .ActionDelete() - .Ids(ids) - .Execute(); + Countable deletedResponse = + _factory.ActionDelete().Ids(ids).Execute(); Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } - [TestMethod] - public void DeletingSentMessage_EmptyResponse() + [TestInitialize] + public override void SetUp() { - var sendResponse = - _factory.ActionSend(). - SetSubject("test subject"). - SetSmil(""). - SetTo(_validTestNumber). - Execute(); - - string[] ids = new string[sendResponse.Count]; - - for (int i = 0; i < sendResponse.List.Count; i++) - { - ids[i] = sendResponse.List[i].ID; - } - - var deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); - - Assert.AreEqual(0, deletedResponse.Count); + base.SetUp(); + _factory = new MMSFactory(_client, _proxyAddress); } } } diff --git a/smsapiTests/Properties/AssemblyInfo.cs b/smsapiTests/Properties/AssemblyInfo.cs index 7dc831f..ff6b1e4 100644 --- a/smsapiTests/Properties/AssemblyInfo.cs +++ b/smsapiTests/Properties/AssemblyInfo.cs @@ -1,16 +1,15 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("smsapiTests")] +[assembly: AssemblyTitle("smsapiTests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("smsapiTests")] -[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("smsapiTests")] +[assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -31,5 +30,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] diff --git a/smsapiTests/SenderTest.cs b/smsapiTests/SenderTest.cs index e079d76..4d48b47 100644 --- a/smsapiTests/SenderTest.cs +++ b/smsapiTests/SenderTest.cs @@ -1,7 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using System; -using System.Configuration; +using SMSApi.Api.Response; namespace smsapiTests { @@ -11,18 +10,21 @@ public class SenderTest : TestBase private SenderFactory _factory; private string _testName = "testName"; - [TestInitialize] - public override void SetUp() + [TestMethod] + public void Add_Delete() { - base.SetUp(); - _factory = new SenderFactory(_client, _proxyAddress); + Base addResponse = _factory.ActionAdd(_testName).Execute(); + Assert.IsFalse(addResponse.isError(), addResponse.ErrorMessage); + + Base deleteResponse = _factory.ActionDelete(_testName).Execute(); + Assert.IsFalse(deleteResponse.isError(), deleteResponse.ErrorMessage); } [TestMethod] public void List_Delete() { - var senders = _factory.ActionList().Execute(); - foreach (var sender in senders.List) + Array senders = _factory.ActionList().Execute(); + foreach (Sender sender in senders.List) { Assert.IsTrue(sender.Name.Length > 0); @@ -33,21 +35,11 @@ public void List_Delete() } } - [TestMethod] - public void Add_Delete() - { - var addResponse = _factory.ActionAdd(_testName).Execute(); - Assert.IsFalse(addResponse.isError(), addResponse.ErrorMessage); - - var deleteResponse = _factory.ActionDelete(_testName).Execute(); - Assert.IsFalse(deleteResponse.isError(), deleteResponse.ErrorMessage); - } - [TestMethod] public void SetDefault() { - var senders = _factory.ActionList().Execute(); - foreach (var sender in senders.List) + Array senders = _factory.ActionList().Execute(); + foreach (Sender sender in senders.List) { if ("ACTIVE".Equals(sender.Status) && !"Test".Equals(sender.Name)) { @@ -55,5 +47,12 @@ public void SetDefault() } } } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + _factory = new SenderFactory(_client, _proxyAddress); + } } } diff --git a/smsapiTests/SmsTest.cs b/smsapiTests/SmsTest.cs index f77094a..7a9d222 100644 --- a/smsapiTests/SmsTest.cs +++ b/smsapiTests/SmsTest.cs @@ -1,6 +1,7 @@ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; +using SMSApi.Api.Response; namespace smsapiTests { @@ -9,22 +10,31 @@ public class SmsTest : TestBase { private SMSFactory _factory; - [TestInitialize] - public override void SetUp() + [TestMethod] + public void DeletingSentMessage_ExceptionThrown() { - base.SetUp(); - _factory = new SMSFactory(_client, _proxyAddress); + Status sendResponse = + _factory.ActionSend().SetText("test message").SetTo(_validTestNumber).Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + Assert.ThrowsException(() => _factory.ActionDelete().Id(ids[0]).Execute()); } [TestMethod] public void ScheduledSend_Get_Delete() { - var sendResponse = - _factory.ActionSend() - .SetText("test message") - .SetTo(_validTestNumber) - .SetDateSent(DateTime.Now.AddHours(2)) - .Execute(); + Status sendResponse = + _factory.ActionSend(). + SetText("test message"). + SetTo(_validTestNumber). + SetDateSent(DateTime.Now.AddHours(2)). + Execute(); Assert.AreEqual(1, sendResponse.Count); Assert.IsTrue(sendResponse.List[0].Points > 0, "Points must be greather then 0"); @@ -47,10 +57,8 @@ public void ScheduledSend_Get_Delete() } } - var getResponse = - _factory.ActionGet() - .Ids(ids) - .Execute(); + Status getResponse = + _factory.ActionGet().Ids(ids).Execute(); Assert.AreEqual(sendResponse.Count, getResponse.Count); Assert.AreEqual(_validTestNumber, getResponse.List[0].Number); @@ -58,50 +66,35 @@ public void ScheduledSend_Get_Delete() Assert.AreEqual(sendResponse.List[0].IDx, getResponse.List[0].IDx); Assert.AreEqual(sendResponse.List[0].Points, getResponse.List[0].Points); Assert.AreEqual(sendResponse.List[0].Status, getResponse.List[0].Status); - - var deletedResponse = - _factory - .ActionDelete() - .Id(ids[0]) - .Execute(); - Assert.AreEqual(sendResponse.Count, deletedResponse.Count); - } + Countable deletedResponse = + _factory.ActionDelete().Id(ids[0]).Execute(); - [TestMethod] - public void DeletingSentMessage_ExceptionThrown() - { - var sendResponse = - _factory.ActionSend() - .SetText("test message") - .SetTo(_validTestNumber) - .Execute(); - - string[] ids = new string[sendResponse.Count]; - - for (int i = 0; i < sendResponse.List.Count; i++) - { - ids[i] = sendResponse.List[i].ID; - } - - Assert.ThrowsException(() => _factory.ActionDelete().Id(ids[0]).Execute()); + Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } [TestMethod] public void SendMessageWithParams() { - var sendResponse = - _factory.ActionSend() - .SetText("test [%1%] message [%2%]") - .SetTo(_validTestNumber) - .SetParam(0, "par1") - .SetParam(1, "par2") - .SetTest(true) - .Execute(); + Status sendResponse = + _factory.ActionSend(). + SetText("test [%1%] message [%2%]"). + SetTo(_validTestNumber). + SetParam(0, "par1"). + SetParam(1, "par2"). + SetTest(). + Execute(); Assert.AreEqual(1, sendResponse.Count); Assert.IsTrue(sendResponse.List[0].Points > 0, "Points must be greather then 0"); Assert.IsNotNull(sendResponse.List[0].ID); } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + _factory = new SMSFactory(_client, _proxyAddress); + } } } diff --git a/smsapiTests/TestBase.cs b/smsapiTests/TestBase.cs index bd998a7..1c3e0d6 100644 --- a/smsapiTests/TestBase.cs +++ b/smsapiTests/TestBase.cs @@ -1,8 +1,8 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Configuration; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Tests; -using System; -using System.Configuration; namespace smsapiTests { @@ -10,13 +10,13 @@ public abstract class TestBase { protected IClient _client; protected ProxyAddress _proxyAddress; - protected string _validTestNumber; protected string _username; + protected string _validTestNumber; [TestInitialize] public virtual void SetUp() { - var authorizationType = ConfigurationManager.AppSettings["authorizationType"]; + string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; _username = ConfigurationManager.AppSettings["username"]; if (authorizationType == AuthorizationType.basic.ToString()) @@ -30,7 +30,9 @@ public virtual void SetUp() _client = new ClientOAuth(ConfigurationManager.AppSettings["oauthToken"]); } - _proxyAddress = (ProxyAddress)Enum.Parse(typeof(ProxyAddress), ConfigurationManager.AppSettings["addressType"]); + _proxyAddress = (ProxyAddress)Enum.Parse( + typeof(ProxyAddress), + ConfigurationManager.AppSettings["addressType"]); _validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; } } diff --git a/smsapiTests/UserTest.cs b/smsapiTests/UserTest.cs index 537b880..f92c190 100644 --- a/smsapiTests/UserTest.cs +++ b/smsapiTests/UserTest.cs @@ -1,6 +1,7 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using System; +using SMSApi.Api.Response; namespace smsapiTests { @@ -9,47 +10,42 @@ public class UserTest : TestBase { private UserFactory _factory; - [TestInitialize] - public override void SetUp() - { - base.SetUp(); - _factory = new UserFactory(_client); - } - - [TestMethod] - public void GetCredits() - { - var pointsResponse = _factory.ActionGetCredits().Execute(); - Assert.IsNotNull(pointsResponse.Points); - Assert.IsFalse(pointsResponse.isError()); - } - [TestMethod] public void Add_Edit_List() { string usernName = "test_" + DateTime.Now.ToString("his"); - var addResponse = - _factory.ActionAdd() - .SetUsername(usernName) - .SetPassword("7815696ecbf1c96e6894b779456d330e") - .Execute(); + User addResponse = + _factory.ActionAdd().SetUsername(usernName).SetPassword("7815696ecbf1c96e6894b779456d330e").Execute(); Assert.IsFalse(addResponse.isError()); Assert.AreEqual("", addResponse.Info); - var editResponse = - _factory.ActionEdit(usernName) - .SetInfo("edited info") - .Execute(); + User editResponse = + _factory.ActionEdit(usernName).SetInfo("edited info").Execute(); Assert.IsFalse(addResponse.isError()); Assert.AreEqual(addResponse.Username, editResponse.Username); Assert.AreEqual("edited info", editResponse.Info); - var users = _factory.ActionList().Execute(); + Array users = _factory.ActionList().Execute(); Assert.IsTrue(users.List.Count > 0); } + + [TestMethod] + public void GetCredits() + { + Credits pointsResponse = _factory.ActionGetCredits().Execute(); + Assert.IsNotNull(pointsResponse.Points); + Assert.IsFalse(pointsResponse.isError()); + } + + [TestInitialize] + public override void SetUp() + { + base.SetUp(); + _factory = new UserFactory(_client); + } } } diff --git a/smsapiTests/VmsTest.cs b/smsapiTests/VmsTest.cs index 306eaa6..2360922 100644 --- a/smsapiTests/VmsTest.cs +++ b/smsapiTests/VmsTest.cs @@ -1,6 +1,7 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using System; +using SMSApi.Api.Response; namespace smsapiTests { @@ -9,27 +10,43 @@ public class VmsTest : TestBase { private VMSFactory _factory; - [TestInitialize] - public override void SetUp() + [TestMethod] + public void DeletingSentMessage_EmptyResponse() { - base.SetUp(); - _factory = new VMSFactory(_client, _proxyAddress); + Status sendResponse = + _factory.ActionSend(). + SetTTS("test message"). + SetTo(_validTestNumber). + SetTry(4). + SetTryInterval(300). + Execute(); + + string[] ids = new string[sendResponse.Count]; + + for (int i = 0; i < sendResponse.List.Count; i++) + { + ids[i] = sendResponse.List[i].ID; + } + + Countable deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); + + Assert.AreEqual(0, deletedResponse.Count); } [TestMethod] public void ScheduledSend_Get_Delete() { DateTime tomorrow = DateTime.Now.AddDays(1); - DateTime date = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, 12, 0, 0); + var date = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, 12, 0, 0); - var sendResponse = - _factory.ActionSend() - .SetTTS("test message") - .SetTo(_validTestNumber) - .SetDateSent(date) - .SetTry(4) - .SetTryInterval(300) - .Execute(); + Status sendResponse = + _factory.ActionSend(). + SetTTS("test message"). + SetTo(_validTestNumber). + SetDateSent(date). + SetTry(4). + SetTryInterval(300). + Execute(); Assert.AreEqual(1, sendResponse.Count); Assert.IsTrue(sendResponse.List[0].Points > 0, "Points must be greather then 0"); @@ -41,11 +58,9 @@ public void ScheduledSend_Get_Delete() ids[i] = sendResponse.List[i].ID; } - System.Console.WriteLine("Get:"); - var getResponse = - _factory.ActionGet() - .Ids(ids) - .Execute(); + Console.WriteLine("Get:"); + Status getResponse = + _factory.ActionGet().Ids(ids).Execute(); Assert.AreEqual(sendResponse.Count, getResponse.Count); Assert.AreEqual(_validTestNumber, getResponse.List[0].Number); @@ -54,36 +69,17 @@ public void ScheduledSend_Get_Delete() Assert.AreEqual(sendResponse.List[0].Points, getResponse.List[0].Points); Assert.AreEqual(sendResponse.List[0].Status, getResponse.List[0].Status); - var deletedResponse = - _factory - .ActionDelete() - .Ids(ids) - .Execute(); + Countable deletedResponse = + _factory.ActionDelete().Ids(ids).Execute(); Assert.AreEqual(sendResponse.Count, deletedResponse.Count); } - [TestMethod] - public void DeletingSentMessage_EmptyResponse() + [TestInitialize] + public override void SetUp() { - var sendResponse = - _factory.ActionSend(). - SetTTS("test message"). - SetTo(_validTestNumber). - SetTry(4). - SetTryInterval(300). - Execute(); - - string[] ids = new string[sendResponse.Count]; - - for (int i = 0; i < sendResponse.List.Count; i++) - { - ids[i] = sendResponse.List[i].ID; - } - - var deletedResponse = _factory.ActionDelete().Ids(ids).Execute(); - - Assert.AreEqual(0, deletedResponse.Count); + base.SetUp(); + _factory = new VMSFactory(_client, _proxyAddress); } } } From 3c309cf0f7389c6d00120781dc44e9cfb96ea47b Mon Sep 17 00:00:00 2001 From: knowak Date: Thu, 4 Nov 2021 15:38:40 +0100 Subject: [PATCH 013/101] RestSharp lib included --- smsapi/smsapi.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 8b43dde..8676d0d 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -30,4 +30,7 @@ + + + \ No newline at end of file From 1b84bc5866dbbc6c265cdb89f2019e88d31f60e5 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 12:25:18 +0100 Subject: [PATCH 014/101] Use RestSharp in ProxyHTTP --- smsapi/ProxyHTTP.cs | 170 +++++++++++--------------------------------- 1 file changed, 42 insertions(+), 128 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 6ec5125..b227cf2 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -1,19 +1,16 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; -using System.Text; +using RestSharp; +using RestSharp.Authenticators; namespace SMSApi.Api { public class ProxyHTTP : Proxy { - //private const SecurityProtocolType _Tls11 = (SecurityProtocolType)0x00000300; - private const SecurityProtocolType _Tls12 = (SecurityProtocolType)0x00000C00; - - protected string baseUrl; + private readonly string baseUrl; private IClient authentication; public ProxyHTTP(string baseUrl) @@ -49,8 +46,7 @@ public void Authentication(IClient client) public Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST) { - var files = new Dictionary(); - return Execute(uri, data, files, method); + return Execute(uri, data, new Dictionary(), method); } public Stream Execute( @@ -59,9 +55,7 @@ public Stream Execute( Stream file, RequestMethod method = RequestMethod.POST) { - var files = new Dictionary(); - files.Add("file", file); - return Execute(uri, data, files, method); + return Execute(uri, data, new Dictionary { { "file", file } }, method); } public Stream Execute( @@ -70,155 +64,75 @@ public Stream Execute( Dictionary files, RequestMethod method = RequestMethod.POST) { - string boundary = "SMSAPI-" + DateTime.Now.ToString("yyyy-MM-dd_HH:mm:ss") - + new Random().Next(int.MinValue, int.MaxValue) + "-boundary"; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - ServicePointManager.SecurityProtocol = _Tls12; - var webRequest = WebRequest.Create(baseUrl + uri); - webRequest.Method = RequestMethodToString(method); + var client = new RestClient(baseUrl + uri); if (authentication != null) { - webRequest.Headers.Add("Authorization", authentication.GetAuthenticationHeader()); + client.UserAgent = authentication.GetClientAgentHeader(); + client.Authenticator = GetAuthenticator(); + } - var httpRequest = webRequest as HttpWebRequest; - if (httpRequest != null) - { - httpRequest.UserAgent = authentication.GetClientAgentHeader(); - } + var request = new RestRequest(ToMethod(method)); + foreach (string key in data.Keys) + { + request.AddParameter(key, data[key]); } - if (RequestMethod.POST.Equals(method) || RequestMethod.PUT.Equals(method)) + foreach (KeyValuePair file in files) { - Stream stream; - - if (files != null && files.Count > 0) - { - webRequest.ContentType = "multipart/form-data; boundary=" + boundary; - stream = PrepareMultipartContent(boundary, data, files); - } - else - { - webRequest.ContentType = "application/x-www-form-urlencoded"; - stream = PrepareContent(data); - } - - webRequest.ContentLength = stream.Length; - - try - { - stream.Position = 0; - CopyStream(stream, webRequest.GetRequestStream()); - stream.Close(); - } - catch (WebException e) - { - throw new ProxyException(e.Message, e); - } + request.AddFile(file.Key, s => file.Value.CopyTo(s), file.Key, file.Value.Length); } - var response = new MemoryStream(); + var responseStream = new MemoryStream(); + request.ResponseWriter = s => s.CopyTo(responseStream); try { - CopyStream(webRequest.GetResponse().GetResponseStream(), response); + client.Execute(request); } - catch (WebException e) + catch (System.Exception e) { - throw new ProxyException("Failed to get response from " + webRequest.RequestUri, e); + throw new ProxyException("Failed to get response from " + client.BuildUri(request), e); } - response.Position = 0; - return response; + return responseStream; } - protected Stream PrepareContent(NameValueCollection data) + private static Method ToMethod(RequestMethod method) { - Stream stream = new MemoryStream(); - - IEnumerator enumerator = data.GetEnumerator(); + switch (method) + { + case RequestMethod.DELETE: + return Method.DELETE; - enumerator.Reset(); + case RequestMethod.GET: + return Method.GET; - int count = data.Keys.Count; + case RequestMethod.POST: + return Method.POST; - foreach (string key in data.Keys) - { - string param = Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(data[key]) + "&"; - byte[] bytes = Encoding.UTF8.GetBytes(param); - stream.Write(bytes, 0, bytes.Length); - } + case RequestMethod.PUT: + return Method.PUT; - if (stream.Length > 0) - { - //remove the "&" at the end - stream.SetLength(stream.Length - 1); + default: + throw new NotSupportedException(); } - - stream.Position = 0; - - return stream; } - protected Stream PrepareMultipartContent( - string boundary, - NameValueCollection data, - Dictionary files) + private IAuthenticator GetAuthenticator() { - Stream stream = new MemoryStream(); - - IEnumerator enumerator = data.GetEnumerator(); - - enumerator.Reset(); - - string template = Environment.NewLine + "--" + boundary + Environment.NewLine - + "Content-Disposition: form-data; name=\"{0}\";" + Environment.NewLine + Environment.NewLine + "{1}"; - - foreach (string key in data.Keys) + switch (authentication) { - string param = string.Format(template, key, data[key]); - byte[] bytes = Encoding.UTF8.GetBytes(param); - stream.Write(bytes, 0, bytes.Length); - } - - template = - Environment.NewLine + "--" + boundary + Environment.NewLine + - "Content-Disposition: form-data; name=\"{0}\"; filename=\"{0}\"" + Environment.NewLine + - "Content-Type: application/octet-stream" + Environment.NewLine + Environment.NewLine; + case ClientOAuth oauth: + return new OAuth2AuthorizationRequestHeaderAuthenticator(oauth.Token, "Bearer"); - foreach (KeyValuePair file in files) - { - string param = string.Format(template, file.Key); - byte[] bytes = Encoding.UTF8.GetBytes(param); - stream.Write(bytes, 0, bytes.Length); - - Stream fileStream = file.Value; - fileStream.Position = 0; - byte[] buffer = new byte[1024]; - int bytesRead = 0; - - while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) - { - stream.Write(buffer, 0, bytesRead); - } + case Client basic: + return new HttpBasicAuthenticator(basic.GetUsername(), basic.GetPassword()); } - byte[] footBytes = Encoding.UTF8.GetBytes(Environment.NewLine + "--" + boundary + "--"); - stream.Write(footBytes, 0, footBytes.Length); - - stream.Position = 0; - - return stream; - } - - private void CopyStream(Stream input, Stream output) - { - byte[] buffer = new byte[2048]; - int read; - while ((read = input.Read(buffer, 0, buffer.Length)) > 0) - { - output.Write(buffer, 0, read); - } + throw new NotSupportedException(); } } } From c396a9c22cd2c74669637391dce7897a02206e91 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 13:26:48 +0100 Subject: [PATCH 015/101] Simplify api actions --- smsapi/Api/Action/Base.cs | 85 +++++++++----------- smsapi/Api/Action/BaseArray.cs | 13 --- smsapi/Api/Action/BaseSimple.cs | 10 --- smsapi/Api/Action/HLR/CheckNumber.cs | 21 ++--- smsapi/Api/Action/MMS/Delete.cs | 15 ++-- smsapi/Api/Action/MMS/Get.cs | 15 ++-- smsapi/Api/Action/Phonebook/ContactAdd.cs | 28 +++---- smsapi/Api/Action/Phonebook/ContactDelete.cs | 13 ++- smsapi/Api/Action/Phonebook/ContactEdit.cs | 30 +++---- smsapi/Api/Action/Phonebook/ContactGet.cs | 15 ++-- smsapi/Api/Action/Phonebook/ContactList.cs | 40 ++++----- smsapi/Api/Action/Phonebook/GroupAdd.cs | 15 ++-- smsapi/Api/Action/Phonebook/GroupDelete.cs | 15 ++-- smsapi/Api/Action/Phonebook/GroupEdit.cs | 24 +++--- smsapi/Api/Action/Phonebook/GroupGet.cs | 15 ++-- smsapi/Api/Action/Phonebook/GroupList.cs | 13 ++- smsapi/Api/Action/Rest.cs | 21 +---- smsapi/Api/Action/SMS/Delete.cs | 15 ++-- smsapi/Api/Action/SMS/Get.cs | 15 ++-- smsapi/Api/Action/Send.cs | 2 +- smsapi/Api/Action/Sender/Add.cs | 13 ++- smsapi/Api/Action/Sender/Delete.cs | 13 ++- smsapi/Api/Action/Sender/List.cs | 22 +++-- smsapi/Api/Action/Sender/SetDefault.cs | 13 ++- smsapi/Api/Action/User/Add.cs | 53 +++++------- smsapi/Api/Action/User/Edit.cs | 53 +++++------- smsapi/Api/Action/User/Get.cs | 15 ++-- smsapi/Api/Action/User/GetPoints.cs | 15 ++-- smsapi/Api/Action/User/List.cs | 24 +++--- smsapi/Api/Action/VMS/Delete.cs | 15 ++-- smsapi/Api/Action/VMS/Get.cs | 15 ++-- smsapi/Api/Response/Countable.cs | 2 +- 32 files changed, 289 insertions(+), 384 deletions(-) delete mode 100644 smsapi/Api/Action/BaseArray.cs delete mode 100644 smsapi/Api/Action/BaseSimple.cs diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index d277f18..cdc558a 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -8,37 +8,27 @@ namespace SMSApi.Api.Action { - public abstract class Base + public abstract class Base { - protected IClient client; - protected Proxy proxy; + private Proxy proxy; protected virtual RequestMethod Method => RequestMethod.POST; public void Client(IClient client) - { - this.client = client; - } - - /* protected virtual TResult ConvertResponse(T response) - { - return (TResult)Convert.ChangeType(response, typeof(TResult)); - }*/ + { } - public TResult Execute() + public T Execute() { Validate(); + T response; Stream data = proxy.Execute(Uri(), Values(), Files(), Method); - var result = default(TResult); - HandleError(data); try { - var response = ResponseToObject(data); - result = ConvertResponse(response); + response = ResponseToObject(data); } catch (SerializationException e) { @@ -48,7 +38,7 @@ public TResult Execute() data.Close(); - return result; + return response; } public void Proxy(Proxy proxy) @@ -56,20 +46,48 @@ public void Proxy(Proxy proxy) this.proxy = proxy; } - protected abstract TResult ConvertResponse(T response); + protected TT Deserialize(Stream data) + { + TT result; + if (data.Length > 0) + { + data.Position = 0; + var serializer = new DataContractJsonSerializer(typeof(TT)); + result = (TT)serializer.ReadObject(data); + data.Position = 0; + } + else + { + result = Activator.CreateInstance(); + } + + return result; + } protected virtual Dictionary Files() { return null; } - protected void HandleError(Stream data) + protected virtual T ResponseToObject(Stream data) + { + return Deserialize(data); + } + + protected abstract string Uri(); + + protected virtual void Validate() + { } + + protected abstract NameValueCollection Values(); + + private void HandleError(Stream data) { data.Position = 0; try { - var error = ResponseToObject(data); + var error = Deserialize(data); if (error.isError()) { @@ -92,31 +110,6 @@ protected void HandleError(Stream data) data.Position = 0; } - protected TT ResponseToObject(Stream data) - { - TT result; - if (data.Length > 0) - { - data.Position = 0; - var serializer = new DataContractJsonSerializer(typeof(TT)); - result = (TT)serializer.ReadObject(data); - data.Position = 0; - } - else - { - result = Activator.CreateInstance(); - } - - return result; - } - - protected abstract string Uri(); - - protected virtual void Validate() - { } - - protected abstract NameValueCollection Values(); - /** * 101 Niepoprawne lub brak danych autoryzacji. * 102 Nieprawidłowy login lub hasło @@ -197,4 +190,4 @@ private bool isHostError(string code) return false; } } -} +} diff --git a/smsapi/Api/Action/BaseArray.cs b/smsapi/Api/Action/BaseArray.cs deleted file mode 100644 index 4237def..0000000 --- a/smsapi/Api/Action/BaseArray.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - public abstract class BaseArray : Base, Array> - { - protected override Array ConvertResponse(List response) - { - return new Array(response); - } - } -} diff --git a/smsapi/Api/Action/BaseSimple.cs b/smsapi/Api/Action/BaseSimple.cs deleted file mode 100644 index d91181d..0000000 --- a/smsapi/Api/Action/BaseSimple.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace SMSApi.Api.Action -{ - public abstract class BaseSimple : Base - { - protected override T ConvertResponse(T response) - { - return response; - } - } -} diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index e830668..cb5e76b 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class HLRCheckNumber : BaseSimple + public class HLRCheckNumber : Base { protected string[] numbers; @@ -18,22 +18,13 @@ protected override string Uri() return "hlrsync.do"; } - /* - public HLRCheckNumber SetNumber(string[] numbers) - { - this.numbers = numbers; - return this; - } - */ - protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("number", string.Join(",", numbers)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "number", string.Join(",", numbers) } + }; } } } diff --git a/smsapi/Api/Action/MMS/Delete.cs b/smsapi/Api/Action/MMS/Delete.cs index 8d6df3c..8e78921 100644 --- a/smsapi/Api/Action/MMS/Delete.cs +++ b/smsapi/Api/Action/MMS/Delete.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class MMSDelete : BaseSimple + public class MMSDelete : Base { - protected string[] ids; + private string[] ids; public MMSDelete Id(string id) { @@ -26,12 +26,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("sch_del", string.Join("|", ids)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "sch_del", string.Join("|", ids) } + }; } } } diff --git a/smsapi/Api/Action/MMS/Get.cs b/smsapi/Api/Action/MMS/Get.cs index f26e643..9bf9c5e 100644 --- a/smsapi/Api/Action/MMS/Get.cs +++ b/smsapi/Api/Action/MMS/Get.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class MMSGet : BaseSimple + public class MMSGet : Base { - protected string[] ids; + private string[] ids; public MMSGet Id(string id) { @@ -26,12 +26,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", ids)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "status", string.Join("|", ids) } + }; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs index d2f1c4b..f92d879 100644 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ b/smsapi/Api/Action/Phonebook/ContactAdd.cs @@ -3,17 +3,16 @@ namespace SMSApi.Api.Action { - public class PhonebookContactAdd : BaseSimple + public class PhonebookContactAdd : Base { - protected int birthday; - protected string city; - protected string firstName; - protected string gender; - protected string[] groups; - protected string info; - protected string lastName; - - protected string number; + private int birthday; + private string city; + private string firstName; + private string gender; + private string[] groups; + private string info; + private string lastName; + private string number; public PhonebookContactAdd SetBirthday(int birthday) { @@ -76,10 +75,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("add_contact", number); + var collection = new NameValueCollection + { + { "format", "json" }, + { "add_contact", number } + }; if (firstName != null) { diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index f0ab115..a9a6cc2 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class PhonebookContactDelete : BaseSimple + public class PhonebookContactDelete : Base { protected string number; @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("delete_contact", number); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "delete_contact", number } + }; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs index 14f7566..86fc9cd 100644 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ b/smsapi/Api/Action/Phonebook/ContactEdit.cs @@ -3,18 +3,17 @@ namespace SMSApi.Api.Action { - public class PhonebookContactEdit : BaseSimple + public class PhonebookContactEdit : Base { - protected int birthday; - protected string city; - protected string firstName; - protected string gender; - protected string[] groups; - protected string info; - protected string lastName; - protected string newNumber; - - protected string oldNumber; + private int birthday; + private string city; + private string firstName; + private string gender; + private string[] groups; + private string info; + private string lastName; + private string newNumber; + private string oldNumber; public PhonebookContactEdit Number(string number) { @@ -83,10 +82,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("edit_contact", oldNumber); + var collection = new NameValueCollection + { + { "format", "json" }, + { "edit_contact", oldNumber } + }; if (newNumber != null) { diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs index a7c11c7..0de398e 100644 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ b/smsapi/Api/Action/Phonebook/ContactGet.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class PhonebookContactGet : BaseSimple + public class PhonebookContactGet : Base { - protected string number; + private string number; public PhonebookContactGet Number(string number) { @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("get_contact", number); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "get_contact", number } + }; } } } diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs index 2abf2e6..629dd27 100644 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ b/smsapi/Api/Action/Phonebook/ContactList.cs @@ -3,17 +3,16 @@ namespace SMSApi.Api.Action { - public class PhonebookContactList : BaseSimple + public class PhonebookContactList : Base { - protected string gender; - protected string[] groups; - protected uint limit; - - protected string number; - protected uint offset; - protected string orderBy; - protected string orderDir; - protected string searchText; + private string gender; + private string[] groups; + private uint limit; + private string number; + private uint offset; + private string orderBy; + private string orderDir; + private string searchText; public PhonebookContactList() { @@ -82,37 +81,38 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("list_contacts", ""); + var collection = new NameValueCollection + { + { "format", "json" }, + { "list_contacts", "" } + }; - if (number != null && number.Length > 0) + if (!string.IsNullOrEmpty(number)) { collection.Add("number", number); } - if (groups != null && groups.Length > 0) + if (groups?.Length > 0) { collection.Add("groups", string.Join(";", groups)); } - if (searchText != null && searchText.Length > 0) + if (!string.IsNullOrEmpty(searchText)) { collection.Add("text_search", searchText); } - if (gender != null && gender.Length > 0) + if (!string.IsNullOrEmpty(gender)) { collection.Add("gender", gender); } - if (orderBy != null && orderBy.Length > 0) + if (!string.IsNullOrEmpty(orderBy)) { collection.Add("order_by", orderBy); } - if (orderDir != null && orderDir.Length > 0) + if (!string.IsNullOrEmpty(orderDir)) { collection.Add("order_dir", orderDir); } diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs index 8beec9b..f11ae67 100644 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ b/smsapi/Api/Action/Phonebook/GroupAdd.cs @@ -3,11 +3,10 @@ namespace SMSApi.Api.Action { - public class PhonebookGroupAdd : BaseSimple + public class PhonebookGroupAdd : Base { - protected string info; - - protected string name; + private string info; + private string name; public PhonebookGroupAdd SetInfo(string info) { @@ -28,10 +27,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); + var collection = new NameValueCollection + { + { "format", "json" }, + { "add_group", name } + }; - collection.Add("format", "json"); - collection.Add("add_group", name); if (info != null) { collection.Add("info", info); diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs index 25e6b27..509f365 100644 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ b/smsapi/Api/Action/Phonebook/GroupDelete.cs @@ -3,10 +3,10 @@ namespace SMSApi.Api.Action { - public class PhonebookGroupDelete : BaseSimple + public class PhonebookGroupDelete : Base { - protected string name; - protected bool removeContacts; + private string name; + private bool removeContacts; public PhonebookGroupDelete() { @@ -32,10 +32,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("delete_group", name); + var collection = new NameValueCollection + { + { "format", "json" }, + { "delete_group", name } + }; if (removeContacts) { diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs index fcd257b..14c0fcb 100644 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ b/smsapi/Api/Action/Phonebook/GroupEdit.cs @@ -3,12 +3,11 @@ namespace SMSApi.Api.Action { - public class PhonebookGroupEdit : BaseSimple + public class PhonebookGroupEdit : Base { - protected string info; - protected string newName; - - protected string oldName; + private string info; + private string newName; + private string oldName; public PhonebookGroupEdit Name(string name) { @@ -35,14 +34,13 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("edit_group", oldName); - collection.Add("name", newName); - collection.Add("info", info); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "edit_group", oldName }, + { "name", newName }, + { "info", info } + }; } } } diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs index a631731..ff97701 100644 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ b/smsapi/Api/Action/Phonebook/GroupGet.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class PhonebookGroupGet : BaseSimple + public class PhonebookGroupGet : Base { - protected string name; + private string name; public PhonebookGroupGet Name(string name) { @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("get_group", name); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "get_group", name } + }; } } } diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs index 0959735..33c774a 100644 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ b/smsapi/Api/Action/Phonebook/GroupList.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class PhonebookGroupList : BaseSimple + public class PhonebookGroupList : Base { protected override string Uri() { @@ -12,12 +12,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("list_groups", ""); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "list_groups", "" } + }; } } } diff --git a/smsapi/Api/Action/Rest.cs b/smsapi/Api/Action/Rest.cs index 8f6d729..4361596 100644 --- a/smsapi/Api/Action/Rest.cs +++ b/smsapi/Api/Action/Rest.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public abstract class Rest : BaseSimple + public abstract class Rest : Base { protected virtual NameValueCollection Parameters => HttpUtility.ParseQueryString(string.Empty); @@ -11,27 +11,12 @@ public abstract class Rest : BaseSimple protected override string Uri() { - string uri = Resource; - if (RequestMethod.GET.Equals(Method)) - { - if (Parameters.Count > 0) - { - uri += "?" + Parameters; - } - } - - return uri; + return Resource; } protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - if (RequestMethod.POST.Equals(Method) || RequestMethod.PUT.Equals(Method)) - { - collection = Parameters; - } - - return collection; + return Parameters; } } } diff --git a/smsapi/Api/Action/SMS/Delete.cs b/smsapi/Api/Action/SMS/Delete.cs index 73d8699..24648ff 100644 --- a/smsapi/Api/Action/SMS/Delete.cs +++ b/smsapi/Api/Action/SMS/Delete.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class SMSDelete : BaseSimple + public class SMSDelete : Base { - protected string id; + private string id; public SMSDelete Id(string id) { @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("sch_del", id); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "sch_del", id } + }; } } } diff --git a/smsapi/Api/Action/SMS/Get.cs b/smsapi/Api/Action/SMS/Get.cs index f6f8cfb..33f3ac7 100644 --- a/smsapi/Api/Action/SMS/Get.cs +++ b/smsapi/Api/Action/SMS/Get.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class SMSGet : BaseSimple + public class SMSGet : Base { - protected string[] id; + private string[] id; public SMSGet Id(string id) { @@ -26,12 +26,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", id)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "status", string.Join("|", id) } + }; } } } diff --git a/smsapi/Api/Action/Send.cs b/smsapi/Api/Action/Send.cs index 0a7753b..c631d19 100644 --- a/smsapi/Api/Action/Send.cs +++ b/smsapi/Api/Action/Send.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public abstract class Send : BaseSimple + public abstract class Send : Base { protected string DateSent; protected string Group; diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index 571ee8e..a91422f 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderAdd : BaseSimple + public class SenderAdd : Base { private string name; @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("add", name); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "add", name } + }; } } } diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index e95135c..64cf347 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderDelete : BaseSimple + public class SenderDelete : Base { private string name; @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("delete", name); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "delete", name } + }; } } } diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index 9f310f3..07ba1da 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -1,10 +1,17 @@ -using System.Collections.Specialized; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class SenderList : BaseArray + public class SenderList : Base> { + protected override Array ResponseToObject(Stream data) + { + return new Array(Deserialize>(data)); + } + protected override string Uri() { return "sender.do"; @@ -12,12 +19,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("list", "1"); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "list", "1" } + }; } } } diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index 8598114..3ef21a5 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderSetDefault : BaseSimple + public class SenderSetDefault : Base { private string name; @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("default", name); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "default", name } + }; } } } diff --git a/smsapi/Api/Action/User/Add.cs b/smsapi/Api/Action/User/Add.cs index f0879e1..d08b864 100644 --- a/smsapi/Api/Action/User/Add.cs +++ b/smsapi/Api/Action/User/Add.cs @@ -1,38 +1,21 @@ using System.Collections.Specialized; +using System.Globalization; using SMSApi.Api.Response; -/** - * add_user * Nazwa dodawanego podużytkownika bez prefiksu użytkownika głównego - * pass * Hasło do panelu klienta SMSAPI dodawanego podużytkownika zakodowane w md5 - * pass_api Hasło do interfejsu API dla podużytkownika zakodowane w md5 - * limit Limit punktów przydzielony podużytkownikowi - * month_limit Ilość punktów która będzie przypisana do konta podużytkownika każdego pierwszego dnia - * senders Udostępnienie pól nadawców konta głównego (dostępne wartości: 1 – udostępniaj, 0 – nie udostępniaj, domyślnie wartość równa 0) - * phonebook Udostępnienie grup książki telefonicznej konta głównego (dostępne wartości: 1 – udostępniaj, 0 – nie udostępniaj, domyślnie wartość równa 0). Po udostępnieniu - * książki podużytkownik będzie mógł wysyłać do grup wiadomości nie będzie jednak widział poszczególnych kontaktów w książce telefonicznej. - * active Aktywowanie konta podużytkownika (dostępne wartości: 1 – aktywne, 0 – nieaktywne, domyślnie wartość równa 0) - * info Dodatkowy opis podużytkownika - */ namespace SMSApi.Api.Action { - public class UserAdd : BaseSimple + public class UserAdd : Base { - private const int PHONEBOOK_NOSHARE = 0; - private const int PHONEBOOK_SHARE = 1; - - private const int SENDERS_NOSHARE = 0; - private const int SENDERS_SHARE = 1; - protected bool active; - protected string info; - protected double limit; - protected double monthLimit; - - protected string newUsername; - protected string password; - protected string passwordApi; - protected int phonebook; - protected int senders; - protected bool withoutPrefix; + private bool active; + private string info; + private double limit; + private double monthLimit; + private string newUsername; + private string password; + private string passwordApi; + private int phonebook; + private int senders; + private bool withoutPrefix; public UserAdd() { @@ -110,10 +93,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); + var collection = new NameValueCollection + { + { "format", "json" }, + { "add_user", newUsername } + }; - collection.Add("format", "json"); - collection.Add("add_user", newUsername); if (password != null) { collection.Add("pass", password); @@ -126,12 +111,12 @@ protected override NameValueCollection Values() if (limit >= 0) { - collection.Add("limit", limit.ToString()); + collection.Add("limit", limit.ToString(CultureInfo.InvariantCulture)); } if (monthLimit >= 0) { - collection.Add("month_limit", monthLimit.ToString()); + collection.Add("month_limit", monthLimit.ToString(CultureInfo.InvariantCulture)); } if (senders >= 0) diff --git a/smsapi/Api/Action/User/Edit.cs b/smsapi/Api/Action/User/Edit.cs index 27c3cbc..82d65b4 100644 --- a/smsapi/Api/Action/User/Edit.cs +++ b/smsapi/Api/Action/User/Edit.cs @@ -1,38 +1,21 @@ using System.Collections.Specialized; +using System.Globalization; using SMSApi.Api.Response; -/** - * add_user * Nazwa dodawanego podużytkownika bez prefiksu użytkownika głównego - * pass * Hasło do panelu klienta SMSAPI dodawanego podużytkownika zakodowane w md5 - * pass_api Hasło do interfejsu API dla podużytkownika zakodowane w md5 - * limit Limit punktów przydzielony podużytkownikowi - * month_limit Ilość punktów która będzie przypisana do konta podużytkownika każdego pierwszego dnia - * senders Udostępnienie pól nadawców konta głównego (dostępne wartości: 1 – udostępniaj, 0 – nie udostępniaj, domyślnie wartość równa 0) - * phonebook Udostępnienie grup książki telefonicznej konta głównego (dostępne wartości: 1 – udostępniaj, 0 – nie udostępniaj, domyślnie wartość równa 0). Po udostępnieniu - * książki podużytkownik będzie mógł wysyłać do grup wiadomości nie będzie jednak widział poszczególnych kontaktów w książce telefonicznej. - * active Aktywowanie konta podużytkownika (dostępne wartości: 1 – aktywne, 0 – nieaktywne, domyślnie wartość równa 0) - * info Dodatkowy opis podużytkownika - */ namespace SMSApi.Api.Action { - public class UserEdit : BaseSimple + public class UserEdit : Base { - private const int PHONEBOOK_NOSHARE = 0; - private const int PHONEBOOK_SHARE = 1; - - private const int SENDERS_NOSHARE = 0; - private const int SENDERS_SHARE = 1; - protected int active; - protected string info; - protected double limit; - protected double monthLimit; - protected string password; - protected string passwordApi; - protected int phonebook; - protected int senders; - - protected string username; - protected bool withoutPrefix; + private int active; + private string info; + private double limit; + private double monthLimit; + private string password; + private string passwordApi; + private int phonebook; + private int senders; + private string username; + private bool withoutPrefix; public UserEdit() { @@ -110,10 +93,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); + var collection = new NameValueCollection + { + { "format", "json" }, + { "set_user", username } + }; - collection.Add("format", "json"); - collection.Add("set_user", username); if (password != null) { collection.Add("pass", password); @@ -126,12 +111,12 @@ protected override NameValueCollection Values() if (limit >= 0) { - collection.Add("limit", limit.ToString()); + collection.Add("limit", limit.ToString(CultureInfo.InvariantCulture)); } if (monthLimit >= 0) { - collection.Add("month_limit", monthLimit.ToString()); + collection.Add("month_limit", monthLimit.ToString(CultureInfo.InvariantCulture)); } if (senders >= 0) diff --git a/smsapi/Api/Action/User/Get.cs b/smsapi/Api/Action/User/Get.cs index 02ffb3a..87e0a28 100644 --- a/smsapi/Api/Action/User/Get.cs +++ b/smsapi/Api/Action/User/Get.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class UserGet : BaseSimple + public class UserGet : Base { - protected string username; + private string username; public UserGet Username(string username) { @@ -20,12 +20,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("get_user", username); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "get_user", username } + }; } } } diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index f6ff4ac..c3a8d6a 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class UserGetCredits : BaseSimple + public class UserGetCredits : Base { protected override string Uri() { @@ -12,13 +12,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("credits", "1"); - collection.Add("details", "1"); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "credits", "1" }, + { "details", "1" } + }; } } } diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index 2ae1aea..74375e5 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -1,16 +1,15 @@ -using System.Collections.Specialized; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; using SMSApi.Api.Response; namespace SMSApi.Api.Action { - public class UserList : BaseArray + public class UserList : Base> { - protected string username; - - public UserList Username(string username) + protected override Array ResponseToObject(Stream data) { - this.username = username; - return this; + return new Array(Deserialize>(data)); } protected override string Uri() @@ -20,12 +19,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("list", "1"); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "list", "1" } + }; } } } diff --git a/smsapi/Api/Action/VMS/Delete.cs b/smsapi/Api/Action/VMS/Delete.cs index a8ef6fc..ebe3258 100644 --- a/smsapi/Api/Action/VMS/Delete.cs +++ b/smsapi/Api/Action/VMS/Delete.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class VMSDelete : BaseSimple + public class VMSDelete : Base { - protected string[] ids; + private string[] ids; public VMSDelete Id(string id) { @@ -26,12 +26,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("sch_del", string.Join("|", ids)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "sch_del", string.Join("|", ids) } + }; } } } diff --git a/smsapi/Api/Action/VMS/Get.cs b/smsapi/Api/Action/VMS/Get.cs index ea1fed3..b0c0fdb 100644 --- a/smsapi/Api/Action/VMS/Get.cs +++ b/smsapi/Api/Action/VMS/Get.cs @@ -3,9 +3,9 @@ namespace SMSApi.Api.Action { - public class VMSGet : BaseSimple + public class VMSGet : Base { - protected string[] ids; + private string[] ids; public VMSGet Id(string id) { @@ -26,12 +26,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var collection = new NameValueCollection(); - - collection.Add("format", "json"); - collection.Add("status", string.Join("|", ids)); - - return collection; + return new NameValueCollection + { + { "format", "json" }, + { "status", string.Join("|", ids) } + }; } } } diff --git a/smsapi/Api/Response/Countable.cs b/smsapi/Api/Response/Countable.cs index 4cf8f93..d352b29 100644 --- a/smsapi/Api/Response/Countable.cs +++ b/smsapi/Api/Response/Countable.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class Countable /*: Base*/ + public class Countable { private int count; From a28fdd081446832ae8894389c13b9fbc975ec920 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 14:05:02 +0100 Subject: [PATCH 016/101] Remove redundant base class --- smsapi/Api/Action/Base.cs | 126 +++++-------- .../Api/Action/Contacts/BindContactToGroup.cs | 18 +- smsapi/Api/Action/Contacts/CreateContact.cs | 160 ++++++++-------- smsapi/Api/Action/Contacts/CreateField.cs | 55 +++--- smsapi/Api/Action/Contacts/CreateGroup.cs | 70 ++++--- .../Action/Contacts/CreateGroupPermission.cs | 90 +++++---- smsapi/Api/Action/Contacts/DeleteContact.cs | 13 +- smsapi/Api/Action/Contacts/DeleteField.cs | 13 +- smsapi/Api/Action/Contacts/DeleteGroup.cs | 13 +- .../Action/Contacts/DeleteGroupPermission.cs | 18 +- smsapi/Api/Action/Contacts/EditContact.cs | 158 ++++++++-------- smsapi/Api/Action/Contacts/EditField.cs | 39 ++-- smsapi/Api/Action/Contacts/EditGroup.cs | 73 ++++---- .../Action/Contacts/EditGroupPermission.cs | 78 ++++---- smsapi/Api/Action/Contacts/GetContact.cs | 13 +- smsapi/Api/Action/Contacts/GetContactGroup.cs | 18 +- smsapi/Api/Action/Contacts/GetGroup.cs | 13 +- .../Api/Action/Contacts/GetGroupPermission.cs | 18 +- .../Api/Action/Contacts/ListContactGroups.cs | 13 +- smsapi/Api/Action/Contacts/ListContacts.cs | 173 +++++++++--------- .../Api/Action/Contacts/ListFieldOptions.cs | 13 +- smsapi/Api/Action/Contacts/ListFields.cs | 7 +- .../Action/Contacts/ListGroupPermissions.cs | 13 +- smsapi/Api/Action/Contacts/ListGroups.cs | 58 +++--- .../Action/Contacts/UnbindContactFromGroup.cs | 18 +- smsapi/Api/Action/Rest.cs | 22 --- 26 files changed, 622 insertions(+), 681 deletions(-) delete mode 100644 smsapi/Api/Action/Rest.cs diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index cdc558a..a4b824f 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -4,6 +4,7 @@ using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; +using System.Web; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -66,7 +67,7 @@ protected TT Deserialize(Stream data) protected virtual Dictionary Files() { - return null; + return new Dictionary(); } protected virtual T ResponseToObject(Stream data) @@ -79,35 +80,9 @@ protected virtual T ResponseToObject(Stream data) protected virtual void Validate() { } - protected abstract NameValueCollection Values(); - - private void HandleError(Stream data) + protected virtual NameValueCollection Values() { - data.Position = 0; - - try - { - var error = Deserialize(data); - - if (error.isError()) - { - if (isHostError(error.Code)) - { - throw new HostException(error.Message, error.Code); - } - - if (isClientError(error.Code)) - { - throw new ClientException(error.Message, error.Code); - } - - throw new ActionException(error.Message, error.Code); - } - } - catch (SerializationException e) - { } - - data.Position = 0; + return HttpUtility.ParseQueryString(string.Empty); } /** @@ -119,44 +94,22 @@ private void HandleError(Stream data) * 1000 Akcja dostępna tylko dla użytkownika głównego * 1001 Nieprawidłowa akcja */ - private bool isClientError(string code) + private static bool IsClientError(string code) { - if (code == "101") + switch (code) { - return true; - } + case "101": + case "102": + case "103": + case "105": + case "110": + case "1000": + case "1001": + return true; - if (code == "102") - { - return true; + default: + return false; } - - if (code == "103") - { - return true; - } - - if (code == "105") - { - return true; - } - - if (code == "110") - { - return true; - } - - if (code == "1000") - { - return true; - } - - if (code == "1001") - { - return true; - } - - return false; } /** @@ -165,29 +118,48 @@ private bool isClientError(string code) * 999 Wewnętrzny błąd systemu * 201 Wewnętrzny błąd systemu */ - private bool isHostError(string code) + private static bool IsHostError(string code) { - if (code == "8") + switch (code) { - return true; - } + case "8": + case "201": + case "666": + case "999": + return true; - if (code == "201") - { - return true; + default: + return false; } + } - if (code == "666") - { - return true; - } + private void HandleError(Stream data) + { + data.Position = 0; - if (code == "999") + try { - return true; + var error = Deserialize(data); + + if (error.isError()) + { + if (IsHostError(error.Code)) + { + throw new HostException(error.Message, error.Code); + } + + if (IsClientError(error.Code)) + { + throw new ClientException(error.Message, error.Code); + } + + throw new ActionException(error.Message, error.Code); + } } + catch (SerializationException e) + { } - return false; + data.Position = 0; } } } diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index aa72c1a..7078375 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -2,20 +2,22 @@ namespace SMSApi.Api.Action { - public class BindContactToGroup : Rest + public class BindContactToGroup : Base { + private readonly string contactId; + private readonly string groupId; + public BindContactToGroup(string contactId, string groupId) { - ContactId = contactId; - GroupId = groupId; + this.contactId = contactId; + this.groupId = groupId; } - public string ContactId { get; } - - public string GroupId { get; } - protected override RequestMethod Method => RequestMethod.PUT; - protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + protected override string Uri() + { + return "contacts/" + contactId + "/groups/" + groupId; + } } } diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index da54ba7..5d53c7e 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -4,136 +4,126 @@ namespace SMSApi.Api.Action { - public class CreateContact : Rest + public class CreateContact : Base { - public DateTime? BirthdayDate; - - public string City; - - public string Description; - - public string Email; - - public string FirstName; - - public string Gender; - - public string LastName; - - public string PhoneNumber; - - public string Source; - - protected override RequestMethod Method => RequestMethod.POST; - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (PhoneNumber != null) - { - parameters.Add("phone_number", PhoneNumber); - } - - if (Email != null) - { - parameters.Add("email", Email); - } - - if (FirstName != null) - { - parameters.Add("first_name", FirstName); - } - - if (LastName != null) - { - parameters.Add("last_name", LastName); - } - - if (Gender != null) - { - parameters.Add("gender", Gender); - } - - if (BirthdayDate != null) - { - parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - } - - if (Description != null) - { - parameters.Add("description", Description); - } - - if (City != null) - { - parameters.Add("city", City); - } - - if (Source != null) - { - parameters.Add("source", Source); - } - - return parameters; - } - } - - protected override string Resource => "contacts"; + private DateTime? birthdayDate; + private string city; + private string description; + private string email; + private string firstName; + private string gender; + private string lastName; + private string phoneNumber; + private string source; public CreateContact SetBirthdayDate(DateTime? birthdayDate) { - BirthdayDate = birthdayDate; + this.birthdayDate = birthdayDate; return this; } public CreateContact SetCity(string city) { - City = city; + this.city = city; return this; } public CreateContact SetDescription(string description) { - Description = description; + this.description = description; return this; } public CreateContact SetEmail(string email) { - Email = email; + this.email = email; return this; } public CreateContact SetFirstName(string firstName) { - FirstName = firstName; + this.firstName = firstName; return this; } public CreateContact SetGender(string gender) { - Gender = gender; + this.gender = gender; return this; } public CreateContact SetLastName(string lastName) { - LastName = lastName; + this.lastName = lastName; return this; } public CreateContact SetPhoneNumber(string phoneNumber) { - PhoneNumber = phoneNumber; + this.phoneNumber = phoneNumber; return this; } public CreateContact SetSource(string source) { - Source = source; + this.source = source; return this; } + + protected override string Uri() + { + return "contacts"; + } + + protected override NameValueCollection Values() + { + var values = new NameValueCollection(); + if (phoneNumber != null) + { + values.Add("phone_number", phoneNumber); + } + + if (email != null) + { + values.Add("email", email); + } + + if (firstName != null) + { + values.Add("first_name", firstName); + } + + if (lastName != null) + { + values.Add("last_name", lastName); + } + + if (gender != null) + { + values.Add("gender", gender); + } + + if (birthdayDate != null) + { + values.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); + } + + if (description != null) + { + values.Add("description", description); + } + + if (city != null) + { + values.Add("city", city); + } + + if (source != null) + { + values.Add("source", source); + } + + return values; + } } } diff --git a/smsapi/Api/Action/Contacts/CreateField.cs b/smsapi/Api/Action/Contacts/CreateField.cs index b76529d..a13dd70 100644 --- a/smsapi/Api/Action/Contacts/CreateField.cs +++ b/smsapi/Api/Action/Contacts/CreateField.cs @@ -3,45 +3,42 @@ namespace SMSApi.Api.Action { - public class CreateField : Rest + public class CreateField : Base { - public string Name; - - public string Type; - - protected override RequestMethod Method => RequestMethod.POST; - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) - { - parameters.Add("name", Name); - } - - if (Type != null) - { - parameters.Add("type", Type); - } - - return parameters; - } - } - - protected override string Resource => "contacts/fields"; + private string name; + private string type; public CreateField SetName(string name) { - Name = name; + this.name = name; return this; } public CreateField SetType(string type) { - Type = type; + this.type = type; return this; } + + protected override string Uri() + { + return "contacts/fields"; + } + + protected override NameValueCollection Values() + { + var values = new NameValueCollection(); + if (name != null) + { + values.Add("name", name); + } + + if (type != null) + { + values.Add("type", type); + } + + return values; + } } } diff --git a/smsapi/Api/Action/Contacts/CreateGroup.cs b/smsapi/Api/Action/Contacts/CreateGroup.cs index 6061873..6d90120 100644 --- a/smsapi/Api/Action/Contacts/CreateGroup.cs +++ b/smsapi/Api/Action/Contacts/CreateGroup.cs @@ -3,58 +3,54 @@ namespace SMSApi.Api.Action { - public class CreateGroup : Rest + public class CreateGroup : Base { - public string Description; - - public string Idx; - - public string Name; - - protected override RequestMethod Method => RequestMethod.POST; - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) - { - parameters.Add("name", Name); - } - - if (Description != null) - { - parameters.Add("desciption", Description); - } - - if (Idx != null) - { - parameters.Add("idx", Idx); - } - - return parameters; - } - } - - protected override string Resource => "contacts/groups"; + private string description; + private string idx; + private string name; public CreateGroup SetDescription(string description) { - Description = description; + this.description = description; return this; } public CreateGroup SetIdx(string idx) { - Idx = idx; + this.idx = idx; return this; } public CreateGroup SetName(string name) { - Name = name; + this.name = name; return this; } + + protected override string Uri() + { + return "contacts/groups"; + } + + protected override NameValueCollection Values() + { + var values = new NameValueCollection(); + if (name != null) + { + values.Add("name", name); + } + + if (description != null) + { + values.Add("desciption", description); + } + + if (idx != null) + { + values.Add("idx", idx); + } + + return values; + } } } diff --git a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs index 6d9a735..fe384b3 100644 --- a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs @@ -4,78 +4,72 @@ namespace SMSApi.Api.Action { - public class CreateGroupPermission : Rest + public class CreateGroupPermission : Base { - public bool? Read; - - public bool? Send; - - public string Username; - - public bool? Write; + private string groupId; + private bool? read; + private bool? send; + private string username; + private bool? write; public CreateGroupPermission(string groupId) { - GroupId = groupId; + this.groupId = groupId; } - public string GroupId { get; } - - protected override RequestMethod Method => RequestMethod.POST; - - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Username != null) - { - parameters.Add("username", Username); - } - - if (Read != null) - { - parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); - } - - if (Write != null) - { - parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); - } - - if (Send != null) - { - parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); - } - - return parameters; - } - } - - protected override string Resource => "contacts/groups/" + GroupId + "/permissions"; - public CreateGroupPermission SetRead(bool? read) { - Read = read; + this.read = read; return this; } public CreateGroupPermission SetSend(bool? send) { - Send = send; + this.send = send; return this; } public CreateGroupPermission SetUsername(string username) { - Username = username; + this.username = username; return this; } public CreateGroupPermission SetWrite(bool? write) { - Write = write; + this.write = write; return this; } + + protected override string Uri() + { + return "contacts/groups/" + groupId + "/permissions"; + } + + protected override NameValueCollection Values() + { + var values = new NameValueCollection(); + if (username != null) + { + values.Add("username", username); + } + + if (read != null) + { + values.Add("read", Convert.ToInt32(read.Value).ToString()); + } + + if (write != null) + { + values.Add("write", Convert.ToInt32(write.Value).ToString()); + } + + if (send != null) + { + values.Add("send", Convert.ToInt32(send.Value).ToString()); + } + + return values; + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index a9fa3b0..df7519c 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class DeleteContact : Rest + public class DeleteContact : Base { + private readonly string contactId; + public DeleteContact(string contactId) { - ContactId = contactId; + this.contactId = contactId; } - public string ContactId { get; } - protected override RequestMethod Method => RequestMethod.DELETE; - protected override string Resource => "contacts/" + ContactId; + protected override string Uri() + { + return "contacts/" + contactId; + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index 8301724..b4afb9f 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class DeleteField : Rest + public class DeleteField : Base { + private readonly string fieldId; + public DeleteField(string fieldId) { - FieldId = fieldId; + this.fieldId = fieldId; } - public string FieldId { get; } - protected override RequestMethod Method => RequestMethod.DELETE; - protected override string Resource => "contacts/fields/" + FieldId; + protected override string Uri() + { + return "contacts/fields/" + fieldId; + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index e3b4301..aa68133 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class DeleteGroup : Rest + public class DeleteGroup : Base { + private readonly string groupId; + public DeleteGroup(string groupId) { - GroupId = groupId; + this.groupId = groupId; } - public string GroupId { get; } - protected override RequestMethod Method => RequestMethod.DELETE; - protected override string Resource => "contacts/groups/" + GroupId; + protected override string Uri() + { + return "contacts/groups/" + groupId; + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs index 1ac7668..5f086ee 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs @@ -2,20 +2,22 @@ namespace SMSApi.Api.Action { - public class DeleteGroupPermission : Rest + public class DeleteGroupPermission : Base { + private readonly string groupId; + private readonly string username; + public DeleteGroupPermission(string groupId, string username) { - GroupId = groupId; - Username = username; + this.groupId = groupId; + this.username = username; } - public string GroupId { get; } - - public string Username { get; } - protected override RequestMethod Method => RequestMethod.DELETE; - protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; + protected override string Uri() + { + return "contacts/groups/" + groupId + "/permissions/" + username; + } } } diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index bf470f4..480381b 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -4,25 +4,17 @@ namespace SMSApi.Api.Action { - public class EditContact : Rest + public class EditContact : Base { - public DateTime? BirthdayDate; - - public string City; - - public string Description; - - public string Email; - - public string FirstName; - - public string Gender; - - public string LastName; - - public string PhoneNumber; - - public string Source; + private DateTime? birthdayDate; + private string city; + private string description; + private string email; + private string firstName; + private string gender; + private string lastName; + private string phoneNumber; + private string source; public EditContact(string contactId) { @@ -33,114 +25,114 @@ public EditContact(string contactId) protected override RequestMethod Method => RequestMethod.PUT; - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (PhoneNumber != null) - { - parameters.Add("phone_number", PhoneNumber); - } - - if (Email != null) - { - parameters.Add("email", Email); - } - - if (FirstName != null) - { - parameters.Add("first_name", FirstName); - } - - if (LastName != null) - { - parameters.Add("last_name", LastName); - } - - if (Gender != null) - { - parameters.Add("gender", Gender); - } - - if (BirthdayDate != null) - { - parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - } - - if (Description != null) - { - parameters.Add("description", Description); - } - - if (City != null) - { - parameters.Add("city", City); - } - - if (Source != null) - { - parameters.Add("source", Source); - } - - return parameters; - } - } - - protected override string Resource => "contacts/" + ContactId; - public EditContact SetBirthdayDate(DateTime? birthdayDate) { - BirthdayDate = birthdayDate; + this.birthdayDate = birthdayDate; return this; } public EditContact SetCity(string city) { - City = city; + this.city = city; return this; } public EditContact SetDescription(string description) { - Description = description; + this.description = description; return this; } public EditContact SetEmail(string email) { - Email = email; + this.email = email; return this; } public EditContact SetFirstName(string firstName) { - FirstName = firstName; + this.firstName = firstName; return this; } public EditContact SetGender(string gender) { - Gender = gender; + this.gender = gender; return this; } public EditContact SetLastName(string lastName) { - LastName = lastName; + this.lastName = lastName; return this; } public EditContact SetPhoneNumber(string phoneNumber) { - PhoneNumber = phoneNumber; + this.phoneNumber = phoneNumber; return this; } public EditContact SetSource(string source) { - Source = source; + this.source = source; return this; } + + protected override string Uri() + { + return "contacts/" + ContactId; + } + + protected override NameValueCollection Values() + { + var values = new NameValueCollection(); + if (phoneNumber != null) + { + values.Add("phone_number", phoneNumber); + } + + if (email != null) + { + values.Add("email", email); + } + + if (firstName != null) + { + values.Add("first_name", firstName); + } + + if (lastName != null) + { + values.Add("last_name", lastName); + } + + if (gender != null) + { + values.Add("gender", gender); + } + + if (birthdayDate != null) + { + values.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); + } + + if (description != null) + { + values.Add("description", description); + } + + if (city != null) + { + values.Add("city", city); + } + + if (source != null) + { + values.Add("source", source); + } + + return values; + } } } diff --git a/smsapi/Api/Action/Contacts/EditField.cs b/smsapi/Api/Action/Contacts/EditField.cs index c748043..8084b15 100644 --- a/smsapi/Api/Action/Contacts/EditField.cs +++ b/smsapi/Api/Action/Contacts/EditField.cs @@ -3,39 +3,38 @@ namespace SMSApi.Api.Action { - public class EditField : Rest + public class EditField : Base { - public string Name; + private string fieldId; + private string name; public EditField(string fieldId) { - FieldId = fieldId; + this.fieldId = fieldId; } - public string FieldId { get; } - protected override RequestMethod Method => RequestMethod.PUT; - protected override NameValueCollection Parameters + public EditField SetName(string name) { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) - { - parameters.Add("name", Name); - } - - return parameters; - } + this.name = name; + return this; } - protected override string Resource => "contacts/fields/" + FieldId; + protected override string Uri() + { + return "contacts/fields/" + fieldId; + } - public EditField SetName(string name) + protected override NameValueCollection Values() { - Name = name; - return this; + var parameters = new NameValueCollection(); + if (name != null) + { + parameters.Add("name", name); + } + + return parameters; } } } diff --git a/smsapi/Api/Action/Contacts/EditGroup.cs b/smsapi/Api/Action/Contacts/EditGroup.cs index 822f68d..99451a1 100644 --- a/smsapi/Api/Action/Contacts/EditGroup.cs +++ b/smsapi/Api/Action/Contacts/EditGroup.cs @@ -3,65 +3,62 @@ namespace SMSApi.Api.Action { - public class EditGroup : Rest + public class EditGroup : Base { - public string Description; - - public string Idx; - - public string Name; + private string description; + private string groupId; + private string idx; + private string name; public EditGroup(string groupId) { - GroupId = groupId; + this.groupId = groupId; } - public string GroupId { get; } - protected override RequestMethod Method => RequestMethod.PUT; - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Name != null) - { - parameters.Add("name", Name); - } - - if (Description != null) - { - parameters.Add("desciption", Description); - } - - if (Idx != null) - { - parameters.Add("idx", Idx); - } - - return parameters; - } - } - - protected override string Resource => "contacts/groups/" + GroupId; - public EditGroup SetDescription(string description) { - Description = description; + this.description = description; return this; } public EditGroup SetIdx(string idx) { - Idx = idx; + this.idx = idx; return this; } public EditGroup SetName(string name) { - Name = name; + this.name = name; return this; } + + protected override string Uri() + { + return "contacts/groups/" + groupId; + } + + protected override NameValueCollection Values() + { + var parameters = new NameValueCollection(); + if (name != null) + { + parameters.Add("name", name); + } + + if (description != null) + { + parameters.Add("description", description); + } + + if (idx != null) + { + parameters.Add("idx", idx); + } + + return parameters; + } } } diff --git a/smsapi/Api/Action/Contacts/EditGroupPermission.cs b/smsapi/Api/Action/Contacts/EditGroupPermission.cs index bada62d..a65066a 100644 --- a/smsapi/Api/Action/Contacts/EditGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/EditGroupPermission.cs @@ -4,68 +4,64 @@ namespace SMSApi.Api.Action { - public class EditGroupPermission : Rest + public class EditGroupPermission : Base { - public bool? Read; - - public bool? Send; - - public bool? Write; + private string groupId; + private bool? read; + private bool? send; + private string username; + private bool? write; public EditGroupPermission(string groupId, string username) { - GroupId = groupId; - Username = username; + this.groupId = groupId; + this.username = username; } - public string GroupId { get; private set; } - - public string Username { get; private set; } - protected override RequestMethod Method => RequestMethod.PUT; - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Read != null) - { - parameters.Add("read", Convert.ToInt32(Read.Value).ToString()); - } - - if (Write != null) - { - parameters.Add("write", Convert.ToInt32(Write.Value).ToString()); - } - - if (Send != null) - { - parameters.Add("send", Convert.ToInt32(Send.Value).ToString()); - } - - return parameters; - } - } - - protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; - public EditGroupPermission SetRead(bool? read) { - Read = read; + this.read = read; return this; } public EditGroupPermission SetSend(bool? send) { - Send = send; + this.send = send; return this; } public EditGroupPermission SetWrite(bool? write) { - Write = write; + this.write = write; return this; } + + protected override string Uri() + { + return "contacts/groups/" + groupId + "/permissions/" + username; + } + + protected override NameValueCollection Values() + { + var parameters = new NameValueCollection(); + if (read != null) + { + parameters.Add("read", Convert.ToInt32(read.Value).ToString()); + } + + if (write != null) + { + parameters.Add("write", Convert.ToInt32(write.Value).ToString()); + } + + if (send != null) + { + parameters.Add("send", Convert.ToInt32(send.Value).ToString()); + } + + return parameters; + } } } diff --git a/smsapi/Api/Action/Contacts/GetContact.cs b/smsapi/Api/Action/Contacts/GetContact.cs index 7014083..fdfb8ad 100644 --- a/smsapi/Api/Action/Contacts/GetContact.cs +++ b/smsapi/Api/Action/Contacts/GetContact.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class GetContact : Rest + public class GetContact : Base { + private readonly string contactId; + public GetContact(string contactId) { - ContactId = contactId; + this.contactId = contactId; } - public string ContactId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/" + ContactId; + protected override string Uri() + { + return "contacts/" + contactId; + } } } diff --git a/smsapi/Api/Action/Contacts/GetContactGroup.cs b/smsapi/Api/Action/Contacts/GetContactGroup.cs index f030469..629c8ef 100644 --- a/smsapi/Api/Action/Contacts/GetContactGroup.cs +++ b/smsapi/Api/Action/Contacts/GetContactGroup.cs @@ -2,20 +2,22 @@ namespace SMSApi.Api.Action { - public class GetContactGroup : Rest + public class GetContactGroup : Base { + private readonly string contactId; + private readonly string groupId; + public GetContactGroup(string contactId, string groupId) { - ContactId = contactId; - GroupId = groupId; + this.contactId = contactId; + this.groupId = groupId; } - public string ContactId { get; private set; } - - public string GroupId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + protected override string Uri() + { + return "contacts/" + contactId + "/groups/" + groupId; + } } } diff --git a/smsapi/Api/Action/Contacts/GetGroup.cs b/smsapi/Api/Action/Contacts/GetGroup.cs index bf6e2e2..1b5c911 100644 --- a/smsapi/Api/Action/Contacts/GetGroup.cs +++ b/smsapi/Api/Action/Contacts/GetGroup.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class GetGroup : Rest + public class GetGroup : Base { + private string groupId; + public GetGroup(string groupId) { - GroupId = groupId; + this.groupId = groupId; } - public string GroupId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/groups/" + GroupId; + protected override string Uri() + { + return "contacts/groups/" + groupId; + } } } diff --git a/smsapi/Api/Action/Contacts/GetGroupPermission.cs b/smsapi/Api/Action/Contacts/GetGroupPermission.cs index 3068f0d..ccd12d3 100644 --- a/smsapi/Api/Action/Contacts/GetGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/GetGroupPermission.cs @@ -2,20 +2,22 @@ namespace SMSApi.Api.Action { - public class GetGroupPermission : Rest + public class GetGroupPermission : Base { + private readonly string groupId; + private readonly string username; + public GetGroupPermission(string groupId, string username) { - GroupId = groupId; - Username = username; + this.groupId = groupId; + this.username = username; } - public string GroupId { get; private set; } - - public string Username { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/groups/" + GroupId + "/permissions/" + Username; + protected override string Uri() + { + return "contacts/groups/" + groupId + "/permissions/" + username; + } } } diff --git a/smsapi/Api/Action/Contacts/ListContactGroups.cs b/smsapi/Api/Action/Contacts/ListContactGroups.cs index 811f5b0..8cacbaa 100644 --- a/smsapi/Api/Action/Contacts/ListContactGroups.cs +++ b/smsapi/Api/Action/Contacts/ListContactGroups.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class ListContactGroups : Rest + public class ListContactGroups : Base { + private readonly string contactId; + public ListContactGroups(string contactId) { - ContactId = contactId; + this.contactId = contactId; } - public string ContactId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/" + ContactId + "/groups"; + protected override string Uri() + { + return "contacts/" + contactId + "/groups"; + } } } diff --git a/smsapi/Api/Action/Contacts/ListContacts.cs b/smsapi/Api/Action/Contacts/ListContacts.cs index f4d9876..63d7c6c 100644 --- a/smsapi/Api/Action/Contacts/ListContacts.cs +++ b/smsapi/Api/Action/Contacts/ListContacts.cs @@ -4,149 +4,140 @@ namespace SMSApi.Api.Action { - public class ListContacts : Rest + public class ListContacts : Base { - public DateTime? BirthdayDate; - - public string Email; - - public string FirstName; - - public string Gender; - - public int? GroupId; - - public string LastName; - - public int? Limit; - - public int? Offset; - - public string PhoneNumber; - - public string Search; + private DateTime? birthdayDate; + private string email; + private string firstName; + private string gender; + private int? groupId; + private string lastName; + private int? limit; + private int? offset; + private string phoneNumber; + private string search; protected override RequestMethod Method => RequestMethod.GET; - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - if (Search != null) - { - parameters.Add("q", Search); - } - - if (Offset != null) - { - parameters.Add("offset", Offset.Value.ToString()); - } - - if (Limit != null) - { - parameters.Add("limit", Limit.Value.ToString()); - } - - if (PhoneNumber != null) - { - parameters.Add("phone_number", PhoneNumber); - } - - if (Email != null) - { - parameters.Add("email", Email); - } - - if (FirstName != null) - { - parameters.Add("first_name", FirstName); - } - - if (LastName != null) - { - parameters.Add("last_name", LastName); - } - - if (GroupId != null) - { - parameters.Add("group_id", GroupId.Value.ToString()); - } - - if (Gender != null) - { - parameters.Add("gender", Gender); - } - - if (BirthdayDate != null) - { - parameters.Add("birthday_date", BirthdayDate.Value.ToString("Y-m-d")); - } - - return parameters; - } - } - - protected override string Resource => "contacts"; - public ListContacts SetBirthdayDate(DateTime? birthdayDate) { - BirthdayDate = birthdayDate; + this.birthdayDate = birthdayDate; return this; } public ListContacts SetEmail(string email) { - Email = email; + this.email = email; return this; } public ListContacts SetFirstName(string firstName) { - FirstName = firstName; + this.firstName = firstName; return this; } public ListContacts SetGender(string gender) { - Gender = gender; + this.gender = gender; return this; } public ListContacts SetGroupId(int? groupId) { - GroupId = groupId; + this.groupId = groupId; return this; } public ListContacts SetLastName(string lastName) { - LastName = lastName; + this.lastName = lastName; return this; } public ListContacts SetLimit(int? limit) { - Limit = limit; + this.limit = limit; return this; } public ListContacts SetOffset(int? offset) { - Offset = offset; + this.offset = offset; return this; } public ListContacts SetPhoneNumber(string phoneNumber) { - PhoneNumber = phoneNumber; + this.phoneNumber = phoneNumber; return this; } public ListContacts SetSearch(string search) { - Search = search; + this.search = search; return this; } + + protected override string Uri() + { + return "contacts"; + } + + protected override NameValueCollection Values() + { + var parameters = new NameValueCollection(); + if (search != null) + { + parameters.Add("q", search); + } + + if (offset != null) + { + parameters.Add("offset", offset.Value.ToString()); + } + + if (limit != null) + { + parameters.Add("limit", limit.Value.ToString()); + } + + if (phoneNumber != null) + { + parameters.Add("phone_number", phoneNumber); + } + + if (email != null) + { + parameters.Add("email", email); + } + + if (firstName != null) + { + parameters.Add("first_name", firstName); + } + + if (lastName != null) + { + parameters.Add("last_name", lastName); + } + + if (groupId != null) + { + parameters.Add("group_id", groupId.Value.ToString()); + } + + if (gender != null) + { + parameters.Add("gender", gender); + } + + if (birthdayDate != null) + { + parameters.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); + } + + return parameters; + } } } diff --git a/smsapi/Api/Action/Contacts/ListFieldOptions.cs b/smsapi/Api/Action/Contacts/ListFieldOptions.cs index 42a2d9d..621ce0b 100644 --- a/smsapi/Api/Action/Contacts/ListFieldOptions.cs +++ b/smsapi/Api/Action/Contacts/ListFieldOptions.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class ListFieldOptions : Rest + public class ListFieldOptions : Base { + private readonly string fieldId; + public ListFieldOptions(string fieldId) { - FieldId = fieldId; + this.fieldId = fieldId; } - public string FieldId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/fields/" + FieldId + "/options"; + protected override string Uri() + { + return "contacts/fields/" + fieldId + "/options"; + } } } diff --git a/smsapi/Api/Action/Contacts/ListFields.cs b/smsapi/Api/Action/Contacts/ListFields.cs index df254b2..fe1c123 100644 --- a/smsapi/Api/Action/Contacts/ListFields.cs +++ b/smsapi/Api/Action/Contacts/ListFields.cs @@ -2,10 +2,13 @@ namespace SMSApi.Api.Action { - public class ListFields : Rest + public class ListFields : Base { protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/fields"; + protected override string Uri() + { + return "contacts/fields"; + } } } diff --git a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs index 9fc814f..adfef95 100644 --- a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs +++ b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs @@ -2,17 +2,20 @@ namespace SMSApi.Api.Action { - public class ListGroupPermissions : Rest + public class ListGroupPermissions : Base { + private string groupId; + public ListGroupPermissions(string groupId) { - GroupId = groupId; + this.groupId = groupId; } - public string GroupId { get; private set; } - protected override RequestMethod Method => RequestMethod.GET; - protected override string Resource => "contacts/groups/" + GroupId + "/permissions"; + protected override string Uri() + { + return "contacts/groups/" + groupId + "/permissions"; + } } } diff --git a/smsapi/Api/Action/Contacts/ListGroups.cs b/smsapi/Api/Action/Contacts/ListGroups.cs index b6369f4..b8e2300 100644 --- a/smsapi/Api/Action/Contacts/ListGroups.cs +++ b/smsapi/Api/Action/Contacts/ListGroups.cs @@ -3,46 +3,48 @@ namespace SMSApi.Api.Action { - public class ListGroups : Rest + public class ListGroups : Base { - public string Id; - - public string Name; + private string id; + private string name; protected override RequestMethod Method => RequestMethod.GET; - protected override NameValueCollection Parameters - { - get - { - NameValueCollection parameters = base.Parameters; - parameters.Add("with", "contacts_count"); - if (Id != null) - { - parameters.Add("id", Id); - } - - if (Name != null) - { - parameters.Add("name", Name); - } - - return parameters; - } - } - - protected override string Resource => "contacts/groups"; - public ListGroups SetId(string id) { - Id = id; + this.id = id; return this; } public ListGroups SetName(string name) { - Name = name; + this.name = name; return this; } + + protected override string Uri() + { + return "contacts/groups"; + } + + protected override NameValueCollection Values() + { + var parameters = new NameValueCollection + { + { "with", "contacts_count" } + }; + + if (id != null) + { + parameters.Add("id", id); + } + + if (name != null) + { + parameters.Add("name", name); + } + + return parameters; + } } } diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index 42eafdb..2bd77c2 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -2,20 +2,22 @@ namespace SMSApi.Api.Action { - public class UnbindContactFromGroup : Rest + public class UnbindContactFromGroup : Base { + private readonly string contactId; + private readonly string groupId; + public UnbindContactFromGroup(string contactId, string groupId) { - ContactId = contactId; - GroupId = groupId; + this.contactId = contactId; + this.groupId = groupId; } - public string ContactId { get; private set; } - - public string GroupId { get; private set; } - protected override RequestMethod Method => RequestMethod.DELETE; - protected override string Resource => "contacts/" + ContactId + "/groups/" + GroupId; + protected override string Uri() + { + return "contacts/" + contactId + "/groups/" + groupId; + } } } diff --git a/smsapi/Api/Action/Rest.cs b/smsapi/Api/Action/Rest.cs deleted file mode 100644 index 4361596..0000000 --- a/smsapi/Api/Action/Rest.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Specialized; -using System.Web; - -namespace SMSApi.Api.Action -{ - public abstract class Rest : Base - { - protected virtual NameValueCollection Parameters => HttpUtility.ParseQueryString(string.Empty); - - protected abstract string Resource { get; } - - protected override string Uri() - { - return Resource; - } - - protected override NameValueCollection Values() - { - return Parameters; - } - } -} From 7746f8e95949d8b3a14ac5062e19353af4a4560c Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 14:35:04 +0100 Subject: [PATCH 017/101] Add async Execute --- smsapi/Api/Action/Base.cs | 25 +++++++++++ smsapi/Proxy.cs | 33 +++++++++++++-- smsapi/ProxyHTTP.cs | 87 ++++++++++++++++++++++++++++++++------- 3 files changed, 128 insertions(+), 17 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index a4b824f..cf99b99 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -4,6 +4,7 @@ using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; +using System.Threading.Tasks; using System.Web; using SMSApi.Api.Response; @@ -42,6 +43,30 @@ public T Execute() return response; } + public async Task ExecuteAsync() + { + Validate(); + + T response; + Stream data = await proxy.ExecuteAsync(Uri(), Values(), Files(), Method); + + HandleError(data); + + try + { + response = ResponseToObject(data); + } + catch (SerializationException e) + { + //Problem z prasowaniem json'a + throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); + } + + data.Close(); + + return response; + } + public void Proxy(Proxy proxy) { this.proxy = proxy; diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index a2c14d6..b9a6156 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.IO; +using System.Threading.Tasks; namespace SMSApi.Api { @@ -15,13 +16,39 @@ public enum RequestMethod public interface Proxy { void Authentication(IClient client); - Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST); - Stream Execute(string uri, NameValueCollection data, Stream file, RequestMethod method = RequestMethod.POST); Stream Execute( + string uri, + NameValueCollection data, + RequestMethod method = RequestMethod.POST); + + Stream Execute( + string uri, + NameValueCollection data, + Stream file, + RequestMethod method = RequestMethod.POST); + + Stream Execute( + string uri, + NameValueCollection data, + Dictionary files, + RequestMethod method = RequestMethod.POST); + + Task ExecuteAsync( + string uri, + NameValueCollection data, + RequestMethod method = RequestMethod.POST); + + Task ExecuteAsync( + string uri, + NameValueCollection data, + Stream file, + RequestMethod method = RequestMethod.POST); + + Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, RequestMethod method = RequestMethod.POST); } -} +} diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index b227cf2..7c0e730 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -3,6 +3,7 @@ using System.Collections.Specialized; using System.IO; using System.Net; +using System.Threading.Tasks; using RestSharp; using RestSharp.Authenticators; @@ -64,33 +65,56 @@ public Stream Execute( Dictionary files, RequestMethod method = RequestMethod.POST) { + var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - var client = new RestClient(baseUrl + uri); + RestClient client = CreateClient(uri); + IRestRequest request = CreateRequest(responseStream, data, files, method); - if (authentication != null) + try { - client.UserAgent = authentication.GetClientAgentHeader(); - client.Authenticator = GetAuthenticator(); + client.Execute(request); } - - var request = new RestRequest(ToMethod(method)); - foreach (string key in data.Keys) + catch (System.Exception e) { - request.AddParameter(key, data[key]); + throw new ProxyException("Failed to get response from " + client.BuildUri(request), e); } - foreach (KeyValuePair file in files) - { - request.AddFile(file.Key, s => file.Value.CopyTo(s), file.Key, file.Value.Length); - } + return responseStream; + } + public async Task ExecuteAsync( + string uri, + NameValueCollection data, + RequestMethod method = RequestMethod.POST) + { + return await ExecuteAsync(uri, data, new Dictionary(), method); + } + + public async Task ExecuteAsync( + string uri, + NameValueCollection data, + Stream file, + RequestMethod method = RequestMethod.POST) + { + return await ExecuteAsync(uri, data, new Dictionary { { "file", file } }, method); + } + + public async Task ExecuteAsync( + string uri, + NameValueCollection data, + Dictionary files, + RequestMethod method = RequestMethod.POST) + { var responseStream = new MemoryStream(); - request.ResponseWriter = s => s.CopyTo(responseStream); + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + RestClient client = CreateClient(uri); + IRestRequest request = CreateRequest(responseStream, data, files, method); try { - client.Execute(request); + await client.ExecuteAsync(request); } catch (System.Exception e) { @@ -100,6 +124,28 @@ public Stream Execute( return responseStream; } + private static IRestRequest CreateRequest( + Stream responseStream, + NameValueCollection data, + Dictionary files, + RequestMethod method) + { + var request = new RestRequest(ToMethod(method)); + foreach (string key in data.Keys) + { + request.AddParameter(key, data[key]); + } + + foreach (KeyValuePair file in files) + { + request.AddFile(file.Key, s => file.Value.CopyTo(s), file.Key, file.Value.Length); + } + + request.ResponseWriter = s => s.CopyTo(responseStream); + + return request; + } + private static Method ToMethod(RequestMethod method) { switch (method) @@ -121,6 +167,19 @@ private static Method ToMethod(RequestMethod method) } } + private RestClient CreateClient(string uri) + { + var client = new RestClient(baseUrl + uri); + + if (authentication != null) + { + client.UserAgent = authentication.GetClientAgentHeader(); + client.Authenticator = GetAuthenticator(); + } + + return client; + } + private IAuthenticator GetAuthenticator() { switch (authentication) From c5582508a3b6ae91c7bda949e9dc6579dc22f08a Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 14:35:25 +0100 Subject: [PATCH 018/101] Unify tests namespaces --- smsapiTests/AuthorizationType.cs | 2 +- smsapiTests/ConfigurationTest.cs | 3 ++- smsapiTests/SmsTest.cs | 1 + smsapiTests/TestBase.cs | 1 - 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/smsapiTests/AuthorizationType.cs b/smsapiTests/AuthorizationType.cs index 61345bc..03ea691 100644 --- a/smsapiTests/AuthorizationType.cs +++ b/smsapiTests/AuthorizationType.cs @@ -1,4 +1,4 @@ -namespace SMSApi.Api.Tests +namespace smsapiTests { public enum AuthorizationType { diff --git a/smsapiTests/ConfigurationTest.cs b/smsapiTests/ConfigurationTest.cs index 013601d..3895dd1 100644 --- a/smsapiTests/ConfigurationTest.cs +++ b/smsapiTests/ConfigurationTest.cs @@ -1,8 +1,9 @@ using System; using System.Configuration; using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; -namespace SMSApi.Api.Tests +namespace smsapiTests { [TestClass] public class ConfigurationTest diff --git a/smsapiTests/SmsTest.cs b/smsapiTests/SmsTest.cs index 7a9d222..938c664 100644 --- a/smsapiTests/SmsTest.cs +++ b/smsapiTests/SmsTest.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Response; diff --git a/smsapiTests/TestBase.cs b/smsapiTests/TestBase.cs index 1c3e0d6..6af675c 100644 --- a/smsapiTests/TestBase.cs +++ b/smsapiTests/TestBase.cs @@ -2,7 +2,6 @@ using System.Configuration; using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -using SMSApi.Api.Tests; namespace smsapiTests { From ae39154a15d379e2d776051cea03cac8217fc5d0 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 5 Nov 2021 14:49:48 +0100 Subject: [PATCH 019/101] Remove redundant action.Client calls --- smsapi/Api/Action/Base.cs | 3 --- smsapi/Api/ContactsFactory.cs | 24 --------------------- smsapi/Api/Factory.cs | 27 ++++++++++-------------- smsapi/Api/HLRFactory.cs | 4 ---- smsapi/Api/MMSFactory.cs | 11 ---------- smsapi/Api/PhonebookFactory.cs | 38 ---------------------------------- smsapi/Api/SMSFactory.cs | 11 ---------- smsapi/Api/SenderFactory.cs | 15 -------------- smsapi/Api/UserFactory.cs | 17 --------------- smsapi/Api/VMSFactory.cs | 11 ---------- 10 files changed, 11 insertions(+), 150 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index cf99b99..ce775c1 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -16,9 +16,6 @@ public abstract class Base protected virtual RequestMethod Method => RequestMethod.POST; - public void Client(IClient client) - { } - public T Execute() { Validate(); diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index 306e2e2..8a4942b 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -19,7 +19,6 @@ public ContactsFactory(IClient client, Proxy proxy) public BindContactToGroup BindContactToGroup(string contactId, string groupId) { var action = new BindContactToGroup(contactId, groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -27,7 +26,6 @@ public BindContactToGroup BindContactToGroup(string contactId, string groupId) public CreateContact CreateContact() { var action = new CreateContact(); - action.Client(client); action.Proxy(proxy); return action; } @@ -35,7 +33,6 @@ public CreateContact CreateContact() public CreateField CreateField() { var action = new CreateField(); - action.Client(client); action.Proxy(proxy); return action; } @@ -43,7 +40,6 @@ public CreateField CreateField() public CreateGroup CreateGroup() { var action = new CreateGroup(); - action.Client(client); action.Proxy(proxy); return action; } @@ -51,7 +47,6 @@ public CreateGroup CreateGroup() public CreateGroupPermission CreateGroupPermission(string groupId) { var action = new CreateGroupPermission(groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -59,7 +54,6 @@ public CreateGroupPermission CreateGroupPermission(string groupId) public DeleteContact DeleteContact(string contactId) { var action = new DeleteContact(contactId); - action.Client(client); action.Proxy(proxy); return action; } @@ -67,7 +61,6 @@ public DeleteContact DeleteContact(string contactId) public DeleteField DeleteField(string fieldId) { var action = new DeleteField(fieldId); - action.Client(client); action.Proxy(proxy); return action; } @@ -75,7 +68,6 @@ public DeleteField DeleteField(string fieldId) public DeleteGroup DeleteGroup(string groupId) { var action = new DeleteGroup(groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -83,7 +75,6 @@ public DeleteGroup DeleteGroup(string groupId) public DeleteGroupPermission DeleteGroupPermission(string groupId, string username) { var action = new DeleteGroupPermission(groupId, username); - action.Client(client); action.Proxy(proxy); return action; } @@ -91,7 +82,6 @@ public DeleteGroupPermission DeleteGroupPermission(string groupId, string userna public EditContact EditContact(string contactId) { var action = new EditContact(contactId); - action.Client(client); action.Proxy(proxy); return action; } @@ -99,7 +89,6 @@ public EditContact EditContact(string contactId) public EditField EditField(string fieldId) { var action = new EditField(fieldId); - action.Client(client); action.Proxy(proxy); return action; } @@ -107,7 +96,6 @@ public EditField EditField(string fieldId) public EditGroup EditGroup(string groupId) { var action = new EditGroup(groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -115,7 +103,6 @@ public EditGroup EditGroup(string groupId) public EditGroupPermission EditGroupPermission(string groupId, string username) { var action = new EditGroupPermission(groupId, username); - action.Client(client); action.Proxy(proxy); return action; } @@ -123,7 +110,6 @@ public EditGroupPermission EditGroupPermission(string groupId, string username) public GetContact GetContact(string contactId) { var action = new GetContact(contactId); - action.Client(client); action.Proxy(proxy); return action; } @@ -131,7 +117,6 @@ public GetContact GetContact(string contactId) public GetContactGroup GetContactGroup(string contactId, string groupId) { var action = new GetContactGroup(contactId, groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -139,7 +124,6 @@ public GetContactGroup GetContactGroup(string contactId, string groupId) public GetGroup GetGroup(string groupId) { var action = new GetGroup(groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -147,7 +131,6 @@ public GetGroup GetGroup(string groupId) public GetGroupPermission GetGroupPermission(string groupId, string username) { var action = new GetGroupPermission(groupId, username); - action.Client(client); action.Proxy(proxy); return action; } @@ -155,7 +138,6 @@ public GetGroupPermission GetGroupPermission(string groupId, string username) public ListContactGroups ListContactGroups(string contactId) { var action = new ListContactGroups(contactId); - action.Client(client); action.Proxy(proxy); return action; } @@ -163,7 +145,6 @@ public ListContactGroups ListContactGroups(string contactId) public ListContacts ListContacts() { var action = new ListContacts(); - action.Client(client); action.Proxy(proxy); return action; } @@ -171,7 +152,6 @@ public ListContacts ListContacts() public ListFieldOptions ListFieldOptions(string fieldId) { var action = new ListFieldOptions(fieldId); - action.Client(client); action.Proxy(proxy); return action; } @@ -179,7 +159,6 @@ public ListFieldOptions ListFieldOptions(string fieldId) public ListFields ListFields() { var action = new ListFields(); - action.Client(client); action.Proxy(proxy); return action; } @@ -187,7 +166,6 @@ public ListFields ListFields() public ListGroupPermissions ListGroupPermissions(string groupId) { var action = new ListGroupPermissions(groupId); - action.Client(client); action.Proxy(proxy); return action; } @@ -195,7 +173,6 @@ public ListGroupPermissions ListGroupPermissions(string groupId) public ListGroups ListGroups() { var action = new ListGroups(); - action.Client(client); action.Proxy(proxy); return action; } @@ -203,7 +180,6 @@ public ListGroups ListGroups() public UnbindContactFromGroup UnbindContactFromGroup(string contactId, string groupId) { var action = new UnbindContactFromGroup(contactId, groupId); - action.Client(client); action.Proxy(proxy); return action; } diff --git a/smsapi/Api/Factory.cs b/smsapi/Api/Factory.cs index 67df9cc..0dbd000 100644 --- a/smsapi/Api/Factory.cs +++ b/smsapi/Api/Factory.cs @@ -13,47 +13,42 @@ public abstract class Factory { ProxyAddress.BackupSmsApiCom, "https://api2.smsapi.com/" } }; - protected IClient client; protected Proxy proxy; - public Factory(ProxyAddress address = ProxyAddress.SmsApiPl) + private IClient client; + + protected Factory(ProxyAddress address = ProxyAddress.SmsApiPl) { Proxy(address); } - public Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + protected Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) : this(address) { Client(client); } - public Factory(IClient client, Proxy proxy) + protected Factory(IClient client, Proxy proxy) { Client(client); Proxy(proxy); } - public void Client(IClient client) + private void Client(IClient client) { this.client = client; - if (proxy != null) - { - proxy.Authentication(client); - } + proxy?.Authentication(client); } - public void Proxy(Proxy proxy) + private void Proxy(Proxy proxy) { this.proxy = proxy; - if (proxy != null) - { - proxy.Authentication(client); - } + proxy?.Authentication(client); } - public void Proxy(ProxyAddress address) + private void Proxy(ProxyAddress address) { Proxy(new ProxyHTTP(_addresses[address])); } } -} +} diff --git a/smsapi/Api/HLRFactory.cs b/smsapi/Api/HLRFactory.cs index b4ed560..ac0cc8f 100644 --- a/smsapi/Api/HLRFactory.cs +++ b/smsapi/Api/HLRFactory.cs @@ -19,12 +19,8 @@ public HLRFactory(IClient client, Proxy proxy) public HLRCheckNumber ActionCheckNumber(string number = null) { var action = new HLRCheckNumber(); - - action.Client(client); action.Proxy(proxy); - action.SetNumber(number); - return action; } } diff --git a/smsapi/Api/MMSFactory.cs b/smsapi/Api/MMSFactory.cs index df20b2f..b016f8d 100644 --- a/smsapi/Api/MMSFactory.cs +++ b/smsapi/Api/MMSFactory.cs @@ -19,33 +19,24 @@ public MMSFactory(IClient client, Proxy proxy) public MMSDelete ActionDelete(string id = null) { var action = new MMSDelete(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public MMSGet ActionGet(string id = null) { var action = new MMSGet(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public MMSGet ActionGet(string[] id) { var action = new MMSGet(); - - action.Client(client); action.Proxy(proxy); action.Ids(id); - return action; } @@ -58,10 +49,8 @@ public MMSSend ActionSend(string to = null) public MMSSend ActionSend(string[] to) { var action = new MMSSend(); - action.Client(client); action.Proxy(proxy); action.SetTo(to); - return action; } } diff --git a/smsapi/Api/PhonebookFactory.cs b/smsapi/Api/PhonebookFactory.cs index 914815f..f2f1af0 100644 --- a/smsapi/Api/PhonebookFactory.cs +++ b/smsapi/Api/PhonebookFactory.cs @@ -21,116 +21,78 @@ public PhonebookFactory(IClient client, Proxy proxy) public PhonebookContactAdd ActionContactAdd(string number = null) { var action = new PhonebookContactAdd(); - - action.Client(client); action.Proxy(proxy); - action.SetNumber(number); - return action; } public PhonebookContactDelete ActionContactDelete(string number = null) { var action = new PhonebookContactDelete(); - - action.Client(client); action.Proxy(proxy); - action.Number(number); - return action; } public PhonebookContactEdit ActionContactEdit(string number = null) { var action = new PhonebookContactEdit(); - - action.Client(client); action.Proxy(proxy); - action.Number(number); - return action; } public PhonebookContactGet ActionContactGet(string number = null) { var action = new PhonebookContactGet(); - - action.Client(client); action.Proxy(proxy); - action.Number(number); - return action; } public PhonebookContactList ActionContactList() { var action = new PhonebookContactList(); - - action.Client(client); action.Proxy(proxy); - return action; } public PhonebookGroupAdd ActionGroupAdd(string name = null) { var action = new PhonebookGroupAdd(); - - action.Client(client); action.Proxy(proxy); - action.SetName(name); - return action; } public PhonebookGroupDelete ActionGroupDelete(string name = null) { var action = new PhonebookGroupDelete(); - - action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } public PhonebookGroupEdit ActionGroupEdit(string name = null) { var action = new PhonebookGroupEdit(); - - action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } public PhonebookGroupGet ActionGroupGet(string name = null) { var action = new PhonebookGroupGet(); - - action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } public PhonebookGroupList ActionGroupList() { var action = new PhonebookGroupList(); - - action.Client(client); action.Proxy(proxy); - return action; } } diff --git a/smsapi/Api/SMSFactory.cs b/smsapi/Api/SMSFactory.cs index 8884528..bb05001 100644 --- a/smsapi/Api/SMSFactory.cs +++ b/smsapi/Api/SMSFactory.cs @@ -19,33 +19,24 @@ public SMSFactory(IClient client, Proxy proxy) public SMSDelete ActionDelete(string id = null) { var action = new SMSDelete(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public SMSGet ActionGet(string id = null) { var action = new SMSGet(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public SMSGet ActionGet(string[] id) { var action = new SMSGet(); - - action.Client(client); action.Proxy(proxy); action.Ids(id); - return action; } @@ -58,11 +49,9 @@ public SMSSend ActionSend(string to = null, string text = null) public SMSSend ActionSend(string[] to, string text = null) { var action = new SMSSend(); - action.Client(client); action.Proxy(proxy); action.SetTo(to); action.SetText(text); - return action; } } diff --git a/smsapi/Api/SenderFactory.cs b/smsapi/Api/SenderFactory.cs index 5e53595..96fabe8 100644 --- a/smsapi/Api/SenderFactory.cs +++ b/smsapi/Api/SenderFactory.cs @@ -19,46 +19,31 @@ public SenderFactory(IClient client, Proxy proxy) public SenderAdd ActionAdd(string name = null) { var action = new SenderAdd(); - - action.Client(client); action.Proxy(proxy); - action.SetName(name); - return action; } public SenderDelete ActionDelete(string name = null) { var action = new SenderDelete(); - - action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } public SenderList ActionList() { var action = new SenderList(); - - action.Client(client); action.Proxy(proxy); - return action; } public SenderSetDefault ActionSetDefault(string name = null) { var action = new SenderSetDefault(); - - action.Client(client); action.Proxy(proxy); - action.Name(name); - return action; } } diff --git a/smsapi/Api/UserFactory.cs b/smsapi/Api/UserFactory.cs index b7ff32b..58facad 100644 --- a/smsapi/Api/UserFactory.cs +++ b/smsapi/Api/UserFactory.cs @@ -19,54 +19,37 @@ public UserFactory(IClient client, Proxy proxy) public UserAdd ActionAdd() { var action = new UserAdd(); - - action.Client(client); action.Proxy(proxy); - return action; } public UserEdit ActionEdit(string username = null) { var action = new UserEdit(); - - action.Client(client); action.Proxy(proxy); - action.Username(username); - return action; } public UserGet ActionGet(string username = null) { var action = new UserGet(); - - action.Client(client); action.Proxy(proxy); - action.Username(username); - return action; } public UserGetCredits ActionGetCredits() { var action = new UserGetCredits(); - - action.Client(client); action.Proxy(proxy); - return action; } public UserList ActionList() { var action = new UserList(); - - action.Client(client); action.Proxy(proxy); - return action; } } diff --git a/smsapi/Api/VMSFactory.cs b/smsapi/Api/VMSFactory.cs index e0bed2e..c1a6080 100644 --- a/smsapi/Api/VMSFactory.cs +++ b/smsapi/Api/VMSFactory.cs @@ -19,33 +19,24 @@ public VMSFactory(IClient client, Proxy proxy) public VMSDelete ActionDelete(string id = null) { var action = new VMSDelete(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public VMSGet ActionGet(string id = null) { var action = new VMSGet(); - - action.Client(client); action.Proxy(proxy); action.Id(id); - return action; } public VMSGet ActionGet(string[] id) { var action = new VMSGet(); - - action.Client(client); action.Proxy(proxy); action.Ids(id); - return action; } @@ -58,10 +49,8 @@ public VMSSend ActionSend(string to = null) public VMSSend ActionSend(string[] to) { var action = new VMSSend(); - action.Client(client); action.Proxy(proxy); action.SetTo(to); - return action; } } From 5e4bb95f0f376be6cfe4dc6668124e92d77019a2 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 01:50:04 +0100 Subject: [PATCH 020/101] Update target frameworks and nugets --- smsapi/Api/Action/VMS/Send.cs | 3 +- smsapi/Properties/Resources.Designer.cs | 63 +++++++++++++++ smsapi/Properties/Resources.resx | 101 ++++++++++++++++++++++++ smsapi/ProxyHTTP.cs | 35 +++++--- smsapi/smsapi.csproj | 19 ++++- smsapiTests/Contacts/GroupsTest.cs | 20 ++++- smsapiTests/smsapiTests.csproj | 20 ++--- 7 files changed, 233 insertions(+), 28 deletions(-) create mode 100644 smsapi/Properties/Resources.Designer.cs create mode 100644 smsapi/Properties/Resources.resx diff --git a/smsapi/Api/Action/VMS/Send.cs b/smsapi/Api/Action/VMS/Send.cs index 5833176..8f2c4d0 100644 --- a/smsapi/Api/Action/VMS/Send.cs +++ b/smsapi/Api/Action/VMS/Send.cs @@ -120,11 +120,10 @@ public VMSSend SetTTSLector(string lector) protected override Dictionary Files() { - Dictionary files = null; + Dictionary files = new Dictionary(); if (File != null && File.Length > 0) { - files = new Dictionary(); files.Add("file", File); } diff --git a/smsapi/Properties/Resources.Designer.cs b/smsapi/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d5817d9 --- /dev/null +++ b/smsapi/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace smsapi.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("smsapi.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/smsapi/Properties/Resources.resx b/smsapi/Properties/Resources.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/smsapi/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 7c0e730..51d909a 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using RestSharp; using RestSharp.Authenticators; +using RestSharp.Authenticators.OAuth2; namespace SMSApi.Api { @@ -69,7 +70,7 @@ public Stream Execute( ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; RestClient client = CreateClient(uri); - IRestRequest request = CreateRequest(responseStream, data, files, method); + RestRequest request = CreateRequest(responseStream, data, files, method); try { @@ -110,7 +111,7 @@ public async Task ExecuteAsync( ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; RestClient client = CreateClient(uri); - IRestRequest request = CreateRequest(responseStream, data, files, method); + RestRequest request = CreateRequest(responseStream, data, files, method); try { @@ -124,13 +125,22 @@ public async Task ExecuteAsync( return responseStream; } - private static IRestRequest CreateRequest( + private static RestRequest CreateRequest( Stream responseStream, NameValueCollection data, Dictionary files, RequestMethod method) { - var request = new RestRequest(ToMethod(method)); + var request = new RestRequest() + { + Method = ToMethod(method), + ResponseWriter = s => + { + s.CopyTo(responseStream); + return s; + } + }; + foreach (string key in data.Keys) { request.AddParameter(key, data[key]); @@ -138,11 +148,9 @@ private static IRestRequest CreateRequest( foreach (KeyValuePair file in files) { - request.AddFile(file.Key, s => file.Value.CopyTo(s), file.Key, file.Value.Length); + request.AddFile(file.Key, () => file.Value, file.Key); } - request.ResponseWriter = s => s.CopyTo(responseStream); - return request; } @@ -151,16 +159,16 @@ private static Method ToMethod(RequestMethod method) switch (method) { case RequestMethod.DELETE: - return Method.DELETE; + return Method.Delete; case RequestMethod.GET: - return Method.GET; + return Method.Get; case RequestMethod.POST: - return Method.POST; + return Method.Post; case RequestMethod.PUT: - return Method.PUT; + return Method.Put; default: throw new NotSupportedException(); @@ -169,11 +177,12 @@ private static Method ToMethod(RequestMethod method) private RestClient CreateClient(string uri) { - var client = new RestClient(baseUrl + uri); + var options = new RestClientOptions(baseUrl + uri); + var client = new RestClient(options); if (authentication != null) { - client.UserAgent = authentication.GetClientAgentHeader(); + options.UserAgent = authentication.GetClientAgentHeader(); client.Authenticator = GetAuthenticator(); } diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 8676d0d..f223c7a 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -3,9 +3,10 @@ 8.0.30703 2.0 - net452;netcoreapp3.1;netstandard2.0;netstandard2.1 + netcoreapp3.1;net5.0;net6.0;net7.0 false false + 9.0 SMSAPI.pl @@ -16,6 +17,7 @@ SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. smsapi + net6.0 @@ -31,6 +33,19 @@ - + + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + \ No newline at end of file diff --git a/smsapiTests/Contacts/GroupsTest.cs b/smsapiTests/Contacts/GroupsTest.cs index e855fb9..0699bdb 100644 --- a/smsapiTests/Contacts/GroupsTest.cs +++ b/smsapiTests/Contacts/GroupsTest.cs @@ -48,8 +48,16 @@ public void EditGroup() Assert.AreEqual(_group.Id, response.Id); Assert.AreNotEqual(_group.Name, response.Name); Assert.AreEqual("GroupY", response.Name); - Assert.AreEqual(_group.Idx, response.Idx); Assert.AreEqual(_group.Description, response.Description); + + if (string.IsNullOrEmpty(_group.Idx)) + { + Assert.IsTrue(string.IsNullOrEmpty(response.Idx)); + } + else + { + Assert.AreEqual(_group.Idx, response.Idx); + } } [TestMethod] @@ -73,8 +81,16 @@ public void GetGroup() Assert.AreEqual(_group.Id, response.Id); Assert.AreEqual(_group.Name, response.Name); - Assert.AreEqual(_group.Idx, response.Idx); Assert.AreEqual(_group.Description, response.Description); + + if (string.IsNullOrEmpty(_group.Idx)) + { + Assert.IsTrue(string.IsNullOrEmpty(response.Idx)); + } + else + { + Assert.AreEqual(_group.Idx, response.Idx); + } } [TestMethod] diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index f0bb712..1396418 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -1,7 +1,7 @@  - net452;netcoreapp3.1; + net6.0 false @@ -9,9 +9,6 @@ - - - @@ -20,18 +17,23 @@ - - + + + + - + - + - 4.7.0 + 6.0.1 + + + From 55516a7eb0a221e2afc6a44c84d73efb4bde49f6 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 02:15:40 +0100 Subject: [PATCH 021/101] Fix smsapi package target frameworks --- smsapi/smsapi.csproj | 2 +- smsapiTests/smsapiTests.csproj | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index f223c7a..80e8a83 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -17,7 +17,7 @@ SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. smsapi - net6.0 + netcoreapp3.1;net5.0;net6.0;net7.0 diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index 1396418..d9b1f6d 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -1,7 +1,7 @@  - net6.0 + netcoreapp3.1;net5.0;net6.0;net7.0 false @@ -25,12 +25,6 @@ - - - - 6.0.1 - - From 3fcb52178a9cde9cae5fbbd0e0f67c65a5eed922 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 02:23:11 +0100 Subject: [PATCH 022/101] Add SmsApiIo proxy --- smsapi/Api/Factory.cs | 15 ++------------- smsapi/ProxyAddress.cs | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/smsapi/Api/Factory.cs b/smsapi/Api/Factory.cs index 0dbd000..753b841 100644 --- a/smsapi/Api/Factory.cs +++ b/smsapi/Api/Factory.cs @@ -1,18 +1,7 @@ -using System.Collections.Generic; - -namespace SMSApi.Api +namespace SMSApi.Api { public abstract class Factory { - private static Dictionary _addresses = - new Dictionary - { - { ProxyAddress.SmsApiPl, "https://api.smsapi.pl/" }, - { ProxyAddress.BackupSmsApiPl, "https://api2.smsapi.pl/" }, - { ProxyAddress.SmsApiCom, "https://api.smsapi.com/" }, - { ProxyAddress.BackupSmsApiCom, "https://api2.smsapi.com/" } - }; - protected Proxy proxy; private IClient client; @@ -48,7 +37,7 @@ private void Proxy(Proxy proxy) private void Proxy(ProxyAddress address) { - Proxy(new ProxyHTTP(_addresses[address])); + Proxy(new ProxyHTTP(address.GetUrl())); } } } diff --git a/smsapi/ProxyAddress.cs b/smsapi/ProxyAddress.cs index 1bd1976..99d86a9 100644 --- a/smsapi/ProxyAddress.cs +++ b/smsapi/ProxyAddress.cs @@ -2,9 +2,36 @@ { public enum ProxyAddress { + SmsApiIo, SmsApiPl, BackupSmsApiPl, SmsApiCom, BackupSmsApiCom } + + public static class ProxyAddressExtensions + { + public static string GetUrl(this ProxyAddress proxy) + { + switch (proxy) + { + case ProxyAddress.SmsApiIo: + return "https://smsapi.io/"; + + case ProxyAddress.SmsApiPl: + return "https://api.smsapi.pl/"; + + case ProxyAddress.BackupSmsApiPl: + return "https://api2.smsapi.pl/"; + + case ProxyAddress.SmsApiCom: + return "https://api.smsapi.com/"; + + case ProxyAddress.BackupSmsApiCom: + return "https://api2.smsapi.com/"; + } + + throw new ProxyException("Proxy address does not exist."); + } + } } From bb36281ba3e41e3a21a0ed9a5d23b19a4333d93d Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 22:06:54 +0100 Subject: [PATCH 023/101] Formatting --- smsapi/ActionException.cs | 2 +- smsapi/Api/Action/Base.cs | 26 +++++++++++++------------- smsapi/Api/Action/User/GetPoints.cs | 2 +- smsapi/Api/ContactsFactory.cs | 2 +- smsapi/Api/HLRFactory.cs | 2 +- smsapi/Api/PhonebookFactory.cs | 2 +- smsapi/Api/Response/Points.cs | 2 +- smsapi/Api/SMSFactory.cs | 2 +- smsapi/Api/VMSFactory.cs | 2 +- smsapi/ClientException.cs | 2 +- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/smsapi/ActionException.cs b/smsapi/ActionException.cs index 3cbf849..b91f803 100644 --- a/smsapi/ActionException.cs +++ b/smsapi/ActionException.cs @@ -6,4 +6,4 @@ public ActionException(string message, string code) : base(message, code) { } } -} +} diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index ce775c1..0dd3a81 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -107,14 +107,14 @@ protected virtual NameValueCollection Values() return HttpUtility.ParseQueryString(string.Empty); } - /** - * 101 Niepoprawne lub brak danych autoryzacji. - * 102 Nieprawidłowy login lub hasło - * 103 Brak punków dla tego użytkownika - * 105 Błędny adres IP - * 110 Usługa nie jest dostępna na danym koncie - * 1000 Akcja dostępna tylko dla użytkownika głównego - * 1001 Nieprawidłowa akcja + /** + * 101 Niepoprawne lub brak danych autoryzacji. + * 102 Nieprawidłowy login lub hasło + * 103 Brak punków dla tego użytkownika + * 105 Błędny adres IP + * 110 Usługa nie jest dostępna na danym koncie + * 1000 Akcja dostępna tylko dla użytkownika głównego + * 1001 Nieprawidłowa akcja */ private static bool IsClientError(string code) { @@ -134,11 +134,11 @@ private static bool IsClientError(string code) } } - /** - * 8 Błąd w odwołaniu - * 666 Wewnętrzny błąd systemu - * 999 Wewnętrzny błąd systemu - * 201 Wewnętrzny błąd systemu + /** + * 8 Błąd w odwołaniu + * 666 Wewnętrzny błąd systemu + * 999 Wewnętrzny błąd systemu + * 201 Wewnętrzny błąd systemu */ private static bool IsHostError(string code) { diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index c3a8d6a..9538a7b 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -20,4 +20,4 @@ protected override NameValueCollection Values() }; } } -} +} diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index 8a4942b..c31ab6d 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -184,4 +184,4 @@ public UnbindContactFromGroup UnbindContactFromGroup(string contactId, string gr return action; } } -} +} diff --git a/smsapi/Api/HLRFactory.cs b/smsapi/Api/HLRFactory.cs index ac0cc8f..50aaed1 100644 --- a/smsapi/Api/HLRFactory.cs +++ b/smsapi/Api/HLRFactory.cs @@ -24,4 +24,4 @@ public HLRCheckNumber ActionCheckNumber(string number = null) return action; } } -} +} diff --git a/smsapi/Api/PhonebookFactory.cs b/smsapi/Api/PhonebookFactory.cs index f2f1af0..a15922d 100644 --- a/smsapi/Api/PhonebookFactory.cs +++ b/smsapi/Api/PhonebookFactory.cs @@ -96,4 +96,4 @@ public PhonebookGroupList ActionGroupList() return action; } } -} +} diff --git a/smsapi/Api/Response/Points.cs b/smsapi/Api/Response/Points.cs index 6f29256..f2e13a8 100644 --- a/smsapi/Api/Response/Points.cs +++ b/smsapi/Api/Response/Points.cs @@ -26,4 +26,4 @@ public class Credits : Base private Credits() { } } -} +} diff --git a/smsapi/Api/SMSFactory.cs b/smsapi/Api/SMSFactory.cs index bb05001..3b9f75b 100644 --- a/smsapi/Api/SMSFactory.cs +++ b/smsapi/Api/SMSFactory.cs @@ -55,4 +55,4 @@ public SMSSend ActionSend(string[] to, string text = null) return action; } } -} +} diff --git a/smsapi/Api/VMSFactory.cs b/smsapi/Api/VMSFactory.cs index c1a6080..20a8f81 100644 --- a/smsapi/Api/VMSFactory.cs +++ b/smsapi/Api/VMSFactory.cs @@ -54,4 +54,4 @@ public VMSSend ActionSend(string[] to) return action; } } -} +} diff --git a/smsapi/ClientException.cs b/smsapi/ClientException.cs index f2a2d66..426ef88 100644 --- a/smsapi/ClientException.cs +++ b/smsapi/ClientException.cs @@ -6,4 +6,4 @@ public ClientException(string message, string code) : base(message, code) { } } -} +} From 8b5b4661a694f7812f9c4c618f20d420aca3eb88 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 22:53:47 +0100 Subject: [PATCH 024/101] Move uri to RestRequest --- smsapi/ProxyHTTP.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 51d909a..e8432c5 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -69,8 +69,8 @@ public Stream Execute( var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - RestClient client = CreateClient(uri); - RestRequest request = CreateRequest(responseStream, data, files, method); + RestClient client = CreateClient(); + RestRequest request = CreateRequest(uri, responseStream, data, files, method); try { @@ -110,8 +110,8 @@ public async Task ExecuteAsync( var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - RestClient client = CreateClient(uri); - RestRequest request = CreateRequest(responseStream, data, files, method); + RestClient client = CreateClient(); + RestRequest request = CreateRequest(uri, responseStream, data, files, method); try { @@ -126,12 +126,13 @@ public async Task ExecuteAsync( } private static RestRequest CreateRequest( + string uri, Stream responseStream, NameValueCollection data, Dictionary files, RequestMethod method) { - var request = new RestRequest() + var request = new RestRequest(uri) { Method = ToMethod(method), ResponseWriter = s => @@ -175,9 +176,9 @@ private static Method ToMethod(RequestMethod method) } } - private RestClient CreateClient(string uri) + private RestClient CreateClient() { - var options = new RestClientOptions(baseUrl + uri); + var options = new RestClientOptions(baseUrl); var client = new RestClient(options); if (authentication != null) From 8e5dfb834e1aaa407dcd61cf27437909da41430a Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 23:03:03 +0100 Subject: [PATCH 025/101] Extract RequestMethod extensions --- smsapi/Proxy.cs | 8 -------- smsapi/ProxyHTTP.cs | 23 +---------------------- smsapi/RequestMethod.cs | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 smsapi/RequestMethod.cs diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index b9a6156..9f15069 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -5,14 +5,6 @@ namespace SMSApi.Api { - public enum RequestMethod - { - GET, - POST, - PUT, - DELETE - } - public interface Proxy { void Authentication(IClient client); diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index e8432c5..4257834 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -134,7 +134,7 @@ private static RestRequest CreateRequest( { var request = new RestRequest(uri) { - Method = ToMethod(method), + Method = method.ToMethod(), ResponseWriter = s => { s.CopyTo(responseStream); @@ -155,27 +155,6 @@ private static RestRequest CreateRequest( return request; } - private static Method ToMethod(RequestMethod method) - { - switch (method) - { - case RequestMethod.DELETE: - return Method.Delete; - - case RequestMethod.GET: - return Method.Get; - - case RequestMethod.POST: - return Method.Post; - - case RequestMethod.PUT: - return Method.Put; - - default: - throw new NotSupportedException(); - } - } - private RestClient CreateClient() { var options = new RestClientOptions(baseUrl); diff --git a/smsapi/RequestMethod.cs b/smsapi/RequestMethod.cs new file mode 100644 index 0000000..373c680 --- /dev/null +++ b/smsapi/RequestMethod.cs @@ -0,0 +1,37 @@ +using System; +using RestSharp; + +namespace SMSApi.Api +{ + public enum RequestMethod + { + GET, + POST, + PUT, + DELETE + } + + public static class RequestMethodExtensions + { + public static Method ToMethod(this RequestMethod method) + { + switch (method) + { + case RequestMethod.DELETE: + return Method.Delete; + + case RequestMethod.GET: + return Method.Get; + + case RequestMethod.POST: + return Method.Post; + + case RequestMethod.PUT: + return Method.Put; + + default: + throw new NotSupportedException(); + } + } + } +} From 69561ec0e33e03ba1e89ea8e86b536dc84dd29d5 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 4 Nov 2022 23:05:55 +0100 Subject: [PATCH 026/101] Cleanup --- smsapi/smsapi.csproj | 10 ---------- smsapiTests/smsapiTests.csproj | 8 -------- 2 files changed, 18 deletions(-) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 80e8a83..6915f18 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -19,16 +19,6 @@ smsapi netcoreapp3.1;net5.0;net6.0;net7.0 - - - - - - - - - - diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index d9b1f6d..740448c 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -4,11 +4,6 @@ netcoreapp3.1;net5.0;net6.0;net7.0 false - - - - - @@ -22,9 +17,6 @@ - - - From a375e67f9d188c2ffa09987e97c37fa097222180 Mon Sep 17 00:00:00 2001 From: knowak Date: Sun, 6 Nov 2022 02:01:15 +0100 Subject: [PATCH 027/101] Bump version --- smsapi/Properties/AssemblyInfo.cs | 4 ++-- smsapi/smsapi.csproj | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/smsapi/Properties/AssemblyInfo.cs b/smsapi/Properties/AssemblyInfo.cs index f98ac94..9537df5 100644 --- a/smsapi/Properties/AssemblyInfo.cs +++ b/smsapi/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] +[assembly: AssemblyVersion("2.2.0.0")] +[assembly: AssemblyFileVersion("2.2.0.0")] diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 6915f18..f043577 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -10,7 +10,7 @@ SMSAPI.pl - 1.0.9 + 1.1.0 false https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE https://www.smsapi.pl @@ -18,6 +18,7 @@ SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. smsapi netcoreapp3.1;net5.0;net6.0;net7.0 + True From 3bd85e785c0a26c8faac514a3ec25fea3e3b4781 Mon Sep 17 00:00:00 2001 From: knowak Date: Sun, 13 Nov 2022 19:07:24 +0100 Subject: [PATCH 028/101] Update user agent header --- smsapi/ClientBase.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs index 7e6f1f9..93052c8 100644 --- a/smsapi/ClientBase.cs +++ b/smsapi/ClientBase.cs @@ -6,18 +6,11 @@ namespace SMSApi.Api { public abstract class ClientBase { - private string _clientAgent; + private readonly string _clientAgent; public ClientBase() { - var assembly = Assembly.GetExecutingAssembly(); - FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); - - _clientAgent = string.Format( - "smsapi/csharp-client:{0};assemblyFile:{1};.net:{2}", - assembly.GetName().Version, - fvi.FileVersion, - Environment.Version); + _clientAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; } public abstract string GetAuthenticationHeader(); From c42faad62b19e452d12d3745d82339023647e8d6 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 00:10:39 +0100 Subject: [PATCH 029/101] Switch to default SmsApiIo in Factory constructor parameter --- smsapi/Api/Factory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smsapi/Api/Factory.cs b/smsapi/Api/Factory.cs index 753b841..865af4a 100644 --- a/smsapi/Api/Factory.cs +++ b/smsapi/Api/Factory.cs @@ -6,12 +6,12 @@ public abstract class Factory private IClient client; - protected Factory(ProxyAddress address = ProxyAddress.SmsApiPl) + protected Factory(ProxyAddress address = ProxyAddress.SmsApiIo) { Proxy(address); } - protected Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + protected Factory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : this(address) { Client(client); From 1e63cbf5810033f4ac85c3e7efd2bda4ae56e478 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 00:13:47 +0100 Subject: [PATCH 030/101] Bump up RestSharp version --- smsapi/smsapi.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index f043577..95aa08e 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -24,7 +24,7 @@ - + From a1c8a5f17dd47445cadfa637946d31da4445c6dc Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 00:36:15 +0100 Subject: [PATCH 031/101] Remove unused RequestMethodToString from ProxyHTTP --- smsapi/ProxyHTTP.cs | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 4257834..f19a86c 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -20,27 +20,6 @@ public ProxyHTTP(string baseUrl) this.baseUrl = baseUrl; } - public static string RequestMethodToString(RequestMethod method) - { - switch (method) - { - case RequestMethod.GET: - return "GET"; - - case RequestMethod.PUT: - return "PUT"; - - case RequestMethod.POST: - return "POST"; - - case RequestMethod.DELETE: - return "DELETE"; - - default: - throw new ProxyException("Invalid request method"); - } - } - public void Authentication(IClient client) { authentication = client; From be533bf634a769d888c1f5296e9849e5deeacef0 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 00:38:56 +0100 Subject: [PATCH 032/101] Remove method parameter default value from Proxy interface and its implementations --- smsapi/Proxy.cs | 12 ++++++------ smsapi/ProxyHTTP.cs | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index 9f15069..5266778 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -12,35 +12,35 @@ public interface Proxy Stream Execute( string uri, NameValueCollection data, - RequestMethod method = RequestMethod.POST); + RequestMethod method); Stream Execute( string uri, NameValueCollection data, Stream file, - RequestMethod method = RequestMethod.POST); + RequestMethod method); Stream Execute( string uri, NameValueCollection data, Dictionary files, - RequestMethod method = RequestMethod.POST); + RequestMethod method); Task ExecuteAsync( string uri, NameValueCollection data, - RequestMethod method = RequestMethod.POST); + RequestMethod method); Task ExecuteAsync( string uri, NameValueCollection data, Stream file, - RequestMethod method = RequestMethod.POST); + RequestMethod method); Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, - RequestMethod method = RequestMethod.POST); + RequestMethod method); } } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index f19a86c..d359175 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -25,7 +25,7 @@ public void Authentication(IClient client) authentication = client; } - public Stream Execute(string uri, NameValueCollection data, RequestMethod method = RequestMethod.POST) + public Stream Execute(string uri, NameValueCollection data, RequestMethod method) { return Execute(uri, data, new Dictionary(), method); } @@ -34,7 +34,7 @@ public Stream Execute( string uri, NameValueCollection data, Stream file, - RequestMethod method = RequestMethod.POST) + RequestMethod method) { return Execute(uri, data, new Dictionary { { "file", file } }, method); } @@ -43,7 +43,7 @@ public Stream Execute( string uri, NameValueCollection data, Dictionary files, - RequestMethod method = RequestMethod.POST) + RequestMethod method) { var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; @@ -66,7 +66,7 @@ public Stream Execute( public async Task ExecuteAsync( string uri, NameValueCollection data, - RequestMethod method = RequestMethod.POST) + RequestMethod method) { return await ExecuteAsync(uri, data, new Dictionary(), method); } @@ -75,7 +75,7 @@ public async Task ExecuteAsync( string uri, NameValueCollection data, Stream file, - RequestMethod method = RequestMethod.POST) + RequestMethod method) { return await ExecuteAsync(uri, data, new Dictionary { { "file", file } }, method); } @@ -84,7 +84,7 @@ public async Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, - RequestMethod method = RequestMethod.POST) + RequestMethod method) { var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; From 35c5ffee76e2d1fccd3d9ba2ea63cfb21e4bb4b3 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:04:29 +0100 Subject: [PATCH 033/101] Extract repetitive field population in action values --- smsapi/Api/Action/Base.cs | 14 +++++++++++--- smsapi/Api/Action/HLR/CheckNumber.cs | 1 - smsapi/Api/Action/MMS/Delete.cs | 1 - smsapi/Api/Action/MMS/Get.cs | 1 - smsapi/Api/Action/MMS/Send.cs | 2 -- smsapi/Api/Action/Phonebook/ContactAdd.cs | 1 - smsapi/Api/Action/Phonebook/ContactDelete.cs | 1 - smsapi/Api/Action/Phonebook/ContactEdit.cs | 1 - smsapi/Api/Action/Phonebook/ContactGet.cs | 1 - smsapi/Api/Action/Phonebook/ContactList.cs | 1 - smsapi/Api/Action/Phonebook/GroupAdd.cs | 1 - smsapi/Api/Action/Phonebook/GroupDelete.cs | 1 - smsapi/Api/Action/Phonebook/GroupEdit.cs | 1 - smsapi/Api/Action/Phonebook/GroupGet.cs | 1 - smsapi/Api/Action/Phonebook/GroupList.cs | 1 - smsapi/Api/Action/SMS/Delete.cs | 1 - smsapi/Api/Action/SMS/Get.cs | 1 - smsapi/Api/Action/SMS/Send.cs | 2 -- smsapi/Api/Action/Sender/Add.cs | 1 - smsapi/Api/Action/Sender/Delete.cs | 1 - smsapi/Api/Action/Sender/List.cs | 1 - smsapi/Api/Action/Sender/SetDefault.cs | 1 - smsapi/Api/Action/User/Add.cs | 1 - smsapi/Api/Action/User/Edit.cs | 1 - smsapi/Api/Action/User/Get.cs | 1 - smsapi/Api/Action/User/GetPoints.cs | 1 - smsapi/Api/Action/User/List.cs | 1 - smsapi/Api/Action/VMS/Delete.cs | 1 - smsapi/Api/Action/VMS/Get.cs | 1 - smsapi/Api/Action/VMS/Send.cs | 2 -- 30 files changed, 11 insertions(+), 35 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 0dd3a81..431848f 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -21,7 +21,7 @@ public T Execute() Validate(); T response; - Stream data = proxy.Execute(Uri(), Values(), Files(), Method); + Stream data = proxy.Execute(Uri(), GetValues(), Files(), Method); HandleError(data); @@ -45,7 +45,7 @@ public async Task ExecuteAsync() Validate(); T response; - Stream data = await proxy.ExecuteAsync(Uri(), Values(), Files(), Method); + Stream data = await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method); HandleError(data); @@ -104,7 +104,15 @@ protected virtual void Validate() protected virtual NameValueCollection Values() { - return HttpUtility.ParseQueryString(string.Empty); + return new NameValueCollection(); + } + + private NameValueCollection GetValues() + { + var values = GetValues(); + return values.Count > 0 + ? new NameValueCollection { { "format", "json" }, values } + : HttpUtility.ParseQueryString(string.Empty); } /** diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index cb5e76b..023f966 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "number", string.Join(",", numbers) } }; } diff --git a/smsapi/Api/Action/MMS/Delete.cs b/smsapi/Api/Action/MMS/Delete.cs index 8e78921..0d3e951 100644 --- a/smsapi/Api/Action/MMS/Delete.cs +++ b/smsapi/Api/Action/MMS/Delete.cs @@ -28,7 +28,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "sch_del", string.Join("|", ids) } }; } diff --git a/smsapi/Api/Action/MMS/Get.cs b/smsapi/Api/Action/MMS/Get.cs index 9bf9c5e..ba8bba0 100644 --- a/smsapi/Api/Action/MMS/Get.cs +++ b/smsapi/Api/Action/MMS/Get.cs @@ -28,7 +28,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "status", string.Join("|", ids) } }; } diff --git a/smsapi/Api/Action/MMS/Send.cs b/smsapi/Api/Action/MMS/Send.cs index 397e502..550dac7 100644 --- a/smsapi/Api/Action/MMS/Send.cs +++ b/smsapi/Api/Action/MMS/Send.cs @@ -103,8 +103,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection(); - collection.Add("format", "json"); - if (To != null) { collection.Add("to", string.Join(",", To)); diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs index f92d879..0e98b75 100644 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ b/smsapi/Api/Action/Phonebook/ContactAdd.cs @@ -77,7 +77,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "add_contact", number } }; diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index a9a6cc2..a0ebca4 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "delete_contact", number } }; } diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs index 86fc9cd..d5c47ff 100644 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ b/smsapi/Api/Action/Phonebook/ContactEdit.cs @@ -84,7 +84,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "edit_contact", oldNumber } }; diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs index 0de398e..7ec8906 100644 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ b/smsapi/Api/Action/Phonebook/ContactGet.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "get_contact", number } }; } diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs index 629dd27..5c5425c 100644 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ b/smsapi/Api/Action/Phonebook/ContactList.cs @@ -83,7 +83,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "list_contacts", "" } }; diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs index f11ae67..b5cb601 100644 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ b/smsapi/Api/Action/Phonebook/GroupAdd.cs @@ -29,7 +29,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "add_group", name } }; diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs index 509f365..b5891d3 100644 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ b/smsapi/Api/Action/Phonebook/GroupDelete.cs @@ -34,7 +34,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "delete_group", name } }; diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs index 14c0fcb..d553c65 100644 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ b/smsapi/Api/Action/Phonebook/GroupEdit.cs @@ -36,7 +36,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "edit_group", oldName }, { "name", newName }, { "info", info } diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs index ff97701..9ccb5aa 100644 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ b/smsapi/Api/Action/Phonebook/GroupGet.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "get_group", name } }; } diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs index 33c774a..89ed04a 100644 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ b/smsapi/Api/Action/Phonebook/GroupList.cs @@ -14,7 +14,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "list_groups", "" } }; } diff --git a/smsapi/Api/Action/SMS/Delete.cs b/smsapi/Api/Action/SMS/Delete.cs index 24648ff..bc30b4e 100644 --- a/smsapi/Api/Action/SMS/Delete.cs +++ b/smsapi/Api/Action/SMS/Delete.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "sch_del", id } }; } diff --git a/smsapi/Api/Action/SMS/Get.cs b/smsapi/Api/Action/SMS/Get.cs index 33f3ac7..971b6ef 100644 --- a/smsapi/Api/Action/SMS/Get.cs +++ b/smsapi/Api/Action/SMS/Get.cs @@ -28,7 +28,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "status", string.Join("|", id) } }; } diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 769049a..18669c8 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -199,8 +199,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection(); - collection.Add("format", "json"); - if (Sender != null) { collection.Add("from", Sender); diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index a91422f..f3ea1ad 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "add", name } }; } diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index 64cf347..5846875 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "delete", name } }; } diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index 07ba1da..7c6779f 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -21,7 +21,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "list", "1" } }; } diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index 3ef21a5..a81ac31 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "default", name } }; } diff --git a/smsapi/Api/Action/User/Add.cs b/smsapi/Api/Action/User/Add.cs index d08b864..064b649 100644 --- a/smsapi/Api/Action/User/Add.cs +++ b/smsapi/Api/Action/User/Add.cs @@ -95,7 +95,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "add_user", newUsername } }; diff --git a/smsapi/Api/Action/User/Edit.cs b/smsapi/Api/Action/User/Edit.cs index 82d65b4..f33b346 100644 --- a/smsapi/Api/Action/User/Edit.cs +++ b/smsapi/Api/Action/User/Edit.cs @@ -95,7 +95,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection { - { "format", "json" }, { "set_user", username } }; diff --git a/smsapi/Api/Action/User/Get.cs b/smsapi/Api/Action/User/Get.cs index 87e0a28..0424e94 100644 --- a/smsapi/Api/Action/User/Get.cs +++ b/smsapi/Api/Action/User/Get.cs @@ -22,7 +22,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "get_user", username } }; } diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index 9538a7b..e034be7 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -14,7 +14,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "credits", "1" }, { "details", "1" } }; diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index 74375e5..ad55fb3 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -21,7 +21,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "list", "1" } }; } diff --git a/smsapi/Api/Action/VMS/Delete.cs b/smsapi/Api/Action/VMS/Delete.cs index ebe3258..9276b15 100644 --- a/smsapi/Api/Action/VMS/Delete.cs +++ b/smsapi/Api/Action/VMS/Delete.cs @@ -28,7 +28,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "sch_del", string.Join("|", ids) } }; } diff --git a/smsapi/Api/Action/VMS/Get.cs b/smsapi/Api/Action/VMS/Get.cs index b0c0fdb..2c1248c 100644 --- a/smsapi/Api/Action/VMS/Get.cs +++ b/smsapi/Api/Action/VMS/Get.cs @@ -28,7 +28,6 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "format", "json" }, { "status", string.Join("|", ids) } }; } diff --git a/smsapi/Api/Action/VMS/Send.cs b/smsapi/Api/Action/VMS/Send.cs index 8f2c4d0..b45e305 100644 --- a/smsapi/Api/Action/VMS/Send.cs +++ b/smsapi/Api/Action/VMS/Send.cs @@ -157,8 +157,6 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection(); - collection.Add("format", "json"); - if (To != null) { collection.Add("to", string.Join(",", To)); From 31373b162ae350d398996b42cefd4520e96d078d Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:07:53 +0100 Subject: [PATCH 034/101] Fix number access modifier to private in PhonebookContactDelete --- smsapi/Api/Action/Phonebook/ContactDelete.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index a0ebca4..73eb1bc 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -5,7 +5,7 @@ namespace SMSApi.Api.Action { public class PhonebookContactDelete : Base { - protected string number; + private string number; public PhonebookContactDelete Number(string number) { From 103f7a686526228066bf81d832ecd5e980a1aa46 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:15:44 +0100 Subject: [PATCH 035/101] Deprecate PhonebookContact and PhonebookGroup classes --- smsapi/Api/Action/Phonebook/ContactAdd.cs | 4 +++- smsapi/Api/Action/Phonebook/ContactDelete.cs | 4 +++- smsapi/Api/Action/Phonebook/ContactEdit.cs | 4 +++- smsapi/Api/Action/Phonebook/ContactGet.cs | 4 +++- smsapi/Api/Action/Phonebook/ContactList.cs | 4 +++- smsapi/Api/Action/Phonebook/GroupAdd.cs | 4 +++- smsapi/Api/Action/Phonebook/GroupDelete.cs | 4 +++- smsapi/Api/Action/Phonebook/GroupEdit.cs | 4 +++- smsapi/Api/Action/Phonebook/GroupGet.cs | 4 +++- smsapi/Api/Action/Phonebook/GroupList.cs | 4 +++- 10 files changed, 30 insertions(+), 10 deletions(-) diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs index 0e98b75..554eb29 100644 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ b/smsapi/Api/Action/Phonebook/ContactAdd.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use CreateContact")] public class PhonebookContactAdd : Base { private int birthday; diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index 73eb1bc..688cd4d 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use DeleteContact")] public class PhonebookContactDelete : Base { private string number; diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs index d5c47ff..cebf838 100644 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ b/smsapi/Api/Action/Phonebook/ContactEdit.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use EditContact")] public class PhonebookContactEdit : Base { private int birthday; diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs index 7ec8906..6313cf1 100644 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ b/smsapi/Api/Action/Phonebook/ContactGet.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use GetContact")] public class PhonebookContactGet : Base { private string number; diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs index 5c5425c..53bcec4 100644 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ b/smsapi/Api/Action/Phonebook/ContactList.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use ListContacts")] public class PhonebookContactList : Base { private string gender; diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs index b5cb601..3a79946 100644 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ b/smsapi/Api/Action/Phonebook/GroupAdd.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use CreateGroup")] public class PhonebookGroupAdd : Base { private string info; diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs index b5891d3..2fdc3f4 100644 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ b/smsapi/Api/Action/Phonebook/GroupDelete.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use DeleteGroup")] public class PhonebookGroupDelete : Base { private string name; diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs index d553c65..9691649 100644 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ b/smsapi/Api/Action/Phonebook/GroupEdit.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use EditGroup")] public class PhonebookGroupEdit : Base { private string info; diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs index 9ccb5aa..209390f 100644 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ b/smsapi/Api/Action/Phonebook/GroupGet.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use GetGroup")] public class PhonebookGroupGet : Base { private string name; diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs index 89ed04a..edb6d87 100644 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ b/smsapi/Api/Action/Phonebook/GroupList.cs @@ -1,8 +1,10 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Specialized; using SMSApi.Api.Response; namespace SMSApi.Api.Action { + [Obsolete("Use ListGroups")] public class PhonebookGroupList : Base { protected override string Uri() From cca3fdbfdc84885c1881baef107e0e23d2892929 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:46:11 +0100 Subject: [PATCH 036/101] Turn Base Method property abstract --- smsapi/Api/Action/Base.cs | 2 +- smsapi/Api/Action/Contacts/CreateContact.cs | 2 ++ smsapi/Api/Action/Contacts/CreateField.cs | 2 ++ smsapi/Api/Action/Contacts/CreateGroup.cs | 2 ++ smsapi/Api/Action/Contacts/CreateGroupPermission.cs | 2 ++ smsapi/Api/Action/HLR/CheckNumber.cs | 2 ++ smsapi/Api/Action/MMS/Delete.cs | 2 ++ smsapi/Api/Action/MMS/Get.cs | 2 ++ smsapi/Api/Action/MMS/Send.cs | 2 ++ smsapi/Api/Action/Phonebook/ContactAdd.cs | 2 ++ smsapi/Api/Action/Phonebook/ContactDelete.cs | 2 ++ smsapi/Api/Action/Phonebook/ContactEdit.cs | 2 ++ smsapi/Api/Action/Phonebook/ContactGet.cs | 2 ++ smsapi/Api/Action/Phonebook/ContactList.cs | 2 ++ smsapi/Api/Action/Phonebook/GroupAdd.cs | 2 ++ smsapi/Api/Action/Phonebook/GroupDelete.cs | 2 ++ smsapi/Api/Action/Phonebook/GroupEdit.cs | 2 ++ smsapi/Api/Action/Phonebook/GroupGet.cs | 2 ++ smsapi/Api/Action/Phonebook/GroupList.cs | 2 ++ smsapi/Api/Action/SMS/Delete.cs | 2 ++ smsapi/Api/Action/SMS/Get.cs | 2 ++ smsapi/Api/Action/SMS/Send.cs | 2 ++ smsapi/Api/Action/Sender/Add.cs | 2 ++ smsapi/Api/Action/Sender/Delete.cs | 2 ++ smsapi/Api/Action/Sender/List.cs | 2 ++ smsapi/Api/Action/Sender/SetDefault.cs | 2 ++ smsapi/Api/Action/User/Add.cs | 2 ++ smsapi/Api/Action/User/Edit.cs | 2 ++ smsapi/Api/Action/User/Get.cs | 2 ++ smsapi/Api/Action/User/GetPoints.cs | 2 ++ smsapi/Api/Action/User/List.cs | 2 ++ smsapi/Api/Action/VMS/Delete.cs | 2 ++ smsapi/Api/Action/VMS/Get.cs | 2 ++ smsapi/Api/Action/VMS/Send.cs | 3 ++- 34 files changed, 67 insertions(+), 2 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 431848f..8eff8ba 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -14,7 +14,7 @@ public abstract class Base { private Proxy proxy; - protected virtual RequestMethod Method => RequestMethod.POST; + protected abstract RequestMethod Method { get; } public T Execute() { diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index 5d53c7e..c073d33 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -16,6 +16,8 @@ public class CreateContact : Base private string phoneNumber; private string source; + protected override RequestMethod Method => RequestMethod.POST; + public CreateContact SetBirthdayDate(DateTime? birthdayDate) { this.birthdayDate = birthdayDate; diff --git a/smsapi/Api/Action/Contacts/CreateField.cs b/smsapi/Api/Action/Contacts/CreateField.cs index a13dd70..698a270 100644 --- a/smsapi/Api/Action/Contacts/CreateField.cs +++ b/smsapi/Api/Action/Contacts/CreateField.cs @@ -8,6 +8,8 @@ public class CreateField : Base private string name; private string type; + protected override RequestMethod Method => RequestMethod.POST; + public CreateField SetName(string name) { this.name = name; diff --git a/smsapi/Api/Action/Contacts/CreateGroup.cs b/smsapi/Api/Action/Contacts/CreateGroup.cs index 6d90120..1a82e0f 100644 --- a/smsapi/Api/Action/Contacts/CreateGroup.cs +++ b/smsapi/Api/Action/Contacts/CreateGroup.cs @@ -9,6 +9,8 @@ public class CreateGroup : Base private string idx; private string name; + protected override RequestMethod Method => RequestMethod.POST; + public CreateGroup SetDescription(string description) { this.description = description; diff --git a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs index fe384b3..480757a 100644 --- a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs @@ -12,6 +12,8 @@ public class CreateGroupPermission : Base private string username; private bool? write; + protected override RequestMethod Method => RequestMethod.POST; + public CreateGroupPermission(string groupId) { this.groupId = groupId; diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index 023f966..fa89dad 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -7,6 +7,8 @@ public class HLRCheckNumber : Base { protected string[] numbers; + protected override RequestMethod Method => RequestMethod.POST; + public HLRCheckNumber SetNumber(string number) { numbers = new[] { number }; diff --git a/smsapi/Api/Action/MMS/Delete.cs b/smsapi/Api/Action/MMS/Delete.cs index 0d3e951..f21cec1 100644 --- a/smsapi/Api/Action/MMS/Delete.cs +++ b/smsapi/Api/Action/MMS/Delete.cs @@ -7,6 +7,8 @@ public class MMSDelete : Base { private string[] ids; + protected override RequestMethod Method => RequestMethod.POST; + public MMSDelete Id(string id) { ids = new[] { id }; diff --git a/smsapi/Api/Action/MMS/Get.cs b/smsapi/Api/Action/MMS/Get.cs index ba8bba0..31f7517 100644 --- a/smsapi/Api/Action/MMS/Get.cs +++ b/smsapi/Api/Action/MMS/Get.cs @@ -7,6 +7,8 @@ public class MMSGet : Base { private string[] ids; + protected override RequestMethod Method => RequestMethod.POST; + public MMSGet Id(string id) { ids = new[] { id }; diff --git a/smsapi/Api/Action/MMS/Send.cs b/smsapi/Api/Action/MMS/Send.cs index 550dac7..6793145 100644 --- a/smsapi/Api/Action/MMS/Send.cs +++ b/smsapi/Api/Action/MMS/Send.cs @@ -9,6 +9,8 @@ public class MMSSend : Send private string Subject; + protected override RequestMethod Method => RequestMethod.POST; + public MMSSend SetCheckIDx(bool check = true) { IdxCheck = check; diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs index 554eb29..1e16113 100644 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ b/smsapi/Api/Action/Phonebook/ContactAdd.cs @@ -16,6 +16,8 @@ public class PhonebookContactAdd : Base private string lastName; private string number; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookContactAdd SetBirthday(int birthday) { this.birthday = birthday; diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs index 688cd4d..cef5fcd 100644 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ b/smsapi/Api/Action/Phonebook/ContactDelete.cs @@ -9,6 +9,8 @@ public class PhonebookContactDelete : Base { private string number; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookContactDelete Number(string number) { this.number = number; diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs index cebf838..82481bb 100644 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ b/smsapi/Api/Action/Phonebook/ContactEdit.cs @@ -17,6 +17,8 @@ public class PhonebookContactEdit : Base private string newNumber; private string oldNumber; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookContactEdit Number(string number) { oldNumber = number; diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs index 6313cf1..2655fed 100644 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ b/smsapi/Api/Action/Phonebook/ContactGet.cs @@ -9,6 +9,8 @@ public class PhonebookContactGet : Base { private string number; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookContactGet Number(string number) { this.number = number; diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs index 53bcec4..ce96577 100644 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ b/smsapi/Api/Action/Phonebook/ContactList.cs @@ -16,6 +16,8 @@ public class PhonebookContactList : Base private string orderDir; private string searchText; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookContactList() { offset = 0; diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs index 3a79946..477e25e 100644 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ b/smsapi/Api/Action/Phonebook/GroupAdd.cs @@ -10,6 +10,8 @@ public class PhonebookGroupAdd : Base private string info; private string name; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookGroupAdd SetInfo(string info) { this.info = info; diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs index 2fdc3f4..1068d8c 100644 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ b/smsapi/Api/Action/Phonebook/GroupDelete.cs @@ -10,6 +10,8 @@ public class PhonebookGroupDelete : Base private string name; private bool removeContacts; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookGroupDelete() { removeContacts = false; diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs index 9691649..bb9a5fb 100644 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ b/smsapi/Api/Action/Phonebook/GroupEdit.cs @@ -11,6 +11,8 @@ public class PhonebookGroupEdit : Base private string newName; private string oldName; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookGroupEdit Name(string name) { oldName = name; diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs index 209390f..7fa0840 100644 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ b/smsapi/Api/Action/Phonebook/GroupGet.cs @@ -9,6 +9,8 @@ public class PhonebookGroupGet : Base { private string name; + protected override RequestMethod Method => RequestMethod.POST; + public PhonebookGroupGet Name(string name) { this.name = name; diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs index edb6d87..f8e0b49 100644 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ b/smsapi/Api/Action/Phonebook/GroupList.cs @@ -7,6 +7,8 @@ namespace SMSApi.Api.Action [Obsolete("Use ListGroups")] public class PhonebookGroupList : Base { + protected override RequestMethod Method => RequestMethod.POST; + protected override string Uri() { return "phonebook.do"; diff --git a/smsapi/Api/Action/SMS/Delete.cs b/smsapi/Api/Action/SMS/Delete.cs index bc30b4e..96c2f9e 100644 --- a/smsapi/Api/Action/SMS/Delete.cs +++ b/smsapi/Api/Action/SMS/Delete.cs @@ -7,6 +7,8 @@ public class SMSDelete : Base { private string id; + protected override RequestMethod Method => RequestMethod.POST; + public SMSDelete Id(string id) { this.id = id; diff --git a/smsapi/Api/Action/SMS/Get.cs b/smsapi/Api/Action/SMS/Get.cs index 971b6ef..1068e56 100644 --- a/smsapi/Api/Action/SMS/Get.cs +++ b/smsapi/Api/Action/SMS/Get.cs @@ -7,6 +7,8 @@ public class SMSGet : Base { private string[] id; + protected override RequestMethod Method => RequestMethod.POST; + public SMSGet Id(string id) { this.id = new[] { id }; diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 18669c8..0f4b94c 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -21,6 +21,8 @@ public class SMSSend : Send private string Text; private string udh; + protected override RequestMethod Method => RequestMethod.POST; + public SMSSend SetCheckIDx(bool check = true) { IdxCheck = check; diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index f3ea1ad..265abab 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -7,6 +7,8 @@ public class SenderAdd : Base { private string name; + protected override RequestMethod Method => RequestMethod.POST; + public SenderAdd SetName(string name) { this.name = name; diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index 5846875..6807c25 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -7,6 +7,8 @@ public class SenderDelete : Base { private string name; + protected override RequestMethod Method => RequestMethod.POST; + public SenderDelete Name(string name) { this.name = name; diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index 7c6779f..4156451 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -7,6 +7,8 @@ namespace SMSApi.Api.Action { public class SenderList : Base> { + protected override RequestMethod Method => RequestMethod.POST; + protected override Array ResponseToObject(Stream data) { return new Array(Deserialize>(data)); diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index a81ac31..c9e63d1 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -7,6 +7,8 @@ public class SenderSetDefault : Base { private string name; + protected override RequestMethod Method => RequestMethod.POST; + public SenderSetDefault Name(string name) { this.name = name; diff --git a/smsapi/Api/Action/User/Add.cs b/smsapi/Api/Action/User/Add.cs index 064b649..ec244e7 100644 --- a/smsapi/Api/Action/User/Add.cs +++ b/smsapi/Api/Action/User/Add.cs @@ -17,6 +17,8 @@ public class UserAdd : Base private int senders; private bool withoutPrefix; + protected override RequestMethod Method => RequestMethod.POST; + public UserAdd() { limit = -1; diff --git a/smsapi/Api/Action/User/Edit.cs b/smsapi/Api/Action/User/Edit.cs index f33b346..c963472 100644 --- a/smsapi/Api/Action/User/Edit.cs +++ b/smsapi/Api/Action/User/Edit.cs @@ -17,6 +17,8 @@ public class UserEdit : Base private string username; private bool withoutPrefix; + protected override RequestMethod Method => RequestMethod.POST; + public UserEdit() { limit = -1; diff --git a/smsapi/Api/Action/User/Get.cs b/smsapi/Api/Action/User/Get.cs index 0424e94..6ca2953 100644 --- a/smsapi/Api/Action/User/Get.cs +++ b/smsapi/Api/Action/User/Get.cs @@ -7,6 +7,8 @@ public class UserGet : Base { private string username; + protected override RequestMethod Method => RequestMethod.POST; + public UserGet Username(string username) { this.username = username; diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index e034be7..71815d4 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -5,6 +5,8 @@ namespace SMSApi.Api.Action { public class UserGetCredits : Base { + protected override RequestMethod Method => RequestMethod.POST; + protected override string Uri() { return "user.do"; diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index ad55fb3..4e811aa 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -7,6 +7,8 @@ namespace SMSApi.Api.Action { public class UserList : Base> { + protected override RequestMethod Method => RequestMethod.POST; + protected override Array ResponseToObject(Stream data) { return new Array(Deserialize>(data)); diff --git a/smsapi/Api/Action/VMS/Delete.cs b/smsapi/Api/Action/VMS/Delete.cs index 9276b15..322c4ad 100644 --- a/smsapi/Api/Action/VMS/Delete.cs +++ b/smsapi/Api/Action/VMS/Delete.cs @@ -7,6 +7,8 @@ public class VMSDelete : Base { private string[] ids; + protected override RequestMethod Method => RequestMethod.POST; + public VMSDelete Id(string id) { ids = new[] { id }; diff --git a/smsapi/Api/Action/VMS/Get.cs b/smsapi/Api/Action/VMS/Get.cs index 2c1248c..4350c3d 100644 --- a/smsapi/Api/Action/VMS/Get.cs +++ b/smsapi/Api/Action/VMS/Get.cs @@ -7,6 +7,8 @@ public class VMSGet : Base { private string[] ids; + protected override RequestMethod Method => RequestMethod.POST; + public VMSGet Id(string id) { ids = new[] { id }; diff --git a/smsapi/Api/Action/VMS/Send.cs b/smsapi/Api/Action/VMS/Send.cs index b45e305..befbe58 100644 --- a/smsapi/Api/Action/VMS/Send.cs +++ b/smsapi/Api/Action/VMS/Send.cs @@ -8,7 +8,6 @@ namespace SMSApi.Api.Action public class VMSSend : Send { private Stream File; - private string From; private int Interval; private bool SkipGSM; @@ -16,6 +15,8 @@ public class VMSSend : Send private string TTS; private string TTSLector; + protected override RequestMethod Method => RequestMethod.POST; + public VMSSend SetCheckIDx(bool check = true) { IdxCheck = check; From 493d01a917a7583b6dc4cacbfdf2db01b128079a Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:54:13 +0100 Subject: [PATCH 037/101] Turn numbers collection to single number in CheckNumber --- smsapi/Api/Action/HLR/CheckNumber.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index fa89dad..51cae49 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -5,13 +5,13 @@ namespace SMSApi.Api.Action { public class HLRCheckNumber : Base { - protected string[] numbers; + protected string number; protected override RequestMethod Method => RequestMethod.POST; public HLRCheckNumber SetNumber(string number) { - numbers = new[] { number }; + this.number = number; return this; } @@ -24,7 +24,7 @@ protected override NameValueCollection Values() { return new NameValueCollection { - { "number", string.Join(",", numbers) } + { "number", this.number } }; } } From 0eb04316a143586a65597d071ee9c5c7d11ee273 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:55:47 +0100 Subject: [PATCH 038/101] Change CheckNumber number access modifier to private --- smsapi/Api/Action/HLR/CheckNumber.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index 51cae49..4a1eeb5 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -5,7 +5,7 @@ namespace SMSApi.Api.Action { public class HLRCheckNumber : Base { - protected string number; + private string number; protected override RequestMethod Method => RequestMethod.POST; From b235165c4b8e4db79b20e3cdebd782f615e11722 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 01:57:40 +0100 Subject: [PATCH 039/101] Remove unused udh from Send Sms --- smsapi/Api/Action/SMS/Send.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 0f4b94c..58226fe 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -17,9 +17,7 @@ public class SMSSend : Send private string[] Params; private string Sender; private bool Single; - private string Text; - private string udh; protected override RequestMethod Method => RequestMethod.POST; @@ -173,12 +171,6 @@ public SMSSend SetTo(string[] to) return this; } - public SMSSend SetUdh(string udh) - { - this.udh = udh; - return this; - } - protected override string Uri() { return "sms.do"; From de50ceddb18e706b87969a508c38dfb1da74d7b1 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:03:09 +0100 Subject: [PATCH 040/101] Switch to SmsApiIo in all factories --- smsapi/Api/ContactsFactory.cs | 4 ++-- smsapi/Api/HLRFactory.cs | 4 ++-- smsapi/Api/MMSFactory.cs | 4 ++-- smsapi/Api/PhonebookFactory.cs | 4 ++-- smsapi/Api/SMSFactory.cs | 4 ++-- smsapi/Api/SenderFactory.cs | 4 ++-- smsapi/Api/UserFactory.cs | 4 ++-- smsapi/Api/VMSFactory.cs | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index c31ab6d..b1f758a 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class ContactsFactory : Factory { - public ContactsFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public ContactsFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public ContactsFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public ContactsFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/HLRFactory.cs b/smsapi/Api/HLRFactory.cs index 50aaed1..f36bd0c 100644 --- a/smsapi/Api/HLRFactory.cs +++ b/smsapi/Api/HLRFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class HLRFactory : Factory { - public HLRFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public HLRFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public HLRFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public HLRFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/MMSFactory.cs b/smsapi/Api/MMSFactory.cs index b016f8d..b7bc87c 100644 --- a/smsapi/Api/MMSFactory.cs +++ b/smsapi/Api/MMSFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class MMSFactory : Factory { - public MMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public MMSFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public MMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public MMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/PhonebookFactory.cs b/smsapi/Api/PhonebookFactory.cs index a15922d..b2c4013 100644 --- a/smsapi/Api/PhonebookFactory.cs +++ b/smsapi/Api/PhonebookFactory.cs @@ -6,11 +6,11 @@ namespace SMSApi.Api [Obsolete("use ContactsFactory instead")] public class PhonebookFactory : Factory { - public PhonebookFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public PhonebookFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public PhonebookFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public PhonebookFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/SMSFactory.cs b/smsapi/Api/SMSFactory.cs index 3b9f75b..00014ee 100644 --- a/smsapi/Api/SMSFactory.cs +++ b/smsapi/Api/SMSFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class SMSFactory : Factory { - public SMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public SMSFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public SMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public SMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/SenderFactory.cs b/smsapi/Api/SenderFactory.cs index 96fabe8..7e53132 100644 --- a/smsapi/Api/SenderFactory.cs +++ b/smsapi/Api/SenderFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class SenderFactory : Factory { - public SenderFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public SenderFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public SenderFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public SenderFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/UserFactory.cs b/smsapi/Api/UserFactory.cs index 58facad..4e6b830 100644 --- a/smsapi/Api/UserFactory.cs +++ b/smsapi/Api/UserFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class UserFactory : Factory { - public UserFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public UserFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public UserFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public UserFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } diff --git a/smsapi/Api/VMSFactory.cs b/smsapi/Api/VMSFactory.cs index 20a8f81..61eba87 100644 --- a/smsapi/Api/VMSFactory.cs +++ b/smsapi/Api/VMSFactory.cs @@ -4,11 +4,11 @@ namespace SMSApi.Api { public class VMSFactory : Factory { - public VMSFactory(ProxyAddress address = ProxyAddress.SmsApiPl) + public VMSFactory(ProxyAddress address = ProxyAddress.SmsApiIo) : base(address) { } - public VMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiPl) + public VMSFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) { } From 89dc3277c9d5ee429c0ad28f06c4dd4f3809f5f2 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:19:59 +0100 Subject: [PATCH 041/101] Extract common part of Execute in Base --- smsapi/Api/Action/Base.cs | 66 +++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 8eff8ba..6ae53b1 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -19,49 +19,13 @@ public abstract class Base public T Execute() { Validate(); - - T response; - Stream data = proxy.Execute(Uri(), GetValues(), Files(), Method); - - HandleError(data); - - try - { - response = ResponseToObject(data); - } - catch (SerializationException e) - { - //Problem z prasowaniem json'a - throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); - } - - data.Close(); - - return response; + return ProcessResponse(proxy.Execute(Uri(), GetValues(), Files(), Method)); } public async Task ExecuteAsync() { Validate(); - - T response; - Stream data = await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method); - - HandleError(data); - - try - { - response = ResponseToObject(data); - } - catch (SerializationException e) - { - //Problem z prasowaniem json'a - throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); - } - - data.Close(); - - return response; + return ProcessResponse(await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); } public void Proxy(Proxy proxy) @@ -107,6 +71,32 @@ protected virtual NameValueCollection Values() return new NameValueCollection(); } + private T ProcessResponse(Stream data) + { + T response; + + try + { + HandleError(data); + response = ResponseToObject(data); + } + catch (SerializationException e) + { + //Problem z prasowaniem json'a + throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); + } + catch (Exception e) + { + throw e; + } + finally + { + data?.Close(); + } + + return response; + } + private NameValueCollection GetValues() { var values = GetValues(); From 6d49905293d8073d36f921542a5c00af2312cbed Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:20:40 +0100 Subject: [PATCH 042/101] Fix typo --- smsapi/Api/Action/Base.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 6ae53b1..91bbba5 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -99,7 +99,7 @@ private T ProcessResponse(Stream data) private NameValueCollection GetValues() { - var values = GetValues(); + var values = Values(); return values.Count > 0 ? new NameValueCollection { { "format", "json" }, values } : HttpUtility.ParseQueryString(string.Empty); From 4d7bc6dfd675bec6b429a945e63f424a4216bacd Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:33:22 +0100 Subject: [PATCH 043/101] Remove nullables from booleans and datetimes in send actions --- smsapi/Api/Action/Contacts/CreateContact.cs | 15 ++++---- .../Action/Contacts/CreateGroupPermission.cs | 35 +++++++------------ smsapi/Api/Action/Contacts/EditContact.cs | 15 ++++---- .../Action/Contacts/EditGroupPermission.cs | 33 ++++++----------- 4 files changed, 38 insertions(+), 60 deletions(-) diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index c073d33..6a397b0 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -6,7 +6,7 @@ namespace SMSApi.Api.Action { public class CreateContact : Base { - private DateTime? birthdayDate; + private DateTime birthdayDate; private string city; private string description; private string email; @@ -18,7 +18,7 @@ public class CreateContact : Base protected override RequestMethod Method => RequestMethod.POST; - public CreateContact SetBirthdayDate(DateTime? birthdayDate) + public CreateContact SetBirthdayDate(DateTime birthdayDate) { this.birthdayDate = birthdayDate; return this; @@ -79,7 +79,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var values = new NameValueCollection(); + var values = new NameValueCollection + { + { "birthday_date", birthdayDate.ToString("Y-m-d") } + }; + if (phoneNumber != null) { values.Add("phone_number", phoneNumber); @@ -105,11 +109,6 @@ protected override NameValueCollection Values() values.Add("gender", gender); } - if (birthdayDate != null) - { - values.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); - } - if (description != null) { values.Add("description", description); diff --git a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs index 480757a..d185532 100644 --- a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs @@ -7,10 +7,10 @@ namespace SMSApi.Api.Action public class CreateGroupPermission : Base { private string groupId; - private bool? read; - private bool? send; + private bool read; + private bool send; private string username; - private bool? write; + private bool write; protected override RequestMethod Method => RequestMethod.POST; @@ -19,13 +19,13 @@ public CreateGroupPermission(string groupId) this.groupId = groupId; } - public CreateGroupPermission SetRead(bool? read) + public CreateGroupPermission SetRead(bool read) { this.read = read; return this; } - public CreateGroupPermission SetSend(bool? send) + public CreateGroupPermission SetSend(bool send) { this.send = send; return this; @@ -37,7 +37,7 @@ public CreateGroupPermission SetUsername(string username) return this; } - public CreateGroupPermission SetWrite(bool? write) + public CreateGroupPermission SetWrite(bool write) { this.write = write; return this; @@ -50,25 +50,16 @@ protected override string Uri() protected override NameValueCollection Values() { - var values = new NameValueCollection(); - if (username != null) - { - values.Add("username", username); - } - - if (read != null) + var values = new NameValueCollection { - values.Add("read", Convert.ToInt32(read.Value).ToString()); - } + { "read", Convert.ToInt32(read).ToString() }, + { "write", Convert.ToInt32(write).ToString() }, + { "send", Convert.ToInt32(send).ToString() } + }; - if (write != null) - { - values.Add("write", Convert.ToInt32(write.Value).ToString()); - } - - if (send != null) + if (username != null) { - values.Add("send", Convert.ToInt32(send.Value).ToString()); + values.Add("username", username); } return values; diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index 480381b..8a1d7b8 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -6,7 +6,7 @@ namespace SMSApi.Api.Action { public class EditContact : Base { - private DateTime? birthdayDate; + private DateTime birthdayDate; private string city; private string description; private string email; @@ -25,7 +25,7 @@ public EditContact(string contactId) protected override RequestMethod Method => RequestMethod.PUT; - public EditContact SetBirthdayDate(DateTime? birthdayDate) + public EditContact SetBirthdayDate(DateTime birthdayDate) { this.birthdayDate = birthdayDate; return this; @@ -86,7 +86,11 @@ protected override string Uri() protected override NameValueCollection Values() { - var values = new NameValueCollection(); + var values = new NameValueCollection + { + { "birthday_date", birthdayDate.ToString("Y-m-d") } + }; + if (phoneNumber != null) { values.Add("phone_number", phoneNumber); @@ -112,11 +116,6 @@ protected override NameValueCollection Values() values.Add("gender", gender); } - if (birthdayDate != null) - { - values.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); - } - if (description != null) { values.Add("description", description); diff --git a/smsapi/Api/Action/Contacts/EditGroupPermission.cs b/smsapi/Api/Action/Contacts/EditGroupPermission.cs index a65066a..3e19abc 100644 --- a/smsapi/Api/Action/Contacts/EditGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/EditGroupPermission.cs @@ -7,10 +7,10 @@ namespace SMSApi.Api.Action public class EditGroupPermission : Base { private string groupId; - private bool? read; - private bool? send; + private bool read; + private bool send; private string username; - private bool? write; + private bool write; public EditGroupPermission(string groupId, string username) { @@ -20,19 +20,19 @@ public EditGroupPermission(string groupId, string username) protected override RequestMethod Method => RequestMethod.PUT; - public EditGroupPermission SetRead(bool? read) + public EditGroupPermission SetRead(bool read) { this.read = read; return this; } - public EditGroupPermission SetSend(bool? send) + public EditGroupPermission SetSend(bool send) { this.send = send; return this; } - public EditGroupPermission SetWrite(bool? write) + public EditGroupPermission SetWrite(bool write) { this.write = write; return this; @@ -45,23 +45,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var parameters = new NameValueCollection(); - if (read != null) + return new NameValueCollection { - parameters.Add("read", Convert.ToInt32(read.Value).ToString()); - } - - if (write != null) - { - parameters.Add("write", Convert.ToInt32(write.Value).ToString()); - } - - if (send != null) - { - parameters.Add("send", Convert.ToInt32(send.Value).ToString()); - } - - return parameters; + { "read", Convert.ToInt32(read).ToString() }, + { "write", Convert.ToInt32(write).ToString() }, + { "send", Convert.ToInt32(send).ToString() } + }; } } } From b51afb876ecc9d7097d58a16b3c61c604e2b4324 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:37:19 +0100 Subject: [PATCH 044/101] Validate DeleteContact contactId against null or empty --- smsapi/Api/Action/Contacts/DeleteContact.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index df7519c..0653ecf 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -17,5 +18,13 @@ protected override string Uri() { return "contacts/" + contactId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(contactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + } } } From 72e9db5d5ab0fa2702a8a8e973d67888ea74cdaa Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 02:51:54 +0100 Subject: [PATCH 045/101] Add validations to send actions --- smsapi/Api/Action/Contacts/BindContactToGroup.cs | 14 ++++++++++++++ smsapi/Api/Action/Contacts/DeleteField.cs | 9 +++++++++ smsapi/Api/Action/Contacts/DeleteGroup.cs | 9 +++++++++ .../Api/Action/Contacts/DeleteGroupPermission.cs | 14 ++++++++++++++ smsapi/Api/Action/Contacts/EditContact.cs | 9 +++++++++ smsapi/Api/Action/Contacts/EditField.cs | 10 ++++++++++ smsapi/Api/Action/Contacts/EditGroup.cs | 9 +++++++++ smsapi/Api/Action/Contacts/EditGroupPermission.cs | 13 +++++++++++++ smsapi/Api/Action/Contacts/GetContact.cs | 9 +++++++++ smsapi/Api/Action/Contacts/GetContactGroup.cs | 14 ++++++++++++++ smsapi/Api/Action/Contacts/GetGroup.cs | 9 +++++++++ smsapi/Api/Action/Contacts/GetGroupPermission.cs | 14 ++++++++++++++ .../Api/Action/Contacts/UnbindContactFromGroup.cs | 14 ++++++++++++++ 13 files changed, 147 insertions(+) diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index 7078375..07995ca 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -19,5 +20,18 @@ protected override string Uri() { return "contacts/" + contactId + "/groups/" + groupId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(contactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index b4afb9f..f58aec5 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -17,5 +18,13 @@ protected override string Uri() { return "contacts/fields/" + fieldId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(fieldId)) + { + throw new ArgumentException("FieldId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index aa68133..06160de 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -17,5 +18,13 @@ protected override string Uri() { return "contacts/groups/" + groupId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs index 5f086ee..afe50c8 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -19,5 +20,18 @@ protected override string Uri() { return "contacts/groups/" + groupId + "/permissions/" + username; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(username)) + { + throw new ArgumentException("Username cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index 8a1d7b8..9d39e46 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Specialized; +using System.Text.RegularExpressions; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -133,5 +134,13 @@ protected override NameValueCollection Values() return values; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(ContactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/EditField.cs b/smsapi/Api/Action/Contacts/EditField.cs index 8084b15..5be2a5e 100644 --- a/smsapi/Api/Action/Contacts/EditField.cs +++ b/smsapi/Api/Action/Contacts/EditField.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Specialized; +using System.Text.RegularExpressions; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -36,5 +38,13 @@ protected override NameValueCollection Values() return parameters; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(fieldId)) + { + throw new ArgumentException("FieldId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/EditGroup.cs b/smsapi/Api/Action/Contacts/EditGroup.cs index 99451a1..8ebe2e8 100644 --- a/smsapi/Api/Action/Contacts/EditGroup.cs +++ b/smsapi/Api/Action/Contacts/EditGroup.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Specialized; using SMSApi.Api.Response; @@ -60,5 +61,13 @@ protected override NameValueCollection Values() return parameters; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/EditGroupPermission.cs b/smsapi/Api/Action/Contacts/EditGroupPermission.cs index 3e19abc..ad4093b 100644 --- a/smsapi/Api/Action/Contacts/EditGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/EditGroupPermission.cs @@ -52,5 +52,18 @@ protected override NameValueCollection Values() { "send", Convert.ToInt32(send).ToString() } }; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(username)) + { + throw new ArgumentException("Username cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/GetContact.cs b/smsapi/Api/Action/Contacts/GetContact.cs index fdfb8ad..d59c749 100644 --- a/smsapi/Api/Action/Contacts/GetContact.cs +++ b/smsapi/Api/Action/Contacts/GetContact.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -17,5 +18,13 @@ protected override string Uri() { return "contacts/" + contactId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(contactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/GetContactGroup.cs b/smsapi/Api/Action/Contacts/GetContactGroup.cs index 629c8ef..226fe06 100644 --- a/smsapi/Api/Action/Contacts/GetContactGroup.cs +++ b/smsapi/Api/Action/Contacts/GetContactGroup.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -19,5 +20,18 @@ protected override string Uri() { return "contacts/" + contactId + "/groups/" + groupId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(contactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/GetGroup.cs b/smsapi/Api/Action/Contacts/GetGroup.cs index 1b5c911..c17c8d0 100644 --- a/smsapi/Api/Action/Contacts/GetGroup.cs +++ b/smsapi/Api/Action/Contacts/GetGroup.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -17,5 +18,13 @@ protected override string Uri() { return "contacts/groups/" + groupId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/GetGroupPermission.cs b/smsapi/Api/Action/Contacts/GetGroupPermission.cs index ccd12d3..6f0bf7c 100644 --- a/smsapi/Api/Action/Contacts/GetGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/GetGroupPermission.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -19,5 +20,18 @@ protected override string Uri() { return "contacts/groups/" + groupId + "/permissions/" + username; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(username)) + { + throw new ArgumentException("Username cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index 2bd77c2..3be2204 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -1,3 +1,4 @@ +using System; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -19,5 +20,18 @@ protected override string Uri() { return "contacts/" + contactId + "/groups/" + groupId; } + + protected override void Validate() + { + if (string.IsNullOrEmpty(contactId)) + { + throw new ArgumentException("ContactId cannot be empty"); + } + + if (string.IsNullOrEmpty(groupId)) + { + throw new ArgumentException("GroupId cannot be empty"); + } + } } } From ded0363fa5680f432f40268d6fbaf344d8fa6f56 Mon Sep 17 00:00:00 2001 From: knowak Date: Fri, 13 Jan 2023 03:03:45 +0100 Subject: [PATCH 046/101] Bump up library version and update readme --- .gitignore | 1 - README.md | 10 ++++++++-- smsapi/smsapi.csproj | 2 +- .../{App.Config.example => App.Config} | 20 +++++++++---------- smsapiTests/smsapiTests.csproj | 1 - 5 files changed, 19 insertions(+), 15 deletions(-) rename smsapiTests/{App.Config.example => App.Config} (52%) diff --git a/.gitignore b/.gitignore index 5f1fa96..b09f534 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,3 @@ */obj *.csproj.user !.gitkeep -/smsapiTests/App.Config diff --git a/README.md b/README.md index e9bf1f0..107b71d 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,17 @@ SMSAPI C# client may be used by *SMSAPI.pl* and *SMSAPI.com* clients. ## How to pick a service? -### *SMSAPI.PL* (default) +### *SMSAPI.IO* (default) ```c# var smsApi = new SMSApi.Api.SMSFactory(client); //or +var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiIo); +``` + +### *SMSAPI.PL* + +```c# var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiPl); ``` @@ -62,7 +68,7 @@ try foreach (var status in result.List) { - System.Console.WriteLine("ID: " + status.ID + " NUmber: " + status.Number + " Points:" + status.Points + " Status:" + status.Status + " IDx: " + status.IDx); + System.Console.WriteLine("ID: " + status.ID + " Number: " + status.Number + " Points:" + status.Points + " Status:" + status.Status + " IDx: " + status.IDx); } } catch (SMSApi.Api.ActionException e) diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 95aa08e..7edb3c9 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -10,7 +10,7 @@ SMSAPI.pl - 1.1.0 + 2.0.0 false https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE https://www.smsapi.pl diff --git a/smsapiTests/App.Config.example b/smsapiTests/App.Config similarity index 52% rename from smsapiTests/App.Config.example rename to smsapiTests/App.Config index 0ad707e..b831352 100644 --- a/smsapiTests/App.Config.example +++ b/smsapiTests/App.Config @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index 740448c..d77a07e 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -8,7 +8,6 @@ - From 0679b48719d782a09336ac565460b1f0b3d84454 Mon Sep 17 00:00:00 2001 From: knowak Date: Tue, 17 Jan 2023 01:47:33 +0100 Subject: [PATCH 047/101] Fix birthdayDate type for contacts actions --- smsapi/Api/Action/Contacts/CreateContact.cs | 10 ++++++---- smsapi/Api/Action/Contacts/EditContact.cs | 11 ++++++----- smsapi/Api/Action/Contacts/ListContacts.cs | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index 6a397b0..6605ec2 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -6,7 +6,7 @@ namespace SMSApi.Api.Action { public class CreateContact : Base { - private DateTime birthdayDate; + private DateTime? birthdayDate; private string city; private string description; private string email; @@ -79,10 +79,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var values = new NameValueCollection + var values = new NameValueCollection(); + + if (birthdayDate != null) { - { "birthday_date", birthdayDate.ToString("Y-m-d") } - }; + values.Add("birthday_date", birthdayDate.Value.ToString("yyyy-MM-dd")); + } if (phoneNumber != null) { diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index 9d39e46..304dd9b 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Specialized; -using System.Text.RegularExpressions; using SMSApi.Api.Response; namespace SMSApi.Api.Action { public class EditContact : Base { - private DateTime birthdayDate; + private DateTime? birthdayDate; private string city; private string description; private string email; @@ -87,10 +86,12 @@ protected override string Uri() protected override NameValueCollection Values() { - var values = new NameValueCollection + var values = new NameValueCollection(); + + if (birthdayDate != null) { - { "birthday_date", birthdayDate.ToString("Y-m-d") } - }; + values.Add("birthday_date", birthdayDate.Value.ToString("yyyy-MM-dd")); + } if (phoneNumber != null) { diff --git a/smsapi/Api/Action/Contacts/ListContacts.cs b/smsapi/Api/Action/Contacts/ListContacts.cs index 63d7c6c..04ebaf7 100644 --- a/smsapi/Api/Action/Contacts/ListContacts.cs +++ b/smsapi/Api/Action/Contacts/ListContacts.cs @@ -134,7 +134,7 @@ protected override NameValueCollection Values() if (birthdayDate != null) { - parameters.Add("birthday_date", birthdayDate.Value.ToString("Y-m-d")); + parameters.Add("birthday_date", birthdayDate.Value.ToString("yyyy-MM-dd")); } return parameters; From 01e3c632023f6b84d6532aed9117622bd4bdb894 Mon Sep 17 00:00:00 2001 From: jlabno Date: Thu, 19 Jan 2023 14:07:03 +0100 Subject: [PATCH 048/101] Nuget package --- csharp-smsapi.sln | 3 +- dll_files.zip | Bin 243925 -> 164561 bytes smsapi/docs/LICENSE.md | 13 +++++ smsapi/docs/README.md | 107 +++++++++++++++++++++++++++++++++++++ smsapi/docs/icons/logo.jpg | Bin 0 -> 1366 bytes smsapi/smsapi.csproj | 27 ++++++++-- 6 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 smsapi/docs/LICENSE.md create mode 100644 smsapi/docs/README.md create mode 100644 smsapi/docs/icons/logo.jpg diff --git a/csharp-smsapi.sln b/csharp-smsapi.sln index fa4d160..06e0fce 100644 --- a/csharp-smsapi.sln +++ b/csharp-smsapi.sln @@ -27,14 +27,13 @@ Global {05C2A720-2CD1-401B-A832-9CE85313C248}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {05C2A720-2CD1-401B-A832-9CE85313C248}.Release|Mixed Platforms.Build.0 = Release|Any CPU {05C2A720-2CD1-401B-A832-9CE85313C248}.Release|x86.ActiveCfg = Release|Any CPU + {05C2A720-2CD1-401B-A832-9CE85313C248}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|Any CPU.Build.0 = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|x86.ActiveCfg = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Debug|x86.Build.0 = Debug|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Release|Any CPU.Build.0 = Release|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A0C118D0-9435-477B-92B5-0918E1CDADAF}.Release|x86.ActiveCfg = Release|Any CPU diff --git a/dll_files.zip b/dll_files.zip index ff7676b558b97298a17ebd7c35649b40373c8c37..9f545e4a063773fcad3149fac53c10b043c8702f 100644 GIT binary patch literal 164561 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Č@36zrTIlE5)O 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≀%yw&XO@BbRI;b&2ry#>*wHPKg`WF%C|MFD><-y0 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 literal 243925 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ྞo#*``N3qzFC9zxby%l1CS?c?6Ma=3B;^AhEb05opd zE)bB-A7s$A*&zLNVtS*KYkuz7V!Eok@MFZqxZI2j5?93Z}zWxVf(*GeX!tl__YxNtM0Q8MnAV6! z$=IbmCa?_qDxXQ`g)g6|vAjvAVCDy10w_vRM8w?HeD3Kup|D8Arda9Ii(!g)1dShP zE>QACjjpF0@XFIMrpg?Jxp2BU=8V$0HYs8=TKBY*(D4x}2CZxpF!-5*&J)#Q7 zu3g0%>>agYN4gp_w{_4tmd}^?ZJ&Td)$*Frr2!6o4k zk-*8)F;(s^wmJZBxvpw7i+=o}OwWq{0c)AO!)=7}>H#Fzt8_OXTb(ipU>|Bx-J5{t zlfWPp%qVlWS6N)xq?RJ&6DX29O`omii_1r9JH!HME2!xSy-I`Qnb68l)7Ei2$}5nutzOE^J+#0t>hCX|B{3DdkH>X3mfMvw~)ov^Y zL$2PJ&e|hk7w0XBKD10d2=8&~w|G{1L6;>SHm6r~2VS*JU{cS zQ;?RDOQwn(Kd;nnxFQ|Ud}p;?HoMh_B^SL~mP^>GGFh*R3N*ec<}N{F;5${&9pu(d z@7#nXmVDRgvk$R3)hk&Izakcl?x7qPzo@kIukSXfEBZ1wysHwkKWg;Fu~1-Vc_sbv zOh?35AD~ks?sn?ZYLZqvfPds%R^>oFpJq9YE@=C#Tj^-JL=IOSG}zDhjrhITgNOW3 z7*KzF2+D}Q|Nh`V-(aA~{`2VRf2ygj6*DUXJk+!A&mTbHKxvm)@B{k{Ix7w&ssS+0-b(vo+-)&m9g^v}M3^!bDFqc6||sA+CUuVZZdcS3NC(su%A z@CV_Z^eX`*+c49~0tHoS@hc(Yj{6hg?#*L=Cn)wyeJ9-i?f3OB!au!1{!_yr-o$%; zCuo~l>S~&sGts~N$)jw{f$#k(8U6mNM?w0gGfj8h;vPUj5&hZ!+1*b%{?Y&5D_wIS z{YRjg>EHEWl=uA)JwGzJo<-QW`XiG*sJkTZv;KqE=Jl(dd*094*qi^z=3d!-{mZ!@ zB-fX>_Co)8Pv6g^v(bMc{l8~qh4A2yqu|es7=Ox$y1MwgXM?i;J)@czUpJcX9QtQQ z$^Yno@7eD%+JG2?*I%8BWoWQ^{Kr)OBcmk5U-jJcexFgJ(+_3$3V$Wh zv;YT%f1A;y%D<3)$%xzS#~ihCeg3YA8tq5@i}b(dNG|N}B<5e{XdKk=-Lrco|D4kw zM_b6Er|a+M$o(Jv?>+lnM)lLR-+7fnKXlyJzx4dz#kpDt!2UL)PvO7nx##_y5d(|z zPs;8U{z?jxpUims+l=a#|Aq8RM%Jf4GRiagq3OQ=oaY zz;ylhIm$?;7XAGkY5$}Dy=TA6XlbYPJMUh{ef>+%kBs84upUDHHX|*(U-jJcexK3X zvmeUt75+-{(KM#`{TwBH{1?*yLq;fnp1=RN9^oZ_CjqTAO?5Oab$-1d>0p$7H;t9p z|G!?49yvQ^KYR!Ur3noMMf@k=*&RUmpMZPUewWgY>yNYDeLDB`SMTh+)jvr6XO)2a z6VN;LABygQKgV=`NxIi|Uw=h~MN7`zUy^=Cp&b4j>R)nt0R3ZS!hQ3<&v!rP6hQIl zk6HRFr=N#OV=V7`PV_?mJtvbl(2^Z@skGcJ9DdHJ>Yspn+kTgm+SHftKy2b4itg*L z<{`&n68=7?ddhz&x(EK8)BUoJ+~kM0dyT)Me%=n??~4>+yMIIdl9Sei{C8E?3_n!e Z*Y{%3Fn6v&;op5;!9zhc=Rdl8_J1l{^&$WO diff --git a/smsapi/docs/LICENSE.md b/smsapi/docs/LICENSE.md new file mode 100644 index 0000000..c7d575e --- /dev/null +++ b/smsapi/docs/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2023 SMSAPI + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/smsapi/docs/README.md b/smsapi/docs/README.md new file mode 100644 index 0000000..2bd2fd8 --- /dev/null +++ b/smsapi/docs/README.md @@ -0,0 +1,107 @@ +csharp-client +=========== + +SMSAPI C# client may be used by SMSAPI clients. + +## How to pick a service? + +### *SMSAPI.IO* (default) + +```c# +var smsApi = new SMSApi.Api.SMSFactory(client); +//or +var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiIo); +``` + +### *SMSAPI.PL* + +```c# +var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiPl); +``` + +### *SMSAPI.COM* + +```c# +var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiCom); +``` + + +### Example + +```c# +try +{ + SMSApi.Api.IClient client = new SMSApi.Api.ClientOAuth("token"); + + var smsApi = new SMSApi.Api.SMSFactory(client); + // for SMSAPI.com clients: + // var smsApi = new SMSApi.Api.SMSFactory(client, ProxyAddress.SmsApiCom); + + var result = + smsApi.ActionSend() + .SetText("test message") + .SetTo("0000000000") + .SetSender("Test") //Sender name + .Execute(); + + System.Console.WriteLine("Send: " + result.Count); + + string[] ids = new string[result.Count]; + + for (int i = 0, l = 0; i < result.List.Count; i++) + { + if (!result.List[i].isError()) + { + if (!result.List[i].isFinal()) + { + ids[l] = result.List[i].ID; + l++; + } + } + } + + System.Console.WriteLine("Get:"); + result = + smsApi.ActionGet() + .Ids(ids) + .Execute(); + + foreach (var status in result.List) + { + System.Console.WriteLine("ID: " + status.ID + " Number: " + status.Number + " Points:" + status.Points + " Status:" + status.Status + " IDx: " + status.IDx); + } +} +catch (SMSApi.Api.ActionException e) +{ + /** + * Action error + */ + System.Console.WriteLine(e.Message); +} +catch (SMSApi.Api.ClientException e) +{ + /** + * Error codes (list available in smsapi docs). Example: + * 101 Invalid authorization info + * 102 Invalid username or password + * 103 Insufficient credits on Your account + * 104 No such template + * 105 Wrong IP address (for IP filter turned on) + * 110 Action not allowed for your account + */ + System.Console.WriteLine(e.Message); +} +catch (SMSApi.Api.HostException e) +{ + /* + * Server errors + * SMSApi.Api.HostException.E_JSON_DECODE - problem with parsing data + */ + System.Console.WriteLine(e.Message); +} +catch (SMSApi.Api.ProxyException e) +{ + // communication problem between client and sever + System.Console.WriteLine(e.Message); +} +``` diff --git a/smsapi/docs/icons/logo.jpg b/smsapi/docs/icons/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4167b636603bc44f75fabc6f949fdfcffbce7108 GIT binary patch literal 1366 zcmex=Tm5XlviOkM)<%c@%WvGSUFnsoCcw&CGhtsq&S^Ktquu{_IcqhN zIGO}Y9ORjgzRrCcyW1%Ep4exRP5P<_78f{J*j_yMdP40%OG%a<0YBIFlDKjk{@~>5 zn2TayE6%d^sE-84N{ zHC5f@)s{yKG|pEoHW2EcC~eI1HE`wY^|P1Vw&>cY#gUMBDJjihn#J2R?iuF~P7L+4 zGQ1}1S6%c?;dgr4acN__wCOs%3%B|PPEV2w+o|`xOJQ^TnrECm&6~91R0~C==AL+P zM#c5&KhM!_U{P zp79i4bGx*8i}Bp4Yv1r(ShsuT+PLRN{b`(K>({9GzSo*8dcel@)SRZ9#uOgZ8fG*IQ;+=N(MGedWZZpamZH)=is~6d>GM7V2i>CK|nxi$QVk z*XP;yUoJYn>$|Pr<2$0E8)u#5nRMJUHk^rFp(x|R=2f2(BBw9VIpZ#P*{}3;{BIxb z%X_#Q>%Tr!Kexo~@yCi+w*Fj~jH46Zu2hL!yY|Ow%bKu?S&G_WkKTAKkOYK{K(ZiWny{=2oDd$+X$>)>7QUiA`v9bikpw@{Y0-{9~j~O2D#%1Q+2@%;C z_4d*w-`qBiM`5eJE}eTwX<_CZGnKMqktbL?PfDtLpLwkK+vRdunrG}Poi%Ky!_ssk z!(Ig}K5rn)bJK2uO_+wto0E$UL?-*C1a6X?E47U4M|!;lALG+W3NsI|q|Th_Uv(>N zmDkZNu7z2FSg;K+i+ UzHiDbh95uvlmCASr7XA!0M^18s{jB1 literal 0 HcmV?d00001 diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 7edb3c9..6f131a3 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -7,21 +7,31 @@ false false 9.0 + SMSAPI + SMSAPI + SMSAPI + https://github.com/smsapi/smsapi-csharp-client + git + SMSAPI + SMSAPI + README.md + logo.jpg SMSAPI.pl 2.0.0 false - https://github.com/smsapi/smsapi-php-client/blob/master/LICENSE - https://www.smsapi.pl + MIT + https://www.smsapi.com SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. - smsapi + smsapi;sms;marketing;shipment;mms;vms;message netcoreapp3.1;net5.0;net6.0;net7.0 True + @@ -39,4 +49,13 @@ Resources.Designer.cs - \ No newline at end of file + + + + + + + + + + From c11adf1ed78f0b8a968672e9ba8439a17676c865 Mon Sep 17 00:00:00 2001 From: jlabno Date: Thu, 19 Jan 2023 16:56:14 +0100 Subject: [PATCH 049/101] Remove deprecated phonebook --- dll_files.zip | Bin 164561 -> 152237 bytes smsapi/Api/Action/Phonebook/ContactAdd.cs | 125 ----------------- smsapi/Api/Action/Phonebook/ContactDelete.cs | 33 ----- smsapi/Api/Action/Phonebook/ContactEdit.cs | 137 ------------------- smsapi/Api/Action/Phonebook/ContactGet.cs | 33 ----- smsapi/Api/Action/Phonebook/ContactList.cs | 136 ------------------ smsapi/Api/Action/Phonebook/GroupAdd.cs | 47 ------- smsapi/Api/Action/Phonebook/GroupDelete.cs | 52 ------- smsapi/Api/Action/Phonebook/GroupEdit.cs | 49 ------- smsapi/Api/Action/Phonebook/GroupGet.cs | 33 ----- smsapi/Api/Action/Phonebook/GroupList.cs | 25 ---- smsapi/Api/PhonebookFactory.cs | 99 -------------- smsapi/smsapi.csproj | 4 +- 13 files changed, 2 insertions(+), 771 deletions(-) delete mode 100644 smsapi/Api/Action/Phonebook/ContactAdd.cs delete mode 100644 smsapi/Api/Action/Phonebook/ContactDelete.cs delete mode 100644 smsapi/Api/Action/Phonebook/ContactEdit.cs delete mode 100644 smsapi/Api/Action/Phonebook/ContactGet.cs delete mode 100644 smsapi/Api/Action/Phonebook/ContactList.cs delete mode 100644 smsapi/Api/Action/Phonebook/GroupAdd.cs delete mode 100644 smsapi/Api/Action/Phonebook/GroupDelete.cs delete mode 100644 smsapi/Api/Action/Phonebook/GroupEdit.cs delete mode 100644 smsapi/Api/Action/Phonebook/GroupGet.cs delete mode 100644 smsapi/Api/Action/Phonebook/GroupList.cs delete mode 100644 smsapi/Api/PhonebookFactory.cs diff --git a/dll_files.zip b/dll_files.zip index 9f545e4a063773fcad3149fac53c10b043c8702f..68d17f87f6230810ca14eded4af30e5c2eb2f11d 100644 GIT binary patch delta 150565 zcmV)jK%u|Ug$k{u2@Ft60|XQU00000=!TIDBLe7#u`yu+4$+1)R^b4%d4^8_00735 zpaLI%=6*BZ?5nc7HLE03YwI(!yS5NQp5-lxWDy}M*2g!MG&>1-3kea4Jkv|^NK{JR z@+Ofj^2(dMAMrou-tT_jG_#hU-_QQ)-gD0X+;h&o=iJB6&Y|_!7^YzuVf_E|Ps3Pf z$e+E8mVd_Mf9q`)wKg6sT-kYH=#Z72j~q6CJQY97bxw1KG{jFHa^{)N$oNS^y z$kE$p^DxWbll=kgK4J_TU>N&d0t*VC{SMW{KmX|@?2d*}lo%{~Q8BSMj8(i zPV`c8b8}V@i_u%t=(*!eur-}rD4q3xN(75oS2`9*8QDj$oM6ncNEN$?Q-tKxMElkHKAn20g`p-9x$4 z+bf^N{qk5mARy~1mupZ!)J>@!6Oh?bZE!%eol-j?AWKNK(}E7XNQP~`g1uxVp#&0? z?%pEIwE*5GexQbl1-KnaPemPCFd+?9)rhVM(-}d?U?3zjt4mCgCLJk12o}x;ks66c z8X1u~D-cW)UaCx|0iv#eMhBpOY6-atY79U%5*pJybS^{Kzja}wz1;Do2(Dt{-g3Lm zNQT-L3Cr#&Lza&YM+bd7>;%!RHe2w9jGfNB9jdq%GIbYL5BbF({$e?2)7}SAb+LN|hNkufJr-7rlqUCm-6_C? zeG=4pzI?Il2SQ#aeTb@c?}5_zVxDz5PFhI$NA!vC?B#2qHU77MH4LuYWG8nH#w6U= zxebM=?au8GZYQHnx$ruc9G;@@uc4s)^DR^6EqOT+y`hon3nXHXAwAdQtK64iFXHSE zx^-BBh+?a{h;agXlk#%_U=XZfBrXY+B(6Ml^yhi58TZo7#0nk_w%JC^t>r z%ERtzSdJDr2a}tBnsC>)$q3SCYV5Nt;RwnHIlTZE)- zGbC+?L(+DH`_|!%6_QR2?i=MeTfhl(o)gc974T80d=x2vAH~W?iSp6P^U+%QD3Ctn zINO8|;vyvv+H=xWw9wJjKxpzMT8!`0E!uyYK=Ya&iP zy7EYJpHzE)cqq3@t+I%HEKT`mL=!Ew8mYIBqm(0z4iv`mV1htfdoX#zz!S*TLrtyA zBAa3zP=(S-6g7h9pukJj9>yC5^aP{d>%4I|r@P6WR4UR`_o)-9Vy(8RAv9N!rY%st zwIvB>IIYV`K%&APNA$@=%i8D*JB6?#RZ9v+!JH_6vT8uJ0aYBWDNk1NXv-}Z*odc4 zHlh@#6~#(nc0);$I+f0hsiIGq3mI|>P;L2SLHk53QIXhEsr6R-ScEg})e*z}5yEs% zqYX2IKr=H;o-#4!6Q`=J9?NV+d3QS_oJ>a=mk?yTrC^ zmvj;X&FWHQVibg_(P->RH1`g?u-<%Z^u_sq{bE~>KEpo88=c`;i(>p19F;Bo*S0u5 zZAgnKa}y9G^<%Q0x0xMPR=Drt2}Ud2t)ybv$*-H9gkB)hB;vcTrc^SlX`f5RW8`M6 zDwwqF(|tYrOhB-|Cjh~M13Uo;798jan1HPZykE-}sJYDc1am-8+4WIn*GMxb2BMsQ zC9&s`cD87~vY1g}kE33l8Tu~fHBk$3I2o^0h>;oKFVPW9b|dmgBHL#A$*w;|a+OHa z(CSvQch2MbtH9RjM`BR1#B0J{hIp!3Og7w|Va*v&PYn_CWcvnX6$u&Z@%dsM=m%F% zWGpjCcE`xTj+WhEDLhJc$I0&a?0Fu43zimom|E!bX`zXMNI_>P=mLU>k)p(M;ao^D ziSz{OoQtTnFJ}4@ZZAdaG|)TgGVgxe8BR;&{dhUqy8;c}k5_WvE;Et)Mk%(#I5QPz zU+tY#6Fggc!d5HT!Y?Qg#YS|mF=Hc~NuXb`afk3n1gUHJVL2J?T_h~>RFal|9f9>C zY;=APaoJgrfWLuwDC4c#TfWjt0Z!o!=G=&`s43~(gx)mA_|MCu}>{MyRS3EzZ%WhW#wcse z7w+kFO59F0U!SZOZc4KUCl3~GTC=++cNgx3nypFJ2=@xjc1m^wn?@T?lg~; zd*}n<-lG+|33rxeItX`xW?BjNv8;idM`4Vn^~OIh{m5sO)9>6(JM(Z$o`5rGSecck zV-X^qO$FbP3!lhvP*O;eCbMgk;WaAN~oHW8PDgOh7eWyIIM_~*e0HgWV*fQa| zPf|^#N$jp-k|6sovh%cmlzYFVYyh0P8}wLK((ETH zrp9V2t*J&$Wi&NTQ|B?&!9CRU?#VD$b{W>03lw+qIo_RIU1_-|K#@iIUUt(E+4q3q z3KnUyUR`RrlOUIz0>&y}765QQkXFDW45WP^qkxqRWPG4e0q+BU0OteeD&T7X;Cx_= z0-|96;52Za0!jgZ^8mhj?ghc?G+wXR`D(?sfqH^}7w*M-U9VSqyfU~aG{E_u&R4*J z0KjE=n(2AEKzq7SQxlZW0ovz)&3sM>`UIzaUZ8*!0B}BVp#m-g04^(-`_y}6mMrg! z0CF4`>xeGV)TNq#x{RrMcM@BqLGA*Oe5!i2m8RZ{yUJb3s$|xltzLO^xR4lK#pq?t zpz9gEBrl5jU8?5yCDg$A^XsLz?d7~*+b8;}{Yt$2IN($;c{gcb^cC`xgg@Cn7(En> zKeTfs&(JG*s9Gp6dMKE@N5DXxi;426xr!{f$^yyU{t+U7A=l>&7~fcfjsyDnoglt@ zrIQ=gYma+<_FSzqeT}9jY3f={P1e+Pnz~+7H)v`KQ)=<;wjuAcn0#l@)wyR7M9rT; zHw4ch<`i&k@C*W{fyu!$2%HA451v8bG;m$;3<9TtNx?G+oCdB5oq>oQ*LkxuV`}is0Ovc!;ATtsKI!xp&*{xNpVKsT zD^a?@Z}9`kdv-xv#{te?m79a>2u=gjf@c@FVC1*7w1cM09W=w6z->D0+ck9uQF?z( z_xINfy}#sncB1_BFZ(>Z%{!Cu{>?ql?#PGg^X&G2TvYAm8O`kG=`HQ%JE5S@I57IO zVJ1&$4b)k_ORg2fVg0JP%YW5Cu1_1t^BIFuGx2FB_XJNvFgiXkE#&fE8Q;v{X?U-n zEy#6zVDhiuz0JlqS30?mtkXljHD6N?Xlj9` z9%PDt>Z~8m!*+o^1B7?LJVXLcZ;eJWW6z`6bh6w9K$YnJz!j-f=Lc1nK^3C>s_6y6 z;50BNc$|XM!2QAF6r7HHo*xcS4hLM`aOMV2UU1sRtlVpYMQ6(ojr?oE zf9uRwZ=DBZvLE7Pt0R;ccdbq~v==Dt2c`CZ!>p|e4~%;8=+byZr*a`vd}bUJJpZcP zZ(-m44UPA5c|^^wy#=e_^wKR19+b@a)0j&x{ohC)l^bJGaN|DeZ(PXr#(+Hk#$A+m zWAJPq^B%znF)>(8WG9XnkPM5WdWiaig#YKO%;S1RK(UQ|$;QRXMt?Bw5H>`({V=3| z+S(&I))s4POldPieKU)5%q;Y>^Q0dA1XD+dHX%1ZYjgl`X`M$Ehs=Alu-pnH@Q#DckJTn>b_2~tm6TMu|OK*y+@O0wkeMZ&Vyl9|a zpJda3{Cd69D~)GqfYyA0HJ{a*J%wo(7)CO+h`4&Cwc4ADHusok?zt>;>)9NC$)Kq; zo>viW3`W?WCk6=|6Ph|L& z{IE#BsG^(#HOVR9HIT9HG0UApNF%X)kG8aLS1Mo`hJkBwL*puD&6j=6*VPW+2!Lb# zzjnSzzocA53$tCkN%Fm7#mVlHj!va#LIt#<6@&0R;HBZmr-$=EfW=XNDZv*OR?u%5 z6&dm&+)9ki(4^H_^O>+0V}$qN{5MN8?*a_4Yvd>RtEp?3Stq;q)vqE_%+x!YdRJ3x zG}WZ3wVGO|srNPYo~Axf$IJGG{^xw%Ls{>TJpqX{4e=f#O)A;_fq?UKyH)|m0s!X& z6s-Qk#LioJ&q@;8OK5R_m-<;+v$<|VA?dEkr%O|c^*|k8#5!QJ>Uf<8U(Ybu0BpH4 zIn33~?VfkMrz+GWr+^Ps9WBeMqkLKZC_Bp^%e=0a-3HlxroPKjW5$x93V>d2KGf7l zn)+B%pJ?h+O>NNBXPWv#Q=c;>bG%!2j@R-Op`dg8NifIY^yEK(4dxh}20qH4V~BI} z_Hq6kL!7JoS$2-WX61N8c84k3}%}-1$>b|+q|S-X5HW4@=%iL zn|?9%Qx$F&X$#Ejb4aT{;k_aX=@qeDNuSKQRU~JZPe8Fn)*&tKWOSlrqt(7b?7Uo2K&mABg55k*?WKXE4BE$OiH*v zEj<4XtU=Yz-#!F>;D<4K|6v?gZdwK0;H}WPXtPn}z@@>{HRPR-L;n3+`rF`BgECI>+xZ}Dbhbtuunl?CVB|@ z&7`Nj?^(@<&Guw7{R`v>`!{sOR`nsc(0}Kr=pSgQGJ$QPp=tV7(KFy%m6`Ul{C7_g zt18OScu|;t`I9>N9W_(fMcBSg14NpntwbYro7&aj&y}K`8UiEF!$?U}`|_~ZW)o!I z_|mZb0+6P*+2X%AHS;(dt1yoL&RyQ+E;IMee&-G$F;PagMwB(in#fl6&?HKwbtt3| zMUf({YEY6&6eUTKtc{9Rr6fruWNUfObI*J4dF#`E`o}!?eBWn(&bi0nwF)=N;^F*% zV;Ziz4Y5jujS>dl!cETqZJSt=><@zb^9b&*FZJgYvOk}I{yBe0GMT3=$OB1d8Dbe`nI^|DS{g=a1>=lPp0WsQBxm>%Z%5K= zbDQOv-J(XdRgS6|kIG7nDua8n)u=)=s!x{l-IbA;Rt8V2$eEUvnASFa=klyfKfiOS zXa0+~Fa3$PFB6@FKCP2!$boVVSu_Cth$KFLqREP)Mq>D<|Ff;LBccER`r!I^ahBW< zxi`OtL>;v^wtH{X<-)L!Rv`E`5lvy&N0lS zi6_qCc|2Sh%oFvEc~^cW-YTJAx5M%v_MyMwNDr!8erhN2E;i$n7&h&~$?8P8_vrJo#vYGiadeVW8nCcpc#Cb2JQNIxCuXMlR0 zu?PwOu=+G))ru*5n4a;|UG@{%1_lJAJjwDGt5tR;PGn1M7yD3}fuewv5th4I&SLp2 z%b9G`)V@7CfO*#K6yYbEwf4(F1CuNnGZHKh8@MD-%C9UbpR;btFtDC-8OV=+$tT@2 z*3$Z=$YbQ2ZXF33IMtSNe{@RR!08cbb65C~NJI7Xq23HYwD%ae4l8n~s<6~fByA2F zxJ^w+H0a}C_;FAv{_F!h*&g}KsxVpf$r13yB>eASTl z6AWp;1XAA5a=qOuI|q-L(teMBZ+j#kV*|_5^3joG23E1}cw72j3Mu<=oI_mO>hxvQ zS2do)T)&j{3gnay^OGe(*<&PL9 zaMxF)OYMALdAJU0WnCGmhx4;!wRzd);YQe6(1iN(@%*=NoN;V_A9wL_w49IBV?s&+ z!B_qD*1Vi{Ns7|sC3%=O1c+$u<2Rt*$qwZ7g%^GZq7TvshDOoaW|~wmFjR#ofN@0A ziTV&&{DGn7L_Ij)NK@vs(U*0H zxUv8SFm(@+CDA~p(<1{z*CB|(OgTiOh=$@Z0H;t)d4rTP?JG#oFbDxO&Knq-OmsEI z(Ohcg%6u6_GD>xd(vj#Ire8%uH;Vl}^GUxf+{%9G>=z@FmUGg7$&Y9()0-$Wrz0QZ znXWg>%)W?Y0@LlRtAsn4?u|-11$Qz1l2>MqMioqF>PlpwJ|1J5;+Ihx;BlsLS&|y! zNv2^wBAWYrrvB-YnqdLc+}tuVfEHNDG$^~wOe1=VsYjIZ5k1XxZJMO^c$KM?{4#I> zRxxcO${~7<>CrrY%0RT5X)#lGyumbqd+3j~OieSSZV29FisZ>|OYs)dQl`uCHq-G; z={Eu!`4n77w#eR>VF4F<_djiEwb=mSsG-YbeG#|~G`mo;uv}RhFTai|WcBq7@GexOK zJJf;c0n#CXTWkgP07S;L9jw8bj0)D>0m@$f`(d zgI91hQ-fH4MVdSVH!zK)ZcD@}j1h8IX8ELUHST8JW{-@y4%3(}wj`~`Os31@6=|Jm zXJ<22#7IZ|+{5*)JwKz|>0SBl?M{CFlDd$C$=)z8~;^8(*4F(NACej2w?wL_oll%T$}` zC}K?g1!zXc5N9f5f~drFHV>cw+0&eYmyws+1sXvygu9z ztVvakiBBT?Y8fTI9%FM^ni`aBSpI6HGS=d?$4sq@ zgHnDT*Q;{00ypK(rMzu@GUE=eVI|92K4~+C?H7B>sj68%Dcf_*VHU0FCYI}MLdqB7 zsqUucEhO#IJh?t@QWwf*9naxyA)jnwsoVGW$|vuHNh;rY`EvatNylapukUAhC(Dn2 zW95eGl)dDxEutr#L(7cB+^F)rWrlpdik`F$lD(>AeoV%^o8>d1^&}&CB)LbyC$lOZ z^vH8~J4u0qrkqT9fm{!YNSV#&EsyP6Wk~7a_0>@+>+t^e&&7K39=npa}~+ z?vt_`KOadGcCufiYDh}5`JeTW@1tIST60XU!SSWY|ED&6KJE%xtIf?_Tf%;s;Z*oc zOs+?gbgDH%PVd5r?{#W(=Uu?|7iYg?II=S5sveWy=o2h^L`l-gf5-6Q!B9ELIT`Xv zVO*}~MaYXI>yk6Fl-fB#xlZSO+>s-vv4o$*<8pmoNXi*`@_RHQDA(=%Qtrxsk-km2 z-#7Tl9G-AzwxOGWdtXTF*(}>~-VmRhvXGR^`8LSo$Q6`J`qKJOzJKY(d!c-J?Vi=g z{w*YT^2EMlul<5MDv;|SPq}`&-wq>lA~?;PxjS+atDDO9H`maV-d0q@tV+6V$tYFe z!AD7|Y5MSGlFl^!IFO`Kkunph8jC z=wve!Un{yQZMvC-lTIyp512WKR8zG?A2D-rnxf{>`DP4_74=D5Z04i0qLsPJ%mNHj z)H&}}vl6aT^g!+#M3WVN^~>I1R>oXKgLAhMEm5>7_XG13yrIa5enPZ^X#!8aD!x`E zCtnReE0UA1j_|3H#-TX>E0g|oRNvdfUx_0w)*KXEw?dBQidMXp9M!z-d zxcrJ-esx`b^)N#Db+Qhc4KPVjyVx!x7QNs`7Uzh>+Z_e6C+P^`n$>MjVZ|tW37u(o}`J^C0HwoJDO(o z!8b{oW%Y%xh7&V_e#m5c3(rPNMSrwT=y1ptTDKVYng?s!@?eiC$%2NW3kr5ZFou3-HvrkdxWg)4s2BjG zvb!-_k*w^0UhGgLE4vR(Pgg{h&Bmil_n=(EvT8W#eW`2SFI1VZLE~^?*o7#yU z-uD#}jUaMnJr83Ngl7Iy@g#0f>X!JP#2lsxd?v~<&(Sfxs{Dpz-R3F(gXQ{!&N9*~ zdCRd|QFi(gUpc;Fdds>#UwG%^JEiLwuS9e>5yk3%9$(^{k6)Fpdr){6xH2q2_8E>} zU3-C(f&7{f)m6IHW?Oq9ikZe)+sv*+t(ER2Pe1!9%v2Qewk4XYXsJ)?_AA=uk-9@F z%KMoSJcYoS33@)WR6LC=MQ>*evY$qYqNg(Y*^AIY(S_u76QK9REz&*E7ZEtkYo@)Nzq^p-7Wy#$+8l(G4KEWrnw z-*Y%jMxqq-F1{bA7M#1f3gY4NB{OCvQcfTbR~bvfH&7mmtW>*5YABR2j*wF3XBU z6ntSmYOlo?iXJXlXupa5in>J>+Hc{AqEL9Dy$)!QprEnPUXOsHqKt+1+sIOM#J|wq zfXa#nMHkxdpiohD(rrXNBB#zxXsSrgY!gZvrq0VIy=u~RN$7CEzr@~zixnMzF_zey zF__4Sxdp?CoS0kiycTnd9+Pw{8amxBx3^%eqUG`B_Ev08=38!W!wxOOyV#{=co)qY zr82y$XCPhMq%K0b9tpzJo>g`Q1}K{0TV-#@Fhxy_p5}WPrRXwimHj?$A#$>RfCq@2 z>>uEivr`#9Kpi3{`wpB%Kr15WOzc44lpm4qw-duPzn!>6^V^9BQhr3b--np5 z`F)6&HNOv0k@TxVr2Bo0Z#2J;VHBtQK1MMU=Ob#HAnPtqsrbb84fq5X6g%hoP5Tq{ zlf>t`%={Fkl6a@f%+GL*qENWZ+=bDKf<~G7IqpzYlu>4Wf$55l_{+?H-I$|jP_)ea z5>F_qPP(tKn8@j24^|U7d$b1|8>c$jgFQ^#5s}`**ErnRId$XBukjm^6LT-J&Pm1G zixxyq%)PjTiDMG!F~7mEbDZ8Mo8MrRqUG_)=04maiStc1zr`dXC*OX|)$;Af2`%4# zWH(9fCXt@+0BSdJPWfhk`v4j$n&I1Qe~)I0F0(e zR#DK{Z6C*-ii$FJ+b1wn(aoNH_DMXf=!k!}{RTZd(ZbX7`A#=cabkBWgEG-H{$qKS>cHy(6z^*(?>s`v=|NhPtk|7Sk&RYBAk@ zJ~2{@>HC9jV!{u9PkN5nK5>tt1O6knU+A~KA?7wqb!3QxT6RMmPf`^k{dTiNq+6>No2xr3`mJe+%QZh+j3jch+hP)tlik*%kZ!t)vcPlDw8cC{J+gnX z1L7GiW>75EVg|+gTFjsxlXRaZV;(bu;>To6SRq%;usETA#SDu|EmASVdQ8%t)~nNY`9Nsby5Q@?BBlqP-R+?uruEqmXWp zvW&#C194ZB0x?pHQXnR3Q3~`Zq??wkrM6Yzic(3;)}mB$)lx~1Lb~T#Ip?gNRY|PW zqEr@Zv?!Hbr?s*kg>)Y#qcpZEi|-`yX>D$u;)+>+Mf|MAtl~PYRa`NvXs5Mmpo)mK zR_82O7^o^vRTMG{1J%TtNh%7Qs-5e?Ky~e07X?leEtO>+#jGJZDryp{8mOtA`NBY< zcIFEMr)y`vI8aOUP=3RLRRguf07Y&6RRd>;VTxvkn+MJmw4;dLq_8aE{onXbMpi@u?#Cdj*<`y^4m1 zdIioE2NgXP8X7oHoKzIf8yaXPj1sjgMz27Ba}iOrCVpX{g~%sz`fDkw6FD8V)O#Qr z*e=yWOEFgx_b?*RQY@0hJ@mI)iDiJfqV;-sSXMt`e=tA~!lYM<(%quvA21sxo}p;kwiUnkLj zyF<#alen75>9&&|g>-Jen_Pa6{*B)PWf_T$54fXrcHL5)#WF2QXFUq(R&{W0hMTO; zVw<8K*>?vn5FZgaF}sK_w92};ZksN8Ow#!}Ix)vuT|}-Vjych~&=s?*sM;|Vv#aa2 z>FSEvRl99w1-fc?$TX{)c85F^xJa~rQu%iJ%LCm-Cq?gvr&&F;J7k*GQ@cZ^S-rG7 zWR}%iy9=gS7mJ=M$~R(G;F8q0pK9r&ecz{9eYNlVEUTXwsQj7~EDrP+S19^Av^X$8 zT&KwLOtS`xTNM>$PqPMzscJ6rUtBJA&FoUKzGLdvxKy<6l$zkB`k%L?TiRKF(hQs) zdNFXR(Esgeu-MPK+mMSDfx#}_P;o-(THy7-P+?sl>2onYE_FK;-EY(<+N5q8b##jE*HJJC3QrAzIOf<9sK=MP(&t6ht4Kenzkk3TLahoofq1J7w&vUsxi*pT^ZUn;-07M=L|kUTKS20L-Rk@k{4B!vxeeShtGVp4e2ya1Nfxy8N_EU zlJ}xoFi6d;7X{~krjC5@AQQl%dhbm76?}T0E)Od6j1z&_#=ac%R zhWC|A6dr5lEuj1cL4M!=CI5>3NB-sdN8GL-3BRO&fCazG0OfDlRlzd^+#nDVD_4#x zA+a>R(S1Sa6}^EM#M{-|2PTEnn1a4_j-fyZIW1_Tai2hlea@xaw7`LZ2G$EO8`$R( zte5xlY!(uMxs<1xP6#aErV38Qce|4E7uCxP`9`w5z<0RNcvk`Owg$@Ycvlm$&s&B3 z?PjZgz;8D}{F)PXISQ)@ISTkc=0er#XVgBb4}!%PeDQNp|)?~_tTTghn1V7)XT~uB)O$JmvR}}yS%{n z$*64xT#bFonVC}G=Na_^&&F1^w=p}Iab~lB@)+%{ex}G-x`Ug_J>S7SpJYp#=`i z`W}pP>NcFZ1E=nc)N0y~egO}lP{o{dAiV>92sJ_<$@wo}UIEt8Ev)Zg-p7`wn9p*l zmuZ=bI(mim>$Gx3HN8cx@bflX-lHggEFV!nEFW{J@0dR^g^)gj%qk%*&CCUvOEPCO zSLQscGuLBFl-bFaEt%W0MQ0k!T?N-1dzeD2t3wsI`7%eCr!voEUctPE`55ylW;7_d zD>$3Zqs=N?s1iNdLiMy5^!&6OxH#LFqZqg<^@Hm&BQywZ&h{AX4sOr(1apXgP62JY z8{CtgsEp7kJV$75Fv`zLuq6SDJWjoYUZQN{ zL*N161npBF7SbLSFVQ)Thk|!BJ|rgS#m4tRrD-l@f|hKW4R$m|L9@vKPii_8ys_zh z@X4w`K(>0Wz)N&;^<04oy1sgUHuP&vv!Q=(3WJY?H1LCv5s=2nNR zzG@uYvg)3|Bd||$sW({%RLRAe5vHcTM7b(WouH$t5^NcPzNTuF^_VJabsp<+=&!5p zVLb`mRQ)Dv5uBiPs{=u)7lq!TdU4ia=t6abwHA~u(t@%@3AT(tPgIY8vK~X~H`QaX zRMwowmT~CiYwlq^2_36>lXaki>(2~V@Hn#8Dqg}^YZVjZ)Fjw4${eeZeKiiAP%|=z ztlJoPW6e1DY|SKVG3Nw*S+gkEFe^N#%%g#Y>Jf15S!3Wfv&QEfl{I0Cxg-~5hUdb# z&(grLStHO}3x2corN9qsimcdhlK@wC)0a}DqS`=r zXmwhc)@yyElI7k6s<=~)B3awZ9ubsX+!LJVcbwQq7^7YE!0LU zQai0g8{;m%2|R8Jk5QaXo5Abm@Y(^do$$H^ymrBBH@t2MuQ7Oy!)q_RZUwJf!|OKi zx-GnJ2d~@1>kja`BfRbeuYK^kGrVf>O4M6-|J+1fb36jpS3e21);t6LJm0I}@cdG5 zTj}aIz_;gr_!zuh`4(IxAob0v)L$x6zgRClJXR+yy{u2Jm%0YJ=<{nPm-R|*HA|*G zz?_&*=FiOYqvwIk^3&(2l&k~aQ5XE%JXV1>*8dMGR6zk!XbzI|6So2AewqV3nC61z z5Ky5*sS-Sls$e-BROkq*0gs|uSdIo2I)>_@j|CNfI*uB_<7po71ZoCPr1`;0p8?_xpO%C^3si6>FAaS@sLI(R!CPrfSZ)Cox}DaBz71690a_RO zK~SN8hiN_NM?l;#NObkVqfqqF#?`{Cq}`G#ev|J;$ZM0aVYqlI2?Ri90`6P zj+Si{$AVvo!ObwwJWb)W~R6*@)hL#Jp%=t0^DdXU{9zwK z%WVUJ8S>2|!!$kt&-P64nOWue)@>@cy*q;~QD%E3xYK;)`Cgsj8QB?Zt5%i!yKjM_ z7Wh1imL_OEO5&sAGk{MDpFvuk^R&``g4}%@df_f!_@oz}C+1a7r?156REcmNWkK;v zV76FFT~4fukEYtuWRYTv{tc(wc3ryi(sv z)EcpL&Cz@GUGuu_tl!@U+e|rEF3%}#>*r;#aXy>ad1cxnpH6H2X&rJS&6YubT(gG| zgcFWoW?i$9h?wcLUbKYmLN+0@b?VNbncOIEq?5Yk6%FsM84kxf4BL^pElVrNL^GOo zR$YZ!E#1zUSzC`es9a|K)%*HZaci>*ZLSx#($aaoTQe*~+YElBW)%?WK?`Donw4t_ z=bb@4>lg{mF)h2LOUB_hkv3p|mHt-6L%7KtTa8-VhxJ6>(YfO5C#9*gZS`{Vnv~L= zzTWu8Yn7+XU|O46JI!Q1t*=k5-IlQ%dODiPrS%M|p~;H3>5gWk?e(cM5~0p5A{1?- z_P)(xU0d|EwMV+z+NrI*qdneEG2Mv`8M#ejofIqBj-F|Wc2T!w4i`3mjmNuXay%ZR zP1@ts-4%;d9AR%daqKl~Q$Gc4n!AyM< z%jpS2OB;J2*+`P>cVpQ%)TX1br(1vPkM)Q8`Zm%MLq;~`C6%;e=0rH1IdLPyat4!H zL1rpXjhjPyb_S2Sov@4?sy{u^uO^zF&pKtv?McINRcB{R4id$Gyl^WHi(?4MUy!KI)H-?xa zhg3@p8d>%|C2so>_RF0@ypgkN&tMm16~k6z8BPIPn`0(_OxM^wXlC^-@|k|!@-jIb z#`R%WIG$CyZXeDWmOFNleA>xF+a=o4-C0nK^ODc*rdfuTb&5vWSzZ0RV6ppaULJlF z;S+=w1qOII`5(+z0Vlz6`%;T|-S z5Z;vMg=$)V8(HS=JSTY!aGbB)*JrcD^5xwLZaoDbMddAGH{$KZzeSv_EdyeAW;;eA znbebE$FYq5JS=j{#7wpL$k3e9q)qZhX{?w*t~=k{ruXMlDc#z_%*u&4HSssqi$zyf z2o3dZd|N58l=sP$I&WpzMv2W|EpfvsHJ8nBKdGyK-!{=lGx@Nzq@K~NAwMauSt%@2 z3)2fb)lhl+H#N|&*^<04W#>~eCM;Zs5Cx(+9qk_4}r@VJWSQ$5B zOKhChQZxV*H^lg$yxU+Omzmw3;aJj_?b!s2X?tjkH;^(VZp!Utjn#1Zb)%l(4P(o^ zZWTNOAGDg47$lp6(!&r<9OS`67nEwZC@h?R8!dnskmN>p=-HGr=xuU*X)f92O5Mw7 zu0-1zTSLJ2{9enTJU-FnaAZ(V3{irK(!7oLo8}PZii#gAUkXTGIP$qz#)iM{G#U2B zMpjFs`3@*Ie5(+}%&;(K{(UTiofTEZO+x2Pe2$PV$=#DdXfwEiEy;9xde6ta5$2hH z-Lg$4&0FyFV~F}OCcRdgPf!F?-%tq4#Y;G+f4@*YXD+r#OU3CDw(DGf$T zyt^ju2JC^u0RU4bpDCVN*nYAk&)`@NLi*>+9!2CuC+)6N*WxfYGYvPJH^01df-mmf zx|K0(w(>4tW<^t{o3NLb*-GBEWK^4f8ufa6leF3YTQC3a5R{&)?tw&Rt}mAF=RKyh zv_9aS%-ll%peB1tln--W@4ijGM%pFO#MHvwrfqP9FTGtk*Ny4K^0^$3Qu}a1cdb#J zlEYnjr)!``%cgWcA;vS#kB6;PUcUCpea^Q|X}WKA8(x~t@gwf?EcfhNHZ^U3KjywA z`cc_gCHp_w)8cqmX*B8U-(NbL*~sBe=cvgm)+D*lBXI9n118x;;a#+#IV*>Tgk$=z z@x|wDp*t;`I!>;1_Lk0B>dp4!#ln4u;g#c>H}Z{flTC6?dzNC{6ERQtQ=C%8gp%tg zN-ZessVoP7@^Mp_%ceLmT)R7};S}H*qZ`Zf#=-FIX2`g^cYA+J z!L82e>+AO-y_kgqxRxYwy^`@xEvV?%}D6o z*i0PH=5N7Cz0E}E-TyF%Sxm{`>399)35u?8ZN{i$BiOYXj&lK5BHwokaX+4bMUGy@N0A)|8u?T&hK%NW!7# zzU-9P-1k#{=_SKH{}(qatTOi@qygBw47szoke{xjiJv-^iR3DfeL=f3iLYoIhY zH*l&UD$hpUDkhf1_(I2jswLr)1NYBl9XdzS9294Ao1vw$rVZCNt}Zqi_;eUH|J?(U z=VijoLdp^3Yl&x=zAf@K#msrDrYyO*RLau5Rc9A3D_Hm#XvffPKdr?oD({s6I|3%! zOoa$92;cw{y@QLeEBGw5e|Iy78zW<&3;le>8&ONdD&!n9Wofy8!9r=i;sst_i*0OA ztM&CcgN99=M#3^}bHL%vB8*F2!G?MIow-Hc0&QyFHLs;@^8PMLJiGs(4!>Qg?5Te* z`t9Axc8@>|A$rgD&3w{$MSLrduYbScSupL=1LLplTWO3uLll4Ab9B$FY5y74y|nw> zHLPRZ_pxDJyKc#Un4Rgh!(66k)~<6lh$AEj2|^-5LP8uNAwdul1R)`jAV?%g2ofJi zT)%o%HQl|t+VMpkz1#I(z4z)>)qAh1dS+g?1AOJzgSw4=c+g#`Eglpt5;=>QqEUXL z!5QeUJOjsgVSp|wk+tFndpe>)!r%HzJZcdtGmH$$4?cB&%MY!-I^PgL*c)+3`n&~& zs(e1c-{nPk4M-Qa{KAaCi0Jtw4@0iVDT>E1LXQ{}$bC_OSJ6v1CX2>+y@MOINNTq3GEe_aA+!2=YZpvr!i=1}mi z?*Vp25&69J5dL)|4x>`#)S`_6oI7 zhx{Hf`qyr8fb_v4Es+au6@MMJxsQ4k9FMUkur8nn$r>nK=%CCT@H%<$!_ib$cokBx zEz0vye?uFkuMJug&;w`UW$dnj%g@=ZhNdAq|6#hop)5fN4$U+MwN+^5KJ}W&jgr1~N(RPmY z!s{$m2FHUX>cCdea_~87RjFfRKuA=8*Lc)5>6=Ui7|$UWUgxycYTKe`aO%+Lqn+vp zf0$_9Ub9Wq7c{KK5FLS4gT_Uot>at6lbi0Y_NNBNy)QNJXgVCZRoLnxo?(|q<|_+O zzDEM@1lHL)c7D9xkJj}+76Y6A#^`u2I5pb;?`vCsh3yg-!b2^LagH^0F;ncQ+!yeC zAX@^Z%Il!Tx&j+r#Io~5BP-`#0z_-3e^H9t56@Gb<7|nV;EwVBL%B#?<{H3#&0Al1 zc3#9eTa6Nza!hqO>V^Gj=e6Q~hK|MG{sdhph24%LN{Mk$VmEjp=pPmUf1IWB z$z!`xMzsJIto=5y4)7-1P?18zR&uNZ?Hiyh!W!Coe?E2_F^V?thGiY+;axV5`K-{=9Gp+WMi-N(Y}8e| ztB+C19uPOcPepVdjX0ekV|~P6*!Fp8`x0q7WzZ7151z(K>Wrt28*;_*`UtJt^}}BE zF~Z;sm<1G1MU>-J3i$>0u9(XlI5ZOR3)`l{{;r95$@4A|8XxwEm6Y`>f7}B0krvG@ zgyUoKuf~VoT_7)`Wcs%>&ERi3w3_uZ%fQC=30&C3wLeF7*3Af3DTYT^hMvBM)ih0Sm}GM&VMMAsT7qc8xrsk%u($ghp=A z$UPdlPa}_Nmo{_YS z5hq1pWYUyyaDhIO0?BYjQYkV)v8+Vl!jY8CV)?Y-kECEnmMvW9f56OAg~2^+%H;?s zC|T(iTO`Raoiz8{6Qf)6@G~xgbsao48kU~(_&4HIN7YBtzfBjoP~PjlQcJi5-NC@I@ase zL4&ur0btfL21c^XjE(6fP{<`^7v>8~=<;O|OFc_0e+OW2JJVn|#mg2=Q!JcyTN>+S zO+~~K;>q^Hq}w;LtUxQ4CNI`PZ=Gwh_F%E27|QI3SBqo zReSf*LrPcV-_7oCpV^=N?24O9J^S@bHu&X@(GO2f60W2n3R4sbQ3&FCbL7dV1VCFO zg&v<$e|*9M^MKn&(qS}1M^W}DngTjW$J2Tz(5a{#4(chi$w_o9ok%C3Qlc=!7Ol=e zTf<1CM^a`wg#a$&_HfT6()n|6*E4Coynv}?G@w0XrcE=QLtRIMijx85DKnjcb_Xh# zKva8$jCWWFKr>Yyu z>L#kX1^2t`a%DSN*@-K=$x4yM_u?Z6<7L)_YcnMCD+GP7P zei-GF*DpUo4JBf^po4~$~ zU86qaCK5J!xb33+Kpqu990ngt@Tml! zn>I(15?Z#+oB%ElLK9tQC?MKQDoQgSsGV=x4CEBlc3W6tUe%Pqu^B+bVq`@5+tvYK zOI`D(1ge&kKz3Uqto%F`3a$fo0)l$ zE^0u|WI4y6OuaU%(%dLzXkw++Sg3It6uAa%KFDiyUwqIV@Z3F%dyEt9Y|wVqiSl@5 zpGt9beDC7K=w9Rd%#Kc!QLXIbf9qH^|y^Y|pXcSdr);gEkpE;i#D- zS{)BL^}DH5u7ei#9xGz-&W3|@Qu%TZXL{SBg$s$@4B9c2Q8jpDWY;xbZJ|FdJn?6Q z_ankccU_g(H74IDTHRnTHnG9}F)_uYm{L;w+%jWkCw=jQ4N|jT}UDuWPwG5qN5P0pHcP*9E7BKH=MEI)|!4-yy!yPgc{pAc{@gbrPf`+ z-af=03Z-L3r6RWA49J+7^6LSmCeWym8xl&(#Gt6a79jz%R$Xa`fSJH=TdSIGEX)*2 zE(@#_F@Z<~i?-c1#Lm>qe`}6?1A`o)f3g~=jm$^pU_~445E59AbGu4XEXFP}0VBrx zU6CB}CnM2_SYY++B5b_w5Z6DaHOIxd{7tbmyCTryhhRkFFqHogk&4DUr_hyZ)tG)T zmN>RZWQgfNy{r;v4Sr?ek4Lc)7c;8`+MM(dBj9tkLyWIQwpz?Oe`-`JaolDlX6kLc zy%)E_Wio5bZX*RsA`dx64NoyH3_O(r5F^rP_`fI8R`~-l<6Q{y4r12%LMT-sW|>xH z{zaT`SMQKU{E-zkT%Ggn;~XdwX<`(}7Zzd$Ahyz&Gm|q?Vpch4v6R-3ifqV(Z2qWB z#F#1}DJt>%OWDY(e@8Hbgb%N}fJ6&3cUZmNx@ZdCskQ4K2${*|yoZG@U48t9zb|%} zLE|ek@5W|Yt-3#kMB5f###<7vmQ^)V<=xtQ>^oMJ4`wMI+OR?E#Ib`HMnb3l<_2vf zs6kFxz|#j|D9vFpHaI~A2qQd&b0@x3XVHk<_X8#a>L_nK;mp1}R)YhOQS0N#wdzA79vb_yrh z?dCT8N~?p<0lT^SA$%_x47<51q5Yty*F%bJeK+?cyaQURAWw(i$2e$q-+jw_SN7g# zkNw8?@`@Ate{H+6Go6U33CNu>DY#BL>`3wdgsNV5)SxRoGayKVlf8=WG!=TC50(aL|w*h#;g?zQnk@fmixz;2O zAZ9mzeP#=o2%t$xFs)W1{W+KyYzfLjLD z2S515R$h-LZ#RXGY0x|B_uAE(x-3&1{Ov`vD2X;>dmO>PL^ss$j=oe3ne2eq=Kh!H z1VG3!zrvga^yLpmbRf6U{U5n@<_xYn@Y!%Se;5124z)cEcPFHoME)1wMZSslp&>GO zj@?0qNIf*dXs%clJQ?<9(dLA68Zzf`3(OEQOJbCu%tITkL38Or+^gmcn#{2pXWhGy z5!S6dS4F+SKE43$^mQw>+0FBZDVd@uWA#u^lCd# zHgKE6AmQ^oW~t73cJb~0hU+b&^~4+xqW`b|;Pop|O9KQH0{{RB0MUjsR;STgZ5u!U z0N8|+paK+=PgwLO4)l2$v;WBrQqGcDAQ!mTlX6 z+O%Okl?^i6Pt*3KY)9GF_8_y}_kr7e-rm1D&-3YbzxSMT58QUJw=L+1Bf=4jIgP>G zCFP|%$jIT5WBKD!6wKLc4@QRZ@FaSL$X%r(Yw3dCBM)DHeDJ?5nhQ9vwXJkUi*zUzeUfeD`qO*;kzT?9{&6lh0_XyF@s48h3q+FJ8pq z_3qdYsYJdjvY3sc-$X5*KqjW49gE;a863og)`LjUBZoWsHph1mjt$Z;qtDpNnG#-i zBLa!&;_{t;x$A6p75fgmnaywUE`?-IYC! zy_9{5-N^pRdVQ`;@HsMrUBK?gp37d%KFz+tZe=5*U6~T?NRZu=J)FIay@`E>eUtr# z^~AU`Gscl-_HcFudpr98yO|wki(?&`7VFA=EoW>{|9s_EUCjydy>NuI$1tW-n&1XE(ARvq=e#c|u!peA*<0Cr+0WS@*}Q-wlLD^n%Ou#)UZT(T>TY!ADCoL$M@$3DUS%u0$Yr74b7vInqB*jw54 z?ATOCCZxJzkNL7k<$PI&^Kn_FBR5o*$(Nd`|$smTXm_8nt;HK(!&b7-Rh7d_-q8tz7+3F6?cgP@y@CiMP=$a16MR`pp z=R0K(Lx`;IluVSP1-;c>60GTxl{g0%<4W9&cWS!jvl`*(mcrUOe78L^v9?EA&{aEE z=3)2RUO5QMYUO_%JIe{R3%G9q_w~tt4Olj-Pfo?zxM-HXwojhmy_mW_nOL`rG}kSZ z18{8J6ge3W)=ibC@p0WW*#f72ngo!JToj|UzCvc99SiHH%bwUDhhZho!78lA0Pe?g zcolEq1AK?A_^Vz*N2Pdzm6C>>;7ln*RZv1ljRb?W(iNN~eb@&F;YcjUNjL+4=i@S5 zgEd%-b$Adj;5EF1O+n$PmoI`rKC?l7LUu!g%xGwo{)Q&GvOzdniW zYw; z$8ER|PvRB4hcECG{zgo5grp&Vr&%~6<&@?~xfrXl7VAdd_sHwb9(fm^<4633$QI#< zlCqX4sXz;Qu^SG+(OA*qm5Z?kYq74yCmXN^Z{YowXgZpXrlaW?`37TV$4E31XUED! z)SwaV*a>^$5G==OxCqzcHr$6tuw84MRN!c=z?rxJH@EubemsX)@jfTSBtDDnhEm}ve$&kez8GOeX{Ja_byqR)*N2aVqVQr>d zIC4!E?`6pNRB++kt46+1AK|Ca65Cvj|>!HGHTI= z`RK>eP6-{ke15KM?97!-82wrDcrTCl@?;Z6-^=H{eA(KWFMlF`qDwdmc&~u#3S<*T zuiK9Iwv(8y?IaDO?-lZ1q2zQG%JvxG_2}+v{V!bS|k=`IpKGBF<05JWe2!V##MQ!K4G0+-`P+=YknEH+{jzQ#60^b|`1(t5^o z-*{QdUX2@heHR{o#Xj!RYs}z091uz0_m&TvAH7 zrbN2umdJdJey0<8Z=$Ti8Vq3cyPCxNlVlavU;v}+J{)vajKKyR~*e>s*?~9-7uYOI>kIc z)tpZ=J=S!(xj)04&ot+=%=v6{KF6FNXMW#Yb3V_U&o}1_%=zui^9t3UKR=38$D>$v z3dXBW#{|`XY1m$M043(Hhl#3vm}I(Cbq31J{X3ZJ%S}%<_fIiB)$}yg>8PMxb$+^P zFJ`Frq0;nBbAOfTYSjVMnDe#fd9%#t*O{(2_XkZkm~J%PM2`t|KAKf~(W2Ui*``}n z2hgTE1MQ|e%=Mk7yUg>u&GY7%?lGS~*L1Jx9aX1)V;&u$&d-;aaQm^7>K(AN>L@HQ z-KW}%T~v36+CyjYx(EyDD0O|m_`_X--Bd?mkwk{uhutMH+ia!L z_0Cv-Zu(f&pM*M&4hqi;wVz(e>mZJ!<3rb1VFjHS>Sop1BJ5}f=u%z>aJ-~RQt0|3 zoFI|mj>n0rqi~XBhC3N2tM=j)85iz!oT@q+E2Tj6^{1)M!0DY1UdDynj~i4+;YQV7tWlkfn^foG7IXit zrf-u1(Y+SBZ-;)~9p?O<=KNje{D3)sw>iJgoWIBXJnL0^aj!XlpE-ZO>I^)fI)Dd% zReSJ|IsdRZ|A_g%9yR@#>Lxs{x&Tk8o{A?`_hWUS5!~OtE#;iR6Pr?(PP#3^}1>=-caq}O>_NQs%!B!ogV5Lc!$mi z^>cVv^$fhHdWmYDEsHQDWs<4>e*Zv!wTll`XJM1-a(pCHL|^~0YCk?v?Zc<0KQsNg z=`T!gHoe94m!`i`?ZMZoh51&dOP2cizfAh* z)gJt+x);Cm^XI6~|3kGOf2#K3FVlaU7DqR!Iu)+!@P+g8Bz7PHUWJkgsg%ow(MXI?z zO|=hWO{bgAFr8^S%XGHs9Mj`eCn8t1FnM&Y`o8j=s&M;JpxVWDs(mO_orogUc_^my z)aQ?Pri9y%394OeuiA$a(-Td9Pg0$TQq{dEqx04CcTk;za@8&-tM*}v>8Yltsm?-$ z>P48Yx*Ri{vT*xRsoKR%)rqK5osMeNDX1~`*Q(CKEY;Nomrxv->TY0o9a}wn?FAt=KJq7-DSGl^c>SYrstaOHNB&M>3OE-tM*_g z)!obje!l|s`}e7Kv5V?dEHvl)ReP|T`MgE{&}k;{P;CJiABJJ<>sSg`*(*zniWWPC zk}W0G7=y8mW+_Y7Y*|8Oc`t=*5uQ+a3Z*O+EtDm#q&+>^vei2c&$|x!{l0VVf6n>7 zbI-ZQoqPR2{fSVXGu!%qdF><=Rpu9jRFNn=> zUS2R@v_AymP!x*+g+cA%C>8-a2DL{(90_q0#L*DPK>5d^_E;2u9mS$RH7H&MR15X5gZKu-HzBTv_!e}& zx1sh16ytyzQLF*fgyKEyGpqzy0vzjs&zb=%qrQLdu$j*>JJ4Me>j2$DF&?M|;#P?7 zL;L{ZhY&x4xDDcVh#y1z1jRU@4isyFsuQpZYJOcP)&c5&MzJ8!QxxNYdLVuV@pFh@ zK>QNoR}jC3xEJC+6yt#2pja1F{owae6*a%NEJnTmq8JDC9>o$sA0huIsQ+gaD*+9# zna=C~6~+8O{{Tk&2T@D_8iK|fMzILc2z36V(D{s^SRQB`%A0`lCZW73C~q3d`^mNw zod*iQC_fv2#Ox>*1HwY>91wFtj6<;q5Esz*<1^>?<%U zXWN@GGe2Qa$vSh;$AWc@b?2Tn*f43VPtJjo1EW5F`$`MM`UH!~XU$QV^|}9CfAG%6 zI+kZ0+y16ZVwK9QlEx}sQOCb4BY#sm&XsJl=kJIrz2=TNQL|uY&4IZQ%i`9JI8bx3 zj*o6;?IhOmk}Z7y{Wme_D+p>K*0Ix85m1Y=j$QP`K}}#CU(%DD{U(uS@iV=pvwta< zW$}oA9y0rzwT#6<`U;>{1X5zLzL5&3Re{u4>}tGn_M26m#hJ#MvsZRCi{nhz&aSxj zO#f{gK)n%2hs8MaO|w^X3ybS4^gyi-WWeHgmPVj91~OqW*~$#m+km#u%+1;Y)RsUy zSi8|5?7#r9%L2j9dVo;|`(i&q8LaC8$sBfnEXIm(3zRzueW0`;kg!BYd1yeMQJ2B1TrF9YLA_Q%Zp2tHJesS*}7h>klV5Sdm?`0l)GYa>^?aFPw? z#?Bn}?CT8mQ-wW#MhPZ@s|%_t+BrXe|G4}x{@C`^rzXx3*UY=PO)Z0c@cS%EpWYLy z_F(Wgs7>1{evsD7P#fPVAw>Hwn_uYN^qpZ=>+F8rUi0N442L__n~d}DB0Bp}`K>7~ zWSSL?>H+3O$I-p%L|=;JOtp$ccPG+(SIwOHDj)I@5q;L=jr~Yu)?C#|bi4+Ch7HHR zWZ4p3q~=j$s#B&yZj6SbWB8}XEzH!ooKv=@MSIqb^SPu|)ME90DY%&gE(0Q+4BUMG zx&4DeBM?)i08C4`D1lhzm-V%dyZUgL#hvh2+mX7fa2pa z3$|2K8kOk_!URxZ)uFeLk2yw+{idu!rv1o}>fyBccUKjYl9J26{B?X{M~Pg@~F zaE%${*&H|^438{dyM-D@lY5(*W2YGWy>ptqzs1^*52H#&xdbo5i%lsk$<}m;ljxK3qhmSYHOR-UCq<~xWXMTQ{TrE zX6uB(M&*rP4Z0pEzzSG@d>z8Ak*NFm8wmSFU9Y_m=49u)Zxz|@eA~{Ie(Vd~U15o9 z++~&>y$)!5GSX?>MR)hlOfT0w6RUJUfroO*po#D|B3pIi^gzw?4a1Ts`|sBw{2`Ln zD6!pKy}#gn=ekYll22ZKif-hnu>H_K){Rts3GccsVC+I+{ALw@j!7X0cVjr~4rzyQ z<*X<=qGL5OUesqnA$`^#_!e(!P|=sc_sfo21C-eT`IF~FsD-iM(XI}zR3c5K_-%f5 zh@kJ7AG2($<7#S~JIjn(0hBof8M@2m6?D07;K}^}F<1Mzk*i0q^ZMtgO+88BavMD0 zx{1ItL-U7Y+K>}}4w-NL{WCR%0u(AfrId+Yx6T#-5V;`4~ujYux7eq14MyR0Vi zYTh+cT>C4orw{C#4;wa`H)?+2theF?5sQ2OME*7;*EY9*Tj;NiV`^wG6MH}PE$`K7 zHP_8&0*B(?PRWjn124P;a7qWVo0eLX+te*1v31DzYa58${Y&@Q62KVXe}jg^$0kMsZc zc@rAdd(q7iRfxQ4Il_NqukO`DLXv@FU#u#x>UMpKmc*0KpC$AjkE9z?%^tRmf@)fbtqV>e>>~F3bosN{X*(Wv)iBq=9 zx+#q;716={8ih>5>AOH<#R$hpB439OmE;HQ^)*{VpSF1{TdAV6?Y`MSNm$`lK7WaS z)0cwg^#@B4GR&#|r7!l~@^@?%FQ=I1J^udEU6rBht5iFlTl?smaQ)g73&sgSJY3=( zINkYDLO<^kNC;>zmAutnveluFgCUok88BhGncs%YFe1AWnO+OsR}tTY=75QG4nLoB zd+fwlnY5izmJ0K;lKvi*8Q$Bk`*bsZ*2dBX?HK`Qie$QR=ChGbHpXg;J3Ok?eq*v{ z{k|UWRf*kx_UqFhOV97mK&+f6#N5u`%xrZVvuqahDmp8dWBQXal(FA{88;?#%X5DJ zi%5CT#f>o`2^~kZ4Wu0O4blmwPb)(%zrsK!Ka-U3p##EQM zGd8E)Y0Z+rizr^|D6XX(*PCv*PH+CO)k>5L-0N8jfc71)Me-v4a0==)Rc{Xu)Sjp~ z#8>>TF*?Jc{jT(rjg}c7qI>4`2a_3(Tko(fV4~t55%=f*of6qO2_Cuv(Rv4V_2V{} z7B+0<13T7=O7UUP;lW~+kZMAIb}^}AuYkkhlmdLOWp?1$P}otA*MrJC`J}GBJ76(? zQXvRQC`374)B-sZB8eHB;IpVdY*9qpWG7gJ!z+RwW>v8TY*Ij_D#=@EaO zZs0YZw+5yer6#Vj*hmvI_ zFB(T(lqnd`w}_tK|043$V(3HG^2j4>`RiA^iwt6AD<{i5f4UBH_Y5Ct_A5&e`R@*H z0tzb4A1nj!Ttu8QVk||Rx>?1;mr$m#@B72%k=2FVrXM<%`G~cg4!l&~Xv?#x&kd<8 zEA?h4?ojAx_`h_+s z>2cEKw*SyTjm7AmfsVb!!&?d4`N2JEQR`D=AE|vW8|@!I1Kn$mRE15(W3O_gI*;0w zbgz7+p%}*8&22sV;=`>^qY;1E`RDBM;_MfS$~>6PIi0wkUDAo7b&3p$JBo9wRfHCMGStu zgc;7gPr(C5A}1Kkx&Wo=!qrCSZ5;SwTC|&PP^%tjyMAg*s9NQB@Hx6WxPSZZUYXlu zCM;QUSVBJJXhlkYdO&R6ZHuWs%$v$WF%`LFp4rO@4>XDt#ihN8Pbx5K-hI*m^>Ip%H7@kl(CTrEfJL{xF)&x!Dp>)fQ!CgBBGv$UT=59{sCzYi17WKq#pO8TAd@OElxb%663j4;ss=i*Y zt~KEVM@7$nh;#S<_$oW>6f1~w(_y`j{{lbCN} z|0aG;TExa@1lkE9c=u@Uk5%8?1T5hEF$&h-rpR|!>(qu(_cJWOR?+Oq$BHhybzH15PUU1_9cgq zC7DitC%Tbs7(@nhf&UhgJt-l#!&QaHGoZ9+om}IV+RsKGmCep8e2RDa&D_L|OD@S_7i^Thxg4UqPHel8=j zCS{MM=bE70REO`+r9YpWPL;h@RCIgI%6-Fs_?agS*cgc9;ktU{U)=mqW}K`3g`mec zm|=HAZTQx%LmU))?&)>AcxH?XhO9)6IR#2fG{2pG3@-O7DoWQ>%>6 zq};M5{Nj@wKn5>IN{w_qD`Z|#*XmwtJ*}`!>(8gLql|-^u3090Zh2gG^aW>{tc-Af zpMT~%;Zo4ap?YDJ-{$)BFXav>=}WFG@Nro!$}Fbw3C*18Vz=Ss{m7jaF`}gX8Sf{; z?M2AFQp*c3^b~T9zvfae@pB%zwsHkOcuZN;nt^a1o^)4d?;r3N@f%Im4!%QDSJ^Ky zvN7YEa+s-MWW#v@JNj>i?L_c5i^a2lT!Y@-IUxSyq9f_>)V85JGD(6mD`jkTa2M4= z`Rx}U_M|9sy|zd~W%p3YNSZ**jt3KE&o15THDac8-U>E3^iyTkal9exuS3Ab^PlbH z4#cF~J9V7;=t{TAnuDaKiHX=9~59@ZM-ED4BPB6ZlBrKYG zW)}6QxI>iYHj}gd)YT4|ct`)Ag5se>~uKmQdQS z##*nbjJy=Rsa@5imALdtl>Q_qE^RvbsiK9wyvLb23NdE0zw8WR1laEuUp=D?Zhfi>R0?q%-5uU` zy51e0zsIkut>kp{jJdtzB@j}R2oPU4giXVSho2oK*EQ?C`zAD4gQ&&I}1CEZNncr62*j*h+&9;dgIVMsO5*3rgOjf`meMtXEA-blw#-$);(8^A_} z+H?b&HeH{8s;vjHsa!8H67V46Jm|-9)B>${Ejq}rAY)yKCl>L=A}w#EUjSM7bEzB_ z((7mY+p)ObFvE^T6Ho>Ik_J786+o3V@C85C3gWY=A|_A3fe2iGB3}#%#9TxQ9Fs%>FF|!42&7bOz?((`Z_c`lTOptm0CK;8{_a017@&K!Bxjk2+CP7wt@we? z&j_8L6FQ0?=>ANV?hsW_GKRvU3wS~vQ-mYBfDaIG3^p5rFp(!-r9y!aWHoE~gW%~q z$f2))ELzJ-GDZxFyRn2~DqB(+;J~>>K~k{y6$p!gyo(o^1=3l6 zRj8?d0KzjrRo>9U^w}4hkoaoEd5=-y!8%Ncyynuy0s+jG4zzjv!d~b&1UZk%32kW@ zV;d_f9dU4l?J0Q{1+EJ(Rzpn?)VG%-D63PlNcCJ}nyi<#OaVaVaKw`O2t`}y`(8n2 z80g?U)xOGXb#nGAB|%2%sS*XKJ&$XD1tZaDV9T36;co#u+p~;<-nmUNPwQDcPFs(; zL;>ry588uj9jdh?;Rr?fH_EYjI0TT$AH;50+-7Z zQDx_>mJ=Hal|j%K@51kO9`_wGHGMnQn;dzin75#csPa1Un>wSwCf(ju6t}Q{;s7aT z$CtBw*O5CF>Oh$j8(zNzOq5|GLLgG|Ri9#LnH|Ano>k+VY8G-o5lJ*=zk!|r#;;L01ig8zeKKP^w z@s1)`fNH?h`CWyMV<3M|qsGX8X$hpHwmUxO58wQKKm(V_@)8RqizPi{=K>ml%?sJj zrbRLnDW~3iv>Nk-zHtx{@&-;-{n#asfQ5UGGJU=;Grv zVoui?J<9{xAElBksuvf@FC7w*mfV6=*0?9 z3z#PMLb1P_j|BqkIj$;yWY&R3%lKfEmbmag1`412k^2zkxFgE-#rFQ6HxtRG$u~C4(1W8?K->kbRDU*k@Rp!t&0<)466p*t?+qwOxyC zgRN6A1)o`lO z?qCzNxH|YKbL-UsIeD|_{kCmj%MbU@W+fXN5@T2AJyKoPuwEfzAwbTgj4%54kZ~ax z&wV@o{r=wdW_$FiyXWhfDl3BJ5B1p>f$4zG8%4yKU8%AQnLxNdZN>GM3Tbz$h`w>a zjkt+_uXO@+gShZw-^{}n;hsC!ExQ-#K8TW$Kt~n93>Tz(gVY@;SEB#849qr}EH=D< zWCbNDe#FiNlO``3V$Q0MZ-z^M+Xx4)xryh&1W5|T&2eLYV^IS(q+~{pCSDD-FG^@(NOZpGv>6evkv-emsFUxTL^;y$`ZS z7nFYnV@|QH49AwM+n&%;v!iO-U}adx!9W%DZCeu<>BH&(-s(!WZIMRE*NKevnS;{u z_xW}jy$_7ws?)r+H+iIOetiE4Q3TFStNFoyx1(U^VY?8*u622zBcq290$&y#mNes0DpCExBQTqD z{M^J(7PHKv-qAW&KT#VkOY!L5@PJ`oi~mdq$8pR2xg9AZDfUIRQ>_;*F>;at++iBp zf<&|Rv_tp62_WxkRn{^Nw#xVJJGf=`zJj5MHB4o|g2AE-h0U*PMgjwW&y2X#IxW78 zaH)Q;wr%ue!=bRG0VmBPpHJQmh|fhnOye2K4*Q>^lV+_=^Bzh_XEnr9_llN2fCf=g zY#r=x*vr&QY9nsgY9 z5W{wfVvI_%O#GI)KYt>BclmH>HyAY6rPP7lR};W#IH_*FVX}UfU5-*wWoXZFW0Z2B zZG!1TsyvH3lp_F0)ll|u>tb2$Q;TQoo@D%i0?sf~y2=(TAs++~*%h4M+apOI%x#02 z9ur%Lr+GIWX=_tQ%F}2LRvvyE$g@PNJpWmcX;ajAujyIdhr9BB@+9P5pit87#C~v) zv{Ubq?3BAHd6t_rpU1z^`w2w01I7E0l5XFpk&=eS>|+&o_gss#DcrYBUDLqn@1JO} zV|i^9`N7~Ps-Tt}^aLmfn3s%mf7@gcIO$yJ#Ms;nIR)|=R^J$L3_vyOD+TMfez7ZA zv2e$Q)3lY=8wO?W5|K>UPL_Rbvig{ z#*^&|4Zfy3l+K+YoHq9kO&$d`vz*D<9SLuM$@veQ63XhYlJ{g#j(p;TbfNfQ+um7n z6H#i1MtnA)sC^yVncJf5<6bZpA9lQ7D^H=XC?I$b;3?IA4&Nj(!>#}L;%}bh-Bxk& zE&ET{$l;(c8lbiw^f&-0->Y@s-tuNX+5_QKpkJl^kQ?|$k9R7#=P0fdBY$w7g<*xADx~Qt}ghrA0#>t zM6u&d86h@ND`)mpnW|j-H7tE!K8E)1)4BkRncDb&d%0V0g5~+Z-0O+yj}OS}6R^0# zL4U}5Y5f2yQ-a72H32v0=h^P;T9cb`Wa-jjoE=Z*NNT<-lEiw$d7Asb#|X`{0-O%C zhdsg%Wrlm+?wX2VaC;W}D5>p#?qijBO3i(2SHM5RC>MkoUW{$(uTKL5mVcg|j^9*e zm!8Xi3ff$3dhk~$T11KlTdKr|&ntid8p=9Pf?l6D3≯ik9q)vvV3reEXo=SZr^ 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

ch<}LBZi0UpVo{(EfMNd##4 zhWNiDegbi#pARtXCjo~2{1AWBfdl}<`N&8M5G;rgVIerbed5SE2l5=ahWZ6F3RULIiugr^~_h_DiJz0;9?3}P~n zGQ_$-Gaz0?9OGGlWx=s2I5!jUZ0P-7g}7{-i9o6lF9K47m;$7Zum*p^nh0wlJPYC3 z2x}v(gRm~bdJvO=^dZ&)ybTZ!cJK=Q37I#0;w2^jXTLD&mo zDWJ7T|2l-%Bg}-D4&;sW`ylL#FbiQnB;N+4-ydN%!T|^eA{+#<9#Ak~U1&W+APxrN zK+FVzN0cS#LGL%=5L1CRL3{=%0^(YrD2RRe{^M4_`asb{9T0!V`Wpyie{o2QUpW}# zfZt;y{LEtf%mMt&VbJn}Dhc>GAp8u8a15_e0zV%)J{~+X@MC5C*!36fZoE~;TQ1)E zLC3#pcl@ID{GTl!s17|JG=3}q)kwrEq#BcO_BF=8>+xf%2?a!9{8-$K3Zf`}Ty7=? zqWIVtV>*bE`0;-yb7>G|#>QL9fyls**I6onI1NY<=QPXdAYwquI2T#Y1W^S@6=z*5 zbr3axG;toZnFZo(AZ?tnrMf@wq(088md*un-uV5nu`>j50nkF6RUC~#G#_8>X{IpREX)pCCjoq$&0`!*5m)g-VVlffQ* zNKgkmXc|Kutg)EFbs~vCWAuWS${>+Q1YyQ@&nFh~LPX$w^axGCYK}R-;02JO%|r%RGm-HVipQ`!LGk*CU$#c~V;B`a|UpqV!N86g|CNoO~-cpviyqEpKD{hsmQK*<-L2EZ!6)|mlS`{jx>n_sg!6H zwFVv*y=vy^sQgJ~on7*H##!6xOtRRt|2LOV$dbY3UDrwVy&1XxMlSj&84M&#hbVW! zxUC`9Lih+AnA_!0yAcr^ki@`+)#&^EP0qgTZZX*=w3c&b>|(o$%tz~c6|W#a{P(1I zaZC#u9OF5U<9qMDpBPlfUS0!ToeMafLQO_B6=UJ**Fws^$VrBz>B04XOmQK{()qC* zRo~qt?W5(pZD(0yxt6g<4ysvnb2Hkn#ZmJ$b+yh{vRVYGy76mI8 z_pozC$Gt^Io~?WmTtpcSOm9MOb>=FIit6>5qs9tdk*>aH?Y~^aS7!#TbcUM8ioQ$d z)!SH`M4@$l`@-mb%C+g&DUK?wGr8wXj;d>Sb=P#4EwAj$n>&qa#-XEuF)W9Tb&&J6 z8gb_oZG==US?zu`z=ct~@2ct;V#A`0&zyL9XYo27nc{re-z#cIkR0Bh%?;!`=>#`m!Gvg6ThT7+{vNwN{NdV?#I4D3l>UcAKHeshpOFc;Teb6iCX#I;$I6oCC7fh6P>xfNQJDN+f!pVK8$#cyD zX(tq)3X{z@pk~J7rDptbV9EJZ(SUmHI<>9y1plz-%f`S)mvFl2P!%5y_puDtu??Y{JvQFWoj6Yv9 ztY~Dk;q$BOIsFd5E+&h2#mefTX_QI1@%vk2bgLWM*|_gg@Qu^`tQ$pT-)@Qe8l9$l zwsOY~ATmXnI}0NE4Fj}r+18ge*DQF`DIHUQtH_-Sgy}aL>04R4FlVOXRogI&9@R|U ziwitAzF-kAv!>nos2v8fUlhpxusH12aK6u_X`9R&%(&oj8sLv|0JAkU8eHDs-t_bVnl4L@u@&2g-1g z%<6N)$E1lmtJr!)VWVdk*F~<-iZ;iv9IBDA zERKLspT<-%Bm9gaut+>DJLU9@0NYRA*-peLJM^Gw;1Rk!{;g(zPc!Vl!I<_ zNnk*@7Vr{tjjYz*)CKqW>aw5f@<4O#Zl25fny{QOY^q}{xW-)FB})4)f?K^ z$IFxs(3!igvi6t99Hj8np2zFA=*=dZSvsdtc*{ab;R;2kd2+cO^_k-Dkannx3@-K# z5zKV=oo5*Fy_?Mci_f-OmHZ7Dr^_v7q?5O;&J25ZRn+!yxS~J#6PCSPuBl~sC5V@5 z;bG8e9OIY2l&uMWDyh24&igshN(lYs`&apT7~@}ov)53;Bh?J+_X~*|sf0!4Trk=z z(|Y8D=yT`}m#-2}_eXYGiEGp>T>F$EHMthPf7zPQg8iX|lkw*Z4?0tUCW=un)G^Kl zp11Q|BXk8&S6|EdgYG;Hn$8s&eRY}Qad`*s`CpL8kSo-95h|P)^p&h~Vqn{7w%eGTvEm3L@y)gcf=$%uBQ79*myG9bWBqi*XovZ6h8xoHLwLLI%Dpu})fG1&=VkjfL;Q8bC6%ei5u zBgkO2-|f1eIlVEP7@1%uO0vkLu~Wj&kuVf{t83QQyDEZGke2z=y^d%{F933LD?8O& z*G%=6!NiM9;as^(9l*>~A~(O!Ug9<8e*hamfcx8iD(}g14Q2S4IOX_!HYD}pvM?K(e z8?m@V?0>S$qk~Jh#C*s1V_|vPhvjuve%;3Lk~8*5znPjCyvzs|!bD0l#xTZFbD-$a zrZfw0;^a=`JYhgs#kOHWPgH8+Rv#kGug_s_*{As``fURb%%gvv8)ica7p^imqqsT4 zpt6Uu4U9fOR%s3M{QPcWmtLEFm(+C)Yt-0OgGC-<_-SnXqoWPxwnS=u^ku6Y%}38O zv3O6$FZTRc*qpvFBOTOR#*R~%cF$#pU9^of>_YX)#+zK7XvCcMI7Xa$0X~&b?iqjj~lM< zlJVK~k5Gr7BpNAZ+~}T$KHEkd%as|e@H#D$8n;U)?is1GK2i!2R#*{b*2k#k@a{X{ z;zmUxJ-B@J==J1VYC{Gj_XX`}yytZN1fRE(gEFVGb61Mg z!YJzm&9iF!J=Z_1undQXmzU+y2SbfTb$EN) z$YPs6&} z6Y%IF%|FW@Lqs({ya6`wD}{TvBm&G)a24ZoBDGo43KzZv|2#DRVj~D*N0^|+s`p%C zAr~um+DKt*x~=X}eIhc(G%pPZXN9WXLW9o@0d=i2CprH*=;owTw<^x7v=t&0RlY#v zN#+p6i;VJoxjnA_6tC*gO1ukx_plyD0G!mgKh&0YnY#Un3y;dCd9cWuJ_@S3w9*|L zeC6v|{hL57*}rIARQh8I_f%tQ!`X;U)o#%^u%-KnmF2j3i)2E&zQ$H-!qG6GwY?0%Liv;WJ2-_g7m(}Q>qe|Y zS?;T_G=J2oiB#Q668wkj>DzWb@6X9n|JYRpU7hhpA0#ml1; z<*h#A>CSW|OP#$bNjj=XRK_V7{za$H&N@QdgY~-k00gs^jcw?6WtWcP{i=ERZ|CgZx-!UK4r{pv|@?x z%Q8^XW7E4H0xw#R3U(>oa*WOP=unFOc=u_>QQtfmuR{A`osxR?U zne;U(GE$^TRjD-64re#=@*M5CxpHhD33yu%*1bQn@Tw|e4|hCPP_VVQfY^~N>MrbS zA@C>mM>l(b}FA4k(o0=r1FWgj=3@Lb)n@#JFXEMuSJsCQ1 z`H4|OUvIHthLAx5<6C+X70otFv0pMO28H0?M%|TNg*{W2HbI~k*T4O~Q)djiu^B8)qsu&vs+$zxOHO@Y8P7XcCHIf9_y=zxC zF70Fnj1gb~8P2;J}N0BsF`DR*$u3uQ+~symJzR z6g`YIt9$Fa#cdzB<^HoYPn>3Oy+J1Dt(54y0hQ|PcnfO`MPyh_*p~vHH1^eBo7#T% zofj-Zd7bK`t-Gb~Dyup!?ju)j6%`WJw3K6$KVMRQ=L~El?I+1*PHFcb#%M^KIyF}S ze)+3?4~~cnnwaLGinH0dFbLmm-5T21vs3M^M&q1EIT*>_vNxLSIp5D9#wPvOa`%t? z&oVl2cu*73>z1~l`=NN*{e=T3zA1#XKUBT+vsPj|X*twi`!!CyaSZ_^0e%iXQq#)KRjwDWiRMLMG+p zZE`OMnM}eIGn~%9KI^Di)W6pFrT4U-9Ob#puYYtL>s7O?3kI--E&ae_djc`(l^VCK zE3!|z8@&I~Tsl>#-DatYt*JJb9I7Eo+7@0d2>BE3rn=Zs7H5(;Z4;3^PLoIu=y(0K zED^lL$w@u<=4KPD^>82(LSca#i+OaF_I>vGAY^6t&LCwwkD2*;9NVt>D_oScS%3z< z=faVjANQ3HksZi1^c15OQN74Zg4|Lg5--B{e9_{uh$K?sV2p9REryAaNN%b1=uFt^ z`SKeYcUniT0$PwMcK&`tGs@{&3pc;O;G$+M!T)jr-Rhs;>evqLV7hZ3(~9!JaUg8t6H(1@jDmx!bzDypl9SXC@C-G5wWQ&zEcdjq@d zr6bm!krPr4%Hfoo^}lrm=E8X)-3mAj^gkDDTG*D$Se5neuZ$&K zWWQd@rdE|)%5k`TA|5P!Me?n53Ne*m3-54hwBQWJzXP4ADiB6)==PK9ktiJ@zUWR0 zK-?lnE6PS|}aN|w-?%0|RW`awp9PDxTk8m^o;FHhSnuk-ZH4C5G8&+o|r}L2#Tir)+ zWwXEGqBAG!V!8MR6eb$M5sRW=If(aSbb({-$3v1`XShD;!$IP|8jB!%4sU9>J&@Qd1jz z0Z=2uZ@BH{1k1`v2{yKR!4xH0x8e}lP!ZqzbPR!D6)}>_{wNOK--ytp*?zed3!KOD zmU*oSYus`<4Jf<%B5G8%kDzK3ClUK9am&8&-PkX^ADQ<|ToT%6Op49%3VMA$VB-y4pqAfip~q@+fpllx2Abw_&# z_xsoY4BTrP@n(>}CL&c2#?)a__@d{K-NS*s%J_rcFe9>J+ z%?_vZ@o^AxLE28dJgk{aKKj>M;#guWekkaBHlQyUb2uC9jeL1$c}Bq|FwHGh(AC?R zG@lvmveUB@Tq;0|d}nIfX9g^J^}aJ=O+_RgchE0;1@rYGGV zyGZ8Bg$Nam2bld(Q3I_RWRnh1+w>`q0C!`R?E!M6Jrm6u7-6cxh#-p+Ggf3U!oi34 zu(rEuh^Zw9LB^~;>vBWHY$vI22%zD@I$}RH+49L$Io%1JkfTX~Zl#K%;3qp8Wyb>>g}+f0H?%NkX4P@Qj$$ApU_VAFU@KvXuphp7aDrxn?S@ z<+cfHO&!A0!b8plO&!1Zx-3f_oDk%Pp(eKVLXyeO4_V^lDAv8Ta_!&x>Rl~RjaByW zvKe2DGJN6V7eb$u9#zqw{v}FJv@X(W9uTIp>*K zsP)^QBgjJO*(~t`ED~nmkH7r4?X`y(+Yb;mWJAYJsGr8Uou%utHm9(C^Y?Cw(7>Oo z)rc{=N53hU`8O6{&i4J73;u4*<5iqiuju&*D_zld*Q8U}{fUCJYGFv=Y9eG>XV>Vb zOE*|h+jsr>bdr^{E?u~7rPnL90}=DyEEptMw5IvV@+Qo?M0ipihzxoQsaU&rz$amE zez^KdK`Sfo_1mYsPF`7p#`80P3+Q)j@v93xHzXE?TtyVFS_*>o%rFTM`rd$i2x z8~1je5<}7I@+a#4l`oQ1cC&&Y$&xxnZNq)PC1gZB_giaUTvSD=+v%1g_9wV$FJJp? zw3>FOV3l?3mly^E$QPxJ$2B@ZU$T=u%icNolFaoFS~l?<8nO$804c9QisUK;7;wt#Kzcetqv z6vRPCti>NAp6OJp(~kI@Sb@FvfGsqit*KZGfRdG$&pIA8Sos^#30}-o3SoD85{s<>H6Q3}=sXu*c7suANx}8^a;-Ruqe|x*8f(NO>mQbg|UgPb)I89zw zee8;1XSDr$!Gu-ThUe(TM#WM*|z3l~P&0p1iHG(%}S2wr=~Dwz?N}X+^}6cGC^#@HixP zktGzQ?mk*5Ev@<2Pn*t)*Lw$|6j-Eo< zMD21Xr-lvc#)mW%448(?qCW-F%_XPw4?iIe_j_eo}j-e6oPq zRG44p-1iZIV3r;|X(*50!Tgpfe>cin3;Hsb9sX!26bH6{qM=Ue94p+0-kzwt2WY!; z7{&B8RPj#`nmNT>j+k?#rr{WG7R%3jR}N@At$k@zyQO2I9j_}7xb(88+u zoF52cB=1Yx&4Vh%w%`G;SB$wwY0oZc?{A}guBOL_q1|co`5k zAAMr+Ja9m1_3x_3y`tsR$T|yrBaQJs7id8y0~7i$5xk0h^XpG6`bhsxV1j9fathF0K)>G!6nsoLtZ*q@RWS(3y*qPHMDA+DA{Jx$#+k+8! z9v^3idlh5(S57@Ik$0ua9eii%Rp>Xe8jV;K|ogHF|}ARH`VY z0ZWhd#&9|r8TNp=0U1KNr!O}zsx_FM3+sYJ`6RJ-r-8$JarZ!Qk7de_Z`H5ygU6$U zFSC*MDh2qEl?(N^RR-0h-Eh!|o+G|fN)b4_(J`EGKkJy~?H}ju7alzd@>&E=2J$!4 z*+zEt3G3{PTqwn)d{ktjn_nT7P(~ZiCu;gW5SqvQVW)Vs^Ktr_mRigf(RBOV4Fv_BYqJmmY*+eXiAn|X?a(<*Rt zIx_|#w8kOnvc_<~?8)Sb)Vapkc7D(?9ba~c2s*)n`i!SklqCilJI!2hwy zu2`Pw<;C~0{`q(8;m2cY2ET8C=_9@Z&(_If@;4$a2@}`-td*j!AWi7JJt1 z<1tX(u2)6{EIQ9DAaR5!{?v1O8BsiQ4piy!uUottd&;SCIyGJQA8=3X{8gp6ZnZr$ zD1vR4YdCBa6I95pI%Kk zWc%hksQLFGRc<@OKPFY9t={=acj?manI1?Vt^ecU;fE9;^j6oazX3cR58cMfz?NkN%8We-n6EHV}X@SCL7pY>^ale@MnDWa{jPI?&T<-mbIh!0|nvo(l;h;Q^4_ zoL>eijP7P^6g*!OWjA#89)8*tno72Nvc_xFz&G5TRrq%O&OCYLb^k4>-#;#jWboRF zZok<4mTz-Uu5*3*5wmc1%4Ys;&s+4=d!v59w~H`$C(@Ug!WzH2@p=CFXd8=( zH64%kbsc6ABKCc^mLzoNe%^V4u?HO0FD_{WfZi`mLt}eR!PsmbKCGUji?g&af*kC; zx_>TfIm;nZJf;0sfDE_QjtYBJy~9=Sb6%k1{M;eW+Qz>19%;O8*xmdii5?Mu^ZOFM zgVtlj!9Dl(_IXa{7@goZIZa!juSw~J``${E*5`NmJ(ogkw$q8I!xG$JGf)KDr7S(A zkL`9?w#t6xI>sjkF6K3bemOi7`XR6kpauWPoqJ3(ylvK6d%czZefARvvC=C>QL&*V zcCMj?a|iom_Q$8<0a6GVw!EFUva?COSk51ueG~6}8+Ug@u~}bx&X(h9d#YXeOa7+i z!O*XFqX}YJpb|qAQjQ#dV*#$jnF?omwVXfQPnftOeaAT+@y0DA8rTdPjE!*! zh^pd`@+TDF9G)Qx?|kJ)>lY0RBE^waj}3y|x=~ZS7{VwoB?k|hQ5TpXPpmN5j@K^m zx+O@@@%h?KQGST1(DR*rnFI$$HU#P&Ee7(wE+Z`&GX!w1wPxF{ia>Q! zQaalVF)f^PCXjwki|PDrSM5X|v@*-j)I7E&VP{{aKvJlC6R(1nE*=xKC1u1d9IV&X z-32iR>tFuU@-tHDzDqsZxnp9`igHe@u0epajg;>2KCg-02oFMJ27y}()fPx`e9%re z*V!g-V|4!`;l^p%BtMYrTs>B(r?ZNAE!Ms?n6WRhN;c1$GN=RMJk1QFOHWAsyr*#^ zC!C?bYrNaiZ8j}ocXw{!Dq{9+*xx^N2|hPsq&B3!Svp_`OSVEc1_J$%EY%(R0cXS` zjG9&+V;Ix__6HV*+zV4vC}({?l7X-(RpwPg%4UkOrPOJ0o*gg|9_Q$SEYIX`{6+C^ z>RO1|lqugz|5l=7E2IJ?8bKZ7-ySvL88?lo8S-;ViR^RV@fl_hI?EY(Fk5zH%*{O%u~Eb-4~tNxA?d7;&+e z0{SRPypoFJU6KIetRFD1Rp@o$Vp%5=;h|0te(-)IJb`D)bfTh6ppBlI?ZktW%I4S# zo66_piId8;Tc5h$WLcfG(_*KzFAy0n-CATB{h$?x$)Ws0<^NkkpNr%a!qV3kLf*kt z`hD~ZqI3T2-L5&7)J+g>;4;W~zT_0!v@`Ita6IG*@evT%!Ak`1&0zZz_ITm$7;Az$ zm>Lxe(H*mI=IrQF&(cK2jNJ)$RxCHWz{51LAT<&x(N-Q9HQMpBh-g2Z8fC__ z&^BSr@SFPBK2sVhw-4PLPirU&RX#ZN4=p5k!HEsAc{$l2+=0wSsbLQw!LtD4&4AiL z{ger7WC}#of0DgbL3*XYRA6JFMCxk`*%ba_ZZzv9#my*CK_^BzE_>Pn#fRRKuFnH2 zi3M+rE)e{RcJQ;dJ~C87kN@M_z(r7!dP>L_=RQ#Z()gq;)Lt{)XB47^kx4Ca!A!LY z3Y%>Bs0@7E$nY$1h-IRWSYO3H5fN8!QXL8X1_(f>InlL|o5A6OuQwZ|d6XvxQB)rK zr>(~8yU2WZUYHTVPW|4Iyj93x16D{hSST}V4A=_mXLZZO0u2(#Jky|<5=;isNxcM8 z%jzMGPEpX+TK!ys4nw)Rbz+rDDMCPmUppP0!)NmfD`igTO~eRCkDi|`@E%TTh`w@A zCL%x+6*}qP#TfOt1}foWB?My#)PcC|7NfyWIbVbp1wbycd8+rH@P8Gw03|_jH%^)H zmlJ7Gf!5A6U`EU_>%!o|m8Maw}%5-;)HTZ4w zNo*rUsHRWwK5MT|Xx!JO0Q~KUziOhK>Tv;&H(uw?VHl~%k;SU|7k@9P)cf6!H<>Sn z>1-)9*CZtg<0-$>=*FjGb>{NfSn`wK2_XoYPwKBUnoVGvQ&fGc(~^-&~QQKL}I4g~O`WVAxF%SMK!^f0mmwm_o6rz>WZR zL5DqR;Csv!hgl5Mu8DguY+1MdN9e5sNjG%?v2&#L;1tWhn@-nIuyznE)P|uksM@0- zp^b1lT5ffnTNyZ<##1Dwb*6r+s=V#I z3}NYLRvHL3ulWzOgGCt^w|AMutlLPfUh_0=PAq&g{A$fzpp{7m4#NHL?|wbHDT=x@ zN-SMZD6Em$0_QeDH3YSY<(NBg`AB@T8M0{31SDsQWy*wXh31`3%2v#8w>kjvMu0YI z$YBLGooyP(t@~p|!QXI_YlTk%{WhyDU;L-XFNO+m2`HMC54Gqd+ z-|OxBFwayW@5dlh#HUrow>v8&Z^Z(q)O&qH?m7!#WJISP^USoYm8_=ia?HBM+>Bcy zpV3XA>3=G5J*1Y=d3_5+Jq?C|a4Bafx^`v!YCGA_k9v%NQb<9I%7Y2~l4I0`3qF=$ z4Iuc<^t(lzIfo2K@g7}2z{w^^ZN=^JEafkTRt!0=Hhypx!|V+Kn=k{M43*_2UgtIZ z2GV|&&XUZctOk_6y_)d*G92YM$W>3frQHIV>U(rqn!8!_{! z!xAXWfHd5A&##B+7Km|+ahaE{dy%IeGz06UQMF(8tuRRrZA_zB8!N-fGR6N}=|b2E zhjqdny`-z`54jGFt$IvlO49LS4^&OYoK3j%;|SGLm|!e1U|XhD`HM>dfvl891V#ZE zt(b)hRLLK=y1K8^vuD$hSRRo|wxqNQ5JlY4Z7)O1MM`#3@N*Uva4RjY&eRK4)mAx! zwRc;*3aBq=IZ`5NxI=bYrp7Ir0y2krs1-S1@k?8y9d8MiTPCf#yZ89_*>8@Tj-&(G z9oZ&^YH-gSfe7Lf`Kkx?T$yeBP|3PYD>+PoO?w4W`aF=E4gCbxV_)&-RCq?(GIbKN z&_*!F{`RIVE+=EuOKPu65$$oDB?jgu*{@H|J&GGbLq$mBfc&X59CUDhn%p^a88})A))mksxjX?s z(#svy;Pntt!Vb=m0uCC$VPXY^pnO7e`=kE8b62wMve;R@t6_7s-kN~_@y%J>Dv(Si zS#KHmr_@60H4~UUv)XnMI3ZFp+TGxEb2)#EnsI_9 zYpb~RtxT+=jmh+VoYhn=d2kl7AB)>{ z|JxA%=%-h>Ax8B9lv(@$%AkT#{9~pc2g#2{e{${AN_lW%s{fYsPl^Bc4E|d=@b5XP z$O_|3g86b**U3}3gA?t|Dm4A-dnSq|E1^uoUch<>XZUFiRgc*_#NZl04xbG zu&kv2Dah$QF@G05RZ7@}??%7!Q0!AoW7=Kevd}t9Lbu=Er!e|5K4Xp;T?9|J)+Mb99%P9~MbU{-1(2 zQc~ML1pSBB_@w-?tUuRMiIu?#DHRfX{@o3K{ImY=?)%~C#{cLtx0VVhgENT!tIPi= z|GmpUSV(+1jfP$S^aPy$pXW+#rk*QHk2L{{0>h-~vzmFT|3g g3OF+3f6M!q-2YYv3i==Gjq-8wfBXV`z&~pLACafeN&o-= diff --git a/smsapi/Api/Action/Phonebook/ContactAdd.cs b/smsapi/Api/Action/Phonebook/ContactAdd.cs deleted file mode 100644 index 1e16113..0000000 --- a/smsapi/Api/Action/Phonebook/ContactAdd.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use CreateContact")] - public class PhonebookContactAdd : Base - { - private int birthday; - private string city; - private string firstName; - private string gender; - private string[] groups; - private string info; - private string lastName; - private string number; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookContactAdd SetBirthday(int birthday) - { - this.birthday = birthday; - return this; - } - - public PhonebookContactAdd SetCity(string city) - { - this.city = city; - return this; - } - - public PhonebookContactAdd SetFirstName(string firstName) - { - this.firstName = firstName; - return this; - } - - public PhonebookContactAdd SetGender(string gender) - { - this.gender = gender; - return this; - } - - public PhonebookContactAdd SetGroup(string group) - { - groups = new[] { group }; - return this; - } - - public PhonebookContactAdd SetGroups(string[] groups) - { - this.groups = groups; - return this; - } - - public PhonebookContactAdd SetInfo(string info) - { - this.info = info; - return this; - } - - public PhonebookContactAdd SetLastName(string lastName) - { - this.lastName = lastName; - return this; - } - - public PhonebookContactAdd SetNumber(string number) - { - this.number = number; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - var collection = new NameValueCollection - { - { "add_contact", number } - }; - - if (firstName != null) - { - collection.Add("first_name", firstName); - } - - if (lastName != null) - { - collection.Add("last_name", lastName); - } - - if (info != null) - { - collection.Add("info", info); - } - - if (birthday != 0) - { - collection.Add("birthday", birthday.ToString()); - } - - if (city != null) - { - collection.Add("city", city); - } - - if (gender != null) - { - collection.Add("gender", gender); - } - - if (groups != null) - { - collection.Add("groups", string.Join(",", groups)); - } - - return collection; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/ContactDelete.cs b/smsapi/Api/Action/Phonebook/ContactDelete.cs deleted file mode 100644 index cef5fcd..0000000 --- a/smsapi/Api/Action/Phonebook/ContactDelete.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use DeleteContact")] - public class PhonebookContactDelete : Base - { - private string number; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookContactDelete Number(string number) - { - this.number = number; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - return new NameValueCollection - { - { "delete_contact", number } - }; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/ContactEdit.cs b/smsapi/Api/Action/Phonebook/ContactEdit.cs deleted file mode 100644 index 82481bb..0000000 --- a/smsapi/Api/Action/Phonebook/ContactEdit.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use EditContact")] - public class PhonebookContactEdit : Base - { - private int birthday; - private string city; - private string firstName; - private string gender; - private string[] groups; - private string info; - private string lastName; - private string newNumber; - private string oldNumber; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookContactEdit Number(string number) - { - oldNumber = number; - return this; - } - - public PhonebookContactEdit SetBirthday(int birthday) - { - this.birthday = birthday; - return this; - } - - public PhonebookContactEdit SetCity(string city) - { - this.city = city; - return this; - } - - public PhonebookContactEdit SetFirstName(string firstName) - { - this.firstName = firstName; - return this; - } - - public PhonebookContactEdit SetGender(string gender) - { - this.gender = gender; - return this; - } - - public PhonebookContactEdit SetGroup(string group) - { - groups = new[] { group }; - return this; - } - - public PhonebookContactEdit SetGroups(string[] groups) - { - this.groups = groups; - return this; - } - - public PhonebookContactEdit SetInfo(string info) - { - this.info = info; - return this; - } - - public PhonebookContactEdit SetLastName(string lastName) - { - this.lastName = lastName; - return this; - } - - public PhonebookContactEdit SetNumber(string number) - { - newNumber = number; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - var collection = new NameValueCollection - { - { "edit_contact", oldNumber } - }; - - if (newNumber != null) - { - collection.Add("new_number", newNumber); - } - - if (firstName != null) - { - collection.Add("first_name", firstName); - } - - if (lastName != null) - { - collection.Add("last_name", lastName); - } - - if (info != null) - { - collection.Add("info", info); - } - - if (birthday != 0) - { - collection.Add("birthday", birthday.ToString()); - } - - if (city != null) - { - collection.Add("city", city); - } - - if (gender != null) - { - collection.Add("gender", gender); - } - - if (groups != null) - { - collection.Add("groups", string.Join(",", groups)); - } - - return collection; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/ContactGet.cs b/smsapi/Api/Action/Phonebook/ContactGet.cs deleted file mode 100644 index 2655fed..0000000 --- a/smsapi/Api/Action/Phonebook/ContactGet.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use GetContact")] - public class PhonebookContactGet : Base - { - private string number; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookContactGet Number(string number) - { - this.number = number; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - return new NameValueCollection - { - { "get_contact", number } - }; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/ContactList.cs b/smsapi/Api/Action/Phonebook/ContactList.cs deleted file mode 100644 index ce96577..0000000 --- a/smsapi/Api/Action/Phonebook/ContactList.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use ListContacts")] - public class PhonebookContactList : Base - { - private string gender; - private string[] groups; - private uint limit; - private string number; - private uint offset; - private string orderBy; - private string orderDir; - private string searchText; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookContactList() - { - offset = 0; - limit = 0; - } - - public PhonebookContactList Gender(string gender) - { - this.gender = gender; - return this; - } - - public PhonebookContactList Group(string group) - { - groups = new[] { group }; - return this; - } - - public PhonebookContactList Groups(string[] groups) - { - this.groups = groups; - return this; - } - - public PhonebookContactList Limit(uint limit) - { - this.limit = limit; - return this; - } - - public PhonebookContactList Number(string number) - { - this.number = number; - return this; - } - - public PhonebookContactList Offset(uint offset) - { - this.offset = offset; - return this; - } - - public PhonebookContactList OrderBy(string orderBy) - { - this.orderBy = orderBy; - return this; - } - - public PhonebookContactList OrderDir(string orderDir) - { - this.orderDir = orderDir; - return this; - } - - public PhonebookContactList Text(string text) - { - searchText = text; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - var collection = new NameValueCollection - { - { "list_contacts", "" } - }; - - if (!string.IsNullOrEmpty(number)) - { - collection.Add("number", number); - } - - if (groups?.Length > 0) - { - collection.Add("groups", string.Join(";", groups)); - } - - if (!string.IsNullOrEmpty(searchText)) - { - collection.Add("text_search", searchText); - } - - if (!string.IsNullOrEmpty(gender)) - { - collection.Add("gender", gender); - } - - if (!string.IsNullOrEmpty(orderBy)) - { - collection.Add("order_by", orderBy); - } - - if (!string.IsNullOrEmpty(orderDir)) - { - collection.Add("order_dir", orderDir); - } - - if (limit > 0) - { - collection.Add("limit", limit.ToString()); - } - - if (offset > 0) - { - collection.Add("offset", offset.ToString()); - } - - return collection; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/GroupAdd.cs b/smsapi/Api/Action/Phonebook/GroupAdd.cs deleted file mode 100644 index 477e25e..0000000 --- a/smsapi/Api/Action/Phonebook/GroupAdd.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use CreateGroup")] - public class PhonebookGroupAdd : Base - { - private string info; - private string name; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookGroupAdd SetInfo(string info) - { - this.info = info; - return this; - } - - public PhonebookGroupAdd SetName(string name) - { - this.name = name; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - var collection = new NameValueCollection - { - { "add_group", name } - }; - - if (info != null) - { - collection.Add("info", info); - } - - return collection; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/GroupDelete.cs b/smsapi/Api/Action/Phonebook/GroupDelete.cs deleted file mode 100644 index 1068d8c..0000000 --- a/smsapi/Api/Action/Phonebook/GroupDelete.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use DeleteGroup")] - public class PhonebookGroupDelete : Base - { - private string name; - private bool removeContacts; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookGroupDelete() - { - removeContacts = false; - } - - public PhonebookGroupDelete Contacts(bool flag) - { - removeContacts = flag; - return this; - } - - public PhonebookGroupDelete Name(string name) - { - this.name = name; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - var collection = new NameValueCollection - { - { "delete_group", name } - }; - - if (removeContacts) - { - collection.Add("remove_contacts", "1"); - } - - return collection; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/GroupEdit.cs b/smsapi/Api/Action/Phonebook/GroupEdit.cs deleted file mode 100644 index bb9a5fb..0000000 --- a/smsapi/Api/Action/Phonebook/GroupEdit.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use EditGroup")] - public class PhonebookGroupEdit : Base - { - private string info; - private string newName; - private string oldName; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookGroupEdit Name(string name) - { - oldName = name; - return this; - } - - public PhonebookGroupEdit SetInfo(string info) - { - this.info = info; - return this; - } - - public PhonebookGroupEdit SetName(string name) - { - newName = name; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - return new NameValueCollection - { - { "edit_group", oldName }, - { "name", newName }, - { "info", info } - }; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/GroupGet.cs b/smsapi/Api/Action/Phonebook/GroupGet.cs deleted file mode 100644 index 7fa0840..0000000 --- a/smsapi/Api/Action/Phonebook/GroupGet.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use GetGroup")] - public class PhonebookGroupGet : Base - { - private string name; - - protected override RequestMethod Method => RequestMethod.POST; - - public PhonebookGroupGet Name(string name) - { - this.name = name; - return this; - } - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - return new NameValueCollection - { - { "get_group", name } - }; - } - } -} diff --git a/smsapi/Api/Action/Phonebook/GroupList.cs b/smsapi/Api/Action/Phonebook/GroupList.cs deleted file mode 100644 index f8e0b49..0000000 --- a/smsapi/Api/Action/Phonebook/GroupList.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Specialized; -using SMSApi.Api.Response; - -namespace SMSApi.Api.Action -{ - [Obsolete("Use ListGroups")] - public class PhonebookGroupList : Base - { - protected override RequestMethod Method => RequestMethod.POST; - - protected override string Uri() - { - return "phonebook.do"; - } - - protected override NameValueCollection Values() - { - return new NameValueCollection - { - { "list_groups", "" } - }; - } - } -} diff --git a/smsapi/Api/PhonebookFactory.cs b/smsapi/Api/PhonebookFactory.cs deleted file mode 100644 index b2c4013..0000000 --- a/smsapi/Api/PhonebookFactory.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using SMSApi.Api.Action; - -namespace SMSApi.Api -{ - [Obsolete("use ContactsFactory instead")] - public class PhonebookFactory : Factory - { - public PhonebookFactory(ProxyAddress address = ProxyAddress.SmsApiIo) - : base(address) - { } - - public PhonebookFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) - : base(client, address) - { } - - public PhonebookFactory(IClient client, Proxy proxy) - : base(client, proxy) - { } - - public PhonebookContactAdd ActionContactAdd(string number = null) - { - var action = new PhonebookContactAdd(); - action.Proxy(proxy); - action.SetNumber(number); - return action; - } - - public PhonebookContactDelete ActionContactDelete(string number = null) - { - var action = new PhonebookContactDelete(); - action.Proxy(proxy); - action.Number(number); - return action; - } - - public PhonebookContactEdit ActionContactEdit(string number = null) - { - var action = new PhonebookContactEdit(); - action.Proxy(proxy); - action.Number(number); - return action; - } - - public PhonebookContactGet ActionContactGet(string number = null) - { - var action = new PhonebookContactGet(); - action.Proxy(proxy); - action.Number(number); - return action; - } - - public PhonebookContactList ActionContactList() - { - var action = new PhonebookContactList(); - action.Proxy(proxy); - return action; - } - - public PhonebookGroupAdd ActionGroupAdd(string name = null) - { - var action = new PhonebookGroupAdd(); - action.Proxy(proxy); - action.SetName(name); - return action; - } - - public PhonebookGroupDelete ActionGroupDelete(string name = null) - { - var action = new PhonebookGroupDelete(); - action.Proxy(proxy); - action.Name(name); - return action; - } - - public PhonebookGroupEdit ActionGroupEdit(string name = null) - { - var action = new PhonebookGroupEdit(); - action.Proxy(proxy); - action.Name(name); - return action; - } - - public PhonebookGroupGet ActionGroupGet(string name = null) - { - var action = new PhonebookGroupGet(); - action.Proxy(proxy); - action.Name(name); - return action; - } - - public PhonebookGroupList ActionGroupList() - { - var action = new PhonebookGroupList(); - action.Proxy(proxy); - return action; - } - } -} diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 6f131a3..033a504 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -53,9 +53,9 @@ - + - + From 3ea55e4c6274b5066d40ceb71cbc1a8e189e4298 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 12 Apr 2023 16:07:38 +0200 Subject: [PATCH 050/101] Support for template usage in SMS #"template" parameter is missing #33 --- smsapi/Api/Action/SMS/Send.cs | 109 ++++++++++++++++++---------------- smsapi/smsapi.csproj | 2 +- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 58226fe..7f2e8b5 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -5,19 +5,20 @@ namespace SMSApi.Api.Action { public class SMSSend : Send { - private string DataCoding; - private string DateExpire; - private bool Details = true; - private string Encoding = "UTF-8"; - private bool Fast; - private bool Flash; - private int MaxParts; - private bool Normalize; - private bool NoUnicode; - private string[] Params; - private string Sender; - private bool Single; - private string Text; + private const string Encoding = "UTF-8"; + + private string dataCoding; + private string dateExpire; + private bool fast; + private bool flash; + private int maxParts; + private bool normalize; + private bool noUnicode; + private string[] @params; + private string sender; + private bool single; + private string text; + private string? template; protected override RequestMethod Method => RequestMethod.POST; @@ -29,19 +30,19 @@ public SMSSend SetCheckIDx(bool check = true) public SMSSend SetDataCoding(string dataCoding) { - DataCoding = dataCoding; + this.dataCoding = dataCoding; return this; } public SMSSend SetDateExpire(string data) { - DateExpire = data; + dateExpire = data; return this; } public SMSSend SetDateExpire(DateTime data) { - DateExpire = data.ToString("yyyy-MM-ddTHH:mm:ssK"); + dateExpire = data.ToString("yyyy-MM-ddTHH:mm:ssK"); return this; } @@ -67,13 +68,13 @@ public SMSSend SetEncoding(string encoding) public SMSSend SetFast(bool fast = true) { - Fast = fast; + this.fast = fast; return this; } public SMSSend SetFlash(bool flash = true) { - Flash = flash; + this.flash = flash; return this; } @@ -97,13 +98,13 @@ public SMSSend SetIDx(string[] idx) public SMSSend SetNormalize(bool flag = true) { - Normalize = flag; + normalize = flag; return this; } public SMSSend SetNoUnicode(bool noUnicode = true) { - NoUnicode = noUnicode; + this.noUnicode = noUnicode; return this; } @@ -119,12 +120,12 @@ public SMSSend SetParam(int i, string text) throw new IndexOutOfRangeException(); } - if (Params == null) + if (@params == null) { - Params = new string[4]; + @params = new string[4]; } - Params[i] = text; + @params[i] = text; return this; } @@ -137,13 +138,13 @@ public SMSSend SetPartner(string partner) public SMSSend SetSender(string sender) { - Sender = sender; + this.sender = sender; return this; } public SMSSend SetSingle(bool single = true) { - Single = single; + this.single = single; return this; } @@ -155,7 +156,7 @@ public SMSSend SetTest(bool test = true) public SMSSend SetText(string text) { - Text = text; + this.text = text; return this; } @@ -170,6 +171,13 @@ public SMSSend SetTo(string[] to) To = to; return this; } + + public SMSSend SetTemplate(string templateName) + { + template = templateName; + + return this; + } protected override string Uri() { @@ -183,7 +191,7 @@ protected override void Validate() throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); } - if (Text == null) + if (text == null) { throw new ArgumentException("Cannot send message without text!"); } @@ -193,9 +201,9 @@ protected override NameValueCollection Values() { var collection = new NameValueCollection(); - if (Sender != null) + if (sender != null) { - collection.Add("from", Sender); + collection.Add("from", sender); } if (To != null) @@ -208,21 +216,22 @@ protected override NameValueCollection Values() collection.Add("group", Group); } - collection.Add("message", Text); + collection.Add("message", text); - collection.Add("single", Single ? "1" : "0"); - collection.Add("nounicode", NoUnicode ? "1" : "0"); - collection.Add("flash", Flash ? "1" : "0"); - collection.Add("fast", Fast ? "1" : "0"); + collection.Add("single", single ? "1" : "0"); + collection.Add("nounicode", noUnicode ? "1" : "0"); + collection.Add("flash", flash ? "1" : "0"); + collection.Add("fast", fast ? "1" : "0"); + collection.Add("details", "1"); - if (DataCoding != null) + if (dataCoding != null) { - collection.Add("datacoding", DataCoding); + collection.Add("datacoding", dataCoding); } - if (MaxParts > 0) + if (maxParts > 0) { - collection.Add("max_parts", MaxParts.ToString()); + collection.Add("max_parts", maxParts.ToString()); } if (DateSent != null) @@ -230,9 +239,9 @@ protected override NameValueCollection Values() collection.Add("date", DateSent); } - if (DateExpire != null) + if (dateExpire != null) { - collection.Add("expiration_date", DateExpire); + collection.Add("expiration_date", dateExpire); } if (Partner != null) @@ -242,7 +251,7 @@ protected override NameValueCollection Values() collection.Add("encoding", Encoding); - if (Normalize) + if (normalize) { collection.Add("normalize", "1"); } @@ -258,22 +267,22 @@ protected override NameValueCollection Values() collection.Add("idx", string.Join("|", Idx)); } - if (Details) + if (@params != null) { - collection.Add("details", "1"); - } - - if (Params != null) - { - for (int i = 0; i < Params.Length; i++) + for (int i = 0; i < @params.Length; i++) { - if (Params[i] != null) + if (@params[i] != null) { - collection.Add("param" + (i + 1), Params[i]); + collection.Add("param" + (i + 1), @params[i]); } } } + if (template != null) + { + collection.Add("template", template); + } + return collection; } } diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 033a504..05175a1 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -19,7 +19,7 @@ SMSAPI.pl - 2.0.0 + 2.1.0 false MIT https://www.smsapi.com From e9127c8025ca04071e7f726beb5d2c6fa944a0a6 Mon Sep 17 00:00:00 2001 From: jlabno Date: Tue, 16 May 2023 14:50:52 +0200 Subject: [PATCH 051/101] Bump RestSharp version, abandon support for .net5 --- smsapi/ProxyHTTP.cs | 9 ++++----- smsapi/smsapi.csproj | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index d359175..7ade75e 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -57,7 +57,7 @@ public Stream Execute( } catch (System.Exception e) { - throw new ProxyException("Failed to get response from " + client.BuildUri(request), e); + throw new ProxyException("Failed to get response from " + uri, e); } return responseStream; @@ -98,7 +98,7 @@ public async Task ExecuteAsync( } catch (System.Exception e) { - throw new ProxyException("Failed to get response from " + client.BuildUri(request), e); + throw new ProxyException("Failed to get response from " + uri, e); } return responseStream; @@ -137,15 +137,14 @@ private static RestRequest CreateRequest( private RestClient CreateClient() { var options = new RestClientOptions(baseUrl); - var client = new RestClient(options); if (authentication != null) { options.UserAgent = authentication.GetClientAgentHeader(); - client.Authenticator = GetAuthenticator(); + options.Authenticator = GetAuthenticator(); } - return client; + return new RestClient(options); } private IAuthenticator GetAuthenticator() diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 05175a1..4828450 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -19,14 +19,14 @@ SMSAPI.pl - 2.1.0 + 2.2.0 false MIT https://www.smsapi.com SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. smsapi;sms;marketing;shipment;mms;vms;message - netcoreapp3.1;net5.0;net6.0;net7.0 + net6.0;net7.0;netcoreapp3.1 True @@ -34,7 +34,7 @@ - + From c8e37188467d21993e83f77d5d36e6524a21ee4d Mon Sep 17 00:00:00 2001 From: jakublabno Date: Wed, 17 May 2023 09:54:52 +0200 Subject: [PATCH 052/101] CS --- smsapi/ProxyHTTP.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 7ade75e..9020b02 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -149,16 +149,12 @@ private RestClient CreateClient() private IAuthenticator GetAuthenticator() { - switch (authentication) + return authentication switch { - case ClientOAuth oauth: - return new OAuth2AuthorizationRequestHeaderAuthenticator(oauth.Token, "Bearer"); - - case Client basic: - return new HttpBasicAuthenticator(basic.GetUsername(), basic.GetPassword()); - } - - throw new NotSupportedException(); + ClientOAuth oauth => new OAuth2AuthorizationRequestHeaderAuthenticator(oauth.Token, "Bearer"), + Client basic => new HttpBasicAuthenticator(basic.GetUsername(), basic.GetPassword()), + _ => throw new NotSupportedException() + }; } } } From 4355b14b0e2a912ff85df292e0f6ef2183a3a7c5 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Wed, 17 May 2023 11:28:27 +0200 Subject: [PATCH 053/101] Deprecate Basic authentication + small auth refactor --- smsapi/Client.cs | 36 +++++-------- smsapi/ClientBase.cs | 12 ++--- smsapi/ClientOAuth.cs | 22 ++++---- smsapi/IClient.cs | 9 ++-- smsapi/ProxyHTTP.cs | 19 ++----- smsapi/smsapi.csproj | 116 +++++++++++++++++++++--------------------- 6 files changed, 96 insertions(+), 118 deletions(-) diff --git a/smsapi/Client.cs b/smsapi/Client.cs index c1354cc..16f2e38 100644 --- a/smsapi/Client.cs +++ b/smsapi/Client.cs @@ -1,38 +1,33 @@ using System; using System.Security.Cryptography; using System.Text; +using RestSharp.Authenticators; namespace SMSApi.Api { - public class Client : ClientBase, - IClient + [Obsolete("Basic authentication is deprecated, please use ClientOAuth instead")] + public class Client : ClientBase { - protected string password; - protected string username; - public Client(string username) { SetUsername(username); } - public override string GetAuthenticationHeader() + public Client(string username, string passwordHash) { - return "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(username + ":" + password)); + SetUsername(username); + SetPasswordHash(passwordHash); } - public string GetPassword() - { - return password; - } + private string _password; + private string _username; + + public override IAuthenticator Authenticator => new HttpBasicAuthenticator(_username, _password); - public string GetUsername() - { - return username; - } public void SetPasswordHash(string password) { - this.password = password; + _password = password; } public void SetPasswordRAW(string password) @@ -40,19 +35,16 @@ public void SetPasswordRAW(string password) var hash = new StringBuilder(); var md5 = MD5.Create(); - byte[] hashbin = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); + var hashbin = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); - for (int i = 0; i < hashbin.Length; i++) - { - hash.Append(hashbin[i].ToString("x2")); - } + for (var i = 0; i < hashbin.Length; i++) hash.Append(hashbin[i].ToString("x2")); SetPasswordHash(hash.ToString()); } public void SetUsername(string username) { - this.username = username; + _username = username; } } } diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs index 93052c8..6c17d8b 100644 --- a/smsapi/ClientBase.cs +++ b/smsapi/ClientBase.cs @@ -1,23 +1,23 @@ using System; -using System.Diagnostics; using System.Reflection; +using RestSharp.Authenticators; namespace SMSApi.Api { - public abstract class ClientBase + public abstract class ClientBase : IClient { private readonly string _clientAgent; - public ClientBase() + protected ClientBase() { _clientAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; } - public abstract string GetAuthenticationHeader(); + public abstract IAuthenticator Authenticator { get; } - public string GetClientAgentHeader() + public string GetClientAgent() { return _clientAgent; } } -} +} \ No newline at end of file diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index d3fd8f1..1eb4824 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -1,25 +1,21 @@ using System; +using RestSharp.Authenticators; +using RestSharp.Authenticators.OAuth2; namespace SMSApi.Api { - public class ClientOAuth : ClientBase, - IClient + public class ClientOAuth : ClientBase { + private readonly string _token; + public ClientOAuth(string token) { - if (string.IsNullOrEmpty(token)) - { - throw new ArgumentNullException("token"); - } + if (string.IsNullOrEmpty(token)) throw new ArgumentNullException(nameof(token)); - Token = token; + _token = token; } - public string Token { get; } - - public override string GetAuthenticationHeader() - { - return "Bearer " + Token; - } + public override IAuthenticator Authenticator => + new OAuth2AuthorizationRequestHeaderAuthenticator(_token, "Bearer"); } } diff --git a/smsapi/IClient.cs b/smsapi/IClient.cs index 3c6dae6..d40bf52 100644 --- a/smsapi/IClient.cs +++ b/smsapi/IClient.cs @@ -1,8 +1,11 @@ -namespace SMSApi.Api +using RestSharp.Authenticators; + +namespace SMSApi.Api { public interface IClient { - string GetAuthenticationHeader(); - string GetClientAgentHeader(); + IAuthenticator Authenticator { get; } + + string GetClientAgent(); } } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 9020b02..2800403 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -1,12 +1,9 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; using System.Threading.Tasks; using RestSharp; -using RestSharp.Authenticators; -using RestSharp.Authenticators.OAuth2; namespace SMSApi.Api { @@ -140,21 +137,11 @@ private RestClient CreateClient() if (authentication != null) { - options.UserAgent = authentication.GetClientAgentHeader(); - options.Authenticator = GetAuthenticator(); + options.UserAgent = authentication.GetClientAgent(); + options.Authenticator = authentication.Authenticator; } return new RestClient(options); } - - private IAuthenticator GetAuthenticator() - { - return authentication switch - { - ClientOAuth oauth => new OAuth2AuthorizationRequestHeaderAuthenticator(oauth.Token, "Bearer"), - Client basic => new HttpBasicAuthenticator(basic.GetUsername(), basic.GetPassword()), - _ => throw new NotSupportedException() - }; - } } } diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index 4828450..e7b255e 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -1,61 +1,61 @@  - - 8.0.30703 - 2.0 - netcoreapp3.1;net5.0;net6.0;net7.0 - false - false - 9.0 - SMSAPI - SMSAPI - SMSAPI - https://github.com/smsapi/smsapi-csharp-client - git - SMSAPI - SMSAPI - README.md - logo.jpg - - - SMSAPI.pl - 2.2.0 - false - MIT - https://www.smsapi.com - SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. - SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. - smsapi;sms;marketing;shipment;mms;vms;message - net6.0;net7.0;netcoreapp3.1 - True - - - - - - - - - - - True - True - Resources.resx - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - - + + 8.0.30703 + 2.0 + netcoreapp3.1;net5.0;net6.0;net7.0 + false + false + 9.0 + SMSAPI + SMSAPI + SMSAPI + https://github.com/smsapi/smsapi-csharp-client + git + SMSAPI + SMSAPI + README.md + logo.jpg + + + SMSAPI.pl + 2.2.1 + false + MIT + https://www.smsapi.com + SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. + SMSAPI Client that allows to send SMS, MMS, VMS and manage your SMSAPI account. + smsapi;sms;marketing;shipment;mms;vms;message + net6.0;net7.0;netcoreapp3.1 + True + + + + + + + + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + From e9f17c46dbea5fd41b5e45e7d01f3d3264a1b85b Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 30 May 2023 11:02:51 +0200 Subject: [PATCH 054/101] Add changelog --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5516a92 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# CHANGELOG.md + +## 2.2.1 (unreleased) + +- Basic authentication deprecation + +## 2.2.0 (2023-05-16) + +- Http Client fixes [#36](https://github.com/smsapi/smsapi-csharp-client/issues/36), [#32](https://github.com/smsapi/smsapi-csharp-client/issues/32) +- RestSharp dependency update to 109.0.1 +- Abandoned support for .NET < 6 + +## 2.1.0 (2023-04-12) + +- Support for templates in SMS [#37](https://github.com/smsapi/smsapi-csharp-client/issues/33) + +## 2.0.0 (2023-01-18) + +- Support for smsapi.io From c3fd59affd7e8fe6dda5fea4f983f398d503accb Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 30 May 2023 11:10:53 +0200 Subject: [PATCH 055/101] Add some tests --- smsapi/Api/Action/SMS/Send.cs | 5 - smsapi/smsapi.csproj | 12 +- smsapiTests/App.config | 11 ++ .../HttpClientAuthenticationTest.cs | 55 +++++++ .../Integration/IntegrationTestBase.cs | 52 +++++++ .../Integration/Metrics/UserAgentTest.cs | 24 +++ smsapiTests/Integration/RequestAssert.cs | 33 ++++ .../RequestInterceptorMiddleware.cs | 24 +++ smsapiTests/Integration/RequestStorage.cs | 9 ++ smsapiTests/Integration/SendActionHelper.cs | 26 ++++ smsapiTests/Properties/AssemblyInfo.cs | 4 +- smsapiTests/Unit/SMS/SMSSendTest.cs | 141 ++++++++++++++++++ smsapiTests/Unit/SpyProxy.cs | 83 +++++++++++ smsapiTests/Unit/UnitTestBase.cs | 29 ++++ smsapiTests/smsapiTests.csproj | 13 +- 15 files changed, 500 insertions(+), 21 deletions(-) create mode 100644 smsapiTests/App.config create mode 100644 smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs create mode 100644 smsapiTests/Integration/IntegrationTestBase.cs create mode 100644 smsapiTests/Integration/Metrics/UserAgentTest.cs create mode 100644 smsapiTests/Integration/RequestAssert.cs create mode 100644 smsapiTests/Integration/RequestInterceptorMiddleware.cs create mode 100644 smsapiTests/Integration/RequestStorage.cs create mode 100644 smsapiTests/Integration/SendActionHelper.cs create mode 100644 smsapiTests/Unit/SMS/SMSSendTest.cs create mode 100644 smsapiTests/Unit/SpyProxy.cs create mode 100644 smsapiTests/Unit/UnitTestBase.cs diff --git a/smsapi/Api/Action/SMS/Send.cs b/smsapi/Api/Action/SMS/Send.cs index 7f2e8b5..84814c8 100644 --- a/smsapi/Api/Action/SMS/Send.cs +++ b/smsapi/Api/Action/SMS/Send.cs @@ -186,11 +186,6 @@ protected override string Uri() protected override void Validate() { - if (To != null && Group != null) - { - throw new ArgumentException("Cannot use 'to' and 'group' at the same time!"); - } - if (text == null) { throw new ArgumentException("Cannot send message without text!"); diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index e7b255e..c143ab5 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -30,11 +30,11 @@ True - - + + - + @@ -50,12 +50,12 @@ - + - + - + diff --git a/smsapiTests/App.config b/smsapiTests/App.config new file mode 100644 index 0000000..b831352 --- /dev/null +++ b/smsapiTests/App.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs new file mode 100644 index 0000000..f29099b --- /dev/null +++ b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs @@ -0,0 +1,55 @@ +using System; +using System.Text; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; + +namespace smsapiTests.Integration.Authorization; + +[TestClass] +public class HttpClientAuthenticationTest : IntegrationTestBase +{ + [TestInitialize] + public void InitializeServer() + { + RunTestServer(); + } + + [TestMethod] + public void request_contains_oauth_authentication_header() + { + var token = "any token"; + var client = new ClientOAuth(token); + var smsFactory = new SMSFactory(client, GetProxy()); + + SendAnyMessage(smsFactory); + + var expectedAuthHeader = $"Bearer {token}"; + RequestAssert.AssertContainsAuthorizationHeader(expectedAuthHeader); + } + + [TestMethod] + public void request_contains_basic_authentication_header() + { + var username = "any token"; + var password = "password"; + var client = new Client(username, password); + var smsFactory = new SMSFactory(client, GetProxy()); + + SendAnyMessage(smsFactory); + + var expectedAuthHeader = GetBase64String(username, password); + RequestAssert.AssertContainsAuthorizationHeader($"Basic {expectedAuthHeader}"); + } + + private string GetBase64String(string username, string password) + { + return Convert.ToBase64String( + Encoding.UTF8.GetBytes($"{username}:{password}") + ); + } + + private static void SendAnyMessage(SMSFactory smsFactory) + { + SendActionHelper.SendAnySms(smsFactory); + } +} diff --git a/smsapiTests/Integration/IntegrationTestBase.cs b/smsapiTests/Integration/IntegrationTestBase.cs new file mode 100644 index 0000000..e0b1495 --- /dev/null +++ b/smsapiTests/Integration/IntegrationTestBase.cs @@ -0,0 +1,52 @@ +using System.Net; +using System.Net.Sockets; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using SMSApi.Api; + +namespace smsapiTests.Integration; + +public abstract class IntegrationTestBase +{ + protected static string CurrentHost; + + protected void RunTestServer() + { + CurrentHost = FreeHost(); + + new WebHostBuilder() + .UseKestrel() + .UseStartup(typeof(Program)) + .UseUrls(CurrentHost) + .Configure(app => app.UseMiddleware()) + .Build() + .Start(); + } + + protected static ProxyHTTP GetProxy() + { + return new ProxyHTTP(CurrentHost); + } + + private static string FreeHost() + { + TcpListener l = new TcpListener(IPAddress.Loopback, 0); + l.Start(); + int port = ((IPEndPoint)l.LocalEndpoint).Port; + l.Stop(); + + return $"http://localhost:{port}"; + } +} + +public class Program +{ + public Program(IConfiguration config) + { + } + + public void Configure(IApplicationBuilder applicationBuilder) + { + } +} diff --git a/smsapiTests/Integration/Metrics/UserAgentTest.cs b/smsapiTests/Integration/Metrics/UserAgentTest.cs new file mode 100644 index 0000000..72d31c4 --- /dev/null +++ b/smsapiTests/Integration/Metrics/UserAgentTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Reflection; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace smsapiTests.Integration.Metrics; + +[TestClass] +public class UserAgentTest : IntegrationTestBase +{ + [TestInitialize] + public void InitializeServer() + { + RunTestServer(); + } + + [TestMethod] + public void request_contains_user_agent_header() + { + SendActionHelper.SendAnySms(GetProxy()); + + var expectedUserAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; + RequestAssert.AssertContainsUserAgentHeader(expectedUserAgent); + } +} diff --git a/smsapiTests/Integration/RequestAssert.cs b/smsapiTests/Integration/RequestAssert.cs new file mode 100644 index 0000000..5ed356d --- /dev/null +++ b/smsapiTests/Integration/RequestAssert.cs @@ -0,0 +1,33 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace smsapiTests.Integration; + +public static class RequestAssert +{ + public static void AssertContainsAuthorizationHeader(string value) + { + var headerExists = RequestStorage + .AuthorizationHeader + .Equals(value); + + Assert.IsTrue(headerExists, $"Found: {RequestStorage.AuthorizationHeader}"); + } + + public static void AssertContainsUserAgentHeader(string value) + { + var headerExists = RequestStorage + .UserAgentHeader + .Equals(value); + + Assert.IsTrue(headerExists, $"Expected {value}, Found: {RequestStorage.UserAgentHeader}"); + } + + public static void AsserPath(string path) + { + var pathEquals = RequestStorage + .Path + .Equals(path); + + Assert.IsTrue(pathEquals); + } +} diff --git a/smsapiTests/Integration/RequestInterceptorMiddleware.cs b/smsapiTests/Integration/RequestInterceptorMiddleware.cs new file mode 100644 index 0000000..2a71bea --- /dev/null +++ b/smsapiTests/Integration/RequestInterceptorMiddleware.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace smsapiTests.Integration; + +public class RequestInterceptorMiddleware +{ + private readonly RequestDelegate _next; + + public RequestInterceptorMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + RequestStorage.Method = context.Request.Method; + RequestStorage.AuthorizationHeader = context.Request.Headers.Authorization; + RequestStorage.UserAgentHeader = context.Request.Headers.UserAgent; + RequestStorage.Path = $"{context.Request.Scheme}://{context.Request.Host.Value}{context.Request.Path.Value}"; + + await _next(context); + } +} diff --git a/smsapiTests/Integration/RequestStorage.cs b/smsapiTests/Integration/RequestStorage.cs new file mode 100644 index 0000000..fd94ef8 --- /dev/null +++ b/smsapiTests/Integration/RequestStorage.cs @@ -0,0 +1,9 @@ +namespace smsapiTests.Integration; + +public static class RequestStorage +{ + public static string AuthorizationHeader; + public static string UserAgentHeader; + public static string Path; + public static string Method; +} diff --git a/smsapiTests/Integration/SendActionHelper.cs b/smsapiTests/Integration/SendActionHelper.cs new file mode 100644 index 0000000..80db9fc --- /dev/null +++ b/smsapiTests/Integration/SendActionHelper.cs @@ -0,0 +1,26 @@ +using System; +using SMSApi.Api; + +namespace smsapiTests.Integration; + +public static class SendActionHelper +{ + public static void SendAnySms(SMSFactory smsFactory) + { + try + { + smsFactory.ActionSend("48500100100", "any").Execute(); + } + catch (MissingMethodException) + { + } + } + + public static void SendAnySms(Proxy proxy) + { + var client = new ClientOAuth("any"); + var smsFactory = new SMSFactory(client, proxy); + + SendAnySms(smsFactory); + } +} diff --git a/smsapiTests/Properties/AssemblyInfo.cs b/smsapiTests/Properties/AssemblyInfo.cs index ff6b1e4..43a06b3 100644 --- a/smsapiTests/Properties/AssemblyInfo.cs +++ b/smsapiTests/Properties/AssemblyInfo.cs @@ -30,5 +30,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] +[assembly: AssemblyVersion("2.2.0.0")] +[assembly: AssemblyFileVersion("2.2.0.0")] diff --git a/smsapiTests/Unit/SMS/SMSSendTest.cs b/smsapiTests/Unit/SMS/SMSSendTest.cs new file mode 100644 index 0000000..7989f38 --- /dev/null +++ b/smsapiTests/Unit/SMS/SMSSendTest.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api.Action; + +namespace smsapiTests.Unit.SMS; + +[TestClass] +public class SMSSendTest : UnitTestBase +{ + private const string DateFormat = "yyyy-MM-ddTHH:mm:ssK"; + + private static readonly DateTime DateTime = DateTime.Now; + + [TestMethod] + public void action_has_proper_uri() + { + var action = CreateAction(); + + Execute(action); + + var expectedUri = "sms.do"; + Assert.IsTrue(SpyProxy.RequestedUri.Equals(expectedUri)); + } + + [TestMethod] + [DataRow("single", "0")] + [DataRow("nounicode", "0")] + [DataRow("flash", "0")] + [DataRow("fast", "0")] + [DataRow("details", "1")] + public void action_has_parameters_set_by_default(string expectedName, string expectedValue) + { + var action = CreateAction(); + + Execute(action); + + AssertParametersContain(expectedName, expectedValue); + } + + [TestMethod] + [DataRow("SetSingle", new object[] { true }, "single", "1")] + [DataRow("SetSingle", new object[] { false }, "single", "0")] + [DataRow("SetDataCoding", new object[] { "gsm" }, "datacoding", "gsm")] + [DataRow("SetFast", new object[] { true }, "fast", "1")] + [DataRow("SetFast", new object[] { false }, "fast", "0")] + [DataRow("SetFlash", new object[] { true }, "flash", "1")] + [DataRow("SetFlash", new object[] { false }, "flash", "0")] + [DataRow("SetGroup", new object[] { "any group" }, "group", "any group")] + [DataRow("SetNormalize", new object[] { true }, "normalize", "1")] + [DataRow("SetNoUnicode", new object[] { false }, "nounicode", "0")] + [DataRow("SetPartner", new object[] { "partner id" }, "partner_id", "partner id")] + [DataRow("SetSingle", new object[] { true }, "single", "1")] + [DataRow("SetTest", new object[] { true }, "test", "1")] + [DataRow("SetText", new object[] { "fancy message" }, "message", "fancy message")] + [DataRow("SetTemplate", new object[] { "template name" }, "template", "template name")] + [DynamicData(nameof(ExpirationDate), DynamicDataSourceType.Method)] + [DynamicData(nameof(SendDate), DynamicDataSourceType.Method)] + [DynamicData(nameof(SetTo), DynamicDataSourceType.Method)] + public void action_has_proper_parameters_binded(string methodName, object[] methodArgument, + string expectedParameterName, string expectedParameterValue, Type argumentType = null) + { + var action = CreateAction(); + GetActionMethod(action, methodName, argumentType).Invoke(action, methodArgument); + + Execute(action); + + AssertParametersContain(expectedParameterName, expectedParameterValue); + } + + protected override SMSSend CreateAction() + { + var action = base.CreateAction(); + AddNecessaryParameters(action); + + return action; + } + + private static void AddNecessaryParameters(SMSSend action) + { + action.SetText("any"); + action.SetTo("any"); + } + + private MethodInfo GetActionMethod(SMSSend action, string methodName, Type argumentType = null) + { + if (argumentType != null) return action.GetType().GetMethod(methodName, new[] { argumentType }); + + return action.GetType().GetMethod(methodName); + } + + private static IEnumerable ExpirationDate() + { + return new[] + { + new object[] + { "SetDateExpire", new object[] { "2000-01-01" }, "expiration_date", "2000-01-01", typeof(string) }, + new object[] + { + "SetDateExpire", new object[] { DateTime }, "expiration_date", DateTime.ToString(DateFormat), + typeof(DateTime) + } + }; + } + + private static IEnumerable SendDate() + { + return new[] + { + new object[] { "SetDateSent", new object[] { "2000-01-01" }, "date", "2000-01-01", typeof(string) }, + new object[] + { "SetDateSent", new object[] { DateTime }, "date", DateTime.ToString(DateFormat), typeof(DateTime) } + }; + } + + private static IEnumerable SetTo() + { + var recipients = new[] { "48500100100, 48600100100" }; + var expectedRecipientsString = string.Join(",", recipients); + + return new[] + { + new object[] + { "SetTo", new object[] { expectedRecipientsString }, "to", expectedRecipientsString, typeof(string) }, + new object[] + { "SetTo", new object[] { recipients }, "to", expectedRecipientsString, typeof(string[]) } + }; + } + + private void AssertParametersContain(string name, string value) + { + var expectedParameter = new KeyValuePair(name, value); + + Assert.IsTrue( + SpyProxy.Parameters.Contains(expectedParameter), + $"Expected {value}, actual value: {SpyProxy.Parameters[name]}" + ); + } +} \ No newline at end of file diff --git a/smsapiTests/Unit/SpyProxy.cs b/smsapiTests/Unit/SpyProxy.cs new file mode 100644 index 0000000..b09fcbe --- /dev/null +++ b/smsapiTests/Unit/SpyProxy.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using SMSApi.Api; + +namespace smsapiTests.Unit; + +public class SpyProxy : Proxy +{ + public string RequestedUri { get; private set; } + + public Dictionary Parameters { get; } = new(); + + public void Authentication(IClient client) + { + throw new System.NotImplementedException(); + } + + public Stream Execute(string uri, NameValueCollection data, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new MemoryStream(); + } + + public Stream Execute(string uri, NameValueCollection data, Stream file, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new MemoryStream(); + } + + public Stream Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new MemoryStream(); + } + + public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new Task(null); + } + + public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new Task(null); + } + + public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + { + RequestedUri = uri; + SetParameters(data); + + return new Task(null); + } + + private void SetParameters(NameValueCollection collection) + { + Parameters.Clear(); + + var map = collection.AllKeys.SelectMany( + collection.GetValues, + (k, v) => new KeyValuePair(k ,v) + ); + + foreach (var entry in map) + { + Parameters.Add(entry.Key, entry.Value); + } + } +} diff --git a/smsapiTests/Unit/UnitTestBase.cs b/smsapiTests/Unit/UnitTestBase.cs new file mode 100644 index 0000000..dcdb5fe --- /dev/null +++ b/smsapiTests/Unit/UnitTestBase.cs @@ -0,0 +1,29 @@ +using System; +using SMSApi.Api.Action; +using SMSApi.Api.Response; + +namespace smsapiTests.Unit; + +public abstract class UnitTestBase where T : Base +{ + protected readonly SpyProxy SpyProxy = new(); + + protected virtual T CreateAction() + { + var action = Activator.CreateInstance(); + action.Proxy(SpyProxy); + + return action; + } + + protected void Execute(T action) + { + try + { + action.Execute(); + } + catch (MissingMethodException) + { + } + } +} diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index d77a07e..955373f 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -1,25 +1,22 @@  - netcoreapp3.1;net5.0;net6.0;net7.0 false + net7.0 + 2.2.0 - + + - - - - - - \ No newline at end of file + From 72c77a76943c97567db1044bb2f8260789ca268d Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 30 May 2023 11:19:53 +0200 Subject: [PATCH 056/101] Add some tests --- .../HttpClientAuthenticationTest.cs | 6 ------ .../Integration/IntegrationTestBase.cs | 19 +++++++++++++------ .../Integration/Metrics/UserAgentTest.cs | 6 ------ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs index f29099b..8cbf5d2 100644 --- a/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs +++ b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs @@ -8,12 +8,6 @@ namespace smsapiTests.Integration.Authorization; [TestClass] public class HttpClientAuthenticationTest : IntegrationTestBase { - [TestInitialize] - public void InitializeServer() - { - RunTestServer(); - } - [TestMethod] public void request_contains_oauth_authentication_header() { diff --git a/smsapiTests/Integration/IntegrationTestBase.cs b/smsapiTests/Integration/IntegrationTestBase.cs index e0b1495..e6dcabd 100644 --- a/smsapiTests/Integration/IntegrationTestBase.cs +++ b/smsapiTests/Integration/IntegrationTestBase.cs @@ -3,22 +3,29 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; namespace smsapiTests.Integration; public abstract class IntegrationTestBase { - protected static string CurrentHost; + private static string _currentHost; - protected void RunTestServer() + [TestInitialize] + public void InitializeServer() { - CurrentHost = FreeHost(); + RunTestServer(); + } + + private static void RunTestServer() + { + _currentHost = FreeHost(); new WebHostBuilder() .UseKestrel() .UseStartup(typeof(Program)) - .UseUrls(CurrentHost) + .UseUrls(_currentHost) .Configure(app => app.UseMiddleware()) .Build() .Start(); @@ -26,7 +33,7 @@ protected void RunTestServer() protected static ProxyHTTP GetProxy() { - return new ProxyHTTP(CurrentHost); + return new ProxyHTTP(_currentHost); } private static string FreeHost() @@ -46,7 +53,7 @@ public Program(IConfiguration config) { } - public void Configure(IApplicationBuilder applicationBuilder) + public static void Configure(IApplicationBuilder applicationBuilder) { } } diff --git a/smsapiTests/Integration/Metrics/UserAgentTest.cs b/smsapiTests/Integration/Metrics/UserAgentTest.cs index 72d31c4..1a9e7ea 100644 --- a/smsapiTests/Integration/Metrics/UserAgentTest.cs +++ b/smsapiTests/Integration/Metrics/UserAgentTest.cs @@ -7,12 +7,6 @@ namespace smsapiTests.Integration.Metrics; [TestClass] public class UserAgentTest : IntegrationTestBase { - [TestInitialize] - public void InitializeServer() - { - RunTestServer(); - } - [TestMethod] public void request_contains_user_agent_header() { From 16d5d1d90329804fb61c1fda020ba935b8d5cf71 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 6 Oct 2023 15:49:20 +0200 Subject: [PATCH 057/101] Remove basic authentication, replace RestSharp with .net http client --- smsapi/Client.cs | 50 -------------- smsapi/ClientBase.cs | 7 +- smsapi/ClientOAuth.cs | 8 +-- smsapi/IClient.cs | 4 +- smsapi/NativeHttpClientHelper.cs | 66 ++++++++++++++++++ smsapi/Properties/AssemblyInfo.cs | 6 +- smsapi/ProxyHTTP.cs | 68 +++++-------------- smsapi/RequestMethod.cs | 31 +-------- smsapi/smsapi.csproj | 2 +- smsapiTests/ConfigurationTest.cs | 9 +-- .../HttpClientAuthenticationTest.cs | 21 ------ .../Integration/Metrics/UserAgentTest.cs | 1 + smsapiTests/TestBase.cs | 8 +-- smsapiTests/smsapiTests.csproj | 2 +- 14 files changed, 104 insertions(+), 179 deletions(-) delete mode 100644 smsapi/Client.cs create mode 100644 smsapi/NativeHttpClientHelper.cs diff --git a/smsapi/Client.cs b/smsapi/Client.cs deleted file mode 100644 index 16f2e38..0000000 --- a/smsapi/Client.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Security.Cryptography; -using System.Text; -using RestSharp.Authenticators; - -namespace SMSApi.Api -{ - [Obsolete("Basic authentication is deprecated, please use ClientOAuth instead")] - public class Client : ClientBase - { - public Client(string username) - { - SetUsername(username); - } - - public Client(string username, string passwordHash) - { - SetUsername(username); - SetPasswordHash(passwordHash); - } - - private string _password; - private string _username; - - public override IAuthenticator Authenticator => new HttpBasicAuthenticator(_username, _password); - - - public void SetPasswordHash(string password) - { - _password = password; - } - - public void SetPasswordRAW(string password) - { - var hash = new StringBuilder(); - - var md5 = MD5.Create(); - var hashbin = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); - - for (var i = 0; i < hashbin.Length; i++) hash.Append(hashbin[i].ToString("x2")); - - SetPasswordHash(hash.ToString()); - } - - public void SetUsername(string username) - { - _username = username; - } - } -} diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs index 6c17d8b..cf5d6b1 100644 --- a/smsapi/ClientBase.cs +++ b/smsapi/ClientBase.cs @@ -1,6 +1,7 @@ using System; +using System.Collections.Generic; +using System.Net.Http.Headers; using System.Reflection; -using RestSharp.Authenticators; namespace SMSApi.Api { @@ -12,8 +13,8 @@ protected ClientBase() { _clientAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; } - - public abstract IAuthenticator Authenticator { get; } + + public abstract KeyValuePair DefaultRequestHeaders { get; } public string GetClientAgent() { diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index 1eb4824..4b1a66e 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -1,6 +1,6 @@ using System; -using RestSharp.Authenticators; -using RestSharp.Authenticators.OAuth2; +using System.Collections.Generic; +using System.Net.Http.Headers; namespace SMSApi.Api { @@ -15,7 +15,7 @@ public ClientOAuth(string token) _token = token; } - public override IAuthenticator Authenticator => - new OAuth2AuthorizationRequestHeaderAuthenticator(_token, "Bearer"); + public override KeyValuePair DefaultRequestHeaders => + KeyValuePair.Create("Authorization", $"Bearer {_token}"); } } diff --git a/smsapi/IClient.cs b/smsapi/IClient.cs index d40bf52..3d27be9 100644 --- a/smsapi/IClient.cs +++ b/smsapi/IClient.cs @@ -1,10 +1,10 @@ -using RestSharp.Authenticators; +using System.Collections.Generic; namespace SMSApi.Api { public interface IClient { - IAuthenticator Authenticator { get; } + KeyValuePair DefaultRequestHeaders { get; } string GetClientAgent(); } diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs new file mode 100644 index 0000000..71e373d --- /dev/null +++ b/smsapi/NativeHttpClientHelper.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace SMSApi.Api +{ + public static class NativeHttpClientHelper + { + public static Task SendRequest( + this HttpClient httpClient, + RequestMethod method, + string uri, + NameValueCollection body = null, + Dictionary files = null + ) + { + HttpContent httpContent; + + switch (method) + { + case RequestMethod.GET: + return httpClient.GetStreamAsync(uri); + case RequestMethod.POST: + httpContent = ConvertNameValueCollectionToHttpContent(body, files); + + return httpClient.PostAsync(uri, httpContent).Result.Content.ReadAsStreamAsync(); + case RequestMethod.PUT: + httpContent = ConvertNameValueCollectionToHttpContent(body, files); + + return httpClient.PutAsync(uri, httpContent).Result.Content.ReadAsStreamAsync(); + case RequestMethod.DELETE: + return httpClient.DeleteAsync(uri).Result.Content.ReadAsStreamAsync(); + default: + throw new ArgumentOutOfRangeException(nameof(method), method, null); + } + } + + private static HttpContent ConvertNameValueCollectionToHttpContent( + NameValueCollection collection, + Dictionary files = null + ) + { + var contentCollection = collection + .AllKeys + .Select(key => new KeyValuePair(key, collection[key])) + .ToList(); + var formUrlEncodedContent = new FormUrlEncodedContent(contentCollection); + + if (files != null) + { + var multipartContent = new MultipartContent(); + multipartContent.Add(formUrlEncodedContent); + + files + .ToList() + .ForEach(pair => multipartContent.Add(new StreamContent(pair.Value))); + } + + return new FormUrlEncodedContent(contentCollection); + } + } +} diff --git a/smsapi/Properties/AssemblyInfo.cs b/smsapi/Properties/AssemblyInfo.cs index 9537df5..59769f6 100644 --- a/smsapi/Properties/AssemblyInfo.cs +++ b/smsapi/Properties/AssemblyInfo.cs @@ -9,7 +9,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("comvision")] [assembly: AssemblyProduct("libsmsapi")] -[assembly: AssemblyCopyright("Copyright © comvision 2013")] +[assembly: AssemblyCopyright("Copyright © comvision 2023")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.0")] -[assembly: AssemblyFileVersion("2.2.0.0")] +[assembly: AssemblyVersion("3.0.0.0")] +[assembly: AssemblyFileVersion("3.0.0.0")] diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 2800403..5d2ba3b 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -1,7 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; +using System.Net.Http; using System.Threading.Tasks; using RestSharp; @@ -42,22 +44,18 @@ public Stream Execute( Dictionary files, RequestMethod method) { - var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - RestClient client = CreateClient(); - RestRequest request = CreateRequest(uri, responseStream, data, files, method); + HttpClient client = CreateClient(); try { - client.Execute(request); + return client.SendRequest(method, uri, data, files).GetAwaiter().GetResult(); } catch (System.Exception e) { throw new ProxyException("Failed to get response from " + uri, e); } - - return responseStream; } public async Task ExecuteAsync( @@ -83,65 +81,33 @@ public async Task ExecuteAsync( Dictionary files, RequestMethod method) { - var responseStream = new MemoryStream(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - RestClient client = CreateClient(); - RestRequest request = CreateRequest(uri, responseStream, data, files, method); + HttpClient client = CreateClient(); try { - await client.ExecuteAsync(request); + return await client.SendRequest(method, uri, data, files); } catch (System.Exception e) { throw new ProxyException("Failed to get response from " + uri, e); } - - return responseStream; } - - private static RestRequest CreateRequest( - string uri, - Stream responseStream, - NameValueCollection data, - Dictionary files, - RequestMethod method) + + private HttpClient CreateClient() { - var request = new RestRequest(uri) - { - Method = method.ToMethod(), - ResponseWriter = s => - { - s.CopyTo(responseStream); - return s; - } - }; - - foreach (string key in data.Keys) - { - request.AddParameter(key, data[key]); - } + var client = new HttpClient(); + client.BaseAddress = new Uri(baseUrl); - foreach (KeyValuePair file in files) - { - request.AddFile(file.Key, () => file.Value, file.Key); - } - - return request; - } + if (authentication == null) return client; + + var authHeader = authentication.DefaultRequestHeaders; - private RestClient CreateClient() - { - var options = new RestClientOptions(baseUrl); - - if (authentication != null) - { - options.UserAgent = authentication.GetClientAgent(); - options.Authenticator = authentication.Authenticator; - } + client.DefaultRequestHeaders.Add(authHeader.Key, authHeader.Value); + client.DefaultRequestHeaders.Add(HttpRequestHeader.UserAgent.ToString(), authentication.GetClientAgent()); - return new RestClient(options); + return client; } } } diff --git a/smsapi/RequestMethod.cs b/smsapi/RequestMethod.cs index 373c680..22503b3 100644 --- a/smsapi/RequestMethod.cs +++ b/smsapi/RequestMethod.cs @@ -1,37 +1,10 @@ -using System; -using RestSharp; - -namespace SMSApi.Api +namespace SMSApi.Api { public enum RequestMethod { GET, POST, PUT, - DELETE - } - - public static class RequestMethodExtensions - { - public static Method ToMethod(this RequestMethod method) - { - switch (method) - { - case RequestMethod.DELETE: - return Method.Delete; - - case RequestMethod.GET: - return Method.Get; - - case RequestMethod.POST: - return Method.Post; - - case RequestMethod.PUT: - return Method.Put; - - default: - throw new NotSupportedException(); - } - } + DELETE, } } diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index c143ab5..f3ab40a 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -19,7 +19,7 @@ SMSAPI.pl - 2.2.1 + 3.0.0 false MIT https://www.smsapi.com diff --git a/smsapiTests/ConfigurationTest.cs b/smsapiTests/ConfigurationTest.cs index 3895dd1..9652913 100644 --- a/smsapiTests/ConfigurationTest.cs +++ b/smsapiTests/ConfigurationTest.cs @@ -12,13 +12,8 @@ public class ConfigurationTest public void VerifyConfiguration() { string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; - if (authorizationType == AuthorizationType.basic.ToString()) - { - string password = ConfigurationManager.AppSettings["password"]; - Assert.IsNotNull(password); - Assert.AreNotEqual("", password); - } - else if (authorizationType == AuthorizationType.oauth.ToString()) + + if (authorizationType == AuthorizationType.oauth.ToString()) { string token = ConfigurationManager.AppSettings["oauthToken"]; Assert.IsNotNull(token); diff --git a/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs index 8cbf5d2..4449fc9 100644 --- a/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs +++ b/smsapiTests/Integration/Authorization/HttpClientAuthenticationTest.cs @@ -21,27 +21,6 @@ public void request_contains_oauth_authentication_header() RequestAssert.AssertContainsAuthorizationHeader(expectedAuthHeader); } - [TestMethod] - public void request_contains_basic_authentication_header() - { - var username = "any token"; - var password = "password"; - var client = new Client(username, password); - var smsFactory = new SMSFactory(client, GetProxy()); - - SendAnyMessage(smsFactory); - - var expectedAuthHeader = GetBase64String(username, password); - RequestAssert.AssertContainsAuthorizationHeader($"Basic {expectedAuthHeader}"); - } - - private string GetBase64String(string username, string password) - { - return Convert.ToBase64String( - Encoding.UTF8.GetBytes($"{username}:{password}") - ); - } - private static void SendAnyMessage(SMSFactory smsFactory) { SendActionHelper.SendAnySms(smsFactory); diff --git a/smsapiTests/Integration/Metrics/UserAgentTest.cs b/smsapiTests/Integration/Metrics/UserAgentTest.cs index 1a9e7ea..6272b03 100644 --- a/smsapiTests/Integration/Metrics/UserAgentTest.cs +++ b/smsapiTests/Integration/Metrics/UserAgentTest.cs @@ -1,3 +1,4 @@ + using System; using System.Reflection; using Microsoft.VisualStudio.TestTools.UnitTesting; diff --git a/smsapiTests/TestBase.cs b/smsapiTests/TestBase.cs index 6af675c..d85070c 100644 --- a/smsapiTests/TestBase.cs +++ b/smsapiTests/TestBase.cs @@ -18,13 +18,7 @@ public virtual void SetUp() string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; _username = ConfigurationManager.AppSettings["username"]; - if (authorizationType == AuthorizationType.basic.ToString()) - { - var basicClient = new Client(_username); - basicClient.SetPasswordHash(ConfigurationManager.AppSettings["password"]); - _client = basicClient; - } - else if (authorizationType == AuthorizationType.oauth.ToString()) + if (authorizationType == AuthorizationType.oauth.ToString()) { _client = new ClientOAuth(ConfigurationManager.AppSettings["oauthToken"]); } diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index 955373f..bb1cf17 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -3,7 +3,7 @@ false net7.0 - 2.2.0 + 3.0.0 From 1bbe6027beb81d5c8e83d3a869bf17832898af9e Mon Sep 17 00:00:00 2001 From: jlabno Date: Mon, 9 Oct 2023 15:00:23 +0200 Subject: [PATCH 058/101] Remove basic authentication --- smsapi/ClientBase.cs | 10 +---- smsapi/ClientOAuth.cs | 1 - smsapi/ProxyHTTP.cs | 2 +- smsapiTests/App.config | 5 +-- smsapiTests/AuthorizationType.cs | 8 ---- smsapiTests/ConfigurationTest.cs | 43 ++++++++----------- .../Integration/Metrics/UserAgentTest.cs | 2 +- smsapiTests/Properties/AssemblyInfo.cs | 4 +- smsapiTests/TestBase.cs | 40 ++++++++--------- 9 files changed, 43 insertions(+), 72 deletions(-) delete mode 100644 smsapiTests/AuthorizationType.cs diff --git a/smsapi/ClientBase.cs b/smsapi/ClientBase.cs index cf5d6b1..7b048ea 100644 --- a/smsapi/ClientBase.cs +++ b/smsapi/ClientBase.cs @@ -1,19 +1,13 @@ using System; using System.Collections.Generic; -using System.Net.Http.Headers; using System.Reflection; namespace SMSApi.Api { public abstract class ClientBase : IClient { - private readonly string _clientAgent; + private readonly string _clientAgent = $"smsapi-csharp-client/{Assembly.GetExecutingAssembly().GetName().Version} {Environment.Version}"; - protected ClientBase() - { - _clientAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; - } - public abstract KeyValuePair DefaultRequestHeaders { get; } public string GetClientAgent() @@ -21,4 +15,4 @@ public string GetClientAgent() return _clientAgent; } } -} \ No newline at end of file +} diff --git a/smsapi/ClientOAuth.cs b/smsapi/ClientOAuth.cs index 4b1a66e..b128ceb 100644 --- a/smsapi/ClientOAuth.cs +++ b/smsapi/ClientOAuth.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Net.Http.Headers; namespace SMSApi.Api { diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 5d2ba3b..b4d862a 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -105,7 +105,7 @@ private HttpClient CreateClient() var authHeader = authentication.DefaultRequestHeaders; client.DefaultRequestHeaders.Add(authHeader.Key, authHeader.Value); - client.DefaultRequestHeaders.Add(HttpRequestHeader.UserAgent.ToString(), authentication.GetClientAgent()); + client.DefaultRequestHeaders.Add("User-Agent", authentication.GetClientAgent()); return client; } diff --git a/smsapiTests/App.config b/smsapiTests/App.config index b831352..8140d5f 100644 --- a/smsapiTests/App.config +++ b/smsapiTests/App.config @@ -1,11 +1,8 @@  - - - - \ No newline at end of file + diff --git a/smsapiTests/AuthorizationType.cs b/smsapiTests/AuthorizationType.cs deleted file mode 100644 index 03ea691..0000000 --- a/smsapiTests/AuthorizationType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace smsapiTests -{ - public enum AuthorizationType - { - basic, - oauth - } -} diff --git a/smsapiTests/ConfigurationTest.cs b/smsapiTests/ConfigurationTest.cs index 9652913..a23416f 100644 --- a/smsapiTests/ConfigurationTest.cs +++ b/smsapiTests/ConfigurationTest.cs @@ -3,33 +3,28 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -namespace smsapiTests +namespace smsapiTests; + +[TestClass] +public class ConfigurationTest { - [TestClass] - public class ConfigurationTest + [TestMethod] + public void VerifyConfiguration() { - [TestMethod] - public void VerifyConfiguration() - { - string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; - - if (authorizationType == AuthorizationType.oauth.ToString()) - { - string token = ConfigurationManager.AppSettings["oauthToken"]; - Assert.IsNotNull(token); - Assert.AreNotEqual("", token); - } + ExeConfigurationFileMap map = new(); + map.ExeConfigFilename = "testhost.dll.config"; + Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); + + var token = ConfigurationManager.AppSettings["oauthToken"]; + Assert.IsNotNull(token); + Assert.AreNotEqual("", token); - string username = ConfigurationManager.AppSettings["username"]; - Assert.IsNotNull(username); - Assert.AreNotEqual("", username); + var validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; + Assert.IsNotNull(validTestNumber); + Assert.AreNotEqual("", validTestNumber); - string validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; - Assert.IsNotNull(validTestNumber); - Assert.AreNotEqual("", validTestNumber); - - ProxyAddress proxy; - Assert.IsTrue(Enum.TryParse(ConfigurationManager.AppSettings["addressType"], out proxy)); - } + ProxyAddress proxy; + Assert.IsTrue(Enum.TryParse(ConfigurationManager.AppSettings["addressType"], out proxy)); } } + diff --git a/smsapiTests/Integration/Metrics/UserAgentTest.cs b/smsapiTests/Integration/Metrics/UserAgentTest.cs index 6272b03..8760363 100644 --- a/smsapiTests/Integration/Metrics/UserAgentTest.cs +++ b/smsapiTests/Integration/Metrics/UserAgentTest.cs @@ -13,7 +13,7 @@ public void request_contains_user_agent_header() { SendActionHelper.SendAnySms(GetProxy()); - var expectedUserAgent = $"smsapi-csharp-client:{Assembly.GetExecutingAssembly().GetName().Version};{Environment.Version}"; + var expectedUserAgent = $"smsapi-csharp-client/{Assembly.GetExecutingAssembly().GetName().Version} {Environment.Version}"; RequestAssert.AssertContainsUserAgentHeader(expectedUserAgent); } } diff --git a/smsapiTests/Properties/AssemblyInfo.cs b/smsapiTests/Properties/AssemblyInfo.cs index 43a06b3..49e4048 100644 --- a/smsapiTests/Properties/AssemblyInfo.cs +++ b/smsapiTests/Properties/AssemblyInfo.cs @@ -30,5 +30,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.0")] -[assembly: AssemblyFileVersion("2.2.0.0")] +[assembly: AssemblyVersion("3.0.0.0")] +[assembly: AssemblyFileVersion("3.0.0.0")] diff --git a/smsapiTests/TestBase.cs b/smsapiTests/TestBase.cs index d85070c..0ee72dc 100644 --- a/smsapiTests/TestBase.cs +++ b/smsapiTests/TestBase.cs @@ -3,30 +3,24 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; -namespace smsapiTests -{ - public abstract class TestBase - { - protected IClient _client; - protected ProxyAddress _proxyAddress; - protected string _username; - protected string _validTestNumber; - - [TestInitialize] - public virtual void SetUp() - { - string authorizationType = ConfigurationManager.AppSettings["authorizationType"]; - _username = ConfigurationManager.AppSettings["username"]; +namespace smsapiTests; - if (authorizationType == AuthorizationType.oauth.ToString()) - { - _client = new ClientOAuth(ConfigurationManager.AppSettings["oauthToken"]); - } +public abstract class TestBase +{ + protected IClient _client; + protected ProxyAddress _proxyAddress; + protected string _username; + protected string _validTestNumber; - _proxyAddress = (ProxyAddress)Enum.Parse( - typeof(ProxyAddress), - ConfigurationManager.AppSettings["addressType"]); - _validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; - } + [TestInitialize] + public virtual void SetUp() + { + _client = new ClientOAuth(ConfigurationManager.AppSettings["oauthToken"]); + + _proxyAddress = (ProxyAddress)Enum.Parse( + typeof(ProxyAddress), + ConfigurationManager.AppSettings["addressType"]); + + _validTestNumber = ConfigurationManager.AppSettings["validTestNumber"]; } } From 5e432e1f0547f72cbb13882d95f1f112cad41771 Mon Sep 17 00:00:00 2001 From: jlabno Date: Mon, 9 Oct 2023 15:00:42 +0200 Subject: [PATCH 059/101] Bump version, fix integration tests --- smsapi/Properties/AssemblyInfo.cs | 4 ++-- smsapiTests/smsapiTests.csproj | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/smsapi/Properties/AssemblyInfo.cs b/smsapi/Properties/AssemblyInfo.cs index 59769f6..0aec68e 100644 --- a/smsapi/Properties/AssemblyInfo.cs +++ b/smsapi/Properties/AssemblyInfo.cs @@ -7,9 +7,9 @@ [assembly: AssemblyTitle("libsmsapi")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("comvision")] +[assembly: AssemblyCompany("LINK Mobility Poland")] [assembly: AssemblyProduct("libsmsapi")] -[assembly: AssemblyCopyright("Copyright © comvision 2023")] +[assembly: AssemblyCopyright("Copyright © LINK Mobility Poland 2023")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/smsapiTests/smsapiTests.csproj b/smsapiTests/smsapiTests.csproj index bb1cf17..b984ac6 100644 --- a/smsapiTests/smsapiTests.csproj +++ b/smsapiTests/smsapiTests.csproj @@ -19,4 +19,7 @@ + + + From 80a8590152d41913667d825050161ea349a52274 Mon Sep 17 00:00:00 2001 From: jlabno Date: Mon, 16 Oct 2023 22:20:48 +0200 Subject: [PATCH 060/101] Replace RestSharp with .net http client --- smsapi/NativeHttpClientHelper.cs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs index 71e373d..367daf6 100644 --- a/smsapi/NativeHttpClientHelper.cs +++ b/smsapi/NativeHttpClientHelper.cs @@ -19,7 +19,7 @@ public static Task SendRequest( ) { HttpContent httpContent; - + switch (method) { case RequestMethod.GET: @@ -44,23 +44,27 @@ private static HttpContent ConvertNameValueCollectionToHttpContent( Dictionary files = null ) { - var contentCollection = collection - .AllKeys + var contentCollectionKeys = collection.AllKeys; + + var contentCollection = contentCollectionKeys .Select(key => new KeyValuePair(key, collection[key])) .ToList(); var formUrlEncodedContent = new FormUrlEncodedContent(contentCollection); - if (files != null) - { - var multipartContent = new MultipartContent(); - multipartContent.Add(formUrlEncodedContent); + if (files == null) return formUrlEncodedContent; - files - .ToList() - .ForEach(pair => multipartContent.Add(new StreamContent(pair.Value))); + var multipartContent = new MultipartFormDataContent(); + + foreach (var keyValuePair in contentCollection) + { + multipartContent.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); } + + files + .ToList() + .ForEach(pair => multipartContent.Add(new StreamContent(pair.Value), "file", pair.Key)); - return new FormUrlEncodedContent(contentCollection); + return multipartContent; } } } From 2fc4f74a01730205404762c317a37adee999c5f9 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 18 Oct 2023 11:49:42 +0200 Subject: [PATCH 061/101] Replace RestSharp with .net http client --- smsapi/ProxyHTTP.cs | 1 - smsapi/smsapi.csproj | 3 --- 2 files changed, 4 deletions(-) diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index b4d862a..88abf58 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -5,7 +5,6 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; -using RestSharp; namespace SMSApi.Api { diff --git a/smsapi/smsapi.csproj b/smsapi/smsapi.csproj index f3ab40a..e26208e 100644 --- a/smsapi/smsapi.csproj +++ b/smsapi/smsapi.csproj @@ -33,9 +33,6 @@ - - - True From fce522c3bf7d93fd73c5a32b5b304f888c6a56be Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 18 Oct 2023 11:56:10 +0200 Subject: [PATCH 062/101] Remove basic authentication --- smsapiTests/App.Config | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 smsapiTests/App.Config diff --git a/smsapiTests/App.Config b/smsapiTests/App.Config deleted file mode 100644 index b831352..0000000 --- a/smsapiTests/App.Config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file From 657a556aec70d65f6f68f9d9b101fa4a6d6036c3 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 19 Oct 2023 11:35:53 +0200 Subject: [PATCH 063/101] Refactor handling exceptions --- smsapi/ActionException.cs | 8 ++-- smsapi/Api/Action/Base.cs | 42 +++++++++---------- .../Api/Action/Contacts/BindContactToGroup.cs | 2 +- smsapi/Api/Action/Contacts/DeleteContact.cs | 2 +- smsapi/Api/Action/Contacts/DeleteField.cs | 2 +- smsapi/Api/Action/Contacts/DeleteGroup.cs | 2 +- .../Action/Contacts/UnbindContactFromGroup.cs | 2 +- smsapi/Api/Action/Sender/Add.cs | 2 +- smsapi/Api/Action/Sender/Delete.cs | 2 +- smsapi/Api/Action/Sender/SetDefault.cs | 2 +- smsapi/Api/Response/Contact.cs | 2 +- smsapi/Api/Response/Error.cs | 25 ----------- .../{Base.cs => ErrorAwareResponse.cs} | 15 ++----- smsapi/Api/Response/Group.cs | 2 +- smsapi/Api/Response/GroupPermission.cs | 2 +- smsapi/Api/Response/Points.cs | 2 +- smsapi/Api/Response/User.cs | 2 +- smsapi/ClientException.cs | 8 ++-- smsapi/HostException.cs | 8 ++-- smsapi/ProxyHTTP.cs | 2 +- smsapi/SmsapiException.cs | 10 +---- smsapiTests/Contacts/ContactsTest.cs | 4 +- smsapiTests/SenderTest.cs | 8 ++-- smsapiTests/UserTest.cs | 6 +-- 24 files changed, 64 insertions(+), 98 deletions(-) delete mode 100644 smsapi/Api/Response/Error.cs rename smsapi/Api/Response/{Base.cs => ErrorAwareResponse.cs} (59%) diff --git a/smsapi/ActionException.cs b/smsapi/ActionException.cs index b91f803..f133a90 100644 --- a/smsapi/ActionException.cs +++ b/smsapi/ActionException.cs @@ -1,9 +1,11 @@ -namespace SMSApi.Api +using System; + +namespace SMSApi.Api { public class ActionException : SmsapiException { - public ActionException(string message, string code) - : base(message, code) + public ActionException(string message, int code) + : base(message, Convert.ToString(code)) { } } } diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 91bbba5..a123386 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -114,17 +114,17 @@ private NameValueCollection GetValues() * 1000 Akcja dostępna tylko dla użytkownika głównego * 1001 Nieprawidłowa akcja */ - private static bool IsClientError(string code) + private static bool IsClientError(int code) { switch (code) { - case "101": - case "102": - case "103": - case "105": - case "110": - case "1000": - case "1001": + case 101: + case 102: + case 103: + case 105: + case 110: + case 1000: + case 1001: return true; default: @@ -138,14 +138,14 @@ private static bool IsClientError(string code) * 999 Wewnętrzny błąd systemu * 201 Wewnętrzny błąd systemu */ - private static bool IsHostError(string code) + private static bool IsHostError(int code) { switch (code) { - case "8": - case "201": - case "666": - case "999": + case 8: + case 201: + case 666: + case 999: return true; default: @@ -159,24 +159,24 @@ private void HandleError(Stream data) try { - var error = Deserialize(data); + var error = Deserialize(data); - if (error.isError()) + if (error.IsError()) { - if (IsHostError(error.Code)) + if (IsHostError(error.ErrorCode)) { - throw new HostException(error.Message, error.Code); + throw new HostException(error.ErrorMessage, Convert.ToString(error.ErrorCode)); } - if (IsClientError(error.Code)) + if (IsClientError(error.ErrorCode)) { - throw new ClientException(error.Message, error.Code); + throw new ClientException(error.ErrorMessage, error.ErrorCode); } - throw new ActionException(error.Message, error.Code); + throw new ActionException(error.ErrorMessage, error.ErrorCode); } } - catch (SerializationException e) + catch (SerializationException) { } data.Position = 0; diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index 07995ca..e34c75f 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class BindContactToGroup : Base + public class BindContactToGroup : Base { private readonly string contactId; private readonly string groupId; diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index 0653ecf..207be11 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class DeleteContact : Base + public class DeleteContact : Base { private readonly string contactId; diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index f58aec5..0a2d41d 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class DeleteField : Base + public class DeleteField : Base { private readonly string fieldId; diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index 06160de..80ac5da 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class DeleteGroup : Base + public class DeleteGroup : Base { private readonly string groupId; diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index 3be2204..b00b7d0 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class UnbindContactFromGroup : Base + public class UnbindContactFromGroup : Base { private readonly string contactId; private readonly string groupId; diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index 265abab..4e485ad 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderAdd : Base + public class SenderAdd : Base { private string name; diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index 6807c25..7427dcb 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderDelete : Base + public class SenderDelete : Base { private string name; diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index c9e63d1..b8f4a12 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SenderSetDefault : Base + public class SenderSetDefault : Base { private string name; diff --git a/smsapi/Api/Response/Contact.cs b/smsapi/Api/Response/Contact.cs index ea37498..e48748f 100644 --- a/smsapi/Api/Response/Contact.cs +++ b/smsapi/Api/Response/Contact.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class Contact : Base + public class Contact : ErrorAwareResponse { public const string FemaleGender = "female"; public const string MaleGender = "male"; diff --git a/smsapi/Api/Response/Error.cs b/smsapi/Api/Response/Error.cs deleted file mode 100644 index 86c059e..0000000 --- a/smsapi/Api/Response/Error.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.Serialization; - -namespace SMSApi.Api.Response -{ - [DataContract] - public class Error - { - [DataMember(Name = "error", IsRequired = false)] - public readonly string Code; - - [DataMember(Name = "message", IsRequired = true)] - public readonly string Message; - - public Error() - { - Code = "0"; - Message = ""; - } - - public bool isError() - { - return !string.IsNullOrEmpty(Code) && Code != "0"; - } - } -} diff --git a/smsapi/Api/Response/Base.cs b/smsapi/Api/Response/ErrorAwareResponse.cs similarity index 59% rename from smsapi/Api/Response/Base.cs rename to smsapi/Api/Response/ErrorAwareResponse.cs index e73a722..f3fd186 100644 --- a/smsapi/Api/Response/Base.cs +++ b/smsapi/Api/Response/ErrorAwareResponse.cs @@ -3,23 +3,14 @@ namespace SMSApi.Api.Response { [DataContract] - public class Base + public class ErrorAwareResponse { [DataMember(Name = "error", IsRequired = false)] public readonly int ErrorCode; [DataMember(Name = "message", IsRequired = false)] public readonly string ErrorMessage; - - public Base() - { - ErrorCode = 0; - ErrorMessage = ""; - } - - public bool isError() - { - return ErrorCode != 0; - } + + public bool IsError() => ErrorCode != 0; } } diff --git a/smsapi/Api/Response/Group.cs b/smsapi/Api/Response/Group.cs index 42a2c64..3d8ec05 100644 --- a/smsapi/Api/Response/Group.cs +++ b/smsapi/Api/Response/Group.cs @@ -5,7 +5,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class Group : Base + public class Group : ErrorAwareResponse { [DataMember(Name = "created_by", IsRequired = false)] public readonly string CreatedBy; diff --git a/smsapi/Api/Response/GroupPermission.cs b/smsapi/Api/Response/GroupPermission.cs index 72e942c..6797d32 100644 --- a/smsapi/Api/Response/GroupPermission.cs +++ b/smsapi/Api/Response/GroupPermission.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class GroupPermission : Base + public class GroupPermission : ErrorAwareResponse { [DataMember(Name = "group_id", IsRequired = false)] public readonly string GroupId; diff --git a/smsapi/Api/Response/Points.cs b/smsapi/Api/Response/Points.cs index f2e13a8..d625f84 100644 --- a/smsapi/Api/Response/Points.cs +++ b/smsapi/Api/Response/Points.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class Credits : Base + public class Credits : ErrorAwareResponse { [DataMember(Name = "ecoCount", IsRequired = false)] public readonly int EcoCount; diff --git a/smsapi/Api/Response/User.cs b/smsapi/Api/Response/User.cs index 28d2ae1..3580553 100644 --- a/smsapi/Api/Response/User.cs +++ b/smsapi/Api/Response/User.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Response { [DataContract] - public class User : Base + public class User : ErrorAwareResponse { [DataMember(Name = "active", IsRequired = true)] public readonly bool Active; diff --git a/smsapi/ClientException.cs b/smsapi/ClientException.cs index 426ef88..9962a76 100644 --- a/smsapi/ClientException.cs +++ b/smsapi/ClientException.cs @@ -1,9 +1,11 @@ -namespace SMSApi.Api +using System; + +namespace SMSApi.Api { public class ClientException : SmsapiException { - public ClientException(string message, string code) - : base(message, code) + public ClientException(string message, int code) + : base(message, Convert.ToString(code)) { } } } diff --git a/smsapi/HostException.cs b/smsapi/HostException.cs index e2da60a..5ce05f9 100644 --- a/smsapi/HostException.cs +++ b/smsapi/HostException.cs @@ -1,11 +1,13 @@ -namespace SMSApi.Api +using System; + +namespace SMSApi.Api { public class HostException : SmsapiException { public static readonly string E_JSON_DECODE = "-1"; public HostException(string message, string code) - : base(message, code) + : base(message, Convert.ToString(code)) { } } -} +} diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 88abf58..f0c51a2 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -104,7 +104,7 @@ private HttpClient CreateClient() var authHeader = authentication.DefaultRequestHeaders; client.DefaultRequestHeaders.Add(authHeader.Key, authHeader.Value); - client.DefaultRequestHeaders.Add("User-Agent", authentication.GetClientAgent()); + client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", authentication.GetClientAgent()); return client; } diff --git a/smsapi/SmsapiException.cs b/smsapi/SmsapiException.cs index d81f6b0..544d3fc 100644 --- a/smsapi/SmsapiException.cs +++ b/smsapi/SmsapiException.cs @@ -2,17 +2,11 @@ { public class SmsapiException : Exception { - private string Code; - - public SmsapiException(string message, string code) - : base(message) + protected SmsapiException(string message, string code) : base(message) { Code = code; } - public string GetCode() - { - return Code; - } + public string Code { get; private set; } } } diff --git a/smsapiTests/Contacts/ContactsTest.cs b/smsapiTests/Contacts/ContactsTest.cs index 431ffce..bc6c158 100644 --- a/smsapiTests/Contacts/ContactsTest.cs +++ b/smsapiTests/Contacts/ContactsTest.cs @@ -12,8 +12,8 @@ public class ContactsTest : ContactsTestBase [TestMethod] public void BindContactToGroup() { - Base response = _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); - Assert.IsFalse(response.isError()); + ErrorAwareResponse response = _factory.BindContactToGroup(_contact.Id, _group.Id).Execute(); + Assert.IsFalse(response.IsError()); _factory.DeleteGroup(_group.Id).Execute(); } diff --git a/smsapiTests/SenderTest.cs b/smsapiTests/SenderTest.cs index 4d48b47..c8695a6 100644 --- a/smsapiTests/SenderTest.cs +++ b/smsapiTests/SenderTest.cs @@ -13,11 +13,11 @@ public class SenderTest : TestBase [TestMethod] public void Add_Delete() { - Base addResponse = _factory.ActionAdd(_testName).Execute(); - Assert.IsFalse(addResponse.isError(), addResponse.ErrorMessage); + ErrorAwareResponse addResponse = _factory.ActionAdd(_testName).Execute(); + Assert.IsFalse(addResponse.IsError(), addResponse.ErrorMessage); - Base deleteResponse = _factory.ActionDelete(_testName).Execute(); - Assert.IsFalse(deleteResponse.isError(), deleteResponse.ErrorMessage); + ErrorAwareResponse deleteResponse = _factory.ActionDelete(_testName).Execute(); + Assert.IsFalse(deleteResponse.IsError(), deleteResponse.ErrorMessage); } [TestMethod] diff --git a/smsapiTests/UserTest.cs b/smsapiTests/UserTest.cs index f92c190..399a700 100644 --- a/smsapiTests/UserTest.cs +++ b/smsapiTests/UserTest.cs @@ -18,13 +18,13 @@ public void Add_Edit_List() User addResponse = _factory.ActionAdd().SetUsername(usernName).SetPassword("7815696ecbf1c96e6894b779456d330e").Execute(); - Assert.IsFalse(addResponse.isError()); + Assert.IsFalse(addResponse.IsError()); Assert.AreEqual("", addResponse.Info); User editResponse = _factory.ActionEdit(usernName).SetInfo("edited info").Execute(); - Assert.IsFalse(addResponse.isError()); + Assert.IsFalse(addResponse.IsError()); Assert.AreEqual(addResponse.Username, editResponse.Username); Assert.AreEqual("edited info", editResponse.Info); @@ -38,7 +38,7 @@ public void GetCredits() { Credits pointsResponse = _factory.ActionGetCredits().Execute(); Assert.IsNotNull(pointsResponse.Points); - Assert.IsFalse(pointsResponse.isError()); + Assert.IsFalse(pointsResponse.IsError()); } [TestInitialize] From 2108efa3c6273e0a040a8abfaa8834c561351d54 Mon Sep 17 00:00:00 2001 From: jlabno Date: Mon, 6 Nov 2023 21:46:41 +0100 Subject: [PATCH 064/101] Resolving status from http code --- smsapi/Api/Action/Base.cs | 26 +++++++++++++------ .../ErrorAwareResponse.cs | 5 ++-- .../ResponseResolver/IErrorResponse.cs | 8 ++++++ .../ResponseCodeAwareResolver.cs | 9 +++++++ smsapi/HttpResponseEntity.cs | 18 +++++++++++++ smsapi/NativeHttpClientHelper.cs | 24 ++++++++++------- smsapi/Proxy.cs | 12 ++++----- smsapi/ProxyHTTP.cs | 12 ++++----- 8 files changed, 82 insertions(+), 32 deletions(-) rename smsapi/Api/Response/{ => ResponseResolver}/ErrorAwareResponse.cs (68%) create mode 100644 smsapi/Api/Response/ResponseResolver/IErrorResponse.cs create mode 100644 smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs create mode 100644 smsapi/HttpResponseEntity.cs diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index a123386..5a06a1f 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -6,7 +6,7 @@ using System.Runtime.Serialization.Json; using System.Threading.Tasks; using System.Web; -using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { @@ -71,13 +71,16 @@ protected virtual NameValueCollection Values() return new NameValueCollection(); } - private T ProcessResponse(Stream data) + private T ProcessResponse(HttpResponseEntity responseEntity) { T response; - + Stream data = null; + try { - HandleError(data); + HandleError(responseEntity); + + data = responseEntity.Content.Result; response = ResponseToObject(data); } catch (SerializationException e) @@ -153,8 +156,15 @@ private static bool IsHostError(int code) } } - private void HandleError(Stream data) + private void HandleError(HttpResponseEntity responseEntity) { + if (typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) + { + //TODO resolve code to status + } + + var data = responseEntity.Content.Result; + data.Position = 0; try @@ -165,15 +175,15 @@ private void HandleError(Stream data) { if (IsHostError(error.ErrorCode)) { - throw new HostException(error.ErrorMessage, Convert.ToString(error.ErrorCode)); + throw new HostException(error.GetErrorMessage(), Convert.ToString(error.ErrorCode)); } if (IsClientError(error.ErrorCode)) { - throw new ClientException(error.ErrorMessage, error.ErrorCode); + throw new ClientException(error.GetErrorMessage(), error.ErrorCode); } - throw new ActionException(error.ErrorMessage, error.ErrorCode); + throw new ActionException(error.GetErrorMessage(), error.ErrorCode); } } catch (SerializationException) diff --git a/smsapi/Api/Response/ErrorAwareResponse.cs b/smsapi/Api/Response/ResponseResolver/ErrorAwareResponse.cs similarity index 68% rename from smsapi/Api/Response/ErrorAwareResponse.cs rename to smsapi/Api/Response/ResponseResolver/ErrorAwareResponse.cs index f3fd186..e007bc7 100644 --- a/smsapi/Api/Response/ErrorAwareResponse.cs +++ b/smsapi/Api/Response/ResponseResolver/ErrorAwareResponse.cs @@ -1,9 +1,9 @@ using System.Runtime.Serialization; -namespace SMSApi.Api.Response +namespace SMSApi.Api.Response.ResponseResolver { [DataContract] - public class ErrorAwareResponse + public class ErrorAwareResponse: IErrorResponse { [DataMember(Name = "error", IsRequired = false)] public readonly int ErrorCode; @@ -12,5 +12,6 @@ public class ErrorAwareResponse public readonly string ErrorMessage; public bool IsError() => ErrorCode != 0; + public string GetErrorMessage() => ErrorMessage; } } diff --git a/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs b/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs new file mode 100644 index 0000000..28d7e3b --- /dev/null +++ b/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs @@ -0,0 +1,8 @@ +namespace SMSApi.Api.Response.ResponseResolver +{ + public interface IErrorResponse + { + public bool IsError(); + public string GetErrorMessage(); + } +} diff --git a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs new file mode 100644 index 0000000..b2aa154 --- /dev/null +++ b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace SMSApi.Api.Response.ResponseResolver +{ + public interface IResponseCodeAwareResolver: IErrorResponse + { + public Dictionary GetCodeErrorMap(); + } +} diff --git a/smsapi/HttpResponseEntity.cs b/smsapi/HttpResponseEntity.cs new file mode 100644 index 0000000..1b1d020 --- /dev/null +++ b/smsapi/HttpResponseEntity.cs @@ -0,0 +1,18 @@ +using System.IO; +using System.Net; +using System.Threading.Tasks; + +namespace SMSApi.Api +{ + public readonly struct HttpResponseEntity + { + public readonly Task Content; + public readonly HttpStatusCode StatusCode; + + public HttpResponseEntity(Task content, HttpStatusCode statusCode) + { + Content = content; + StatusCode = statusCode; + } + } +} diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs index 367daf6..148ef1d 100644 --- a/smsapi/NativeHttpClientHelper.cs +++ b/smsapi/NativeHttpClientHelper.cs @@ -10,7 +10,7 @@ namespace SMSApi.Api { public static class NativeHttpClientHelper { - public static Task SendRequest( + public static async Task SendRequest( this HttpClient httpClient, RequestMethod method, string uri, @@ -23,17 +23,23 @@ public static Task SendRequest( switch (method) { case RequestMethod.GET: - return httpClient.GetStreamAsync(uri); + var getResponse = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead); + + return new HttpResponseEntity(getResponse.Content.ReadAsStreamAsync(), getResponse.StatusCode); case RequestMethod.POST: httpContent = ConvertNameValueCollectionToHttpContent(body, files); + var postResponse = await httpClient.PostAsync(uri, httpContent); - return httpClient.PostAsync(uri, httpContent).Result.Content.ReadAsStreamAsync(); + return new HttpResponseEntity(postResponse.Content.ReadAsStreamAsync(), postResponse.StatusCode); case RequestMethod.PUT: httpContent = ConvertNameValueCollectionToHttpContent(body, files); + var putResponse = await httpClient.PutAsync(uri, httpContent); - return httpClient.PutAsync(uri, httpContent).Result.Content.ReadAsStreamAsync(); + return new HttpResponseEntity(putResponse.Content.ReadAsStreamAsync(), putResponse.StatusCode); case RequestMethod.DELETE: - return httpClient.DeleteAsync(uri).Result.Content.ReadAsStreamAsync(); + var deleteResult = await httpClient.DeleteAsync(uri); + + return new HttpResponseEntity(deleteResult.Content.ReadAsStreamAsync(), deleteResult.StatusCode); default: throw new ArgumentOutOfRangeException(nameof(method), method, null); } @@ -45,7 +51,7 @@ private static HttpContent ConvertNameValueCollectionToHttpContent( ) { var contentCollectionKeys = collection.AllKeys; - + var contentCollection = contentCollectionKeys .Select(key => new KeyValuePair(key, collection[key])) .ToList(); @@ -54,12 +60,10 @@ private static HttpContent ConvertNameValueCollectionToHttpContent( if (files == null) return formUrlEncodedContent; var multipartContent = new MultipartFormDataContent(); - + foreach (var keyValuePair in contentCollection) - { multipartContent.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); - } - + files .ToList() .ForEach(pair => multipartContent.Add(new StreamContent(pair.Value), "file", pair.Key)); diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index 5266778..900a110 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -9,35 +9,35 @@ public interface Proxy { void Authentication(IClient client); - Stream Execute( + HttpResponseEntity Execute( string uri, NameValueCollection data, RequestMethod method); - Stream Execute( + HttpResponseEntity Execute( string uri, NameValueCollection data, Stream file, RequestMethod method); - Stream Execute( + HttpResponseEntity Execute( string uri, NameValueCollection data, Dictionary files, RequestMethod method); - Task ExecuteAsync( + Task ExecuteAsync( string uri, NameValueCollection data, RequestMethod method); - Task ExecuteAsync( + Task ExecuteAsync( string uri, NameValueCollection data, Stream file, RequestMethod method); - Task ExecuteAsync( + Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index f0c51a2..1713f59 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -23,12 +23,12 @@ public void Authentication(IClient client) authentication = client; } - public Stream Execute(string uri, NameValueCollection data, RequestMethod method) + public HttpResponseEntity Execute(string uri, NameValueCollection data, RequestMethod method) { return Execute(uri, data, new Dictionary(), method); } - public Stream Execute( + public HttpResponseEntity Execute( string uri, NameValueCollection data, Stream file, @@ -37,7 +37,7 @@ public Stream Execute( return Execute(uri, data, new Dictionary { { "file", file } }, method); } - public Stream Execute( + public HttpResponseEntity Execute( string uri, NameValueCollection data, Dictionary files, @@ -57,7 +57,7 @@ public Stream Execute( } } - public async Task ExecuteAsync( + public async Task ExecuteAsync( string uri, NameValueCollection data, RequestMethod method) @@ -65,7 +65,7 @@ public async Task ExecuteAsync( return await ExecuteAsync(uri, data, new Dictionary(), method); } - public async Task ExecuteAsync( + public async Task ExecuteAsync( string uri, NameValueCollection data, Stream file, @@ -74,7 +74,7 @@ public async Task ExecuteAsync( return await ExecuteAsync(uri, data, new Dictionary { { "file", file } }, method); } - public async Task ExecuteAsync( + public async Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, From f0b0da8240054825fe8aac344b324c5008895a13 Mon Sep 17 00:00:00 2001 From: jlabno Date: Mon, 6 Nov 2023 21:46:48 +0100 Subject: [PATCH 065/101] Resolving status from http code --- smsapi/Api/Action/Contacts/BindContactToGroup.cs | 2 +- smsapi/Api/Action/Contacts/DeleteContact.cs | 2 +- smsapi/Api/Action/Contacts/DeleteField.cs | 1 + smsapi/Api/Action/Contacts/DeleteGroup.cs | 1 + smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs | 1 + smsapi/Api/Action/Sender/Add.cs | 1 + smsapi/Api/Action/Sender/Delete.cs | 1 + smsapi/Api/Action/Sender/SetDefault.cs | 1 + smsapi/Api/Response/Contact.cs | 1 + smsapi/Api/Response/Group.cs | 1 + smsapi/Api/Response/GroupPermission.cs | 1 + smsapi/Api/Response/Points.cs | 1 + smsapi/Api/Response/User.cs | 1 + smsapiTests/Contacts/ContactsTest.cs | 1 + smsapiTests/SenderTest.cs | 1 + 15 files changed, 15 insertions(+), 2 deletions(-) diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index e34c75f..42625ff 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -1,5 +1,5 @@ using System; -using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index 207be11..83f5782 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -1,5 +1,5 @@ using System; -using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index 0a2d41d..504969d 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -1,5 +1,6 @@ using System; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index 80ac5da..d25ebc9 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -1,5 +1,6 @@ using System; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index b00b7d0..512f37c 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -1,5 +1,6 @@ using System; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index 4e485ad..d769e21 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -1,5 +1,6 @@ using System.Collections.Specialized; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index 7427dcb..bc7e14a 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -1,5 +1,6 @@ using System.Collections.Specialized; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index b8f4a12..b95d534 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -1,5 +1,6 @@ using System.Collections.Specialized; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Action { diff --git a/smsapi/Api/Response/Contact.cs b/smsapi/Api/Response/Contact.cs index e48748f..4c36644 100644 --- a/smsapi/Api/Response/Contact.cs +++ b/smsapi/Api/Response/Contact.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { diff --git a/smsapi/Api/Response/Group.cs b/smsapi/Api/Response/Group.cs index 3d8ec05..ec6a3a2 100644 --- a/smsapi/Api/Response/Group.cs +++ b/smsapi/Api/Response/Group.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { diff --git a/smsapi/Api/Response/GroupPermission.cs b/smsapi/Api/Response/GroupPermission.cs index 6797d32..dd333cb 100644 --- a/smsapi/Api/Response/GroupPermission.cs +++ b/smsapi/Api/Response/GroupPermission.cs @@ -1,4 +1,5 @@ using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { diff --git a/smsapi/Api/Response/Points.cs b/smsapi/Api/Response/Points.cs index d625f84..3cfb807 100644 --- a/smsapi/Api/Response/Points.cs +++ b/smsapi/Api/Response/Points.cs @@ -1,4 +1,5 @@ using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { diff --git a/smsapi/Api/Response/User.cs b/smsapi/Api/Response/User.cs index 3580553..8919437 100644 --- a/smsapi/Api/Response/User.cs +++ b/smsapi/Api/Response/User.cs @@ -1,4 +1,5 @@ using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { diff --git a/smsapiTests/Contacts/ContactsTest.cs b/smsapiTests/Contacts/ContactsTest.cs index bc6c158..3c62083 100644 --- a/smsapiTests/Contacts/ContactsTest.cs +++ b/smsapiTests/Contacts/ContactsTest.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace smsapiTests.Contacts { diff --git a/smsapiTests/SenderTest.cs b/smsapiTests/SenderTest.cs index c8695a6..0ce9b35 100644 --- a/smsapiTests/SenderTest.cs +++ b/smsapiTests/SenderTest.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Response; +using SMSApi.Api.Response.ResponseResolver; namespace smsapiTests { From 7881429bba60864e24d71f12cf7d536a225419d6 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 7 Nov 2023 13:46:34 +0100 Subject: [PATCH 066/101] Separate deserialization --- smsapi/Api/Action/Base.cs | 144 ++---------------- smsapi/Api/Action/Sender/List.cs | 5 +- smsapi/Api/Action/User/List.cs | 5 +- .../Deserialization/BaseJsonDeserializer.cs | 28 ++++ .../Response/Deserialization/IDeserializer.cs | 7 + .../LegacyJsonResponseDeserializer.cs | 109 +++++++++++++ 6 files changed, 157 insertions(+), 141 deletions(-) create mode 100644 smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs create mode 100644 smsapi/Api/Response/Deserialization/IDeserializer.cs create mode 100644 smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 5a06a1f..04f3b38 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -1,17 +1,16 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Json; using System.Threading.Tasks; using System.Web; -using SMSApi.Api.Response.ResponseResolver; +using SMSApi.Api.Response.Deserialization; namespace SMSApi.Api.Action { public abstract class Base { + private readonly IDeserializer _deserializer = new LegacyJsonResponseDeserializer(); + protected BaseJsonDeserializer BaseJsonDeserializer = new(); private Proxy proxy; protected abstract RequestMethod Method { get; } @@ -33,38 +32,21 @@ public void Proxy(Proxy proxy) this.proxy = proxy; } - protected TT Deserialize(Stream data) - { - TT result; - if (data.Length > 0) - { - data.Position = 0; - var serializer = new DataContractJsonSerializer(typeof(TT)); - result = (TT)serializer.ReadObject(data); - data.Position = 0; - } - else - { - result = Activator.CreateInstance(); - } - - return result; - } - protected virtual Dictionary Files() { return new Dictionary(); } - protected virtual T ResponseToObject(Stream data) + protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding { - return Deserialize(data); + return _deserializer.Deserialize(data); } protected abstract string Uri(); protected virtual void Validate() - { } + { + } protected virtual NameValueCollection Values() { @@ -73,31 +55,7 @@ protected virtual NameValueCollection Values() private T ProcessResponse(HttpResponseEntity responseEntity) { - T response; - Stream data = null; - - try - { - HandleError(responseEntity); - - data = responseEntity.Content.Result; - response = ResponseToObject(data); - } - catch (SerializationException e) - { - //Problem z prasowaniem json'a - throw new HostException(e.Message + " /" + Uri(), HostException.E_JSON_DECODE); - } - catch (Exception e) - { - throw e; - } - finally - { - data?.Close(); - } - - return response; + return ResponseToObject(responseEntity); } private NameValueCollection GetValues() @@ -107,89 +65,5 @@ private NameValueCollection GetValues() ? new NameValueCollection { { "format", "json" }, values } : HttpUtility.ParseQueryString(string.Empty); } - - /** - * 101 Niepoprawne lub brak danych autoryzacji. - * 102 Nieprawidłowy login lub hasło - * 103 Brak punków dla tego użytkownika - * 105 Błędny adres IP - * 110 Usługa nie jest dostępna na danym koncie - * 1000 Akcja dostępna tylko dla użytkownika głównego - * 1001 Nieprawidłowa akcja - */ - private static bool IsClientError(int code) - { - switch (code) - { - case 101: - case 102: - case 103: - case 105: - case 110: - case 1000: - case 1001: - return true; - - default: - return false; - } - } - - /** - * 8 Błąd w odwołaniu - * 666 Wewnętrzny błąd systemu - * 999 Wewnętrzny błąd systemu - * 201 Wewnętrzny błąd systemu - */ - private static bool IsHostError(int code) - { - switch (code) - { - case 8: - case 201: - case 666: - case 999: - return true; - - default: - return false; - } - } - - private void HandleError(HttpResponseEntity responseEntity) - { - if (typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) - { - //TODO resolve code to status - } - - var data = responseEntity.Content.Result; - - data.Position = 0; - - try - { - var error = Deserialize(data); - - if (error.IsError()) - { - if (IsHostError(error.ErrorCode)) - { - throw new HostException(error.GetErrorMessage(), Convert.ToString(error.ErrorCode)); - } - - if (IsClientError(error.ErrorCode)) - { - throw new ClientException(error.GetErrorMessage(), error.ErrorCode); - } - - throw new ActionException(error.GetErrorMessage(), error.ErrorCode); - } - } - catch (SerializationException) - { } - - data.Position = 0; - } } } diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index 4156451..ef613cf 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Collections.Specialized; -using System.IO; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -9,9 +8,9 @@ public class SenderList : Base> { protected override RequestMethod Method => RequestMethod.POST; - protected override Array ResponseToObject(Stream data) + protected override Array ResponseToObject(HttpResponseEntity data) { - return new Array(Deserialize>(data)); + return new Array(BaseJsonDeserializer.Deserialize>(data)); } protected override string Uri() diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index 4e811aa..00d3e2d 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Collections.Specialized; -using System.IO; using SMSApi.Api.Response; namespace SMSApi.Api.Action @@ -9,9 +8,9 @@ public class UserList : Base> { protected override RequestMethod Method => RequestMethod.POST; - protected override Array ResponseToObject(Stream data) + protected override Array ResponseToObject(HttpResponseEntity data) { - return new Array(Deserialize>(data)); + return new Array(BaseJsonDeserializer.Deserialize>(data)); } protected override string Uri() diff --git a/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs new file mode 100644 index 0000000..e4a5c75 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs @@ -0,0 +1,28 @@ +using System; +using System.Runtime.Serialization.Json; + +namespace SMSApi.Api.Response.Deserialization +{ + public class BaseJsonDeserializer : IDeserializer + { + public T Deserialize(HttpResponseEntity responseEntity) + { + T result; + var data = responseEntity.Content.Result; + + if (data.Length > 0) + { + data.Position = 0; + var serializer = new DataContractJsonSerializer(typeof(T)); + result = (T)serializer.ReadObject(data); + data.Position = 0; + } + else + { + result = Activator.CreateInstance(); + } + + return result; + } + } +} diff --git a/smsapi/Api/Response/Deserialization/IDeserializer.cs b/smsapi/Api/Response/Deserialization/IDeserializer.cs new file mode 100644 index 0000000..e574470 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/IDeserializer.cs @@ -0,0 +1,7 @@ +namespace SMSApi.Api.Response.Deserialization +{ + public interface IDeserializer + { + public T Deserialize(HttpResponseEntity responseEntity); + } +} diff --git a/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs new file mode 100644 index 0000000..c9b83d5 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs @@ -0,0 +1,109 @@ +using System; +using System.IO; +using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Deserialization +{ + public class LegacyJsonResponseDeserializer : IDeserializer + { + private readonly BaseJsonDeserializer _baseJsonDeserializer = new(); + + public T Deserialize(HttpResponseEntity responseEntity) + { + T response; + Stream data = null; + + try + { + HandleError(responseEntity); + + data = responseEntity.Content.Result; + response = _baseJsonDeserializer.Deserialize(responseEntity); + } + catch (SerializationException e) + { + throw new HostException(e.Message, HostException.E_JSON_DECODE); + } + catch (Exception e) + { + throw e; + } + finally + { + data?.Close(); + } + + return response; + } + + private void HandleError(HttpResponseEntity responseEntity) + { + try + { + var error = _baseJsonDeserializer.Deserialize(responseEntity); + + if (!error.IsError()) return; + + if (IsHostError(error.ErrorCode)) + throw new HostException(error.GetErrorMessage(), Convert.ToString(error.ErrorCode)); + + if (IsClientError(error.ErrorCode)) + throw new ClientException(error.GetErrorMessage(), error.ErrorCode); + + throw new ActionException(error.GetErrorMessage(), error.ErrorCode); + } + catch (SerializationException) + { + } + } + + /** + * 101 Niepoprawne lub brak danych autoryzacji. + * 102 Nieprawidłowy login lub hasło + * 103 Brak punków dla tego użytkownika + * 105 Błędny adres IP + * 110 Usługa nie jest dostępna na danym koncie + * 1000 Akcja dostępna tylko dla użytkownika głównego + * 1001 Nieprawidłowa akcja + */ + private static bool IsClientError(int code) + { + switch (code) + { + case 101: + case 102: + case 103: + case 105: + case 110: + case 1000: + case 1001: + return true; + + default: + return false; + } + } + + /** + * 8 Błąd w odwołaniu + * 666 Wewnętrzny błąd systemu + * 999 Wewnętrzny błąd systemu + * 201 Wewnętrzny błąd systemu + */ + private static bool IsHostError(int code) + { + switch (code) + { + case 8: + case 201: + case 666: + case 999: + return true; + + default: + return false; + } + } + } +} From e8944b7f4dafd1328b8dd6143897adbf88d79ea4 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 7 Nov 2023 13:55:51 +0100 Subject: [PATCH 067/101] Separate deserialization --- smsapi/Api/Action/Base.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 04f3b38..b1d4b82 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -37,7 +37,7 @@ protected virtual Dictionary Files() return new Dictionary(); } - protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding + protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding, exception will be never thrown { return _deserializer.Deserialize(data); } From 7e595ac58358018884c3504ccc8ce7a065a3c90f Mon Sep 17 00:00:00 2001 From: jakublabno Date: Tue, 7 Nov 2023 15:30:15 +0100 Subject: [PATCH 068/101] Separate deserialization --- .../LegacyJsonResponseDeserializer.cs | 1 - smsapi/ProxyHTTP.cs | 2 +- smsapiTests/Unit/Fixture/ProxyStub.cs | 47 ++++++++++ .../Unit/Helper/DictionaryToStreamHelper.cs | 18 ++++ ...acyResponseDeserializationExceptionTest.cs | 89 +++++++++++++++++++ .../LegacyResponseDeserializationTest.cs | 50 +++++++++++ smsapiTests/Unit/SpyProxy.cs | 28 +++--- 7 files changed, 220 insertions(+), 15 deletions(-) create mode 100644 smsapiTests/Unit/Fixture/ProxyStub.cs create mode 100644 smsapiTests/Unit/Helper/DictionaryToStreamHelper.cs create mode 100644 smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs create mode 100644 smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs diff --git a/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs index c9b83d5..464ff11 100644 --- a/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs @@ -17,7 +17,6 @@ public T Deserialize(HttpResponseEntity responseEntity) try { HandleError(responseEntity); - data = responseEntity.Content.Result; response = _baseJsonDeserializer.Deserialize(responseEntity); } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index 1713f59..c4cfc9f 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -49,7 +49,7 @@ public HttpResponseEntity Execute( try { - return client.SendRequest(method, uri, data, files).GetAwaiter().GetResult(); + return client.SendRequest(method, uri, data, files).Result; } catch (System.Exception e) { diff --git a/smsapiTests/Unit/Fixture/ProxyStub.cs b/smsapiTests/Unit/Fixture/ProxyStub.cs new file mode 100644 index 0000000..0981c1b --- /dev/null +++ b/smsapiTests/Unit/Fixture/ProxyStub.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Threading.Tasks; +using SMSApi.Api; + +namespace smsapiTests.Unit.Fixture; + +public class ProxyStub : Proxy +{ + public HttpResponseEntity SyncExecutionResponse; + + public void Authentication(IClient client) + { + throw new System.NotImplementedException(); + } + + public HttpResponseEntity Execute(string uri, NameValueCollection data, RequestMethod method) + { + throw new System.NotImplementedException(); + } + + public HttpResponseEntity Execute(string uri, NameValueCollection data, Stream file, RequestMethod method) + { + throw new System.NotImplementedException(); + } + + public HttpResponseEntity Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + { + return SyncExecutionResponse; + } + + public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) + { + throw new System.NotImplementedException(); + } + + public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) + { + throw new System.NotImplementedException(); + } + + public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + { + throw new System.NotImplementedException(); + } +} diff --git a/smsapiTests/Unit/Helper/DictionaryToStreamHelper.cs b/smsapiTests/Unit/Helper/DictionaryToStreamHelper.cs new file mode 100644 index 0000000..e90d323 --- /dev/null +++ b/smsapiTests/Unit/Helper/DictionaryToStreamHelper.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace smsapiTests.Unit.Helper; + +public static class DictionaryToStreamHelper +{ + public static Task ToHttpEntityStreamTask(this Dictionary dictionary) + { + var json = JsonConvert.SerializeObject(dictionary); + var bytes = Encoding.ASCII.GetBytes(json); + + return Task.FromResult(new MemoryStream(bytes) as Stream); + } +} diff --git a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs new file mode 100644 index 0000000..5e8db64 --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs @@ -0,0 +1,89 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class LegacyResponseDeserializationExceptionTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + [DynamicData(nameof(ClientErrorCodes), DynamicDataSourceType.Method)] + public void throw_client_exception(int errorCode) + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary errorResponse = new() { { "error", errorCode } }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + errorResponse.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var execution = () => action.Execute(); + + Assert.ThrowsException(execution); + } + + [TestMethod] + [DynamicData(nameof(HostErrorCodes), DynamicDataSourceType.Method)] + public void throw_host_exception(int errorCode) + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary errorResponse = new() { { "error", errorCode } }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + errorResponse.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var execution = () => action.Execute(); + + Assert.ThrowsException(execution); + } + + private static IEnumerable ClientErrorCodes() + { + return new[] + { + new object[] {101}, + new object[] {102}, + new object[] {103}, + new object[] {105}, + new object[] {110}, + new object[] {1000}, + new object[] {1001}, + }; + } + + private static IEnumerable HostErrorCodes() + { + return new[] + { + new object[] {8}, + new object[] {201}, + new object[] {666}, + new object[] {999}, + }; + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override string Uri() + { + return ""; + } + } + + private class BaseResponse : ErrorAwareResponse + { + } +} diff --git a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs new file mode 100644 index 0000000..91d05e4 --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Net; +using System.Runtime.Serialization; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class LegacyResponseDeserializationTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void map_response_to_object() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + var testValue = "test value"; + Dictionary errorResponse = new() { { "TestProperty", testValue } }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + errorResponse.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var result = action.Execute(); + + Assert.AreEqual(testValue, result.TestProperty); + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override string Uri() + { + return ""; + } + } + + [DataContract] + private class BaseResponse : ErrorAwareResponse + { + [DataMember] public string TestProperty; + } +} \ No newline at end of file diff --git a/smsapiTests/Unit/SpyProxy.cs b/smsapiTests/Unit/SpyProxy.cs index b09fcbe..a1bed6f 100644 --- a/smsapiTests/Unit/SpyProxy.cs +++ b/smsapiTests/Unit/SpyProxy.cs @@ -1,7 +1,9 @@ +using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; +using System.Net; using System.Threading.Tasks; using SMSApi.Api; @@ -18,52 +20,52 @@ public void Authentication(IClient client) throw new System.NotImplementedException(); } - public Stream Execute(string uri, NameValueCollection data, RequestMethod method) + public HttpResponseEntity Execute(string uri, NameValueCollection data, RequestMethod method) { RequestedUri = uri; SetParameters(data); - - return new MemoryStream(); + + return new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK); } - public Stream Execute(string uri, NameValueCollection data, Stream file, RequestMethod method) + public HttpResponseEntity Execute(string uri, NameValueCollection data, Stream file, RequestMethod method) { RequestedUri = uri; SetParameters(data); - return new MemoryStream(); + return new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK); } - public Stream Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + public HttpResponseEntity Execute(string uri, NameValueCollection data, Dictionary files, RequestMethod method) { RequestedUri = uri; SetParameters(data); - return new MemoryStream(); + return new HttpResponseEntity(); } - public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) { RequestedUri = uri; SetParameters(data); - return new Task(null); + return new Task(() => new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK)); } - public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) { RequestedUri = uri; SetParameters(data); - return new Task(null); + return new Task(() => new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK)); } - public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) { RequestedUri = uri; SetParameters(data); - return new Task(null); + return new Task(null); } private void SetParameters(NameValueCollection collection) From 8242b3f425799e802d17e00a348fb74c803c551f Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 14:00:48 +0100 Subject: [PATCH 069/101] Map http status codes to custom actions' exceptions --- smsapi/Api/Action/ApiType.cs | 8 ++ smsapi/Api/Action/Base.cs | 21 +++- smsapi/Api/Action/Sender/List.cs | 7 +- smsapi/Api/Action/User/List.cs | 7 +- .../Deserialization/BaseJsonDeserializer.cs | 7 +- .../Deserialization/DeserializationResult.cs | 23 +++++ .../DeserializationExceptionManager.cs | 21 ++++ .../Response/Deserialization/IDeserializer.cs | 2 +- .../LegacyJsonResponseDeserializer.cs | 37 ++++--- .../RestJsonResponseDeserializer.cs | 36 +++++++ .../ResponseCodeAwareResolver.cs | 2 +- .../RestJsonResponseDeserializerTest.cs | 98 +++++++++++++++++++ 12 files changed, 247 insertions(+), 22 deletions(-) create mode 100644 smsapi/Api/Action/ApiType.cs create mode 100644 smsapi/Api/Response/Deserialization/DeserializationResult.cs create mode 100644 smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs create mode 100644 smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs create mode 100644 smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs diff --git a/smsapi/Api/Action/ApiType.cs b/smsapi/Api/Action/ApiType.cs new file mode 100644 index 0000000..c1faac9 --- /dev/null +++ b/smsapi/Api/Action/ApiType.cs @@ -0,0 +1,8 @@ +namespace SMSApi.Api.Action +{ + public enum ApiType + { + Legacy, + Rest, + } +} diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index b1d4b82..7c44753 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -4,17 +4,19 @@ using System.Threading.Tasks; using System.Web; using SMSApi.Api.Response.Deserialization; +using smsapi.Api.Response.Deserialization.Exception; namespace SMSApi.Api.Action { public abstract class Base { - private readonly IDeserializer _deserializer = new LegacyJsonResponseDeserializer(); - protected BaseJsonDeserializer BaseJsonDeserializer = new(); + protected BaseJsonDeserializer BaseJsonDeserializer = new();//TODO remove after further refactor private Proxy proxy; protected abstract RequestMethod Method { get; } + protected virtual ApiType ApiType() => Action.ApiType.Legacy; + public T Execute() { Validate(); @@ -37,9 +39,20 @@ protected virtual Dictionary Files() return new Dictionary(); } - protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding, exception will be never thrown + protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding { - return _deserializer.Deserialize(data); + IDeserializer deserializer = ApiType() switch + { + Action.ApiType.Rest => new RestJsonResponseDeserializer(new LegacyJsonResponseDeserializer()), + Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), + _ => throw new Exception("Unknown api type") + }; + + var deserializationResult = deserializer.Deserialize(data); + + deserializationResult.ThrowErrors(); + + return deserializationResult.Result; } protected abstract string Uri(); diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index ef613cf..e86bc40 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Collections.Specialized; using SMSApi.Api.Response; +using SMSApi.Api.Response.Deserialization; +using smsapi.Api.Response.Deserialization.Exception; namespace SMSApi.Api.Action { @@ -10,7 +12,10 @@ public class SenderList : Base> protected override Array ResponseToObject(HttpResponseEntity data) { - return new Array(BaseJsonDeserializer.Deserialize>(data)); + var result = BaseJsonDeserializer.Deserialize>(data); + result.ThrowErrors(); + + return new Array(result.Result); } protected override string Uri() diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index 00d3e2d..d87e3a7 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Collections.Specialized; using SMSApi.Api.Response; +using SMSApi.Api.Response.Deserialization; +using smsapi.Api.Response.Deserialization.Exception; namespace SMSApi.Api.Action { @@ -10,7 +12,10 @@ public class UserList : Base> protected override Array ResponseToObject(HttpResponseEntity data) { - return new Array(BaseJsonDeserializer.Deserialize>(data)); + var result = BaseJsonDeserializer.Deserialize>(data); + result.ThrowErrors(); + + return new Array(result.Result); } protected override string Uri() diff --git a/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs index e4a5c75..4af6e23 100644 --- a/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs @@ -5,7 +5,7 @@ namespace SMSApi.Api.Response.Deserialization { public class BaseJsonDeserializer : IDeserializer { - public T Deserialize(HttpResponseEntity responseEntity) + public DeserializationResult Deserialize(HttpResponseEntity responseEntity) { T result; var data = responseEntity.Content.Result; @@ -22,7 +22,10 @@ public T Deserialize(HttpResponseEntity responseEntity) result = Activator.CreateInstance(); } - return result; + var deserializationResult = new DeserializationResult(); + deserializationResult.Result = result; + + return deserializationResult; } } } diff --git a/smsapi/Api/Response/Deserialization/DeserializationResult.cs b/smsapi/Api/Response/Deserialization/DeserializationResult.cs new file mode 100644 index 0000000..1d6f555 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/DeserializationResult.cs @@ -0,0 +1,23 @@ +#nullable enable +namespace SMSApi.Api.Response.Deserialization +{ + public class DeserializationResult + { + public T? Result; + public ResponseError? ClientError; + public ResponseError? HostError; + public ResponseError? ActionError; + } + + public readonly struct ResponseError + { + public readonly string Message; + public readonly int Code; + + public ResponseError(string message, int code) + { + Message = message; + Code = code; + } + } +} diff --git a/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs b/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs new file mode 100644 index 0000000..cbf3cbb --- /dev/null +++ b/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs @@ -0,0 +1,21 @@ +using System; +using SMSApi.Api; +using SMSApi.Api.Response.Deserialization; + +namespace smsapi.Api.Response.Deserialization.Exception +{ + public static class DeserializationExceptionManager + { + public static void ThrowErrors(this DeserializationResult dr) + { + if (dr.ClientError != null) + throw new ClientException(dr.ClientError.Value.Message, dr.ClientError.Value.Code); + + if (dr.HostError != null) + throw new HostException(dr.HostError.Value.Message, Convert.ToString(dr.HostError.Value.Code)); + + if (dr.ActionError != null) + throw new HostException(dr.ActionError.Value.Message, Convert.ToString(dr.ActionError.Value.Code)); + } + } +} diff --git a/smsapi/Api/Response/Deserialization/IDeserializer.cs b/smsapi/Api/Response/Deserialization/IDeserializer.cs index e574470..ba3416f 100644 --- a/smsapi/Api/Response/Deserialization/IDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/IDeserializer.cs @@ -2,6 +2,6 @@ namespace SMSApi.Api.Response.Deserialization { public interface IDeserializer { - public T Deserialize(HttpResponseEntity responseEntity); + public DeserializationResult Deserialize(HttpResponseEntity responseEntity); } } diff --git a/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs index 464ff11..ea08844 100644 --- a/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/LegacyJsonResponseDeserializer.cs @@ -1,6 +1,7 @@ -using System; +#nullable enable using System.IO; using System.Runtime.Serialization; +using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response.Deserialization @@ -9,14 +10,17 @@ public class LegacyJsonResponseDeserializer : IDeserializer { private readonly BaseJsonDeserializer _baseJsonDeserializer = new(); - public T Deserialize(HttpResponseEntity responseEntity) + public DeserializationResult Deserialize(HttpResponseEntity responseEntity) { - T response; - Stream data = null; - + DeserializationResult response; + Stream? data = null; + try { - HandleError(responseEntity); + var errorDeserializationResult = new DeserializationResult(); + HandleError(responseEntity, errorDeserializationResult); + errorDeserializationResult.ThrowErrors(); + data = responseEntity.Content.Result; response = _baseJsonDeserializer.Deserialize(responseEntity); } @@ -36,21 +40,30 @@ public T Deserialize(HttpResponseEntity responseEntity) return response; } - private void HandleError(HttpResponseEntity responseEntity) + private void HandleError(HttpResponseEntity responseEntity, DeserializationResult deserializationResult) { try { - var error = _baseJsonDeserializer.Deserialize(responseEntity); + var error = _baseJsonDeserializer.Deserialize(responseEntity).Result; if (!error.IsError()) return; - + if (IsHostError(error.ErrorCode)) - throw new HostException(error.GetErrorMessage(), Convert.ToString(error.ErrorCode)); + { + deserializationResult.HostError = + new ResponseError(error.GetErrorMessage(), error.ErrorCode); + return; + } if (IsClientError(error.ErrorCode)) - throw new ClientException(error.GetErrorMessage(), error.ErrorCode); + { + deserializationResult.ClientError = + new ResponseError(error.GetErrorMessage(), error.ErrorCode); + return; + } - throw new ActionException(error.GetErrorMessage(), error.ErrorCode); + deserializationResult.ActionError = + new ResponseError(error.GetErrorMessage(), error.ErrorCode); } catch (SerializationException) { diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs new file mode 100644 index 0000000..af6098b --- /dev/null +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Deserialization +{ + public class RestJsonResponseDeserializer : IDeserializer + { + private readonly LegacyJsonResponseDeserializer legacyJsonResponseDeserializer; + + public RestJsonResponseDeserializer(LegacyJsonResponseDeserializer legacyJsonResponseDeserializer) + { + this.legacyJsonResponseDeserializer = legacyJsonResponseDeserializer; + } + + public DeserializationResult Deserialize(HttpResponseEntity responseEntity) + { + if (!typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) + throw new Exception("Deserialization from non-rest response"); + + var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); + var responseStatusCode = (int)responseEntity.StatusCode; + + var matchedExceptions = responseObject.CodeToException() + .Where(pair => pair.Key.Equals(responseStatusCode)) + .ToHashSet(); + + if (matchedExceptions.Count > 0) + { + matchedExceptions.First().Value.Invoke(); + } + + return legacyJsonResponseDeserializer.Deserialize(responseEntity); + } + } +} diff --git a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs index b2aa154..41f5f0d 100644 --- a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs +++ b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs @@ -4,6 +4,6 @@ namespace SMSApi.Api.Response.ResponseResolver { public interface IResponseCodeAwareResolver: IErrorResponse { - public Dictionary GetCodeErrorMap(); + public Dictionary CodeToException(); } } diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs new file mode 100644 index 0000000..05c6ffd --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Runtime.Serialization; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class RestJsonResponseDeserializerTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void throw_custom_action_exception() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary response = new(); + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.RequestTimeout + ); + + var execution = () => action.Execute(); + + var expectedMessage = "expired"; + Assert.ThrowsException(execution, expectedMessage); + } + + [TestMethod] + public void deserialize_to_object_when_no_exception_mapper_found() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary response = new() {{"TestProperty", "abc"}}; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var result = action.Execute(); + + Assert.AreEqual("abc", result.TestProperty); + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override ApiType ApiType() + { + return SMSApi.Api.Action.ApiType.Rest; + } + + protected override string Uri() + { + return ""; + } + } + + [DataContract] + private class ResponseWithExceptionMapper : IResponseCodeAwareResolver + { + [DataMember] + public String TestProperty; + + public bool IsError() + { + throw new NotImplementedException(); + } + + public string GetErrorMessage() + { + throw new NotImplementedException(); + } + + public Dictionary CodeToException() + { + return new Dictionary + { + { 408, () => throw new CustomException("expired", 408) } + }; + } + } + + private class CustomException : ClientException + { + public CustomException(string message, int code) : base(message, code) + { + } + } +} From 56f5838a041374c5371a71d100a869ee9669c25a Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 14:04:18 +0100 Subject: [PATCH 070/101] Map http status codes to custom actions' exceptions --- .../Exception/DeserializationExceptionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs b/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs index cbf3cbb..d362b35 100644 --- a/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs +++ b/smsapi/Api/Response/Deserialization/Exception/DeserializationExceptionManager.cs @@ -15,7 +15,7 @@ public static void ThrowErrors(this DeserializationResult dr) throw new HostException(dr.HostError.Value.Message, Convert.ToString(dr.HostError.Value.Code)); if (dr.ActionError != null) - throw new HostException(dr.ActionError.Value.Message, Convert.ToString(dr.ActionError.Value.Code)); + throw new ActionException(dr.ActionError.Value.Message, dr.ActionError.Value.Code); } } } From a7766522fb0bb105a347c733e6f2180aadfdfc44 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 16:31:57 +0100 Subject: [PATCH 071/101] Map REST validation exceptions --- .../Exception/ValidationException.cs | 23 ++++++ .../RestJsonResponseDeserializer.cs | 51 ++++++------ .../ValidationErrorsResolver.cs | 51 ++++++++++++ .../ResponseResolver/IErrorResponse.cs | 2 - .../ResponseCodeAwareResolver.cs | 4 +- .../RestJsonResponseDeserializerTest.cs | 26 ++----- ...esponseDeserializerValidationErrorsTest.cs | 77 +++++++++++++++++++ 7 files changed, 190 insertions(+), 44 deletions(-) create mode 100644 smsapi/Api/Response/Deserialization/Exception/ValidationException.cs create mode 100644 smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs create mode 100644 smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs diff --git a/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs b/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs new file mode 100644 index 0000000..310c80a --- /dev/null +++ b/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs @@ -0,0 +1,23 @@ +using System.Linq; +using SMSApi.Api; +using SMSApi.Api.Response.Deserialization; + +namespace smsapi.Api.Response.Deserialization.Exception; + +public class ValidationException : ClientException +{ + private ValidationException(string message) : base(message, 400) + { + } + + public static ValidationException Create(ValidationErrorsResolver.ValidationErrors validationErrors) + { + var errorMessages = validationErrors.Errors + .Select(error => $"{error.Error}: {error.Message}") + .ToList(); + + var errorMessage = string.Join(", ", errorMessages); + + return new ValidationException(errorMessage); + } +} diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index af6098b..3a62290 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -2,35 +2,40 @@ using System.Linq; using SMSApi.Api.Response.ResponseResolver; -namespace SMSApi.Api.Response.Deserialization +namespace SMSApi.Api.Response.Deserialization; + +public class RestJsonResponseDeserializer : IDeserializer { - public class RestJsonResponseDeserializer : IDeserializer - { - private readonly LegacyJsonResponseDeserializer legacyJsonResponseDeserializer; + private readonly ValidationErrorsResolver validationErrorsResolver; + private readonly LegacyJsonResponseDeserializer legacyJsonResponseDeserializer; - public RestJsonResponseDeserializer(LegacyJsonResponseDeserializer legacyJsonResponseDeserializer) - { - this.legacyJsonResponseDeserializer = legacyJsonResponseDeserializer; - } + public RestJsonResponseDeserializer( + LegacyJsonResponseDeserializer legacyJsonResponseDeserializer, + ValidationErrorsResolver validationErrorsResolver + ) + { + this.legacyJsonResponseDeserializer = legacyJsonResponseDeserializer; + this.validationErrorsResolver = validationErrorsResolver; + } - public DeserializationResult Deserialize(HttpResponseEntity responseEntity) - { - if (!typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) - throw new Exception("Deserialization from non-rest response"); + public DeserializationResult Deserialize(HttpResponseEntity responseEntity) + { + if (!typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) + throw new Exception("Deserialization from non-rest response"); - var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); - var responseStatusCode = (int)responseEntity.StatusCode; + var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); + var responseStatusCode = (int)responseEntity.StatusCode; + + var exceptionsMatchers = + responseObject.HandleExceptionActions() + .Concat(validationErrorsResolver.HandleExceptionActions()); - var matchedExceptions = responseObject.CodeToException() - .Where(pair => pair.Key.Equals(responseStatusCode)) - .ToHashSet(); + var matchedExceptions = exceptionsMatchers + .Where(pair => pair.Key.Equals(responseStatusCode)) + .ToHashSet(); - if (matchedExceptions.Count > 0) - { - matchedExceptions.First().Value.Invoke(); - } + if (matchedExceptions.Count > 0) matchedExceptions.First().Value.Invoke(responseEntity.Content.Result); - return legacyJsonResponseDeserializer.Deserialize(responseEntity); - } + return legacyJsonResponseDeserializer.Deserialize(responseEntity); } } diff --git a/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs b/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs new file mode 100644 index 0000000..a7b95cb --- /dev/null +++ b/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Runtime.Serialization; +using System.Threading.Tasks; +using smsapi.Api.Response.Deserialization.Exception; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Deserialization; + +public class ValidationErrorsResolver : IResponseCodeAwareResolver +{ + private readonly BaseJsonDeserializer baseJsonDeserializer; + + public ValidationErrorsResolver(BaseJsonDeserializer baseJsonDeserializer) + { + this.baseJsonDeserializer = baseJsonDeserializer; + } + + public Dictionary> HandleExceptionActions() + { + return new Dictionary> + { + { 400, ResolveErrors } + }; + } + + private void ResolveErrors(Stream stream) + { + var validationErrors = baseJsonDeserializer.Deserialize( + new HttpResponseEntity(Task.FromResult(stream), HttpStatusCode.BadRequest) + ).Result; + + throw ValidationException.Create(validationErrors); + } + + [DataContract] + public readonly struct ValidationErrors + { + [DataMember(Name = "errors")] public readonly IEnumerable Errors; + } + + [DataContract] + public readonly struct ValidationError + { + [DataMember(Name = "message")] public readonly string Message; + + [DataMember(Name = "error")] public readonly string Error; + } +} diff --git a/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs b/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs index 28d7e3b..ee75f66 100644 --- a/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs +++ b/smsapi/Api/Response/ResponseResolver/IErrorResponse.cs @@ -2,7 +2,5 @@ namespace SMSApi.Api.Response.ResponseResolver { public interface IErrorResponse { - public bool IsError(); - public string GetErrorMessage(); } } diff --git a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs index 41f5f0d..26a528f 100644 --- a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs +++ b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs @@ -1,9 +1,11 @@ +using System; using System.Collections.Generic; +using System.IO; namespace SMSApi.Api.Response.ResponseResolver { public interface IResponseCodeAwareResolver: IErrorResponse { - public Dictionary CodeToException(); + public Dictionary> HandleExceptionActions() => new(); } } diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs index 05c6ffd..df9b9ce 100644 --- a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Net; using System.Runtime.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -32,20 +33,20 @@ public void throw_custom_action_exception() var expectedMessage = "expired"; Assert.ThrowsException(execution, expectedMessage); } - + [TestMethod] public void deserialize_to_object_when_no_exception_mapper_found() { var action = new TestAction(); action.Proxy(_proxyStub); - Dictionary response = new() {{"TestProperty", "abc"}}; + Dictionary response = new() { { "TestProperty", "abc" } }; _proxyStub.SyncExecutionResponse = new HttpResponseEntity( response.ToHttpEntityStreamTask(), HttpStatusCode.OK ); var result = action.Execute(); - + Assert.AreEqual("abc", result.TestProperty); } @@ -67,24 +68,13 @@ protected override string Uri() [DataContract] private class ResponseWithExceptionMapper : IResponseCodeAwareResolver { - [DataMember] - public String TestProperty; - - public bool IsError() - { - throw new NotImplementedException(); - } - - public string GetErrorMessage() - { - throw new NotImplementedException(); - } + [DataMember] public string TestProperty; - public Dictionary CodeToException() + public Dictionary> HandleExceptionActions() { - return new Dictionary + return new Dictionary> { - { 408, () => throw new CustomException("expired", 408) } + { 408, _ => throw new CustomException("expired", 408) } }; } } diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs new file mode 100644 index 0000000..71602a6 --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using smsapi.Api.Response.Deserialization.Exception; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class RestJsonResponseDeserializerValidationErrorsTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void map_validation_errors_to_message() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary response = new() + { + { + "message", "The value is not valid mobile number." + }, + { + "error", "invalid_request_data" + }, + { + "errors", new List> + { + new() + { + { + "message", "The value is not valid mobile number." + }, + { + "error", "invalid_request_data" + } + } + } + } + }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.BadRequest + ); + + var execution = () => action.Execute(); + + var exception = Assert.ThrowsException(execution); + var expectedMessage = "invalid_request_data: The value is not valid mobile number."; + Assert.AreEqual(expectedMessage, exception.Message); + Assert.AreEqual("400", exception.Code); + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override ApiType ApiType() + { + return SMSApi.Api.Action.ApiType.Rest; + } + + protected override string Uri() + { + return ""; + } + } + + private class ResponseWithExceptionMapper : IResponseCodeAwareResolver + { + } +} From 0d2e6a70bb8e48645e8ea21b6512ab84f1fe9d3b Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 17:53:51 +0100 Subject: [PATCH 072/101] Creating MFA code --- smsapi/Api/Action/MFA/VerifyMFACode.cs | 34 +++++++++++++++++++ smsapi/Api/MFAFactory.cs | 27 +++++++++++++++ .../Api/Response/MFA/MFACreationResponse.cs | 16 +++++++++ 3 files changed, 77 insertions(+) create mode 100644 smsapi/Api/Action/MFA/VerifyMFACode.cs create mode 100644 smsapi/Api/MFAFactory.cs create mode 100644 smsapi/Api/Response/MFA/MFACreationResponse.cs diff --git a/smsapi/Api/Action/MFA/VerifyMFACode.cs b/smsapi/Api/Action/MFA/VerifyMFACode.cs new file mode 100644 index 0000000..ae2aca2 --- /dev/null +++ b/smsapi/Api/Action/MFA/VerifyMFACode.cs @@ -0,0 +1,34 @@ +using System.Collections.Specialized; +using SMSApi.Api.Response.MFA; + +namespace SMSApi.Api.Action.MFA; + +public class VerifyMFACode : Base +{ + private readonly string code; + private readonly string phoneNumber; + + public VerifyMFACode(string phoneNumber, string code) + { + this.phoneNumber = phoneNumber; + this.code = code; + } + + protected override RequestMethod Method => RequestMethod.POST; + + + protected override ApiType ApiType() + { + return Action.ApiType.Rest; + } + + protected override string Uri() + { + return "mfa/codes/verifications"; + } + + protected override NameValueCollection Values() + { + return new NameValueCollection { { "phone_number", phoneNumber }, { "code", code } }; + } +} diff --git a/smsapi/Api/MFAFactory.cs b/smsapi/Api/MFAFactory.cs new file mode 100644 index 0000000..0c6d0b2 --- /dev/null +++ b/smsapi/Api/MFAFactory.cs @@ -0,0 +1,27 @@ +using SMSApi.Api.Action.MFA; + +namespace SMSApi.Api +{ + public class MFAFactory : Factory + { + public MFAFactory(ProxyAddress address = ProxyAddress.SmsApiIo) + : base(address) + { } + + public MFAFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) + : base(client, address) + { } + + public MFAFactory(IClient client, Proxy proxy) + : base(client, proxy) + { } + + public CreateMFACode CreateMfaCode(string phoneNumber) + { + var action = new CreateMFACode(phoneNumber); + action.Proxy(proxy); + + return action; + } + } +} diff --git a/smsapi/Api/Response/MFA/MFACreationResponse.cs b/smsapi/Api/Response/MFA/MFACreationResponse.cs new file mode 100644 index 0000000..efdd356 --- /dev/null +++ b/smsapi/Api/Response/MFA/MFACreationResponse.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.MFA; + +[DataContract] +public class MFACreationResponse : IResponseCodeAwareResolver +{ + [DataMember(Name = "code")] public readonly string Code; + + [DataMember(Name = "from")] public readonly string From; + + [DataMember(Name = "id")] public readonly string Id; + + [DataMember(Name = "phone_number")] public readonly string PhoneNumber; +} From 45dbc9cdf12106f986c33a0eed9ec39954a2a391 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 18:09:47 +0100 Subject: [PATCH 073/101] MFA actions --- smsapi/Api/Action/MFA/CreateMFACode.cs | 66 +++++++++++++++++++ smsapi/Api/Action/MFA/VerifyMFACode.cs | 5 +- smsapi/Api/MFAFactory.cs | 8 +++ .../Response/MFA/MFAVerificationResponse.cs | 32 +++++++++ 4 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 smsapi/Api/Action/MFA/CreateMFACode.cs create mode 100644 smsapi/Api/Response/MFA/MFAVerificationResponse.cs diff --git a/smsapi/Api/Action/MFA/CreateMFACode.cs b/smsapi/Api/Action/MFA/CreateMFACode.cs new file mode 100644 index 0000000..afbee25 --- /dev/null +++ b/smsapi/Api/Action/MFA/CreateMFACode.cs @@ -0,0 +1,66 @@ +using System.Collections.Specialized; +using SMSApi.Api.Response.MFA; + +namespace SMSApi.Api.Action.MFA; + +public class CreateMFACode : Base +{ + private readonly string phoneNumber; + private string content; + private bool fast; + private string from; + + public CreateMFACode(string phoneNumber) + { + this.phoneNumber = phoneNumber; + } + + protected override RequestMethod Method => RequestMethod.POST; + + public CreateMFACode AsFast() + { + fast = true; + + return this; + } + + public CreateMFACode FromSendername(string sendername) + { + from = sendername; + + return this; + } + + public CreateMFACode WithContent(string content) + { + this.content = content; + + return this; + } + + protected override ApiType ApiType() + { + return Action.ApiType.Rest; + } + + protected override string Uri() + { + return "mfa/codes"; + } + + protected override NameValueCollection Values() + { + var parameters = new NameValueCollection { { "phone_number", phoneNumber } }; + + if (content != null) + parameters.Add("content", content); + + if (fast) + parameters.Add("fast", "1"); + + if (from != null) + parameters.Add("from", from); + + return parameters; + } +} diff --git a/smsapi/Api/Action/MFA/VerifyMFACode.cs b/smsapi/Api/Action/MFA/VerifyMFACode.cs index ae2aca2..3139749 100644 --- a/smsapi/Api/Action/MFA/VerifyMFACode.cs +++ b/smsapi/Api/Action/MFA/VerifyMFACode.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action.MFA; -public class VerifyMFACode : Base +public class VerifyMFACode : Base { private readonly string code; private readonly string phoneNumber; @@ -15,8 +15,7 @@ public VerifyMFACode(string phoneNumber, string code) } protected override RequestMethod Method => RequestMethod.POST; - - + protected override ApiType ApiType() { return Action.ApiType.Rest; diff --git a/smsapi/Api/MFAFactory.cs b/smsapi/Api/MFAFactory.cs index 0c6d0b2..bc8be9d 100644 --- a/smsapi/Api/MFAFactory.cs +++ b/smsapi/Api/MFAFactory.cs @@ -23,5 +23,13 @@ public CreateMFACode CreateMfaCode(string phoneNumber) return action; } + + public VerifyMFACode VerifyMfaCode(string phoneNumber, string code) + { + var action = new VerifyMFACode(phoneNumber, code); + action.Proxy(proxy); + + return action; + } } } diff --git a/smsapi/Api/Response/MFA/MFAVerificationResponse.cs b/smsapi/Api/Response/MFA/MFAVerificationResponse.cs new file mode 100644 index 0000000..961b1c7 --- /dev/null +++ b/smsapi/Api/Response/MFA/MFAVerificationResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.IO; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.MFA; + +public class MFAVerificationResponse : IResponseCodeAwareResolver +{ + public Dictionary> HandleExceptionActions() + { + return new Dictionary> + { + { 404, _ => throw new InvalidVerificationCodeException() }, + { 408, _ => throw new ExpiredVerificationCode() }, + }; + } + + public class InvalidVerificationCodeException : ClientException + { + public InvalidVerificationCodeException() : base("Invalid verification code", 404) + { + } + } + + public class ExpiredVerificationCode : ClientException + { + public ExpiredVerificationCode() : base("Verification code has expired", 408) + { + } + } +} From ae06ce0b6ffdf3195cf2120d99066964de9a8f4d Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 18:22:31 +0100 Subject: [PATCH 074/101] Handle standard REST http codes --- .../RestJsonResponseDeserializer.cs | 10 +++++--- .../TooManyRequestsErrorResolver.cs | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index 3a62290..c430c71 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -8,14 +8,17 @@ public class RestJsonResponseDeserializer : IDeserializer { private readonly ValidationErrorsResolver validationErrorsResolver; private readonly LegacyJsonResponseDeserializer legacyJsonResponseDeserializer; + private readonly TooManyRequestsErrorResolver tooManyRequestsErrorResolver; public RestJsonResponseDeserializer( LegacyJsonResponseDeserializer legacyJsonResponseDeserializer, - ValidationErrorsResolver validationErrorsResolver + ValidationErrorsResolver validationErrorsResolver, + TooManyRequestsErrorResolver tooManyRequestsErrorResolver ) { this.legacyJsonResponseDeserializer = legacyJsonResponseDeserializer; this.validationErrorsResolver = validationErrorsResolver; + this.tooManyRequestsErrorResolver = tooManyRequestsErrorResolver; } public DeserializationResult Deserialize(HttpResponseEntity responseEntity) @@ -25,10 +28,11 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); var responseStatusCode = (int)responseEntity.StatusCode; - + var exceptionsMatchers = responseObject.HandleExceptionActions() - .Concat(validationErrorsResolver.HandleExceptionActions()); + .Concat(validationErrorsResolver.HandleExceptionActions()) + .Concat(tooManyRequestsErrorResolver.HandleExceptionActions()); var matchedExceptions = exceptionsMatchers .Where(pair => pair.Key.Equals(responseStatusCode)) diff --git a/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs b/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs new file mode 100644 index 0000000..5eaca12 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Deserialization; + +public class TooManyRequestsErrorResolver : IResponseCodeAwareResolver +{ + public Dictionary> HandleExceptionActions() + { + return new Dictionary> + { + { 429, _ => throw new TooManyRequestsException() } + }; + } + + public class TooManyRequestsException : ClientException + { + public TooManyRequestsException() : base("Too many requests", 429) + { + } + } +} From 03713c405796a2901e23d9fc0637e065aa108b68 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 18:24:34 +0100 Subject: [PATCH 075/101] Handle standard REST http codes --- smsapi/Api/Action/Base.cs | 118 ++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index 7c44753..a2de78a 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -6,77 +6,83 @@ using SMSApi.Api.Response.Deserialization; using smsapi.Api.Response.Deserialization.Exception; -namespace SMSApi.Api.Action +namespace SMSApi.Api.Action; + +public abstract class Base { - public abstract class Base - { - protected BaseJsonDeserializer BaseJsonDeserializer = new();//TODO remove after further refactor - private Proxy proxy; + protected BaseJsonDeserializer BaseJsonDeserializer = new(); //TODO remove after further refactor + private Proxy proxy; - protected abstract RequestMethod Method { get; } + protected abstract RequestMethod Method { get; } - protected virtual ApiType ApiType() => Action.ApiType.Legacy; + protected virtual ApiType ApiType() + { + return Action.ApiType.Legacy; + } - public T Execute() - { - Validate(); - return ProcessResponse(proxy.Execute(Uri(), GetValues(), Files(), Method)); - } + public T Execute() + { + Validate(); + return ProcessResponse(proxy.Execute(Uri(), GetValues(), Files(), Method)); + } - public async Task ExecuteAsync() - { - Validate(); - return ProcessResponse(await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); - } + public async Task ExecuteAsync() + { + Validate(); + return ProcessResponse(await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); + } - public void Proxy(Proxy proxy) - { - this.proxy = proxy; - } + public void Proxy(Proxy proxy) + { + this.proxy = proxy; + } - protected virtual Dictionary Files() - { - return new Dictionary(); - } + protected virtual Dictionary Files() + { + return new Dictionary(); + } - protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding + protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding + { + IDeserializer deserializer = ApiType() switch { - IDeserializer deserializer = ApiType() switch - { - Action.ApiType.Rest => new RestJsonResponseDeserializer(new LegacyJsonResponseDeserializer()), - Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), - _ => throw new Exception("Unknown api type") - }; + Action.ApiType.Rest => new RestJsonResponseDeserializer( + new LegacyJsonResponseDeserializer(), + new ValidationErrorsResolver(new BaseJsonDeserializer()), + new TooManyRequestsErrorResolver() + ), + Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), + _ => throw new Exception("Unknown api type") + }; - var deserializationResult = deserializer.Deserialize(data); - - deserializationResult.ThrowErrors(); + var deserializationResult = deserializer.Deserialize(data); - return deserializationResult.Result; - } + deserializationResult.ThrowErrors(); - protected abstract string Uri(); + return deserializationResult.Result; + } - protected virtual void Validate() - { - } + protected abstract string Uri(); - protected virtual NameValueCollection Values() - { - return new NameValueCollection(); - } + protected virtual void Validate() + { + } - private T ProcessResponse(HttpResponseEntity responseEntity) - { - return ResponseToObject(responseEntity); - } + protected virtual NameValueCollection Values() + { + return new NameValueCollection(); + } - private NameValueCollection GetValues() - { - var values = Values(); - return values.Count > 0 - ? new NameValueCollection { { "format", "json" }, values } - : HttpUtility.ParseQueryString(string.Empty); - } + private T ProcessResponse(HttpResponseEntity responseEntity) + { + return ResponseToObject(responseEntity); + } + + private NameValueCollection GetValues() + { + var values = Values(); + return values.Count > 0 + ? new NameValueCollection { { "format", "json" }, values } + : HttpUtility.ParseQueryString(string.Empty); } } From b73d4c1e166caa29e8a7a66be36a293828f0d3dc Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 18:26:39 +0100 Subject: [PATCH 076/101] Handle standard REST http codes --- .../TooManyRequestsResponseTest.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs diff --git a/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs new file mode 100644 index 0000000..61b81cf --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using SMSApi.Api.Response.Deserialization; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class TooManyRequestsResponseTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void map_validation_errors_to_message() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary response = new(); + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.TooManyRequests + ); + + var execution = () => action.Execute(); + + Assert.ThrowsException(execution); + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override ApiType ApiType() + { + return SMSApi.Api.Action.ApiType.Rest; + } + + protected override string Uri() + { + return ""; + } + } + + private class ResponseWithExceptionMapper : IResponseCodeAwareResolver + { + } +} From a2cddb40d8d7702f4b764edf4138dff5ed0b0736 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 19:16:39 +0100 Subject: [PATCH 077/101] Handle standard REST http codes --- .../RestJsonResponseDeserializer.cs | 17 ++++++----------- .../ResponseCodeAwareResolver.cs | 8 +++++--- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index c430c71..2d31e2c 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -6,19 +6,16 @@ namespace SMSApi.Api.Response.Deserialization; public class RestJsonResponseDeserializer : IDeserializer { - private readonly ValidationErrorsResolver validationErrorsResolver; private readonly LegacyJsonResponseDeserializer legacyJsonResponseDeserializer; - private readonly TooManyRequestsErrorResolver tooManyRequestsErrorResolver; + private readonly IResponseCodeAwareResolver[] responseCodesResolvers; public RestJsonResponseDeserializer( LegacyJsonResponseDeserializer legacyJsonResponseDeserializer, - ValidationErrorsResolver validationErrorsResolver, - TooManyRequestsErrorResolver tooManyRequestsErrorResolver + params IResponseCodeAwareResolver[] responseCodesResolvers ) { this.legacyJsonResponseDeserializer = legacyJsonResponseDeserializer; - this.validationErrorsResolver = validationErrorsResolver; - this.tooManyRequestsErrorResolver = tooManyRequestsErrorResolver; + this.responseCodesResolvers = responseCodesResolvers; } public DeserializationResult Deserialize(HttpResponseEntity responseEntity) @@ -29,12 +26,10 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); var responseStatusCode = (int)responseEntity.StatusCode; - var exceptionsMatchers = - responseObject.HandleExceptionActions() - .Concat(validationErrorsResolver.HandleExceptionActions()) - .Concat(tooManyRequestsErrorResolver.HandleExceptionActions()); + var codesMatchers = responseObject.HandleExceptionActions() + .Concat(responseCodesResolvers.SelectMany(resolver => resolver.HandleExceptionActions())); - var matchedExceptions = exceptionsMatchers + var matchedExceptions = codesMatchers .Where(pair => pair.Key.Equals(responseStatusCode)) .ToHashSet(); diff --git a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs index 26a528f..72e2daf 100644 --- a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs +++ b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.IO; -namespace SMSApi.Api.Response.ResponseResolver +namespace SMSApi.Api.Response.ResponseResolver; + +public interface IResponseCodeAwareResolver : IErrorResponse { - public interface IResponseCodeAwareResolver: IErrorResponse + public Dictionary> HandleExceptionActions() { - public Dictionary> HandleExceptionActions() => new(); + return new Dictionary>(); } } From 133fac4606f01b4e481de4279fe19f6e81b6ab4e Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 19:19:18 +0100 Subject: [PATCH 078/101] Handle standard REST http codes --- .../Response/ResponseResolver/ResponseCodeAwareResolver.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs index 72e2daf..6bacbd3 100644 --- a/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs +++ b/smsapi/Api/Response/ResponseResolver/ResponseCodeAwareResolver.cs @@ -6,8 +6,5 @@ namespace SMSApi.Api.Response.ResponseResolver; public interface IResponseCodeAwareResolver : IErrorResponse { - public Dictionary> HandleExceptionActions() - { - return new Dictionary>(); - } + public Dictionary> HandleExceptionActions() => new(); } From ef6eadc2dccfff1b3b20787dbda70b38800a6928 Mon Sep 17 00:00:00 2001 From: jlabno Date: Wed, 8 Nov 2023 19:21:56 +0100 Subject: [PATCH 079/101] Handle standard REST http codes --- .../Response/Deserialization/RestJsonResponseDeserializer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index 2d31e2c..cb0d576 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -26,10 +26,10 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); var responseStatusCode = (int)responseEntity.StatusCode; - var codesMatchers = responseObject.HandleExceptionActions() + var exceptionsMatchers = responseObject.HandleExceptionActions() .Concat(responseCodesResolvers.SelectMany(resolver => resolver.HandleExceptionActions())); - var matchedExceptions = codesMatchers + var matchedExceptions = exceptionsMatchers .Where(pair => pair.Key.Equals(responseStatusCode)) .ToHashSet(); From 2192d7d29c78859ac873b6ca6a697d3d61b4c371 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 10:38:38 +0100 Subject: [PATCH 080/101] Handle other http codes --- .../Exception/UnhandledRestException.cs | 10 ++++ .../RestJsonResponseDeserializer.cs | 14 +++++ .../UnhandledRestCodeResponseTest.cs | 54 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs create mode 100644 smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs diff --git a/smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs b/smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs new file mode 100644 index 0000000..1468584 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs @@ -0,0 +1,10 @@ +using SMSApi.Api; + +namespace smsapi.Api.Response.Deserialization.Exception; + +public class UnhandledRestException : HostException +{ + public UnhandledRestException(string message, string code) : base(message, code) + { + } +} diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index cb0d576..8cbccf7 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -1,5 +1,7 @@ using System; using System.Linq; +using System.Net; +using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response.Deserialization; @@ -35,6 +37,18 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity if (matchedExceptions.Count > 0) matchedExceptions.First().Value.Invoke(responseEntity.Content.Result); + HandleUnknownErrors(responseEntity); + return legacyJsonResponseDeserializer.Deserialize(responseEntity); } + + private static void HandleUnknownErrors(HttpResponseEntity responseEntity) + { + if (responseEntity.StatusCode.Equals(HttpStatusCode.OK)) return; + + throw new UnhandledRestException( + $"Unknown http status code: {(int)responseEntity.StatusCode}", + responseEntity.StatusCode.ToString() + ); + } } diff --git a/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs new file mode 100644 index 0000000..e4fd8d6 --- /dev/null +++ b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action; +using smsapi.Api.Response.Deserialization.Exception; +using SMSApi.Api.Response.ResponseResolver; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Response.Deserialization; + +[TestClass] +public class UnhandledRestCodeResponseTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void map_validation_errors_to_message() + { + var action = new TestAction(); + action.Proxy(_proxyStub); + Dictionary response = new(); + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.FailedDependency + ); + + var execution = () => action.Execute(); + + var ex = Assert.ThrowsException(execution); + Assert.AreEqual("Unknown http status code: 424", ex.Message); + Assert.AreEqual("FailedDependency", ex.Code); + } + + private class TestAction : Base + { + protected override RequestMethod Method { get; } + + protected override ApiType ApiType() + { + return SMSApi.Api.Action.ApiType.Rest; + } + + protected override string Uri() + { + return ""; + } + } + + private class ResponseWithExceptionMapper : IResponseCodeAwareResolver + { + } +} From 339e1ba2466de61c4c494f49bbd02082bee3ad71 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 10:38:58 +0100 Subject: [PATCH 081/101] Handle lack of access rest codes --- smsapi/Api/Action/Base.cs | 3 +- .../Deserialization/AccessErrorResolver.cs | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 smsapi/Api/Response/Deserialization/AccessErrorResolver.cs diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Base.cs index a2de78a..fc317e4 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Base.cs @@ -49,7 +49,8 @@ protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of Action.ApiType.Rest => new RestJsonResponseDeserializer( new LegacyJsonResponseDeserializer(), new ValidationErrorsResolver(new BaseJsonDeserializer()), - new TooManyRequestsErrorResolver() + new TooManyRequestsErrorResolver(), + new AccessErrorResolver() ), Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), _ => throw new Exception("Unknown api type") diff --git a/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs b/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs new file mode 100644 index 0000000..4730a58 --- /dev/null +++ b/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.IO; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Deserialization; + +public class AccessErrorResolver : IResponseCodeAwareResolver +{ + public Dictionary> HandleExceptionActions() + { + return new Dictionary> + { + { 401, _ => throw new UnauthorizedException() }, + { 403, _ => throw new AccessForbiddenException() } + }; + } + + public class UnauthorizedException : ClientException + { + public UnauthorizedException() : base("Invalid credentials", 401) + { + } + } + + public class AccessForbiddenException : ClientException + { + public AccessForbiddenException() : base("Access forbidden", 403) + { + } + } +} From 795b7e7b04db698b7f19f1626339da6af0809f3a Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 12:13:12 +0100 Subject: [PATCH 082/101] Handle other http codes --- .../RestJsonResponseDeserializer.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index 8cbccf7..9871dda 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -24,10 +24,13 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity { if (!typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) throw new Exception("Deserialization from non-rest response"); - - var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); + var responseStatusCode = (int)responseEntity.StatusCode; + + if (responseStatusCode == (int)HttpStatusCode.OK) + return legacyJsonResponseDeserializer.Deserialize(responseEntity); + var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); var exceptionsMatchers = responseObject.HandleExceptionActions() .Concat(responseCodesResolvers.SelectMany(resolver => resolver.HandleExceptionActions())); @@ -37,15 +40,13 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity if (matchedExceptions.Count > 0) matchedExceptions.First().Value.Invoke(responseEntity.Content.Result); - HandleUnknownErrors(responseEntity); + HandleUnknownError(responseEntity); - return legacyJsonResponseDeserializer.Deserialize(responseEntity); + return default; } - private static void HandleUnknownErrors(HttpResponseEntity responseEntity) + private static void HandleUnknownError(HttpResponseEntity responseEntity) { - if (responseEntity.StatusCode.Equals(HttpStatusCode.OK)) return; - throw new UnhandledRestException( $"Unknown http status code: {(int)responseEntity.StatusCode}", responseEntity.StatusCode.ToString() From f414928502963ac68efad3b784395bc2eeebc72b Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 12:50:25 +0100 Subject: [PATCH 083/101] Handle other http codes (not successful) --- .../Deserialization/RestJsonResponseDeserializer.cs | 6 ++---- smsapi/Api/Response/HttpCodesGroupHelper.cs | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 smsapi/Api/Response/HttpCodesGroupHelper.cs diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index 9871dda..affad5c 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using System.Net; using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; @@ -25,15 +24,14 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity if (!typeof(IResponseCodeAwareResolver).IsAssignableFrom(typeof(T))) throw new Exception("Deserialization from non-rest response"); - var responseStatusCode = (int)responseEntity.StatusCode; - - if (responseStatusCode == (int)HttpStatusCode.OK) + if (responseEntity.StatusCode.IsSuccessful()) return legacyJsonResponseDeserializer.Deserialize(responseEntity); var responseObject = (IResponseCodeAwareResolver)Activator.CreateInstance(); var exceptionsMatchers = responseObject.HandleExceptionActions() .Concat(responseCodesResolvers.SelectMany(resolver => resolver.HandleExceptionActions())); + var responseStatusCode = (int)responseEntity.StatusCode; var matchedExceptions = exceptionsMatchers .Where(pair => pair.Key.Equals(responseStatusCode)) .ToHashSet(); diff --git a/smsapi/Api/Response/HttpCodesGroupHelper.cs b/smsapi/Api/Response/HttpCodesGroupHelper.cs new file mode 100644 index 0000000..1cde094 --- /dev/null +++ b/smsapi/Api/Response/HttpCodesGroupHelper.cs @@ -0,0 +1,13 @@ +using System.Net; + +namespace SMSApi.Api.Response; + +public static class HttpCodesGroupHelper +{ + public static bool IsSuccessful(this HttpStatusCode statusCode) + { + var intRepresentation = (int)statusCode; + + return intRepresentation is >= 200 and <= 299; + } +} From b1cc78708fae8a70480c92eff3ef777a9223d68c Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 12:59:53 +0100 Subject: [PATCH 084/101] Creating/Veryfying MFA code --- .../Action/MFA/CreateMFACodeResponseTest.cs | 60 ++++++++++++ .../Unit/Action/MFA/CreateMFACodeTest.cs | 98 +++++++++++++++++++ .../Action/MFA/VerifyMFACodeResponseTest.cs | 66 +++++++++++++ .../Unit/Action/MFA/VerifyMFACodeTest.cs | 53 ++++++++++ smsapiTests/Unit/SpyProxy.cs | 2 +- 5 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 smsapiTests/Unit/Action/MFA/CreateMFACodeResponseTest.cs create mode 100644 smsapiTests/Unit/Action/MFA/CreateMFACodeTest.cs create mode 100644 smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs create mode 100644 smsapiTests/Unit/Action/MFA/VerifyMFACodeTest.cs diff --git a/smsapiTests/Unit/Action/MFA/CreateMFACodeResponseTest.cs b/smsapiTests/Unit/Action/MFA/CreateMFACodeResponseTest.cs new file mode 100644 index 0000000..ed3284b --- /dev/null +++ b/smsapiTests/Unit/Action/MFA/CreateMFACodeResponseTest.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action.MFA; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Action.MFA; + +[TestClass] +public class CreateMFACodeResponseTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void map_result_to_object() + { + var id = "5ADEF4DC3738305BEED02B0C"; + var code = "123456"; + var phoneNumber = "48500500500"; + var from = "Test"; + var response = new Dictionary + { + { + "id", id + }, + { + "code", code + }, + { + "phone_number", phoneNumber + }, + { + "from", from + }, + }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var result = CreateMfaCodeAction(GetAnyPhoneNumber()).Execute(); + + Assert.AreEqual(id, result.Id); + Assert.AreEqual(code, result.Code); + Assert.AreEqual(phoneNumber, result.PhoneNumber); + Assert.AreEqual(from, result.From); + } + + private static string GetAnyPhoneNumber() => "48500100100"; + + private CreateMFACode CreateMfaCodeAction(string phoneNumber) + { + var action = new CreateMFACode(phoneNumber); + action.Proxy(_proxyStub); + + return action; + } +} diff --git a/smsapiTests/Unit/Action/MFA/CreateMFACodeTest.cs b/smsapiTests/Unit/Action/MFA/CreateMFACodeTest.cs new file mode 100644 index 0000000..1312fee --- /dev/null +++ b/smsapiTests/Unit/Action/MFA/CreateMFACodeTest.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api.Action.MFA; + +namespace smsapiTests.Unit.Action.MFA; + +[TestClass] +public class CreateMFACodeTest +{ + private readonly SpyProxy _spyProxy = new(); + + [TestMethod] + public void valid_uri() + { + var phoneNumber = GetAnyPhoneNumber(); + + CreateMfaCodeAction(phoneNumber).Execute(); + + Assert.AreEqual("mfa/codes", _spyProxy.RequestedUri); + } + + [TestMethod] + public void request_contains_only_phone_number() + { + var phoneNumber = GetAnyPhoneNumber(); + + CreateMfaCodeAction(phoneNumber).Execute(); + + AssertParametersContain("phone_number", phoneNumber); + AssertParametersDoesNotContain("content"); + AssertParametersDoesNotContain("fast"); + AssertParametersDoesNotContain("from"); + } + + [TestMethod] + public void create_as_fast() + { + var create = CreateMfaCodeAction(GetAnyPhoneNumber()) + .AsFast(); + + create.Execute(); + + AssertParametersContain("fast", "1"); + } + + [TestMethod] + public void create_with_content() + { + var content = "any content"; + var create = CreateMfaCodeAction(GetAnyPhoneNumber()) + .WithContent(content); + + create.Execute(); + + AssertParametersContain("content", content); + } + + [TestMethod] + public void create_with_sendername() + { + var sendername = "abc"; + var create = CreateMfaCodeAction(GetAnyPhoneNumber()) + .FromSendername(sendername); + + create.Execute(); + + AssertParametersContain("from", sendername); + } + + private static string GetAnyPhoneNumber() => "48500100100"; + + private CreateMFACode CreateMfaCodeAction(string phoneNumber) + { + var action = new CreateMFACode(phoneNumber); + action.Proxy(_spyProxy); + + return action; + } + + private void AssertParametersContain(string name, string value) + { + var expectedParameter = new KeyValuePair(name, value); + + Assert.IsTrue( + _spyProxy.Parameters.Contains(expectedParameter), + $"Expected {value}, actual value: {_spyProxy.Parameters[name]}" + ); + } + + private void AssertParametersDoesNotContain(string name) + { + Assert.IsFalse( + _spyProxy.Parameters.ContainsKey(name), + $"Key not expected {name}" + ); + } +} diff --git a/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs b/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs new file mode 100644 index 0000000..080fbb8 --- /dev/null +++ b/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action.MFA; +using SMSApi.Api.Response.MFA; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Action.MFA; + +[TestClass] +public class VerifyMFACodeResponseTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + public void pass_when_code_is_valid() + { + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + new Dictionary().ToHttpEntityStreamTask(), + HttpStatusCode.NoContent + ); + + VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); + + Assert.IsTrue(true); + } + + [TestMethod] + public void throw_when_code_is_expired() + { + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + new Dictionary().ToHttpEntityStreamTask(), + HttpStatusCode.RequestTimeout + ); + + var action = () => VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); + + Assert.ThrowsException(action); + } + + [TestMethod] + public void throw_when_code_is_invalid() + { + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + new Dictionary().ToHttpEntityStreamTask(), + HttpStatusCode.NotFound + ); + + var action = () => VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); + + Assert.ThrowsException(action); + } + + private static string GetAnyPhoneNumber() => "48500100100"; + private static string GetAnyVerificationCode() => "123456"; + + private VerifyMFACode VerifyMfaCodeAction(string phoneNumber, string code) + { + var action = new VerifyMFACode(phoneNumber, code); + action.Proxy(_proxyStub); + + return action; + } +} diff --git a/smsapiTests/Unit/Action/MFA/VerifyMFACodeTest.cs b/smsapiTests/Unit/Action/MFA/VerifyMFACodeTest.cs new file mode 100644 index 0000000..bb96832 --- /dev/null +++ b/smsapiTests/Unit/Action/MFA/VerifyMFACodeTest.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api.Action.MFA; + +namespace smsapiTests.Unit.Action.MFA; + +[TestClass] +public class VerifyMFACodeTest +{ + private readonly SpyProxy _spyProxy = new(); + + [TestMethod] + public void valid_uri() + { + VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); + + Assert.AreEqual("mfa/codes/verifications", _spyProxy.RequestedUri); + } + + [TestMethod] + public void request_contains_phone_number_and_code() + { + var phoneNumber = GetAnyPhoneNumber(); + var code = GetAnyVerificationCode(); + + VerifyMfaCodeAction(phoneNumber, code).Execute(); + + AssertParametersContain("phone_number", phoneNumber); + AssertParametersContain("code", code); + } + + private static string GetAnyPhoneNumber() => "48500100100"; + private static string GetAnyVerificationCode() => "123456"; + + private VerifyMFACode VerifyMfaCodeAction(string phoneNumber, string code) + { + var action = new VerifyMFACode(phoneNumber, code); + action.Proxy(_spyProxy); + + return action; + } + + private void AssertParametersContain(string name, string value) + { + var expectedParameter = new KeyValuePair(name, value); + + Assert.IsTrue( + _spyProxy.Parameters.Contains(expectedParameter), + $"Expected {value}, actual value: {_spyProxy.Parameters[name]}" + ); + } +} diff --git a/smsapiTests/Unit/SpyProxy.cs b/smsapiTests/Unit/SpyProxy.cs index a1bed6f..cdd3528 100644 --- a/smsapiTests/Unit/SpyProxy.cs +++ b/smsapiTests/Unit/SpyProxy.cs @@ -41,7 +41,7 @@ public HttpResponseEntity Execute(string uri, NameValueCollection data, Dictiona RequestedUri = uri; SetParameters(data); - return new HttpResponseEntity(); + return new HttpResponseEntity(Task.FromResult(Stream.Null), HttpStatusCode.OK); } public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) From 7c7f3e1688c7e3185f7c4679476678e30f4022f6 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 14:11:05 +0100 Subject: [PATCH 085/101] Create bag for features --- smsapi/Api/Features.cs | 19 +++++++++++ smsapi/Api/MFAFactory.cs | 68 +++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 29 deletions(-) create mode 100644 smsapi/Api/Features.cs diff --git a/smsapi/Api/Features.cs b/smsapi/Api/Features.cs new file mode 100644 index 0000000..502093d --- /dev/null +++ b/smsapi/Api/Features.cs @@ -0,0 +1,19 @@ +namespace SMSApi.Api; + +public class Features +{ + internal readonly IClient Client; + internal readonly Proxy Proxy; + + public Features(IClient client, ProxyAddress proxy = ProxyAddress.SmsApiIo) + { + Proxy = new ProxyHTTP(proxy.GetUrl()); + Client = client; + } + + public Features(IClient client, Proxy proxy) + { + Proxy = proxy; + Client = client; + } +} diff --git a/smsapi/Api/MFAFactory.cs b/smsapi/Api/MFAFactory.cs index bc8be9d..6ed7439 100644 --- a/smsapi/Api/MFAFactory.cs +++ b/smsapi/Api/MFAFactory.cs @@ -1,35 +1,45 @@ using SMSApi.Api.Action.MFA; -namespace SMSApi.Api +namespace SMSApi.Api; + +public class MFAFactory : Factory +{ + public MFAFactory(ProxyAddress address = ProxyAddress.SmsApiIo) + : base(address) + { + } + + public MFAFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) + : base(client, address) + { + } + + public MFAFactory(IClient client, Proxy proxy) + : base(client, proxy) + { + } + + public CreateMFACode CreateMfaCode(string phoneNumber) + { + var action = new CreateMFACode(phoneNumber); + action.Proxy(proxy); + + return action; + } + + public VerifyMFACode VerifyMfaCode(string phoneNumber, string code) + { + var action = new VerifyMFACode(phoneNumber, code); + action.Proxy(proxy); + + return action; + } +} + +public static class MFAFeatureRegister { - public class MFAFactory : Factory + public static MFAFactory MFA(this Features features) { - public MFAFactory(ProxyAddress address = ProxyAddress.SmsApiIo) - : base(address) - { } - - public MFAFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) - : base(client, address) - { } - - public MFAFactory(IClient client, Proxy proxy) - : base(client, proxy) - { } - - public CreateMFACode CreateMfaCode(string phoneNumber) - { - var action = new CreateMFACode(phoneNumber); - action.Proxy(proxy); - - return action; - } - - public VerifyMFACode VerifyMfaCode(string phoneNumber, string code) - { - var action = new VerifyMFACode(phoneNumber, code); - action.Proxy(proxy); - - return action; - } + return new MFAFactory(features.Client, features.Proxy); } } From 3d1c2b0509fc902557f5ff1866b357afd9bda02e Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 14:18:28 +0100 Subject: [PATCH 086/101] Add features to feature bag --- smsapi/Api/ContactsFactory.cs | 9 +++++++++ smsapi/Api/HLRFactory.cs | 11 ++++++++++- smsapi/Api/MMSFactory.cs | 11 ++++++++++- smsapi/Api/SMSFactory.cs | 11 ++++++++++- smsapi/Api/SenderFactory.cs | 11 ++++++++++- smsapi/Api/UserFactory.cs | 11 ++++++++++- smsapi/Api/VMSFactory.cs | 11 ++++++++++- 7 files changed, 69 insertions(+), 6 deletions(-) diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index b1f758a..e4113ab 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -1,3 +1,4 @@ +using SMSApi.Api; using SMSApi.Api.Action; namespace SMSApi.Api @@ -185,3 +186,11 @@ public UnbindContactFromGroup UnbindContactFromGroup(string contactId, string gr } } } + +public static class ContactsFeatureRegister +{ + public static ContactsFactory MFA(this Features features) + { + return new ContactsFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/HLRFactory.cs b/smsapi/Api/HLRFactory.cs index f36bd0c..f25fd3d 100644 --- a/smsapi/Api/HLRFactory.cs +++ b/smsapi/Api/HLRFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -25,3 +26,11 @@ public HLRCheckNumber ActionCheckNumber(string number = null) } } } + +public static class HlrFeatureRegister +{ + public static HLRFactory HLR(this Features features) + { + return new HLRFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/MMSFactory.cs b/smsapi/Api/MMSFactory.cs index b7bc87c..e64b858 100644 --- a/smsapi/Api/MMSFactory.cs +++ b/smsapi/Api/MMSFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -55,3 +56,11 @@ public MMSSend ActionSend(string[] to) } } } + +public static class MMSFeatureRegister +{ + public static MMSFactory MMS(this Features features) + { + return new MMSFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/SMSFactory.cs b/smsapi/Api/SMSFactory.cs index 00014ee..0dfbba3 100644 --- a/smsapi/Api/SMSFactory.cs +++ b/smsapi/Api/SMSFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -56,3 +57,11 @@ public SMSSend ActionSend(string[] to, string text = null) } } } + +public static class SMSFeatureRegister +{ + public static SMSFactory SMS(this Features features) + { + return new SMSFactory(features.Client, features.Proxy); + } +} \ No newline at end of file diff --git a/smsapi/Api/SenderFactory.cs b/smsapi/Api/SenderFactory.cs index 7e53132..f649135 100644 --- a/smsapi/Api/SenderFactory.cs +++ b/smsapi/Api/SenderFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -48,3 +49,11 @@ public SenderSetDefault ActionSetDefault(string name = null) } } } + +public static class SenderFeatureRegister +{ + public static SenderFactory Sender(this Features features) + { + return new SenderFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/UserFactory.cs b/smsapi/Api/UserFactory.cs index 4e6b830..77bfb1f 100644 --- a/smsapi/Api/UserFactory.cs +++ b/smsapi/Api/UserFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -54,3 +55,11 @@ public UserList ActionList() } } } + +public static class UserFeatureRegister +{ + public static UserFactory User(this Features features) + { + return new UserFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/VMSFactory.cs b/smsapi/Api/VMSFactory.cs index 61eba87..295bc49 100644 --- a/smsapi/Api/VMSFactory.cs +++ b/smsapi/Api/VMSFactory.cs @@ -1,4 +1,5 @@ -using SMSApi.Api.Action; +using SMSApi.Api; +using SMSApi.Api.Action; namespace SMSApi.Api { @@ -55,3 +56,11 @@ public VMSSend ActionSend(string[] to) } } } + +public static class VmsFeatureRegister +{ + public static VMSFactory VMS(this Features features) + { + return new VMSFactory(features.Client, features.Proxy); + } +} From 0c36a8df259d9d7e513e0b20b07811067350ea4a Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 14:19:12 +0100 Subject: [PATCH 087/101] Add features to feature bag --- smsapi/Api/ContactsFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/Api/ContactsFactory.cs b/smsapi/Api/ContactsFactory.cs index e4113ab..da1095c 100644 --- a/smsapi/Api/ContactsFactory.cs +++ b/smsapi/Api/ContactsFactory.cs @@ -189,7 +189,7 @@ public UnbindContactFromGroup UnbindContactFromGroup(string contactId, string gr public static class ContactsFeatureRegister { - public static ContactsFactory MFA(this Features features) + public static ContactsFactory Contacts(this Features features) { return new ContactsFactory(features.Client, features.Proxy); } From 851fd5343f121712392cb1bf53355856dba52540 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 14:33:48 +0100 Subject: [PATCH 088/101] Rename Action --- smsapi/Api/Action/{Base.cs => Action.cs} | 178 +++++++++--------- .../Api/Action/Contacts/BindContactToGroup.cs | 2 +- smsapi/Api/Action/Contacts/CreateContact.cs | 2 +- smsapi/Api/Action/Contacts/CreateField.cs | 2 +- smsapi/Api/Action/Contacts/CreateGroup.cs | 2 +- .../Action/Contacts/CreateGroupPermission.cs | 2 +- smsapi/Api/Action/Contacts/DeleteContact.cs | 2 +- smsapi/Api/Action/Contacts/DeleteField.cs | 2 +- smsapi/Api/Action/Contacts/DeleteGroup.cs | 2 +- .../Action/Contacts/DeleteGroupPermission.cs | 2 +- smsapi/Api/Action/Contacts/EditContact.cs | 2 +- smsapi/Api/Action/Contacts/EditField.cs | 2 +- smsapi/Api/Action/Contacts/EditGroup.cs | 2 +- .../Action/Contacts/EditGroupPermission.cs | 2 +- smsapi/Api/Action/Contacts/GetContact.cs | 2 +- smsapi/Api/Action/Contacts/GetContactGroup.cs | 2 +- smsapi/Api/Action/Contacts/GetGroup.cs | 2 +- .../Api/Action/Contacts/GetGroupPermission.cs | 2 +- .../Api/Action/Contacts/ListContactGroups.cs | 2 +- smsapi/Api/Action/Contacts/ListContacts.cs | 2 +- .../Api/Action/Contacts/ListFieldOptions.cs | 2 +- smsapi/Api/Action/Contacts/ListFields.cs | 2 +- .../Action/Contacts/ListGroupPermissions.cs | 2 +- smsapi/Api/Action/Contacts/ListGroups.cs | 2 +- .../Action/Contacts/UnbindContactFromGroup.cs | 2 +- smsapi/Api/Action/HLR/CheckNumber.cs | 2 +- smsapi/Api/Action/MFA/CreateMFACode.cs | 2 +- smsapi/Api/Action/MFA/VerifyMFACode.cs | 2 +- smsapi/Api/Action/MMS/Delete.cs | 2 +- smsapi/Api/Action/MMS/Get.cs | 2 +- smsapi/Api/Action/SMS/Delete.cs | 2 +- smsapi/Api/Action/SMS/Get.cs | 2 +- smsapi/Api/Action/Send.cs | 2 +- smsapi/Api/Action/Sender/Add.cs | 2 +- smsapi/Api/Action/Sender/Delete.cs | 2 +- smsapi/Api/Action/Sender/List.cs | 2 +- smsapi/Api/Action/Sender/SetDefault.cs | 2 +- smsapi/Api/Action/User/Add.cs | 2 +- smsapi/Api/Action/User/Edit.cs | 2 +- smsapi/Api/Action/User/Get.cs | 2 +- smsapi/Api/Action/User/GetPoints.cs | 2 +- smsapi/Api/Action/User/List.cs | 2 +- smsapi/Api/Action/VMS/Delete.cs | 2 +- smsapi/Api/Action/VMS/Get.cs | 2 +- ...acyResponseDeserializationExceptionTest.cs | 2 +- .../LegacyResponseDeserializationTest.cs | 2 +- .../RestJsonResponseDeserializerTest.cs | 6 +- ...esponseDeserializerValidationErrorsTest.cs | 2 +- .../TooManyRequestsResponseTest.cs | 2 +- .../UnhandledRestCodeResponseTest.cs | 2 +- smsapiTests/Unit/UnitTestBase.cs | 2 +- 51 files changed, 141 insertions(+), 141 deletions(-) rename smsapi/Api/Action/{Base.cs => Action.cs} (86%) diff --git a/smsapi/Api/Action/Base.cs b/smsapi/Api/Action/Action.cs similarity index 86% rename from smsapi/Api/Action/Base.cs rename to smsapi/Api/Action/Action.cs index fc317e4..0b85b94 100644 --- a/smsapi/Api/Action/Base.cs +++ b/smsapi/Api/Action/Action.cs @@ -1,89 +1,89 @@ -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Threading.Tasks; -using System.Web; -using SMSApi.Api.Response.Deserialization; -using smsapi.Api.Response.Deserialization.Exception; - -namespace SMSApi.Api.Action; - -public abstract class Base -{ - protected BaseJsonDeserializer BaseJsonDeserializer = new(); //TODO remove after further refactor - private Proxy proxy; - - protected abstract RequestMethod Method { get; } - - protected virtual ApiType ApiType() - { - return Action.ApiType.Legacy; - } - - public T Execute() - { - Validate(); - return ProcessResponse(proxy.Execute(Uri(), GetValues(), Files(), Method)); - } - - public async Task ExecuteAsync() - { - Validate(); - return ProcessResponse(await proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); - } - - public void Proxy(Proxy proxy) - { - this.proxy = proxy; - } - - protected virtual Dictionary Files() - { - return new Dictionary(); - } - - protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding - { - IDeserializer deserializer = ApiType() switch - { - Action.ApiType.Rest => new RestJsonResponseDeserializer( - new LegacyJsonResponseDeserializer(), - new ValidationErrorsResolver(new BaseJsonDeserializer()), - new TooManyRequestsErrorResolver(), - new AccessErrorResolver() - ), - Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), - _ => throw new Exception("Unknown api type") - }; - - var deserializationResult = deserializer.Deserialize(data); - - deserializationResult.ThrowErrors(); - - return deserializationResult.Result; - } - - protected abstract string Uri(); - - protected virtual void Validate() - { - } - - protected virtual NameValueCollection Values() - { - return new NameValueCollection(); - } - - private T ProcessResponse(HttpResponseEntity responseEntity) - { - return ResponseToObject(responseEntity); - } - - private NameValueCollection GetValues() - { - var values = Values(); - return values.Count > 0 - ? new NameValueCollection { { "format", "json" }, values } - : HttpUtility.ParseQueryString(string.Empty); - } -} +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Threading.Tasks; +using System.Web; +using SMSApi.Api.Response.Deserialization; +using smsapi.Api.Response.Deserialization.Exception; + +namespace SMSApi.Api.Action; + +public abstract class Action +{ + protected BaseJsonDeserializer BaseJsonDeserializer = new(); //TODO remove after further refactor + private Proxy _proxy; + + protected abstract RequestMethod Method { get; } + + protected virtual ApiType ApiType() + { + return Action.ApiType.Legacy; + } + + public T Execute() + { + Validate(); + return ProcessResponse(_proxy.Execute(Uri(), GetValues(), Files(), Method)); + } + + public async Task ExecuteAsync() + { + Validate(); + return ProcessResponse(await _proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); + } + + public void Proxy(Proxy proxy) + { + this._proxy = proxy; + } + + protected virtual Dictionary Files() + { + return new Dictionary(); + } + + protected virtual T ResponseToObject(HttpResponseEntity data) //TODO get rid of overriding + { + IDeserializer deserializer = ApiType() switch + { + Action.ApiType.Rest => new RestJsonResponseDeserializer( + new LegacyJsonResponseDeserializer(), + new ValidationErrorsResolver(new BaseJsonDeserializer()), + new TooManyRequestsErrorResolver(), + new AccessErrorResolver() + ), + Action.ApiType.Legacy => new LegacyJsonResponseDeserializer(), + _ => throw new Exception("Unknown api type") + }; + + var deserializationResult = deserializer.Deserialize(data); + + deserializationResult.ThrowErrors(); + + return deserializationResult.Result; + } + + protected abstract string Uri(); + + protected virtual void Validate() + { + } + + protected virtual NameValueCollection Values() + { + return new NameValueCollection(); + } + + private T ProcessResponse(HttpResponseEntity responseEntity) + { + return ResponseToObject(responseEntity); + } + + private NameValueCollection GetValues() + { + var values = Values(); + return values.Count > 0 + ? new NameValueCollection { { "format", "json" }, values } + : HttpUtility.ParseQueryString(string.Empty); + } +} diff --git a/smsapi/Api/Action/Contacts/BindContactToGroup.cs b/smsapi/Api/Action/Contacts/BindContactToGroup.cs index 42625ff..ae2f955 100644 --- a/smsapi/Api/Action/Contacts/BindContactToGroup.cs +++ b/smsapi/Api/Action/Contacts/BindContactToGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class BindContactToGroup : Base + public class BindContactToGroup : Action { private readonly string contactId; private readonly string groupId; diff --git a/smsapi/Api/Action/Contacts/CreateContact.cs b/smsapi/Api/Action/Contacts/CreateContact.cs index 6605ec2..95d69ef 100644 --- a/smsapi/Api/Action/Contacts/CreateContact.cs +++ b/smsapi/Api/Action/Contacts/CreateContact.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class CreateContact : Base + public class CreateContact : Action { private DateTime? birthdayDate; private string city; diff --git a/smsapi/Api/Action/Contacts/CreateField.cs b/smsapi/Api/Action/Contacts/CreateField.cs index 698a270..e1bf428 100644 --- a/smsapi/Api/Action/Contacts/CreateField.cs +++ b/smsapi/Api/Action/Contacts/CreateField.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class CreateField : Base + public class CreateField : Action { private string name; private string type; diff --git a/smsapi/Api/Action/Contacts/CreateGroup.cs b/smsapi/Api/Action/Contacts/CreateGroup.cs index 1a82e0f..4cc4fcf 100644 --- a/smsapi/Api/Action/Contacts/CreateGroup.cs +++ b/smsapi/Api/Action/Contacts/CreateGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class CreateGroup : Base + public class CreateGroup : Action { private string description; private string idx; diff --git a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs index d185532..7fb7797 100644 --- a/smsapi/Api/Action/Contacts/CreateGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/CreateGroupPermission.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class CreateGroupPermission : Base + public class CreateGroupPermission : Action { private string groupId; private bool read; diff --git a/smsapi/Api/Action/Contacts/DeleteContact.cs b/smsapi/Api/Action/Contacts/DeleteContact.cs index 83f5782..e096a70 100644 --- a/smsapi/Api/Action/Contacts/DeleteContact.cs +++ b/smsapi/Api/Action/Contacts/DeleteContact.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class DeleteContact : Base + public class DeleteContact : Action { private readonly string contactId; diff --git a/smsapi/Api/Action/Contacts/DeleteField.cs b/smsapi/Api/Action/Contacts/DeleteField.cs index 504969d..c041cb7 100644 --- a/smsapi/Api/Action/Contacts/DeleteField.cs +++ b/smsapi/Api/Action/Contacts/DeleteField.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class DeleteField : Base + public class DeleteField : Action { private readonly string fieldId; diff --git a/smsapi/Api/Action/Contacts/DeleteGroup.cs b/smsapi/Api/Action/Contacts/DeleteGroup.cs index d25ebc9..d2c27ae 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroup.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroup.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class DeleteGroup : Base + public class DeleteGroup : Action { private readonly string groupId; diff --git a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs index afe50c8..4c95bc6 100644 --- a/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/DeleteGroupPermission.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class DeleteGroupPermission : Base + public class DeleteGroupPermission : Action { private readonly string groupId; private readonly string username; diff --git a/smsapi/Api/Action/Contacts/EditContact.cs b/smsapi/Api/Action/Contacts/EditContact.cs index 304dd9b..5df4491 100644 --- a/smsapi/Api/Action/Contacts/EditContact.cs +++ b/smsapi/Api/Action/Contacts/EditContact.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class EditContact : Base + public class EditContact : Action { private DateTime? birthdayDate; private string city; diff --git a/smsapi/Api/Action/Contacts/EditField.cs b/smsapi/Api/Action/Contacts/EditField.cs index 5be2a5e..d886403 100644 --- a/smsapi/Api/Action/Contacts/EditField.cs +++ b/smsapi/Api/Action/Contacts/EditField.cs @@ -5,7 +5,7 @@ namespace SMSApi.Api.Action { - public class EditField : Base + public class EditField : Action { private string fieldId; private string name; diff --git a/smsapi/Api/Action/Contacts/EditGroup.cs b/smsapi/Api/Action/Contacts/EditGroup.cs index 8ebe2e8..b0d4125 100644 --- a/smsapi/Api/Action/Contacts/EditGroup.cs +++ b/smsapi/Api/Action/Contacts/EditGroup.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class EditGroup : Base + public class EditGroup : Action { private string description; private string groupId; diff --git a/smsapi/Api/Action/Contacts/EditGroupPermission.cs b/smsapi/Api/Action/Contacts/EditGroupPermission.cs index ad4093b..9288f93 100644 --- a/smsapi/Api/Action/Contacts/EditGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/EditGroupPermission.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class EditGroupPermission : Base + public class EditGroupPermission : Action { private string groupId; private bool read; diff --git a/smsapi/Api/Action/Contacts/GetContact.cs b/smsapi/Api/Action/Contacts/GetContact.cs index d59c749..581688e 100644 --- a/smsapi/Api/Action/Contacts/GetContact.cs +++ b/smsapi/Api/Action/Contacts/GetContact.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class GetContact : Base + public class GetContact : Action { private readonly string contactId; diff --git a/smsapi/Api/Action/Contacts/GetContactGroup.cs b/smsapi/Api/Action/Contacts/GetContactGroup.cs index 226fe06..e6161e2 100644 --- a/smsapi/Api/Action/Contacts/GetContactGroup.cs +++ b/smsapi/Api/Action/Contacts/GetContactGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class GetContactGroup : Base + public class GetContactGroup : Action { private readonly string contactId; private readonly string groupId; diff --git a/smsapi/Api/Action/Contacts/GetGroup.cs b/smsapi/Api/Action/Contacts/GetGroup.cs index c17c8d0..cf3d3d3 100644 --- a/smsapi/Api/Action/Contacts/GetGroup.cs +++ b/smsapi/Api/Action/Contacts/GetGroup.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class GetGroup : Base + public class GetGroup : Action { private string groupId; diff --git a/smsapi/Api/Action/Contacts/GetGroupPermission.cs b/smsapi/Api/Action/Contacts/GetGroupPermission.cs index 6f0bf7c..5d24349 100644 --- a/smsapi/Api/Action/Contacts/GetGroupPermission.cs +++ b/smsapi/Api/Action/Contacts/GetGroupPermission.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class GetGroupPermission : Base + public class GetGroupPermission : Action { private readonly string groupId; private readonly string username; diff --git a/smsapi/Api/Action/Contacts/ListContactGroups.cs b/smsapi/Api/Action/Contacts/ListContactGroups.cs index 8cacbaa..1232906 100644 --- a/smsapi/Api/Action/Contacts/ListContactGroups.cs +++ b/smsapi/Api/Action/Contacts/ListContactGroups.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public class ListContactGroups : Base + public class ListContactGroups : Action { private readonly string contactId; diff --git a/smsapi/Api/Action/Contacts/ListContacts.cs b/smsapi/Api/Action/Contacts/ListContacts.cs index 04ebaf7..64e1fa8 100644 --- a/smsapi/Api/Action/Contacts/ListContacts.cs +++ b/smsapi/Api/Action/Contacts/ListContacts.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class ListContacts : Base + public class ListContacts : Action { private DateTime? birthdayDate; private string email; diff --git a/smsapi/Api/Action/Contacts/ListFieldOptions.cs b/smsapi/Api/Action/Contacts/ListFieldOptions.cs index 621ce0b..282fd46 100644 --- a/smsapi/Api/Action/Contacts/ListFieldOptions.cs +++ b/smsapi/Api/Action/Contacts/ListFieldOptions.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public class ListFieldOptions : Base + public class ListFieldOptions : Action { private readonly string fieldId; diff --git a/smsapi/Api/Action/Contacts/ListFields.cs b/smsapi/Api/Action/Contacts/ListFields.cs index fe1c123..6e27dd0 100644 --- a/smsapi/Api/Action/Contacts/ListFields.cs +++ b/smsapi/Api/Action/Contacts/ListFields.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public class ListFields : Base + public class ListFields : Action { protected override RequestMethod Method => RequestMethod.GET; diff --git a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs index adfef95..de5e109 100644 --- a/smsapi/Api/Action/Contacts/ListGroupPermissions.cs +++ b/smsapi/Api/Action/Contacts/ListGroupPermissions.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public class ListGroupPermissions : Base + public class ListGroupPermissions : Action { private string groupId; diff --git a/smsapi/Api/Action/Contacts/ListGroups.cs b/smsapi/Api/Action/Contacts/ListGroups.cs index b8e2300..6c36a87 100644 --- a/smsapi/Api/Action/Contacts/ListGroups.cs +++ b/smsapi/Api/Action/Contacts/ListGroups.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class ListGroups : Base + public class ListGroups : Action { private string id; private string name; diff --git a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs index 512f37c..4385041 100644 --- a/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs +++ b/smsapi/Api/Action/Contacts/UnbindContactFromGroup.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class UnbindContactFromGroup : Base + public class UnbindContactFromGroup : Action { private readonly string contactId; private readonly string groupId; diff --git a/smsapi/Api/Action/HLR/CheckNumber.cs b/smsapi/Api/Action/HLR/CheckNumber.cs index 4a1eeb5..305cee9 100644 --- a/smsapi/Api/Action/HLR/CheckNumber.cs +++ b/smsapi/Api/Action/HLR/CheckNumber.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class HLRCheckNumber : Base + public class HLRCheckNumber : Action { private string number; diff --git a/smsapi/Api/Action/MFA/CreateMFACode.cs b/smsapi/Api/Action/MFA/CreateMFACode.cs index afbee25..e9c8bf4 100644 --- a/smsapi/Api/Action/MFA/CreateMFACode.cs +++ b/smsapi/Api/Action/MFA/CreateMFACode.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action.MFA; -public class CreateMFACode : Base +public class CreateMFACode : Action { private readonly string phoneNumber; private string content; diff --git a/smsapi/Api/Action/MFA/VerifyMFACode.cs b/smsapi/Api/Action/MFA/VerifyMFACode.cs index 3139749..30ec8c8 100644 --- a/smsapi/Api/Action/MFA/VerifyMFACode.cs +++ b/smsapi/Api/Action/MFA/VerifyMFACode.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action.MFA; -public class VerifyMFACode : Base +public class VerifyMFACode : Action { private readonly string code; private readonly string phoneNumber; diff --git a/smsapi/Api/Action/MMS/Delete.cs b/smsapi/Api/Action/MMS/Delete.cs index f21cec1..94e23d7 100644 --- a/smsapi/Api/Action/MMS/Delete.cs +++ b/smsapi/Api/Action/MMS/Delete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class MMSDelete : Base + public class MMSDelete : Action { private string[] ids; diff --git a/smsapi/Api/Action/MMS/Get.cs b/smsapi/Api/Action/MMS/Get.cs index 31f7517..85fced2 100644 --- a/smsapi/Api/Action/MMS/Get.cs +++ b/smsapi/Api/Action/MMS/Get.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class MMSGet : Base + public class MMSGet : Action { private string[] ids; diff --git a/smsapi/Api/Action/SMS/Delete.cs b/smsapi/Api/Action/SMS/Delete.cs index 96c2f9e..32c97df 100644 --- a/smsapi/Api/Action/SMS/Delete.cs +++ b/smsapi/Api/Action/SMS/Delete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SMSDelete : Base + public class SMSDelete : Action { private string id; diff --git a/smsapi/Api/Action/SMS/Get.cs b/smsapi/Api/Action/SMS/Get.cs index 1068e56..1f44bce 100644 --- a/smsapi/Api/Action/SMS/Get.cs +++ b/smsapi/Api/Action/SMS/Get.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class SMSGet : Base + public class SMSGet : Action { private string[] id; diff --git a/smsapi/Api/Action/Send.cs b/smsapi/Api/Action/Send.cs index c631d19..aad0c1b 100644 --- a/smsapi/Api/Action/Send.cs +++ b/smsapi/Api/Action/Send.cs @@ -2,7 +2,7 @@ namespace SMSApi.Api.Action { - public abstract class Send : Base + public abstract class Send : Action { protected string DateSent; protected string Group; diff --git a/smsapi/Api/Action/Sender/Add.cs b/smsapi/Api/Action/Sender/Add.cs index d769e21..09c1b53 100644 --- a/smsapi/Api/Action/Sender/Add.cs +++ b/smsapi/Api/Action/Sender/Add.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class SenderAdd : Base + public class SenderAdd : Action { private string name; diff --git a/smsapi/Api/Action/Sender/Delete.cs b/smsapi/Api/Action/Sender/Delete.cs index bc7e14a..eb22e4c 100644 --- a/smsapi/Api/Action/Sender/Delete.cs +++ b/smsapi/Api/Action/Sender/Delete.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class SenderDelete : Base + public class SenderDelete : Action { private string name; diff --git a/smsapi/Api/Action/Sender/List.cs b/smsapi/Api/Action/Sender/List.cs index e86bc40..d3bdf15 100644 --- a/smsapi/Api/Action/Sender/List.cs +++ b/smsapi/Api/Action/Sender/List.cs @@ -6,7 +6,7 @@ namespace SMSApi.Api.Action { - public class SenderList : Base> + public class SenderList : Action> { protected override RequestMethod Method => RequestMethod.POST; diff --git a/smsapi/Api/Action/Sender/SetDefault.cs b/smsapi/Api/Action/Sender/SetDefault.cs index b95d534..7fb9db5 100644 --- a/smsapi/Api/Action/Sender/SetDefault.cs +++ b/smsapi/Api/Action/Sender/SetDefault.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class SenderSetDefault : Base + public class SenderSetDefault : Action { private string name; diff --git a/smsapi/Api/Action/User/Add.cs b/smsapi/Api/Action/User/Add.cs index ec244e7..13d22cd 100644 --- a/smsapi/Api/Action/User/Add.cs +++ b/smsapi/Api/Action/User/Add.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class UserAdd : Base + public class UserAdd : Action { private bool active; private string info; diff --git a/smsapi/Api/Action/User/Edit.cs b/smsapi/Api/Action/User/Edit.cs index c963472..90cb2c5 100644 --- a/smsapi/Api/Action/User/Edit.cs +++ b/smsapi/Api/Action/User/Edit.cs @@ -4,7 +4,7 @@ namespace SMSApi.Api.Action { - public class UserEdit : Base + public class UserEdit : Action { private int active; private string info; diff --git a/smsapi/Api/Action/User/Get.cs b/smsapi/Api/Action/User/Get.cs index 6ca2953..8e9c747 100644 --- a/smsapi/Api/Action/User/Get.cs +++ b/smsapi/Api/Action/User/Get.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class UserGet : Base + public class UserGet : Action { private string username; diff --git a/smsapi/Api/Action/User/GetPoints.cs b/smsapi/Api/Action/User/GetPoints.cs index 71815d4..7d652e6 100644 --- a/smsapi/Api/Action/User/GetPoints.cs +++ b/smsapi/Api/Action/User/GetPoints.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class UserGetCredits : Base + public class UserGetCredits : Action { protected override RequestMethod Method => RequestMethod.POST; diff --git a/smsapi/Api/Action/User/List.cs b/smsapi/Api/Action/User/List.cs index d87e3a7..7344b91 100644 --- a/smsapi/Api/Action/User/List.cs +++ b/smsapi/Api/Action/User/List.cs @@ -6,7 +6,7 @@ namespace SMSApi.Api.Action { - public class UserList : Base> + public class UserList : Action> { protected override RequestMethod Method => RequestMethod.POST; diff --git a/smsapi/Api/Action/VMS/Delete.cs b/smsapi/Api/Action/VMS/Delete.cs index 322c4ad..d29b2d0 100644 --- a/smsapi/Api/Action/VMS/Delete.cs +++ b/smsapi/Api/Action/VMS/Delete.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class VMSDelete : Base + public class VMSDelete : Action { private string[] ids; diff --git a/smsapi/Api/Action/VMS/Get.cs b/smsapi/Api/Action/VMS/Get.cs index 4350c3d..3f12d77 100644 --- a/smsapi/Api/Action/VMS/Get.cs +++ b/smsapi/Api/Action/VMS/Get.cs @@ -3,7 +3,7 @@ namespace SMSApi.Api.Action { - public class VMSGet : Base + public class VMSGet : Action { private string[] ids; diff --git a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs index 5e8db64..2ed07bf 100644 --- a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationExceptionTest.cs @@ -73,7 +73,7 @@ private static IEnumerable HostErrorCodes() }; } - private class TestAction : Base + private class TestAction : Action { protected override RequestMethod Method { get; } diff --git a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs index 91d05e4..e844bd1 100644 --- a/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/LegacyResponseDeserializationTest.cs @@ -32,7 +32,7 @@ public void map_response_to_object() Assert.AreEqual(testValue, result.TestProperty); } - private class TestAction : Base + private class TestAction : Action { protected override RequestMethod Method { get; } diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs index df9b9ce..a6a7964 100644 --- a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerTest.cs @@ -50,7 +50,7 @@ public void deserialize_to_object_when_no_exception_mapper_found() Assert.AreEqual("abc", result.TestProperty); } - private class TestAction : Base + private class TestAction : SMSApi.Api.Action.Action { protected override RequestMethod Method { get; } @@ -70,9 +70,9 @@ private class ResponseWithExceptionMapper : IResponseCodeAwareResolver { [DataMember] public string TestProperty; - public Dictionary> HandleExceptionActions() + public Dictionary> HandleExceptionActions() { - return new Dictionary> + return new Dictionary> { { 408, _ => throw new CustomException("expired", 408) } }; diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs index 71602a6..cdcad6c 100644 --- a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs @@ -56,7 +56,7 @@ public void map_validation_errors_to_message() Assert.AreEqual("400", exception.Code); } - private class TestAction : Base + private class TestAction : Action { protected override RequestMethod Method { get; } diff --git a/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs index 61b81cf..4173bb7 100644 --- a/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs @@ -31,7 +31,7 @@ public void map_validation_errors_to_message() Assert.ThrowsException(execution); } - private class TestAction : Base + private class TestAction : Action { protected override RequestMethod Method { get; } diff --git a/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs index e4fd8d6..f7561d4 100644 --- a/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs @@ -33,7 +33,7 @@ public void map_validation_errors_to_message() Assert.AreEqual("FailedDependency", ex.Code); } - private class TestAction : Base + private class TestAction : Action { protected override RequestMethod Method { get; } diff --git a/smsapiTests/Unit/UnitTestBase.cs b/smsapiTests/Unit/UnitTestBase.cs index dcdb5fe..956ebb5 100644 --- a/smsapiTests/Unit/UnitTestBase.cs +++ b/smsapiTests/Unit/UnitTestBase.cs @@ -4,7 +4,7 @@ namespace smsapiTests.Unit; -public abstract class UnitTestBase where T : Base +public abstract class UnitTestBase where T : SMSApi.Api.Action.Action { protected readonly SpyProxy SpyProxy = new(); From 9f19f1c655ed0bf77de7d1fd5bbb099d1ed24f0d Mon Sep 17 00:00:00 2001 From: jakublabno Date: Thu, 9 Nov 2023 16:26:03 +0100 Subject: [PATCH 089/101] Fix getting content from REST GET request --- .../Api/Response/Deserialization/BaseJsonDeserializer.cs | 8 ++++---- smsapi/NativeHttpClientHelper.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs index 4af6e23..aa75717 100644 --- a/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/BaseJsonDeserializer.cs @@ -22,10 +22,10 @@ public DeserializationResult Deserialize(HttpResponseEntity responseEntity result = Activator.CreateInstance(); } - var deserializationResult = new DeserializationResult(); - deserializationResult.Result = result; - - return deserializationResult; + return new DeserializationResult + { + Result = result + }; } } } diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs index 148ef1d..d6cbde4 100644 --- a/smsapi/NativeHttpClientHelper.cs +++ b/smsapi/NativeHttpClientHelper.cs @@ -23,7 +23,7 @@ public static async Task SendRequest( switch (method) { case RequestMethod.GET: - var getResponse = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead); + var getResponse = await httpClient.GetAsync(uri); return new HttpResponseEntity(getResponse.Content.ReadAsStreamAsync(), getResponse.StatusCode); case RequestMethod.POST: From 49002164aac3704afc71a27672e230d630a3954c Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 09:51:47 +0100 Subject: [PATCH 090/101] Add support for async --- smsapi/NativeHttpClientHelper.cs | 10 ++++++---- smsapi/Proxy.cs | 13 ++++++++++--- smsapi/ProxyHTTP.cs | 19 +++++++++++++------ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs index d6cbde4..9729d6c 100644 --- a/smsapi/NativeHttpClientHelper.cs +++ b/smsapi/NativeHttpClientHelper.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net.Http; +using System.Threading; using System.Threading.Tasks; namespace SMSApi.Api @@ -15,7 +16,8 @@ public static async Task SendRequest( RequestMethod method, string uri, NameValueCollection body = null, - Dictionary files = null + Dictionary files = null, + CancellationToken cancellationToken = default ) { HttpContent httpContent; @@ -23,12 +25,12 @@ public static async Task SendRequest( switch (method) { case RequestMethod.GET: - var getResponse = await httpClient.GetAsync(uri); + var getResponse = await httpClient.GetAsync(uri, cancellationToken); return new HttpResponseEntity(getResponse.Content.ReadAsStreamAsync(), getResponse.StatusCode); case RequestMethod.POST: httpContent = ConvertNameValueCollectionToHttpContent(body, files); - var postResponse = await httpClient.PostAsync(uri, httpContent); + var postResponse = await httpClient.PostAsync(uri, httpContent, cancellationToken); return new HttpResponseEntity(postResponse.Content.ReadAsStreamAsync(), postResponse.StatusCode); case RequestMethod.PUT: @@ -37,7 +39,7 @@ public static async Task SendRequest( return new HttpResponseEntity(putResponse.Content.ReadAsStreamAsync(), putResponse.StatusCode); case RequestMethod.DELETE: - var deleteResult = await httpClient.DeleteAsync(uri); + var deleteResult = await httpClient.DeleteAsync(uri, cancellationToken); return new HttpResponseEntity(deleteResult.Content.ReadAsStreamAsync(), deleteResult.StatusCode); default: diff --git a/smsapi/Proxy.cs b/smsapi/Proxy.cs index 900a110..693593b 100644 --- a/smsapi/Proxy.cs +++ b/smsapi/Proxy.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.IO; +using System.Threading; using System.Threading.Tasks; namespace SMSApi.Api @@ -29,18 +30,24 @@ HttpResponseEntity Execute( Task ExecuteAsync( string uri, NameValueCollection data, - RequestMethod method); + RequestMethod method, + CancellationToken cancellationToken = default + ); Task ExecuteAsync( string uri, NameValueCollection data, Stream file, - RequestMethod method); + RequestMethod method, + CancellationToken cancellationToken = default + ); Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, - RequestMethod method); + RequestMethod method, + CancellationToken cancellationToken = default + ); } } diff --git a/smsapi/ProxyHTTP.cs b/smsapi/ProxyHTTP.cs index c4cfc9f..b09decf 100644 --- a/smsapi/ProxyHTTP.cs +++ b/smsapi/ProxyHTTP.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Net.Http; +using System.Threading; using System.Threading.Tasks; namespace SMSApi.Api @@ -60,7 +61,9 @@ public HttpResponseEntity Execute( public async Task ExecuteAsync( string uri, NameValueCollection data, - RequestMethod method) + RequestMethod method, + CancellationToken cancellationToken = default + ) { return await ExecuteAsync(uri, data, new Dictionary(), method); } @@ -69,7 +72,9 @@ public async Task ExecuteAsync( string uri, NameValueCollection data, Stream file, - RequestMethod method) + RequestMethod method, + CancellationToken cancellationToken = default + ) { return await ExecuteAsync(uri, data, new Dictionary { { "file", file } }, method); } @@ -78,7 +83,9 @@ public async Task ExecuteAsync( string uri, NameValueCollection data, Dictionary files, - RequestMethod method) + RequestMethod method, + CancellationToken cancellationToken = default + ) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; @@ -86,7 +93,7 @@ public async Task ExecuteAsync( try { - return await client.SendRequest(method, uri, data, files); + return await client.SendRequest(method, uri, data, files, cancellationToken); } catch (System.Exception e) { @@ -98,13 +105,13 @@ private HttpClient CreateClient() { var client = new HttpClient(); client.BaseAddress = new Uri(baseUrl); + client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", authentication.GetClientAgent()); if (authentication == null) return client; var authHeader = authentication.DefaultRequestHeaders; - + client.DefaultRequestHeaders.Add(authHeader.Key, authHeader.Value); - client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", authentication.GetClientAgent()); return client; } From 07c3b460bed0abb999474bd0176080509e485cd4 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 09:53:30 +0100 Subject: [PATCH 091/101] Add support for async --- smsapi/NativeHttpClientHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smsapi/NativeHttpClientHelper.cs b/smsapi/NativeHttpClientHelper.cs index 9729d6c..3ba0350 100644 --- a/smsapi/NativeHttpClientHelper.cs +++ b/smsapi/NativeHttpClientHelper.cs @@ -35,7 +35,7 @@ public static async Task SendRequest( return new HttpResponseEntity(postResponse.Content.ReadAsStreamAsync(), postResponse.StatusCode); case RequestMethod.PUT: httpContent = ConvertNameValueCollectionToHttpContent(body, files); - var putResponse = await httpClient.PutAsync(uri, httpContent); + var putResponse = await httpClient.PutAsync(uri, httpContent, cancellationToken); return new HttpResponseEntity(putResponse.Content.ReadAsStreamAsync(), putResponse.StatusCode); case RequestMethod.DELETE: From fa0dbdab592b6d53d7336240460a656b2746eb20 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 10:13:26 +0100 Subject: [PATCH 092/101] Add support for async --- smsapiTests/Unit/Fixture/ProxyStub.cs | 7 ++++--- smsapiTests/Unit/SpyProxy.cs | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/smsapiTests/Unit/Fixture/ProxyStub.cs b/smsapiTests/Unit/Fixture/ProxyStub.cs index 0981c1b..ef9264a 100644 --- a/smsapiTests/Unit/Fixture/ProxyStub.cs +++ b/smsapiTests/Unit/Fixture/ProxyStub.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.IO; +using System.Threading; using System.Threading.Tasks; using SMSApi.Api; @@ -30,17 +31,17 @@ public HttpResponseEntity Execute(string uri, NameValueCollection data, Dictiona return SyncExecutionResponse; } - public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method, CancellationToken cancellationToken = default) { throw new System.NotImplementedException(); } - public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method, CancellationToken cancellationToken = default) { throw new System.NotImplementedException(); } - public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method, CancellationToken cancellationToken = default) { throw new System.NotImplementedException(); } diff --git a/smsapiTests/Unit/SpyProxy.cs b/smsapiTests/Unit/SpyProxy.cs index cdd3528..f93e406 100644 --- a/smsapiTests/Unit/SpyProxy.cs +++ b/smsapiTests/Unit/SpyProxy.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net; +using System.Threading; using System.Threading.Tasks; using SMSApi.Api; @@ -44,7 +45,7 @@ public HttpResponseEntity Execute(string uri, NameValueCollection data, Dictiona return new HttpResponseEntity(Task.FromResult(Stream.Null), HttpStatusCode.OK); } - public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, RequestMethod method, CancellationToken cancellationToken = default) { RequestedUri = uri; SetParameters(data); @@ -52,7 +53,7 @@ public Task ExecuteAsync(string uri, NameValueCollection dat return new Task(() => new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK)); } - public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Stream file, RequestMethod method, CancellationToken cancellationToken = default) { RequestedUri = uri; SetParameters(data); @@ -60,7 +61,7 @@ public Task ExecuteAsync(string uri, NameValueCollection dat return new Task(() => new HttpResponseEntity(new Task(() => new MemoryStream()), HttpStatusCode.OK)); } - public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method) + public Task ExecuteAsync(string uri, NameValueCollection data, Dictionary files, RequestMethod method, CancellationToken cancellationToken = default) { RequestedUri = uri; SetParameters(data); From fe1ba95ecf1692a1ec6b846d58560211801bc49d Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 12:19:30 +0100 Subject: [PATCH 093/101] Examples of usage - MFA --- examples/mfa/CreateMFACode.cs | 28 ++++++++++++++++++++++++++++ examples/mfa/VerifyMFACode.cs | 23 +++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 examples/mfa/CreateMFACode.cs create mode 100644 examples/mfa/VerifyMFACode.cs diff --git a/examples/mfa/CreateMFACode.cs b/examples/mfa/CreateMFACode.cs new file mode 100644 index 0000000..8d35b94 --- /dev/null +++ b/examples/mfa/CreateMFACode.cs @@ -0,0 +1,28 @@ +using SMSApi.Api; +using SMSApi.Api.Response.Deserialization; + +var client = new ClientOAuth("token"); +var features = new Features(client); + +const string phoneNumber = "48100100100"; + +try +{ + var mfaCode = features.MFA() + .CreateMfaCode(phoneNumber) + .AsFast() //Send code in fast message (optional) + .FromSendername("SMSAPI") //Send code from sendername (optional) + .WithContent("Your code is [%code%]") //Send code with custom content + .Execute(); + + Console.WriteLine(mfaCode.Id); + Console.WriteLine(mfaCode.Code); + Console.WriteLine(mfaCode.PhoneNumber); + Console.WriteLine(mfaCode.From); +} +catch (TooManyRequestsErrorResolver.TooManyRequestsException) +{ +} +catch (ClientException ex) +{ +} diff --git a/examples/mfa/VerifyMFACode.cs b/examples/mfa/VerifyMFACode.cs new file mode 100644 index 0000000..9fe1bd7 --- /dev/null +++ b/examples/mfa/VerifyMFACode.cs @@ -0,0 +1,23 @@ +using SMSApi.Api; +using SMSApi.Api.Response.MFA; + +var client = new ClientOAuth("token"); +var features = new Features(client); + +const string phoneNumber = "48100100100"; +const string code = "123456"; + +try +{ + features.MFA() + .VerifyMfaCode(phoneNumber, code) + .Execute(); + + //code is valid at this point +} +catch (MFAVerificationResponse.InvalidVerificationCodeException) +{ +} +catch (MFAVerificationResponse.ExpiredVerificationCode) +{ +} From 3794ea4b0808259a433dbce1e7d5e699a2e52b5f Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 12:20:23 +0100 Subject: [PATCH 094/101] Examples of usage - MFA --- examples/mfa/CreateMFACode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mfa/CreateMFACode.cs b/examples/mfa/CreateMFACode.cs index 8d35b94..f2bd8db 100644 --- a/examples/mfa/CreateMFACode.cs +++ b/examples/mfa/CreateMFACode.cs @@ -12,7 +12,7 @@ .CreateMfaCode(phoneNumber) .AsFast() //Send code in fast message (optional) .FromSendername("SMSAPI") //Send code from sendername (optional) - .WithContent("Your code is [%code%]") //Send code with custom content + .WithContent("Your code is [%code%]") //Send code with custom content (optional) .Execute(); Console.WriteLine(mfaCode.Id); From ed0511d4babcafa43ea2477c02a85b45739f4709 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Fri, 10 Nov 2023 12:36:04 +0100 Subject: [PATCH 095/101] Examples of usage - MFA --- examples/mfa/CreateMFACode.cs | 5 +++++ examples/mfa/VerifyMFACode.cs | 5 +++++ .../Deserialization/Exception/ValidationException.cs | 7 +++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/mfa/CreateMFACode.cs b/examples/mfa/CreateMFACode.cs index f2bd8db..1ae329e 100644 --- a/examples/mfa/CreateMFACode.cs +++ b/examples/mfa/CreateMFACode.cs @@ -1,5 +1,6 @@ using SMSApi.Api; using SMSApi.Api.Response.Deserialization; +using smsapi.Api.Response.Deserialization.Exception; var client = new ClientOAuth("token"); var features = new Features(client); @@ -20,6 +21,10 @@ Console.WriteLine(mfaCode.PhoneNumber); Console.WriteLine(mfaCode.From); } +catch (ValidationException ex) +{ + var errors = ex.ValidationErrors; +} catch (TooManyRequestsErrorResolver.TooManyRequestsException) { } diff --git a/examples/mfa/VerifyMFACode.cs b/examples/mfa/VerifyMFACode.cs index 9fe1bd7..7791d5d 100644 --- a/examples/mfa/VerifyMFACode.cs +++ b/examples/mfa/VerifyMFACode.cs @@ -1,5 +1,6 @@ using SMSApi.Api; using SMSApi.Api.Response.MFA; +using smsapi.Api.Response.Deserialization.Exception; var client = new ClientOAuth("token"); var features = new Features(client); @@ -15,6 +16,10 @@ //code is valid at this point } +catch (ValidationException ex) +{ + var errors = ex.ValidationErrors; +} catch (MFAVerificationResponse.InvalidVerificationCodeException) { } diff --git a/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs b/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs index 310c80a..5080796 100644 --- a/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs +++ b/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs @@ -6,8 +6,11 @@ namespace smsapi.Api.Response.Deserialization.Exception; public class ValidationException : ClientException { - private ValidationException(string message) : base(message, 400) + public readonly ValidationErrorsResolver.ValidationErrors ValidationErrors; + + private ValidationException(ValidationErrorsResolver.ValidationErrors validationErrors, string message) : base(message, 400) { + ValidationErrors = validationErrors; } public static ValidationException Create(ValidationErrorsResolver.ValidationErrors validationErrors) @@ -18,6 +21,6 @@ public static ValidationException Create(ValidationErrorsResolver.ValidationErro var errorMessage = string.Join(", ", errorMessages); - return new ValidationException(errorMessage); + return new ValidationException(validationErrors, errorMessage); } } From d9fe23d384afce671cdbc31d02e37e07bc8a7ef8 Mon Sep 17 00:00:00 2001 From: jakublabno Date: Sun, 12 Nov 2023 14:45:02 +0100 Subject: [PATCH 096/101] Ping feature --- smsapi/Api/Action/Action.cs | 5 ++-- smsapi/Api/Action/Ping/PingService.cs | 12 ++++++++ smsapi/Api/PingFactory.cs | 30 +++++++++++++++++++ .../Api/Response/Ping/PingServiceResponse.cs | 13 ++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 smsapi/Api/Action/Ping/PingService.cs create mode 100644 smsapi/Api/PingFactory.cs create mode 100644 smsapi/Api/Response/Ping/PingServiceResponse.cs diff --git a/smsapi/Api/Action/Action.cs b/smsapi/Api/Action/Action.cs index 0b85b94..2f8b9de 100644 --- a/smsapi/Api/Action/Action.cs +++ b/smsapi/Api/Action/Action.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.IO; +using System.Threading; using System.Threading.Tasks; using System.Web; using SMSApi.Api.Response.Deserialization; @@ -26,10 +27,10 @@ public T Execute() return ProcessResponse(_proxy.Execute(Uri(), GetValues(), Files(), Method)); } - public async Task ExecuteAsync() + public async Task ExecuteAsync(CancellationToken cancellationToken = default) { Validate(); - return ProcessResponse(await _proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method)); + return ProcessResponse(await _proxy.ExecuteAsync(Uri(), GetValues(), Files(), Method, cancellationToken)); } public void Proxy(Proxy proxy) diff --git a/smsapi/Api/Action/Ping/PingService.cs b/smsapi/Api/Action/Ping/PingService.cs new file mode 100644 index 0000000..11b691b --- /dev/null +++ b/smsapi/Api/Action/Ping/PingService.cs @@ -0,0 +1,12 @@ +using SMSApi.Api.Response.Ping; + +namespace SMSApi.Api.Action.Ping; + +public class PingService : Action +{ + protected override RequestMethod Method => RequestMethod.GET; + + protected override string Uri() => "ping"; + + protected override ApiType ApiType() => Action.ApiType.Rest; +} diff --git a/smsapi/Api/PingFactory.cs b/smsapi/Api/PingFactory.cs new file mode 100644 index 0000000..103d575 --- /dev/null +++ b/smsapi/Api/PingFactory.cs @@ -0,0 +1,30 @@ +using SMSApi.Api.Action.Ping; + +namespace SMSApi.Api; + +public class PingFactory : Factory +{ + public PingFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) : base(client, address) + { + } + + public PingFactory(IClient client, Proxy proxy) : base(client, proxy) + { + } + + public PingService PingService() + { + var service = new PingService(); + service.Proxy(proxy); + + return service; + } +} + +public static class PingFeatureRegister +{ + public static PingFactory Ping(this Features features) + { + return new PingFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/Response/Ping/PingServiceResponse.cs b/smsapi/Api/Response/Ping/PingServiceResponse.cs new file mode 100644 index 0000000..038951a --- /dev/null +++ b/smsapi/Api/Response/Ping/PingServiceResponse.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; + +namespace SMSApi.Api.Response.Ping; + +[DataContract] +public readonly record struct PingServiceResponse : IResponseCodeAwareResolver +{ + [DataMember(Name = "authorized")] public readonly bool Authorized; + + [DataMember(Name = "unavailable")] public readonly IEnumerable UnavailableServices; +} From 1155f1cd0ca502fc1ee852923696facf7dfaf0c0 Mon Sep 17 00:00:00 2001 From: jlabno Date: Sun, 12 Nov 2023 15:17:18 +0100 Subject: [PATCH 097/101] Ping feature --- .../Unit/Action/Ping/PingServiceTest.cs | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 smsapiTests/Unit/Action/Ping/PingServiceTest.cs diff --git a/smsapiTests/Unit/Action/Ping/PingServiceTest.cs b/smsapiTests/Unit/Action/Ping/PingServiceTest.cs new file mode 100644 index 0000000..ce3ae2e --- /dev/null +++ b/smsapiTests/Unit/Action/Ping/PingServiceTest.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using System.Linq; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMSApi.Api; +using SMSApi.Api.Action.Ping; +using smsapiTests.Unit.Fixture; +using smsapiTests.Unit.Helper; + +namespace smsapiTests.Unit.Action.Ping; + +[TestClass] +public class PingServiceTest +{ + private readonly ProxyStub _proxyStub = new(); + + [TestMethod] + [DataRow(true)] + [DataRow(false)] + public void authorized_status(bool authorized) + { + var response = new Dictionary + { + { + "authorized", authorized + }, + { + "unavailable", new List() + } + }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var result = Ping().Execute(); + + Assert.AreEqual(authorized, result.Authorized); + Assert.AreEqual(0, result.UnavailableServices.Count()); + } + + [TestMethod] + public void unavailable_list() + { + var unavailableService = "fancy service"; + var response = new Dictionary + { + { + "authorized", true + }, + { + "unavailable", new List {unavailableService} + } + }; + _proxyStub.SyncExecutionResponse = new HttpResponseEntity( + response.ToHttpEntityStreamTask(), + HttpStatusCode.OK + ); + + var result = Ping().Execute(); + + Assert.AreEqual(1, result.UnavailableServices.Count()); + Assert.AreEqual(unavailableService, result.UnavailableServices.First()); + } + + private PingService Ping() + { + var action = new PingService(); + action.Proxy(_proxyStub); + + return action; + } +} From 07939d188268b4cbb565b50a64b4eaa88a496b98 Mon Sep 17 00:00:00 2001 From: jlabno Date: Sun, 12 Nov 2023 15:23:12 +0100 Subject: [PATCH 098/101] Ping feature example --- examples/ping/PingService.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 examples/ping/PingService.cs diff --git a/examples/ping/PingService.cs b/examples/ping/PingService.cs new file mode 100644 index 0000000..e8fb4ab --- /dev/null +++ b/examples/ping/PingService.cs @@ -0,0 +1,15 @@ +using SMSApi.Api; + +var client = new ClientOAuth("token"); +var features = new Features(client); + +var result = features.Ping() + .PingService() + .Execute(); + +Console.WriteLine(result.Authorized); + +foreach (var unavailableService in result.UnavailableServices) +{ + Console.WriteLine($"Unavailable service: {unavailableService}"); +} From ce5a7a68263f33617ab9aacba279d0937a47d164 Mon Sep 17 00:00:00 2001 From: jlabno Date: Sun, 12 Nov 2023 15:58:14 +0100 Subject: [PATCH 099/101] Prices feature --- examples/profile/prices/GetPrices.cs | 15 ++++++++ smsapi/Api/Action/Profile/Prices/GetPrices.cs | 13 +++++++ smsapi/Api/PricesFactory.cs | 37 +++++++++++++++++++ smsapi/Api/Response/BasicCollection.cs | 3 +- .../Response/Profile/Prices/PriceResponse.cs | 34 +++++++++++++++++ 5 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 examples/profile/prices/GetPrices.cs create mode 100644 smsapi/Api/Action/Profile/Prices/GetPrices.cs create mode 100644 smsapi/Api/PricesFactory.cs create mode 100644 smsapi/Api/Response/Profile/Prices/PriceResponse.cs diff --git a/examples/profile/prices/GetPrices.cs b/examples/profile/prices/GetPrices.cs new file mode 100644 index 0000000..a073874 --- /dev/null +++ b/examples/profile/prices/GetPrices.cs @@ -0,0 +1,15 @@ +using SMSApi.Api; + +var client = new ClientOAuth("token"); +var features = new Features(client); + +var result = features.Prices() + .GetPrices() + .Execute(); + +result.Collection + .ToList() + .ForEach(p => + { + Console.WriteLine($"Price for {p.Country.Name} / {p.Network.Name} is {p.Price.Amount} {p.Price.Currency}"); + }); diff --git a/smsapi/Api/Action/Profile/Prices/GetPrices.cs b/smsapi/Api/Action/Profile/Prices/GetPrices.cs new file mode 100644 index 0000000..14c3daf --- /dev/null +++ b/smsapi/Api/Action/Profile/Prices/GetPrices.cs @@ -0,0 +1,13 @@ +using SMSApi.Api.Response; +using SMSApi.Api.Response.Profile.Prices; + +namespace SMSApi.Api.Action.Profile.Prices; + +public class GetPrices : Action> +{ + protected override RequestMethod Method => RequestMethod.GET; + + protected override string Uri() => "profile/prices"; + + protected override ApiType ApiType() => Action.ApiType.Rest; +} diff --git a/smsapi/Api/PricesFactory.cs b/smsapi/Api/PricesFactory.cs new file mode 100644 index 0000000..27f710e --- /dev/null +++ b/smsapi/Api/PricesFactory.cs @@ -0,0 +1,37 @@ +using SMSApi.Api.Action.Profile.Prices; + +namespace SMSApi.Api; + +public class PricesFactory : Factory +{ + public PricesFactory(ProxyAddress address = ProxyAddress.SmsApiIo) + : base(address) + { + } + + public PricesFactory(IClient client, ProxyAddress address = ProxyAddress.SmsApiIo) + : base(client, address) + { + } + + public PricesFactory(IClient client, Proxy proxy) + : base(client, proxy) + { + } + + public GetPrices GetPrices() + { + var action = new GetPrices(); + action.Proxy(proxy); + + return action; + } +} + +public static class PricesFeatureRegister +{ + public static PricesFactory Prices(this Features features) + { + return new PricesFactory(features.Client, features.Proxy); + } +} diff --git a/smsapi/Api/Response/BasicCollection.cs b/smsapi/Api/Response/BasicCollection.cs index de11817..b4da875 100644 --- a/smsapi/Api/Response/BasicCollection.cs +++ b/smsapi/Api/Response/BasicCollection.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; using System.Runtime.Serialization; +using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response { [DataContract] - public class BasicCollection : Countable + public class BasicCollection : Countable, IResponseCodeAwareResolver { [DataMember(Name = "collection", IsRequired = false)] protected List collection; diff --git a/smsapi/Api/Response/Profile/Prices/PriceResponse.cs b/smsapi/Api/Response/Profile/Prices/PriceResponse.cs new file mode 100644 index 0000000..b0bfe42 --- /dev/null +++ b/smsapi/Api/Response/Profile/Prices/PriceResponse.cs @@ -0,0 +1,34 @@ +using System.Runtime.Serialization; + +namespace SMSApi.Api.Response.Profile.Prices; + +[DataContract] +public readonly struct PriceResponse +{ + [DataMember(Name = "price")] public readonly Price Price; + + [DataMember(Name = "country")] public readonly Country Country; + + [DataMember(Name = "network")] public readonly Network Network; +} + +[DataContract] +public readonly struct Price +{ + [DataMember(Name = "amount")] public readonly float Amount; + [DataMember(Name = "currency")] public readonly string Currency; +} + +[DataContract] +public readonly struct Country +{ + [DataMember(Name = "name")] public readonly string Name; + [DataMember(Name = "mcc")] public readonly int MCC; +} + +[DataContract] +public readonly struct Network +{ + [DataMember(Name = "name")] public readonly string Name; + [DataMember(Name = "mnc")] public readonly int MNC; +} From a4f4961e87c75421a611934b86b182f9da4b43f2 Mon Sep 17 00:00:00 2001 From: jlabno Date: Tue, 14 Nov 2023 16:16:14 +0100 Subject: [PATCH 100/101] Extract response exceptions --- examples/mfa/CreateMFACode.cs | 5 ++--- examples/mfa/VerifyMFACode.cs | 6 +++--- .../Deserialization/AccessErrorResolver.cs | 15 +-------------- .../RestJsonResponseDeserializer.cs | 2 +- .../TooManyRequestsErrorResolver.cs | 8 +------- .../Deserialization/ValidationErrorsResolver.cs | 2 +- .../ExpiredVerificationCodeException.cs | 8 ++++++++ .../InvalidVerificationCodeException.cs | 8 ++++++++ .../Api/Response/MFA/MFAVerificationResponse.cs | 17 ++--------------- .../REST/Exception/AccessForbiddenException.cs | 10 ++++++++++ .../REST/Exception/TooManyRequestsException.cs | 10 ++++++++++ .../REST/Exception/UnauthorizedException.cs | 10 ++++++++++ .../Exception/UnhandledRestException.cs | 2 +- .../Exception/ValidationException.cs | 2 +- .../Action/MFA/VerifyMFACodeResponseTest.cs | 6 +++--- ...nResponseDeserializerValidationErrorsTest.cs | 2 +- .../TooManyRequestsResponseTest.cs | 4 ++-- .../UnhandledRestCodeResponseTest.cs | 2 +- 18 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 smsapi/Api/Response/MFA/Exception/ExpiredVerificationCodeException.cs create mode 100644 smsapi/Api/Response/MFA/Exception/InvalidVerificationCodeException.cs create mode 100644 smsapi/Api/Response/REST/Exception/AccessForbiddenException.cs create mode 100644 smsapi/Api/Response/REST/Exception/TooManyRequestsException.cs create mode 100644 smsapi/Api/Response/REST/Exception/UnauthorizedException.cs rename smsapi/Api/Response/{Deserialization => REST}/Exception/UnhandledRestException.cs (75%) rename smsapi/Api/Response/{Deserialization => REST}/Exception/ValidationException.cs (93%) diff --git a/examples/mfa/CreateMFACode.cs b/examples/mfa/CreateMFACode.cs index 1ae329e..e9bad1d 100644 --- a/examples/mfa/CreateMFACode.cs +++ b/examples/mfa/CreateMFACode.cs @@ -1,6 +1,5 @@ using SMSApi.Api; -using SMSApi.Api.Response.Deserialization; -using smsapi.Api.Response.Deserialization.Exception; +using smsapi.Api.Response.REST.Exception; var client = new ClientOAuth("token"); var features = new Features(client); @@ -25,7 +24,7 @@ { var errors = ex.ValidationErrors; } -catch (TooManyRequestsErrorResolver.TooManyRequestsException) +catch (TooManyRequestsException) { } catch (ClientException ex) diff --git a/examples/mfa/VerifyMFACode.cs b/examples/mfa/VerifyMFACode.cs index 7791d5d..707d0f3 100644 --- a/examples/mfa/VerifyMFACode.cs +++ b/examples/mfa/VerifyMFACode.cs @@ -1,6 +1,6 @@ using SMSApi.Api; using SMSApi.Api.Response.MFA; -using smsapi.Api.Response.Deserialization.Exception; +using smsapi.Api.Response.REST.Exception; var client = new ClientOAuth("token"); var features = new Features(client); @@ -20,9 +20,9 @@ { var errors = ex.ValidationErrors; } -catch (MFAVerificationResponse.InvalidVerificationCodeException) +catch (InvalidVerificationCodeException) { } -catch (MFAVerificationResponse.ExpiredVerificationCode) +catch (ExpiredVerificationCodeException) { } diff --git a/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs b/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs index 4730a58..35abb75 100644 --- a/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs +++ b/smsapi/Api/Response/Deserialization/AccessErrorResolver.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; namespace SMSApi.Api.Response.Deserialization; @@ -15,18 +16,4 @@ public Dictionary> HandleExceptionActions() { 403, _ => throw new AccessForbiddenException() } }; } - - public class UnauthorizedException : ClientException - { - public UnauthorizedException() : base("Invalid credentials", 401) - { - } - } - - public class AccessForbiddenException : ClientException - { - public AccessForbiddenException() : base("Access forbidden", 403) - { - } - } } diff --git a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs index affad5c..ebfa8c7 100644 --- a/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs +++ b/smsapi/Api/Response/Deserialization/RestJsonResponseDeserializer.cs @@ -1,7 +1,7 @@ using System; using System.Linq; -using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; namespace SMSApi.Api.Response.Deserialization; diff --git a/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs b/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs index 5eaca12..23f0494 100644 --- a/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs +++ b/smsapi/Api/Response/Deserialization/TooManyRequestsErrorResolver.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; namespace SMSApi.Api.Response.Deserialization; @@ -14,11 +15,4 @@ public Dictionary> HandleExceptionActions() { 429, _ => throw new TooManyRequestsException() } }; } - - public class TooManyRequestsException : ClientException - { - public TooManyRequestsException() : base("Too many requests", 429) - { - } - } } diff --git a/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs b/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs index a7b95cb..46fce90 100644 --- a/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs +++ b/smsapi/Api/Response/Deserialization/ValidationErrorsResolver.cs @@ -4,8 +4,8 @@ using System.Net; using System.Runtime.Serialization; using System.Threading.Tasks; -using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; namespace SMSApi.Api.Response.Deserialization; diff --git a/smsapi/Api/Response/MFA/Exception/ExpiredVerificationCodeException.cs b/smsapi/Api/Response/MFA/Exception/ExpiredVerificationCodeException.cs new file mode 100644 index 0000000..2757f32 --- /dev/null +++ b/smsapi/Api/Response/MFA/Exception/ExpiredVerificationCodeException.cs @@ -0,0 +1,8 @@ +namespace SMSApi.Api.Response.MFA.Exception; + +public class ExpiredVerificationCodeException : ClientException +{ + public ExpiredVerificationCodeException() : base("Verification code has expired", 408) + { + } +} diff --git a/smsapi/Api/Response/MFA/Exception/InvalidVerificationCodeException.cs b/smsapi/Api/Response/MFA/Exception/InvalidVerificationCodeException.cs new file mode 100644 index 0000000..b6f48aa --- /dev/null +++ b/smsapi/Api/Response/MFA/Exception/InvalidVerificationCodeException.cs @@ -0,0 +1,8 @@ +namespace SMSApi.Api.Response.MFA.Exception; + +public class InvalidVerificationCodeException : ClientException +{ + public InvalidVerificationCodeException() : base("Invalid verification code", 404) + { + } +} diff --git a/smsapi/Api/Response/MFA/MFAVerificationResponse.cs b/smsapi/Api/Response/MFA/MFAVerificationResponse.cs index 961b1c7..ddd90e3 100644 --- a/smsapi/Api/Response/MFA/MFAVerificationResponse.cs +++ b/smsapi/Api/Response/MFA/MFAVerificationResponse.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using SMSApi.Api.Response.MFA.Exception; using SMSApi.Api.Response.ResponseResolver; namespace SMSApi.Api.Response.MFA; @@ -12,21 +13,7 @@ public Dictionary> HandleExceptionActions() return new Dictionary> { { 404, _ => throw new InvalidVerificationCodeException() }, - { 408, _ => throw new ExpiredVerificationCode() }, + { 408, _ => throw new ExpiredVerificationCodeException() }, }; } - - public class InvalidVerificationCodeException : ClientException - { - public InvalidVerificationCodeException() : base("Invalid verification code", 404) - { - } - } - - public class ExpiredVerificationCode : ClientException - { - public ExpiredVerificationCode() : base("Verification code has expired", 408) - { - } - } } diff --git a/smsapi/Api/Response/REST/Exception/AccessForbiddenException.cs b/smsapi/Api/Response/REST/Exception/AccessForbiddenException.cs new file mode 100644 index 0000000..242cd5c --- /dev/null +++ b/smsapi/Api/Response/REST/Exception/AccessForbiddenException.cs @@ -0,0 +1,10 @@ +using SMSApi.Api; + +namespace smsapi.Api.Response.REST.Exception; + +public class AccessForbiddenException : ClientException +{ + public AccessForbiddenException() : base("Access forbidden", 403) + { + } +} diff --git a/smsapi/Api/Response/REST/Exception/TooManyRequestsException.cs b/smsapi/Api/Response/REST/Exception/TooManyRequestsException.cs new file mode 100644 index 0000000..abc82ad --- /dev/null +++ b/smsapi/Api/Response/REST/Exception/TooManyRequestsException.cs @@ -0,0 +1,10 @@ +using SMSApi.Api; + +namespace smsapi.Api.Response.REST.Exception; + +public class TooManyRequestsException : ClientException +{ + public TooManyRequestsException() : base("Too many requests", 429) + { + } +} diff --git a/smsapi/Api/Response/REST/Exception/UnauthorizedException.cs b/smsapi/Api/Response/REST/Exception/UnauthorizedException.cs new file mode 100644 index 0000000..0a45467 --- /dev/null +++ b/smsapi/Api/Response/REST/Exception/UnauthorizedException.cs @@ -0,0 +1,10 @@ +using SMSApi.Api; + +namespace smsapi.Api.Response.REST.Exception; + +public class UnauthorizedException : ClientException +{ + public UnauthorizedException() : base("Invalid credentials", 401) + { + } +} diff --git a/smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs b/smsapi/Api/Response/REST/Exception/UnhandledRestException.cs similarity index 75% rename from smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs rename to smsapi/Api/Response/REST/Exception/UnhandledRestException.cs index 1468584..337d249 100644 --- a/smsapi/Api/Response/Deserialization/Exception/UnhandledRestException.cs +++ b/smsapi/Api/Response/REST/Exception/UnhandledRestException.cs @@ -1,6 +1,6 @@ using SMSApi.Api; -namespace smsapi.Api.Response.Deserialization.Exception; +namespace smsapi.Api.Response.REST.Exception; public class UnhandledRestException : HostException { diff --git a/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs b/smsapi/Api/Response/REST/Exception/ValidationException.cs similarity index 93% rename from smsapi/Api/Response/Deserialization/Exception/ValidationException.cs rename to smsapi/Api/Response/REST/Exception/ValidationException.cs index 5080796..36564c9 100644 --- a/smsapi/Api/Response/Deserialization/Exception/ValidationException.cs +++ b/smsapi/Api/Response/REST/Exception/ValidationException.cs @@ -2,7 +2,7 @@ using SMSApi.Api; using SMSApi.Api.Response.Deserialization; -namespace smsapi.Api.Response.Deserialization.Exception; +namespace smsapi.Api.Response.REST.Exception; public class ValidationException : ClientException { diff --git a/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs b/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs index 080fbb8..9292fdb 100644 --- a/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs +++ b/smsapiTests/Unit/Action/MFA/VerifyMFACodeResponseTest.cs @@ -3,7 +3,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Action.MFA; -using SMSApi.Api.Response.MFA; +using SMSApi.Api.Response.MFA.Exception; using smsapiTests.Unit.Fixture; using smsapiTests.Unit.Helper; @@ -37,7 +37,7 @@ public void throw_when_code_is_expired() var action = () => VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); - Assert.ThrowsException(action); + Assert.ThrowsException(action); } [TestMethod] @@ -50,7 +50,7 @@ public void throw_when_code_is_invalid() var action = () => VerifyMfaCodeAction(GetAnyPhoneNumber(), GetAnyVerificationCode()).Execute(); - Assert.ThrowsException(action); + Assert.ThrowsException(action); } private static string GetAnyPhoneNumber() => "48500100100"; diff --git a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs index cdcad6c..86083c3 100644 --- a/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/RestJsonResponseDeserializerValidationErrorsTest.cs @@ -3,8 +3,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Action; -using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; using smsapiTests.Unit.Fixture; using smsapiTests.Unit.Helper; diff --git a/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs index 4173bb7..48f9574 100644 --- a/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/TooManyRequestsResponseTest.cs @@ -3,8 +3,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Action; -using SMSApi.Api.Response.Deserialization; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; using smsapiTests.Unit.Fixture; using smsapiTests.Unit.Helper; @@ -28,7 +28,7 @@ public void map_validation_errors_to_message() var execution = () => action.Execute(); - Assert.ThrowsException(execution); + Assert.ThrowsException(execution); } private class TestAction : Action diff --git a/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs index f7561d4..c18b45f 100644 --- a/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs +++ b/smsapiTests/Unit/Response/Deserialization/UnhandledRestCodeResponseTest.cs @@ -3,8 +3,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using SMSApi.Api; using SMSApi.Api.Action; -using smsapi.Api.Response.Deserialization.Exception; using SMSApi.Api.Response.ResponseResolver; +using smsapi.Api.Response.REST.Exception; using smsapiTests.Unit.Fixture; using smsapiTests.Unit.Helper; From d4c9115032114f1fb744e691da097833fc947096 Mon Sep 17 00:00:00 2001 From: jlabno Date: Tue, 14 Nov 2023 16:21:22 +0100 Subject: [PATCH 101/101] Extract response exceptions --- examples/mfa/CreateMFACode.cs | 1 + examples/mfa/VerifyMFACode.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/mfa/CreateMFACode.cs b/examples/mfa/CreateMFACode.cs index e9bad1d..f90bc9b 100644 --- a/examples/mfa/CreateMFACode.cs +++ b/examples/mfa/CreateMFACode.cs @@ -1,5 +1,6 @@ using SMSApi.Api; using smsapi.Api.Response.REST.Exception; +using SMSApi.Api.Response.MFA.Exception; var client = new ClientOAuth("token"); var features = new Features(client); diff --git a/examples/mfa/VerifyMFACode.cs b/examples/mfa/VerifyMFACode.cs index 707d0f3..916463a 100644 --- a/examples/mfa/VerifyMFACode.cs +++ b/examples/mfa/VerifyMFACode.cs @@ -1,6 +1,7 @@ using SMSApi.Api; using SMSApi.Api.Response.MFA; using smsapi.Api.Response.REST.Exception; +using SMSApi.Api.Response.MFA.Exception; var client = new ClientOAuth("token"); var features = new Features(client);

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းZv$-b8inm$QE*8G)*0FME*W8< zvJ46UFa}&xXpBS$;lVU*1ZdoU&^S_KdML&0>Qa{JOv#F~EFEXm>nd|INN(n_AT02J zj626P=2Ed8O|zlAe?9nhnr}^B=6Tfk;p;$^4hD6}b^o zim($>iASSh%`s!^hgwz4Ba+bC{EJ6oxCF=0OIoc9E_su1%!82JC}p63d{CkVvVrHr zh$kK7=8*$QZAs$nzEhK%y-fP#dlo`3~N zQaM~IRl40qvoJ=ZAZYo2Fu(|)^mLcK(?Zv%LrvH4*0oIE2w8j*p;B$cJJmOEOT|K>2`*0;K|#50n?E z9H6L15l|9Pfj)PQV9Ty@XWykt9&=ifYECPVjYA@tRv6p0=fQw~X__@Cl+(qDrWKEm zu^415=HnPxEHW(`(=G%`1j^6a_LM`$4VIXP7HTw;86cPOc9e-ui8*jZ8CDgP&Q;(= zNOdDfUu_WjcI5;dF_l^IP~?QX7;Z;10XaHeQkC4#$VWB7d=NB%1ppo6G6VxQWLnp7 zS)<`H0=OL650@f;HOo8`)54t@p}@{6rwGku5E^ArR>Jt8j6rB6gTB#>&&D&llNp&A zrvE~-G=#SN-w2gp-N|(pkB2ei@!Wqtot2qXu8*13K&DQUeCDE}L97z%@jL^KIr>uc zSC+of2)iv&m%JM8{S5AN7+6M_kzy40@q{)K>x_5`_u1@!=(QFoReJ`4lB8;j3NXWl znCKUnQ>ck!yGk;kOhaAODNz@(W`pD@hZ&6QS8YK$#O4BsRhgJ)#7Z2D(R4E?Zkh^l z8PlGk;X0F9K`w(|2IDG&aX*9cKqaF)nvoyRRNGnjVjme4uqeOkqlHB zP&7b;Q}_;lQGBN`ucpeDqHkHbU`4Mj0pLx8EYU++Vtp_gH+rqRiR6{ zsBf@ds!3fQ#D%dBd7MmLHW3Vw7~3ykboEYZNOcQ6p$6uUt$)fQX$M6 zsYQXt)O(Ss_d|nNHfVRg$ybU^^Uj3Hm&;9BsABkk;~4%#hF@>m;hUIg&e2}07m(Z2 z0nbr;mk-tG$esu3*NWlj2hpUT-fJQO_syF%WCMH;Om|&gBRF|bD?Q1os6>q~KSk_9+!z0GAFVa7cjZ zC9kDAv?C^OWIMN-9U-}i?c8m2z`#~48XZ3Qkaj178rX%i>1pHR1^^%4Eovgar&?h;J!}LTI>+G;wHR(D*@rEe0ZVNkci_htyQQ`+-XI1x*2%a_eXk zPmLi#A6(Sj=HO&{CgtN+J5ec=kU?FQ9FovH7n0=`@O{wffTwZ|5=yy3w?xa2Bs>QE znnzRkMQNgHZ!W)4{ekh?WA>OrU5e5)cY6P{V*KwReTs4PB3i2viit z>FWexKqvU}FiuU9nQ%a#@Y(;xOhp|?VYoZcbm@q0#zhLIA?M3!Pk?AD2Mzg6a0nkU0VKMj|*u2uQT$0s=X_YCIA(NEqIDv308|x z2<~C`0>l06qZpIh0)(j$0!D*a29%lQ0#IQHnDK1z@7qP7Qx)jB1gtZ8)zGYeEO0d0 z5m3V<96_joh|m{W;OhUi@dEN$6Er24G~)99lC#O@B9P3ToNY)Jw_sQ5%u|3f&lo~! za3{j^c?dQ3J^UPke6UQEVC~*YK0Cl}IEW@r&E#_d z*vlu)-%v{f1QY`R0002!hBH=|x7`6K0_cXf;oSjo0uIrJGgfVo59ioV0002Umtf!l zB7an46uzEyz+j;Ip;g~+i!PfEkD1X{q5fGobx~5Ip_P%`5t>`j<34WFb%`- z!{48O8pcXP{`4?f{uvK{t@c{g%6K@lu7ATy-*I&vP98Qq9=XJIE^vobN6sB`@x{)_ z$T>qJ?x>3+!!M2;-ETmo+Bt7%MNUp=Z?i9q|Nz*v{Do~|guVqU8ta#rr`We#h&1Sk$`iyLN9)GkM z{)~V8L$PLPYzFXsG`?cw&@m&S&0a&ga;zf7#Mu>Y+&$Oe*tYOMYa8qJfZqyt=tT}F zW|M^H;Mo+tBb$c#>HD(nL+%5{umOg#`?Y9+bNn9G#6SOOFYI=P5sD6$ttgz*9gLNP z%{fUh>5q0}x!IHz$U^TuvG>w(CV#Ny?Ojm1;AQrzR?vqF*)9 z-Y7c3jQ_65N?2z4GzTmTrjcbekx_K5eW?cXHCacNb<||VEVF%jfNZcbjeo&|bc3Ga zp}y4N^+;#&=rk7lXtGi{U4t}HCssR6li5;juqN7v)y~pnQK@!;?!b#=SkoEoCMyX_ zAd2bkF8ovrz}v_VlrXaZ?t{|vp$;uDAq|z3i_)m+j6h^CASg4-vQ3dd9Vzb%7A^%M zJ`x_%$cXqQS}-y2QeryQAb%uQ3V=X+eya97HncEx*!M8B zBsH={%|rL|uxZ?Fn;*B|?ui4xF8+L~jrC}w#P8JdP&Q~P`^urbqkoHJua7vW?Wxc< zHnc;7DrK>Lr-?dC+drqy#rJG`S8A}oHV^$qkkN7toFZ$WjYu((Ex-h>l{4kqI0H3n z-GgD*wY%W@NMwMv+Z%Y12m)#E2U2H$c-RNvqbrW7y~Lm;b=-K9B%s(#I$s6E7C#WQ zL-s-NB>G)(KA4!mw&f`R`6F~7*x5j_U;ns z6LsI9r_YDa&h#8Y&l&KHyWn*!Iy_IEUqg{n`&%;4oAP`lx`Rf%7a#$94C=WaU*f(3 z_5x0Cpj-I~#Qf}088FU**2Mhu!Tdz<4q+dI#_c3%Wto;g06l7e&JJeenY-GQLXt9_ zzL=Z(PWgU!6Mt9^W;n;9n{t0?K`a1i;_Art$KyB#@aCh7SFw@b)#wDl`|>LV)rKE@ z=Na~Kn518U%`-&uH)_q~@6`H}e^47p?xMC$@)v4rq`K{c>15760rO#??LlBWpxO5M zq;27owoRY3?e|IB0cu?4bPWV4SP&qpiv zks*D^ezqxnWGWw+pRM2{i1{gm$XL6q-9abbAItwF zTvvW)0MaMJ16Ejua|#e6aev4OX8JRofxs5pr_w5O20>H4xxOG{R1~x0&-IrDbN$X~ zAl@8ss(+x#55$g)7lDU-E7!^k*r(%=e}-s+xmFFf_8FLR2%{~AaV9W2P+$*6Ptfr! zboEGmtGvLja9gNC=_Cj>(hgTk55pdY3kB&(M!z>`;ZRNwkt-=zB(Uz|XJf@$1@R#` zR*}FZP`0Nf31>LY%Q=7qg*^`GbCH&{(F^QkqJJGy&CVDF=0wOU2dXttS;6xBSTXgs z+9Fl0{>Cfn79qF&aY#L>zJ#Z^I#i@{(a3 z4Q+_lLF6H*)xyGXI9zBu7)4Db=Km7(Bf?Q;FU5rA`D_pB zsY(B}EsT#1=_1VBBnT4QF(A~o|NS{D)OPd)qZxOLu~-ghsGF{cUMUhNqO-3&S2Cn& zUyjDZ=w>VzOoC7NUY>mVat1lI*Vyecp^?j=8VUyh6sDIqjXteRK|K{ zx>yG`1XqP*I5|i*r^&!hmCax&Jby(tXUOKv#^XF4Se)o#Jkb+yqLBd+Ll-f0B|^wZ zQM6V#6EP-{n1qdU6+Z2&iN1!O*TU1O#(UCa?|eKE-*L$E@jA43Jv{Jyyn)&_$tl#< zNU`mQJ(D?mnzvI;@@yRrwsOE0{DT6b@QBXkW_W}%9q3nWI78?aLHs7VSbxrd=K>Ul zJe8Pb2f%s=7CPOBsO&6|0DlYepbU4_?(&v~`@<|+V9u@3gz96?ZP2>MLk{G~=_Wi5 zFMPPSTVuzXWtQp8#$(LF@x0Ds)OL$Ge+k*%-ncisWTR%HE# zSsf3V2B;M|^`%+Ghs;2d(2Bta%_OFF<9@>r$g?8*zP;bDiguE(D2^qp$SIrl8&P3f zkp=C#R#$Y74Hxc(xJ%rHHD4905^h|v$HtBoZbGq##ts$kM8%fJ%72A>y<*$P+6#Av zVq3>r3wN%^$~E+na2G0tPQqQRn6|=Qp_m-uKGCQnF2&L+cmr^06wtV=RcQg4>l8=kYM!FSyZ60)NHsMj{ci7oeSIrQG``Wjny}d+{d0N-W>g^yJY{A)F1SJUK2y zPtj8FIYv>JD{8Ew5{jx(R8mpn6m>Q-Q*ne3^G9mla#?S)j-w zK9}7Di0p;HPz8$wS})7B-02{f90Ow+Sd0L13?vwMjDSP~kbh*Lj(}tXP{Y872oT4> zjD>K}+Lm*Ap8>lN!6f)eEnba*{pvuJ*xz$WX3x6(KK$+V=fF#O!pJ9fLRjW8q zUw5L%cb{}}E8q60ReR4gmFXK5HC<6RDQbqIZdTMxMctyPSw!*V+XX)FT}-+?XjG~c-90ND%dk}F9%+mKD z;<#AP=YNSwTZoHfwr=y5=WHN^D#_baUGY1+4o&uq+4`PAoN`K?)0go5(&-$}>Fp|? za}{+5QmVk`Xn~~LyYA5AAdY9{c6}a+V_>efcOj=oKBuJ>G*7Oe`Q8BTRAJwxsJoF; z>uX-a`kJrSm)y_J#_p>{_Jqhl=sr%X8>3>n)&+bY^c{R^(W;M@iX*J&i3Tlr4 za6pg0Lxy)7W>QOQpvv+BIaeU|t6L4q_*QeTzS}HFYmAlB#>Y+;>boH_93L<(XsmksjZoX6Em{X5(8bo!pPst9bOtxbp&htWmKnR%P>mqLwIXsiKxC>On;< zSJXp_TA_cahl#>E>j(Q`8*R-z%qw6SL_!=djT$s#FT>Hax7-zgvgkqWh-B5}y6QSo zU7lVwu|nTYiDTdaeLE$NfhGEON*n_Z>f0%C9L_R5oH`0;Su^1*)puUv*v8`2V}eAN z%9lpkF`@1{%lWSJkWBU?lx*HYk#Rpz$p-Beto?tm)P9t-x$uDD8;>fD$5bj;5=DDP zUw!{8alZxo?r-q$ZZ41U=!z_`N*oV+rM^)Tr-nhb8g2NGc?1EXCStWsN9hW@v+%)hT9Hdf9ne^?r(|lSFHu8@ISbP{{B)q#Ap!^+1hU zuc$SOTC1pMQjI+8flU1<5=fNgiv+rad7o=F9#|}#KMbdm;X?7K+onaWU_$uV8SZk9$7BcsQXYPeY=C*&5 zIh27WYi!^Mcj^)Lr-5xC#gy8AQ56qR>1!VVo)YEfCDp4gUCq}i_*F%{rl>a*^(Ij# z2$MWXC-!Qb?nlj{O1~N2*NQ(W%l0kIUAAaTktdOpGSfd_+Im}A-KeN{h+6Zv>j8Dj zvs_<>C*nKVX~HnV+8TJ9i?Ams0>^)|`JWbt<@O_E?=%R`BEiPy3bmTxH=Bbe5d2zm z@DzeyO%IF2OC04aR3nao*MSUo4qNULL~4+wbF`&(TgSjUGFaE*f`+4*G+$}Ze1li` zP5>y@|7+!o#LMg=nAzCHTPW`l&Wd%GbZ|Ca6AD2qSU3o-2Q)Qw`Sft=2w;C!P)gtn z3+wT}jKU=P5N-nA0N_8Nbj+_eo^+T2vPIums_r_;qDg}XoUF%ugJ%*9 ztOi@|A_{X;bF1fF@2ZMw#4+#@*U`F0b(Aj4pES<$HksG0ve_=1&-uF?6t!JZpDXH1MSVe(%<&@jn40H zsp}5?;;_^MS3cro@InQ7`{R&*f0zDNziJT2 zzz+;yS*|LaYi zKhrORc6XR>QPwH)%-nVpLU2+Sh@i6`m4-xS_zYhaAI6mBE?ePcz9|wvVX)7Dz>Ibg z@|#J|df&5J4mOL>X5tr+L)gDTlVz112M7A^bQS#ro>-ZH?ZU1J{8rI(z~|(d_Ve_) zrwEsXlGtBlCjWoLMt(=l6m|%fZ~Xv~KxvMs!Dd&Ra`?DXwBasbWCOl@s4vR*i@kQC zjQi*M?H2*5FK8^zuwTO94e#^DR>r7_M$w+Yc9jaIUFUta9W-jy_zWM7PxxqjXTtbQ zACB)YPR#_)rYer(zw@?x?^|ZxoBh3+VMZBK$`sKM4U>N|)M?0 zlr~!=ZGIm~KmT*)y?g7^>htOU&iDTJ|2g+mKG!2)|5}hf78U9Z zBV(WVn}#8{VMEBugis9!bi;<=h7I9p7~;p&+zEe88D#NUi zoZ?YmN783=o8+0@tVgv)j;e%5WvWr7a8H&VRggxtb2;B#DQa3NJguVIX_;zTTlt&I z(^I|t&80o_UwnP(RbOAKPJ+7{rTS=~s)jTg0RMl4)lVc|QN*W)f6~9O)jJ|`0H80f zc?YM<{g8X}Yfv=Odt*8G#*6i!U*4PB)rC2YerRtlGWa7CqjI8@{H29acnhy5v*d3~ zM%Es~RGPRthiCI}WiVI7Q}vGgRbQ2OT!kTd5c|^q;YbgvTmITk;_Yn4CoyDLg;Vv3 z^iqHKq~kz5%EE1YBAt)T!uPm;eIBPhpwFYyx(nY|J(qUxP%0oG{{#VCb4H`n8Z|ks z$?44r;Kgu~C<9Ko5g1OtgL7%!ee|fIS6p_rRBgGG`~vi>M|XTo?T10@c0Jm+1yDnL zN+xmXaQa|T{c!=JSKY?~Rx-hlq6sp<*$00Dr~r^bP>+m;3cw(yGWpw=SJl3tDS(au z2I$Wji=g~d^skSr211;zO-KOzbhouD-G>2wDSu}9i&>SPil!M-+tmss`%vVUGR$%h z%ULX+W;v5>T3XfVemrhgQ-tp=)>8p z-Ja#ccaSk(_DTDRK54%cyV6g_y(E9BTC0jKi#dk0-{(0HZiMmv%}I^WiDVtDX5R^x z^t}X9_T@OCBq?_!Z>GNL@f>D*rJR!^r*wp$EDapXu7|4Z>QG}`EQaPZ!@AJW9J2RG zn>IyQNo$I-phVS=3i9 z&wn$=d4TQj;VzCus`*GgDx?$;eAQoL?#yT(rwC16l8b4BpNQ5T0AYAD+Gg~F8(s*a zZ=blHxYmRLe!6_KI@)loq>i-D>W4{eWdA3rq?x{&GeO~^O&}1 z>cTWPc0;f=QBTe{(vbNq^kZEpEGzS40MivgvLqVFR7$!r2w*T%k+dWlf=2;NqnJPt z6->Qy6%B(Bz`U#*f>VjE!c8=nnVB+Q3XzP`ilTHP8pZUhP`c6V_lbW;`lVqU`;BG4 zD3P>$E}8s@#;e{@Y0N+j6PT_sDvf@~#zdw`tjonMOp79t>f&~$VbMxsEb=gesXD9D z@SzDFWxCBPqnv@qm{z4pYKpna&m-wf%xAhTSyBlWFj*AEk2YAyG&{Z0NFsWY>B1>LUK~&8Yic$umHB8w|J@6XScUdw@Io2}uNRhfr z@j6pgmh83y>zMMRl7`|ccc2t(nHK-vYE{ zD$J^(+wDn|F|8tMj78|kF1HUHMoOyn_M#H8<@^? zktu0CW-`5>U6a&>cJ_Xz)-lo%Jl42bs>1`G~$}dYXUpeS_mn<2m2A_>C{kC+VMl zIEoCHTZBQtl*!bP=@_C+RC%5BlXk=N4ET8%yh;x6I=~cVC$&ALC+Drh3Xe&9F_Bd3?S`t_JR&;}?d< z`+AQ5Dky*D9+n@5q})a_9}_}l9)U$kV|}&u$*zf{O=X$Q@-s2fCs0bc3a~dj=q^B0 zZv&FUIQxL)pxc9M0}ZIE{n=B<{;ZTTPtWnEvCJb`fZjP$Cgn5I^xr*^zA) zxTI{5!&%toIA>fLk@Cg}Yw3x=Dek+d9#ah{yqrXL$FmlaHa{xYKN{49w%N^dcvHwH8%a9t%iZ$H=OL2XH_Q{L z$5MaUM0xFDc{CCE5lMY;`5fp_I*>Nbn*Ju2y1zNd+`&) zNO(2Oi9gqopQ8y2Jm!(IJ3k*u6RyoZO4WamkYw|J>&eF>Zd!9pu7Q13CI7uP=X{(M zveq^?XKl)!_C;41i^=uQC`nyy-JtHBEm^v2Yjfs(h3#jizvZiyXL7DPqw6 zge0B(w|pKvADl;WTZ(*gPqtjY6ecf@Y?qvorPMwUkn3dL$COMtjivl#3Pm9Mpp<`z z%J*nQK(0G@rEHQZeS2`fukjOuC)|Z?_J&pO3u*0R*^cuDz1&ey$}M~wOv;k7bq;xv zFRlON``2E)YwWAm&RKoz-AwWjPs|sR_BBFUF3OSX08e;$I^DpyGql;~!>8VNNuFpn zaQl#&vXj>DX6z%mG$?JFx%SigfM>AH_|JIVDZT?U8eKQWm?cc*OlBbGaNVX6z zLq;%+M1%uw8Q}-Firh610B*_Zn=T;GJ5CYu8yTkzqHzx09ZWZCzgbLoo42LpknUAY zG2>O5(wmwJjC|5T8XFQSVyb&mEog1AD{O!uWm2op4=Mur1rbxi!=?1 zRvHmh*OF&~k%D(MT^^Zgq~eR(T9RfMY4};w#nJnW420|HS|W3dOw`xZCop*;QAIrY6A?N=(oL8f+iMh{fu>%$bwmS{#HoQ%=-ADZ9J_h4 zV>eGhw-cB!H}bX7$l+Jy@H@@n*BB$TUuW}>aR#PnS{6NSG{xg_g4urzYcx&qnC6+- z8>eKm*paWfBVP+gzLvm=Ojzs6G|xshk;-1jEI~6(Z)MjvTcf?EqF6&BdxkcS45f|? zZ810=v$1&|#u2F=nw#zLK%82eWq6TD^-yNE$F4YaH9I=;b#~gz(qJC{heavo1 z)AV_?oT!LMh@|Pd%g=D`Fc3=^}@*dwf$Xh_Q7rO4CBp< zFfUG%&5N;?NOd&b?2E7BG|TJ7yo5LKnBxtvTW+&}65)=zOW?pWi#pV?@ zdeIyer%PQM%xi44!@S-``^_p`$hFMEts!C29boHW0+!f%xEU|nbd&G~(>@_9y9HY` z$;u{Uw&H>02qoSMF&C5Kx}~1Ecz|glk-$7Wu5_ASR)jfe zH@oJ+X}MnM%(}_B?s?dwsZsJ$&phm9T4(Nw3HN*)(7JyW*||hVR21{o?4_Rh_*LtA z1cZBmBf|oupHl00nzf)d1Nogrbeh(!G1^%RQOtCcxz*@K)K=?WboIBM#7s>=cRQll znx6MaU5%#QE~z`LqlDAKcoP0o71g9xh($=#5&r|wai_uZjZK+`_j{8-R z-%}W%X(NC6Jr(y`lG@)|f|;7mCBG$czk1~NH0Cp@eRvvAJ7_tPnv$1j9n(5X&Uz^} z=_m(cUM$52Hos?Zgh}n@Gq@wqu5(gGBaWh}j-9A7I~6oi6YQKV+|QtqvNX%Hy`(#n zNlpG)lxSU!yBkp%lbZZ<=&E(!y1Ehd(Yj9I3h{qD25Md3a2U^HnATO3?gfm}y7i=c z0hLe8;zM%og2|olbqQ`lr>G9myPzSN!L~BaL|9d z)Y^!PH2vUPYHh+`CKYothBK*{oAInI=4N|L(yb(&>UO!c8EZA2n6up4f=%&!%dM^0 zZp-ivcH1(%gOX;64DZ-8kgi=^7baa#MOfroZM};Dn(p?jwzgrIrn7v#jQ22F(`Dvr z>wVnFq_Tg2` zuoLGO*PiRwt)1wvDUe%f>_P>R+UZK;6O7VSKU8V##@Jd*U#0OWZqZbhQfYsDh8aZa zTvr-<@PMYuNTu;Pp3rn6>Gom?lj>m~)-b6(+K0EBCpy}PeN5aDk-dj6aD;T~)J-tH zz;8?{=9frok%;*v+Ayh@U*cjWj!9&X`4xtdPW3+3_zI(m)G428?8l8nD&JJ&YfNEM z`D!rRmahgs+49vO{j9`p);NFi9YjOYsZ+kmI*6u3>XdJ?zCnqm%gjyIw`k9#@_mO2 zCYA3yY-3XSzJsr2yg#C{Qxo|PA-!cH${{phQhtZfhKcJWviluIFPq!aykPS?f;Vh_NAPJPACcYfD303vjv}p9!tW@~W8!>7cE4lj(JFu8cMMM5aMGzW z|DJUW*J!FA+G8EZcufJ{9_vTks;MkxkM$E~YP!L--})I36RA_a$NB{eG(}?jtzYr1 zrgx+Jt>5sHrpm}33u2w7^xz>Z?M5?fj&cGD#qmL%>-muM2FFp<3@wtl=Q76WZDoqm5FG13;(^9S8z<%hYhA1sf!Q`15350+QhZ+)MbU6Sa?Cl1-N z`^1lN$|JJhZl(ygPDC-qsZ46$O|hkk-Lky3%Dz1EwPA{(Ha|;@WK!8JF@;HGx9m|! zH$z8R;5uYj;&Dwg(tol1;wf9qfOy^(Ga%l##SGYEl5ST#=5c=`Aij&ogc)?i42hp? zF+(D^O(JH<9+PzSl@5^{uRkP;G+i1q%_Px0PCIr@u=m2DFH z7Zt~tRJT!KoRfd(HmZA{sL0+sStgUEI%kQZZwq*cLNpk3zcEI?Bnu zI%dofC0lf`MagzV$+kx!-5_mQ6;1bNJEG)>k+vu~VzMntjy($LrpIe(Xy!PgWEiuQR+BOYaM$O(tUpzkJ8+%BMuO$)7sjs>xh{r zj@n}8IZkVyBW9lMwC4NsM6|7~NpFHU*9lB+T&^B;^zgVo%v@_h>-&}0a6p5Al zTZnC%jz!D;XNg^!;O*^iDZbP+DcIZJN*vPkT5x}e|7`KIrW>+`_)CPZOwn1s-u~7i ztf?sH0)HD3V^aNq0(O_z9dpTRQlVCLqw|T5&jP1XH6Y^=Xb328)9~H_;nV2Iwt%&i>sJax1H@#Nayss-r@Ji-}o)imQ~RS zerJ>}j$5jWSZ0gT#U6!pt4XJBhU?8PVymVZ>38_g7auXHm|ewZw#vFXZkw+5n56S` zs*O3`>?$&eRLsfd1&)~AM1H44%x;d`rkj5wW;feyGt1x2c85$iyW8%Nhx`|cb9BBP z-g*8WqO+!NLetHjwmW3H*~@l^OgDSm?vPn#AKP6p-MmQj(owz=v-}s^-u_wszP9&$ zy4lb6zRxoIi-EP1$XVhq7nf^7Xo-J-7^BH_O*aRMahisvPd5jNX?ia5Z(J^M% zvA$E{*0@Bp?VOn4CH8;clJ5B~lI})n@CE-R!v1$pgGCMNZbl|n`Ug97L&Q&7*9Ncn zhY0h0NuP>uvZZdjrh9!&h`zMxE)(m!#&ty7nUt^k4!h!OsqKH4E7uRYe7?ARxeS7(S=kBb78z`bM{`PXAl&0PS#oZ|s zmm(o85TKNj6o+z6uIbSv7w#@V@lxE~tvG|bOL4ct;8JXGcmMX?g}aar{s(_UXY$)` z-|oKKTfgLH8sy)*mdqKMhsf7|=m#z7@}Jxt==De>>=PD${IF$(I@jXcA8rcf@%!b< zh_tMt5QXSN^|zL3a&60r8Zv*`Qn3PjRwdcYW%p>1Z0Ek1lSkTi+&c>ELmN4j{cOpW zsw%(K()0Ls*Yh>Zb5wua7H0huYt%oe6?_KkP+7O&wSqO|y8X2k5;d%>73cKpHW!cQ zm)rb$&L63`_mE$=;B_Y({nX=IgIbQ6+aka17J zc=PROXJ*-I$$5OD?^yqxvc3l<-|t`RooV*@b?xu;6s|IJABA}qtj~U`+a!14D=r7k zf2<`hoTZZWl%ytn=AwVCNT*2}!Y6~zFh12J&qa-3nA%t`2+l?wAl?IKMwxMDA9HJ_ z#x%fI+L`qzbBuWidz%2~qKm-==qk264=zSgu^oOgALCQf7@v+#5&SDH^CsqlU;`aP zY+A!9W)~~*uX>%#F6Ji8By&4vnwe!f%sqdZ`!f$`9?v|Tc^>mp z=C#a5#S%-3YNexXIq1RJR}pQ>R81#a))UiiyD78ciC{@(mB<$2Q}KGu_OPF(4vL%T z^_pQJl;h^ff^UZ{(V?tWx0{H9d&9$OZTo}qc@GnDMc(hbRN~R%R`z@=y`-Ei+Jw}7 zO0M=Mu^`^fxD$W8F!G4Fhi0Ai4RF`FKLlThd@q(n&efD9#lz~l$|La52i@1Qr8254 z(Uwuhl&;pC5*K&OWh>v(^|jlJLzLB9c2(l&i*cn-TwNuv*wuQF@-*Es*Xhbjq|I}c z@+SK^M0qlNJM1#2#=Wy3_yY9Kb4mR~%e%_O3imbhCQyI=f*^nI|AOCQ|AF6J|A6o7 z2f~{au;8r>P`=Bq3LYWgI-!W@s2NuxVsZSU`@GO+=?^_GeyZCxG%YS~%|PE=H4=&- zrv-g(>)xRV`>a+LnfHKD3+s89E$nj<*2{Q#QV|iVR%+%rJ~WS;DmWFt?Mliws+SS+ ziDVgp-*A7S@vH*kX$_RW@vbCfn|BKN?q;XJyPF{1=7e4L!b(E+!l#sq)Ty7+NPUy~ zpdv^6lZw?gm-@WY8eTwMM#$fvza{s&`280a`K$B0v_p6pWiREL$S0ps1+9nL_Tl~M zY32QzjZx|)WdV}xQ>&FZalgw5{GN>3UI?zlKIMPN%&713hh9ppe%?|AWEUXWT{!H zk=_o^N^Q)Qn5)tIU?+V7u1jBnUGyE8r32_~=!2;h z`UuW{KJzlLiEd(j8}nYaJjr~9OT9!(%+h~EFSCA)I%cV(H>neT-eSu;6o=&l8ieIT zF7++*N2U5o}gX9ZP}h;j?l@VO?QEN(Bm~R8i(f?%?8H#S}C@qV39nGUTzs@%Q!3` zENbhybQ~=Wo(9XgoO&_6NOtRk;341?jW2=kiDY~g{N$59cUlKYrM-+S_ zqJbYrjF9v;2G-Y(bE!i@(&q%&Q9B84QG0jjVc4g+)Elfrs^r4V7*kVUq++e6PSJ6- zDYlG3Utc@UdP0@8I+yh%^!K%Qvz~^YyY3CvB0NRw)`h}SF9@yGEzCL!y?1|IjI|b) zccg{o9i`YZ2K`*!IO_?d{!ljoOGEv+Y?*}asK1-_H1t;WZ?F!{!u4lHXW@Qit$t25Q&dYX$c%qhqu(1e@PdXh@ZN?A@Xdxvu&Qwy{5T?Jo1(=V7o1J{ zjDlT_8mKppfd@8DfEPASf?C})cvGFInWFm|7X;sIjDpAyDotbHLQNB3tZ5Q7nx?@+ zn?z)aE^As4)En20aIK)9Xo|7cpg(U)u^xkNYaVAk0ljYXxvVFl2b+KIW<4E|wR(fK zsFkBSRLl1ZeNJ-}tgqF;yPL;2bpm{&c@k7xron|+3_vOrypECp?}M8P9kH1LX+ z1?n%MrpUVBI*}d0Y~;0inUk8v!3CJ2S#sZ2$+MYvGGAlT?3|OiE^|i^sco0gDUs+x zbJ0^R`z|Cc`!CZ(xz>Msz=tAlGSy`z7hzItA#h#hzOlRIRhZNzxh``Nv7xv~JR`zN zqcX4Zr1FWfVraL}RH#~AO^vBrs@tljx~saMdZ2oXI<0=7ey{e0PYH)fP!ok{0a9r} z>>&$LHBK4Lv=p__3N$a)uK8$Xnx9rdj#ZIkHRMATQc-;nGw}sd3;B|X=-2q+);B`lM)!>!rsHXd7BkHYs z7+j|A39!HZX>fmJ?pMIK=9YTv8dtwAS@j`!tMU!FKuGEvRjI#Fq;6@E9;%w9<)~(< zpJW|}F8NF`xvW>pY>=t1G1r}2=6_+1A3P6Smakq_BiRJLt#<`#qLG1rDKlI6*n(2cY*cr&dE z%T1s{x6*&=(6@jJ-A`*mKL9H95UmCMFo+WhtpmP7QE-}K;78OAenA_6-%}h^#m3;Q zq6dtKUa&#*fh{5dwu*jmVX-B+q}Uql5Zi*Qi|xU+!~hr-8rUsTU|i_n#v%i5BMfjm zF#_%=a^RpaK||~eW`zyzEQ;W+Vpni4F$x|f_5gp67kh!Hh<(5_#Ta<57zZyB2Y{E0 zgTM#HA>gy(Fz_vL1o)mf3j9bM1AZ=!1HTm~fIo|qNT*fQWx>_dYrzqQ@b>e@uWHrE`LwjXLLZ96qp+J-`vw$J9MyzU^|viO8N+tc9> z8!F3wF?(g%qGt;QY-`L==QF%~^sDXV@WX#|Rr>q7p_DKDtL>mtT>`dEYAgM%Fs~;` z;8Tw)rf4ooN!+HlNImM9nHwvYg11wMm>L<#wgxJ z-2)pXdN&>D>W=kxbyHXOCf&(yO6X2v#3*c#=%K`@?dZAocrR^cnY)c{m`rXalat8= zZP1;h&3Y3_N+Rq}O7mvu>0M1Ly?Jy?+C{e9zyPH+M=QD6QXeE+PnDv6H`?tR=y}~T zQWU%^8Zz{3I-ZuUH?YiN0WyE%hTJqU6L*$!5KFm=vwGZI*V1GGoV81X&ve=wM^MO; z$1stq-I~B>@X~S_M>o-YXma-GHH6kTb8_7&J8y32Q?)Ey5I?~GvayM(ef#s zD`XZeDBBIXEz7iGW?Fxjt`KsTP0jwik&=;oNqM!iZ7t&!Dn)W$7?x6B+{+`6Hep=>w6pkLo`6F3|KWVubX9E^UriDtVx zTM}Ht@*+dOs;F)2xxwrxBJ4=ctUTur=)At`uew+grB0)yY>iN>K)t(lii>5 za`U4Y?;tEO1)_fiqg{SB_x3A7ty35pzs4aPH^OC2kVlNns#&1CdT=(AU2fpJDvJ;L z5pF>v4dD%Wo~Wj^o@MUJW0Ly-+j+;pfXx!qmscma^%Q)RlsAdph_@F18gaI?42WHs z-ROyQT2DtE$1(CW8`CjBaH*jlfcf7Ucp%8UEbRw ztehLMCDzYs85#mg3u1Cuo^7y>%gk=ea4hZ1?tFjB73FJayVsF2C27j#WtEk1_;sV6 z;02?vs9U2j1YC3(S|)GWIPBW(JdE5OShG^YWOESQC2{Y=+^cAtpmu%2!ntv45JQsO z8k^|(j5F-5eten^EPp}wGFk{|J7;SM_yM5bGN_18JiS|NSWk^miiy&^z7Lw_2o*|- zFDrka7D%2%iiJeZhQH0SWZ3H)c`b`}aX`5fSfgv_nxZ$w!wc9 zJ`ML4TsNkZC>9FbOWnJrbk`ck_PJYc(dix9T+3&4KOw;*&W}f}Oi?}$$_3E3mfgB< zc5ghG&G94d^sMykTQ)T9K#U(B{itlLz{Ws!S)8vGjHZ44`%`Bl8#&zJ95;E!nj|*> z1n%K$$RxWYyb~BSXXVh4a7_RCzI1=RO?9VzL&qruM{jVBp2~9|FIPTYHpEWi+TC7_ zW&qC^UtexS4!Um_L&n{;+xwCQ$316YV9<;7V-ybIypqPbOU8S&tnSJ6^_+hnL4|yk za8Cz7x$x{pZ#oBL$TkIQ7(ZWy=SQCx~)9V+Rv zuj=^nO_K85<`-E_Y1a7 zbdF>>nBf41vyDv#KJuGQxko_qxJ;RONZEsYZt)DiT{rn0V-~zwQ;~mMnkuFAiaA+2 z&0u9fM>~c;OQEci@*Xy@WMH7pREY3s0S+(f)(9c&oGPTF7 z(Sl=UEUhp+8q8NZ`pW~gjrD7#fdOaOu&KvLS*C3cIlNdzaq1hj4ZGsB-7b%bHg)e@ z)Uq~t->A-XI!>A<5_o^u|3T$`J&aY{?5_`GcKMf60XuK2=yf!>9n6lrUJ>8QL&85Z z@xXC+nV_){(3RgsavA?X;$6x+s~7w%!Ts%*_O3I;og#|A-IU$r%xa=%kFLF*M$dBg zUZS4$>_W^XdtNlnY;xXNFb4{P3JMA;3L;iiP*6~?mk)}Hf}(#|Kt)hNQ9;2Ew%@#& zx!t{-Yx$y}oBz(M^JeDFo0-k!Eq~@{l%JAtuKKIb)!le4fiH;2^74ao0s$o9@BRHf z>Jh3kjC9ElzT(So$i6x=5p&p1aq#-QYlTQYQV=55Ma(CVK5q5bIq^Mx;FCOHnUF&i zk9LF>(J7KAsCs{HP`%(Mhky#62>9sNxcD2k-1A89lQSL3V4n;m>MMx9xWEvdCczmD zg2Cxg1&(JUC(X_Iz&Z?+Hu@mdfw0mvIy8TRSVYv)C<`RgMc;OIFfo z$k8*Zp%C8;`8-f~x$S8x_}PoMxYPR$W|w_&3Y~w{JF3+M#TyoNxg^@xrxs!3qAoRP zH#(Vm)B)}R_Nf8rgL|rg;19s9F;2O|sS4Nt?Gh#SCrT~So<#eF?M+Y(_&lf{XhAjE zW*fHmr^~2BSI_}~djJ|^eY9{9OKIK10a1(l;llO=bd2rh36TIxK5FldPo(d-JK)j8 zDlLC4k7}cA3hmw3*4{H#|BtQLr~?}Md&JmZyT$=>4i;&NTuAHq^w{S<=sF}GV{Kr4 zKo6P?aQd)8nK|H1@MyoIsjBcgwBTEm7l1+?Wv>ff8_)x1j@xVjqg>ecWKg1n`8b_U zq~md)L}#L;u~X=DI*M<~oQCp5n!zl&qW^!nIqINh3pV!XUQ^83E z_htwTHAGp`n5>hSf_zU^e;>jJa6b|sTEE8j`)IF*(ieTmi=34nM{HMeCXa|{mDwvb zQ0)~@&ax*w^t=mt33Gjnw(;lm^Q(J8o6S;#SJFJ{SD{m3*heiIUn2RLplN(2c&2}i zO}fy96=+mY4q$y&&cqm6l5>i>b8Hv0&RSJSJb0oBY!xquIR{mjHZ}r;Mh$p_d)<(8 zlc@pYG33JQoVFbGEn0@835!1Jsdj*g+TAtlMCXFWRUe`~uo|$qNVHXKZBVqy?rMK( zaoqdT0{5oJkz0qaF5waOxo5ue0OfxNB=BC~ovmWW$LsxQP5-$V*z9+D$9uu)(f0q? z+PbTJm$(=+)IlHT*is)O#g58t0nZ1z6>#dj4mxZr@X;l#J5N+xJ@yJ9YBP^gTz`C? znjB|K)P{67-hU_;iOXCIxUXgFikY1kan4?&#N`}QXa%?MKkc+u+|SUl`0RgAu!U0i z?RYZIJtE>Ao;|=FKy^^MEUhyq7&-GJ1)F>DzBbP` zE>iME@cdvkYmZy1=$s#(ufOXDZe7@PsKfa0l$a=c2RzreFA#xe&96(jS)zUlFN zH$=STd6x+F4|~LF&bl?O0slyk<`%;7QU1H}p?4SP%P2YR_bkoeb6RLM>t~ohUdLqh zf%^=5d;&LQo1hkWe&K%sc(1`b;sv~RX`Jiu4Dbr&Xb{(t*L`x|y^m~n+%xa*@oxQ* z9XF(eOGeT)3_FD)KQ2&56eiQtDc3X{hw(-lWnp-S1kc;!h2ap$H5$2HBe!VeA&uN` z0eRafTy8T&C5_yok^43BkVYQU$aNaIQzLh4PF3y$M}R>v4Y!;kqxNwd^K@+Cz`~4($WJhKv~H&n z1wa8MPsoOV@Q~t|Y1LCYBHnb`WOWvY}-KRG1-^uQ8pFN!Y{K^|E1N*hh*8lbO ziH}Z6ass>|3R4sbQ3&QbbL7dV1VCFOg#n*Ze8K|rfZIpXVKhTWQT8aB23n>QXq^-3 zbP$Jwdn#>wG961N(TN}`6c*T`)>)`)7>R#$F=eJx2;eGi5BE$Woj(tEGn3ZK3z%9) zE4+uyv}vYupmj8;I9cI5VWu;%?!e>{m};+(@eU7xJ&*eeh;%HZv7L(IMp4`hfpWbF z|5OS^F(o3anj%cG#|Pkfme^8eG%TD2SQx(NIJ~cY$mPdeewKD&>kEg$R}y?H!S{a- z*ZR?sqv4vMQ$L;jTN~$x4Y~zv8^O_WMWrIlvsT)K7!C+7EQ^z z2TE|LV=*X7@<@;ZDDngePL|eW{j((RJPFQsECxl{vpP00hDAr#nP;u0RPIV%pUXvN zT`naMBKV=mw1Jy)Fr@T$ha)=|rB#(CS%Btd6_Y7YhIORTE! zfc*rs6>hsIKa@uW5Qo9X5_~4X7pBdTq?DFzGbeznJCSC}84H*;vr5v<2kL*xH*E%T z2x_}6EU~O^O5oTGpkgsnRP$}?0I;R4c~b&Kn!ofhr-566@{1Bk(|tq`q&0#XF;i10;-(?NhXjy6re8!=o85uajMz| z*(9zl3^HiO-0;j^wR>VHhi89gUZkcPwtj`lF(}h)%&N>eN*S72>$DacoLNP#L7T1Q zP`WQX;I7ErJxhB`676Krw)Ls%WNn{XX<~Bk($vIWll#n0OjSYF_VM=FZxZRdrM;%G zg&Sn;x!a!jFUm_qha0rP4axLFPma zS5$GKwyQxqgfg{OUQyX)jdyA2&nr*;73KYiN(SvRk}$TLe1U1S!d~oWgD1(vIFn*r zN%51*jF~O_;zt|gl-G?dL*kSt5*Q+K+A1Ws)JpAT@X54X|w`{K*ocdnQH3ri zKEx>aobeDd*CNR+W*xO^wK!?J7BloNUKfm8;W9}!X19?F6_MW@V}^$q7Y3e61Bg*+ zwfsL)>8c!pnErn*1i1$>0AoO$zw3MZqoxJQ*O_DSm<)9PuSp()ebXgawLhCQ_^;SLjrFHZ~rZcciHM% zsPcL3J@(zLBtAqb?%KFP>xp9rZ>WS${ml&8P;i61ut25{!ccbVs8A)qMuj_s{FT$s z5*48ovuuR8f-J9?1;HxnRQMxHt8pwXf#C2_S>FpSjJ2jP3QdvV0@x2MVHk=6b zJ3f-z_nKztF(P_@Qgz#ZdbSE*E&6X7ueO+58`{tSlHE7dGZIf zy#W$)o4dLvBizq_5}kV5k*B?z|LEDz-9x9J z+WzVnx4Pv06QPInkWS0n{X(RCwmZ9@Dl*vdC@+%b{N3f39t9?9zDOpVka=Shct=&s zJF^$=j@QvVJk9Uk_WE#=SM7H3aYeGXZ0A!V(1WV1P4ZM2C)$n*FGC%%5&4o23a|F8e} zWpEH|Of+20H&B*F`CJ~0`>c{I{D2n z!j4HM(;6P4>?D~Ny^iFT&){F0k5<2Vmi6ztxVGhgS~HMV!Sx{ze&LqaBgtD#VdFIL zd+PV?QA>T+DXo0=qFIzgo3cMdUQ`Po`8%yI4MQipBI|PdOLQV2^jKbF$pYsX=pG%& zb#(hjuAOOws|kEIoc+dgVu$LUfx8#7Od?;7?-Jic`_LHl%iL$3QPT|dFq&IehfHn} z=g?+@6axSN2msLyhBH=ajX^64KmY)=gqL980UMWaHv$HK zSkwg^$MNs)CmeT-gF85srHn+31R=E$L^we3m_iYemhJg8tc<1&v(ko{Wqa>Q*^Z)Y z*xt5xR%UyV?cNVuJm2U0SNA-xKKK5O`@vZ~74C|J9dSf>C8DD~oV&QJWU36mJaQa= z?L$GwUVAX|GX|#6Cy4Zyh}=pSbRDsOX#a!vJzRLrFBOSl3wG?1g}gshc;C3=+t2{UOP>=I>DDL;_!ZV?1ywB-xb-P zjicW{HP#^u)6tBD@S+qBg3F!Is53QWNXSVeE4rPAX_ zggu%)oqe2rmG#6q5{h%Bp6z0Pk7bv$YuR<|r|kFa1g|3{URT=LUD?yv3)m;w*V*4# zug{gqK1a4^cV_ov&t@-UpJF$#Lu_okE8E695@z>g7qM&D>)G|}8|<&FC&87O369KR z7qKU>x3Lefo7kV(Nr{e3Pjsc5-HW}Dy`EjqZeX1xN0O6VsbV8+AG?fy?PnihH?c!( zq2G~de!hS9aQ1TcR`v~cBRekHk-}tGc47BtSF=~Mud|=9sVR=+rMS|<_Ohq4=dpwA z3+xuw6L6(8;K(fY5cXL1X7*n8bM{9zFX+gWpesG>p6n|2GWHerJvK4bk+G?+G_W1) z$?RF|1MCy5q&bq5#-AsDJC8kEGkXs^A>EOw>8{vU zx71d2OAijg;tEGjt|*nW(T@QyvGJb|K>Bj(GtSqO?r5^*>NdJz1l&W$mM0r(&^AYLC z0GjAsaRg4SYUW(C^kV=UE1Ttaq;UKa+)&lR`4;KN0M^m3;Y<93lv%BuZQ0%4n(8iT zK~J^(k5`ZER=u--OhZj|ubhmY*}bwC4#c9_`r2N(iesCRP_v6nteGzn>{7F>?177F zrpa}9tY*4AjgRmHw%{LlYNtz5?F<=@tx;LKorEzL9oQQOp$|*25^HcH?!dix7%yT2 z-mjJDt3p1jt&k!7RXbB+!ZRf^EYa62$qQG@l<;h+Km%HT(1l*?j{R^57UOs<#R{y# zMYtJv;(iPce{QWj6%O;6b@D3y#Mruesj6#`W9o!gqb#dylvSv#ZIWy1n&b{VS~pkL z51)7CwdmH@yV8L^EU6zkwv6{@VKpAXvv?O@4WAz)r43`G4Lf3fLyR1S<+uP><90lV zr|>F1z-A18;jaea6)StriIu~#1S_y=j_~rxU2{D00G`Avcpn>w&&7$qF-}4#L^-Mv zK{pmOdgX8|#R{xy^vN|?io5YpV>}&C$J6n2f;^8;@Fl))Oq7JCM9D@0w#E#E(S}~^ zgGD$2%W(lN!z9WlQlD7Qs|oDcFl1^Jy)<&j7#=TrHeQu&?I6Je1#t) zA^8o`9Fjzg!&aDzDl}mSoX`}Ky1dz(&S#{{rslEo9fpRFkCVTe$8mg| z_**i6B!p}%nUf(aP}Cy4GNq{{lkYf_pEr}AH%oSH$&$ShQ=KJ;4PTSZv25wXQmn+9 z;o~_R&yhYX#Y&7EAJ5+-iSRx*T< zV-q6~AU?|6UZyvh8|lf~0HS%Mh(9=4W@&aEXElR8N$=9*$D=`5D%82L`O z;n+6PhoxAFk?(2>$EQdimSQDFj+aPPX9@qjl}HCWAN%15oQN}VA+AL~2Jkdq$4B@Y zTM*M#A}J_D33lib_3D+^X<Xl7@(f7d}Mz(5r`7hYvjg=Vr@Bd5U;89(SIMp6_ z&GkNs9c>@t#XH(wB&hZw(R7mPH275qk!(7}bU<|~f}$Iy(@clV^V7}wv8KnF&M^09 zn)6xae6~5CW6qB^=O>uoH`kocGw1Wo`2ur(EAzaG>d()QLecA zRvkpK`TJoT)jmuyU7|V@rRM&r=K3vlvO;0mDU3CU#(5^baooX+(SM5WE>6zyK zO4C)UgP3K`SDWX}HlJT(y4KtuHeF}B-gE;!CffO!quPr`)jl+to~t^Di0Vuo7gfe150tF4H@IsLsHSbc{OREeWIT$4;uJqDOTcb~fFs+KXLOw@2GU zXY;-g^XWKs{Q~iib}@ES9fySyJK8?%E`ia`!yeGr@2SoQu$Q{ui@nX~?PGdh)d@IE zbpsZe&pX`Qe}trswjW2T_F}Q>WE`bB8-1#Gi*`IcgZGngG@YQn-(ysN_uyF5$Ep4_ z+DUX+cwV&q^fKOuaXg(Iy}lAB(1B>rQJo{gj&zVN;e8NG__tze^!h@aD6ylRjFVKy z;bh4g?KGUC+KZ(!VYD-Fs_J+wlLFD#pQbt!r>k~whUz#hH@(7q-kGY?ahCb{&Q_g? zb5uK63H|x!Lf^kiCXIG~JEX4a#Dp~4(pZ5<`yZBIbHa=2ahL8C#M1B1ys{Qy>wGSIje`fk~(_fh0Wco|f zn@xYE+JmoE3-c|1irMPt|4y|J-<$qHwFf_{o{6979QAp>sPoLus?*`BJ{Dt~QkkHh7o*yLMXc%oJgPGgXYTi!`+esA zcyoV(xj)g|pJeX$oBNYhhmd0K52(&YP<0tn`9AdX(;OM?IE2)B7wP8uv8sI-XF9`l zrs*ux*`{+$k2gI*bpW}lg~_9H)%TU}RF1YE1*%zjT-hJXBi%#)n}T*_W{tt`bs7n-+Q5DU`CLq#9!| zw$UtQ$(k)os4TA(vPF18k~x ze=?GP=g75YMmq&!B9IfpRKW0f&Jb?~as}sC8M+>55OV{$K|Bx09pdFc9v~0y?+Gyx z$O~cu5FKJ^p#6xS0kJp`6Uk#Cd2EQ4fDR&gK1iM~lIMry`6GD&Tn01p0s+JRAcTV< zmIMkx+Cw202Re+jhant}a0J4U2uC6LN09b^Xov|wF%atj#X^h+RXkXah0y#HASMDO zLQDWU2C+2I3B;d-_>&QT3gZ8h%VdWCB*a2MrvStLG>Az+XOQvJk?}K-@iUR}vk-qa z;?F_+xrqN9;?IXz9H;=vJCEcQLaYQ-49*Xn_ZMK;UxM%jgi9fo1S&(?%aQhrNc$y! zgfAmp0T`a&-$;8U!c_=gfmi~l8seouHAw%f2wy|^I>NOG-$0J{CemI9F#)I^;$=V$ z5bxxkWEH^DU|SdLYXqzcJ%4X;nN2e{&~1p<1Koj`2-JjdGs1TfzK8IAgdZT>f^aLs z4-tL@F#)Iz;^m-f2doCouLI)sK%EeOivT@_mD=Lo+*_$9*K2=_ot z0D1+nHmG{R?{N_{ztKbh&_QMAtr-L zhFcQ17<#{ygIEw~F2omrwj(myc|f0dogawRC^t=G2B&m} zwtrWK|E9E`F1eIlNm>8Pp4b zR5*+os)2eDkUEErjFwD2Sv5EuXrwuHW>;|7&3M(+ifc{w-?SFg>wwmCxOel0sk8Y9 zhtHVnf?5wqpTqSQhM+bAGUl+Mr75U40d1a~+jetMTL5k0T#dfq3iJb4nLoI)?t$~i zgQJpE!Mg5{$>PT2c93p=fYOH414=6r1&_yVBT;zpI5O!5DEE?jK# zZYRk=0FR@P_8AaxcKi2$o)l86=D+lkue8_!&3@L-yFAXtmkVLOR&OS+nU9ld4;8MJip7wFwR(H zMP6lDEAPke7w^Y^9^Rb%*w`_w%B+Lm#3Im(xZAw=@g31hHLXjF zMH$}|a`QbKzOhVe99^&2YChkO<8h^XQVDJzWJfQ$&~};=m0`)CyMcKz2~1BW*_$Ra zSuLe7UC9jZrISa#)QfshT#qw(BOeNtGgl1?lei4WMG%^QJAbY=R{fwp*&$syJ8GG| zedvdWP3+{DtmD=u1v^)d2s)*d)!_BKX@toHK7BHi3fzMKxqSnI!!Q$-#Jnc6e7V!R z_4dU?9eI<3>sczG`F%x5ucdhCTb^uw1G*QB431MupXTK>1=e&E2A%Bc6a1D0ujc2~z<^YMxf||F9M{0Oy!RoytK2LWtOcRe#W9 z7>cixvuqXyeruoL&NG`QJn$?wM!-Drq(xAi@MM57jq2ev%f1=o+e+AXTwox_ETnsp z%VL@WS9Q)pry@tSInTL1RJBBLPuZcvhwMkNyP0!;6MBj2B_{8!=ZY48+*MZ8%ihhn zHM~9x_a%xfe@F(hTT&UGG$s?Q?5vMusJRMYWr3XL#|`NcK!~*i4j+*-ayj6Nzc42N zS_jyFz8#CWo4b~@N5Z-4nHVp(;9bk`R>zw*&dkG~n6AomontO??C?6k_C&1RsDtV1 zo1R*#c`90Eud)E`f_?+(Z%m=$+KImEr)vjgAp7svA@n|$Q7^sOOrtmNZTspCsWOkA ze~7H-DYJgpJKTv?d%iGaB#il&`3d#IgRpB zukTB&iGEp6n&3}6v<8sb4m&AuG}zoo2YYn34ITF)i3pyY$z8 zzP{<2Vu~NL)LLZYwwWIFF_Tx?crMeDJNS5{sE`Tuche7(#lBOzemLv)X;U+bOWO_C zOq4iB2<5MyxBqmVnCwgZ!ySNX6^$$EZu_~o1`N=)kuzQ^}$8xI)N zo7HQ6;;pru10sIyJ&FBoK&@$PHP>5z6~kVpHDB`W_?Mg)C)AyFPWcbSz8+WjDh0gg z5}+w<*bYW=L3Tr@y!6Jo_cXjJUW8pWS)O!Qx;L;~QA#^(&Lc^48gs@hm}p4&JS^oj z^YX&my?v{Cg8o<%c}y^PgL)S!G4TGjLY${gr|h^06f)aS##S^j`)}zUx}KbW9qWvb zjTc^dHKJ5e!~0IMYIWu9r-eNdz(08*ZROl$XJ=$$^?#MHim;mmx2 zF%>Zfe>40|!Rrn|%|g=|v)#SeKhjZ2`vk}3|F*R{e!z^{xBkf-sg^728QX4!+Uj<; zK9UA*bTwz?L@dDAQrdTy?U8kV_|_rF*8O_QW}f!f(kA@M?#}f+FX!wLi4dC3neBGR zP7~YQddizq4LsrL2vY%D^K|*-`UX=pGV|wjZnJRllr^x3I7xPTpx|x+AqB*JGR2 zO%u|rcoq?A!`$oa?5{Vi)>`Q6`hHcWAor7h{z&yCfU9$sjfFX#%@Fcmrsw_%$LL?Q z;N=P~;;Q)6V%@QrmRMbXs!i-VJ}au1(=6Y4Ol#2A-s4;M%>bU*%GUuZ?#<=763irH zwS2vy_Bo2Q&(LEP^tRac`~|t(y!q(O%rDN%+U;qpGLLQ;kfLo=a8VhWC%&HWa}+9r zpyz~)6(trWgMA*{Uz8iL%iDA%bHeJOLb=-dO?OTEibC=?3i?WapSTb(qd!=Rpg~@Z zPd(9Z7QEpqdp^!K>+nIOiQ?aP+>2@z|W4@o)#H?|GFgK@IJ6>18q~MR+gyZ~L zi)C)K7Hzca;bAEzru&VW=m=R+S%y?+GTURe`!ePo*XTEz%H!j8W~YtRQsb6Wsv0an; zP;O>_7G~))*zi|m@wA53N>W{uq@ztOUP#9g2Iwo7Mb#kpwn}#G7BkfyM*lyB;^siEi(Ow2SN_Hz3f-rDkxj^X0Q3oNd;jP(I8#RZ^K7Z#(1cL>~ud=d8wJl?Osswf(CEUhA8rQNKSZ z(iQcwPti@{ir!IMdthdN7B;A^ArSAI*Gl9fUiG?vr0kQkAegEkbKWT8ynNnBu6g9l z{^zmJ<^%6C7K9(<%3ZUfHq%3Q;*xZr9 z!yjCK2BZIakrHUMP)flgDb-nHjS#q3{nDC_`360kn27J6Q~ZhXRmSa@(@o!jzH0NY zJNw#p6%KABZ59Ies9#ziW4kG>ySNzt_~>g_+0&Ib7!AM3l5Ia^Q`EWS#j=GV>>d2u zr#^i6^%xBDPrJ~xJyt4K0V{AY)cK&5ctG`klAc@dHO=C_#`F9Jx>nXLr%TfllGHB3 z-NCE8=uWf7Gbf%~KFv63`Y_Su`F;A>_P;28rQgT*Xsx>KSSzmo^CQe)`g;l;FdRF| zVqf)BnaE#Zc-G2JFsezb;TpZ-o|f~6mbi+gKKq`+-NF6ad&iRO22(Maq65-OL5IqJ zl2ZMmb8ecC_uyWY=S!+7CJIcQPIREJSV2t6tJs7*!^R!g%>oMh#2t>}O(GtVOaYS@FJMD|IWbiCwMDF&Qfykg?28h=(a$eT)R%`j-F}DL zryVEyY}c)z=o0t(QUOKzJCcjv`Wz_#;c<)YU!!lb$MNV<$>G{8^#jYucH4dRVY11mhG9NJ2a>7GxEl-_*Zc_MVZF-JhGD_1oAq zGaL3A;rd=k2p=ETy)J9(l)2g4vof0Ln@;o5apeb1gL-KkCDUBF<} z9UyWdW*MU~*;jY|=3yUjHf5an;I_vX!u^$^sMrSScgBKo;sW%GWi+ed8vNb-DbXoh-Y_6#f-q^OE zhi1z^v3i@pq;b}e<=9~de>v&K*AowX8Y-*AN+U%?c{3w)52`ve%X^I}&Tk<8dXjxu z|HW|Gp^hi{>`NNUJ6CO=P~Nos$t=n9a#|t5E@TLbP9Ev6Zo`Rtuv?3xBq)2*-j0Uaic`B~7v!Jo z%I6z-$){1|<2Y2cWU&xl5Kh%~UAsTT0I|OV3|Jjah!Hi2ilSk+e zE_E8O+(&5`9er6EgRi-bJ9FH$T#9?~%Q2xz*T00D2Ut^oR}_F>sECRcTqtTavK(M! z53NcFVFbcPsEU%1hd#;TC1F`xDgq)drh+UL8BV5v3ltfOqktet6-A2*tzr?yBGPx` z3j~Pv^Alf^^PhX}x%ZxX&Iy7p&?s^@G5g5ep1E(BMb!=c(QloYcb|61A2lma7hF`y zozJNI95&;B3pvt)lE$wRgA?=S<-4ylK2yu$oSv*gyR`MusV&{2jfn>maw1F@exCLP zcO+x&zES8Paedbbt$?tD_X922{9Wk;g#`&kTvw~Q8)pJ8oti3h%s5lxr>hgs zhnoGV;9xMJX};#-%7GeoNh5SHzp1aYex26DOUgEXJb_R)>`&a}=UnxCX#@Yw6?%7N zf{kbG!OL;myA@VnSvt76bIIJgDYoMs9CwcRHoFgjXCJc(GLFkt$sw9$3u zNsH(0&)W9p$*r|b(|(fqvATo3ve(6T5@t+Lu=EV#QR0y0r!BF@bsukr%0)O$dAt8b zPOAs35gFL?;z~}O>f$~nF@)75C>HBRvDw6b=whqVD;gDEM5|p-XBitDd+h&lN?xe_ zjRo?t?+f{g5nn&ESTkqy1tk%Y45PO{7;TN1Oty+oF>FCR7i)&nk*Q+Z z#?8%18cbMBEYdluAN5_6E>U`-?3(%hxP!fiZ% z)+l%baf;?-FNGatS7&wAXV@s*`t7@o0nb!!T+*0UQnU7a(scD1uHvSvOrsMH6Fnce z*u`Fa`$|MvcsaYMplm;%)cgGrqUO~n2C*noX!aeCxn02pX2aN#`ko65eRwF$;PVYg zdL)tq)s2F^B=h+?>tPgJR%-&l2a=6{K^6*8geeljz|YFVgEl8TOz24HAvSi|Hf1np zuUm(dhAaO**RRQMd(lgy@6{XYwtqONzP*jGk>E-2Ah;2%2{@H)I`t6n5pMu#LzQ@*bMGg5q9rE6m{s!u3P~+@GE>kngy8|Ks=F%{s zc-UqWk}gSKo26@D0_&RS!c5qI$j8(G`(tQm;A?7Z#=>TzYht9&)b;gY>KRBZ9pTML zx)2NYMYu5J=0c`WbzG?SRI)2o2P}@G3zh8TB=u;pMNjIL-WJ_0jxJlQu@`Psmr)<+ z$^Jn9YlQyS34Pfg7<^5Y!6;Qw#!EWlgYpDCUm=O&3cffXvDj<~A{^O&zN#Jyg`h*V z)q!VJ%_zC9eX7;JGxKmr>T2dRxm3b22m-y@9++TJd-Klf~?lTqV& zQznQri>^3FgTW$yd#!bB7vG^|d+maKop!+^j0eIs&?h;e*cK2X0k8lEO)oQ30qF2g zc?FF<*|B8k$p?D8;|z{}06R%+go%qSJ#sS+A`+km&FTrOcYLC!wfJ(Lq)yz6oj8Gz z!DTT}7A~pW74`_KAV4z(aNiuOg%)LIS0|PVcBWwQR4DD9-kbM}pb9zYcx8lBzsh;X zODAdhJu&pjuE7E!%pqZi7StbbkPw&u%lp#5z)-_w32X0L5iMeWK3hajnxNi>%Ug(i zePL8GE4e*4^MUZWpKPF`N=-K5pLv=w8stZ~@JRh7z@E82A{2$Wl7W<{mm;7H2uf&> z?=9x0(!(djMtLh$t{KnbfVoOo0`vre)EieZ6@Pj{E;@F*v{%nqK?Y#U;fTa_5svDd z`k@cFwa)A>a)9@Lb;p>-xOgkO2)Yc^fycFmxiC7sEWq=%K_|uDIi$UwU(TvzUru*@spFoFbAuOF`v+RESOCq zbGbYrLwe3L&Zb-gJmbCBU$dA!7N@#?w7KoqHbXXV$q+Js#_JgTE9DMYq<}iTyYcSU zj#*3OtQS7+4wR__XR=BkzXpsEt2W~0&L{h1Gt>Y)*ple+V*>%zmB=tbe<_w$M_S&41D(%OkH!1LaFLG3OU|?4;9&=qc0nG3+97w zn6Pjtgi&07!|z8NE<+gvNMQzF&3JE}d31Z|`zrND(_sx`aAOha-uF8MMF9H@$($LxQSpB(qYEbsGiPnayxUf{HS#e;_ z1t3{8X*cwG>7SNqb;%Pctej1_Bv>~vA}k+a**9~jehzl z1GR*InWC*YwtJ?^VSp*JwO`!rNOR0UW|b{^-sL?WlX`X)U&XkFz%7{-K*K5>!~TC$ z6U}2ae(CF2KVT_CgB8Mt@q`5ArjoVjw>FZUgOax46ymkb41qJ|}= zk}2=iJrD!DH7{pE(n{wB+Lg;#EL>6KR1*yY_+2Nykme3ith0*u zyKh1@(k0qaM&O9X=et$@0Q2Zlt+DKX_RcojvS98BpMtE>!sCO9S}FB7Q~^Qqd#7Ab zwoI|Q8XmHLT6D$>7_xqiqC+|JjU0JTd;<cVU!{@?!_t_y&XzG~n#M%8EX~PB6@sUuQnqKHo3>m#53# zTMx6ioZqg#dqB>vIB;3|_DY+7Y}fm1()-_64aI?1RJ^7jYrK7X0ALw z&^{qoCSr+VJ4`CFWDg9sfbleLJ_{nhyhl&}x4|I0u+~NvJbsI+e4LsE=rpv{gr&LD z>ZIIWk#}}WrA*p`A@tcc92DX=KWYLfxANHo>QW(nf16JJ{;Cwq5!6^>sx&gC$;m|?6h z1Ah7SD4gDD)O{7uqyfKwEc2+#w3N4Xmpks=GRJAG`0~dk*>kPBzO8g@J_rx_%NH9LH)Q0lO!wV?W)*k8fpxe&`uG3@7nqz(K1n|w;Lvzv(i1ye;>^ePD za9!n%l%S1JD5(XY5QDQo?b&RthhDku)=A$x8W9sc=wqbETsZ@w!cV~PkM*|}&lu1$ z&zwBnsJnkblN3dNXCM;SEYdDa1JW^>YIdzA8s;g6Db3S2MZr?i4h#+q+CFTNRPf{3 z)MtX3tPk4RxTHPXBA>ffQ<$4LFv5Yqfjra?oH&#t9XRjy*rbEy$ed@m`C4W^<)GIB zj-qh_Uy5}axkEnd2R;NNCG5JLmY`;=eSSr@o+hX#uO;7Jj#Fjf&ELdl|+tu+%b zI^hTVzd|+UlhYRFZ#!+Z$Y~UT1|UALxIZo#hm_n5X7g~`soC;p>*xneS0uC+u6`p; z@qGN?VZ-i!s?JIU!%Vs5V-cv=MJ=c}%3*E z^}+OI)!w$~z0rsb%wWOjNIitZlg{o91qRZJm%pmdNVh(sSa9)T$rQ$DSlkoCi9haD z{0@kYtlRcg^d!s3XJ=Mb%2$PqCM2^OW$El6GA;st)L5IPoKrfNdUAjJCPLpGcbO>8 zGQefy)DI=bw(A zJl#Bh%~I*=()2z_fOUa=C0@2f1blECNP95*fqWG((q`dRe#FHpyA!#CN}iO|;&C)C zPj^Y$4dhi+*XE#W|FOE7|F_Y{T^{JktI|kXEJnF@k(o_>#V5 zUx94xL0vtn+NwBm?J*ekM^@pgH8l-ZrADiNW;z;m6TYIs9@)B07zl%(xPpcK)vthp z+*oTn`Kl_%;>)?Y4?Q1|M=6k1+~adK2AyUYzp4G#p9ZP0Lude3}4BOxuE;QF`(q}szY za!}O&D8buy6vYUjM`5iUi)(6_1EMA~sv=@i&pdI2WZQxGS zA0|cQ+_h8un{?U|$Lm57u3#j8wkmSMGazpQbUbIEZBx%q^1g^cZ}!PKbz?Ytp49e! zzg;g5jFq2S4XX(uS`2a^U_OELax^nGia#wmUJFj*T0!ETs4@q;bNlM=ta6ZlJ%)0{ zn6XvbFWqJ0L?z@SB5b@>>$tzT$1(Hl$(i3ot;F6Ij&x3U-tDRY2Hc!~!aggg``I?~ z+~JEs|M)h3QwvQnY=zpLiSL0G^ZJTzC>eqPL0qN=Hbw_{}#;420 zR5qpNO(jf2o&zL2*SW$?EJlgR9?JnY?V!&*#p+y;Rb zE%Ma*)*3~d!f=zFQA=B$zNv*G;N$qOQ_IBeKcLV*wF`Yt%TwHLdu8T{ci+URTpu25 zB#(qul#c`FIl~UiJ>$+$;$e7OcYmw@w{*zJEWK+U081zVPwqZ{)SE^>`w)rM?tanv zO)Z{Ax@Hvc^{X%9gOzo|PC0QS2{sx7Kbm7vSCQH(R{Z<^> zQySE4msjxi;8U%%pT|f8lesMEy`y?-?C(vOfSQd;Un#~q{09m+b(bNlG7c5GDNXnc{d)pFO$oT7Hy$7=z z(2o1hIw}>0QBL19-F7~rewr*=Amy1W8}h`RxgGDiNDW#%^YA5xP9atE^`$uJprLBF zB@xPyhk{6nR?*co>-45it&u!2i{DrNL1YQMh+A*~}ijv$MOiM|QJEc5`f& zEaWsMC_*rQffy1%6eFTWxx}bJMT~-Mfr<($f(IVpfuf+`Ey@uTwLmSg)bc3tw!F1G zuuw`%?bp+@)0qVQqg3t8>(}q-e(&oyJ)I4iJ-?^>{K2ouC+%PJE`aNf)z)81@4l_= zh8fv~U)S8(qbbiJuk30x=X9TY?#v!d?}|5u(bxBX=l0Ir^V4hVnyFPn^o#d>)haOBY&CdhJ(|!E2JylC)%(`UE z6ZW58Dr)$3>mbc3-4~pF0X+ww)pOng?M?dW*~`GMrE1fb1)mLXTe>OH~ zDNSF0_sz%jW%rYV!QQ=-I#y38AGLYqid%+O8l3k@IR8g_LiOgQw>y_DX}O_q?3Mjb z=f6C(zVQ^|!f}^B0NUr5FKbzK(?_lMJh*;w^?_%08?_n5v=rBlLojAxYi0MQHPQA5 z%0Aw9-&du-A4Y2;IYrhsM?y0_Y*^p5as9M^rHh-_mwtEgcZ(+tAFO#6dDv=u-gJ~c zs5*Y>p8ob?dGyNE{mb9n)3aGqI=`E2`3C%)FEIJ44?ts9huL)I^>Zg&@w|QQ%n|dy z9ZI7ee&>$qZD^_A1`}I5_ndy^#NS)CADXtix^-h8(>oDXQ)4}K1R zg}fUZ%HL?)kh)=ixV@g8C3CB+bfV(2MaOMlvH7C>U7Hr@T0`!OHXi-{ zP1IT0HhbxXk9KbVV|fJU9k6j~CyhPt%=zc&Z|gtJIO_#ibFH7Pyy~}QJKC;)T(T7X z_0Z1Ex(a*@O8YjCqc3jXToZde^yC*ESG9JnymW6<%RnVMH}CShetzk3qxhgX-8cL4 zO`!OBO=_=``iYj5v=?5)qX&z^J8 zju7(3tQKT4Ba7-U&-Ba$A7N)waskS&F^fUuF~k3lD)d^xqHcjfB5@ffArrGNoQ{}$V9St8)SxO9~dO_ut8>I_9?>vM_CC>Btb0D5{4zI zfG`$Oh63aBY7*Fta$-t7zHRmSiXs|-m)L0LJLH5HjtnhiQpT!MLDjM;}#YT z$t}^i664xU1R0gYhhLQl)o2p(kUkWS8_W4{Gp-BbrTNgrlEZW{gVQ22Dje)o;jD!e zgSBuD`Gwq2LP;YRl#4ab8Y5g|U_>xUi;pEP{7-v*JGVKrk}_a_+F5Pd*$J!u6fcIG zE2!Qg81fcOU~03JER>4M?@CUsX2TjNl!TqdPrY!!{N*&%?rk!8GfV^G|F^-AEOiU0(loCWca$5SR2apil zQMd(tbmZ8gRw+k3!5^5E*~&QVf?y%RCpjbrZLK7T`iQ zRQ|g<>`OioLzm%eJXY2{zS9PjdW7s7dV6Ngef27kqcZSCVDfMvuW4`^96ek|rW4xL zA&6lAYE%CfQ~#@`{&!6MpPKp)nRexwc7qE8QD-m zAnUvXuoe(Sx`xdFPBWS+h$YBp=^Ix-p9#YGxC~jn83#h3Hq(Jhgas~SUKF#@|4st_ zT3W3Loy1-o9pOav!h%ZD-$6#=M3OBXBfXW`<(Oy!_(KA@Gz!FL1@R7<4q6fNXK%&C zp$|>8xMb9SZb5F6r+G!{Uz|}CvgX_t;==%z$^lUxxXL zb~0o-DpO3Nh)$Nm%~s)sn>!r=VP`cFc7q>>g(BL2?@+Bmr|cn}F|g!dmcpu~rWBoR zQ^roxF?x*bMrV>B!#K1t+FMh!uS4yltm9KIaD1|yN3sdo7v=%qe45u~C!({7Xc<&4 z7EIGzI?zNfy_x5!Qhi3Lh28>?$}XXIb9SkhRyiAqp9ki}*PM_oT!0 zR!v)lHDMTYppk^T0tV$#!<}eRr{1atVuIT0@Y+F#4J-vYD}9ET+iOLCexkCZ z4@y?_K?OrNDv?3OutnYF1$D!`IY%v>noGAL`8bPV&SEi6fyFY;A{%rmP%fbSyltr# zkTgu@wj|VOfO8PxVx8o2Q=vPq8-W!M$`|VJ=}2)B$8qL_zBAbXLtHiXN)$Cw4~Fh! z08qoQlB?c+PCls$76-5nD*FF_4%?X^?EZD@Dkev(m`ngB8wO$0Ma^u>iryl>bW8zCpb?j ziu!bhdE!Em&Y?cUdv7)XsYx0NNV1|%D#*Ewa=9v{Itv+z>ugtFvYpH{8lD=_XTc=1$VT>;1UVh;Xm z#k-U(e;URto!fLixFgtM6MOw6!8C~@E20FHPw-yhSdh`w_Vj{m>Wj3F@FLgKr{%%~ zHyqOP7N|IWP%2SVceB)o;G=1=4#@&rk|%gcFMTy*%G_gYo1J`D70nYkY^QQ_$Er2T z5=Mqu0f%0^$-Oe+(G?~q9#+HN>B75<9KOB!SR|UHC3;k>G%;{S;nsUcul`zPP+yk4 zWpl*y>eHox`8E{lhvT`V9`WIwZM=}w<}z|ZF0U(J|?Me zcTM)lFG;%fGB8;(;QlR3)9KSU{fQA;6C+fA$F6j#_^X8+M|NzO@~Y&lfi3I0EIm`+ zn5WbUcZsghQ2XRqehzT3UnVC~O{mU6XC3vPVA%~-KTsl7qQV9%SW zA?;={H$`ibr`{__x&EQIbjv}WJKeES&S&z1s<~D)x)*fJld(G)?_sc`~WZn@g`Qz`K!SZqQVPUlS%pKd)P0#QZRbY1tee z_jQLCA3r!}_mvHitmd}KpE$d7R|t8z$Hnh$NHICvcjuj6N9~O?)!zkdocU{~+i~#T z&pZBVbN-_Ou6-)83trt`(h~E5O=077`M(j94=J2myTfQ*eNR|X32%5-{}Znd8hl#E zUu`LoQ8)HnK6Ry4%afNsN>-$$C)fw&Ahol*g7t~0n>PXE9Y&c9>Qo7^X_7{e#s)s2~S z+tPZnrR2J49m|W1j4kf&w90+`w4rRGmv&vtF+G)FZ>|&lOaj0{J^1?H&>b!7erInj zy`T2dd+|nxqYoxp&kJohDkRci{qxm&)_M1<3bSu9a%#1PT>R3@;1z$jo^L_Y1g%{C z5AXRq9xxqs^p{JRcXMfIt0RYrQ{{@yqUr*#RFuA4om#MUKcmImnrSU1Cymt}-8wia z_~i4L2|7~YD?F!_Csx0+xy<-{re=%Jg~yr z{gTTLe$VhI&f%Y^F+amil%rJgSf!ZF&pEu`9@R4kcr!BDGm9`Y0Ktp4>Af{fCaPRU zIdVET85Mpk+ecm%>jhRv02{y-~^O^>c+GIU{x z)C?wM1xVlWi&44Kz@rmxv@kFTGN^zY2?PoaTN-VHreCOKl2?P9^!^~&L`)aJ{3T=C zK8b-LFSW!>&p@AxK>=(OBZCA3ObY@3=G8IDFs+$1y{C>z&6x;)Ujn+HQRr67Q?S3$ z-CsCm`qw%p1!t(U@!1VBs7T&^*DnVKh6`=z2DLt!9#PMvpb9gHa5yBcQ)L8&gE?8@ zU>s(2<)zgGMh1qhz(gaC5-FFV22baz1$vFhFq%B)j}U(VFg8x0du@jL^x6jE!${}G zy~~-7z%Xh@H|SdV^antL>WK;?<1lc_fD(Lg4+=E=bGET2+ViKFatC2~}1!f)^ z4Koj994MFMPT+rj1C+{uAt-@j9Pb{eaav7G{1~|o-F-0g5C@i^nVBLcf{u`yu+4y|xAR#S#uk8D-|007*R zpaLI%9y8y}?rdcr%~pC$*4AfcciSz6D3KnXsfZR4iei2Grb4rmJVK}>L?jAHl!P8q zN**CmlxHFDS9w1x=bU@KJ9lS9_!EX?0%r_7YXT=n)U`TmXKNB z!y|%}j*oqaHXv?7spY@{Hw0;FXH5iE`t@3-g*)s*2Nd%- zX0r88hTf5N!~E@82AID1mq3&n2|sjm+M?TI;=e1R{e(!z548AaDJi@}JlgvYWDYJ4o~tOn>A?3Tq~FV&!br+9Rh z;T@mNV*e}_PgZ2@#B>c)MD1B^xFWNK+69W}09LzDkwt~tXw`ui$(Xt`*j20~SOQT@ zcXz`_YXNv0`9T6^7Qh2gIvm!a1tx@{(sH9+)O0REWC$QAGt2T!BY`?XehgR`4@CS5 zcnBjS<4Gl$7C>8v%8(Di6;D1w zY_~Zvy(rhP>@FgtnVA-DW8?GGB_N>t7RX= z-7O4=Eq)Ma=h_FuldPL$$TSTTr4`-{L3l^W67Ys}p(Q%t$ zIfr5I^Z0B_lD~yq$lU(euN(I3j*r7pwFf?qfJZWiW2E*PF=o?$J`$j^kb47kjrRn4 z99Yd|O=^3)GjRB}1L`zhI#iEBf{xN&NL9G=Kxsk5tUx8*MTT^Q$+feIEMyT~C+fv(qG})5cTA^<1FrCcVCtyA_ zw0$br_A9pcXWON0yB*tZ&$ex98~c(6u#*zuMD()_bV3|E@qAc{k23aA&OR#GM+f#% z>G`N)A2H!W^s`OjqfGk1{OkZ90nCpJ+cnoRlPv%?!ts7M-;kLbAq3|{WUM__9CYIS zfpG@lzVbPL1Cc%n9SvdJ{?mIVT{2r&HzRQitHii z2|AvMuAbP|xWK8e{#oFi%c5=`TspbX8Kx5=uL=v76!;$J{D{q4M&Tk%~-8F z?_rF68lAs1d76Y%;-oX zF#_i_WW+~eQjig%s0DuP3xLA*LM~uQf~t)~4fcWwdK6s=7LBz5yJ+kpG=>a_IOL9A z!6Ab364Z{;K#}%A?llFfo{9dT6P?lXMtgl zhPDQMpiZC%5~3*%!$st7YT4T8k>QV=TT|3JW zD5A5kJYO)RXW6L!|p2ajLJP{|N@e)R~IZFCbQvi)E^7dCplH=DLCkN|%h@}LZN)$Zb!hV@|vZ7}C{JYu%RoI9X( zkB1zHk<(3hdCD7q3@=u?EhaoaUyF1Dmgp)?FM`w>KzHm2WsUFd z2SeKgeL8p2apv5G!>bI9pGCz9gQE~j-GSiV9g6E_Hu9Epk2g2#@tq#put(7)A+lp* zr*k`(Sdn!v&DihIseoFMQ(l=-a_Dp<39T4%@U6tG-P&nH=K?FzVN0if^D9~kzM>?S zup%eF-DzZnZAI>H*`=nUdu)W^UVv5NUR?9lv1-GOOZM2|wFP4EHL@mdDBs z_Xf$fj5^>{Yht*wJXY+Xj|_L7RA_Iw3nbIRaFNg-){*jPXk&4{;nzz) zd}WO!~STtl!b$wA3Bv)wk$a~9S3t{c?O9;um_ ze|Xt)pD5U4a7X!)W9igr7IoccaZM#q>~19zA^U!`^SqFIA5y*mIQ{_MBv^^%txQiI z%`Jwr!4xOQCFlu1GbAsS)Mb(yC#i&_Y9*DF)Obl42)x70RqG^kYHdb0f`ilWMBgU z$rMn_z=sGB$G~L_>_mV#1}PJ?+=#(cZjYkr%H6 zhBK3~NtNC=h&Ks)$v!gNl^O2Z)}N*8jntJV3K{OoOlAofBy%xYl$t4M!DS05bNl;| zL^;e0 zR`=e;WUE1cQ!{JO)W54ix2ZLVI0kN3YY=e^Ojm0VaSYt5)*#{-xJ9i#{UtwF>w zaFbeth+|-eT7!t=#X6iPChJ0+FS2!qw>@X#gvup(hg?_u&aQ2pnlV$Y8N^Aa)H(YS zen>dI%X50C%;zjg-Hnu7;Hb)hWUXCyt8oy=vvQ|@I*-ILFiWXj$f=Rv)zA)_Eq2fx zZvgkmuv$@$(u4ngVqP&~u)U%ss zH?*7Y0|i;*kl|{>Oy<%WB(r?Km@5$b3*@qSSW=HjYN4bS zN$OEaEtb?{l3F6E$C09X*bnMqQ)SOQ&O2ZcL_!>IjaoEgFT&BZw%jFvvglFeh-B5p zs_Gh2U7TGtu|zGW#4+%&T26^$;1RW)634)QqiQ)Nj>B1`hO>dfSyWFr3)RX?9NSos zc}$RKlz3^R924@cvzYHXkBMYILCNM4ij2EmCL6Suu=e9Z`$^K~g$Imsc&MGZ`>7s z>c&`J&&FMmbz{(Ip7Jii5Mp!)52Q22ix7o{Q9Xg}F-Gd^tK>>KBP-cPPqc9j+vpFB zJCqC|Za)c9X>DnSwWp;uqNJH&DKk%Jm|5m!=Tq5x2T=ozCb}E9c!{8p;g69@_xyhtr~^!>e_Mu3Xm24AbzM&fw%&#SeO zI0l~c3Le@bj)7+o2wUz~2-G5{*2y*MeUmr_o>dDdaSW{E^|D*87Zj=UO2d8;hb=dL zD2RG5svG}4Z;!n$r)s^VUXs**%aVE}GY1~l0to^wn%ELq~4O$+md>JCw1nv(9`lV z3WB4T-(Fg_q`teb_#iBFH4Rlr#OP*;@>HWp zqHn3_eC$giM&DM^rw}C(qc}m~E@AI3g{-|i71maU`Bt`-VKsyA%Bg!#S<@ZU*Yrm6 z`<}9<-&GePaq6oM%K0{bPBs$k;(c~OKC04v>>wZSD?YYy!QLI@f~|!8p|rVOQXdfY zDcft6gZ4i3?3MBr<^w6<*tdHEvhh*cg6>2%K9U;MEbo(}t|jXDC0FG$0h0aW)E^+l z!&hk@5~T5!)aYWEc2Lt|@uyUOlX7?lWU*W6nfp4;+;lPrGR5J4HyqhqHM0J+-Vq|j z^sV@KCF;Fii3!oY>6_I8~oCn^*eG za0e^?w78x8ibr&w(SjmRA}3^~Z;r6_o3#47r2Zgk)!$xwP^UcPF3#~p-kKe3Xj)jg z>-@&s;3v=oj;Hf~KV5<>cP|$4%&oydhyWu6V6gHF=!5q4jyx3G zt8sFlNo8q&Z(ZG1A=KTQO&5n0?ihwE0O=sBu4B`Kdl77=!InFi!u+$o-LqRgCW&Lf zuZwkbUPxU>*|Ho2O@+-7d9_57Cz?jO_@BLUGaS>45#-ziBo&lYj-+xW6_Qk*q#8-8 ziKH46C31XddX6X3Of*(wI+AV3%5C z)%D)ggU1kzEWr)EU3c zCB~XY5uvE2EFnou45m~gDyg)iJ;|175lJYNB_+v{WT}YILQ~K4+-L5b(_Vixe>~@W z-{1Re@B7XM9O>#5**9 zX;Ah16sW%PGUi=wydVEd#_1Rzp<>tKfU{m>NAwHSbrs*!E&_lsfBTt=<5+e&UgEU+ zU3C1&kq+tj>S*a?qE>@kr_tA=>yf>I@iHe7c?@AJ2 z%oGTxBQ}dpaAv+=@ePv>t7HAuiuPAK+FyU{FN6E5Q_){-`3=jI-!Pn9_pchR6>Yd4 zS9Xpx948Iei#A-(-f*oyXthJEBk0C@w>B=G+I!9uAvGp0AF(XLj6cZel5EAb^pO!*%6fr_|p$=+6s+m zKWJ~t<5jloO?~^`xM4lumG@?P^nqE57u=h^I)6;4kDp3*L1sKN(|H=7M6d3Dq0QwJ>BjC! zlR$oV=5{`j_F*IQBko_$W9b|@k5Sc``Ej)8w!J#HRiJ1RojACuNp{2R+=jW0TGEIc zhN2zV1EAKe02}cN)$qR8jiU;OUo#p2$3_6W9FJoKyKMnwOX|=g=oQ z15tmkTs5wmnY_I?#-lULaX}3d=7CXB|U`q z*Z6y&?@;3@uLfH^WE+{JE)4Wd(_n{>?$1j&qY_|S;u2>7bk)Cc%wHc~G zcr|5;KM3!nPVsB-N$d>&H0!kY)B#72Uj2iGLvRU zG9X)@9nqkzm&T8C#uh2#f(fuxU*c?|4kl7xNg-N+eymP^KwA&?hSrCIFe|wVu2K>A z8{t(w=_*LbhHt8*`5S|gOx1pqT#(QVK2C3o9WCKGA90*bY#Z{(=iJNVfr13UpJx?W z1&SZ|wLLdi?G&R`coK*lOylB+9N^;bU7rZ<3HApkxIrP^=JR=P#(NLbjC7y3I+6*+ zNDmLitQngnBXc5xSgdMT*bc4(Te+zDcL- z9=MLRd0eLn!WSL%zpLVO1uQkOKEGm9Ulu_c7%Mh^oOHrW4^E`Xs0hk1};c(jXUJigxR!C{17?Q}1M= zrm&c4xr?YdEM-dY5w(G3Od~@(bQ3OwSD2aycjyU7%bDB(%!gFQR5OvNGrY&t8vO#$ z9X2q3y^It@+Q@W&7&9PkVw%TP0GpY{aSsDv3)3$F(uTlRrqdzn_FCA+^jw&z5I$mB zQHA`5!6$qQhQs8<{%|AgWNo8=a$*Gc@(9zq@Z`jF+{>d(+ntjWYr-Tr!}KW5%z(+D z6w#i9$%*xF#SNzIVTy7m_?Y%NiSB|bOwVzDhEfPIonpV~kjiwF^UZ+jOiNsp?;*%x zQUS{MFf?UKPb9y`p*7Qf_L~pwqqT5lPeCW9V@%ILSEe}jdlq^!%?wRW%!cQofGH27 zG=>-8GNxguHN%~~nkhFpIk6S)Y#~!i)Xqm5%Jd>fSq>wZmT`Zt!WgDzSan-?9mX+# zl^T;1JHQ)oD^uObV}1q4nEaT%8+;9aCz&owK@I6grrF&4H&D*hkb6H0P6yFD-1{-` zFah>{F`R{SnD$19G}V}?kjbYmU>b!x)*Jk)JyR-X?~Bxl=?Th*)Qzb*=L@Jym^N{~ zB-Pge3Sf}}=noM!(&1D-8ekg5l*N>yZe+R|#kcUR-o!MSsg}B#>3*gxbqiB}ccx}) zf+GV4R=r8ffUNjiG(S9$P=t1dUaYy``}Czw1#41D@V<{b-{pdrwR~3%cp!!BKv%x2 z8GNepU7FU^k?HI`sg3^*t@osfUb5rZ-jG1{IIz8K76*AB-dWdYY{&Q5AFxJ%xFHXSpb2Z5P#G zupR57Ia7K5GRH!!YQKx@GaNJQq5Iy+yc&w^^t8(Eio=UheJ)J*mm1iG%(;ozVY8x< z57FA^zv!fqTN2QUZziumE3z`D5#Oh>O=LSLg(~4r*^72<8IJrMzfz-hqw%}KD>WKl zha;!saK2PhKZRl@vF+!7-9l<;i}a}YWY&PW4myXWXccrfXk`|p)4ktMc8!jlV;=lxyEBZKuyuLsj&;}ZEbTww*rTx4J7@oKoj71_s04Ka&z{#!ld`;C)N zokMC6U#jHa*JfWIdxfG(oxiJ%=i|Oeg^g3_{)Grysdibs^d75!WUEtZ`%T{Kd45jt zL#@JY;#}bf*?no5PFW>e_T?d(Io>a;Byq_8JFh`J-!H!Qnbg-7O~$c1y5GbrTsxWU z)pXC%WX;7k2``Lg8OtNNG1Uc=QpmakWM`#)sJWoCcOlyTNi?z`mF_S0Q+A0dR@RU$ zsh#5KeyC1%K~>6sIDkik`6(>kQ`{R3{Y%c_#^FWiw&qmdiAi=X49X5P)k zc%RO8KIiS@=5y%fuKD>^9^w^FLof8j```KgsTZFv@#TB_?$_0JQ04qCc!a&aQ#7+l zI^75O%;-UUr$C*A9hwH&+Ag%k_@vTcMc_-kA71qs+74cSn$z0x9p1Nc(_5neUUUE5 z%xuj5Z{~j={2?}f7dUjRQ|V|gRPj1R@avTkjyWm956)=h9@PPVZVP>%tU$qKF-k$d z8)8%)X`)TLn`w&p&1SmKsFIX{+G?S(`UYI3cZH_tS*UHPj0q0-G)9ed7km+;=DHh> z#;A?1!w*q^f{p%;x(B>9qO>mDU5|t6Lff4MNV!6f`Y%W7Ahai85K`ZYnc-{oco;6U z&pAT(!epW6{5RF|h9%g|1wmxW#o?bEBl+d|9y2a$F#P34uZ0SAR>P}EDej6M^jC=@x*REKzp+*;IBD6nsw9yqh3Uy2whh)vr z&6c6NEkjSZG8S`^(F=-*c;#<5E`bMQbhl9eONn^pXB)j?XN(>*F0h%ZSqA$O5D+BF?we7ziDN28CZY20f)V;SBzu7SBR+HPD6tBAOx&x}Gi5Th@Q>j3Ih#Pq@SkjS(aMgtT#QR_<^b^W(_+S_;7kW^me{on9%b;Kc-f;#uWf%cpv-YLBlgRqq#hE89 zm5qd8CX?}ELZKQ3=|o&7Q9~k`ISN{T#^@e3+7@#R7=;!3Gjj^^`D(OxeHBLOH zSJJz2-x@bt=!`MmLWXBzjD|W=JX0)`<+;s5tvz=_53Xf4R8J`I+zn4!dYA#vTY8uY zOD)>H@HW$ziYmJgHVRQ?vtXAHRrUa!6{5->hMVg~i7I;>J`|$L=0b~lLRi^<)9?t> zJ+M6Wa?kVdY!*>5yqGf5vk<-&TAe%=scrpe54GGyNQFqU*7WbrQG!xDJ&U0@rj@xC z!)&Ihd?uE_<55lMRq<<;Jk_z}H#65nHDg&~x^oHa5n7X2=2`;#nARF+QXI~ua9Ff0 zsp&|^qfv~Vsb#LE@RMk+c!zU;nJvRI@HeRNEAcF=$bfz`k?M<x4LBCgHe#esv)oajCsCSj+p4Vc2&8sZ&ybd#k-cRzu>oLE77trqwm`5c0 z@CLkKqa{SVN^YdpOlv)~)+^vWiQ-Om!wT4D@p}`F6UlDAiGPt0FQN_&No^_U)hmoxL)O}qE-MGb$^>CTc zP{&!d9v&9Lzw40ZGff3=d;{0JaExhHo_{Vd!TJ{soDtl=SHaq(k9r`n#wpJh*e&!_dbwvS91?Q) z%RSrRgwX5Wa?giwR%oDB?%57n(<`zX{{QyE>R8gG`G1EdJFZ^-R7q-kVs;G?t*KHB<3!7$r5vyH707W zkjCA{o4a6@&^>AK=4bF;EML628$PsT*aN#P8TP=r%_}qPv1ULmFQ)lWyEsa)*pX!J zg?>VNT}kFXxLW8zZIJ#s+#nS6B$@l+79z?11|a1ii^>dNKs_SKegGN}iQfTe zLnLS70Q9kc_#LqMeF@iE{Jw-+EPh|YtV%y5tKUJGXYo4-%Pf8e;e(i8btJ3bVK`v% zI}DDNm41hz36kVP%8QaQ%TcI~*nR_!Kt5@Ft|R6V=u5=sxMeVx9uuxs@?bL2Dw3c?vE?l9))=n5W@t(zy5g z^wV$y5uft=^zY#oBF=Z8{sT-Ul6*hHgO+?h!uOVZKZ5_f*lr?O^PPb@r12@QWuAdX zLVI0*wal|{u29fZ%lsMI6G^^u7)&Jj%3(8+sWtC?XoNL{Q`c{B+4&Pi%9%_ zf!0V;Cz91qsa_U8rEakJDK)n;AClG2p%z*E9O`Y0pF@3S$>*^7xzu+SKbP{IU+L#k zZHXkG%jV}+JxLQk_iwaoN#iqL&vdI%M0~D)TbP=fAT&^GVe0BOp%Z}?rlDpE6+7CP z9yLcOA7`3szEItiHfEf9N$AN)8#7*&38i2ZuUakiLVOD|L0O;diE1NhvYUyj&IOgv z$V8PBBOj8rBcD2-G>PK-jV8}|(F!aveX74Drrpo4hFW6!f1^!_`oW8ieABO{3*~8l z`DQ>_pZZDaLDHn7Bz4r1JxQI8QFSEi(=A!WUsxF>S=A+yeNR^Mwvd^Zqej^;4V==G z)ewtcPz@!L>_Ih^NU{g5QBW(DC<`5D^`LrOC@XleSyeq}i5XHaTVjUPR!hu~H7061 zV=2S&q#h#TmB=v~t9e2LwHzaVS1k}afqqTYaw1-d9HXgvkBC=dlG#jsC^QhtT3+zAZ`@wZRgli!DkQYZTP%e*3L{@?H@? zd45j)!ze$+IvQehQLfIFF}tcbB8l16_Pg2D8U?jlohv#TYIL82W3qI9!G>1K_B zT6>x4jyz>{vqkBydRd}$SJx3qlKXnz0^)i%wD!PUN2kBUY0lB zBD0q|D=|C7mzkF+Ek8%goCy@69rQv!CU?x!&xrT8dv7{jN}XLbKe9%mJ#aP+r1jbD$a&qfg8$E$`bh zbFi8r+Sx#vIYd1qi(<`gl*9Bh}uD458EJD0M{WLG6$^TAdVnByFF0qbeto{>CVy zdu2ystUVyL?@`&q7&VEAd-&NLqh=Cu4-1T&)Epx2!4)@F%@^_^-K<_B;vNJjeNCG5FwxorQtrhS zeoKvsHor-#HEH5ENfi)Dx09?xA{%|3%^pC>5c^A>`{tsPpM)x#}cL38U?kv zr16tsol&fo31tP-<0h+>L=tm~T5G9nitTAL#TpZTwL`I(?;BIpnOMy2##CF(66Nky z8MDOpv?;O0EU`Roer4Y*!y75WIR4HiDJ^xs0}d#zh2l~Qq3uC|wnvlVP`1goU7BRW z?gj{c9PaK`+}-_fcb5l>ySxAA-Dx)=eee%_;O@z9{`1bvyR+lF&vuE@{c_fjSBm$~ zSwoh8FFimk8S!FE6s=ZzplDIC{VHB5J}74md8PQ^oHgW?;zM%QkT;7D%~=axDLzcB zt-O3HmMA?uXZ9~qdW1jU;q%Cx`Tl0{QKD0oYgw?Z^k~tmV#k-al^!FuRIy6!mEvPX zOvQo?uM{6A(yCqLTifIF+U$67NyJ|@ju%URMg0~$KKIOyv=jUJ>kWFoth4lZk^BDo z1o1eh&7nrxsPu%qw3EcEDlJT#mYyU&6l6QxQG&(O-RV8S->1>(5s!E&GNX1uw zdQzXINqs0NK(;WmOy92IYoR}zs(k)Q4}ShXt}Qgk8mYgZU#5=M{BfQq10G>ldhcpz z@Xz`$B-&&gCIXH#=n+DH+{_l9eNSm^@(<=U3_4MpZR>01wK~4>+RAyca zZ!$xz6@QWFaeQ6v>3>RYTdr+BQ9~wM3f7a}V#!OnY;`r?SGi=eNV14~XLHue)JX2e zey(9ld>+5li8Fk==lLe)CqaMQE>!X-R=j^uEB5Kvp|EcG*Yaz~b^B}UEoxYQSS!xy z*KMWwL40fL*Yn!4{CnrQuj-b6-O(C9b%lmpEyqlx{I|VaTI1cRPotJgan7dsWT~q# z((+fB@fm(Q`*)$d;k#jO+iG=3s#ZS#sfWUxXfaOp+wBqdzj(c57Fu~zEw*BrubF;o zA-S!T=JuSrRikApX8~oNa~F_*{GzO|&0$AD7J7s+jplYkXHUgWu)L|9BGa7M~smI|NJbt>_&r#DQs~dP! zK=VJ=lEHZjSw&k=Eq?RUHk77&Xh-~P{2csBNS-9C!4OSn-2~1{EnpRYt;q~CyO^6Y zw`A%}6Rd|%sk6-4%!5GmH8>w#2rf)lvgHME2^#l&if`(dql4t>5|pRPF(LEZ$ehbO zirB&oiyuP8A}lHwtQK=&X%wsQw-l|+4(2AzD03TToS9&{%-xy$G7n`Q%RH5N4)YS` zHOy))E0z%@+Ktm!g#M|2VRbQG+ox{9Rb)jN+zTG=n7$wQ#)5~6E={({XEed1#4YUk7Fs$mCYprQ zn`(iIo5a%iB5p3YPWdC^ZZeAB1dmwYV=!I*qi8|SHMJHoEfm&&9)^cL=ojm@(6ZVU z(?_(~+N<>`ZBy~w{H`X%CKcO>gS0#Ac7bKn8T)EmippYn#aHVO)Sjm2=08n)nckmq zmG&n4IY?Wu=yup;PE*KwE)Bi}ebD?;kJi7hU8r$iGj9Y1eMs^vt1tO)xPIin+xn32 z>qo-(Yp~#3I8gq7C09`J2m#j%l!@0$_tnb8v-pnY1#xH5W`P&Pv6b5d#zj}d2y|m{ zB2b2$4s=_?UV$?9S)$#x;QoO+)(bG}*ym!bms5GZ!*xrv^BRu}Ea0UIPQ@2BlJf6~ zmJ{+BZaIN3XQ1(P2jck_lwa1YB4nGl3i+LXtH5{uAin&6hh6rj8lgoNgYU#kjB-tM<(XPV%E+^zyJg76c3g4p~nTgLxvT5)>tP}avXzhghAlDxa9kl#w4%61Wu zJcsoIbO!!rp(Jor+2g@W*m4c$--h#FGtrOJzDMizRIeL+nVv2EB^Vcv)y)Vc#HoRO zwYzD*zzWdj{8vFAU$sH#ZgS>#0(TSE5RAiwwqwYD<@~#I{@poetB`+-v5G)h5T!tr zLa)hE#Z*n7goSbyvs-ag{zea1p=bO|CKX0++UFw77 zLmGvD!$=sG{a2}Jn zBU|=h&IWPs%){7n67w|XxorPT`y`~18FY&@I*i#Jk~EkmGt1nAc@pz9NwlowI^fcD zHoaKdOr_|BW~!yDpy#KX!A04=EWH7)OrL{)Yct#FTX18xM`)h1X4;zVG3F>O1&c#{ z;BGWf)=qQaxt-<(yZBl$w!~nOJcLH-=dfiCEFdgL)Speq&~@M`u$;}Q7t+P_Ny7tR zsPO@Mi7M*CLfX5;#njXo1HY|52yAP7K)gg-H@*kXX)MuRqVpP;1|Mnc0zYju!NzHS z2Z5_kdk@^cq9kxJEm>I-c!@eH7Y)dESQ?h?r!5W3Uem(h*5x|5Yq=Sa-e!X*mmd_6 z-p0UN%FpIfbD_t}$2tESfu~>z1SJ<`wlnqM#Y7c)@FiNXBF2{4(BXo9alWjkvbfg-LyGhD>|$XYMD7=5i5y+pyP7+dBr$BJYt zoy~eK^kP-B=aDrW17}vv1&yk4)}r_&+PA6+Jf|vLEc57KN#$(tfvPd^-Kx2N#qx^d zOi?1)#0;09_p5cVrFu3vt9lHys^@}7SC5y-ItYAMcvW>1SW+1VAFI~EPpf0|UQE*) zW%tjS%_+cbZ zU8{q8*3JgcsT~6!s+|jdR67n<*NAdC+MB@T>%!p4Faab;^dxN#8Kuzib72J~0U)C+kIt)FnzMZuWy;gmU^&OR^l2uoK(`jX|fe)5Z z_0{xE+1}OCE^1|-GnscV7jBeXkGVZ_Z|0fIJD9IAX&R@_e>E*uzVKpFk1a7DZCn55 zN;ULe!(uDfP=9#`GtS(XxqZ(f;F-+VdLEKj?3LV}c_wpl(IqYv&x#_gMq5yOQu|C> zC6Em~6DSR?73>Ud6Wl(3=mz%)9uzz*cvtZK;8($5Xsgg!p%4kGr2sWikQSk0tb8T3 zI4sLj9ag>>*u@s4)o3AFoff7wkZVokS_`?>#(Ag}IoF{jsEzO!X0#Ocx1}kJlI!D? z)K1G&2Q^bCtw1wrMcRN`XhT|wy5Myqc-@#*rA^?u8=iaMxfh;)XTkHP@Z1N_5qOTm zb3Z(92G5(r^A_;DB|L8h&s)RuHt@V1JP*M0_VBF3^B_FO;5iP@20RbJ^DsP*z_SU@ zJHYcOJSX6pXj<)Nr9_v^vo&~U#rEI_m2q&+0x58V8B!OQdD;foFWv*ZOFIxu2BZ#! zqzjo=tf2hXDU!EYB=>R4Sf@+(ap3h^ev! z2p#MbF>o_sfLn-Ra9Eh2DMrDhNP?EIz@5a7U{*Nbo+1P8D|QAC7FqBVu^V`S*aN&& z>;>K|W`lQ#Ip8B=KkzAW0QiD92z*T(0=^{<1K$^aM}VJ*qrfl4G2nONIPhn20vOOv z0!y@0z{RxFz?HN!!1c5-uv0r5?9$E!d$jYxsCFT^m41$|*zJ+$^d+4>O9cx-YR=Z)8%F;e`2uA5?7)h7Y4d~+s=_#D}-=ojbA18{J z#fI8{v3QEUUi)4v3N!?k4Ri+%4V)Y}J8((h)xbM}>A@3%R|H=V)`yl1?GrjA6x^Fg z!+-zZYUM#n7}WfY_EjoR2Sx}YAm$fGKFo80^8f6 zH|8(Qci0rym@$Rz_3}c04=*^O1%4OdPE(kF#}uAS(d~3|IOC3g7%A6`>8@ov&Al=Xzp;b~tMs=rF2Z-tu~n$G za~C6)aSg72TU?sDJ60_;uTH~;JJ27Uxkh2y6s9$)wcCnk5=I-f&a%y&(BNIkbizoY z8oI1_hvDjG!fB)K_IB#-X{W9Z>Kxc8(%Uo8(b?YH(McVhn{-AyDPp*hQ8T@NL8O}^ zS;sY!&0W1T%eHpOZWxWulF89%gf{4m(yZP{l%fdxqtZMJ9lo<=$NR#Y(@wJG1_mgu zyZVHi&5c2FjMzlf?@gz910!YFW{h(0iiS)h5$}pi*BjVYCJj04h1@jl7Va$OA{O%$ zXI1Po^f=i7XYJ78GagsNNvc_YBUZ{7w5(C~?5C-y^pV1FlB(a~&@ZAc>=&9e_*d&s z$H6!`zlnoN`*|@vRNnk}JV*0@?oT=TkkO0l$)25X(dGE@S(c4psuqrw+LQ?@X57$~fC>tw68jSdW~ug6Bs)UZm*xsRz6;dJW6^-bFyiR)Q^nW-=}YK$y@jhabg zV>9LVQ@7=5UT~1nmr+XzwZ^Gf(hD~5rv^oGbXp138C@yI)l)HpD`aJCD8~yrZQHWj zt+*jwA>=GQR)5Nj$w+E{LaEw0jy|jkO+=C^?2?PK<;b;`xanARSQ#1gA&z^FX4A%o zdMcja%gNYG+e)&VS zOtJ60xZ_9IFE+okt`)P`=q(*RndG2ht4uD3QDYZRxXLPB zckYrlZNppQG6^>W?c`|N@J5A-drLrSC*3ynlsjRRjnzB2117(}2FRV2+Ie4Mi763I zo6Yjqr*=U?tz#H}DwA;t*Nbpj3*-?bv+6b|ubw-*$;mhHUFF3G{Rp?98HZ3)fG4hH zuWwsB^BCnmz*(VXV8CIC>CCGY+$seh6G}~L70F-W^K#@^)H?4)3YPf1Qu#LA*5B88as~nL*BfY~S2r3}%Lh4ZFum$)TN} zIH~$EtqTgF>3o|yT=|xQR?e&QW~O82*!=kyHQiiu!JP4vdIuc~Z8Vh+TaOz_-5&Lm zqPjhd1;ECD#acL8c>f!kXxCIu<#%z7l!N{#bT1d6%?x|$M0DSfIh;XDPnoQCoBTwK zQN0_ux!WynafCY$O^~a-qOfpo+yTUpB;WKVMrzm{ zQOhPD?sL}7T=z1X&e2ZN(Gl=tNxyAU2EVTOF6|>mY?NY5l%8C0C_SP0vho>*|9qUJc6pRac=Ob=xXg_# z)61sDm)d!FOPFQYNz-8~ukr;}-0E*lSW63RInRVLs^>>lYj2RS1}9tjce@~Wr}nlY zveE;Q%pk8ZxuuOEwb%0<`ddFac~L$d@O<}e@^RP6iN^8^&$1koBYdpxO?z%EH%Q5$@!V{#AMvJV zp=aN+q2>57?`c*=Rb%C>|K#Mw`C7TrxUYYI>TKj7hc}$NES|9z$#ouqcWN85$e9r8 z=myPMIW#3)%YWT4alIbHZQjsz)48KJcg#|Me`*kqF5Z!aXO3rH-#11rHpwxqEE91h zB1-r}oQ9b=-Fs)*$rVgR(>Z#>P5OAP^P;Nz*y5M<6rc2!;y_j*e+q4gO~kW%Jslnf zl(B23+=E6J2ZxHdz6y;#z z>4p#UcHZetPTvWiNWwjd4?$dy65Vd-5F-qx|eaE zdtkBd``GYz{nt&_>`bp6<}y9Ib{(;sAS6CG6A}`_2ZDrzAdZM5K@f3;Adw(Q2oe$> zT)+3KYPx%8wd0EjJ^!h9)~l*luc~@_UxO)x_dK61=aH`Bb7g-0yC8`Ie|2sInJpjh zc}%J6m|G0fl-~5gF)E=G%j=$0fhN%#0qRBwN2j;?=p2!i0zMO=#pC(gKEgx6-+SU8 zb`g~{Y~${C!PUJCb=mWOyQ`nRo<1A-aBI6bYCYMs0;HTMh=33;F=4@l-c zQpcwdYQ%gqM`#g!By~Qje>(-!CAnAdDgPco4ts<1Lv*#}k=Z7vnu;MVnpdc&As)`a z5Up3>Gy(qLRy~mMWrj4v?s*F1tNILoHl-^k&dz$knhcCGMzXq5u#D8us#zet?FO`c zjx@Ipx*CQ2S0S1Nze>aOLh{@50fRodK zJ1ciTG+p*@g=kWih?!(f_)CYBE`B&IRNKu)9k_nJ*lq(4E)D-K#^^NXrEPK+hnN5!aSc&iw}Kj;{h9!^{JRhjl4%x& zoKh}ehl|i39fLcTf3(Fbl01c&xe+uRFafEd&BOua*b$^Rb^;ZHoEjJFur-|EE_U5M z1zbO{04l=}*wKXCHBTP7$hZNOMI5w(o?gYCJ&*fe+}bYE#UV=Ho*llVZd3r93I?Cb z(u_vT&JlTPh?02##UZPnD&Zh9O#Ntre*qkgaW{ctXE5k`e;+-qi~8=<4DDl0!OcEy zV#3gEw}X=1gsxH<1^+sh<51(14cAcqUn1oUIJHw1_N2#$@QLlC>Mc;Rqf<*tzV`K~ zPT1S2MO7N1lc-Hi;4WZ?s(>E2r!WM69^A6vls%kEfK|{%qS*dKiACCzXuqJnVJZWk z1Jwr2R84F)e_(rmx|GJ~aykHT4?wH0gBC6nDQ$2#AZkfJim*Kl9cza2#FTcQTzyN6DAc>rtLSQ<$Y9_dh#JP1LNzMhDUh$dh&`wFl;V z4-NO!a4!w_76=SAxEwQ>suP=ld{13}AHoN4KjIG!l*N7r?Uhk_+=u)q#@d#MZ7I%P zM})K{f5j_hP>rr9XT%dOdfo!PgtCFwV=yZT|kEPAM?f7=1ZwOeb}3C{%$>OO>fkgCGsBGERH zwL#Hlqk4a;OWb?Pg7l^>kz0YUE|w8?q-UP?0OjY2@wV@sZ6e1f>-}g$|G600;&*x{ zd%>yU_W#)02CIA*y9hJXL?36xQU@c&jw)>d&-=R5;8bKCG{u(hql-m%j%aB0*rx$e ze_MEzkotpjRFgPcq6VZRvj0#v6qngLaL>p#;F+D{I2W%`>@ta|jzm5CpLSU*?x*Nj zeD){ULdkwRj;ynf2zf_l4{#??O_W8ER)ph^T==4oQHs82ye)nJ##y09gl(G`DT>^a zI_FCr<1biOn&RymY*2#xL9yL23x50Xe*oYNT|ln*mD0KfFn{g0fVF`)*oS7e(kz3o zU~>=I*XG2=g^=sj5!fAO0C8R#zi%QZ1vJC6O6e-7S=Pv}-is(3imf3vV=niw*Un}* zN7xg+l0ojx#jAI#P2jz?w71}R^?D@|-3Oo^x4tNHPoG2V2g)~rRkXKexc37=e@=zR z2A=UkU_Lerj4LeJy3K11)I#rwWv9|(4%Zrxk%f7i_@fH>bing>Uo%rF)kn$(`$cJE zfi__NER|rR#&p&TuCKoxx5lrC+q6FI(N?IIw1s#9UX$~rq4$HT_@=_VzFAVI%$(Q( zCNZEQyQKBR2I|+rS%gnaw0rP5fA^v#vsE(tQt(vF^LWBm8r}N|_R%HeY9Dp z(gLq@;HT0Q9ZkbDLDmM?GlIU)oA@w%N~0!w05XG3>w7ZVq^=@D_Ork~yFp-9WtMwa zC1q6jQhPxzqgP-Ih`v?z6zQ+$U94o1hkWR>cDsLc1mFhvS_FrH=Sr_ECueqQ{;e z9&*QbIPB`5KY#DZn+|%4_)Xh*(XyNbiu@p>IWBCW*CmR!mCFfUO`Gc}@si=bZIBmyF>{HBmS6rkQKZ6(mEvIoCU~sp#8cK#E&`5I88s=$2c?f620QNojeBdwG?e zD_qV!8K41c!&IWMd_!URmcsIF`Q0x8q6=h zW)&_^6EOxesWHp4Hr$F58J4GugjTKvU-Vx97p34Y0Y|xcDpgo{90m)^_vH%955mmD z+^NFKQ{tig^7|YOe*o#h!phz@B$soVR zpzXdQiE$pPW13OSrwtPrnDHWEATT^>!7wGX8O_M$oD>}LC>)hTM}R@F4sJPFh3yj# z=IQvtp@lPGV)-+S9j!Y_j)DO|&12b>fbfv!*h$A>6egbSe@n&k%U{dC@A``=%aJR; zQsO>-X+eN-qU<9Z8cG$dWRt`)jt6l$6X+DmEJ6q|WEyw~VPkixmkjb$N&*%=P8QA) zPp)K&Wa1=_CR@oO#F+4uHJD#{l?P%bUeivJ8G>kI>5S1ulyAk}$nf&d*jo`gx+P|A zLyNYecm_g*e-BEul@WCmP=V7i7Iel==90un4&7iFOIc|V-I~a7nW8urik_hr9=#wA z;@+{L?4(mMrdcAMbdtQZhH{yVWt@@H%Q=H4%w(xrFhd0wO=I0&>(_W&Y5->76yvLu zopvzF7z(wtoIz3TjIEhiO5%s5AnS#V zQz_pnmZ&V+!qSFCTdezw){u_T%)*RDu?9CuB^^Ci0~F|_lho*j-B!&cKXl0S75R5E z`#WbY&wPHx4b$_^tCtS^`r7bEC&vj_+~UIKBE|(X`)A2jw+MiaK??J7Sjj;P%mwZo zNr%xCe;q}cqi7w_NjjeTPoPsl91iX&wCPE7ES*RvfS9JBz~NeFpsr=bl0ykQnLr?y z@OAM$BbLmchi@yLG|LQ_UQS)!Lw3@(lUdLv9CV;`IZxTiG_2=f@^Ucso}t1X9s;`- zPa<3(Gr<7z1}<*l;x-7h?|B&{cw&bV99pFWe_@VYISS89@!oQVfrWDb3(Ftoa#LlAZx#4nfgf{H>!+NME2KbN0Y`)@{aU!8A~(|Hri$EBlSOHFWqToZ zR>bZ?j45JV)FJ7i5@J#DE>pZ^A+A)sYZSN+jWQTgqq`nEg}|Yls&lhw-KvytSG+r=yhm8~D#-(= z&OrD5A&?9Z6GT>~7{ejK+fS>%7*{BkYpY-g9Ts41P>jjaH2V2sTxh@2CO#)rlkW@i z=MBo)1V&g^B!rrjPo#*C&U}lvadWm{e}W7Swpjtf7F>>!G{sRCap@RjXIP%0$^qMc>1z3D_!s9c}Vbc8joynU#NBij*RY8>yR z1ZeRTNCuib2bCEZGA*EDqZPgF7cLjp^|k^zM*ys+1R2s1MHWrj8=u}TwN40RzfH|??zROzTl8`krEAq0 zopVYF%P`B$`a)H55~*m>7TqM{f8ulZ6}z(Ho@0CLMYM}W+gBz^dzJSoj}7m&_t?bn z_+I5l8w~via5cOMl(mb-~$k@mj(Lok%IMQ%5x0E?%M8UFTIE zw6OQc7&@QZsGHlZUkp3}q{B6e(AeFgodW5N-Pg=^TjPB=`t!;Ye?@seeBX4hS%Y@<7nGJWoJgKMA$D^JFCPy1jK!T+{mz2 z$QP2195GUP3uw9lG^|t%e<&qYMqXH9%YcGit*my0FO1=@r#)3SVK)UbJ$)~QT)qP(%az zU9>1~$ooToK8mfVnCVq$N$yaDf+tBs5p&IHq7mz;UM@#T8|8?hxA4ku)CyObb(vyuj7YkiY_3<11vD#r4?X^0=b!4j9 zta&5IaBt$>+a-Q;v|@xh;oaF|-;pu?s2e^$a8@PE_@~dte-`CWg+eGZ&}WBJ1Zg9S zHehxzK~N4gW(E=niT|f^%nK$x`qcw3ENG@_$}kHSWlckxmA9y0HzORsVL#zh?#XP` zJP(^+SM$fZg+&`P*UvTeW#;4$B((Pmb z%U}o1?7MGi@ABUJ?6Kco*1D5y zl8B+!xA?y4tAj-Y1ZUuT-FNuDMRdygBiCQO|NZZt8$a^IThDm)%#-H(K4!hqxn|uR zy#P7kjppbnRg4tBT{ywk8&yB>G#D;>oR2)Layy6d7LAcNXD%2$1xu>rxuXrYgP&Pi zGSaHdf6%|-T7T?ed+xmtY4=ROr`^MDessM4;oUoZ_(T83JKp@kcYc*07%#4E?sLfe z3u&e8BWtyFrD}sDgj`o%gOuyn9bjZb`v3ZmUzP;HrbNrD`4-BtUcQva;(G@0iC9+v zd>rLzw4SC>;xRd}Nq&3|dJ^T)!1;PQ{>?9Jf5-fnunasz+ldP=d>zRx!)l4zu%rIk zJZZ97aBVNOrXVeW>p|{k6sYT=_^meESPy<%=M(f=>WI!*_cKm2D2X-~e;gs15_SC- za!(nCPNpksN&8C}ZAtX_DvM-6aym?p4wO2k{Ug`T#KTnsJ`>Cil{s+&bx+fo2Ywyo zf0N30Ouj_>P#;+`#!ffmtQP2DIQO&ync5=GqAgJGc<7ujH84WxEO9Tv;apZ)gIA>c z@a-8hcq(UeFR{HVSwY)+<|?4;GRGI9p1BT|{-3DZsOtWk@i(H!Vdh6=GlM(N83bnZ zYx`L0I6Za3p6>PYgw#0<8Xk`WHfxf%DjQwzAGmO4_X9Y4(*M_g@cIoJsp!uYc@M`lRx!y)JK*JVhmIdLu{2eCbWn{E@?I!a^> zom6+`(vweH*doHUIU)gUQbV1b$Me&L=cNs0MeP0@G}DEPm&~Qxb07YARzOkpO^sWd zYR(Gzvg_;g9^o;4*j*v6FzNkNbJ2pa#QCk4)iyMx`!`YcP1v21B#PhxLk?`OYa zd)P$Vl1$r{Iqd1|9qeQ5KK2lsGQg7218kYkp2^}K`=YddTi=dh%lJ(s`Hbm z`wDxQ4R+cx-f2k%+sdwFpJQKV53xZmTe4l2Ok!Kui`mE7jqHB*Fndg}C1Zm5eb@zT zH+v8JD*GY(H#;zd&l$q!WS6jQ>}vK=b{qRS8!*t4h=F__wt`*Ewz3bh&$2t%y=-Wx zC9$ElOkgY7Q`z%>*vHuy*uCsQHpy*Cy4#lH*+uMX_F?vOc0U^$X33B+TdLVvY#Vz8 z`z*VKJ-}LnY)Kzv$pm&GdltKzeT4mt{ho~tw{3a_t;Xw zHnE-TD)vowJ3Ao4lJE$=H(So0&8}b{V>hthvIp7ZNK3MRBKiA_J(azUeURPGe#3@& zE%AA6DP!x|%h~JLP3$}DUu;m6En}lBDPm7&TiJE&X7(`ajJ72!n(xb=#-7WrVb`&{ z*&a4=uqA1O`5f$Gb{qR8Yd+?PZ~Pp|#AH;Dx1@ReSXqb;bmLAuiB0$ryYU->CXAKA zI0m_>z)YNfiZ)!0JMaWH;Unz99|*}CD?^cg!dLhmq4^EGW`lH~8*y|t%F&!ZjdRna z1Krq=H%&gkKAge1^Yf>3e!6s^8#mDpVk17nxA~2KoNts4bYnwaqkMpUID(LgP4atw zlT0jVk`hcoJ!Ye;V20dYAUtNsu7YO%JZ8$if|(LfI8#CjXNd=Kg~v-Oath^tJm$%S z!V|@VxWf4|8zqzGOD&o(dy>9(zFf_*?f7HT0*NSED7mO8%9C1j7EP2Jv9>5**5gC$ z#(o@sz@M;+3&evsq!$-T4kn-oO_+_vXu%3};#S;^hwubm!5et5So$ADvZJ_2zQfPO z#c~MllK;+47H>(JB$Sj(8pa|YrKmy!W?~)|;S4Op1!%{WxE=Rm4c7L)Zl$a*nZj#U z$rkh=q_kQxN^9h_QsGf6%S&se9qGk&a${+Ko!pJ5O6%qM-t)G+*1!3aZK=eWXr0`5 z>|&mG;2NyQ7JPy|z2^tWh_V4vj;UxY3y>CEj_Yv;*5Fxe#=H0wdvOql%Y;Xu%qb6) z7F>W%bd~r0m&B9h4tWl*;yrwZZ+g!KiMt|5yhuhC@=%Uxm{sAF7OX%gx++|9H&)<( zDLh{hOb64!bTAzvTd@oK&{Hu`LMjJJERv9l92BAoGq3hmlu+@a5hvgj zEXCzh+_DM};R$TO8~6yH!ci3_(MUr!@==LKoPY&YgXAJ~p|gUm2$xk=;r#aDG8K(w z9(k}s#L;X^XAkcV{tir0ve@2aEaXB_H1K3I-a59at_8B`M^(TKwZ*Mndk=ZpvWFdAH43U=JYhpPTE6dT2F0AT3K9u7_WjWf>g}&o){5=wXClA)d z$tLcXE(9iuoIi@390qr8Ys9q76Bf39^#C0e4{m{V2O0Tkt-1^xl`qYbEkp ziM&=~|7#`jnUZ8wU6NE_I<`%JO_F)+W{xjmTX7k#!)n}Dca+%mM~MqwBp{_;cpS~~ zqa_d3c(43uX=dlvC(ANifaHo~>11!j?Y;L5=Q9oGcOA}W8s7hzQus4Sk$dY?WKF&F zKTB*#Wd zPyI;w3w_7ZIhHO18qy^UT|Dpmv(Jzr4H=S%k;p{}YH>WgQ!``{dp0h{Rk#`V;YmD) z9rzXpAk#7=6g~_`HpZh7iPJOrv(1z`b{SUS8r+Hp@DyIcR&2*N=)v#Pv$!uy8XL3Z ze5|0a!L4`zPvIqOMF;19yV1k*I~$MVJ0B-OO~*+D`hJIO@ik>j0#cet8O1fDB)w^r z^v+%D=x!zSdE9V4x6wI zJFy1`a0DSU#z-{MFbd5xL_OxqPFmPKGv>=r{m)~X`*u?A+VVnw?*>YM{P+KsL2#%Z zfgsfmIF0LF66kLig2m}?Cqh)aFwp2w)sb+k_8`pYK}LtGj(|sW!{|t(y~g`T8Rw&o z9&B`salg+vKg2j6Yn&fyoR2fk4>P`Rym3CkIG<>oPcqIQWxU_f>d()OWYu99uG)(f z)iF3mbu>~{doaR(`1|2l)h?tNJyNv~>BjvT#`T#-XBqb&XLPpFqg2Nrhql%E(Gucs zC&s9DVXV=)s(lz|^mwBu7@eougNerZe4`7DE;M?Q@p?t-`#Djp+JzFMOI7SwKM$W1JwC>;`X;2C#ufCeAPi%VDv)OPMoB=y1yNC zEYFj1G99F@UnJrF9)ZQGgK(+@`rC!mB+}mrSOR_h>FRtq&QSL|vDA3I7NgHp9fCI1 z#kjzDy$g+h`!AAcf4gz9Y9}sH9flREV{xhK6Z$)t&f)oRw9_H#_q|MYBQ7_(L-p7F z9ZDAp@7LdMx}E2RSV@QVUq23=ba;Q4s2(c9_O*u|$#V~`5T8W!U!ROCCD7ktxJq>p zu9i4|N8%dQPFyRA{*FPH>R?>QyXfn$SM5W$Y6~}is1Cx7M&D$--YV5mxY_u8x2X2v zR@D}6gMR(nq3>TUss1j)9dx9+{!Z0JxQq6x^LMNE;vUrw+^aeT_t8=PZR38`9z3Ah zfd^Hm;2}C%-T$y^57wx5;4w+`w;PYE4#E?vop@69P^?uQk7tbg*BSk+B#Z9npnJV) zC!RNd&c9%s-(Z}7(Kx@+IRBDy{$=CyyrSBPO~(1n#`#xO`>;i|2d}Ai;C18t8^-y! zjNfak(Qm6R#yhH$uuXL~-c>yd?-{T6fy9aaJ|C*~;Um=+J~poZ#JGODas3YC{dUSo ze`nxR)uZv5Y9~HdJrQ5fgVpc#rD`X3skZQcwQ>D7s`Id$j_L0)_?Gtd_Z!%wdJOie zK3lbu=d|W-RM#6!p}zkV)Ox{4;uZe(Z3n} zyU~YKJMf2UVGc{K#H!E#mueUOHu@jc4jfUP3(Lxtq5ju{Y8M6=9bj~zYKK5|9h_Ew zj>M_gcd2$GShWiwMh`SP)M&TrD1@nQ#ULw7hN<@pS8c2LNqmMB<)#wpMAFDbXX{v=8Nyn>y-z(k9^S2urs%>Pdb|Fi3IF3`DfNVNJz5XaG z$KP(`sJ1a$wF_g69&2>2>TrxxU5D{>qI&-cs=dflZDXQp7xIlRFuG86EGDU*jUv^V zD7Lcv?M8`e8>OnlF znFV~mB=!9lsL{FSoL{8cfyKt_ooZZvn(=x|tX$FOPgm{28AdNv?Ldp_a-7AV z?@{XShqG1NI7f9XmZ{FfxxAi#zJ9rC7g|+2aGvUDwEfGtnZQG}#c_PhFdD{StV48_ zy=)~a%D!YN*-}ysM#eUpp^!oe*-E9nA_?^rrKqH&6shn;NLsukuT4)#i|U=Oo_8Gj ze4fwecmDT#&-wk&{hxc>xu#EuKL%ntP%M%!4#~G2VkMw>B;QUXUjmYUFA>R?gyc)+ zv!0MI1u*PSMK}#&NuYG3e>cQ*pgl-`2Euz0-iPphgfo%+2ax`Q5R-wjAYKgg8^k0K z4uk!#0@a@lF$E|G;Ufs=B778LI#3?ce+=P#gbNTZgqRF;9O4e3-vO&a*IxuN1?VKi zWS~lU6-YgoApRTZGGH~Ro+}Vj zfT|!S16_q!2Iv~%zYeh!Pz{pr2E=rrn@E2x!gUDWLbx8`+X&x5_%2dU1H^J5Gy+zK z>S=jVlO(_3Eh$%o_ z2tPvjF~nq`ClD_L>PGVaiTIx({vL>BfO--C3uJsB#L_^o_!dnV{~BTn&>O(8|1Ds6 zzITZKZ^S=<_}?S`AwIha{$YqkfIa|*{UZ=d1ARi~|BTH41(|;ong1K&|BmHJFDmaNP zF&Rh?Vm%P%0@i}+n+NeCAbp5Mf#yR@0Wv_?5a9&~FGP3|!bS)iBfJ>lB@mN=OdvJ_ z!4&*HYD4vzK}-QMhnNgx0kI5_72>x>#@j%w3bd4HH(|UT#3DfUfMLG_#L_^^kolHF zOb2p8u73r8ay`xvD*?G8`P`6v?nu6sNInlF-)f@sgnXWWVgDM0y&#qZT8s3rLwG&H zOo-_~-blX>!oCQz5cWgzZ9w|{5oRMCfN&tfK@jT#1q0TB)-wd+U?2{}Ob~cP8GHJvJKuTZWHt z5I=JSwEUn-0)7q%KSLrM$7>YF&qt1r2hR-rSP4IN{YAS6Z`JUYi?@Ez@vqvQzi2)G zXUhkwL(d0|9}7S=67dSPj7d1}G{!&c@nbC$3W!4Zv7Q-q{QuY7HxmU>Y;24%9YhKI zSk6L!3PkC#@s_e6GVtSAOL-8d11aEKVmSju3`hy*I?GugDg&wD>|~_|qB@WU&XTsX zL7W4mg|pdGou7A759g?*^FY)ezaRc~h9E8gT8OiiqY;S4F_HL!!E7;0dR zW#n%VNd!Sg4`>A#Boc{0V(b7dA7ckUi6GAC0j(&5BtRmFFm`}em|;OC5h#p&VG==t zacvoyAmm9{PA2Gknu0bJw1R}gp0VKg(T|&G;i7E3WWl<1K^z}u5Kk9jJ%Trr$MzwA za9O-iP6&@h@MrS;2^?m4m_LC%e%2+7%VGxOectR40*A}q0D=!ED2U|~#^!_&SX?fL zOYma{v3P_{%%E@(IH5m!c!V$xj}Xe_GJ{!REH3Xy%J85tf=>{e6%qz$BN!V-2xLVP z#(qSbHIgdCCCn33Hq&+t#Z~rUqx=%L}`29J-EOI~)(>sJC;>`ACahjFRtRe|-3%|@D#C|_*Q)Kqqku;lSww!Oyb)G)ukL_Xu5v+=j;H7L*Y_L3 z52WPpbG13SYW^px@4>RGB(qR9c`SpVIg`f%ZtB18$gQ#Qn2l=2i3a;3xtuj->r;|; z^%W9&w1jlO&5i4IqHq6;zhIhw1t%no39eJhoE_r(6I?kqTuyi>NJfK_RmR@HUgb}( z-m0VftSa@|me4QT{VepF4tsa4+?}VR`KO-DcULhBaF4@SKl7jo;wacG{Uw|f?u-`) z^4(OneeC#3JYhebHuxkpMaUuJkYh|5Z7hK`n-%0c$!>=UE+?Kp4u!>w)g7w#b#7W zOM{ptD~R>Wb=WSB{q_5Q)(_5_`t{m=_F2DOn3k$g(<2n;>O~+W6n?t6^~x3+o&Z`0 z*zSxaG#y_cy;j2S@)L0ZBDKkBXRG&3H$UEvw>*DkdB2qNxE)>x*q(uPSUuqRN9Jao z(>ch4WFb4W4rrog>}Z{goxOH{?}@)U<{M|pwmp5F zSjS)H`m%SV6RUW;{lQI|l`lK&7pt&?fvsOj5UAd05F?mB`{d?DPQ#y0_BgP8-k9~j zPqi^G>&d46utRGAnLV&WLg}#%R-(}l+650Vx$4C)j#tKrhK@vpmzsFa<+S+YW@rT< zb0#);M=)sX`Re|Ewx%daKlha3i_uqvBl9&!+cE_=46O4rmd4FU{b-sNEZrmbMPy{I zuK0{M`RXl^@& z2_i-Fr*F)u6?b>;%_^XeyQi)rekCS5z4CsUlIzT>ofiv#FZ-mlb_+iI!@Yi!MV)<} z?puKxCt;9cYVRTJk_GE(eXE0+eoDBG!A!}&M&B29@7MHOe0a-X>Wfju4^qI3E&-aQ z9b3sgaI)Z5r-F=${2$sO72WaGHhP&mWO}!i&yX^T7jBbuVDlza!9$bmoQ@sL;aya@ z)7!7#6SHK0PU2o_tg&X7bjG&k6~%<$#hr{%Q7Fk|KNFkVz#F)28h!mhL8>1qbvJEZ zb;7wB+M#z3s8vVMpnC$Mw{+3C~Tu&WUxa97#Z<9TLtAEiWVX2lYi?}OpZ+AECY;BVP zZge##8xdVeSAO-H~nzfZMxBia}A_<&pH?N{3*OvG(luM&t!KXmP2U| z=qYc^l2fHOyremaYMv8`;y+7krR%MYn&)5T#BdAo{_i<&&E*77xj7Pwu;&e%MXs$j zy0}q)Om@r2Tc`4iMh{*m$`VSV?yYK6kj;5avUPB#S@^Sj0+)pcd$YI`QzQ%~j9{Is z_8y58|41*;UcdEf<+feE1xYjKnnu%-J-<{5XkJt%IXb#f#-212-H8T?i!eJ)+dbJX z{2Jt%_`q5Z&+85I4OAliU+L#jiI4tXk`+vU2D@{TEe!KLc2s1Gj#=Pa0(U@T)}M3v zDEhmzPMdy7X-PF@xuq@?bYX?~PV$|?42Il2gFZgHxs^Y)^2Juwz{c|961+@n^&+$3 z4&fQ>cN8aoP6*4J!wD4mxq4>4Xr7+Lx7ekElD$KpO*=p9l;%8tW3Gy9c) z&r+9_CN?)r#D2P`th*;^HuiMHPIc8QtT$;tjZ3q;AXh(EufXi?EBUr#$!_W$1xd7@ z34T1FCfS29ok8k_{DNiI7w`Y;>F>)9QPrA)tZiwok&X#!3Ag!vBmH~zHmu3+Q(TSyOPk|=XZJ<3&9zVbJ2}{dlkG1t?mPbGH4230+z5-S zYSTMwZf$pTkLW$de<{wn^J`SeJYjsdO|fvh)Ui7O8e+TDAGtB+D0f{DYj5;&KUz~q z&hBBKd4Ky!L8k`|_d?4C+kLU*M{&`j)hC|odJDUWt*0pWEMLN3E^GHK@Y8UA>E#Q# zkEytQszuwCk16R$sD71l^FCSmT6{@2la!S7rHplGjp6wsjm~KYn*7GD+lDpS+l{HP zGrsLfp|pKu$+Dc|yHZN3n>1YSo#~5MzVzgfM)QWTiKkkyS-a50$@Xn=G z-b?M;=!StR@mG(~FY>2IyXMD#Q=##vFvk^7yP4$MJCipnf+(C zP8bh<0b_;)wBPn5_s#0#D|FdDfgf}*04gO{jqb1k+mRR6FSd-Fc#pO>LK7y z&5V7sf|eH5dRq2IYl(?R4}aKT(6suf&sqEtAxBoZ zNoiTP99Cn*ML5ZQOvv5-tk>w_Vv>ua3*<=&1XqgXZV))m=d-si*+9zUUb(?@>s5wp zx`MTKcSg7yX5E*YI6e%2bMpQyx#8IL+{O(fj`gBJCv#@x+k9saX0J65PZ?3T5jb)D zDePR=sf9@~Y3P2a(C@68}omiUJ) zK6tzFs0@X!a<;wrDtnjd*V-$*`j;k75`xHH#C@sySYiBcURyhVY_waqZ!!2>wvk%g zSC^RW(RxR&ZJ}fK%fzk;<3TZ>QVczoMtv^(o9_QOvO^{>KP|wBmT0M844m%`_H)*nLtWr9!*r$Cp&0|yM3Cc6aye%VxanS*P4yY}sGA{S6bC_7vFy`r)}n(`;V0&kT`l*uUj$O`WUIl)lGUdFkn3 zqIAA%xVZeMp&hR`3?-lGKDfCR_#M7x!A z&gs@si3?vTG5$FZ%A*$PI_4`er=GkN$rAJK<_nw-P8T`r>0q$y12IFoXg#lseT?F z9vhE|t+KB_vj3^mOqZAWe zmYEfQm0Wn!VYG+vyu3(KeMW}R&;5W-RDzvMIruzv&k4)=mDlaJ7WdP=(n&T6ZPE(N z?PKw(dM3o(C=WQ#f7MyV4 z^$ubo-aRw1B2}}7SmN4)F~un-c>*LMH=q4~!?hn;#H)Nx+t%p3SDI$^f15NrGa(lgk~t*m7LvIbTrm|wpv%-H2h^1^&P;rIV)>uDv=n8hZW-r zV-A&l-SH+FBXWz)H6BqVW^gIiCFmJoGr%GUd z{E?>L-YE`wC5u9CbfGe+m}cBSz&+WJ2enCBhws#$=;|-uM!aSGWl#9?~Y&}e+iL?E>f>+qt?|44wb%(`L-v$@zc#A-S|ff4!2IjKW9;2JSHmlZe&=h zrhNFbRbJkvjO^Eczk|mn@=}gwxPryF>@I2;&|~~zrR4G3(kBCM zZjHQK>#PX<-4e8YBc|6S;0#k${SDJ)yGaIURDI`K6q+x!6t`Tk(53&$6Q#Q~nF6!8 z+}cePJOygpYlbnN-@U{izRAy)yZ>!q<7tv1pWM!xWlv}_FSlJhp8S+w%#p=^<1zms z+)Uu1+@b(JWJ!4`?W^fk+L*>pr7#AAu}8fYjhSzl%w`rv8!9PlM7FF+DNFVxBH7xd zl9JG(QkEw|+nYPSVKDW6ewg3P`JZ#{x%ZxP?)`9vY&irDcM|W3O#C)q!GgSInyY6< znubF4mas;W#Gy(0USa$T>MMg5JFRS;9b=YUx?T~_;S&wxE~SAO48D9sVVLH zA~VveOaQ}FkttHoUMz2^_>hIYfciX7kFz&+Tlu;#mDX+&6#J<^G_0q8jezWlq$~2+ z?t_cw*S`Bvf1swgWLEY`xtWrQzIyvt@4mN`{!QWU8X1v;3`;@w=ABsB|E&2kHy@?a zq;B(LB~B&!`RM`9UNkwuNY*(;8kF~mSPOD$QZsXyl-ek<_LA}e-J40T6dV=x7bvCD zNvgBCS6Q+%M?4jkhR@D_Mb@qNn@!vk`+nHRULI;+xZ?7q7nh}n+N4qG2b}s#l-B>n z>vKe+w#cdO-&|1QZ@WC?4-7f8kK z;f^}Txj(P$B)Wgc_0=s6kz1;?)NZ5Hm33Z!+5g7uZRGW`wE1g)9QxAx&&}|&crcvR zeCf?|GSeqsOnOOpF5TAX&aJENC26vvZFVESmq}%M>AaP;P?LDF zc-8XCZ#C3{21M|+C;jj0w<=1N%rs%JMLQg^2D!`Cy6Vk;nn%p;QhaA+xXJd~;Ok-g zI;A(2uKBU&-RcE*rr{H6lL}BsXlledtjQi9pG@41 zX}p_gCdA@UAhw)7n+?&Ns2(^vnIU{t91$Clid@xi(qZAH`QDnozdrbLmrVXmjN)m7 z;6sN_PN}VbzUX;yF0V0Qa9Ko%jWUGT6lXfbnxNw?vRwL`_J_g-+u11wZ(hBAaXL$U z3odSb>xH4}cIt*c8}d}1GY33`M{sT}@|WRv$572XLv>!_zE;zE13NA?IY28mY4ahC6b{7In3$$ zv-qsYke`c2cD**xoxdkvj*HZXSa-i_IQz=z8=Z|+e@5B9e3ciTBFm>u?Ch+@fzOb+ zN-?UZraVC-IrmR)SQvN8^wsVSdv|a5lh5l<*tYE6!I?HA&m`~=$Av)>h9hSor>&CN zEq$#w@hB_X8KR z?0RZ$c2OV`)%RBqcer!v`^XwqC&haB}Iog8YnahWr4NBFj$a2lc{76 zu|Sp5bq5~^R)ju>!=gBGIS>f&%u#EBk!K=*qaqWKHLi*4rp~4HY{tKN_}8P4El#pf za0SUIe&g)jrm=0A)5OSPL@_5ZM=@(LGcjW^BQcEFS|5b_h$Vz7g2cPcnHi2#K>|~22YHXiJ-qisG!vm3@(Ss*OSm{ zS`buE27%$%N==g$vqd32J zhHuMDGp3A*+f&$F0+oL>K!Jq|gV^J)HxWoNgloxay}VPs2I1|jgWa)Dj)??e#ys$I zG%(h!^!9_zCl|fqd8?Nh8uUqyF%A^EnkveQ#aj^^iaW%HLA#Z*g#h#jQrdrSWxGL% zaZx(aZxBag6B#Tj#R(R(T_In82z;6+DM^siva-xO_dafiQ9~4O>#;cmI*Gs{!II%u zkJlo~#SkyFE>qi%c;E}m^RF&Uqk8iaD@QmyU(d6W5Ut{f#HupHP~$_(3q2X<*Phyz zVe7%>Kr|F@6N7^YbbtfP&)xAR6FAyXTXCIIRe=lYPLNvP_YDop8*s^gWQZjgRke)# z7a+W7sJ2F3Y`~&u6P781S@8@O9y^G!d9Ue2E{g@x1%?jDDfS~05D1&;IezWU)6K#; zWmC>TpJ*G*Kyg=-Ul8=`I$cJ+KPKP$0Txxn=-dlaTI8FXGu@C*_}Md{P&3=Tnf z%rZIQe&9cDzquCuYTWtIGE>35YuBdeccOVi0*5eJM?q_MD43*wyT^(n6stq9XODhM zW7_0ZfPZRF6*md&YT+uGkxWikn3SgA-IlXpyR#M@{Px(qLLOKE40ez94J4`%DuouY9&4<>j*%FB)% zhy`m9YusOnNDxDRcsOde1kaDb#&_IvyBc--?@@EYjrtMX_b?CPC62f&R^9-3K!?Auf6=Z5AEa!mnJ(Gl zAPj&Xwh*rcH`}na zB2YufiR%nwd)v-?e*x?js?K+DNQ+VA@lEX!fmaF(lJP(U$U7YpUF}$ee^IY5mOOk6ysqDq?D1J5 z4j;R9<2E#EkA?`=j+cuaSQOqe<|_af;~*cwinh9CL;~+O_eVy0o>*iMX<@yrhagoe zN)dxW75ILj-@FN6x`&_t>*D#yGTOUn&P(I{{-Q8obzI0T_FoAA&Rc!X|5!Z>jSDn& zi?dO@_~|z=e}yiX?WCfd1OVQX^FR8Jwg)y4ir?_Ukojr^goWHP9eeqI(WN+Ldd3A6 zd{$LaW7w~qqpqd&8!0BIId#1wCqwNwyXuaH^%v^)db;5$;8p7App#s_u!76 zwPwdnlEn)B$oqCAz#QD#p=?H)G#K(&x1C??r+kjkf4P)>1(ScDD!0*Ye?JTv@wz(# zhs|qy=_)W$d17rX81QAsLoz!pq>ayTHH`i(IdKey9(6OnQ?lQ6O>dQmf?=dZETsh?hoz0A5;tU-Cez*KI?MHjh(snO3S7(5 zd_W(Ze^z0fc>a{}rTTML_vLjT!!*v4pJc&73E&1S28T+4(QA6mjR5V<3<%xS?S;*( zc{@kfY|#dhD9oJnZsymNop*?*E?<0Vl#%FRolTZKE}8+GcicLeDt_-Pz)kMddcIAs zGdMMnj7|!_c2qR}4}}Rd!0Z?DQvROz>U+|Te?8)gjiKS8*~<^mMp;=tp*tOHDW)ZkJ|qK+0Od|UogX{F{}A`wFtZ%qp2qMzq< zihw{Hw<68?TaOrKsNs1dx=n;R_o#$nZckQdmyUUWQW|H6d!4YwiN(FMYi*aL!9 zCGc+k!|hF=ojivZug+~7)Jx2&TH(JS#k%5u@r04ACAAW|_xQe++U} z^MVXF-OUn4tho@&L#S(gb+#c01VOfM-};U#tBpf9r_hRRRpEvgjXeXkoyz7LcIr_U-@YG>FZC{bc_&W=aM*k5Tu-=487F37T*?Ojug8 zrK13xNA`CXe?>aKHxB<)z@=^dfBIpfv?+UZn{RSF6T@$z=sEV(9~6Ats`*4K^!>C6 z$b`DKW3Dy7K+ZlvnDVP3RqqtL`GC`l#w9`&oS zg^;h1v;~0%flDSTS14arC={jhYk!4z-)1dWF)N>EO3cwwEE2*q=+_=DX;LO3Lrwhj;CJ=!HvBnNvFl+6B@Y7_foJf+!nO*i2ABgd@1JzmMNO7?>R= z@0`_+xx~0_<+LM3VloZ)U=@LPfjot?)$!j|nWn`p4_aU5e}B0@SsqKH2x1+7H*OFt zB$bp0SaZog;$Xu)PDov%=w3R;eC60NP>T%vGjcP{gbzXO^Z$+mRHcU-uoL3 z<`ica&VC5|gcUr-c|QjVJXa*596q)hdd51ywGHt%eF?9Q zO4FHRUZnXw-Lh=?LiYUS_nao9;LJS9YDyq_t624Kv*aWhm z$j*{f?F35B?BF;r(KWOiHtA?7o{- z2Tjlde+NtK#Vtg+6ru>JO^kQo8Woo{hAm&^IDdlhq^WUG`&k2w++?imTX;6p?DDVo zg>j#Ir%vEZ2z1g|-xa@$-U6Vm@6-E{Irg|P?|L1^(hZCW5RT4^D}xCSPXN~!4h4Wl z=Mg7dPM73s8oGH=U!AVhtv|zp_b1oT!PCmue}FUdTK=xE?~gIM>Xla&m;NkdvOX4t z&K}E$j5j8a5ar?soMnUO?UngvK0Vv>GNRY7pTLc^Y%7W9|yZx1WiSC&{q3|J+Gj^qldGe|nIIu)g^||-^t9pK7zmn|Lect^^i*WljqhJ~T z6qz$8^=sgl8QAlmOzN(d)!=@|i%uf`Rf`gU7Qd$EsV#H2>z^uM?7z_Y-r$c~w$rFE zer^+~9~73$Iwy~{TYt2;@a?AVp=Yaee_(vHC&5q&6q>+h-QbQk0L|pw_`GLd8`d8g z5#%lP(R~uc@?dfp&MX4c#RH{Jb!PD1bs5#NgI@3n6pWOo&M!lkIpe&v(qsL^lRy7a z3x>^vakV^LHvgiA+solvtTKvz-RY&7-A4K&j-?YBq_N)5`t=sR4*8EWXBj%xf0-X| zSI>>h{L%6!9h0ZvG*XKoxi_@yH)=g>tP&?&UwXf6TB}P$B;l?=g|%zX1QjH5Rhg!!J$(^o?0l*U_}s z7Lmc8nhn>x1ib;AS@^vR=&fLC^@9dJrHKnUVH#9}k7{<)Inw4dbv!lx7VovIG=F~} zudUgZd9xCK{FuS+luc2kFavJi#^w{lGib%DQv&#H5Um-&avwL{dW*k^fAhP2zPi+9 zhovYOMk=M3cmw3Vn3{F~HPSGx=Qcgq#vo4=GCAe@-W}=%bk>qu9d650y|T)HWSe7D z4^cE*C^DrDxKyxsvc;&^F^vl?;-4fBPrb0rTZj`*8Vk)FBM=Fahy$nyBmZhs4 z4p9YMN2^i+f4TS!ss-6>)hm7!;UYVCj?qL87B5cPT?x!o1tJ!u9cwYVp%!F^F1}wm zN&LUst~0ikA_y<$;+)IczO&Dc9oN{2@LqAoR^XCe$Pm7 z-Fo5m+h!K5b+xfk?Sxx)eQu8C`rGWY+dlGue8=6V53se36F+|s0JonyJ?|)+bpQ|6Q`9gE0x%0ku_o(^L>Azwf6M1)1U98<>b-ae^cw-H1*yYv9aUdJ?o_1 zzy4%&uBKQtob`Ex4_*VMz!Ca!gSRGEt=~5AQNaK6H%bX7$zq!}>kGi&pZQL{vfcl~ zcbDAt-Ii0weOri4S*w_`RK!Jjt?Kt+$SY;3@acKl9gt~<8-?WJ?aZr$Oqm5$o#`;CdT+TPFFZ(niE%0kD- z%4c3v?l|<7v0JY?>iG-ay5M`F)ofq1PVkwB(AjqVr+>8K9lx%+KtJtRZuO!N;R?*x^0;PcQrJ zg2h%lNWzQE25e9^LJvJC1sJL#np+Hv8^u zi*L}q)$QnIY*krE@SHAn&Z950|e`CNae?DhSn+~?WDqnx^dT-wK>nyj{;mdt> zod1DucDE-SU!OYPEAI8h?~uG_>&F(%zu^8A7Hs#y@Y=!W9tknV62*XDBpmar{uW;7 zzOJNT_t%V8RzJ_Dr&-*`T3B40@e6ipNdro4OB+y{0Uh^8b%*A9v=y`=ejh0Q__tqv ze`Ep)yZb=G3cJ$rn4)8XUee;NEa78e7V$AKN?G1Ai%}?h89g4xVguYii_x>BhtajX zm$8b6F*@b(qkDaiL}fECV_Oen$z41)s(X1PMh@^uln*5mhF~mFKN=#0(_cTyBU7xO zi3ku*Z~X#~Oul}ZM`qFbHFIQc^2jVxf4{@y;PL?hlc=V*IupjD(N@8jFBum6OE?nT z#~NZ*Rv5~|s?CUZC`QylLA9G3j*Sk>aU|_yI{F4T*WgA7HfvTx!3l686IoVTixJkn8t~TRV7p2?=(w4Bfe~wt^ zat_0yCRcH|CgFCi*^Jw{A>}qezopG30dCS!G1p8v-|11VEaHlJBA)ZH%-o1u#9F)M zv6gM5eTKNwUh#6F+<~4cNV7v8MxF~yCT-Ma|L#R6M0Tbe7$r5H>}{UlxW&@y zmgm4ky3D2B0Uu+9Zt*0gi9)#|f3P0Vf`WULc{F1>Dj} z={@%=z=KW%3DR}YN@J)c(7_N_mW^A&te=T7G%g*ujQZ!r(5)H3_*I}Yf3~~ymrV9g zpz`EVlOH(+@K}BwN4^P2Hs7NL8b3^HYf%08y|h>%#k(qwu?v6opnom22YXc%SD1&( zNw{2x%k8*4gv)EVypPMTa@kAsMl@H-bKEwn^8STIQZ6Q1EBIKDl{HcP)&vIIblrfo z51{q2jWoTJCH*s#t#YB%fA;287D)7m8H3smVb-Y~5M#di#h{o3>>pZ!!#W-cdnL9+ zge|Te&?la+DLjd=Xt1{^p7zyGvNsBt&--qE*y28Bn}VNJqGW*(&tOR!Ox=s#WQftxAs!f{K2;e>W>{gR+$w%Ekb^Q4#JQ zI2BjnF0Z17KA{3JrCMtyLeQ}tt6|PEg4UrJ!UiIYA;odQjsrYZez1G&;+8hiQ2U;}XFo(C9NNDYB(8GHx&pFU~SH z&Scar@-QnNf0if+JEM?^3om9NSfOH_Ffsid=IFy@-G^rKdF>r5oH^1pjYj$3wFal<)u2)EJ%uSFO$ z*EU*N2b5%iTuaxBOcxCn(OCezg;-2up{SUN9eJy7e_OGfBS!VdS-4)eFqbTf8a6E2 zXRG##hA>;dnCq-l7p4*@hgnVMY)I2hmiNzaHUery%r#Qdhp)pHLSzL2Ah{otkx0BaWpM4@*eFQjWJe zbfN6hfAN}2w=e3_)`&}|mnOR7L}o(K(t#rbTmSMSWrQ3NSD%>h^zuFI`iD_am zJS+znbFD;^#A23M?BF$6tWt~0?JiI;P$_CVe>w~_En<*Oi!|CsI>?h~SIF%2xE+ry z#;rJO(MI^z%!)9iuj)kZvV*`8smzI}L{1^j@wn0kbsBxWlR zf89wUv!)xr!ukrKoBZDhH8Ae_$)1Q8If;1w?~kTUlFC!08kjO@M$#QrCCe>=#@>>H z#+*GA`;}$(Y!oA&SvTSe_bGz=9D!w-^i-3$@9kGT(O~p8aNkaQU(o}lrK8QDWLRoY zY0_j9V*^YP&w4wnV4EavYP9wNc2~pr+@U z32HG=a)K6V;Jcvk?O@(&l&yrlWaVMSt}SWsR!5fDQ(6sp@H1eKx>d#?9paGcfAva@ z*is=G8*Z0sQI{9iiag1pK~k4p1Y0-=@=lnls6lDSiZ}rghSFTdE5c(9ASc{-#WGw< z6}axCmINB9_c2oM2eRCB=tzglPjtKHgZ(bw9CqpODB+J0{wjpOhHFP(m$d`{Kh<#1 zijfI#=MoAk-{Nh=6`F4($E;a7MuxEh;ZKs>TayfFeZConvY0dkQyiQ69jQnWH9Tg!EDTvVjsY`awz4Wi7SV?koG;`p|Gl_ zWl$AR6;NIFQWt=n$Y4;5fHLhp4_8IqAVobzJjihi9(0Is8bQyhm5X{dO35VA>`lT!gzM+g#>Gwp z2Cn2Wr=iyus3)z`z|Fi}e$8;ZQ~Z!NjpA2-Dv56#9>IdAF;(<{yE%ohh}zbtu>u?N ziAygoHC$3qt3gB#X#j9V-rDd7)jzvncEVJ|uB5TQuAgDM^Oy=-Kr`ieY*ITc$ojB+ zEl zi7Yo&Qpx%VJwyt`QlxM!Pf)TlNubq<%sQm#Y~-TH*n)43q})~{r4_Un9LSG-e~H zh^Niml|4pCh!SeK(uZX$jFzSulDT+(Zw!fmS6k{tLA_iE|Sce<$%*^Uw6Ml|U7-B&=$efWxAw0GH4WkQ09T{y~yDjA`nUOE4%b#w5MN zpo*930`JwEg=FV>XNJeOYSYi=ZO7X$!*u> z!*eA!5}!RGdEjKmk?h`thZ+a{VI1_=7+VNW%DP@+Ky2;VC;p4FB!>a}X1W-!@1QY`R0002HaFdggBLcf{ zv$&GO0TQinGgg&*;nd((0002o000pHm(flF6O*8n1b=|KvJ5Uhn~ z(v|{(f{J(`hes6!q$-}EMe*qic#wue1VjZ?#DhZxL`5!9R6qndJWvrt1w};>?-Rva z0cU3CZ8lA6_4E7e2XANQpPiZA*`3|I~J% zhT5{MO@FPHdrsNZ>a5GEW8teD`%>q^q2Y@!yz)wWSooqrVQ2W2;p!{HCsv*r9%^4Q zsJuag>_gec>D@K$6px`b?zZt_*Y1bfA>p8>Let&^#uTz0Kfoi5lm{P;h}I!)LaF7z z0oMg-XcvqFRr=?)Ov%3qV7F2ecJDMY3^MG|a(|%7`CikG)c)}w#Tro90PsB(zI@oA z>xSW2x00?HtDa`!f^sM3z{GHD9x>2use0YuU%4~r3L6x2IA*f7BTeu4+F?HPgJ^q_ zd!Ke=m8NZ(2A&u{YY(o8fBx4(x0-8Oc4VMv^`c3~g0Yg2F*AX|N4l`wsLkrgLhpmI z_kZG%2C!u<98kJyiw{DxT7cYc36EG99-|Q_rAV`pUeR?lwXJo-YfXZ66FEdTtP&(h z)LK$)km_T2V_yPMqQ`yE&2EKmd&hoPM285G=1Gc*g~+dn4n@&vMl4H_m9VUlM{&Ti z!VIz|wPX}s^9%;V9wj`MwN>L|Sw}TM*MHzK84Pw;4Z4cGG7Rt3Ocu|`V6m?vYb~a0 zkRocsYJ(M-CDblgM2E536^bk()P|`J+(?Gkp203+CBYJiV7j~NURn#lTgdklFtY$2 zhSI^X4oxs243(7Wts{ngEg}N}L77pSW9V_z5%S((VI&Z-G4K#ZhQty|Fj4SQVt?2p zK-3zbu?kcwpivA>RG=~ejjJ0PPmrb+RCu+fqB7(`a7B}j7u#)4)Ki$Pn^q?g()4r- zcd_w@)g>UH2N_zZ&Z>asGqf_j*J6g&q(iF^g50gGwGu#ktGcj+_GUKpX1e=r41JK^ zYX?Igr$f8g{pae^5$?ZD_wf}Q+JBo4?O{W|Dp0vFv@c!zcQ&N!X-Pl8P(V-1i&w7` z@)1NiZ&r8Cy;dJg`pvQ8bPFxfLW$QtSQi5+QB>NBfpkzsqSrAT(uwKNacrok0#%5O zda5F7Cv2aYJ`{x1^i|EhEom!b)*6GKE@s7B3oPJd@Oajf=O z8{z@bc6tD>$NfNB9YAUy4iBp%K04u;S_lkUQpZClK>~`+pu2?*vBi!6?QH8vc#?I4 z4B4IG5e(%-o16Z?6g(-NlhJ<{#EybT>p;=jIRXFV>h?Qz(>@w|U&?1&g8bq5&&InB z_~4qBueA&{v5o;UUvthtbAMflwvI)s-SBZ78iFZ{f<{8oI3X#wP6RrU#bcv(yqGJ) z>JCt8&=~_gV;QA+(ZDSI z>D_&N84BPH6aE)!8m;(f3ui9$i8veS`3pVUc<|Yuo)h628wFlRpnt=w<(cmwCC`LJ zzMHB7B)aN&=mFxh#-X0$@+HpmV9#gw2D+h_K+Nkw6+Z2JXuX)%lQFMhymwirpmFPF z&`{q0^f3fp17sB_`=$kLJzS^h674jYLaoy@@cjzCyh<=uVPKaYCt`EQB zqm+G=v5#{0(UyHwxIWskkErk=`dMD#qg499{OrcngZXh_n}27UMxq(OdMMTh=NmF} zD-6><6B%>A83UczS-{wRaX)(Pen|I+2kgv%eKruou&y-lXL+;i0l*enRkSX1dHPRe+OE=BB3^xkWH)@q{(8i&h z9tCX{)`vK*``E>}V$H(XB{)_+j$5GgU{etGH8?MW0P*YAEl3YWTC9zeG@#KAspbTR zL!)P#Wk59oD(EjOh!&eRZh9w6hmCkCX2XvrOg|bmV}F;SBvy?zW4hkm%OBiKOcrnX zXrO5%6e)@{VYRNjk9BXNDVG>(`{;%}1UJkQ1dYVyqRNDbj|}Fm9!eYp%DPho;Ut=4 zzla`3QE0yr8KTFpz&Q=-v7wk0WP~VUf*r z#;!(V$bW!{LvHUD93m($0qsO+gR~FAkHdZ_Dhh={MV5n6)KuVs6GK0GD8lS8Ojy3h z8V;>#U4zRrU$?G>b}0Hlok)Fl+o^Vut=}%{MEV(}d60?gKp49or~N)0do!9?cRUuf zIhp;!w!Y>HYlPc7L9u3sBE8wBBK_C4Fg`YFRn31B5pXAy{0tG!>K@S%6bOk+G(90Dd zfwtDTA7!88v8-?fD}lge*PWN$C>%L5AWEAOYZYpzidM75(H!;|Y`JF0vzX?DC*pK8 zUVqGpmN+vxMSX}o7|FAcEKF32<_wHvvL45-r42-D-$3iH2)0foih&A6w(8bv5Kk$I z(S}n7*6gu()zCw(tg|XBiilXx%M@$BWN=kTh7xCsW`GE+zi0*uVPDalE1L6C$9WF0 zIMJ8!MBj)Ljf@ac9bsr3LdXbFWSwr0$A6gg_ylb1oA7B(B>HB0-U3g11m2Twb)KtHoFI0~`E=>_hc{hkqP31yD2G|JA#TkD7`kq2&XQoJP#L?H#H+=9}TR z+d5oU-dynI#nHGK?)y%MA?21Cp4Yt7(DJU)YTdaItHgu2=BuJrx>GILlcOi=&ef7V zI(oG3Trb(OXqoPek!*`-3*DJ0+1zNZ?o4%Av4=j=omo<$jqc2rOf%h?FMpW^y0bK; zBjr)opz>?^xK=p*kk0_6-+lsj=IN%Wfb+0hz8S}|NFvTA!w;pyLkU(TSt!|QwBD(? z&LSG$bpzT(Lo@^P4=-sR76p4a?kI2K8ag$aL>y-YuBkYRolQg{WIcj*UJ!EkL&^sL z$L8Zrf|XcaV7T%~b`hKnhJQFYu0>DynIUnVqyS)Qgrwq}l&zz7CrBS0Jj zaRwF<5KjUL2G$dhNCGtsY)61N2Ciq|69kB3;5r8OAwV1hqZsge0e=9F0XljX073IK zTF%%Qp0UQD9-+_BU3jnae8oqz!H%GTob)t?fnxzcPW80V^>l;uG*(hKvd>=9=b5#9 z-l+N{j(y(1Ks5ryF))^aQ2-#P2D6CoBa6lI9tR-BF6YD_VA#_4U6vlTGk8d}s5y#`}BDd|$ zv|pP>PU8KFym%cjn3=Rqs`S1^yh-?p>?6Znnc=QQz6@P&rLH_t$Z%I?(n~-;nTtuH z)J#ST4qHH()5C`(%DK)k!^SR_aiG5HM2&BOaB>gd_NbM$XMc*!^lg&5T~c>QYO18} zl+-jy-6g5JiQ>t(T6x@eF_~)6l=K=jVKSh2`>^(XSz;j$b8O{)O|?F1wK;=Bvb9WPmO~(o|PHuJQByiETwiK zr$#=rz8!SG*gjceDl2i%$j_uuq-Ha9cM z^=x)J%DZ_^9lQDd`gZe!pdf1;GF)w#Nncw1WR~ZNxqo^H8hNWh8Q*FiQmf6pjK)|g zV|?u7VYM0}!|?%AUoIaJ@y%DOA<8&g^VRs~*D-&O)EVDW;p9=YUd5wF#+l~hV~rNe z0=aA!N@|g$7E5Z0q#l#hQb|27sV5}03@NIIl~4~u%AQ%qJ769}LL6_68Z=`)j-zQ| zI`aW#(SH-l5y`4cRn@0Sb!leR_!DY5C60lGYB?p2fkkRLC60l|)N)E3hqFWtXFY|p zq>gYFtCg2Hwy_}nm>|(G@zO{+Cgfdb8Q*oD6v=*)lFcO)8RspTY|ws+wVxK+znXLkWCZrgAw^R5N<3^{>SF4D37K!^6F~Jb%rj%Qe9&aXjqhYM~@9IgF*~GWm&Q zh1eJ?)s2fX-nc8(jj^JRjk_}A#-PzW<6eRx#K=G%NR;A5h{D3CmSfvnPk!x{SS4p< z72D{HHpa7!9>6&L$q?e!3Xn=`E7Pn!E3FYF&76}o^K6=#XWZ<3DtqrHs*j%QajH#T zB7Z1k_+z9}J%8eY3iX+!R!eG)q&`nK@`VdB^|KyFqO?Gdqf40gsb(@Ct5MVtTYg7X z)HdjRCl#np7#{U(Wpf9aP6t0sNN0GUNSzSy#H;EUM2TZy4FkOZK#l>^89;*7NzL7? zc`*XSG4L4!LlGd3fzJ_WWIAIpu1WA<`F|%UKS8vUOS_oP?bH)9RpzJnnNeR-A8!CM z(Vy_Rl)e3hM>A=9pOX{4R#NLEwLU#F8(dJKo|n`Ml6sLB@jQR>^Yix9{k?`pfQs%0 zU#Hea;&}8gsI`$e2A+2d9@-*~f#(nina(Z*YLHXwg~?0=Q( z1x4z-(y(8`Vatv0383Cf>c)TA-D9uIsoE&1mnHRzq+U(W!6p|}sMjR5SyEew5_7*N zb?#eIWUni8zlBHM84==mdx`nSc1oX*3zmY!mZ_3G)6zVgzO;Xz>^|qwm zk<^alnb*vdl9x*%IC}Z*re$05y9<*K5)|*$h}J;YpqI#wVh$Um49t#Sk2(O za_Zhw)^z*SHNBSnzNf6|ch!YRocgMRa=w$3jRd=RpIwlTcBwwzA|LN7K6Y}!{w}}; zTM2uYwE2OgJ|yZ>wwIfQ_IA1UO85%%p%ifJAGiXt@lncxE+HEqNsTI&cg|AR5_SBN ztMVBD$^L_=KR}9yuTne=C4Y^tq(&#*u(C8Q8e6UUi)X1bAie`*b6=;J8%O3qra1hD zBb%m1)`QkNLZq0w6~C2J3RLDR4gkCXq@V9(uRWQrHhUzzS5iMp>Ssy)Ley!xL7s#Y ztBDS$>QhG33a=4rYsQ`vx07G-h|bZQQRE5agv{{H5w?DlR)3e&AAdxx{@ZI0>XZeY zxmm8rU9$spO)FCFI=}HY_zX0GM3ddkktH{3&S)3 zDAxb$hNs8BXBYEpxqto@<=sNTXgfjsr{l-L6`)`2hDfNFLi4zcIPi)_pC|m2T)-Th%@$2Y#JvF4>ev77hw_;wNFy} zC3Qej9*;}uk}@Ram6RqapGVY}*CAk8+f&cpU6euSB5S+HBY%>;7ZBuRZgmFs5uhgl z3|4*teZ)cTk%wYy9Zv50WR?!p*3Au~?tx6YIHXW}SjTNh2U&F;8!mhV!A1&fIwzwv z{%2jgXP5R`%EFdrIkW}B`UL&&c8u0>4UramX^JG%~7b>7_f@`psSaN8%G%Q;8=N)+_{brSgy>a5{w+=&j z?fmUc0R5IW#8$ol3A399iW|5rtO(ZXRe(4dG;(U+BQE^+?@S6k%2k6n2AVL?AG`>z zz9YEE!+%Hj`PiifS#`bt#k-lu*;Iyc{CV$k&bjB#o#oEVHFIaxXc~+q24zYzvP|}g zLLx1iOem((%)}r|DWuXuAxT6BwqMOqvDp1|zVa&T+?<@S5jMGsPq+-|N4QGvdj?f#ZA62|h`zC4z zNwXvw?_=4i_~F&E+u#E|jSgu^I$AoJ=&MShqv`F@kCA!wfDR7j~U7w?rJ}$)90!VViO9+Z=K#_<&iLow6+6B5N@iDHfPtda` z&VJj-+DOGi#d{@@P&^zG(-0em7C5suRlLKb!w2F1GD7`b9O|zJ_Ls^1T~g8C#qtxD zB|l-fxcXl;oDpic23J;18jg^LYlIrEVSjHp;}06nka$bO_S@2MWxpezkbco`?^lCc z6@GHRHADT@3iX@s;5XXK>LFU*YS;O-_Okkv%u!OC2U3r19kzAZUP@yaLkn~83bgFD zj*|N9A@;jMZ^7g1(VOYaZjn)KrBPkQqpBGiRRiuRTSn!>QSDyD-(BdSX*J+!)qmk> zNfhdQ%J0@+8tdkF>#dppwDClPyU$7(cCt|1Nwz#l9UNBu}eF8A6`gnG#+vi(Ps z#c|X1!)*Co!m^5E7>g4Rox>(PTz?XC#JI{nqtDRWgDyu_Bpt*X@wY(~fpycTh zWqcBSx+iO_oJcoyKVF1rlv&&OMA~l~S=+gPIgewXmGc<#Id-T0l8UG|K1hPKmc`p+H|ic3gIVJ9|FMHZvg-jyd0qn7fr@b9eIcR z|FP>s`@-*3b_Reu<+b%X5Q_K7r$$wC$Mok1AKv4;FPLis8l-v2E@Atw=Z-)uq*ozt zl=*&?2FKWb!gjisY-hIp*nbxA{d1n#0TX(o)nJ~7^a==6iGIyy8chP_oZm>Wsn>(CnjNAk3o07Rxti_u_f#lAp!KiCcS+RX43K6GUVl=f^>cyjB(|f>I|2cSFlc?Ads<8ouJR6# z3W67{AC__KEkLnrHL~w>RgXpw$L_x5X`FSFy*rg=H9vx``$tfZdy)r6rb2I(n|cvE z5Sg2*!8nc9{J;uv$$w<;!wF=<^|5<{nb1Vv8`PkakL%=&dhYi!o~jG0sts4h=f>278{(RUO%l46 zX`N63({!QkOj>ffuQ}2!oPD=W**$P4``+g|O}L9G&W9_J`Z1kGUm1AeZlIaaxG(1Em1^C#L%*AUz1>IHfiTl+TYuDko8;1JV#Cwxvh}c!TMXn^baO4%5tdq6RRJX|;=}5r52Q%8n+w3KoPWm~cop;c8gO zG%9dNk3?F;l;OvGNN+PWjUvj2kC-0CI6t(9kC^~#2_UUwI)KyzX+6{TOr2pP)7nH* z=?R;dYR8iAHrUM6B9Xei1GX@oWh#Wvn0)aRcNc8uQ_v5lM)iO}u!DU^Vx~p~aW9WB zMF*!wrGMgH9t+jtoEmiz425${OK@c-3P=_haPx+pM2259Q+zW6eQ#QxVfNMgvaAhw+ zYbGDZy$o%cs&m{d=*aX%!qlkRFdI5EO-!5`Reuj&g&UZbqOT$D?Cng$15=|KU>xVBbe4>w}aF& zc$mp>Qb)_-Ii_<4X|91;O!bn;w-#P!TFkv~h9yk>QmBV5u$<{r2lc)a)-$bUmEEv~ zNqEJrK_v7GU0_?pL{0!BYswWX?svgt4AW^hx%Jc#5 zSQm&<*D&3N*}EaNW|~X+klHZ~<$Qj19e>kq&KIk?IY0rtiU0M0pt{@PRMCLIbPrQa zrX)3p>2`Fk#It%Y(=etCbwAUSOf}U5OzoK(s!~TL%&qdGmI=8LFKaQdAaXX^7xXtY z7c@=V=v3fKo`=_k?jn~9mTN_>s_;b;*#WL1S3}sTid>r3z|q{g<6-P<9~c) z$FO}YlI&=-RiR;IkxN0(sCin&`ha6GdV_2)VtZIE))c&exiVpVN_A%@Jnn9eb~R^@ zi>~f;LBojVSk;p$%W!>MY>}(WP!HR)eu}D^O7SWjEFoqt?wa7u6ZDEsDQtV-%!=cepcb+S2ZZ(v)%wy$29 zaS~_guUB6G=q2k)wN)iv1CCH37*47MR&HMwXc88Nq3%(L@Tj(^M3?}la)0O z@bztMZ(ut+i7MevIf`~|AKvl#j-p-1)7zPNRHOT+@QxON>!p(7B+|T*ZISN++7^iy zq({Xkvnot?&^a9I;B#frWKO5jb)6Wp`+Q`}czuIdvVHivtDo#6yuT~>&LF)q>dTby zeNkSF6ISqxi|lfZSK@>#vVRYj8p0OW{I_~2_Pi6XNmFW&SXBP^wb|!muTZ>F=kIFc z^|&umVM!8Qp9-RtYF9=`@1l$fPO0rTd7tI=Ljp>#u-|a5-a)c8Qky$vO1A8JBCUKT zMy4b>WdB{%cwXOBV(lxbuM3*o$L{Dlz?#MJWarSdSxsgxc0?jhTYv74;yZa^uM5^D zkO*EZsSsOxFWqD7$Eil^L=nZ`TOAF4f7NuRimZkJrnpq@nHNqcvALGVnUzO;3%^aKQbSD_PC`uhzG$k`-RR3+iL#IqEXBSF0;^ zQfOwW&F3P8fGecjAsz6~$b^;w1qyBmQyYvM5T=ea7n|=frhnlQ_Y~7aBQN%P^nD;S zNu91GI`U57Ivf+I2a>mKk`4N-J(sP2Vy zp##p5NcDx5#EeC1A#^_SainfSsljLT2OMi7gY!OQHuh3)RYoRNmKGx&lXQAxi7Civb7fCHKJM=1Wv5?QdPfvu) zg{ns#)`QSa=!=AtdNTADnwWS-Pk~~gr3n|1#t01$xQ$epEHoy;i!@j0=LElz1|JG- ziAg}(#x#N_UlqO}8N$!G#eLVizI<0@z<)H11;(G)rgZ3y-;u7)C^;VJ!$ zW-vtPYk$Weq-TY886`#@ED%ae8fG+yjY2O5#~9bZH$wR-u$@}1Aop_9Cx(M=n2u8Avzb_gH)4<^BpjH zK?|Wb6OS4ms6|2yPV0bVS2lut;c@ zMt{F?SRT%xpg&%51~+Bs57n}W4yt#Etlzu1GCQlXvb&*Oh>VXS3)MZ)g^24Uy2G;a z9=JP9)73zmW-*koZ$d)bK#J!+TP>CJj*U7*r5lyB-CNajzlCafN-T7RXGoZe934Hw zE!5jH(n9xo9){6e%Tv%Ka=hm;*ly`z9DnSy^e`TdT6~YgIhh$%HW6IaLqwH50dYc9 z*(AsjqRO6wxk6Og3lLF52rHWo1B9runXr{<0zk@Bp4sq4O`>x6A?Xdz9LUNJkv}jW z=>a6_p}u=D(ljEO^;~!}L@*go&pdc1?Az{|2OF41@R@iEJ`eeXPD7&rOS zYl{l|vXDsSa9lJjf+j*M;|kT=(0@v3SL`Xz+fXXBH1>q&9T*~XE5^MOj=LJ;7Q+)l zGviKq7Kh_T#hvghfi*&@7`G%GcP_S2y$d^uWFOvzuWa-U5l_jD^b^x656yZhIO>E{ z+9kVTDR_w_ZW&Z3lHFVekEL6EcFGT_2z9a&R%WGcAx+~A%)ShIOZMf-Zh!RkC6dX% z2Lr`d=-iJ0sz6o0R7xb1Uk)S0ccpVb(xc*om_qeFJSo2Dm}qz(o)_Oh^nCy`#aD{H z4`7b?#wMTedNl6tJ7 zuCB7f`4Q9>Y8U(lNiw)Q`3lv?R15ox3FeYxgV$PpT#<(i*D6QQcH zx#nlkN~k;fK8H?1`TksU8{B^=RPN3-x5Mp3Qs)jBAVf3U0i_Kq&&v*L)#w`$@+-227-!bxWx2?@xa7JiHN^5gBI2u*tYi;g< z2qMX_7vhK{!(JFjBpLQvGoY^|?2AUR^5e&kKLe(jM3M!7QOn zPY3fWm}kkpAJ$p2?}viRDl_bd-b9l90Nh3-aR=Z&A~_QWU_xaak~QuiOtr)vgn5>@ zgRrhL4#^t#HSDy+eGT7Q;=Ts`^6=S3vc?^T6!J;jVQ5SwafhJ@N%A3;gvfZpQK*jC zegclbaPslFzTP|nj}w3Kxn8J$1Cxn(rx)r+VW!Y_-$MOcm@70uTc{s{#YB9r7wX4h zg;00&oq!EO`Tm9aN!TV-?p~;W2m35Nd=ICHWRJcF$gS+?dk7*)M@ZHlPC<3@@u^#? zpMv^CqWJ@~A`;CXpxC1M1B|QGM6zn0hUdx0y|2(u!z>~`Mbu3qNPFi6pDvNGQVXpAKNA(hsy%=ZhlCZDMM0^Kcfzd$jP)QMz`Q|b{*oKmwaaZ2r|%!g!+ zbEw0XIEOlCiF1Fb_$HP49JV-@s!2YHbE#HD66aD65J^6lEzYgRSmNBj@l7QkpZPwf zTg?{Q?khGmHD73eR&45O84;iBV$)D-gvuSIrblfS>W(W-wM*!pq*BwX4hkI!mYNaj zgiyY}*z~ENgqB1Un~}=;%^sy(S5@w2l_?1e&bsbii6i2qsy%pR+1 zhbbM&`t264nv+jd;?>PWvhVTA)xf%PVn_u>`ZJAqHN_GaP&0@mdqBNw$sVw(pl^k! z%yHB*0_uNrp_0Hjvx@rCqM4u$Su_)r*{o7C!K#TqKlxZQ$4F2Y6R~Elk!aHlsygHo z&7kUN(F|HO(brW}R;NrdgX$KcRY`e9lDaEQ&zs3=m{7oKY&GSxBi z$^K=k?7YfuGgWT$%5F2Q-J&lqIyRNMY6|&8rLI~)Br0{SD(G7pR_SHbRjY}35(~{s)g~gIL@%SB z+DXKd=w;Mb2Z(qQy^I`nTquAl4V0rr#Uz%R4OIjYPokI6NCkwtqsnC}U1%i6U2f~4 zvC1Z&^w8KgiN@9*(3jP+qK7_4W1C8@sz-l5QOUKbm{1iVpp2E>Q12y z|4Q=;RVD<9>&z?FD52t{t!5K7L1-ebyh=SM^lfmf*;KtG6q&lxyjsl>DvDoeHdF5i zElpWz=Gl5^u2xujXl|_<=}4=J=?*fQt5ZS++92Z^n@S4>tt(YpDC^&hTUa&G*Q9^7 z)z>yeFe!1T*+N}kL0XB?(w3o>y48}Ql~ogIS~zZ)(Mr8a#8nS7TB`*@1?bDSXW`XUAS76gDusrdOn*}OIG`oL9oHnmh zO@s#Pr_Ii)RhZ73T`bSW)8_S-XXAPE2Gv7W9!x%Nc2#|Zeu_A5cC$P;Pn+E>&&|{3 zjh5%8=Ix>GmbmH|catg+n&Ccf_EZlE-5eR|?WLXxQx$J-%k%cMd8=A2zM4q4sZByD z+Hv#t%I7WC*+=aZ-(sxg4$FVj_q17PdHQPJJ8iS>s}4|{JbnABgf^9v@2kq%RZhOI zb@J$&Wb zBDyT=CfF5+WPou)CeBQBv19MOcf`K-cI=A19{aHu?7jE?e|LXgn8a}GAN-)6{NDfF zcjwNV*XGTfK@SkC$8s@C!Uq<_JVHtJtUP1aX|oP17Rb6U7-S7q5$iPZAfa zc9CywPcCS)lf|1cf7Liy>>T%7@Z|hGJIWsK;jcI7-SUIVP8Rv^uTK%BTk$s_R8NPO zol;PCny6Q0Q97aQG_e%tCdBEB$g(e0E;!%n$OX6d%T9k6Zz8A4koz*P>uswgkKj1>u*IFvKWbtT z-|j`enfXi5AGfQ7|HO*-4{F6R{W=uat?*oa4Y_WAZM{Vei)+Q6e%<8%en)<5>(}$% z@`7vUS+D9=cwVe~e(An-`C5*dM8$7=dHHJZN_}3>_4$-NcUedt^+SWdwlMK+v1;eS zt5AQ@@IfJXT9vvYRV$zWG(xc_T8vBmcB|va*;LYnIkH&4_!}pFtt@@>44OILm+3&JtT{vX#E09M2QClJ_;! z@_}o`@g$#IU;no3@PU3%^+WIda~Z=j!CSn6A9O9EGGviEOdj)Q_eB>COdm;6^< zKk{F4eaP1ZUA`zR_&N@hf7=!0Yn%Xg2$YLY%g)rw#oPF@W-V>+Q z9SFT_>7jvgcpd|Nbln+&a&LcZYx6C3USK-w2Ih2*xfJV_lux)~(Lj~~0$=`v_*($jWiPBDWG@I2 zu4oDhu~_A5!6!61@}JjQ7g{ekq1mBm5Yg}*P*|N8-{HU_zyA4-ZV7*xLWl*qCj6d2 zL+hcoYb=%uzNcMUZsDlq1B;X7Zow+;hegjrt?*qBYI{7mM(!FHIx6@XkEjVApDk=} zW6og4nT_br3xeNia@_9Vm2%6^;FeFaCB<}^dod4GXZbL4NAO72Co)9NUmH{`W6~Q)I6^wJ~He7$Y1DEcM(g^KGYk~*T zCa@et4bX?u7SKnr{{_s;!D_mR^=-_1+42PQ89wSI+6nq)*00e3_$Jx#e2Xpb(!St_ zbSf+#@loF~e_{$D8DfT+70fDTt>9~9HnL@9W;1h5wy(>KvZaf;C39Qmj!c7nOy;g^ z*_$~6;@X)=2^@O*#4Q;P@<6;90iYJc7-GjrpX*;?#(=nc^0#_L~;Xgc^bp0 zX`(XpLKD@{S7lAO=lu*W$@Ud#8E|!46I`F!O6!ALusuebgWIz`!JI>LK!;8O_oVa6 zTj>BqZl(FbPCi$HEeTj8kDz(A2e9P;SU^~wtR15h=sSP#3|Pjv^b(p!tJOaUZU(+c zTTYJ(Y3~&CC|REX*RMMa9I1a$yhvx)zX#q|AJ$%^_v)7iD;MYlS6{#cw_D&aaE}Gv z1IHraz&zSzS~&0`9WrgnfNY25VHsOsd06gRAPSycp@X+om;o7W1bn&Tuz-v<3jR_t z#z&1qFBN~8VE;D)Pr(uhN-oK4W$M9s)Ed!)FOnWfuw?}Lz{mltM}x9HW30!aAB^11 zdII{r$Q!Ih=tYW53xuR@gkELZlB}c9Gp4n&)rs?GG;I`? zSEh}zWgPmKX?L@pfL^BZ4c37Yu0Jzc!u`lvFPVRbzSc`#q>jo2TMl53mdI8bV?7Q% zP&qQ6tl=nlSmii)apeSSQTig?U)c!0QyDFlK60 zjNY%(LAPoIJfUh7yrya#e5Pt5EbAcfrQugqjq}TxQLwsN2Uo97%s-EIs2hQfS04cF z)Qx{aXRF7c53d`aU)JPq=yU2O=9jJa2K2RcqU=RFu{uyT5C1)tM(As*mxO+$E?Ood zw?cnWr$awpoq#T>AA$a~`T*z!>PMlgYR18}YbL;LYDD>qv}a9YxvWnVJiA5*$7@Ew zcWOq#$n36e!jX43! zXVc$cEh4B%Z6Lxe3B7jhlB}c9+t;?T)}i;VO|ZUmTA5_!we(u~YhXnMRb5N#RqR(K z?V?8doD0H-xp=+g#>}0W`+@KQ;lq55Negi4!q?J3#o|jzJ-W<7_@?&F)v9Tw`lWwX zug3SvZOkO|K<3UfmjKUYzBcn=dB$$Zotft{m&QJKNZcac#g21nty%k6s|d^roD}#X zuzYa4V1ID$;7IVK;Mu`TgI5IK43>rJL(7Er4?P?Tk)Rq1P$LCt2`a_f7pA3QS&^n= z?OO!*u|;VuT8!4F#pT_M)`i!4@LGQ#JE9hNZb102+YtWhjF!V4Zh4C0$W5?MYNeH_ zjhd*PR-sL4RqCK-+Kg7CPDI@tQMaHqX$B&9A@WQ_?ndNUh`c2t&qm}JBF7QA2a&fz z;k^2#O0Feg~*+hTjT@ZN= zBBv0UsH5hzGNN1OI~#m0G6se#F9IKFxEefm5vdm__w@DP?9w~IyS0bGp@7u2A*rLR zKbk%!I{2?a=_`AE)zQc!;*3pout(J(A0ff}7mW#B1P0n4c%b`vxWJcFuWITOUr zf@+}81~oc|YQb}<9vr0w!SiTg@O;cAA$I}L7t&(T7l0aFOpVYNff`*(OF~})YIGSb z4LuLk=qg$k`f50w5%>W`!H=mG{DIm* zAv!=jYlBr{3$RvnfeVUma1pU3*eGJ)5~2rORcsBeCAI}O6x)NFiXFktMK3s0=-_OT z0JjnbxQ!S92ZRZlVh(>eB!)msSm17AS8!N3;65S?9w>GP4;RDW8DdZHVzD=Px!4!H zMT~%ViUYt$#X;ax;t=q8aTxfTI0Af290k5FjsZUr$AMpp6Tt7pN#M`o6fmHj28OjW zz@@aaz}2*Kz>T$0uw5GiJGBeInc78QT)PC^PMb#=`Y^Z(_;G)*nRca5p?9Uvp>6sS z+NQ6e9r_m9q3@yBLtD?F9;|i)IBJ;orz0>*&%#K$l5RvFKSWPq&;K5Mj{dkrd@Od* zF4OMPp3v$7O9WO6bOg-6#eo|FcLW{?{1gZU*ACtod?FYKts9yVnisk*6x@$U!@vGN zn^q8&zscrv|U!;zTgq!+u(m0V&~8q!o}~l(3Rqo5D~R( znCR_oGo4IIA8t+Qj?=tq@2b?&Y8$$1%r{>laow4NB${wdEA5%hM5~ob897VT8BQmpTbJPuTFFhaW-4je>d@%! zy6JLmhUtH}(%ZK6VWd5sX?OM2C~kRai)}a=EA1FD7j+!kaLwM{)x1irMq3!eTj{B+ zF-tdXWZO(Wvu+O~GaDBY8`SMgQ#9)i8fn)|=&ofuP2Dn&xQUbrtBkigPQq8txizSz zeXfznx(3&O!=yBIwXIofUYiCCx3?$0={m(_Q<#6&rIs!$nN1lRQp+sc+zk!hIh08m zL#T!>E8b?fx|wn|q^{Oh>YCX~oo&?KyLqg8W^Y@2Yj;~awYAS^kGE6IaAR}KOh>GX zV#AJW3^jFj(=6MXJG@yuK1&wI<1y-JkJGH~Se)WWd*aeO3mv|@WhZAxx2D}>%k}nB zQg?s#T$rtmK5~piF6;NE)6`+44ckmm{#8-GX{3^!Ng2Aswz3(>0WamIX|-@=2^YD9 zr`T0-wxK7<2H3StN6chW4JWB)4O(fV&$8xlWWP*hWsEe2lTsY0o7E z3Rzhj%JGtR+qUdhD{073NZDnk)sr?8GLz0JRXfMg2h>5i%#cbu!nU!eqyfdVm&cvra5*&-tjXWmm7)rcEPHB2x~2?7#1|!bceBkx>mwsqql#Q%*+n; z8MbnAIgJ~0J>e>=4Bb9AW7>wdS;G;l#SKhw+kk} zzXr%VEw%D}iY2B*G-Ec&-)wbPB-A>Ap)#3=aJ>v4Yk@q1q^oX&^6dGuo18)eUsXZA z&(ClRnn?&X1$g3G_9nKqJCA=+?gQ){ntOX4mYB}GS|O}bh>=rjQmahiieKQ7XHo0E zmnmBE3yvzZ;j*^2O^Dr@?daQN(nv;K*EajIu*gLkbHV0Yo$lrrb!5%_T+TtxY~S2w z^koMI411=PmP5O+a8mVPS{EIJrt@uTv*lZgTDhRkTbYiTXY=P@+;o5Q%|&y@FY4}d zEVR*7F>F0)4C(e9zbLNT16TlT3|Op%bBeEjGZXEa&a3=f*GN0)kK*uh0ouy2r!GYI z^_v4(wDgq4>TXk5h%u^nq1dp0+pipDwvp23vT_QKkweACSSdaYCRj4d1x3}%4BO_w zpj+H=GMX`Ws$)=lef-bbjLkUivO9EnX+`T+F#4cOB{dX&O;OAYwu84*c(>> z(J#ptJ;O*3xPxlhakONhelHPoJE*K zmOZR8+-f!i-@0%vbxM+*5KRqO2s}7caQV0rwb#X7gd=d;4`2XghbHfeU3!}2JwAqs z!SQ)>Nv(2YmGWk-XK|UETc+oxMw_}1@eN{@VGo%OTX}!YFS6oNe`~_ZT4c+6Vw73E zFsoX-BW3kXw({?Gfj|E6OR&Yt^v1G%yyD~^ZS<=rS`cA!?Skc_Byva>vs3g*3$!qUl8LF=jWsLKvq7y z%2m&|7F>V2Z}u)c-_7+i-efI~>{~Xo96#qh>#D43th~DcIR$w>SAI6>>))R`n>+CE zhI6OIGu9%x>Lc;?aQzlJIiWUk(Co^oDdAfF%ZS|hW*TnOX0DsbAHDfwmU_~Cc#!cn zFg$ZS^CrGAZm~&@X=Tafm53?f4{;h`=2qhhk8Fx4M%HoXTeM^ky?=^HS(# zRe!R@KUOL1?Q@C~S*OA|wHfX)p55#E=m4OMo!(P1`gk`}=Do_Qw@27oy1l)9D$|3Z z+K-(~5<4=P@6uC-lA9Vseg;+ZRm@WZUgB`V{W;rTk@NxfwRbZU#w@HjuCk$z`gL?P zuiJkaDhfFk~@0Z(Y{o2lz$3{0r z@$=qnZ(1|VRPE*2*Vfo;-N<;{GI@0uPRe&JlH?vei1m?Yl+ zpbx#Pniu}wtM>`bQ%5VN5Z?2Awwz$PiqDn#_3up*1?r>;GTT1h_cf=kV=jLsrYU_Y zfMZlbXPnnN+X79ZHv-hv35Tt>@~|C~l>$B!p~d6*=K{h*!QcA@A?zY5Y1qMidA_Q9 z8S1jH#xq{ zkY>DnU*GtuKEt0z?h3A@Gaj%O1EY+QtZWo4BQ>;Y7D#`)0d1cn%}s)wJ%*PqH4G{O zh18{-kfqYWf}Lpg3_(ZV7D$CwfPrDb%_0h7a;72DnXdx!N63=br5O}*JXHa^T!enT3~p7@7B5Be z6k_H^&~U&6q=q&V2b6zfN09#52~-Sn>Re1>PdK)^&~y6~aQ#gOP#K26t|sI@J#p9q z;|5d~aKZ|DY7Lw99B#(A^e)gvAxhuN4p~$;6u_2(!LM^^S|eu5h&(Pt$$WFgA*;TQ z!U<%U`dbYCY;Xj|-2#f8L7@=(=qWwacb{fxA8QJ3_Hh#vhVFkR^KpMN9ZN^!eH@*Nk_Jzplj(4I zQ~D&7$I=vL$>siMW~hal4cO>HdOms54yAUX0_~#Vt{U#9;T{5kp$3-)gQ+^PamaVo z_4g$F0q#xwM?+4tkvMHD&TfZ>v?jzWWl+tYC#S^|RrI_KdJ%Jd zq_Oem^mBhJdqNveQ%%;-Eb5n_Qxw?c85&+B^*2hB_#2g(wl-`-7gnHAL^%iR(`qIL z(UO`|)SVH#n03)AK>~|Ibzm!a8O%ATin6gjAT-LrYtrkQnwxYPn2aG4T-~%;zi-hp zBz0KyP*1l5jBB@7trMOL8rFRX_aIe+#Ra0xBWr(yq78S}yHZ2q-cuH&Hyw%G3Vd~u zjIb*`^Rx#jH%E+jeD7=?IX+qMM;Q9g#lXhD(>vJI3t$2 z7%BEqX$yGH*DZomk#*1#TfUDj65Uy%k(FaF0;0C?C?WNSXQ?i6wn$A#$7KJZOeiih z4d8#Ck*&=$JIiq{UZdEh5>s7?diFnUzgpZ+(NXx@hhPgO`|W75&O9{a9hp7AZ9%nA zx+1Lz#~-=yMIWOSeb0DX`~ZxzN)HX&HZkIg+><)zNgd-aSXY|j?K*5wg8M~yBWlK~+{1o58{!;cPxMQMxi=TB+^yD!_g2&1nB&!3 zMdG0jx4a-SPoF{T1Io34RkWw3x#vScPKCz>p7B6nE;bB|DJ;3v}*9YLcsPS)DkFM__$nfNe# zN~0!w05XFW^?i)iZ>Wfny)3ZDt{s?FndSZ!Nf{MIHHj@63C)Ih1hFUQ%mP}LecbOA z@8T;tYnM@)c=TX@J{T1fe>W;j%tK$r#!0_tX$pTQ1@>EW%lzY=mQr2rv%r6j+>vUk zO;GbZtKxwRpxu`B!|_hTQb+tQd#JXE?uf1(0hEa=SrpHOLx++|S6nK$Z-0twC-T zB&f5-Adea3dV}0$kb4aBh(Uj@GRTbvd1Ea>hVz$#c+qg*Hpuh7n7PD5%Pm_8m-5Sr z6b~CP!DBrup0Y-=34$P#q*xX&@JAA0S=o_9f^2Y7saSq)B;knKaFXRC2{=-8^K)7F zISV_vMfRwp)DqIzh?JWr3zlVVN{Imr1jH!gWZBuIbmg)%dV95<%`bl~bKiz&$XX|r z$S>WLU%Dl~bX#uej{Idw!YnQCGU(d*rS}xmabax_;E5DO&p5-mr8h0uNE0y%J1K5< z9cdQ|X_wH>b>K^d=fOoO_=~_%Zk$Txmmh=0{L%yH%|kHrsB|m8{G@m-xAXx=2*BWQ zetB;jBK+e~Z?ZwowKjiS-roxGG0?+N!W>+*$sonW_HEg$4cZ=bNm}3mr+aNF?z5T; zOt^8EhRA{ONgg7Gpe-3rHtVF&?Bj4*7To~`$q8`K$tt9uaxjO-{q1gLo|y8;ld(i}VKIE=!?GlQvEZs{BO_x)OK%5vnDTdsey>%X)hz*tcZk_`=| zidGO;EaO-a-!qYPxy&HE5MQQ&H3%uYN4;o}CsPv4=y5WCmU#0@_K^vhINEHdT*!Iu zQ`T^9`Bff@i2+SJNoEM5&7}v7E@F36_QwEk4g>b4gzjy^6S$5=n^JrLQm0^{1P>Hf zK%pFq^@Q?DJDGn?5+hl#8OBmpT0}P^wos-hj+G?S1Sz{f5C`kPv7zjwQ!%DlBJOmO zy!J-20|S=vNJ_8w0W@J|Ox1!J%2&}e7WQ?1jkl!+;9$z~9hS1w4n`V7ff&oD5>CDj zK3aXv0?c3L$T|UvI1nzpW~2iJ+vYX3&Zbsoz&2bgFWG-iE(`IVUq6)!*?v#fa{jV) zTw9v(*RmlUqX|O>#md|;m2~v94N<7C>13}xziBh)YYr@4o_l9tALsO?=}#}ep*ZKf zddbkQuZ@0iLY(l5TU^*&#JFJQS~FBtHwr+(IdmQH^LaR|64(gw%VQFI&~3!+Ftfy1>?B}Wo=GJ(i0;a$c1v{*8CF5c~Q z(yTjRdVTeHYwVxK&jGItIWa~O9BQQmVYaJscAlH!4d*li^Jjkn=9k{jW@W8@B<06aewK7$>x-;_ zuNC-CfgiI{>*uVH%cMYD0Y`+(YiZ#+idW7@r-+?|C@5lgQ6HDX z3;h+*eyZ+43LFND3`P`r6i5b|JVt@z6_`@sG-dlNA*xQQA=R`m6JmB6sfka&|E%ER_hk zMarjA#Aj@-J>XLB@WEsm9Bi{9ge|z7HEDm2)3jf0jgP*_ss{JjPcqx!j*Idm-hu_m z3iw!o&lLE=b|gTR5`xmsFxbj;A}LgM&}TZr+Fg16AQMxzBf!)+#z_g#;wg{}Gl5_ZnPE9R7L?u1(&TrMggbS+S`A8 zQFvyA1C%oWN>4LT<5ft~zGRJ$ zzUZS*#<#;wz_G|7er;-zMN{^Ar{V{jV*}}RQ?r~ZZb8o$y{tv)dTm;#xKhG0%yO$S zUz4OqaxL1pm(%P%cdy%%xw{s2*^Pf_dyBTJjF)yR?^!O4?zTr^e02BS_M9FaFM%xY zS>1E*-H=XS*nJ%5i-oVM$95enj1`FXw`ha0V-KG?wAHC16Lu$^xViuQo?``cKD%x& zm0UlUcq~YVYq-$Z$)aro`IEh;+;&{$aXk9-%Hw}Ud2b^0bjQ9l&N1~UWPg8!-NnV0 z%#V#B#(79_{zY)g9+>d>*U1`w>bEuvh!a)L4+_a?^ME|1p9l(TY!%QL@N+&xO5t8` z+ILtyf(gPSIBqbr%B?lMEbLIVbYC1sb-@b7VIV6hq!o^LNhvDUDiQ6VFHvI7CW>f4Kl*CZ>8 z6%{l63T;U>ics(*$0%a1Ijb~c9W~13C~31CG4wW`IF4H3Ds??#w^0g3e(E5?j0`a< z45~WcB|@dq@cu}pt&?RU`aAC@*+i`K`9NMy#4@d@WTU9L?cX7-=p!raxVk)R6E%UH zz7}CXJ**Vb0p3a@&P;zvzlvDplCo7?MJu!+_nzbl>x7)CvjW2!f4r2f0euCti0AN% z3y5pjnS<-~)oPyJnFm1 z52{v-P$$qkyX-Yq;6HWY;{#_!nvH+@@PCtdG897jgg!f*SV({CTC_H^gK33ws4+8; zc1Xh(t;4)vj-+2b@I-`Wnx+ghZ&AiHq**zO*3!)g$8Xrr50yKat(xay^V4zuSU0w4 zJ?8qUslLpd{DJ)UexXjW4-2;q1W3kQo{Fp#u}`qLh`iE>9Y9p{G5AN88m&LHG^hF< zv5?FCd(CzMdA5J7=dmb?edpnZ!8ntB>vw#l&Z||;5IutT>o0%xv;}wr-u1rtH`s}i z*1MD2@XDl9d_rJcAdpsVgua%J$Cy$%$KfTvpr9H}f z?77R{yX{^rjPJc=Ut>BS+%S-rW|RLq{@}y--y@pb@vMLQJ|b)Kc$*|-=&*0_e#=(} zi-ri^!28^9@qU}=#FGv?DVDqQljqJj`jBgm`SqL+PbutY5hq}^8r7Z8M-F+jweyKJ zj1(VUI4{@RS$)FOV6^OU{_?0w2_3~_IY!=^K7Z#Ev8M3(W#?wKi_ckFGS;q4)4$<$ z(oqNRy2pQ>q}{W{E80Em=1zBu`cGS(`Q(-lm0x`DTffRnjJvCwd*a(5g>2N$VfFfC zsn#S3p=wngw3OGcTf@jY^#AKGyex6p21H9M`4-ATKVQnD@IDRrc&sM?zB|fO=p-tl z#5c{rCioj@&=V++0M4(c;$Qv3c5JeRHt;}gCoX@y@ar&X`4ssr{RsX0?u5x5!D}n2 zH3ex2Tn}>pH+=P46TjJJ8z+I^(ZAsLTk48Vq4&2tO`{~*Nc?fAP#%Tuhl0Cs6kkygLEQ#MztjF36i` zPa1zDOUBsk<#*KsJq%}hRv=T$=?vPKaN&W@c~S!-gw7)O5**GPrB!$?-Aiu&n88yS zlDmoR9mopW)-zWD-HvSg#{{R6MBiPj?mcz;*=|Meey{RU7=0|XQU000O8t#C6| z_Acmx7DfO7oRpKD&+i8ucOZuxOU{$2V3@2F%njv%Rx2o0ggFvb}6C+C{^rO`A4s_j&-`)%~-uL>gJFt3`zpdVH zi6z2o7+R|Q>B|fA3S{8rkmLC43S_m+pUcQkczXi9TI7X^A~%22S#3uhdFYY_%S5=g zSR|ay>S&YWc)wJ5Kdqy#irr1$)1SmWAv}b~Af7yPN%kEsU_FBEps< z*b~{i*(caNtnIMn0EZ>@>`HbWyMuj|bwpZ{7->rt+s1#cV%M{GvX8TWuu)E1N}ZN8 zu&dbh?0xJr>|Qp~Wy=JYC6(+l_9XT;_7QeB`v<#ElqHj*`2Da4vlp?~u}`wEvwyL} zqWPZDd{6dpb~U?+y@l;#ce3HbEQue+_hB2@MeHhe3wtly&wjzi#8~2sv1JO|$S!7& zV{c<0WWRr4e`2%TmgKu_Ignk*Zeq8xJK5cAOspj%V{K_>d)U?Nne4snQ|unr8g5Je za7(7J3)rLCP3$)IefDeC7iURsoGl&fJoYU1a<-3spY?bwN%z>&z;>}`up8Lt*tglR zcuV5q`MKG8b~(G2y_J24{fzyI%}%hSD1pDv*u{VBMs^GPHv1_Xn`ntQ(Uv;4on6OX z!0upQV*g|#lWf^P$&xB|DZ7f@&OX8Z!8(&|DN5$&WtXrk*_+wz>@N0uHgkj}<45p4 z*hOp~`yp$-=E%+|bL3|XE1M(nWtOCs?JwgHKo@$k9H-$@Y{C6_9`E5B{EgW1{UsfR z@S}eX^Kmpz!v<`{L+Hat*i$}PA}S_J5^^vFO*p9H0KUTk5_A_|6xoHn2%kDdh9euLXvHB|iF0s09>6P8J9uV?1ki<#>Ai6KJ0#5?-Q{u!K~Apvw@7QGlJV*_sTcXEHeQv&G1nu<=j1lzC!eHC5ufWJ$^D!U{K zaTtNo2v&B>+)ClqEt@N6^5-#2wpGrOXV6#KBX8p4$^+$F{LXd%|C%RO)qL)o&wafz zx~f;As(U2~qcFN!U)w8f9J>M!RUa&GRWFdg5nEFxNocMqmzg-Grb1TZQf$F(*p7dP z@np?Zc@rOFPmN!Ghc(SFPK?566rcpPXvSGVr1RDqcOJaGWLypJkxCmF{#({H@@@iwG^y4f10y_{XZg`Oqa7qbk(Tsm!z$FV% zixoH_5JgAPQFIg?E$3o0w&AY8FzLgG_#EHjcQ~4ci3h33MKSznLO15%>82Rzhp#zC zvXGBrG&Z}X2TO1?*5E8`z*TszIac1q57>+FmRK1MAF`0!GF++=M00=*#7R#}9KZWG zNrbP#BgFv;w$_DdwQa{ z;f22`QJRp=`|;C-SCVX;p2Rbf~jP6r1QDy;%iUm-!JJhwq1B-NPc^U6vL0-0~yl9cH>~=Hf6|>>}ssX#n?D- zUnbAWz!_v2^YPo8Jr!r<>=g6!;`AiJ=; zo0N%MGg0<*Pn6#=_&Y7;Sh19$9zhKLu1YvwB4wyY5QE1ji8XVQWHnEck!%k3Lpd5S z1M_e=R^c>UfKAwn?bv}nyo(?38`5TpdiBaCTG*|#dgXu4q4)0(ZDbE4wwySy5fU!{ z{l8@-9ID45Qndq4<9e4wgxZBDafaH7Xw@zZGdf0f0^F)Sh&6h+(Q&Hd;St?1I>G2f zoX;@MXBy|TjPs+7&l{uu{M^V^ z9g7^*i5P#YItBZvPDZY355^gPKkTd8h4Dt`srDk@xWB--zR>6*rD6xpBV2=&45gjjlAFSEYVFC#qGuP-FBo z)n3#ZU8mZEdgFY9@p+BL^8-dV8TU6E-D31~qg#LJu%XUGn`$T8RlCq(bWpViGgN!g zX>^xyeYepwjnAKDd|r>y2O7^m$mrQd&rzL%xpcTXKTq7Dc4NNk0`#hm#KA@{Q0>Ga zs+)(}LHl^0jYH{3b^St#3w0+JsgA^Ai3qg|OC%xG88{sJ`laf89F9=;J8`7(yk$lo zr8<8at5sLy1mk%p8uzb}VTRvnAAs(m;`^+7`&MHllv2dC1}>i2t^>Q1aP z`gGNw40R0c7d~&O-Snxv_hUUBJ9Pa4ID?KG>KfIfMA*Uh(0RP~;7svK{LuB;I7=cz z9gDM7N8%hw4Rr#}Rqe!ik{Rk0oUb|x7w~^6`uYo1dvTF!3m2=7#3e>wYCLa)>Lgrd ze80<8dvS$o3mc)Ie)$r6 z?>9d0UC9e|0p3$xg7;NBu~T(9KA?X`sNdIzs-5^)wS`ZN>pxXphFx^ZP*1{Vw0EeV z#pkLg;S1HvRXce<8(&G0j8y-;f34caZq+_~qq-2^O0nqczf9d2}l zYKK5|8=O|Lq^jq;RJ#$S+J$JNhZ!AXv|Du&VpXrgaH~kt)aS*iw&777hj`T~NHFeC zH11C_?oT%EA7R{|V%+aF?jLE~?^B(KQO5nLs(naPU5IpkANun%ED3caGSzt-S;qCF zRl6|8=xn2Nj2>(BK1SynJzs!lO|BV_cy5ap;2`q0>SpF(e!eXA^Dj_s;}F$JIMg`5P_+Y#jOQ&ju3ut2?{I6f=<`ceyKscjN2+#U znd*8R&7bdR_4mVa)i!^QQSHMD)rDBe^Yrz{s&)WgK%u{3m1+l$Q=N>}#{DO#_TWV0 zd25X4ouoPgYmMifVm$BEe;GFuc&N5Gjt|2yjC~!#RrazMm1JMCM7ESvgTdHFGoyzH zC1fiVc}0@#5v6ETT2xZuRk9`3OX{`hDWX!n)7A5i!~1-m&*yjk_j}KO`TfuRpL^VU z^ZA72OGWafA^Fm|Y^UYR01W#x5zc~G5-1z#-vzNa&~BtZ2jM*k??reY!nsKPJfwd= zV7T6Vh)schg_sD!L9qW-q52CTCIb~Bd2cE5vdjv;o$D>S>3V4D>s~cOWJK-G$fyr~|MjlFBZ!v(JwfvSf%u;y{sD+(fCdr&b7cGrh^2vEaV?!T z{xx8DzBhnj|69QDeD4tdUxBU}#C{G$*H0eu7v`^O-b2Kt1|{~4M83o`!% zGXFQk{~h+@C#U;=xd6j{B4F6h1F<*|FJL$y3CYI?u`&>u+jd$$0l=_d5Mc_!LJ&&= z2_yX?NWUo3FNUx3y8@;mJpMGtRR*FvO)Z|$ap)5)qqxTJ4_qz0I?8| zBVgF?1hF)K&`M-J7l_4yT#@TvgNSKf(bB(-96t@&zIN!3Z-D4na5+;V_8xfWiUmLhBg; zaX1hYVj2i+ZW)3e^nDWrF$HKd#3z8FA#MVSg*bqJ>tDVHSRW{kTL;9+{uaXIPZHAN zR}RKF;rG}CKVyoY*^i$&1X>_JNgr6Z2%JCY-@bfWKyx&YUIW%95yB5yka^2uE&pu&B-7N;K!qul&Sw; zlW!$|0;1^T7*lZ&CGg`%)>0r!PmZ^d1(Av$TieQmI0r}p=S{XsAYwquIH%jr15pJ? z6=z91br3axG;!`(F(1SQK-xI-I_mzsllnL>cQgcX;ne+D;A9NqVxT2BlU+dIn6E3@ya2H?T z=k7yW`Sc3FR={%kUMl#ztw=gOO4jdz># ze2Y{{({z1&w!OaJ8kLt(ve(0|YR#fglz{zp7l{^;4ANu-G72Y1}{UvtEAEPOQCHe)k|*tJdz7hrH;q zH*4!^2BX%oZjLQ2A-qqcDa6S_c2_zpoWW+}w**Plf^FU5WZhP<>r%H%m^Ig)#EH`V z`;Y#@Tes)p6;lfe`ChAks5L!|{-5ixO$__24S_@lr0v+>zJ>BnXmR>Irc>a+XFE^##bw`KaHP1ly_P6X{75Tu7Q@9;o z2iTs2b=&l?gJX*FPwE{^SKFW>z&K%fL;4)1c=qzXp~n8jBeIZx9a;x8(H-n?vy6kI z&S1r#-HVpx%XU6~o!ZP(=kaoItQR}`c3aOiVVeL3=Ra0qI~Ciwn!tN$lTiX+$^5Ec zmb#99sv2-&_`k6jdY@@$SvOEX`C*6F05W@H2L!Scooqzndb;@XXe^ED=j9CvB9UX! zQMG112F!cGxEWf10mz(-eYnLJ7Jur}P-lCrWT02Z=$W_+f-xmp6P>wyLBksYmr3Jh zq<%EbJuKV1=y^;`k)D{+n-YzC)T~wZ+0l*)%4WY6yK*P)O%)ZgqyJa=$yDr{f8X~& z^C1)Z;bSMet&P9d2BrvAE}FBc@Vc0n+hBgF_>_D0I+9m^W3qD^?$;@M%x&CprtG|b zM#mGr2fur@Y_@84Y}R|r+vF+;Qq1l>fSt3VUu@}cvRIfArE4@-^3RF)Wl#2L1)3h* z@*(s2gyKgj;6;}J&C-RfX603t-sn}3F_ZsYC*tgr0Tt#?*c6T(eb)+SKy19nC})x;x)<@--I@ysT?!igV z;j?akj+9F5S?e!Cm)Dw{*(55vW$dkM{TY*<*Qv6En%KK*+7x69`-%2WZo*c}c*7Ou9A5zA!-Zgs;#fXiIm+EYczu2&KXFzG%Tm$ns;dGxbjl5cCREW;b?&QfQ z&2)FFQR-66LCb!3fjf^TsVO=1y0_1j)212P&Dkq@@CeVjB)8tLu{DN*_->nJ;dW|Zw?Z^UcWONJ zq%KhDJ1yGP=IeF1shLzTz&QT?=A+VHZ(-aEEgNhPz|tQk#fe<1c&6tk=qb8?k*qS{ zvYe-0*5O;|r_tK;r;GY2xE)_K)Leoo>q@A7mGbnfYIrTS{0WVimiDENeqf#PsY=aW z{=D|U$?LYG&-6aQR2eznc4v?~$LX?kx8%NznoI4P9(Rwwh;~^~HKKVZXmaA&7A$=Z zmQJ>mk(am4tu(%MZjIjxhfZ;S<51P)i-*L|@MK7Plq6H2@kcS|Rga(0>YduMuNA)! z)a~|REG*7m_CbnarWm9)I!Amd>Brutvq&=*I6XBz8+$jhsir)BZKS;+`>XqX#d?jU zE86XcYLY6=C^0hoPQ*_e4}Jj?MtF7J4y3=B_kyeL@kEqkUrdZ#Pko|)@mbBTezyn{ zTRyxdbe>TxBp}n9H<*%}_-2)GR&2*H*{dBjX5Irl9HpG1*w1#RLhf|1`vYlFVKdwr z+E`>(OYG--p6G}}Ydod2ZSNgarzSyzkZ8XUU)=SBlz##++M3!m0|DO63(I_Iy9f0Ni_h*dZ210kTtlD3ss{|i^vKMh*=0dD2`B&fg zZabZhZCi{!*KMLyzi3V^@b0)J*SW;G;ALvxwDF*rPZ`GED`G#_{UsjUAJZ*UT#^-H zBAjZzVbvgMv0deLGYZ(Yu1rP*hdpDm0<1y0xZ1yKt+4mz+zRqj=i)76AClri{uoww zp-|7i*x)q1s8P&+Uo^p7VYFx`WA~w$!lx~@uLkN)=Rdrdd?T*=bBCk~H_>a_-N_<@ zyK_WmzS>=(OD0>+3p}^9E1-Y7TVpO7?X%xJmn(gBQ`6?@<2l%fmX5%#n2HWE7x_}e zX_e@*d5LsI*`qcoM-?hQl{=+QAAb~k=k(#_;dwiL;VL(OHV76UCMwo{sSW)eIKtmI z@=Hr}ZI<{y-wn2)VX|VtG6+tk$STBasI-YIX9Xx(wJPhz@3f2>RPx)s?3x=P*}8Ab ziKb=`fmwb1SbgoWaBk@mk0>$uPb1r32aTj3f3kn8jjEJlSZ;oxj-;;`ajd+=tMPGRmT2jnY$~jTUK9j zjISON_su5SrF2Rw(6(h&k14u#3I4N_Q0oiqj$G^I;Z-Y#i@{#(VEDAy?%c}bw(ANmnh)rzi;&V$9rOp{>SW_ zbl)rU+x+;$2AZ`*l3a^`e^OVg!J0b=92s(cJozr+w~J~*d5M|{&oAUC>DITTDQX*lGrY(&rXH0^`8u2=L8)o>C?w2t!XKg!hh_Uy*<_%vSX`OpoCy8KT+von=*Kxx!k^ zdhrtXp+}FDZ#U)g&SSBzZzkg@P~#p8jQZ^MIi9G^f%dF@Z$sOT5skUzb~LSjd?YOM za_gD$^v67+&U7}L7DRXF&^S>u{IOW^7a66Mff@p#vB#mpCSSy1CA ztfO3r&zi2sSmPXO7+;#_J>D;W_vX;oJjL@>Ro4s`tQ#RueySkGy#`nrsi#l*(Uq6A zHl;dmrOi1T3p_7tja>bkkTZdYa*G1^XtDHUD=klIyi{6DcB)s;7{d(4T6hYLnQxek znQ0bMy`Ck@ix$a}WGUH2vJ@p1sYFq|6j2Fn+9XS<_ucW$7)-rizshfaoc}rJo_p`P z=iHkdwojuw%Z?a2%oqi^6G>lmsQa#8=U(p~Y1&a&QK?)Up{O)HJ=`>4nR|me^UI>& z>f|I2GWHbuLuuIj{+6~Jei=shp@HLwCQ&!((Z0{Ttva+c3wiHTGT?Zhh_$0-PqeXz zsaX%EEzj28vHr@5jzyk-OR@7-WihFGv-tTOd8JWLC8gmbs^}XlBWF=Ol3xsmIIBR< z<}c34Zq1PydMbk{*x}V*xoYK1xXzJ?I-zC#zxZILbiEB!+3`8vXwMA_M$2Pv|C;2F z%YrR&VYMd|fWH#i18BL+`KoEOzj|(Xs(#DcO!5Cp?7N|UNKt)%mHNiD(s?U_W;*}C z>`nBAs@%C+E`0_42?~+6w}*?`&eT6M=f^#`y2oPscP;IIpB6_=t-6Uyi6xY%PFeZ%%gj*gNRArPD-JFiY`RKs-qF>K!`ok#yI@K>vZjM!@_v2j8 z*Zj@#2ja5BO%{Gr7{%?d@GbQ?v;^(^>f}=Y(1Z8<%jgW9V>EV1s+7!vxDuw5MSV@a ze`T(`WSj5MU#p}GgVuD(*y>NaueLX$l3`CZh(Gxz&{yPN)4DqX2WU~wfo9Iu7m z;_FcRT&tP=?jq^+)i{Fd^@A5;x4o8GcTsD^qkGxB`WeK@0gi{zAL5KOUe8=N&t9Xa zZWgs?<%x0(8j_7)fhTx`gcK4l&46#B*${_Ehq#JZE*J9iVgwSIG?w^PaeQ)o7J5lP zp~p7J=!FA+Goa~U?_0UDE4Zcm%nt6}9WnL#walHnRN=ya#ph5UF2)?<(!H4wXM&C{ zbhXSElb7f2I?Xy|_PnFBbzjkx4aAg{PcnwCJ!7oybEL__&g=*jA3?%$^mp^Go`;R< zhi(K-3Adl|VSi8dLl;OhBH(?`#q8Mm8vTj_2ySYBIB>2T$9kZnN-fS^)U0+#TZBBF zZKR*xzI|v$QIJi|g6W4ppJo4oRTi)kL!OX?e%oobey&HEA|H)~IJX82y~E|O7Dti| zTIjACOM*yrc>zt>xY2$b*n%!ubxiM{srPlzyvB&t^Hct@>TqAZ)!j8xrL;e7)53;b zN{*v{ZxSSk=fk3k!->l18B65cWpp5GZWEEs-EZ{=Frcsnac9oCgTV(Ab3kj zGa;T4MhAnj#c#y1I1rZ2UgZpNz$vxfAACc9xFWDT9*6G5=RqLAN+N6f6JrvOCZ?fx zBy`37UfSTGYk$mennt+673<`l%&0`WFK%;un5BhVq-atUDK9BcDF-QQDN88}DV)^u z5EcJXODH`Qh2_VlGa!z(@FN3^0Y*pL2&1QGXrhBLSV=V|8|mul>X1!LybMhYC}bUf z6Fp-?6GMn%1eqA?QjENGDTZWS0~CYI^yb3{9tyV@HM$(N!HbbL1=Lq4T^$1yi_c^8 zdD^~oCKY8K$RzvGDP#sC(1yIyGLOdM_@S`O zKpdNo;_#WU6eM!m7!H`;N~(^&F{EREtOI#Lh7=Qh_?Ll!KF!2v4HX`WjM;Rm88s=%A<&jn0Hn8y&GY{3=Jh4Ib-+Uj@$&_-*8=1OCFLzo9Gn8+tz?^nOg}N&bfZk5uW8Q-wNlmPDs;SX>r=jfcTG zfu}GGmBD}?I=8IOeufG{p)Q0!s9D4FCKSr%+%_pvH5wClrgQmZhM-x%fTfIpJ7a%) zi$Y7GzP+B?hO41l(Te!xjarFg5eyEhEZuK z6vcHrq2|~iE_m)7A2)(79)3hH_B{q$HP7Ag0hzPY-SoMC9Ex zhR&|`OLqA#k5=t*%ru{W%p$2yl*FIajDD#M@FY}9HwEZOjL_a^ipwmK7 zr|f5UP^MC-N0#jzkHboqWg~w|)1FNuNTkXTfR zfx$AFEFM{W%qj7o&Ve7@4SsdDtJXNq`i$%HZbz>&rexln%p*_MakR%L6HJnl!Y4P( zpgD2>h50f`UXPn4>Oh!RC?CPZnxOyL)t2FC9<^ym)ogx~uVe=AkCbmzEH{uT44mwP z)Fz;#)${=ml>?ub z6=fzL`D55B$5%CZN^|I;F@(z!t*YGGi^qY7Q)IoruJQPP6Pp4JX!%%`_94Pz87j5# zKopQX{Jf;h{)iU#pt{_`H?y97LL|YwfdTo6{Mb`dU5^Tyg6dKp88F{*!Za?9twO){ zDo7jve>g#KEy;tJT(S8!{#H6xs)wslzKhn>%nly{Ch~#vSp3}gs7QOta zZD*$2MZMgAyIEa&qrFg)PWEQP)heAL*uFdtxc5L%rKv4Nz{u>qvGg>fWp?MHJ(wM8 z=~pD6=8zZP8^K~r6EgtTuJIXq6ttGKAB$rY8wCeR!bD#?3C?&#gGNk7BiIq8^GCK0 zpNh3EShiLpxC^Z)L4yTc6d;ujsCE$rpS~BJ2QIjO`N~Xfd>Lb1@R(%1aKRfp2@2rS z4=#0uLzeH*4*`}x7|5J-*!!nNk&zEmCZm3l1Q2dBDZU#yWRcf4nNk@b(gz;Z`0tMiP9b$^sG-2`aG~j)RO<9Devn(+#q*wWuuO)9J zDPpmI7((B>q_@8Y7*%F{YJGT*dAywN`plgt|CWRStK&i*X}O>gIN!eDV|i_vk69*Z zi`L+_In6(S=}h5lTjrm92|(-IgN;?q8!STG8XZ2ADcl|f5uv}PUFipDJ!vRBeBm!v zmPNgs8h=F-l2AK`95AL)Sxxf+7>C@lPd@U0CT_U&$U{H>#=(&p5IE6=K017V zpBf9y-8!ytJZ$AGT==mvog1F-v65f}3DOI`2au$zJ*(DJ)ktx#v`+sUk@l-ZWKyD- zYY;A=JM8~%+jF{@nCrUKe}9*O8$uK91W6WjTmU!Yuy_nQf?7CFI}K2UJR8F6iVfJ* zBBwL2u>_h#6k)6u^|yfFw4HfoMs(MIwya2d|9JJYMQOo#8W470rC%*z4FV`l#9Dcq)Zn_~?9SD-A{LPg=8}_u9Gbmk zZKwAwi!|zqlbr!cN+LONx3CnD90ZAx#SpH~zXM-@G2Xq})Z(k^5k#YdEfViVqe0RyFV?Qg$| zeME?wR@76byZ7lBO60QOUJ9arI`LQ>xC27C>_-~+02ip5--!DfMk-WL?W}<5EYmgI=jtiOFnQ`cAZMc)Pmi%8S+<6Bck-5jFI+qHpG=UEl*BuEd^}t z22ZVTLsr)1shWw85}v3{U=ityF4@(<$C74 zV8~|Uhdu4B%A}b0sg)Uj(;Vf*5eGiR2^1@tXAhQy0*35V784}!c*54D_2b{epczsWeS5PN?UP%MLEV0LZ<=)yIY#G zgEbX!nN5Qks=c|FCm<6JRa3_cf>wlYDWg72s%m_2|(-=K<7Br;tX&5paN2S8+Q z_Zq~Wf+}&T<^6fj|8UL|leQ)MLEx&4!52%`ZpOCnfNwiiGB4b(kHiJ{&!Ek2k8u&_ zAYK5A;|n%8I9tYlSf5pO-+|3L9GB)htko7lmmdG_S)z1DjI|#-B~jtNIl$89&WwuZ z-PMFVH~ne!muj>z>B+g^`$F3oU;)$buk;{~Y?>WVX`N+oG)as>F0_OMIe-xXW_?li zyUc6FO4#B)mrs7OMbTn}6GY*|rHpW$gx-692e>!X;^y0b%{^k3r*dfVu(ee4ID+F( zr$B-?1%%pvB1}-QR7J=C$5aMq`rxsvB~U7TW3d?Arzfo=7vz>I0iinOHUm)NMA zN#B~(2Rp?87szY$CKW+4eV*PF6zHvn{rjl>W>pwUqbb#~c059W$W(|k*6|^5L(Rz) z;NXl|zF$m#{h5T&x2773s`AIj!-9K6gjh#D9Sw+w15$P$nlZL{vZUfRQv0s)gm6^j zJe7&R{S=_NaR$dvz3d~Nvp75WBL6x;B8o6Wx=n&cB?RhpUPa_#58xCE2;sX$tB3Cg z`dy)PW2uy2^=MAFGLbG_K`7|`H)LR|QQ<^sX9&E15s21LssCQEeh#Z|AbmB^wEd^G zsXgJ>_b~`%=d}%@jB7Dv!ix3*AnELbGwE6NmW8~&fskA3!UW?8(S%Vpr*qlh@DY!o z$KjbJz{!6rL(CL5TU!-a$ppE0Jt>$>Bc}(^y8y^Xt7eAe+ZfrzY1h}VWAL=e@_2Y( zAdusK_4Z(}!XK9B^zHsAWwzHVUq4~w{`Vh1L>q8(Fs`3$%UXN}MBekg$~_tzYhJwj zor%-tDMLTdU_dPi9$XLhn8vn!xOH+T{_ zIg4lqpSuReo69t;^(ySNIIp#v@b}xdmnNg2VV~r3!h*=Bg7m#-iksaVZ|ls<#~i%7 zvHb`>_WIx`*og?Gu5oz;P*w}h%dNZi)Hd@m<$z^)_u0u5@)Zdj-Xi=Pq?QBlN;Q{% zewy?h{K0dDuaAeNmrTMzS0}Pyl~;(GE@-!zu%XC;)+k*i89SPp1JqK z6Q%KN*+Nk0?7wYw=ww?NKCaeuuWMOi_0M79=abLSo9yyl;LOOA1FS7oQKZO!Yj^O& z4^RC$Ss#ba{>&@~4!EeTx1=~}n-+GIWY6z+U-2_7 z;^h~1+4i=4d16qonVOGgu@qYNLl^+pYSd&O>6i#^?rGt!ruNChtwJ)R5 zrf}_7|L;_vPZL=jgG~1mbtcOdj{$?NuAh@V7k?u}Z@a(kaD^dn62u8)^H|;-GTR5X z&hTczpZbWj%(!n=4XTzG?ron~Ds>iRmZzkRXXCwpss$&i`80J(OMw%E7nA00Z?Gqp z_i0q0QMyI>InHGxIAySZ^(&b9*VkSw&`nV{jd*x{jZrww@TWMQNnugP%FZLNdt-o( zmutIUNAA@kWc-%q)^s4H;io$6*bvi+D~$i9>i$qL^^X&a^&GcC7F7+dQEvj>dw-^4 z@&YQ#+$(ToX6t-Lt>ZH6k!fopod&lq_^B3GL!C7^@JLRhQ^-7jkuKx8v{tYp{xsZF zN({M-i#z>HH^*(h^8{UpbUMwn3i$t4N^ha}icQv;-p(xtqmCp_kOnR@DReejbZ_t> zvjcFh?S;m)1QxF3ez3+~_Uf1)a^RJT$_fyASu&8207k5==FePBh3_WM$g3rk&(faA z3%&q9hBr2A9WSDPp8(VAi#;NqC=$&o{C`oPej0H_P$aJkDmPGBB9!#@$a+ALP8c_7 zgq7Q7%nUm|Qnu~NcxwCwYK#47XRNZQ>cW9d2G*A@zw~>TH;h9VaPc{|q;Rl7d-#+V z!Uh#J_W|s%Lcyl7Ce$j!dW&j%i?56%7(u*eyl)4{;<=Z96T98ROcOJj-z2^A>Xw8| zKJY%xQ_KM&m5JS#8#p@!AE|!OyP%ZQAc^LRMdr6V%iaRc&LQ6E!ueX;B_z%~)EkcK3GozS}#U?3cS&_;3|Rd3&)h zp|ZLC7Q61cO=UayQQy69A~XHZUHR<<5<*dF#S`pODYIKOgbLP|cBR9J%6s+WXPs19LPd zx7c&1J>|QJZFk;nUt7EXmZRk}#ddFhbJb@1UAx*1!^=E(NBw4p&adq}jV-Ueg(g?{ zW2MD^TW|ft!fUr4FYmt2LGR43G`HV3`FQ#p=x4+pOu;wkca{iMG4t@O^KMvya{TtF=eY{nl+O0BSy>-%_as~O}{mU8aTUEn<*O-&P{PyT~XUx?UQ>L>z89nrr*Ps-f z-sF+O$a<@u-~Z|f=_hV{K`CJqUo28*y?Z_XpsOB+M(y@zHc#yF$;gRMz5ULOhiv=B zd>Z5UL9p|Zx0pN%fi+&R?fr!(!mC`p)(;PUw9_w+-un27@8sUQS9YBqySMr{v~&M| zlBY%kd+#uI`!l~^_rB^Tscg&WF;Pziji-UK_FT%YUkg*6nxixKi?z)H~n!x-6eXo_%lc(6jqY-22Lx z-(Gf0c0VOd)*CfVuge#eXKa}{`o4jGso@i^o4n+rL;e^gf@ITgmHgK7&FbV9cLlCk ztgUiqe`)lz&uKYt1$%yu-_9Qy*`fKWAKCcn`G=>g7gs+(wB}nCe%5CF zipEY}#r)-?gAZ8g#5=k^cz^uBn~2)tm3P}}?_J#eg&WsA>1>R-7dxzXho{zmUF-bY zuKse{!+t!?Rl&!j6qx)?zH+?zV}8{Gm-mbu@#zw4uJCBz7qgWd4=YiSJ2rH>-Qjq1?YyISdb8){w!((zcmCAz$k9xmhyO%goAC>FYQTU}-H-vL z8PIWmRCj2uM{7YF;ya$=2i)EABL`4*)xFC=!V0_6@tC4xf*!DVElc=+SeQk842-4> zubIWj6}*fN4`abn+&_!aG2mgeuIOcqc^HEWJ$|%JdL)V)c^O-J7y~vR~8Mr#G*AjzxZ&7nwj4*&KBl8> zaI+O|gmCM#^Kx4pZq(+6ssu8+L>nn3(a_^a7>)$O2`c3J1^ykVMhH|*MO$zOeafwWfPPb(OA|b|p?r2e z<;E6|a&ZY)%#-n~kJZo3xJ9frSRQMc%CN5|t~3Av^q6%U?N@M((Y0|#&T`qPD&Gnauiq(XhFfmpCUe_ zj#VGDlEzFnA?O3%yS4g-yt?6rnVJc7P7Z41|q8p92i=%tua1@+M zBsg-N*M+IPrt7R-(?cxcpOLLVLNjwXrIXTo?pJ^Zod^=7>!6iJPfehiA+IbGw}e?g z6ERc{%{UDDr(bdI|IBK-oG7(Dc!>oP-C@R{ zwoRC|X#2*0nD3x`P;`R)A9{klI&KPkO>CJ6>(}<}689&BClMA6cIE?&b(N3jLKB0c zK@*2TO|;n|T1U^Pg{4&aY~eFYvPJ%w!N&c}6#X`xWr&7ZmKcksU$ha&0Tg;wM_Lel z%$d@|sPlH<;V1_`#-rg1Kl68+SV1SnV2bUat=cZ{O{ja4wQf6%nj0F`qECSVZ5n*v zW{FsTScq;XL`$e^GNIUMla3a4mnYw}lA7^K9hj(vRQWJ@_LUD$$Ql?F8H^(?Tdu~G zW_UbfA#5Z#gvdA&Y|AXIQkxXD0x19;BXl&aXqkd+QKlflV405jUGC2wS3%iDX@4A&dLjnm*Ql z^p9KDLHCg{P8Q?NPhjV(e1Nn#tbV2}f1vKb;bA!|G^xs0iZGTa@gRnh&Xz;W?atJX zTGggAF`$+IZ37&q%<^1DGaACFX;t1HWz1Y;)UswM$pX2SuIHI9E?7io0r09=Ok*LD zm*lp**0-gY&ao~nKf=Q0vW326QPi-1UU7Z8x*j!!+42QkXDzxgl|VVnXgX&-nr^a2 z{|sk+p!!5#V@Ue&GO!An^@(T>sx0q@Fc~*sM5Sy%VZh5wAOOSY#i`$t(`~VybG9rx ztr-n01IixmX1v#_S&J%pY)bL4gcK}gd96d|3N9UQcj<;DUE1n%>GTlM9VRk=t14PL zu#j&PXRNf2NKRT~oUN+q1y+ag(1x;Pf@%Pj1XToOfocX72bBdSHA|7b9*7gDhI4(K^yVBguAuk@QZ7+i>3kZY5Za*2gzzR)k^rsz&50I|v++%AANw z*xXUMcGM?uo zT zU4n6IgjCx}zFSf>3M|Lb85tXeoGq>Cjm!kK0F>;YB`WyNDSSJaw<={TVNY3&uwvJi zGa(RnGB?~V)uJv}Yk8i3WYHk0%PxW~Yy{2e zFd2PN8nPlzLWH3-m-&kDSOv%lH(#-OE~Ro@cZQY(8mad&Qty|_aMPh9%`QLD=9&+7 zyL_|PrNe`SzY^h(5&pPqM_-4yxmZ0`Zz66l1fGljnIs#wk-ZUy-;NynUQ78#GFh&TU z%pLIw64E5!2q8_;kT8z^o8Z*87#^Mg^`L^f3OP%hE4WU7$LUgy^h0Wx$gfHew~z$0 zt_o%`Pl|N_%v#x~XQ7l#63u3%SrVFYXqJFyr`3pTHENRCtdZyz0ht=Doy)6; zDhY8ey^FYia`6ODcpq1sYCkBnAQD%~byArVfD{@5Z2yY$1Z|j!V{ekW(N8; ztg$fMD<7qFa1kq?Krc>lFT&-s=*0!j1q@uuW6p(tUcOr0sg(w9;0^LM!!1tn!?39o zzw+ZLym5FC6Q0IY(F5-06v8}eTbIUitj8w~ojA1Pkb+t}L}W-y0j?OgHvB<#&n}oP zFcq;YY3#4-XV`8$rqUMBOt~MM)D8)fmmF@plq;ML9dE>JViyJO)QAI{};&i%1ihZc3z*brHIU6o_R>;aHKNWEC=i)+91( zlcKYMiymVWzBvZvmORC*pgr-Bm30*98bdcFK&=f*_CYuLAP#D2P+k6+99_lQ9T5Xn zL_4#S5S}*)$tKP#P7;UHw!_=}7oNs!1m$smcRqJzixHBdgqp7OUU?P9m8Kbz*&pGO z8CN1^uQ_+WL>7SzDFV%I5eT=DZto@qp_dedK~fONs>B>4T|G|htV3i-G0`_AGFubf z9bG!OJAvCiini()Tlqi{U{PZ!R)>6X|BM>=$M6<8@K1CG{u=(7PPQ_rJf?)z?GkW* zNDLL=Lb?EQ(odg1$e<3Rn_A@*3<{Gm8Qx(~d32bX$p6(EXyc>2 zs@Ynr@&aRP2@xPsmt6H{)i)8J!}f6{w_L<~=SprMKD$D4zttKX$+jsTs%-R!vC-eo zSQYLRbiIkOMYDJOmt;wV$-1fCQ^e;lTG-t`&&a>6tLC0_8K>b8R#)r$SO;TM9zWL= zpPgXuK=vn4O9KQH0{{R30K0IPx+MW40=sax-z5RV0S>KjGgfi^d#(^y0002om#`-R z8Gi|QQ$-Mdc`tcM)62Frg$gBrEzhJa1r!7o@dCjEMFp*j2Z9tWPhS9)GzcCbD0l#( zASxg#Dhi0op>lelA}A`Jc;J14cpvD@?7YpUNku=u&wlWBX8zfk*`3|l%}b82y-_nX zP4mM4KmXLU<(l~GsqOu59Q@B~y)sW*mVdRW&2rCio7$W*tS%P5*s(8g&aDp*K6k_j zdt~^$Az^3Kh;ZGA@KOCv4%ge~52?=04erM_PCQ!Ej`J8=anFr|UAymVZNu4~8cll@ z7*og!cf%u$lm{RC5UoSpgi_0a1Fj3w(9XFAROz4FG9~|3f2V2vG+}qTkztTwkAIc} z%~88F?I7(R|52;~g$)3IjKWus9CF!6Xq#^(T`^WY&BQs?PRxOc;n+N4ps%Ou^@M-b z&X9|2P|V?&$<|wGdPg)4bN6?mJ%-%-wCS~)_VWzz#Q60)aZUX5zcSrwscFH;Akpe2 zQw{@TF<1!($xc zq!cL~>l0naQCp!KUTZ2Wqexrbuqu!sQF}>QNcA_ou`hur*W)I1v)iECzOmmFQClJM zc#@)aLKIL$`=RIrBNkL-^L07SFhT)x%$zuNu76&M@3Nc+n6;XRuyFigyLhT|&v_GrWE3$}C8>KpMBN^Rz z2D^)u1WO=_>F%L>X)OT1Kk@?v%q)Nrln#Y;=m!(RP)Ok3RESa2~9&234;AsRO8iJ zh)Pia(UnX<tZzQBSj=ZdzSMOtaHX%w+5LscS$$3m96YPOE_KXJ}P=uZJ00lMX$J z5F~G1qon}aTh)~%w70OK*V5f@W9a?#UT-t>aXR!NyZ>BWJHq|9>3=@HVng4jL%Z0} zFA7vG4DCtR{*4V8dRo>sT|ilST3&ojLnc9#^U|hs?zK+Fq)(3Rmu?}97RtSLnJxxW zp{R5a135qyiC#T8q@&ZJBiK+M1*#D{^#n!KQP@5ueI`z1+qLPz4rm%0sQ<(DKUl2) zOVUjYLlamiE)<1fIDcxcbGpHiV|Bvf5YGZ_r#J9=JOHHC8Km|B@URZVM;9DZnZTeW zbv$(vB%s&~x@+hVTdXT+2d#tPN!ATAWOsu{b|@#>()0&zz?0KC7X5ce>|l6Q1WHcJ z3HYbhb=t0*_957N7$0s4@`vL;4evhSgNs_B);iSOIuyu4&3`!w&GjJKIt;D$#K+-i z2&OCw8VNjm@}h$fpgsqN)V!D+KD26dVz zI*ofHL1*wWNL4#?KxteKc7VC^XkeE9^rL+=YvM+g2mhOC8m;(fnKK{yM4XNE{E43J zJ@_0*&q?r%jei5LW6+@^5B(TY@=!<=xv6S~L=Vu2^#R0ZO+Y=z<;$I?!Jg0V3v`~B zK+NmDH9qZZXuX)%V==E`yoXuGp>gXv(8@MUuMc`m20F(dC^YsITaer=`*_Uh_Vz_y zXERv#2kaBjO_jHzS=2}ArP(U*#>V3qz?+9IukEy=E`M74)?lKjMyEC91K*IOewd^( zkLE4Z^h9fFjYODQZ=wygzC>GUixaJ=Z4l~~PH862ItlZkfo)n#reeFCZC9}E_H5f? z+xt_S=S@V|$$r9#=w}(iNx5|5`tU10s@O+0`{=+vYS>3d*GDJzQ7L?gewJ7GsFFS~ zKRa;sV1IsMu+4*}k=PetJrwJY^9`AS^=aBCBV+C{M}ki56kzOAaX)(P0Z0#o2kgv% zeHsuWv99F$v%FdM>A;p)wX{3!GoYz@XM3~2s7lO^x4>KJFYwxDg7_VueHJuDzUUFL zQQ)D-EHDdw)*u{mONho_U^ZZDosB7nFh*k-=YIgB0?n**(Gzq$4_!UFJ+IKWCsYcn zP&o0!8fl5UrKe^M!;OOU)mp!;v~eh>2Sb~M^&yVyJ~kLvtl2DfK8{t7;})oFWeUQ+ z6z63KAb#Dt9_gV-i?z{90~+m+YEEDjGI5nzLFD-p9H(QOYHT+Wxv> z562C&7(pX(p{Oz;;v++OtA`RTL0NZ7Ae=-i>=)7FC<^T{BE$9gML4I~daNFkf{YMF zOz>lk018{13s{1nT0MR-_JRpog02LM#=>A1ja`3&#*hIKhuqmMI7Coh0@_i~X45_h zFNOV3QW6SACYZ9V!xoygwoc2eyk zyLY>&6B%Gs7ClZ?szO{b29sdZ9V!TYmD1FL9qryk-ltGk^XC2 z7$1KdQbm}#n;}SS;~-SZ|ACwpYTLSk(TqDSaIthruA8oiUa7}XL}y=BfnZ3}YCz*5 zbd%r(Ggh?m-mZNlP;iVZIEDp%TtOce^mPSDpsh9TXW6wpmX)qx6%e@WdhxQm0!NMv zh|;FSdJ?r$MXTB3I1YO}wp=shSxj@n6LEhM8gIvlmN+FjMJE&43dvKEY?e4tH2pD> zsd^l{R_2PNw8?7ALxnC;DofXk}m z_5_Sck59zLz80U>B%&wN^E!Cial9v8@1Boc!D+5IAE%(bsqnz_@dj#(6E{-ZAjFmr zY9@2A-nmjubZs3bZcqh=Jq<*m;T@}t&~SS?&|54xL+HIqYzAFOZ-M6m6b4_m^~Ys;P$9}JG9P`kOMJtxy z-fzYjm8N0O!D9?BRvt@CctL>{?g1>(9W_req*e#IQztln_|AV2wELh>`wlwJ>^pII zHQ8hDLO*jcI0~`c=>zVafw*qwA#d9A-MQI__UYd2&?Oz#*Hw-kJJyJ*}DpZaF!;nkKIUeK~j zeRYp$o$j2ARpM@3^R>}h-Kmr8vC(67=Mu>t50;Pf(?;*;R0|e zof^#}j3Q3J4s?<5saL-9Ej0{?sXIh|eCST^B$(8L)=TuN+5ueM> zB_Oiy2ZmO#9!Kky1*S6*FG)a4g&x=)zgEnr>mr=t0i>}`|Klqp4`aiHL6eI*ymLY)FD6|16MO}1pvsY!7SqY z$U|azPXLhOm?$HFgsj9kbD=t1Q7jS>^TTiNJ)_Rz4d5dWw z5xR-c$xWbd5_)Y$6vj7+$F~F3h~x2fm)rI_+OI7ly?DPOFJ1=>WhQNtD!s24ZxVhW z`^a!tX1HsKFGJTU)RiX+8SctVdI=aHb1_wvnj6r9!xm8H^!6c%a;`JXu(8214%Anj zsPR1@oZQB@J!*et?YU8A`X));EU9Udnl7mslDb7wGbME^Q9SupTaWuLCQ}W%F|7un zsOcIsQ>{V7F)&T7LBugIU9CaHF>s4ogNS2bhFXJ&W8h}B1`)@=O==Ayj)7a%8bll~ z)}cHx85iP%B3rZE?KvAKR4&O`a$WJezBY|&#%#4_5GQ|~Qs>M|c#&{A$8~zU%;z1F zx)Uk6z~?A|WU5_vs&Nphf=$cQzM_Vw;gns*g^B%0nC+Q&y&>MNXh+m zS8{*Nm-|c9vvXi9#f|IPT(>5{{Wray-JKcbdNwZ|<=s5LiQRnH-gff>P>?ka8Ll?W zq%W-jGRuGWh`G8K8hNWh8Q*G9&eaCw8I7@0#`xIDeQGsChT{WfZ@FA3;=5n1hA87~ zp`7DGCiDC)Y%;zj!pQ?@y_QFhj5EW>#~Lk`2j#L^B&mla^{}KCOKORvmP+aoNiCDq zqexLb><9HQr0khTc?T?jNQmRD(ST;Gr8t^0(^-EAD2pCZj!0Hrs;WLts!KDg#+Rw( zlsEk#Sy=$p-DmSo?9I4UJdccz{uEJe0uYGL<}&kSN8A5QT+NEyuR6p8VP?@uZxQC)q|fv@wBg^ajQmNQMx%R)ADmTbX9< zDQS%;Y37WinWxgsta7vSsqFm`QT_FNk5hkV@)AKI!yhA+>iH8FRH)A+wOUeZB=vc^ zkuO}3sUP(?5|u@I99_b^PcxJGSdF4QZ228kNr!CbTd6>G!tkhPE1TQbbUOQCLb|~N zMe2lrCtg*DB1#+sYZ&MQ0CEhN&gmproz(n@H3uU=90Q**P>%p{41A8jKBjXO#x;Kh z9xVR^f;SSCi)W|m$J9N@MtDY?^-$0>m;>aQXA4U z^Rx>p)H9NLR#MOLB3|H6etzDTy1!S`2vE`8;Oo`eNF0y;S+zD2$G|gg!9!cbF|Zba zkm-DYKm&4Wom{8hH;H3lgIYj|W8i;jUN5`ldO?vouQcq9IBdD`Jpt6)sBZjw-97e- zoT}#~^@5~cl+>p59K7U$3bk2MTO{=|QDW|Qrp|q9itH6-?qBAScSD3Y9{G!EQix+< zi<%VT7}%^Pg*XPDPe}@LYEoWMlR_K=o7AKb$G}VJNqH$lQnscfr5_D&D_MWxvtgO| z%IOV|LG!wM0e&@o>R*$SD=E}xYMZ3qkkp%!dP`DoC(pc6PfA`cfZ*umx0{x2$?q;q zK1fi+6M#YBx6q-ecPe}{Cg%cw8z4}%puMfyx(YlA5u>k4l&2a+5`9xeXJcOyG5VH@ zE<%(P>qca=5WDRoV+CBN?~Yx*5^Arhy) z>Y$vz$H_*5U2JC;{!rR{Us4|s^$FX{&q8}2y7tQX z3iE*!aP0590mgU{D)U`w%zvQZX5J@s-r* zq8nD0rbS~| z(Mu`v1ad-Vc;^XQze<0rze(zMqMrKOYY*yFWjph;T#>tGPuDfAM7ity%G=;m&;*XB z^FLjJOlKDv`#mY}1X1u?Qx}qaf`4ubZb$GBO~D-q{yq)nD0jMt7pf7*z>ip4Iznyf zhe!jmbmZ*qezwa6$l$KMUfiIblIHHD=1*K0W(0X#{9iXbJ^p_kyI9!B^)D#z8On}! z6tsU9ejHo@T7LMsTA@x;LoXRzoH_!S?H3aGLE8p=n^clOAG-52^iANP`A+$TZmq@c z{3Yzp)rmg=R9MYJXY3y+Elzkn)c8DHgh@=)9!dQvDd@|TE-6D&UP<{R<&l)>5%uL| z2w2wk)U)>k${>Gqk+og-h-B{u1UZ>ogMmK?Fp>ZUE5Cs5y03fWq1al7le<2dCC$@F zH$NM7L7c9OLke|*b=;nGkX6^Q*M++h>`j49=U9}+|7dFW>`{+N;utVJVjZ2Ht*)a? zSA&aaN|h1vBS3m`OJ;HOI)RInGVZF|sP`CpavU z&1_AkYzI6_wuxh4pUl~&DJ}4*2lym%fiij2uf=v2; zX@`8FOlp52Z{P>AGrtuGEc9W~Pfy=^* z>_)wc5GR91PUCyTx&Qv1NwG({Y7oaj3kC*)7r}q+?Feq};iLO(?9za&y59fd-Mr(Y zsDd~?@7nI|-Q{wZc zfPzAhA|MDVA|Oqw4IwDfoSBv3VEdSjfSQ6!w z5BGmspN(NDun5PA{?EV2$h%uv_?b-awPamdam{n7g$6#U<84~OI+}E2#U~V~Yvp0g zyIki0{-2E9HZp~ZU5^9yYISUpH&8c}y-)i#0EGG7&omszvMb<+$CcGl!zBK>7V`s;)JUCRAsmi1RvzG0WiHw-6N`>TelL>jKnl~t97z0!Yh z^+?0jtqoWCgNCb!zo}vCuryrW?}JmNU(~Jry5MGopWJU&q~Ds6e%ssljrP%X5lwHk zYy4XK=z5gQHnJ8kNL{wI*(E50S-FN7s+A<#!41D?5LNak%1< zbJ&6xmx9>>j?tgdXXNcc{B=8q4&rtA#})Fxy6Mw&5+CDfd=h<{J9DC(NGEnrngj|s zGk5Tbv<~Z;UvU3&9w$C4=P{z%Gj~RMZk^Y@wE_k7;{|}b>(#7Xvu^FWmp7&nCk#eA zt24kQ*jj8C{I3FD=iN1Q;O&0{?xYzNhoJ7ov2J-#G75FT>+EhUUq9_U-+HMZU8VyUR$pP z5r40Ix~OXIn0|aQIL4zd82dslXy_rkjqSVcF`+nUlt`-I_`>gk@7RBS%yyZF>}_lx zWSht1XWgqp2J}Pgf(1NsyYZOU1=((jdDv4F_8@4gi_HbY;A4!i zE{4>>sD@xe%F;jxK1+XH8gRikF@3O}0*%xR?z(AcXp#$dIg4V7pnV7+1WzT={E~$9 zWEcDl6tf!7KjEVJ^MUL%wiApop%8d=n%~B`G!TX!p6UKDc+du61^eCv9kfGy>vanOFh1lS`?EG{ggdD9UhOdr@MdPQ5Vhe`DxCs6ta)T z7R6MCg1A@1m7#_9YS;yXd|W4Iyeeg1C1*z{b1bP2tg0GxOUMh4DpsvV1rbsemaa(8xC$yfA;1=`77ex(i+cfJGP+zz26T z*(yZnUQi04VR9qi6r}s15LYQaiSorEQ4}}E?20so$!Uvd53pY|C;277B=$R(NLm<) zX5Jr*en^v<*1!?%X-I*`m=0)1v_6muk28&DEghyZJsu>g2-BJD;Un5Os07b5^-Vsa zxu71*V>*B0q$u@aKGTW>q6V;#X|02(5iDYA8%xv@7BfAZbVM_tH7sFzA#_BGK`Lfy z8pM1^OPPB5i8{bXOx@5g2%TXg(>kOO(k7-ilQ9F*W~Sv#-C--!lw^u>1AM~NE{?QY zU>j3RGIcu;wljUeGzdOts+vH4x5G|41^8L)?*o6s;7itQ!D4?H_wqQ?j^tv0I_~B7 zOkdlJ{gu(@9MiTyu|EUGf=v-6_>2A3;6ZRR9ZIGsMG#;*VJDgh2~1z1AMIr_Q+4*6 z3~5XkIp1SYiD|Wi@;wW+nHmNu-wbHL)Rp~SgceMv*l#wpV@lweuRwdIs!Verm#G!| zy#{~RFwIFS_Sb|rpgU7@ z={Wbd4DMzcjoDknyD)-jhFPhQ%4`b45qU> z#as`sG5r!IZ3Dc;^Z?T~c$cX`8uhRpK45?P)JDDUg3U~8Im#Z`&a^p9+Fsbn)Qjl= z>|?r^N*x`9L#hzzqyy_jI>y>*8$~$|$Ct4|vg{e~xHB8=TF#yon`L)Et~VR2 z>XWt_=V!$gIJ%Fi#5NE|UPsf&E=?!fG(h&0kL;Z;vdwtTJR8~BJo9ayb3K2nZv@Hq zXFJYG)eg6B!g{V|dyQiguF{7-%KmIBRwZ?AbaD+E*?Meyvdv?gua#$<##suq@@v1B zBcxfX5>>%1NuOihSq{or-$6Abv7O-H3VHq_+di!7q=W1dj(M4zu2&?`^$tb$`Ly!x zo=HB4>IcbmJwV4UWX@b(hb@1KMz*81&Yx?ik@+!b#kVo9KnJoir!`;KU|W&x&=jhK zJ7q80wZk}4)pr8zMqa&_lTWy4{0xqydvU&0(maJ?R$)8NXV)_Dxq+5@RD3ck!Au*S z!-;4W^wnu)R;1H)c7W_JKC+{E{?&102k`YBL9#`>za>0!msaleT3UZ}Tp};S6;^Q3 zLH2zfuZ1gImVLO?5Vbhxztuy&=k0vzY*K^xQYHVsHtYIWD->1g{9SE4ANNHnY?DIQ z?}pJzwY$C2d$f}McB$<*c^B~fX(5+ZX6<|*s1_#sV_LRdR>_k6<0PEP-%YAP;;{X9 zUUPVUPw}qKihxa~D;;QZw)7LA~&Jn%q!FBI>=|HAcW5p=o4dTE@Iqd19@df} zN2rzmJ1q=-gytlj)>7dPq29^owKNzfG(O3$r@_-g(?f=y4sQr`Ns2{UDO8e_s8@hb zgpLQ&kPd${jpLQC1gC{)KV{L$X20}x)gGwG(gL=?B->b z-K=KW%`CX_5+;}!tghFz_|>xb)wcN6fl=bOOs}KYgK0vY!j1L%upmk;^#-s-=xaxg z-VjQo)Jbn-$=BGDuZbmJGl;Fi1gZ8OdJCv76m)-IuU`S}g#0P}^_Fm>&{N^TdMg+u z)FJIoy)`^4bl5f=>2;x9`WU?ptP$E5o}jmdy+Zln$@-OWRw$VEq~6X_bvsMd*_NuW zf|#mI@R4o0-T^KXTBgs`J3?EbQ>m}%S3?h>o+jS=wvW|A^eW9Yz>hJ-irbL|Y zn0^Cv7aE>?Lcb9P5^=XbA(`{tXvx>llJ901l~LB;dHoic7R}&r4}b+x^0;q>EkxW= zoO>XYMk(wb1hJQv#f*h~sKE3gEDh$X!O(v>qCpoYQBR>6E}|QR4tir@Fbo#Tu*Je{ zuvTb}i~b6+C7MA&0bX$iCuJyrdYMFr)K((PeYXIbktUVh0oO-J-yf5&hQcjGTqn`J zrkO*bFiNx3otBuxpoq08N&Q2W-S=2(DW|O#y47D*FQ*fp4EMbzs^cDMqE_zvqcnfm z*4;hUL<8IpnrNi^5qO$wc?!D6Jn5bcM@>CE3O|~9cnr>&w8z17S!B(qvL_&3h$@>3 zRfMRrY0y@PDw_`P3sGe+Kx#E1tZXKX5u(aofrCs_U|s5T_v`ROb)rIeFJ+;79yH2| zP_@ufq(_jbhq}&{NN*F#TF-|MA_RXk@boNz^-*oNV*%`88pmg1AsmiqLaGK6%uIOR zw(vJIy%9}6?r&~i2$u@|;@|C92$wN^sC!c@+TVf8Mcbd+9H}wWIQ@9)ZpS;&TC^;0 zMf)O4hDFdT>bKUts4N5eeS&nCPz`;Ldohe+D%4x(N0A;9ZKbW$y##g$^|F8OLE0-6 zaFSNLrbJ<_5fVjF39+yQa)oxs=c{7qDRe6CjJp^n3Vj+^>Rt+u3XO`7g{4uyUg)zXE@pJn}(3z0{E z6JAgoVYg5*(k4i%7n%7~LO;i5TEXZYZs;pF=;Pe!-T;4j3#{=xk|x0e2HgojYNS5UtrxnAo8FyzDerjoQ?R26?V*V<$W> zbd#2CdUFMjmT_BCS%{6v`-cU|?TCTAhf<&Az*VqH8M3Uhv zs6r$ezJjqtlHq?Va|YCkqFO9!&q~Y%wr<8=m?iXsqnoi0-V&PQnx^fCVxbIoH{$@T zGG#vqyG+>+!cC3JGaQ7WM3Vh$7)B(1U&90wl%eCV$mxy=dM0~E7Yv03mq28$d z0DFY`1($0l;D}J6bGh~-{AlXoBsiLs@6kz!ZCc*ZNvMV-9U+-}I0cPK<5RavI|Xfs zBxWh}B$9uar7+$UvlL!1#VobNJPmJ=#=WoCPD3#fpYrwEPp~SQZ@u<2Y&7LN1A9&R z&cGGT%JZFpUP!W=NalQJp@1|#<^7GbFr0`_d4J;^j1|go_czYNBqGUo0p=1(z6+4l zygc6pXpbcQAx*4Vp6?>`B2A)PgnX0VMHr7Hbs~S6{gj$+@>8nV5Z`Kc{-eX_Yz7cAYQfPS8X`uz-Lc^=zin4FO z2*ZD;454k_5k`zM-`V{to;2A_zba^1evkC4d!iJJWbP!UnWTO;#Y|G+*5xsi%rQ}`Od7{*tS71ZL>#lFo@|L3R#%WFF~jOc zQ_QeACTasE%A;vBjIg>>XmU!9o}xxa>188TJuXx;n4_nu8A8+3a`bdHFG`*C3Tl6; z(5ko`y`owz1Ti^!CACTD(r}JmS$!_FJavX~iP|T0Um!=XqE1DrlU~)*UxvCsn(SYO zYSyN_+YHsAZF#pD=5A5Ti)e5tZLX1_`Uovf@1b9+1_%vt_0Tib9YT%cdgzy_kwn~k z551b2EVL|Xp;28uE%aKThn}To3iW@+C^ghvq36-BrdmuSJ=9X~6G_#zl=-)=TIQ-z zd-+P%;Emw*dM!(o+UiZxBuZ_yhDf5+Hb+5iQ#49{y|((Ch*x5{ak<(@#4FKXucM9= z@k;d9>#9;BUWxvCJ#|s2CPt~Rg6+yyVwKTAr4sQ<^w%4z458i_rID&F^gMt1HMaE7 zL^UH#dT3%gg#5#V6;*zg~lapFj}ki zLgP_uW9gx-+HUHht+{HXUvhuSR(H7GRynRJyGIV!ue3yIr(#KyDD9N_H{*8Zn5gAm zW!Cyg%)ZHcjdp5)&@|T=J=>BYN8M%0kYkRC^mf#5f}W$66LHlO^sCewp*+;uTVi%l zADd!!uvFc_oB=g=`?3s^^$wOO9aS7@5~ZUhN=I`P)U1Bh&3^J+5kG&qe~$aZD6Pql zJDRR{R2_*V=G7|C6!U7!ck^m<6x8yg9nI9QwnWKQ!%R_fEm3mKQBa#CGehCSMy@4F zCpFy^rIT7fBvCqFT$P}fE`qmVs zi{**e#T*4SXNR&V@9BSCRFcpWp%VQXOUyh~nKX%+XL;h~Sz_jyo_M83o@y&GZ}*-v zx~g2E;o3Q)o9Y=QyQjP9*?7+AVR|;&Jw4TJGV`s}Qlpo;M=0nkHLf*1H_sWpP0!79 z#&xFWrq|O)6^dUgZ>e#;DiWIIEH(P7CxwQ`#CvW~uSF@%)6akOygg^!tUed54N`x# zPbke*YTROa-j*5z)N#=sz*=rKJ$=s^15Hm~uV;{Dt@BkW`N`8aUuAYIU-^7BDYty( z^UW)d+N&0Ae}o{#Th)`Vz7cvYkmVVyP75_jsq487k7$G{A>FPFp+3$mPl1XTYU9iD z3{mMqg}x@9J5+zBkSDo`XQ-+pG{=?Yxl=V0dNZx6=PuQbNctP5Iul7p!^}M(P3m0U z!!WguhkNQTa64JfuG!gf3Kp&3BzO07>`UqtZaSxq5 zBUL;R_t42RN~IHV)vY|ERi@Aq*8%-LOAq&}dZbAY_nUuvKpJ^Xncp$}ev982HJ&u_ z8>5~hl5WSCqo8K>n{Dyi_!oZLWo9Vc-D8bXXt_%js{N)Yh2|)z9V3nJ4CnPibzbO+ z(9NC)l$KW>bF7LXl9<1;cb>s*6j2<1dyxMHi{lO8@63)ad3LcyjbAjm0in$6E9kjwT4s$56N0X z?4m=>%JX(yXD4&UV z(J@)GKVEcf)_kuD9+x%WmkJ&)j#kIbSaw0t3F1_hd$eRh(TQSI<;t|G;7Q^Nm5bL_ z1y2^YsCJQWZBNN*vs1)ZVQga#?qEmCqP8X}HvJjn7bh?ema3S4GJ@y-$F+q9S)+gS_x)w*^_73@^QO-wQAXcf0S*4y`1!oI zAfLYtneY{>ylt|0w z8j%lQd@XL7j>!H=>^*g^{ojdzkv3^gn2dErp#+{ahMQrC@FgYuv@K3CG|DaYJ)2l;%-Ez<6)sXA<*VbFqFuzvp>D8@eDu^#{ zy?VY@oOA6w>s8%y&x>`>D?PO~Tg!hjvv0}by&S4^uhipXT%W>H$@P|!M~yG-tu0J^ zX{_2g_bODhC+a1yt58>@YUS~tM#%R>i*c#fZm)CvqiaB3hgCGyVmlOjn(3A1liNyZ zZqLbEb-!ZenMYoqmzJDblHcaAqdtsPT#}l=a@vF$Vs3+ zxKa->hna_Sv{7&=x(r;Nu48}8OW-Or;YJfZwQJGwa(4;JUFBs$`iwCj0%0e~h0G37 zRIsGz5X&!HCB|TxBBt@T6wS<5<}7A}xeGJKj58hPe$0cJM=?)gp2fV7c_s5k<`iv6 ztR*V6r>3k2ZPaZd8nnxcw_r<~c%SRGx|S{size->;vL2JVqx*_uz!E&H^f3(SUgXB z4j%`+rKFsK+S<$RBZAsC1qX^vv|!mGu;1W2N_0S<4&7ck50SrG_FS>8CR^!y%J4#Q zJBYbYtNU&es|%@j)HW%7Tr}Yux#vKmWJ26a>B8^9^Op8$_tI%471}27>;hK{Y_C0v z2zx-!s7YzV+JjRL(hh&u+G`Kfb`vAyMh!<^y4y*Yj1O$3$me!j*Du*X*{3X9Ltip75~__Ag~JYA6XO^Aof z_Vv9luB$y1dey=seZ}xR0s7+Fb9}|_*w&s{_99<3>!q319CIbsYbl?GlI49B+Pif( z`j&P}1(%9=p``qKqqPK{>M#oMEe$lD_dq=Hg7RCNX+pMnvyguW&@AwG03iM{0Cw36 z(}e5=AsR}W{6c?hRK9`#DNT<2m$ag#Huq0xR-o0tmXO~81=V@+9S$t=>!0uGHhh05 z#1yUxzbDYpdZ_JB_zRf#wR?&!9JRV{d6FFRS7_t7-n9h2>p^WV2dD8h%CUN!|8pKu z6Ffef+1|>W#f&f;(4Uw3zt`lr-Nh~CmY>BfA7e|L=`eryV;-!|;xD_$e-!JJn8JrR zm|61bB0_#Wc^2D)KFJGNKSbByuNW%e`L+K_w%o}6yRiR_D)RI74FMqzuITmS8=9h3 z0x_{sO?x0N&hnjualXK}6ZAe)ABTRl+z#AJ2Twi0cQ46RrAfrKa{~_h@5lc8v1hZ8 zf2%P~;8=eUM}hLFX}lH{QUx^>6w(yt#>{3~1>BO>1Y2oca4XsX+<{AX;nLl?G=|br zw92N?3#bA5Flq;nqB*b}&HfiLuL3J+A?rJs_p#+E=5x%~IKmqg1>dGPeBNQpd$c$B z5giQ6$87nG&W8W@eALfOAtVFLAhU#7!K@K{jm&=rwye!;Vs60pO_(9JbTYSP?#SGg zX|RvU+>!hhw2V-1)W)^3yubD)*cStQumN}g`TT>AN;v4 zsJ%kV*RKw?*LQ$>)SKY(^@oGk)xQs3UK)S&T|s-61%0p3F=eYmzg)jM^!N2GKG{k- z^hG76PsSMr?=3mpC*zEQZpr0&#i?s;6LZ6lT0#Y|X*OaZuIt0C8Sqp0&I$RcIJsf|K zS2P@uS2V(wQRu76E?_-|(x=MCV0ou(oGla31?6wC76q@++U33iu0OMdsTXiRvK}tD z0=+*B&)MZ8Y`K6rRv_DFob?2BqI`4-S;H~#xbg|`nsQMnbp!Z#c?kTZTrZS9!(g~< z6s)Qk1J|pVD3oUuLCFSYh^YtB`xSq~;Jy{3;29NT;KGUt@YM>jq^v^&_)|p)443KP zl*(an)5?)0ub?ApN1=DFya0N%b_{yI%5mshYA2SIHF*pAv070iThCW?1x?g8K%ZH; zBJ{VlA?SsbEzrevdXbDAg>I-DhJK-P1bSNCDD=0L7eLRf8-uQ|ngFL)iQ<1(sHds{ zJg6#EEbF6#7gY^|4_1wWpHz*3HPsW~M%AK3*0TZJp*jTaU9E#}mkfiaRgbcL47{a! zyktbSIrK}_Z?UFQNm2R=eOK*c-2h!*vm)yd^z@n*);e@=O_cR8^uaYFtluark}Ss; z{KZsp167wS4~9z4tC04FD(Qc7HwYi*mUWW5GY@2*2f_!050mO8mj_Wg^#)3mY`K!u zW2-Dhm(;wyUM1~Rx6=BRbZ$v2GsZladEo37z`L2$^@uzp^FZd^%vHrUA}Q_=ABd^i zs@nS6XIhyr>^sf(jc+agu71;hp#Nb1Y5r0FRsQSz@A=CEO9$2r92$RkGEg9&1;|G$ zkRK~yA@)B(T7{};Em)_~GPD6LOB>O0xX&$*eSZUO3eU~p*$mIkX=R!Y?=5Im`Tq}7 zh*qZ=SV>!ObSte*ZPZ9JX&q{(b#Xszq7GV*w#FK}4Ix{m0*h#p1s7@`}9-iPS@ zh(3VmCZg|w=<^Ugj_8AkP8gHt6%pOO#6{qDrI&*Zh3%jY?oS z9n|OyDg)1=3RuntH9Ci?pw9(0I*)3=QK|#arzzkCG!?uEa|!!eP@_v|Ip~W)jV_}G z=u1HjclZ^dF9&}$?EY4Uz7o{vI$9O_dQhWVX?5t^K)eN}HKFeSHM*15hQ15L8#h`9 zdJNR)9%_Of2Q|8v)`z|i)aZWN0DO=(g5?2Fqlak|=!ZZJyUWd>p9eL1kv4~Z3DmIr z*aG~BLg1&=0{%p8peEYEpy&WA#WrBA=meJ%UEs1}TX25`5e8Qj-C&d09^6Rm2yP*E z2HVB1;5MQM>=HT{7Ey3}VSqb|esDmT;2vTgm=J?tN+iL(#h&0k!UhizX>ftq8$41B zfoF+*!OO({;ML*)@OCi_j)@WQaj^h=RvZexEDi@J#F5~;;%M+gaV+?mI3E03oCy9P zP6mG!r-FZe?R0QS?M!fG?QC#;?OZUVje;|^3&5?li@+}J60lpl4BT169)&*fuLFMO zZz7AnfVSu>Xq&!)w&^=)hkk%|=qKn+(blu5n|7mqO3@G!e*{!RV2`JeSK5tts> zHgIiVVZeVN$v!0S-)<#DOJwB>3f?RrTHJO|ZN6>Xmv6J`Wg5rNr)*^f3oG*d=GW!h ze9JCwt1tL!>Lll#BwlzDTYYJMyw{e^Xn|iPYLTR+DTUvj_*wYb_&Kx@`)o-oaZ|Ob zG@*ae_f&e9SWa6&CyG%j!Z>KaZ*6Twv4Vdcv9-TR?10}9{(Z$m{v*Xt{xgLUI8zMa zcTeCN@l}9N&^$fb)6;6&sklDW64!0JY2BW6sky~6bjO%$?3p%fXL@fBY?FC5P2$-E z&$LWtrW4WKn`m}A9@l&02ILIgmPtgn=OKRyMIAGlaLs14B^i$!8B53>N<^hwr{N4F zV>8lbJZ4zx(9qtx>2PkAX*<%}vh*RO-5m*M{q-o4bkkWZHtV-K5R3l2%JHX2?)T*=2UJJ7Gp;CXrF9cD8@5_p5_4nL(9y z$i+Ho%e9xd=~%TU(=wThJgzx1lrpx`6R|j-PUdD>$w9Wbbwe{l*=~YKFw=AkIPH^2 z#$&VfK|Y?-u$Ru#ZCA%#p^mgvrf-o-7<+RXvTb9qH$IdJD5qzFk5gJXFVblxR3}12 zWCQJGShgPLyqX^BdZ~Ydm!GgByI7A7mIo-fl#SKZy9Xw}w+6^NEw%7{iY2B*C}lRv-&}Q9B-A>Jp|XD{58=2OJ~j#R2$HV4 z1EojCd)D+-}o3v(F$-Q}uavxyt(A3jov&3}f)e2#iLX3=3 zlUikRSNt50EQ?zA-Avw+pL0~M4VSgOWkT%DY(wA1Vn!_FIF{L)hD9#YmU1Z& zs6B0F=Q0j*W_y3;R--rF-)~s6lLMS3OI|DI)OkD8HnVKr z{EL`QwmEOkctu^kb`otgSqw{$8H2ht&nt@PRzDU13j-Ew;k^9o-^xV0CbB9&-!T$4 z`XfKQT!6MStjP<}eSKzs8ZA9(vAWyj7GjL*ohUXe&o+P8=nLbn>*=xp4 z$1BZj!f3`2ASX1hYpk}?Z8x(Q$b%kp0ZS?AoUl*W+(-5n#whPE)Xm8nbThWZ%(&i9 zeL!aEjSPRty&CQy(%Eep&c!_0mWZ-gY_)Dw9V|;CNx6`1I1QV5H>(6MP1~joYe*UR z7Oz{;0kS#Cz769N2e|Xl1lig>6c+Zz6+rY!@PAZtC%4llE*ENu_k zIud?->9$NtiW2`g@%E$c~AX7${xYVG!TvUgD{|85s};}5?mTau}saJrXQ zob02GKD8s@EA%!9Wangg6T!3Jv&n~KJ1c)1%{_Qd(l$B6oA0ia8z$+5)2S5qQrrBf z;aWRz+nwK)cDnlJ>WO~CD+u$5^YS69KP?|><*Mgdb1vO8yBD7A=6D%*vgSwjEL$aQ zFXui3tE_6Qth)r+Ie9);b~fhe-=8{L+wgFQb4QYAY?9=vkHp>E^(D#92(`h3W>Tiw7KcW5YAYHP7&jktCbsm{yidUWu?0-VmpL zW@a@GAyyo#EE=5;%jjLXfTTR-lUn9-U?>{Dw^2aXT)A-~Oez$)(?|EhN z5P$5`Z3Ad6zF`@TJIeT_jS7%?YT}0kD`)p7CwwL*ig4?6AJwvKU6y<(F)?W}!tHr} zs3+5Q(+*oLX)1^1E2DE>Q*woJEpl1lcdWT)_jRU3(oz@fzS2ivnNjnFnWNH&@H;pHyB*Ma1biWh;9vQK%t zqYR5Lw>*uKDK*jZiZhcZuUt)3JF^MGT7j;2OvCod8m){{4=k9Z7t5P@?pi*_y06c%Sm(MWYj&pB4s(B*o?W|+*iA?f zgoFekAxKC_NJvN!MB)hI4uVKXkPvqwBKW;mRny%&s~!J{(ECljvtCubdR5ia^ZJuB z){i|TV5VBH!iCT?xBq-o?PI6fV`{21TlHz8T5dP}=1fPng+p*lxafnu@{W6i?;(9U z{DQes%_seom?Vz<=<|Q8?l&!89ffc?M(YP`IdOEAfGhJ6+~>%wsgohhYz27F<4Rp8 zxQWnBsb~kss6@^rzk3#innZ5|s9PNzj{eHSaYP~;d?q5n?g#rgrc=S+`z0XiA}VRv z#{KQQr+XRcvLAehS6_jBec177)%I|h`m)J{NI4=f&!q*-7Lb1q6Y^kB9+b@aq|QSj z)QI_ZjnE?csBZ#v^Ku&yP{Hvo=eWW7sk+*m$n0m6O~nx3%qi5@5Km{0^dM2-Q~|-L zRy>gjWQH{3?Rg9ns0NH+8l@}8&&>G1nhcCGMzXR|u#D8us#zet?S`}ijx;v`a`sqW zl2kXS2ozG2a$J9wN*fDtywNoT9eui!3atyqYhj@U~IR6hu1`KKVo#6bJDiKPObaL;xOtGNBVVzA6{+> zf~BC5iMkI&+fl)(8U6}J_!l0d(!(iBiSTZB2$FdZkiUQO;Yl*hppfIl1MF}S`4uv} zRY_aC6vQlR2Fa|3VK=?ReIIq`qPn91Y$_OjEKAcGF@8yrcxSK$+Gbj|o06n#f2JX`g z?PE>B%>iy=!q9E6gOc5Zu2LBVfAN*`P2=MY&rrcnld}1r(y0o2+~-sE`1axT7AV=u zsU;<@y?v?^_H=4dl}6|UYEu)q2iT!1pbzdz48flRw=6h+N_O7dI?;flF$JWc#1P%S&V(hP8V?X8j1zIE*(hC0C;%Ogr z1rkrN2Cxo)pa;z=I33ua>1!Q7-Iz zvM4c%`8b7+qhs(no=!ta{U_2Xbhvyddos%7XcDvJa{qHP)I`lXY;+(!k9=u|GP}_z z?WW=G8m`fBPl3QtgUeBasXB=<$amNE_agiO?nC^4M+0TC-$8q2ls@;Nuq(#emN;!G z&YHs_TI1rCGN?w^lhfh}4?S;zUc_79yC{ldzg(5BN=mGv`=`X%U03GDC;4K9-U z8>R{T4a-bh8@Hg#Ry^o7&~{zgX~XAeNzEzh&WK&ix@eUk@!*LXuob)<<{VT-+1L;e z8fD;rRq1tA%}urpOvaE4uWs6+*SBaHk{T@fsHfWj#^s}j>!H)xky~*>cD*?TbE~cmg8K!Mu|%#raBV!?0?#EwYZ<8 zqwu#c!4^vP+c9LFby&nZGJAmAgKDC5MOqO~FmmCGK1M0}zVWvB0T}0k9u~E2V#F1H zxi59jl{&^>u&y-4+cnsr6!(J?yI>ZA_Td4*X*!QQ@hfF@4Pe3AZvkrqZ?F%|Y-L#n zU%}>XvaijGjq@Sbt0S~KOatP)G=ASuP6}v7XO*&5P&2GiSh*KbE)rWqYQ{Y7VXvKy zagMMjdL@J0n+sR&RvW^5t7&h_@#?RCBJoj&TV4>Eug@U%0Tr6SD%w-i-1C7jr^4d` z&v+m-7aNDh6qRhz=5+>YzIU{;OX=}OYYoV#qPz`*5k>qt;0HUenWc>CBjv*VqO7q% z>oR|aO0ZF5I_HPi*58g<<5$FNR-g1}D^g3^LaYF<$yw6SdqGuvQ(<2J45<@;W>)L~ zllfOsUDA4D1NH0REWjrw(tY@xd(o2FDw#bgd?FTjJW(r+?!5&2=pyp8k2?A!^wBG6 zf!8?jQ)rTopkW##YhCOYVc!=_d>B4uQIkCYnZc&?{TOXnR}mq5S!j=4H#Dm<%e^a- zaw>|d5?eGBnGNv>Vo%PQ1+*-G`*_eR-o;mP)-9tn@#w?;d^jq`|87*6n1{ZKjgx=R z(j@*)4(+$*F7uCfTFP{|&jQQ?_kmn)kn0U{hah2{hYj+$L2fk2y#~48Aded48iU+ykT-LJ zpjZO+l3~ANkmm!ru!#p(Shi9w6_-;P9ynl%M|(~(V-4j~1VJuMi99awhf-i!`Jq&b zY;ZD}L~(8?<%rr~n&m@(DY#N}i*tE+IuARAMfRzq)Kb#ekd#}dM=i_RoKk%j2#8T8 z$+Gil>B^;9^zC1MnIGTiKX(k>LTE}@-k!IuipgNsss@Rxw2+%%IZEo5rF=|;_^N=MEJ*}-fW|SYi+T7fED3mpogP`Ik;%E zeoBh%+w*xFwB7HLw7>(-cH2_ir!^OtaFZ?#kOSirJVXpZTQZz{-pQcZ$KbL&x&sW7 z6XBp!R8T+RU=B}zD6TD@oq-cRhZE2Phw&xgPFgdWaU~#pr8#!maTtY-XZtgW!qPYL z?}v5VjOEBxSoYZWUs@1guqgY9Fw?-ph$*{Ey=0K5 zG7`?{a=Lhqxbq5jl8Kol+U#Up$a(TJ)?i`zRUV270!=%AX=Vtb&1L(HE`nF~i$2~T z`s~dK-P??3a6OAQr(_?b&ZvbFJWyN#h4L&G6v`{?bUsat zlFSpN>;gd?ECk1fvXjjum}ZH%(@FE<8_M^go5mw%$@ifRGi9n8>`>7|+gRGy236jX zDvb1JtiWY|89VD>tO*ndvtlOY6kFh<-Ip!E;-!u(6`+U&;lgi5+Ba(3ysXyS+{*RY zhKm&@JIbXI-t!w~G7;PF%5pAVx}IxG6Txyeq+>K;$e>u98)wpvp11*u^fjCAwih&Q zX8pl~rYO^1)yV) z;+!0CaySF?fIDmH5SpaJsqb)_06I>`(mKb{DIg97_axfr1Uib2r{h3OQCQ$`tO+nyYtl??AWXB${N z2e7#GQ9duL^%E&Slk$tS3tM031$?i-j|%*p=UU5@7jikNfTO@VO1PdDuCK_AG`X1~ zT}^Hy?Jn;i#4d^$6=DxXjEVaGa(wYD95Y-vzzCR3-!B8FnZ}qzgK0SCx>g3&|#sLbQ^}D2r4KUYp6Kb8BN&{|x zGRzRAjWw^gI^R_kDjUl2#hj>ABIFh+pU4m&vxQEdOWorKlVxzQ&597V;BwkzIZm@d zwTA=rB~~?fzw z*&WOc2Pmfxl%8my#;=fM1Ifby`ci;CmE3^}9mgVv_}bheize+2PQ&ju$Az+g;wEP~ z^V@=+EqZy2vbE~8&P=70Wtin=eZDHWisV|fX*U(weda#5D|2@r-E9rgjuvfG87r+R z?^PZhUbE-u*zg`}_L?3ZD}gNU)5e?~ze-KEHl{H#1znW_TP(hikad*u|plLurrQm)3S(h0jQnVMGtsNB)VS?s-&kZL;xz&c>;dkw5t59WsXIiVo*yms8 zqT+2s;{H(1WK=8S3rSOs8L7NOG}QnaRdPd0X_c54RoE<~U{@W1v5 zPzGq=rHBhSTQgdB>yS8GE3Ml10gLi%f4mZyjf_X-Kt?NV7gAV9vMi^RT8v**HdBoE zJDh3t7bDS%c%XN55i#C>g^FvR-$aOwbM=$=)O1fA#&yAp#9=5oDWVmPcgZZ8s#ap! zL0{s;oKzIkfPRxL&KvUf(VvfED=ubw6gr?*EZWOXtkQ^mjgg$hC=C=kuZToS0== zQ8`C(bKAQ^TJc9#)NwU=MJ8?nIg2gEfO^L$rUSf{#+;dwg%z{PC39pHE!F&K**#H7}gN>{MGd4~*=1W7fk$S5tlL`hQBz zrax9Y#G*ATvt37jCY#NgKZ1PoCSLGeiv!py5z9DW$}-jz#@Mr24_*=a=AuL2qi&2FwjIS_7GXxl;(Gx%UcnCVf=6eJG%E z=4NY(m16c47Ed7^HD<>U6@6^}k)?X`4=v59e#b2Qa_`=>Lr9)4>j|9_#h&wX<8Z*q zKKDC5Qs>*MW^g@>&nqu}^`r%O13tB$m0+-wBprAcx9*plZG2PO#Wi13_E76!7gxWR zb3ntJLymucZ5Q_hyi#8+BbiQKD?4C%@4ZWVmiOFiw|&;^;f;>%vvp5nI`7*skk4jQ zaGh|-TK@O2CU^Sj><`JBIKd`~8M@>feBKDu!J+|zJMg*rTYTOmI_c!KCy(UM-S_ru zFFN+tnJc{4FW%xPi#TzsS@(854>{$H=B_7IF;aYg+u?j(e^>RDP=n#J&w0H@~YE>R~j~vjUk~7H86?sCO)M z&XpP%A#@hGm*8;bD6PVC={|CM#|)mzkX)noPO`$b^~_a3*JX~+M?G^LDE&WPw^7wq z{Ws%p#E-+wkIEPZcMg5)n9;B9W2xix)QNh!*Uw{8=MZT4JPz2bNtSGUy?@~PnrIz> z_1Dn<*MIQ(4Nyx11QY`R00;oBa5Gkg)hqFvMgRbmm6xz50Th35WMYKY2Uyf~9LMqR z{|_7-n`0lyOfe_~R4_vD;A9+2Hi()t(=^S|!fa2qGMko}P0jXrY%khnmQ5QrZJO<} z-TQ%i=-cnUEvzN2G*w0wE zWyyh-Ej{cJ>}BkY><8>OY?f_Fp>4|yb}@T3dmH;XyPq8yU`a`UEpymq>^1Bi?C0!$ zHYd=M;y_#Gv&XYHu=lWg+27d0AWJ3$*>W^{GJ6mE1p7T}J8U`BVTq4Do;{oGXLquW zU`yhIZSjAyZEPQVE_)aIIQttL8e&UXh$Z!GAA2r)ANvfupAB}}GRA316}yx@mA##P zgx$;j#vT}I$+%FyANFweV)i=rN%mFt4>mlE&l$$&WEZh3*^TV2><)G}8yId$Y&f5X zt!Edoee4$YUUnDz856b}PG^ z-OENqS&|ZEOEWu_UCFLy?`5B2zh|vzTSi4&GM=5wE@wBgx3KTBU$Ut&mgL6R(!tJR z*RWTxJJ@$wm&=k2mo4>d54(!JoPCaclMRTqBqo-hoAt5Bu&1-Pu@AAIus^UP;w&kO z4#jc@E_>94a0(;xJDcT_zqhVmZAEo3IW2p7F8^d$AvZmE*;Y0#suP7UDEqj@$5L zWe3;n5DyyhI=vTmRfoh@b#kmzJZQvnPp7QHCLGAIu~l6h?-CChF^QgmW3dKTRds)J zyjwhI#Bxu!timR2L%*j-Zma5%pYbPxygd?*B>23OrPC`sCd+znFTal|vdKF|9z?%) zsyv6+z0>4F?Bjj^|Cl8|dS`RqY|fh_NfYPDp9rmy>M;rFNp+j;Dr>)ynqTI@wk0lRfwr`|%eXbv}te98!>l z15tnylw%?~F%`3MWS#J6kR^4ET(e15)-}my^w%}ZXLXZggim<1N|CQs%JF|`O`A0P z+N2i?eC@Jy;J7U(`FFq1mcV*j4#MdA!PiQ8?m;bVM07)- zD;&+?;zAm7QH)A7p#u*zN62ck*n*ONK#vhq+`7|Me^E& zM=GzSN)gK8L(9PH!+3vvm=vKLJ`BE|#-EWinbDRe3voQoz*=m;7Tkl!upPUw2j5~p zV%vpBI)7%=LZRxmY`JUKZEN;#yf;E6abaY(9TewtUr*Edia`5{0wc zvn7RH!RtBfXjGscU6|H+fZUJAupPVbey8vl&g;YFCj@s5=bxkD63e=~Mo0llu)A@D zRI$zI>=GV1e5M?}*Bm}mj{h@_JOTqp%7LoM1d9Sd+APR9kf5}R?`1lIVZlA{mP^x)$x2js-Xlr^CbX zMr`JJPw!}c=F##9`#c7}hcU9VcZ}@9`@N)$m^cza`-U#`Z)QqcO3to8YfXx#z_itFd7x8M;B&c5&Ccz)?p*IVjKFg1AFilVyFK5 zztihzVK;wHog+8;pTF$i-v-u}Wz!gONT68!B|L%!s`C({+5xBW{!j@TYA3=ZWT-Mwc61 zq1uHB#&M6)l}1+??KQ49QT==&s8;PnjnTEn_fcoGPqhp6#_JW6OcB0ehF4Zn{t9GNu=*hSljC=v1DMznor%TJ?>|}{kHHdkeh8Kt*IR#P^m5fC5Gza!~0d0vTCbd>-7 zhhjAyQG$7UG)1eR_(?msx4fqIvAH3eYtVH^{Nwah4J~WRPDwF)fTRTzWzq&^RJfNq4r`E z9jD%ZjcPBhrQ_A{>r}_%desixpn4>3q!avYW3y@(wy1XCCelk&TU0x6 zyJQV@B<@fhj5}3_;4am}aJT9VY%_n(zt`yd_{5^Sq|ojn`FMc*A)Ao5uTh8Sj6~xZgXHKhyEhdcV=XsCM92)x!KPrIM;X z{~xNI_|xdWR68KnKV1r&9;Sb;7oggSK%;|xZh2M3`zP!i|nF zI@0JU)d`4J-G>;fNYd5)T&iuvs*XXN>SV+l=O-BFCmQD`>GK7~`EKL<6yy9<f7-4jd(IbsM(CB|$qw|bD$moMr z#~@#|Fr(-U^?ems)@m#DTePPG$<7+q@g zp{iq0rn(K|=`3~sa@FyuP;Fy^Y9~BKR~lWVIu%~k(=kzXA*!vSp^ik2Y8$nxV^F6$ z89vqVs5j1UP@RfK)rEg(GVb4OoIlC9e~WSdR^$F{#`*2W{X2~NcUqOA@86}`Mz`t& z^ccUN$;S8JYxESOry4!Y=);VjZuAVJXBs`r=-H|rn4`Lxnaj_Yt$zL^RNI)RIsx;I z<43A?V4-onqm1`2GOoASDiwYFXw^xZWzO zTJ-f+|ILV*fJ3>3aeNqtVeDCk@F{y`OH`75$&y`MDTBe-Ml+*Ok`l6&irgY(yF>|X zN=hXaZjmjiZc=}@O;?CQ-P7oHkE8oM*Yo_(`~ALi{_i>Ond6%ez_33Z;S7iu0PRQm z4*-VOlZo^nMEDTGhY`*~I2*}-1nJL#m;m%E#D+jeA;yD{3(mh1RDT}CM4;mc=ObKz za3RE^Kqrv?B7}<(EDk0SnY4x2gt zj}Qw0O#p`dlYrs%e@5n?Lgt@F=AS|4{|fur&0K#!2VmIG2^jWs0fznD5Q_p4kbFEy zK3<3wfcQ8q=j7uD4Esq43m_~A@d6+rq+b~67eV?(5f(#u0bsa3aim`YVM&CgAQl56 zL%a+~8W}Hx@Ir)T5tc((9$7Dj^eaG209pjGCeUJtJvnE231CTZZ4B-y0$vKe-z#yh z|G|HpK*|uW22z2T2&9Uz8p7%bFF|-I!pjiWKv)xDErhipCIIO`tPR3)z{{ZebRk|1 zv;txwAU%kQK>7%;M0gd#s}VLpcn!ja2(Lxh2x0<|F~kNSn1J6$4X8d-h>1XE5EFpR zA(jNPMEq9Bcx#B2fowQ!=8U(6SOCZlFzkP~hgbs00h!McVo@L`Wc|*_dR!n@0CGd} zxg+^DAo)Cye4a=?FHYw<`8EQE{oV*~f_MSYW~AQ-VG6>&fZ_G}A^rXcQxOh8I1tGf zg!I!84n{Zx;ZTIbAl3p32doM0CmrH2pa_U5Ah0+kaaz#(%~ps>K-(Zb0~8H$6VQKl zi2XVKtAD;(iuMgr%pjB+1aWDXJ&5zGI-^mC>V;~bYd$^c^XbxmCyPkgyRv=mf ztz+|)r!9zfK=y2&_HqEx5y**sZj-=SO$O(2A2@>pI2CY$#K|gPj}2r7Iq^6iG9Hh| zag!H=7Edk$EeE-X3y%{aIS_Df zy?sDyzRAad2j{Y>09+s51SWqrb5UHgcID>Hp>#h=C{qhzZJaNKN%O-osLTj@IFpJC zqA-JSbV?*E2uJ&I*M-HPQo`7MzO-;0ok0r(!H*sqO7&yW=;1gjgF$ED0%)OBCT=Sw zG!g`Q#J3(MjzwqUA}9<>7?nk3Fu$dY3}xZ`LTS`+7N9L)EDIMxjmCe?{s`SuOTHi? zW}1|`O>pm#N{LBdC!=PbPLTsHxT_9DoQ0QJ8i&gJqs-GSg>=g5Ydg8$emQ$DZI4a% zLrdR;OSZkdR`xr?i5u-sJ-jPiAIuWCsXpVX^h(+|SN)TNq%dPruCzSt)+EdNif_d`BNE=40^kN{*$Yi*Nh&{qJVXZo6^Glzk@5?ib0Qz0LcWQWc9nQW3P)AHpXgdJ!?q2x;;bFycKv&?p( z;OOJDR6e`RqxOGs>4LKfENRqG|9N&BjK_iCbBJ%W#5Vq!THq3z97jWml7E%2D*qFX zHrt{Iw;h#jrM=G0K?f9}I> z5$w<3Vm~^o>$YeF*yj9tjyFxVX^=18)fT0V7oJx*j~C)Vv|_F zrN<)NoTPTgy`8={+ya<;-Z6s|Wdc&qvhDCb!1he6$D)@R6rG<_qjfArd9xxP?TqOy ziHn%rg{yyuhZ_b~j!8jwXdlo-_ppLyNgG>@p|U@FR;U#1fshO+R_0`ZsA9ms0 z?%o@M7XCEWf9%2@GUl@Z$KAL^FOH{ZNyWC+j^m#y2JL8mZ%u|jq*MdIE=k$k?r-#)843BLeO?xpd_fZ^p(Jer;bYmMB*%igN`eY@I zWPaBOzwk7n(MmgOkL1wKI(cz}1pclCb~JzHoGO@TlD!MDBYDj8N_U2abqC|tE=@W} z+OX}-foM(LAvH0*Cv1P zBgcIA5cZd3a+VKiTK1y5%b~5d)Zx{S_{BReuVy&i-tBJO*V!cr+~{u3%agbmixf9# z*W5(*p6n$>8hM4Q6R8g(F5vB}-nGF>N9+*EstlLfyg`1XLBXAi|RM@i?3 ziq~H=JpAXA-_{=`skDb$S_`^H+b60d-sbof|Ig~JsPo+?F*nL3vVVVoT64s6ZEMGgnSyWzH}~sfW)@5Hw`rxVG5dJ z$}{3_z7_RvMAkl~;FFW5YNYpuF>*LLC513uI6?MM%DW*ir{Bj_b*fmL&qBO%w_Q`alZGV4sv~+LXF8vE?-2=|y29`YRn$UU1v0(o+5AGmR)~>fsg6T1xr=+fT zRvCE=ai!RZg6M260Dr!K=H(pzFa=Ws=ZANO<8Zc5KWy3lz9@J7oCnf# z$Fnd;-_HvIPh87y3!JcT5eluylP|LRN*m4HWEz<|A$vV!?)Z~fP5;SN$#Lo3JM>J+ z9ww$a5>^lE;#OYRzr6nIvq@EL7MB~7%79H@!FC_a#MM^?u?&ygZYz)^iYlGyuDn9q zXFPNBGP8f>m64+u4{{dSzBFB|B;i-@*d8m5&fVMfKG$v`RlaOa%Jt~HBi*&iKKE5p z|D5rlm`|zt9_wO0*Zw6MG!We*Sy+@FY#^9qyxD1pu+pmhrV$AoTSq!AoW-0sSuR#D zQCR8M{fnT-)~qt(GyB5r6Ql7vg8vv%aUhW|z1)9nH@B#9%uhJZSav*rAML>L=)7kw z)vpI@&*eP2l5lHB&*#nsikx`&IiF5C5qvr)G?pme7icuteu?jesZ}oZ%l#^2;V7>o z##tOG8=9K7&K=Lf#?&?V_D7d>5;=&C;pY^iN*3>;%1NEHNIWT9_Nmk^Y3}%w*n7Lt zR|S8I_ip1T)z=9U9l^`hO;v|{4H)C?AKTUvRh=&S&wGOGEMXr$|GM~owya^mj zIsNp=P75V*xzMbf01bTs@D2GhYlb)$9ru5DW@i5g|EYJ3k5a)0{cl8%4ma3+^c?Q~ zrE<(j!bSjmGyc@-h;8)i{Dp(@SCpy2B`><-8jFdiMdY3xZdH9tpK2<_M{W@N@jdm^ z1gV%ng7x?`4!KUDP;?rkJkAkwBc%8rhz0PaGU{Jo<1^$1v zw`O!<72f8CZ}c*^s+=#sJHAb#rr-W|VD{tR0LX;<*I*f}$i^7unQ|TT6D}U4 z9K3&aL~K}Ee9Kxys%opGLfnqptelvXk{fo@gSh8) zWI_&k$m}4nr)!>i792WF{?38ZiZ87kIGr=3nVjoB=Gu%QW5WgMOc5ivPtVM z&P_++DpM<%+;~1Wzr*7^a+5cxdibd6liK_c5e&uEJcbnOok6L{z% z{^n-P=4PI;>i2P94rH`_x-q7e@Mz_+PG0u+Eb2?Zgrwh3jEgtbjemc(DC~Q#mer(7 zSRR(YPw;IyIrq(P;IWCkl%p9gV{tC~%UegZ$-i4Dc>KEV@ravS8}rs?3*7KiF~LI< z#@ED<4D%NM1=FIrEeKX?_{uOVFf%kbmJ3U`~bxEC`RH@6bmDNy4<6O8=) z?nSQ1tpV1I!|y`cPT_y`Ii&YCt$!>i`D*9+(v&A$!uC`qlM+aEVNqC-^ZYSb;gqEO z`T$kFkeE{yE99HkUU_T&TE+T=;+r(@Uk8ruDG-`{d;ht;9$WRP!BDMNx%9+f;8%Ww zF?RnQXaB z6%{v@FWopsoPAY6jE8iv5<+jk!sBbNsx68&-bomS}c(@Eks47v`JDZDqX1%MN#Vh-}Da?Q}^kid1lUgzH`3i zeCM2h5S08+D7f<`TKW_{DYKO`?3dLftDCLAW#yI3HVuCtZR{+)ES8^_lJ zWlxaGmceARZ8xYG9q*X~OVj)R*g?eYzM44|*ej8ZMJry;Q_G-j?Y!Zm_Vv_SYQPuU z_c!LnPn& zn~r{@B2L)Ugt5sYEJ+ScC}t)PvFpno6O7kWuMZDDD~^__yooxz-=!7_hIbZG2xzFjn==i2O$;Pubu44bjHww!y>Wp~*`^T)h z$+iK4B zj|VY*89}xz8e6fqM1=h!P_b8TK!D&ZX#r^Zo9+}!}Cxb)O z;KYC};8GzT#v0<${aFxqoQ{|1OA4PYy3RGYs-CdwXnWBTRVcm6_VD8N<3rb;GnTw} zp-qB~*%Bn~!2wmLj!T@8k z*w36|W@uz+K(Vm!HMKCIQVf4AjLc0fOd+ZnWMOVdHS;y3nok!W9_!=;UYhzC_>f(Ei0~V3co*=F*@Sn@C%l6wF#P!khLS%p`Wa#LbHYgS z2gW~BW&DFG)UhN-I+cIR=CNsf49*oi9K-lA7$}rf0sn3*DinoMPf8~RGTW^pw)ja+ zOYKY<6ZfF=1Qdp_e87OsjeslC(+;7~QmC8rf3IklKIw2MxL`__XT&jyAi|i|&5QrRszOdX@6**<_*C=w6qX-_>xW1Nt-9NVx+H~aeR&YYyJ2j5(9Zhe zoK5lz;h4=ApVfaSS9M!Z?b4`@;>M$wjMT}IFG#T34>TUwzMgB@&Z=EpYu#sE?wqdj! zB0N^(@!;1is({OdSfYVugit<%898369u^s->2Qee@YH`vE8^)y76BS`I9fl>pc>nF3+$g`lC8L&YddDU@1$U-!ta5W5`vzSZ#!>%t|VBsPl( z!8hILPFX+4;S{hlxb$IlYsgBQgZh!bb?8>FlEAuhAS#{0pa(;uRno|{=>YJbP)+~i zv?zx&pVxo7=?u*;ABCB4}6yo%_@n zS@L9cr)1um!lz8s@iy6V2UsLC%x3=VdvR6;^X|GozT){=q7H1@ryo16creuHIU$N%uTzull^I1bDr0+=7G4Y`J z4#uAWQ|EoF#K`ASzV+E{l}t`Bi6$9$3*vx>uW;byLtI3|gLC}@sCFsTptLHlX7&tR z-tJU#%(;zHqZ(K=y1#%coGb+S^XZ99VDs5$#?oh*Pe@708aH>cN{hx29(#0G9cSvD z1QvgKR5-pedG&@=8gk9s_;N3@A;lw9)Q1-@faJB!$JlLeOdZ2#EaP7);Gq#oux`L1 z=BORC_ix%!8PcddQ}^WP=o=F$6NHpw^JDz#qXHd0$Hbrb7=AY-umDiOQH4 z%3dL3J`odp?Fw%F(Wy*X5RGa_p~`dJ+g38q5Yk_7yVl}+UPFQg0-Powxev&H5e0wC zzv(6c6W(L*JNx9Gwomw$DR;nxsU<-HoD9OrugGPV%Z?0i7FQi!l;k~E-Le9&&+fwN zUy}gBg(r2B8<#R_^*aM3{zNh~>L_iHl=tQ#DQS99s`HWn%XJ$Dd~ z5JhUM`*MZhd4|rtt6HtN=zmRW2Ni$Imq=2?W-~;#bC=FZ1lYA+A6|3MU2KZ`lZNfB z9UhV}FzOFee({dt1z`Lj;lgFpTw8KnZW8%$Rl*-Xf$1#KYR7vKg-6)lyyjU(> z@ZFTqY%T2?%lw|C8IBy02o&7l5u!TNZzLyWbF-m=Ihx zyzWA-L=<5jMX&q4z z(2sC_uyzQ0{DI1-oVb5kSSpAn!br*%U9?B+Up4_B-^D6(?`~S<8Je@YzJ|;)H~Ywi`y&EcNcPfcdiX-mMV02oN}I+wM~DeG zuN)~H4&(=h7a63Xh(g9Ke_9=vodGvl`+zZ&VhImm&NV$U;|)7n1hWQ zZ&^D;$^`RqB{hGt<5?ubQcX?)HeOw}Qf-clkNvqX9}k8u$SoU_c4sjuEZ8Z(@5X-r zW+XyaE!}Zbcp*{E+_&x|+Z@|FN7gto$!K?@amct^xVBWK0Z<8(ot?=c+wGE$=5MXFPwy0?94U0sY&M(T?*KES_25fm zTXzzwrY;9<`@Tl z0@>V6;DCdxWsKD|QHTIz+R;3Rji$#~hDm*7Xm8axF2*{IU8}5YsdHeY#KChBesLQt zBlhH_?s@$VKPEjf7I=LM8xoFC0AxU$zsY&bGulMFAQSYyRV8$;7~?D$t)k*-(QRPH z?$q2lvTi1Si5%X1D{AiaOTA*!NC!=%|8Sb}F_7r}vrA68cCRftzmeEq-Jw_~Mz}&$ z0h}p`c9mSfEMX>*sxJ3?qU#f@2-7p4Op0jDKM>piIu#N=#6T!xSL`70{Z^%O{@eV^ z*aL}IO)B3ieGsSE)J@Q+VU63?#(`n1d-hMy8p*eRN?0Ld|L&IeIWb^0+{Nu9YBOp*KqsqeFtL+PlB9$%IDPRAQ5P9{3rCg5x06^OhADwg}A+1B;Pf)62p3q%ut&9XI}#{pNB_zbT6DkH32d(Y>k#UG_b=z_MBgH z#I?XSzTqTa^|pV{oydb7v^MzPIb%1aM-^+48x60Qh^N|45Zj z=t5%gs%;eVXX(0$DCh@FF!@~6$2?$vvf`rhyjy23I!2CgFMoP@MO0OfJ??N3o z2{yON!j_x@Us z=>3T|w~Fh+2f(SRPLIC5{+2?l>aSOL9Jx$_U0gbgHx^evxl;>KXc<(0X6dJj{`iBW zlGnAwf3>{q$8ip9v8|mQf4u^Xg`Pn!OEFcHM!uXzeL zPRbH&Vsg?nTUO+apLSQ68DD>L)Dnfx)w*Q*?_ld#9o^{8h|!8q{uPRp&HS;pGnE;8 z9!&XejeAz*>T0A@SI|6vs3UgTue69KeGlIme+GPl&6Tn?-G?^GA%DkQe_3GnGhT8q zid7ux0>1PmER&MCTI^8xIJE1p17{u}9| zir}K$Mq+s~_u;!@C>disv*5UWngetKr{kujddF(`DV$lgSM*%eh_*;tN&ovj)A z_*ly=_42yy`V$~-5Qoq9=TbNu;L#cWZ1~*`qgpPMhwKJkPcP_dn%eS`RMofnRdBZQ zsb6Zrjb@rF1jZi#UcP2y`VaTGg2f>q_cH9TJbp6_=W-=tlG>1%1 z_`sP*zr>L;XyuB33~=pu(6WlR6&%4QEz^$vdl8TEOBBzdvi-*LjtgjYf9$*yUu zBdPeq?NDAVx-smRI>;P|<;oK+9d+BnbfDs2g+uo1!~P^^G^z^%>ItpCQZaGweO!zA zBFs#^X^CL#}@J5(#}$MiGm1zK6v{D zfaT@P7cz&UiDeXr@*_J~LlR-6vP^athSN``e~rw4zdT?Qd*@+-{@?B~l8}jau9|ao z7MN1GnB1X6bcStI&!JhHZl|r0MDxUErh0C6Kj0SjoZ5Y3Io&RE@e;4#+nQuCPCVMu zU24lg|KY9=Up8E-&?+;+^}pJ#Gq{Z+3a^#3e3EXZyOU0`tZGZPEGt$*TnKg`xFsR6 z+xpCJ=btlhpi@tXhhE(N zQt0NLU$$L$(-k`mo>hvzKWE$L)>ViPvu~L8Tdw<-p z`swg4FIQ-;Tz$|!2k~!T_SpA;aiQJy@m;4vzYiUK*+;)8-|V^Jhc8|}=z^wo(`#FQ ztM*Yx^BQ{p{LV{GYYlG*0cf`lfKU+H3mKN_N9z)J|9=V%8w78^4lxk*NbjCRmt+OJgP5izWtWn z$hxoZzW27Cv-)mHTy$s4~Q1YtQZOJ?8eC zetml0CMWv{A)&O#%{EHJZT2^#>Y;bTj9tuYHKcUDOOBGD3;yAJX~NCek+~Wu)pl#3 zGy!zb9gr=W%7Gf7HTJt!_DAbQ{^1EUqw3)TNEnJO9aK$PW%OKsgVvCcizvkJBEYDR z)9NXVRL03@aWH0YMBP&uEpr`=ruk0B0tcgO$l*uxN{2*tJ11io2V?Hu4jZ{KheXG? zLn3n&lF%4qLO(^BhCyZ!Kz>c8%##PLP4&XYL<-#!*V3*A~N(1 z+(en{N8Gx^wA@CE8xUMy6+=cV>my=H#M&$gO-OL$dQIfI8U8J(`VmxhlQzKN$aGG& zq%3Y2ahr3~adWdUw~Vxn1=kX5+{|Ja*yI9>t0QjH(&@N=jay@G8T2~}E)H;IN9n|L z%E?BDa(1RI=7@O0Md~UeZXjzh!(lC6PWw9KN-T@HmU6>PM*)bpIT%UGFc}u8jsM+? zk`L`nDPZ6c()S2l-hr~WeTc$MjheS41x!RUl-u3NMM$cdJ&8!HQ1$`VJ(8C(T_h(R zT}x(6ZY~jjos76iy?3=@Au77Dsjbdn=<+c)*GTe~z|e&!=qDB$XW_F>;bQ-ua5)^D z3WX@dIxRC(X-SqzUXp#p@1EejfP|!{;1&&Y@2T4aJkTL8Lb}Xoq0v_DX)yow-FVPo zX5EC1p?qn8OP70%3f=0g+lUBsop2ZbOiuj1E{Pw1RsMp`BOY%t>;=mF@*zC^9@SI+ z)njd$D#Gvl*$TVx2)L%U)4nuoR!HnWS9xnZG*%dDP!R0WxtcA-3aJhpodr?}B zW`B}nVO5S6C6<)4S*zDYyd)#B;5^EVEv$E#`6#m#DP6#PCSkJ7t!iY@O>{PIYZ3%TLkxrEqV8sW1mOY{%&IKH zvR1X0bVZsh4_paQ;HxyCl=<<$JOA=pAzm1NgCJ_U2XrI@jQbgE`~VxBl?|{|&E=q< zu!+-{YKjBmZA0KeB%;BnWgl~#dsdYWaGYnG;O1=!!A&nDLD)Zs3G2|4;^sJyD5hO_ zs0G=>G+0uErMPLSJI_blUGy=Po?cBSyShYpgqOaBdH!sv`HZtxdjWY z*~&KZRY(^o3?1hRoK|kPmc(V|kdf zI!4Q&=z|S}0z(SI1$G?3Gs_R`9-FAa&?&nB8?s4J_e2&#(m@3y=AO_A1**=X005gp zXqrS%W+yV3<`)Gnez(73tt9$@yc3FHXFMmMY43~TPs!(rMzMP+sP>y;bm1Hsx z#+(;RKd)8IGGPgA`rka4!Y#fjzg6}5;8wqo<^zQ2%d{HO07|?-4$E?y$gDy9GVuVf zil`Ftsca_ppf#>tTttO^X=y!wQA#BP=8^=UhPAWyd1kv$XJ$*6QkgW$%v1=xRWR1{oC*fP#eQk$?ecT07i24ZhrF z>nJ6gz@#-m2O9$=(p?X>TQ#e{9LM?yRXC);Qi9f4bSh)h!Msh!X4$lV(P7ikZlv3T zWEPq%MmH)S+qt+bzwo-HOI&N@Z@PsoUHSMv-Y`P-*9bQ*A4OFtQj&78__DEas3! z;dT>HDo_z@JJ1dpH&a7@n-*@g7IlzB(axgTX|X%*m`#lksg^qE&cyH&mcF7BzRUIk zj!cHyf?_ZmA+!^rZyt(SFVbCvWR}{0@k^~V5jygJBUFQN zmri#?JWWx=lYf6St)o;PM%6&)LDRzapt5mlFzbbS3ylde6!FS3bvDv|$E<5X6Za8> z`vihz2KAKZxGxk%Pbe6LGVWuz_dW-dx&zZeNi)nrMNzjYH2aOV3q1wuHdqGCHc{90 zm#E7)vq1~Ag9meeE2=F>r*JNSSeK1?B-Y|VMyu^f@$*zD=#;lYCa!DI2$BfD2;&CA zcm!cQ+KF`MA^BcZZCBC*!mLxkau6mXE>K9x97#?R9jMtr@d=t)#&=5KTVUQOm#vUk zvXWp$)RrjlmOz$>Db0Bt_}NH|x`xLf>Z2f4a7uLuDIbr24Hc!D)#VvdnubZhi|VqC zV3>*d6%)os@8yOJzZDQ>C`x&}{8TLiIb_F6t)pBjMP)0sIM7hNS5dv+C{A^Y_BYu4 zP_u2`TeSIlyG<)yh`%}FFF^c3+m5^(xw(z`TD=2%JOp^ox+lV2&fEyPzk6&28h&)2V#mni~^vjkT4nmB}H0Ygj?ajiy)w85b*K{oU?4twQj`k zu}2XeqFch;E~gO^_7Vrw9J4F~Ov8vL;Ac^7Vwl_!6-{`IawwSj7OX|C;Cw?lW=zR3 zG>l%vUxadRDH_sBx*ZH@1P=-F=)W19c`ODmPXKj)uYfvtI)R+a*iHxWRt?QVqzB0_ zM2H(ggIQq?W*Zu2`v5{sha&EYpy^N(qL50YJ3XvW*15;Aeq1q8m!frMl9<|*njL{Sf>kul#DFRzm z#4c7L8qBRC5e3{Uoyc`~LoJ<#8)w@MrF1@jZd}S6!oby3wHk8iM)OGxH*gz`@vj-~ z62*_FO}Y4$HbmeXhsR*SlZaXL0CyFIFb%b>RU#?U=3eXNxI*3v z_ybj(S}+^IlwVX*^{?xvB05*iuz4h%pT~x!qrIdRmd_azof6T=c0Qu(BM|$z*Tdg` zNJD%d==ig!fQ7q}k2vnKe04IbLx8C88XPE}1W;5g{Pk$L$)QTtis&{}AT~jTV?IL3 z07{@GNM=h^bXM8u(RQFaLsIU-lG5;sg$M1d0}!qSFijz#wgigLK@sL42-F;)THO;V zyo(hRp#qhKex?RNnKlUFdP>VqB8Q`Y!r|Tj3r|&npfo(4&RyQ4AB8AnE?06pZz<4{ zB#kpW{gg9&s33Hqf`E1<`T{i7gUHTuB!h~H zyd#p?4e5^Bw08`_?NF08Y6Ik6~aNj8sAU-_V4 zfrI`$Ayx1sBg^%KESq}bKZ}GoVVI@6axSN006simwLGYDgwK3x2CxPaRL*pa5Gjrp0r=TRsaA1 z+yDR=005WpQ34r%yjlyKlv5P{9y8y}?rdcr%~pC$*4AfcciT!KN~DKpDxyV%qFA54 zsnF~sj}R(}A`*opNn3`DVcMlgkf@EM+9K88^u@mbqSQ$Ep_|hh-5wYJ zT@f81M4Fxwl?YKl5gmx4lgxOIA}eLte!Aj-Wkp$JO=`&~y5?C7Msy`SmbFvkV_7FP zK+j-**DMBmss=s9W3vqJ#B3J(WwCgwB5Nb2Yp5b>%WA_EnJv^VQbY%_+Qo`2D%3`) z4!lT4*Pg*HVkN;6h+?|C89rJIz}v_V6fm;@9)!|iunsLSAqKr6d{;z z{`G&ZSpS!1nz#T>V4WBt>cVi;T<0Et1}Bc)0c%4d2-plZHbpT%rHN)M-xnW` zV*qbDT{=s&!p>UTmSCc=(xA2B1K$OjeF7$_g|7JuG$YxPS~J;-T3<4MLajg9n%c(6 z=G4{*bz6t&WX?Vb^P!>b)4{f1v3(%hE@j(o*mhgCZByIOmpq7_ln5uHpKYKM;@FAj z!%}>dv5#{0QNcdiv5!j6M|<`W6Fx*g+Y~;^qz}x`F7Oe+{J5}Pb1gI33}7Q1?~C&d znYkH4a85?X+H1u@C*BW#7^gq(E1xp}=~LhVJ1pp&3dAU^4-Eo2z8q&Du*LRiw9A~+ zp(%fNM^SKe4720Q_mu_mea;{dzw39Zpegjnj*gE44~15~Rp7VJz#;Ds(FF3X8f@(| zG35}(Xbj^lU{s*U9*mx#%qab~))^`hS z9Lnk8VkhMr30(K_b8y94Me!jxRwIF1psa-@2xkn=%ejCA4ErXe&qG?Qjb30U2knq* zUT`!tMy^#3)P6vP0_BCV63f9&?-m-c5zohL1e{?Y2slIG86S$0_%N&)GmV};{s3lS zfV|~n!KTr0v^d&-gw?w7J~n*Grd(pE?QcLS#tpLwK{I)ws4`*Vqr-Tshm-q*vf;Ld zaFWfjU(`sTD7@EV;K#lQC~Pn00+uAG%1BgWFPNam(3N1( zSSzrL#x6l)$bg7L?%)+1A}B9G?HCOdX&*!$hqYQ<91e$ni){y^sHwz*<5Kivgrm%k z#Do>-whOIg$8mWU81^V=tI-GQMC-HLUbTyC{dQ3&I?yc3hfItHVSEfu`#m`JW;C(h zcx-4x+5N({9&@pMnb$i>vF3*99y~f-`mb$ad~8S+Vdkbnkl0=hLZ$p4%vquK08cQ6 zakm5)OQ+O-y6KGQ)kXqEboQ0!3x+i9E6{it-Hhc0li(A+muDXd6!i84y;;!56ZB!h zv7P`4w6(_jNcs$qWw|F<0R%3)p1ka8aOB8l!ibg}keZ_YM7Blp6eNq1eMQp`BbjU@uxnX=1JOEH()ufgtti6|tU`E!Kgl;Hr=eCr=m6AQ9MUq8TiNr;6rG(VUe& z&NG0;iN260`YN1gWI)8w#SC4I5Hdm(U1vDgU`$5hT5OyN__VJh`g(fa08eKu-jgPJ z=i?!N_})mIk2j*do8W=xMu=@6)J*2=DPEGsX)JG!x=)aN8-2A#c~=vA3$NQrxLSlKUmL&jUMmCrfmx(z)wdWl;N)0P2AG3 zKFpvE=G=it%#N6IC$#Q~kOMJtx(Sa9;UN@%$NSA#v&=G`nRtxh#Y(rugy-jLk*>fJ z-Com+Ahib29Xdc+B*zH#c(#5;^eptJ>h4D_>vC#frciE8Ga zXnN$9RTz8iRdd|#s)aXh{* za@*cW`?YDb7w=c(#p{4!%w%j*rT0zZO~O91j|_KZhP$@*XX$z~b>)ddhPyJ8Spo*i zTuc(BW-?lE*#gSketslT&UJ)yMVY&B>~W(}J1cQt6bT7!sV;8wK;5y!wZwFVK#!0l=c zB94LE)EYz_15?!+L>vRRs5OW<24<)=h&W!X!+2t{F2wmFTX%Zfb0$uxT#|Rnb;a-O zTGy%>Gu4_woODW^voGO?h10t|r+3MG&XUwUNXZ3`svJnx+I5eA8V7MaD|e~$NE`#R zl-h-y8u{Jz?V#CW2hH&YaIXyeK1t0*O75@Osr@xa?k`c#&cU~Twd>ivUQL4gZ)QE4 zn;qqPc3&pSyLnC>yLonfyZL@lkTnh&t~ShMF0Fww%MXaT0>bJ9#f7;R$Z*Bt|isQ*;Nxu)N)E31COZXlsE=|9#zXJaSS}BmQ&(5oJDFl z8!4Pcb%e7}t-QpsjRl#<1c^q9mqyAlA@4ei`L6T0NcNMIY%Zb5xI1OCL3;^nKOwZA zB5huHz$iB!O5jqN%4I}R%{Wf2f2HnsVBh@%9^TDmDUYtH1y+gUVJ}k)C2^@?EJT;7 zPbAC5##o_$Zd{b{#$BOqjOBG~+!a|j290K=cL|0Nql0-MohV*}C@hTXNoTfjC z-MGa|1ceNLgjBlck3CSKK9$sJNv)C8XPHJm_duq9el`+Floc8YbP4l5%Sz>AHHsQy z%kQX)+lAcUqyp6mQ&-PcHn+d!b`8LU^neG7)CmDkysCO5N*n`g7#IKmatv7Rc_dh! z(%i+G)d&#Bz^4pch5&I4e1^b&mOBaKngI`%e~j`TqMcmU#d7bWo|vif0KLzQ`BVCM z1CWV-{+P$5?CsBW&7$djMo#ovNv)IAvzeJ$?|};SoTQ$Y)C;_b7X?zEpSPv&?+r8p zRP;9ZI<+~%SRRU0JrlB8ai)GL`e*yw=@^{S*cN$NGC z#N6*rpZkL-ve%Wle~m}p0}V)2#JHjqK{rgs6}k~#Hn$jOxy>NB-fQrjed z^_HaGmelstnb%BD%gaazj$VFyY1x|k?!w}O1Vuan7zBO`9gg`X!#87cE+&B)fvN>< zyJ~AHs*s4$EfVFaMv+9{QqlR?mqd)dt)eRtB@v@ILE+9}?=FR`y*w4xHir3DwvAym zgYU?xdskW09n#nICi45PvZmir7b0Z=aQ`3_Dt671qVc0oScr~BANKHgJ&?BIgE zC&&d`3Ht+SbEl-x?d<4dX0*)Z*(rp4kbReuw6cm`y#TjiPiD$U$~G%^P= z#o^Z+*<3ZUeze{ZBE|Hr_>G)Wpt4_a0N@QE{d_BX?ap?!*)8E8B=w`DewNfPM4e=q z@X$V}fHVe2<(^><1ALDcHMz4o9^ zdB|Oy-SuAFpq`TE_bJVv zxiHKHfMWf>Zg@uGJ9e?Omg`?p-aQ+x+;aT0wP?iT2q#6k0&@(aUWjotZ6*xhTAdjV9~ed3J$6Pw0KQ>VtKa}g#n zQF|n{S5o^VrRyGLNXnFyPg0ts{JN+wJ0W0M+tbh9Zz+S&Mb>s*7s=K`fB+|RYcLQZ zz(@fYto#D{ko~8l2o`Qd!zpTen3Bb@ye{#UX_|gy9N6I>@T)*!19@1e`{+N;u!GjVjW!&QrA(oEC)eTVRJ-YEz#tOrhzX0XRq80$Mj+ZIX3}G z1tpausa#2gB$X$r29jzdsfI*}93P&Z;|Vkq4V4_{syQZ(2Om;@b4(lqK|O1ZL7bVl z96f7}bF%3+NY62{YL4^LbBwGCTLec$vYD;SmhFJ9WSck!8fDKmP3eBRdVtR$7bufQ z{c3DyGCp6ifV`|jQhlv=jmW`k#Ir12pK-|N%cSP>23{V@{#FEWu7Md=3ZxaFvR@Sd zsC`u^l)Z{16_!+gv7{PHs)?kU62;#yR6<*fYp|DCa%i|LB3kd?JMu01pH&w2#)+r@ zb*SdG^S3tv^jp>tTloSc!fqNUZs4-;La0`+Ld3~neqQZ+#E^gg&ZJ0Jt{TKK(1d}Z z;6-rt9l^yqAKlg1r3P7by*KvY(F7w)aD6XW!o13_|BH8j^Nx<94&wOyuI=6?cgbDI zk-Ic%2sM<@MU(&vp(CgiK?NleBcO-~5h6rUgPTVt)y#-J4V6v-j|pMQ~&cem=`XA-^FQm00x z51vjbGVn=%UBRZ^@c}KmvC=dJs*gO3d6yd=!hgxwZDT@I?0P(5uhq~Negkzw`TMj> zP%}uHV^Z)umYs$lF|InD@PVGL=y%adXz9vCUu6oNL~oC7ME3aYnVb0i7F(dYQAqJN zcVQL!2)~PLw`CdtwGZ^PjiIw1+gSQ2ORNi!Y)h1X5ER*rBC!X82@YF&8J&}OpCfY% zdJa^up4KzBQt?p!UWpe*PJmz$Zn3#D4fU8j8TW>C<$7 zB~IpLd?k7`H*GFokxuGouz1s6lfCa6&%Xb=?4}-Um>>J3xLq9{0R!L|(zIchZVE!vGe?;<;Wu zp%b=G>8f7Ut3z9wI`V5t$ZhiJwRZl0u>q)S)91#x;}CvUjUWJ=o%|%&9HG#Ly7;Lf ze(=nT@H>^g0N^%xZ9NOZ@qYPqan%4G&UV^^=lJXtV_CojaWQ0HW&4`DM<4+o zv*i8Ny(-QH2Mn^S**+dawjJ9W*yiy0Z`{)Z2J}Gdg1H8JjUllvXzC`-)iDKsUKhL* zBs<+*;Pt{l_uUD87=^i9Fg8@+4M2~CU3fg+mxr~xcDU{KUX|Atf-oQbF7 zUfzo;1SjK`+0#H%-EA%y37aZn{oVp^73hlI49G~Cn70jr-!#;9ZWr87THm7ui)_vXkQP!@hR#9F9B5K9NRKnjcHY17bI% zRsmaTfwv*tqz0rlfsx(;X)YM&qBWBTiPi_JAG<&jt3;KHK{29!c z0WTyk3xr^~w#?pIK|J*}K8YsKkLwwW_HyVPY#hvhZHX0dN-MeFMm*JXjskBRsFB#j z*B;s=QnfV#1>TO(Hoc7vXT@tiW}U5UJMfvWxR+9Yffw-SB}G<&;v0T-_tJ_TBD4mt z1R@*L=olg!IQV_neSu(q#r|LiCn%(6<7;~E!DBbmrL>x!N=OD2Avw}(dio<(XWt9# z)1WrfVxcUi9YRf+z7lH7^tMng(`lieOzVaEGSy0{>1m5}GiTqbQFb@n#=cctrvbM! zrFw8BQUTK$^o@oX7|wKnRwCUA&jWxDHR-N0lIe!@FpUDG07`;?H9eD&?t>znQeG0} z^COYUNmS{EG>*w>3;T*Vu8x!9DnJRxb?3Ms60N+6;*cgYeE@s4=@5b`OuMwbT7O7} z$C!%QmkQIE2KkB7VHVSX&|YmkRD!3OmIwE0c;&$BOnaTAk`0TPrX~_KhNVm^9YjrG zIa7^zqSmm2=|IwdUd@0j;SHwYfxVg+X(dydAM+uVGPR5&>Ife)y@GLm=n9*eQn8i* z(iSFL2s0pUWr}C&1>2d91W9E8>|jbtAm3ov$#ip&x*Y<$m;xc9JouRD#|jj8JABGl zK>^H;>koIqKK32<&5jG0P1IOh z2F$8>w<`l`$KLDm!D4SA+9_I*%K?MZm)jLINGZnS>z%m{2P}5wIx2%Bh3r5_uA>Qj zrg9xFS7TeIz4!R*d=I&LkDuuw`#9T&yksYTpsfrIytxhqed3B;GuXWt9a#fUekrWg{;t&?Ojf)cC>vq*3+478^>&%(#syoem(_% ztCBibIVrnOBU_E_)ogRv_SK>pALJ|pwCM5C7_ymZma4?7;O(RrFz<8+WvuR?8g#a! z9JFR4uU}zXgjF4KkX^uC7}QT8VvvC$NC5ta*lyA7VRymhHA=s)Re`DB86Zl-;u$?JAz$h2Uxzo!@|G z&d1<-spP3-(j3orq-O`(n}a)~N5xlWWteND>#zi^g04DECX`OcwR~hh_mI7v*QY0t zy_S!2{A9=Q{w@!zY0)TWTI9Sazl9T4aLPe;aaau}T%LWj)DW?_=D*cLvESN%@t8EF z28l)Ge_xw*KGq7wD|P;%HeQeWA{9QHOvg!NrP^(=(tD(mop!11cX=oB`n;OJ&9tIxW{-GojJ%|{1PKI^KLH1<44%e z=e*ZD$>#9BjN|*;P*x75VHC#V@gHLUGK#M*iREMK?$>nfMf*HI3s!J{)LFHN&hVc4 z`I@;hfX@`T!n@byf_kp~Xp8Vph5sJ%AHn07DxN|+z(Z?V+0No|3nx7_dcj-Hzg@{{ zd;it?1{E(v*6#mrnlal;~1 z32B_g_bAf@iJQSRP4AL_kb%CnLZh_JIHgTO6SUgs+Y!|S8+;a_2ATuDj!;w03ExGi zwWh&^Fu`HpRhk<-mBW-B>Z-*+C80g`UPz6E-thHBYARIBlEOGTMaSh>iiF-xAq-Db- zp;tq8y)n#-kfAq$H9~tFe!VFij!;l*Rm>|VoS-%{Tg>3Fjy)`ru z8k(G?Ujf~Pz7I9guY`P|1*xs{HZV@;s4WL+me3Zxqn-nQD}-7lch}p(cA*WS>-2W; zjZi`A0KL7X>h_kZud-C#0m>w9vu&`R3&HB;Gt1XILAFr0)I0UgaFx*V_=HhnpgrP6Z-agd zJQ&HaO}`c9Mre;d1lAC7N1y9?a5zF=>$d^aDA$aKp%BNk9v<=MseHI1?1L+vL{|%y zxQMz5?TL+teCQ{XVZ(nt!%CrvIgX;In~ zb6UU0L>KijCeq#GB9w1Sc26)-ZTABvYUO?yx^XQtpt-k~`%!q_)WZ~b#ni)8SZ?w? z4(~I69Z^)-G}t0Ul}(5JLR8t4a7luMEbJDd%H~3|T0&Uai!g`jF{qZ> z*Zm5-RGX*>f+@q@i{P}-rNmK4ZR&)3sOl_4$|I6lFNV=!f)c!XmO@d)SL#>_GnghK zDOd*2hJ8YBO59zE6K%_Ww{l(Br*Df(voC{xFN8jiD|IY`gG}r7At^TdayTx&%Tv>k z&V*I;t5QoH%i(A7Ibv=06_yMuz*o0CuGqbzJOjo}MXDpdRDF*74ajCH((CC9kggEl zYTGjRN|-8iy?qYSOd;hY-!Y-O>^m(gyDG%PN^sQ+)1nG_subdd)+elVmqJ^i1qsW4 z+;75FLR~QK%}88rjC%|E2~DlA(*0H>Zg_=d?zds8kdAS0N8%1AG`^=_K=JMf{Xj7V|9JFv?X_b!|vlHGh4eqCcg$ciLaG?0a7pVU5w9D??Hd@#rWdk zJ-9`D1-?AB77D~S3Vmx~l=v2>EOWmPqjTQ9=Z!X?;)B*Br7R{nPgXlX4EnJ&QKhGe>*m~ z*PFf_JKffm8z8np`N{+C4W^aHk<9rvLilH$$K%{&-v~9raj+?7scj=%CzNlyq&C8A zA^g1#X+G0L@Wj@2Y=Tov>s0NE@7h0v^Fkv++mIxKv#%#lZKhh-*H2fl8Gew%d}3XZg)Uon1CwV0kedtvK_F+vht&_3bfXLaPNQvLjLqJ_f9w_l{d=0gTB>Q2gOC)iJp*4|Q z6NlmYXdIF`?g$Jq#T|irO>swHdNdBn9CsAvnc|MZ3RB!s_$U%r3CSFH91fe}j)Sdv zH10TLBS}7_oG|IrZF%a1>Wnb;vjYeT4k!#o9M8NGREVSFD|c0-@cWV(nYF zM`)m{So;p{7m7(J)=oi*P%ipT!wjKpf3bE3o)a4GEY`kUT~DHL#5HGYA1M3S!z1`$cVGT2Te`O3i7D$*ZP+j`M_zk-i^qVg+LC6c&bp%s$U ziDZsbs;4PVsbQu#rRGNSA(`WBYKbY%rrtNj+0^Hzd^SseoI{;8#W_^`<P|k1bN*D{=HgwSqJGsC6E3Jr8MGc@&pP)tHILswIUifpY7x0)rC ziz^K^UuZ^hYa>RzF62duRi#4N{$_?ptrc1q+syDP^PN3TZ6TlRW}K>VMf4sSr?Mgx zk7VvBUR_RqK2eGPoloxb;_GG7j92|ln$|d<$~S5He&?GIj)T{1xrR?o7Rqtu8h&NI z>nEt0@=Dj}KgZiy=P%BV`Bs!1gKo~Yz$AuIc$kFpQLzY`^@!KS!? z$|sWS0X30GvIop6=qnMGMYc;?Ks_roIMBnWs9rXIX(p+~Ce0+Z)1;YX)o&Y(-Zu9B{fFqkN~qlOuxskS60PB6GDEyikc!+5wllSPYK=V z^Xt{rYY__Sf7LDhWvDmEC;OM7&Jjts8Oq)^+HHopTlB?*eb6TDHX}nN3i;D3>orum z&_GvZJyX>bib<%f*Hn#&xcAC>E!AEqE;!t%t-1-7_$uplR3D*SRH>^52@S)zda8g( zddO1u5J}Zp%KTebmbq&5^=%hcDfDORSr(Q0YB2dkf2F=EBodYSW)<`mM^v)(`f3Uh zPhzyuKs`molgQE=s(C~_i7dU5T1do`$kMabN+BPrG*%xH@g&9@P1J58ok? zMU`gin9wkcYi{YGg*s>Ip@n47vym^R6{ zQjHSoojA#8ql$zMrcN?)EIqVUCFGMH+M26IT6%T)baV8!YL!rqD@Sil226H zEAwy0?ai9#b9FHL62k<`gU=Z4Rl3lFu8#Uuf0hhat2*S93|E^qk@6yO-Sw;0okU!9 zcfEru6v{zgM~h~zdeEeqYpFWdoB@6BMKWBc=UP-csm&&pP8O9;W)<{V;|`hQhl<>0(joVpc(4 ze>+(@BJ_gM#iG(x^)#t;Rksm|N>{TA`bI=*8LfAf=IdiriOZnMmKs9KmCefkbne_s;G z5EC;-Z6V?wVq(UskBPYIUyMTarO*P`Lj68V598EH@<|Wl%sn7A>QNrITpwqN z8?RcCPvXX_UPRLEc(V%nta1GD~IDn*vNRFRrxQYkX4f1qzJ`S{MT zK`&A(ga!xFV(wR~i9~aPT5qasg5_>A!K{hCV-d}5`UG_`qPa((XwfWI&Yn@tV$0p8 z*rHi%y4(E5&UpqmPDFA1t!#&c^iH|L(T@@cy@Y^CauB!_V&~`t#a0q=wq+z4&h&7! zqxasz(GP|`^b&gS{kVb9e|sBX=-Yz`Ww-ziZJWg!x zdih+eT70}W`%#w@eDi%t;fcQa{&wL>qHX-@)0&G<7F}-an$qUte^bQHZme8cQh2I} zxv}QDC55MnwA(K7t?lVKZFai2D&nmgr;F92UJIV?KeHq4%wGO_gT5$fD?VNL-(R00 zp60aqR8QL#pOKSxmU!Jw3)2q8XNiwFHYVr2=NJH$7 z9lf-3#I`$6q#?G`f6iXoxuR*8i8REB1btF0d4GsVp-V#*6}a-U($YAkqC%O_GBrM3 z>WdVqj|BzD7G{>|*%f>(^k-8&pMUJZpZ||*3k|YH>hI^5sfShlah_)b4v8c=e}e+Y{=8rd>d=2$%Y@zwr3 zUN85RO3M}sQ2^g~{npX|&%sITjrETG-|-NiK6z~$%l=#SbnIJ|!Op2cP7OJ!%-j~f zb*i&g{8ggI@pZMM|0%g`xwg4P4Vi4oTTi+QC70u}Yg9@uDV0nXNKWV8*^zZimE`{H z=SH@~m-0%5f2MhM$MbE>&w}2#onG`OR=j^uEBN%+A-`_^Yx!%)b^B}UEozuwE6(ZF z?Skbcmti{fe6l3x-g(x0b@N>p>z(!~1-W{Pv;28Y~2!1gSn~s zy_1`J$d0_JW{B5u+)nU_*;r5W-D_xGs@hJe;H>cm^SkO=3&fZnWr+(WnRp@ig_cm zQpt)nM3J)Ua_d5GT)(kcRynj}3%0a~51e*WG`z8ysk~FNqxeFcRI&%`?+0VzRywIf z7eZMuEeUR3V2MWMg9pRI+RGgdc27T6v@5brzMyfQB<^6(chJnhh?pUy-a(mC ze|DRgi7(j06%BSFh(jP@5a&D?Lie*A!<#BlEfv&0DNy#cxmm5-s zm1XNv$_}D+imeEtmF*!GC_mQBgXONNhbcRY@kAWs66Ca? z=hYn?C}E#P%9_)U2-L8i!mMGRE3;n9%~MsX1d5b5>Q4(yaZ&}R;)@zd`S(O?e+l^v zx0b+{GthXt1Mz$d$}ej+5VFmig#6CGN#Hww5MTboE_-1EA$#FFsw%Aren-ny)C3<< zfZ@^tVjw%o}1cjNpwj`!oT-=p;gE4K{3MlTls5{!$Y+Nq(0e>gXAm~uZI z9#{wZ#pSPuzNTWE(Eaqr@>bw}!Wx2cm{9f(*_{6X&VK;sY!dQsF*Xn=3!)T=Qs^~V zs*oz_vrr)|%iMsu34H}N(Rbih^fTB>fr3Jca_UZ;x*MnNiPSPWgbEAF&^EQmb2xnl z%TY89`Z&&i3G-^Oif(0ne<$++wmidpflIwcjRjS-g!LP=8GOD?ZSeCBTi&N0SU#q? zuzbR$zGMEx6hbn@EMk^2E19)|?~yr!Eo(CynH#cwQ)ZYg9n2k=J2Q7@YMe)B?#-41 znZqFNop~Hv&SIX&yoBvvD4&HC(t~z^LdP*XLXsL&XJ(lPGS6b3e4FEmg!T@SrH-43qA_BH7(aDDm`+??4$--6q-Jwi*BG|;YWk1^-c>abYU1MW|K zB`q``o?B>Xu$`|JV@nJc$zv#4JD)A{VF6(|wRRz$LbrqGz_O52ub@TrRox@t()Ewf zVydnQ3u$i`i)hvQe;D{v?E1!OzSghg9sCM<_769)GzRl$Qx^?>v?3|>&WARxVsfTN`g zxzs51yQO2C|E<7tumpmVD=}M`YH$&S%GBUuTB$6?mSN~we`WJok3ef>3t5jsA5(T8 z>oMp>WpA+-p~ducSs*0!4CpV)R$?87E-P z=>19++^BLG?5!LD?aEQ`jLNYhSqFjd3U98Q0hX1A!RISg@axLh(u-(X-7s`r)qLm; z>qekAu388^yKZ!8S(E#q)w(h0_VTx&Gj*bPG0mw8e-tmGW9nu=+f^$;Usx9|mY!Rn zZ>m$FPp*nVKU_BqeSOt@=vV7Tpr5N61;48r1DC57C5vf`>KP@nK4EarY89McJq%t^ zJpw*mJqmtVJqFfQiBdV*XMpR~gux3+RWMRB%=Qt`s##bnTV@pc)SCNPzrh@X<%XKK zSc@{$f21Z*#w`i`UCm0Y!_ZS}TUe{mTh_){-&0;JS#bkhRPqM+R0&nyKtGloQYr1C zTIRWsc@J}iddaPrdomAUUdX(M`394g;nd}CApCzyR+f5X)#a$a_U-km=+nBD*RP^o zN?Vz6=3&e|J68lRWWLe)n7m?_!nAnn6KYkqWW$711iNtVuOk`KDqQ zn?@VablR9!piPi#Q{>tVxi-gns0lf@pjD}v@E2yZI`+4j6h_IdaY|~TwW*aFsEyX4 ze_6CHZ9|Q;Ev-lG@VXtmZciK1Y@1 zEj?0WL`q%4+VS~5lgqlLrd7(+6POQ7k@>G#=2+JQm*uOU!Mq4uKXmoq=9$W#j{cv; z3KdX*6k3Yp94G`8G7wX64lRP^G*F?_sTe$iN?|z@#94yM!E>k*mUBUzE2tX!e|%7( z3#b;nkm|t^S{A&BmIp7UsmQYs#2ZbT4t)uz(B(7(`Z7?VD`_R@D?o*=qE(<5fp{xM zt3h7}DmeAcguV?_=yqBY`VLURIdE<0yFi8Rrgfn20TseCF7&;iLif@7(D#E1PK+CZ z57EZ3JP0Z{Q*R3WFsRV;v^n$(f1pAy(H77zg9^P$TY?`^82pr4z#pg$6k;2&P_%=U zVtcSwbb!l>E^w;Y0h}Qs;EJLbTvzM}ZX|XFo5il+EU`Pdo#+EQg$nkF7&u30;7(!? z927dJi@9J@Btb(M;67q+Fe@zZAdvwN6Z?Wki!6AK*dM%H90*=54hC-*f5YHCVm|nU zI2?RV90|T67JzSvW59RBao~sI1n@I)68M!k1^iB&2L3G000YWdV3BeTxUzB{xSnzW zxRo*jwkZq2cI6VVQ@IR`Dp!EJD2pgf9|zX~KMgk0-t;;2-t;B3Nnb&m^bNE{-$GmT zJ@jU1>)F(c)ou`_vUI3Ce<{*=7)jUAE$HJ%={cPEKcFwsA7_f!#J0+*c#6JR`Ccgq z)CJZIbOeqKoE=ygxGL~^;Jv`I!83x_2Hyp#A$|kFjJPCt zxOgden%FFKn&`mqf7H+w;y$N}P0g{szE<5zC)8|9Lba^Mb^F$(rWR9EZLLS!JEK{4 zbAKOfljUs8&na!q85zvVq+)wEQfDTSQ2P@aY_@LMGPh}}S%kgqe<^$Y^(bmMVUwv@X(MH6 z5gT<(HgDM1x1Lj}^=Nx7J4a1qv~E>55pC7^%Bq<~qz5+=8B)!3LpWm(X(?NeskUKS z4P7!0zp;c4tMs=%F2Z-tu??uHZJrj(*c#WrIWA2dtsCZ>H>N?&?(2=t+9W@164R#C z)M3Ok39Xr$f4WV5A2fJ-GM&(psD>&l-m2NEp0Jv!qosv9I$Nl{mD>8Yi*$ANwYIf% zwYE`f+w8Vz8$~obGFMM;6X~Ex*0Qx^Lwgr>o5sBCw$W&}OpZn)v`t%-y1OD#iX!Zd zN^>_ld|$(i_k?$(ePqk^^-)~4)p0jFYW-wsvGJ(af16grHd;zE^%(i@iUxEo5pR!6 z*V~vzCJj00gxoYO2JS3oBNlTMXLZ@5sc|v^&f2QNXFTo>C#kxJjFi@I7<1XPm*z&L zj}(TJRJ|5Le-Zb>UZDwtceUPh9E_9on>grdFE39I&YK&L`!o;e-jt;dXkECT?AdV_ z?Uonse>O}6leKUpt;KXTq3?%eJx-3_S+a$xRYPG{H%+u^^W46^t<~6EJvHbi`R-%# zL^z#1ackYQhvI5hX39^E8gsSOBpx*@X6k8F-=COUP274WW#=Wg#dX_J9UT$blN52o zIUJ6693+nx$COUXz><&^jp|8ldp+g#Q-|Sbe_n8q(UVcb74916#*$93jW;zY;?rqY zxSi3SvTQXK)3`!L#)Pt*pv^Q5v&D#O(iK9^(rNUj^q7pK#+6$;%Tfp3LgSI78@9{E z*|6kVOWbs=jA41%Pv-9LwbsR=fo{9!hX4th_?q;ZAq-HtRh&zOx@06!L*H- z!A584=*%ShHPg*xa~Rd;Il^|W(skRsf3$9D&JveN*coWcr%lZn6>i*F0#f^^rmm*! zaieUkuKv9+`Motj?yS_p`w~k`iEvtPkiQ;x7bMg=hM_VMhp?Rpmo-2hK{Bgqg7WJA z*-ciif$u6O-tR@Y1@$+8s^rfu`iEN?gN|^8vFVzmYB}GTEXpvnlrB4e@X2| za##4A96pP?&O4F3B|fK=-^RDKqp3se%WOm6#^YK%Y}=;ZpMga#%9sl#Z*8jWPueD< z`(hIr%2HI#cAEp}DlBzk^e@lw0<{%aT69X1&;oSWD-&RMvrhJv3XKN`7{gLlp zEXCsra#k1M{ce7GTb*2$zJNelkE6QoM;w_6bNp7AbLW{u_Y=|ckzwMHU+x0x;e;am6CU~{~?T$zN z=&W8d!J9RL+(#_Jd@{_e8{u{`A$S+VwcJaRZ1!+s(17EiWX=uaPTXTIjwS4Y!vO$e zDU+PoAUo6)$?ZOZIl}(=oJlS6jFoUEuw${A+Zno(%^i5|mc)BSw`L}Fi>6!1@vutZvf4&$$=6X@tSiX&cteiMs z%O8z<`uC^Kb{29t!@1qy8EcT-01!CGxdDT$ap9inpgAjtx`b_b?;*yo*QwbJ+uC;8 zKYIORmU>hDc&2gAGCXq}^VXg*YOqO;Y1c9ycSXb%-VmojCXW5iA$MX0bE9dW-gb5m zuXRq;?LM}6e`Q^TQ~kK&Kvp4l3T=zs#j!g*9UcT+WBV+*IoasaeRLUj)^qng5e}7h zUthl)>BYz#z!@fvvzUx`s0q!Lv$UiaLDf7Janzs_SR8m0&RK&jR_;yrIq?%{Wn^PWg1ck#!0dMyC0#rut;>{;9lA-zxNx4Z`LUgJ%L&^pcLj4}yjnRr=fxveDAyua0e)+mYj$2x zN*Jblf5Xm83wPS&=FXjP^0IP^)y(lkUyKiotQuktIdEPV&ek}R;9!zt8cskK>GZIf)$CYscGSL1!QR_jsk`zW?vt+x=-XNwWOtjo9$yqR{b$}eZ)V=SIg-5n2ldPc1ip5A*wOYb ze-zsD6_2JWrB=gh%(Z3vI2?DwWe@DNck&UwOnP+mg$u>1NBaBW_3qF!jRpj=5dNTZ zohw_{U^^e%yzrM~K3^Tam~}YZ3#vm`SMj+L68_Cf0!N)iL1xp(yS@|Eb*iHf4IPBBDCH-|0qF3DfoLoFN9r0MGafHQ7^i> zm!U3u{uc%6bGE0?TRt#bE{<EPIl4N$)nTBGBixw2>X^3xvV2Gv_I8A^*f4DW@ z{`fLOnqhZ+<>RaR41YGcE4aVTdB7SBj50>Dwo$N*)X=I~Al>Z-w0({=HwAKjk{3PI z3@QSJRHdAd71P2}pQv{X$@O%ui2Ea{2n#SUEVx-jK}=3V1e_cw+*!F%QK95tuV_M+ zh?!(f_)CYBEX?f3wvB9$Xs!#mDG07Nl*1omTTEaV&O-W4)Tfk1jO? z!HUqxRLujT?Wh>l3~vo1`0J5T>Ee{6M3lGM1j(Wc$e%TfUYq7n$ie0Uwz&xX!WrDL zq%B^N?8If3;l^_Jqgh_KB^dYfVtHqf=8#y!P{`M%db^NfjEQlL!|? z;4WaBDu5oir!WM60o;<{ls2#FTcQTzyN6VX%f72*Wpc%|kp8KDkqXuf$V51G``Q%AEl-LvVy{CqIX*j0gJ_3QE z2A87-Q+0aAA>T{a-T7z4a-bhn>C@! zR$S=T(RNMRX~E}cNzEzh&WT;jx@Z+4ap8$7ur<6i<{VU6+1LaS8YSQr>2*cTO|k?` z#*hxKbK1Jww`duXDlB@ar`rL>wVUhK3C{%$>OO>fkf^}o645r1wL#Hld+7bCCUNg6 z3(}jGL~a?rf4WFU*p{Ao+5?nbAjVt1ceaTfpRD&|4E^U~V2j`Bo$LjthTH#RYa6Wb zUC)J>p$7UmCzje6DRxw83wYMoEr3&&bv-Fc#+wPP;;qPFlTCiMsBsVZ@{ zOm#>{WdEUbC@#}A;GU6fz%x6~aV}n?o=YXB+7k8be}CF#y||yDzZh12E2VJu+KK2)y3!PH zS7C!<+z;y69kbxK4-Wv&()r|yUn!|;0Q1*=6Ics)oqcF#E6FnW3O4tYeQjQBTmZRV z9f93pe-;qurSbbFa#BDuJgbzffSO~C?ApDE(xKQIQZwdq54-JbhI52H(JdL|-dwbH zx7q~WTTgonj#sZ+BGG*y>T&B!BKPz;#D1V`16WymYnFRI5ag73Y~UF$1m;ZqVd*#nRntf22?v`I}xgzRU5eRhMutja8RuS!a*D5^+o(NJhM z#3P73Ict{Cvh3x4uXrb4%h{lW(!`?&`-{P-nE1O|?nxEZCa6W8Rq?_L601;?nXm_ws5xle>(2GC%{?hKX2i z<)+-qt+|!kvnzMzmg9suSsm`nf7`j0cNNn?ORIYVk0l^_J~5bGdELrgmLy^fW)h>8 zWo@_>#ZoL!<_WD_3%=;T2rf#&Uj~kH^F$)I`UDK-R_@Q_Rvv_zN4QhD)u+Wn*_97C z8UT`mxz&AaNG{`u*>ckj^48X?`&&MjhkH0mSb{6I?4w>WdwV8hgSPwfeRe*l8zJ0I3C31OrTRJf71vd#E@y=VT6s{p+iU$A???^66r5swm9UczM%jZxEiETk z&0U5zU*VWqPVlk-hUpg`+R(DpsBQBC+HfnYKV@qsmXi2kImmi(<3z%@iX|$GHn+TC z-WKcrqBW#rG}ADne^IQ#O%icO&(#10I_bnUx?!hPGszDhTDT(nZt4K%%$3>CuDGeN z;JkLpz^|_le{^!MJhx(TVRO;L1vC5S$W>PaK*u1t1v#wbpatdvcaEaNX@-ub)X_8r zbb=mx3 zCgWzA0n^K=!+Y3{+jcw++Ju7+ln&=wCVZmG$&Hf<*>HiaZV^15HjUaFPNu3Y?*ApCiP%idR-(UV*C8XbQ2Uc$X^P ziV#;R-Zctbk46~`snOktokHMHM%B4Rv~E+%cPQRne^TBftoxMY0aRz8`~EOU28anF zE0yoTA;H^Evp?UfP%PJG&Ja2*z}g_+BTLihXY;*6`;|8FIiZ?-FUX!dC}$HGVOgFK zYEnL#AU-;?P2R@M*@6i&IM`+d2wQMDN|GF#Nx#~|KKe4N8r)|;&1{1^9DX13HY-R* zz$XfPf3Conwj)8Qln{t^n!)y_6LFz3eLm9>*51n7hnYCC9Ra4sq>~V!#WNroX!0CX zW?;yqfHE!z<`$Q`OjtMC3S=Asu$~ZPNJorgLda2;Zm|{6R9XQ?#gnZ-S^=li*gLp< zNm!XcvK;~3njq+mKt8~dqH~#?!zdi=7hJeKe>+nqxwE-NfO1lx^aKMn{)8myOCI*o zmwoi<-kovAI~F;_udOVyXvW_7bo}yiLLi}TW}frJEyp|nnXxEYt<35)R*G4MS!&c4 zE0X3&d5gB_BsAw=xIf>K<@XxhbBt&gi?%P17spEbmPUui_8A=?-g|7{+2Qdb$kM*< zf4=*VA(wu1?{T7j3*R)4>@_kvGD>uWMVpSCaP-WPjh2hYb#~XOng=hAjqHieXEy5O zk?V&LPXL+b8hNgghuZEI?G#9x>^#@D+d2>6(Vtfy|0~M-6OCH5TUYkxh&8U<{U9n zdF-fA2O3t&2bAI}(=V*BWkA8Ml-D}K7xv&6)UK+Vu$uxIq`sFzF5qm>aNX?!f8u1d zxNhGEEXuI`iL!4tG#-^y8LqTrK%rmKHVaBE!Y?X4D#H71PTl&8k!XcH&^@}47>`dy zwa*VVM8>)L<+?E26^Bt>utISdNHq#+h2vfFgbI~%L_6q9l$cY5A{x*SzeRaN9$5PG zQEWxUOt(T)@`oZ6JV_jim}|~1e~nm2wNfccS}#Qmy@_XxqgJ@eSdZ9kltO_YHi$4I zLyQUoS7)z8sMKoSAE`8T>Ptj_7yXo(h;_ag$g+u8re&2n6g9WqJERqTWQ849m4|Ag zCXjQ|A`GaBi-oSHdUB&bRy*9Hv99cO$^0Ba=6nMW`!4gN zs%0b8iS*8%`;Cn9pStz&fwLxQ#y@@dzk)p#3Zd*kpB+vUq>U`vfZ4$$K{?cz8Au|e zL5ntIUNG^|uO4_1LNiTMe}AW2|Hx9U@rRZcRKFt@ za;bZ-**PH3l=M6nM6v5U+$@V6ie&2U zp09bOMhl;PcF&s+9($|U-#xD%(mA;9F5n4(>hAfI@JM~7gakKv#_ZtP{q`&FQ`%?W zJ@+5m+Z`R>f4i>6bfUCjAjixm|8>&gNAbT$HMvc@{2EzPC)p$cLq~m!_uIZYSTsQJ z1>Wa=hxa=~r%WF;f1Q2rhUI%Femvp6z51`a_|2QXw}?}y8Z~#1^N~qjZ|reO1tY~r z7tXQu_D~=4G#D;ODl{t%d_;a zeoY^D_+I<$OU6C(+C6adQnAB-&j3ainAx)buaPo-z!b zR7cj7_Lni*BI}8~B$7qRfiOKfNa~pOk6J%-4X-Nj*pV zn`mF^BTL5E?qq0H13e7qYL+2W%jqoI0`(@LbDq?|e+Z$o%)JDMb3bVvUY_p9yKBtg zsT{{KvAruo-tK0|XQU000O8tZ*|{ z@GtoK3k*d70JxF>02lxOmw-_M7MD&80tSCv)O8%k@z3w4+(0&ts8RyXXi;`mu8&y;kIvNg{XBY4v|S zM=f2kWR(cl=86nu(;DmLc%C0AJfGQEQO542UpbU6UAFQF+PmZYHMdmktG+cS?40BJ zF78k1S@eqVXiC~N%pD;EpXvy#!ertETVw<4q~FCXyowPhLL<81!US0G1=fKOghP1P zgNJ$i5IC|`I%V)ZDv-tVIt+yu)m(qx%w6ZP>)H3%-E5p?$ym#l7PgbUlD&ofl>L!S zwJpiEZCS`3$zI3a!+yj5!HyYXN!}1!I@lg|6MHZF4f_W>dZ;D2Lv86|*RVIU53+mN z{cLuKCB-4Obh9V153*a?Us&5=%M^ztmFyb!EcQ9}P1fPG#P77FjIC#T*>iu```KsN z{cNbqmZ>gFs@Puk9QF}*JNpOgblWn~ZOL?Y6?+Q1nSF}g%kF2#hFX#z%J;)AW-nuJ zWS?i>W)HAo!}y%T_?+xYb}hS+y_@Z0cd9#0lStxkKMv< zV}D_-gKU{_kR{XDCG64cM)ofDBlcT1-fKy^*Oo@Mojsqun(bphVtqbKl6|&Ru`TSm z?0WVkb|*U|(h_eZKQ~*+u4YeT?_r-{zhe8@QBjuUMDgd0UCv&^-o}6KWWQh|{FcP| zZK+@z*t6Jm>~rjE>|d-i+Lp=DmXxtavc2rX>{fO^>l$uL&TxKSb_KhJy_0>I{gVBW zO^vZ+d<>t1UB>QUzh=$HLfJQEp&T@Ip^Qf6R7(n`PL>(yL=R5F#n^=Vu@&#&EBp@E zw8;{SbWFi)EWiq!h>L%)2@hZ!c480yf~T-Rl97#4G-D}_E1be-m?E9%!5M{9>8a9* z9&DiR!*=Y#p2BG&Mbjh_NytD6ny?(F;!@m>r?CTjiyC>&M(IQk4$zUsjWQMm#q&5f zPdd?q4TbaMK5R!V=jInTalT19(Su{?vv4gQ!1Kk;oNty+^k9EOVYA$a?bwAqg)Oq9 zxJ436T4W@~;Sdy|yQEc4C=nj5@=VF0{66N(_LBMXIrfw+ke_g%q)ptVZQ?JL|M6&- z_|iq(w}|^Xq^Pt*Mo#aLY~-V8y1uqUR&eZL?3}(>exANWV#}6DdRd`lqpPe)R^yVg zVp)&-u@x`lO}u}HPs&Q7J*g~FnVkOq&COm{~1LucGXvGj2i!9_-43#=8!77}Hb8!W3z&&^jFW@b_Um-j~ zq_{Ff>d=NRbXN}km&C=D4!IIHVly7ca|7p`@?E7<`Vms)6fY7m7Lzcw$|ZGZM;E%Q z+;R%qu?~M%RfW=_bSNE450g9a47Q`MDoplZKkV6I;)Wk77>~&)$6PGHQXGxr@!9Nf z=||q2a4AG3=3>blj~t7$aS=A)Ry=^m@a3Ec`3+&!5fX_cWFQZPD6c+94o5e-s@N*8 z99!+>yZ1^K@+y3CLA6i1v98L;&lD*et0Ord$!2^fn>STNf!OHsn}SvA5VTDH_g^BU3eV$E=Q9q$etkC9z9F&vMPA8KOdHyl7) zWvq0;T`N4|WNd95-*FtDH;&IcLW*if$P7GFGD7MGu8HSZytJSL-8gpOcml^0qy-)5 z#^8VPME;B<%2~CEaw)FEo!Ek{cpV>NH~JxS6D15WNJ7C};gQ6j*(AAqZj!8GH?eo) zQQSapW8cIJJm1BBIdD%h@0%=nb;ptB&u7=; zCftiH1NWu!TB*ENDzB9qc&#)(Q<_B8r%8W0a&h> zrZM~u#>i<6W8~Zh2|Us{mM)hxq|3D!{2gX+EQ4biaxDgrjpNujd9-1iJcI26_m6+) z*m$lRFV|x5x=fB`N?${!e1O4Y6F4?OK5LjD-=mx7gTMPM`LiKQti~(}M=VAn8`IEV zn}bm2z8uMG&XM_Or&ppEXJUUHHsTI+a=r(BJU^-V5Ps%EuJSmZCoSkeHwKUAOMFW{e^2F0E?bIf zv|=%i!djez%drV}<56tGo7jat_zhvL`4WYKR#A@*d6X7*TWg2B7I^+gU{ik&WyF@N z2R1~8%76cF>4Zad2ArxLa2eOTB_!Bxgo-QJE(}xcMwrpzs-xgh?L&mo2N~^E9SNW4 zhS5<*`;GUHHqH+>I>zW&oPg3nevT;7eIG<{qPczORY`ot{ z_51T+ldN_a5Rr`=({COCs+Kur>XR40F1mpfJ)p3|&^i-p#8C|H_ha%&AvC$<)ml{3Yc)c?9^SMy2 z+Km}T&osV|Sw>f=_My@^UuC@CY~%Ik7+r1LUt@Hw(Q}QiqlW}K74?6rU1(74Mx)X5 zRQu4RIu6Z7w;0#A8hxno{_~CZTVQmX@%o1ueYnvJRmb88dZ;?zE}md}ut;?lI#fHc z*ytsyUFcL@6KDq=&+}1ON;}o{UE&RP29~LIV!4C_+l>_x73>tOguebrb>53^b-xQo z8Lzj>=pNO>uvT?BPBedB?Rev7naJp1@zd(EFGk9K#bLfb`^;2*z?G5w{)d?c(VEgDyp8If~#7Sh} z`cXJvLV_KE3sgICp(F-73Kyw%;bKV*b}TMY9g20li@yF+)p38gOtpo}RXcHo(N`L; zw_bHLt};H~)vDvLLA8ZzpkM!5==(QHda%oI9UY~vzg~42Hqm}{{sz^4+^E`tn^cd% z&2)62ZQP>Thg(%UaGUBexSbxZ?!QB|4|l3|;2ud0wg;P4J8`dS7w%J?fcsS^<00ez zhmGFC?@RY1(EWd?Y8M_e&OdIPf5JHbq;dW!wYo-@vGHO@b;Iu6@Z z`|yHl2eupMUo_6YYUy}WTuD@~?^f+WsA@Nc869SHxX~Wf(TGspi-W8jNmB3URc*tk+KWil zv4}G6_Z#;|8}|=4?vF9{CekVD^(R@m!S*0mwT(R0ZsZ$1+2{h*UQAJ4kEwL3djDyv{U}szqe!(I#YUGH zU8*`B(^VgiGS%5Aw{n8*!3@jQ6iK z-hY3t@&0wj{q@HCHyH2VXqAe7|9PryG^vh8v+?_BQSC;n(T5s6-{=KKw;6qy(T5wo z(C8zKZddKVBGom_Vt&3f_46-LZKG3lG?p6YyHq={%y_-!#`P=PIMr_Ss&?Rb)x)v&Uq;LX9;z*l z<70+l7=y76(N*@cwNO#^B}>Vcl4>wAw$TiQlqDfssgzeFp`M}?m6Vhs6`lx5ilNLo5Z9f%NZ!m=3fX>CZ%X55jv9-iL4&l7Bzae*iFC zZ#Kk>fqsLS1i~S(|5c&-b0DSw@t=Q2xD4Sl2%kl`9AY|91=4>G;qwSzK)4dA=OV;^ z16=~F4%KrRVhT_-#AKi=5X%BxMf}$wmIkUt@?D3R4s-+QuS2*V;hP9IAbbnq+X&x5 z>S=^n9)u>q8c;pW5L1BuK)3~BGSFR!=K!?<)`arigO~=?4lxC&1L01H$v}ViA=U@# z0;~n)e*iHBs2kyj2tR_D4D=Y{g+M(>{y!1_Q^em3u`Ey@;(v~ee*v)!&?~-06UM&= z4A1ulFzkN|7@qGP;{O}*4