From 893967e380a45e893d46c2fd5a1c0f7de565fce7 Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Fri, 9 Dec 2022 13:19:14 +1100 Subject: [PATCH] Updated to the latest config lib and added it's unit tests --- Session.xcodeproj/project.pbxproj | 4 + .../Database/Models/SharedConfigDump.swift | 2 + .../LibSessionUtil/SessionUtil.swift | 15 +- .../ios-arm64/libsession-util.a | Bin 863920 -> 934024 bytes .../libsession-util.a | Bin 1947080 -> 2091280 bytes .../module.modulemap | 2 + .../session/config/base.hpp | 21 +- .../session/config/contacts.h | 147 ++++++++ .../session/config/contacts.hpp | 187 ++++++++++ .../session/config/namespaces.hpp | 1 + .../session/config/profile_pic.h | 21 ++ .../session/config/profile_pic.hpp | 26 ++ .../session/config/user_profile.h | 11 +- .../session/config/user_profile.hpp | 24 +- .../SharedConfigMessage.swift | 5 + .../Protos/Generated/SNProto.swift | 3 + .../Protos/Generated/SessionProtos.pb.swift | 4 + .../Protos/SessionProtos.proto | 1 + .../LibSessionUtil/ConfigContactsSpec.swift | 324 ++++++++++++++++++ .../ConfigUserProfileSpec.swift | 6 +- .../General/Array+Utilities.swift | 8 + 21 files changed, 779 insertions(+), 33 deletions(-) create mode 100644 SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.h create mode 100644 SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.hpp create mode 100644 SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.h create mode 100644 SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.hpp create mode 100644 SessionMessagingKitTests/LibSessionUtil/ConfigContactsSpec.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 638c753ea..317003eb6 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -590,6 +590,7 @@ FD2AAAF028ED57B500A49611 /* SynchronousStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2AAAEF28ED57B500A49611 /* SynchronousStorage.swift */; }; FD2AAAF128ED57B500A49611 /* SynchronousStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2AAAEF28ED57B500A49611 /* SynchronousStorage.swift */; }; FD2AAAF228ED57B500A49611 /* SynchronousStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2AAAEF28ED57B500A49611 /* SynchronousStorage.swift */; }; + FD2B4AFB29429D1000AB4848 /* ConfigContactsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2B4AFA29429D1000AB4848 /* ConfigContactsSpec.swift */; }; FD37E9C328A1C6F3003AE748 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD37E9C228A1C6F3003AE748 /* ThemeManager.swift */; }; FD37E9C628A1D4EC003AE748 /* Theme+ClassicDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD37E9C528A1D4EC003AE748 /* Theme+ClassicDark.swift */; }; FD37E9C828A1D73F003AE748 /* Theme+Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD37E9C728A1D73F003AE748 /* Theme+Colors.swift */; }; @@ -1705,6 +1706,7 @@ FD245C612850664300B966DD /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; FD28A4F527EAD44C00FF65E7 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; FD2AAAEF28ED57B500A49611 /* SynchronousStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SynchronousStorage.swift; sourceTree = ""; }; + FD2B4AFA29429D1000AB4848 /* ConfigContactsSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigContactsSpec.swift; sourceTree = ""; }; FD37E9C228A1C6F3003AE748 /* ThemeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = ""; }; FD37E9C528A1D4EC003AE748 /* Theme+ClassicDark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+ClassicDark.swift"; sourceTree = ""; }; FD37E9C728A1D73F003AE748 /* Theme+Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+Colors.swift"; sourceTree = ""; }; @@ -4014,6 +4016,7 @@ FD8ECF802934385900C0D1BB /* LibSessionUtil */ = { isa = PBXGroup; children = ( + FD2B4AFA29429D1000AB4848 /* ConfigContactsSpec.swift */, FD8ECF812934387A00C0D1BB /* ConfigUserProfileSpec.swift */, ); path = LibSessionUtil; @@ -6007,6 +6010,7 @@ FD078E5227E1760A000769AF /* OGMDependencyExtensions.swift in Sources */, FD859EFC27C2F60700510D0C /* MockEd25519.swift in Sources */, FDC290A627D860CE005DAE71 /* Mock.swift in Sources */, + FD2B4AFB29429D1000AB4848 /* ConfigContactsSpec.swift in Sources */, FD83B9C027CF2294005E1583 /* TestConstants.swift in Sources */, FD3C906F27E43E8700CD579F /* MockBox.swift in Sources */, FDC4389A27BA002500C60D73 /* OpenGroupAPISpec.swift in Sources */, diff --git a/SessionMessagingKit/Database/Models/SharedConfigDump.swift b/SessionMessagingKit/Database/Models/SharedConfigDump.swift index c5278a68f..ab22c481f 100644 --- a/SessionMessagingKit/Database/Models/SharedConfigDump.swift +++ b/SessionMessagingKit/Database/Models/SharedConfigDump.swift @@ -15,6 +15,7 @@ public struct ConfigDump: Codable, Equatable, Hashable, Identifiable, FetchableR public enum Variant: String, Codable, DatabaseValueConvertible, CaseIterable { case userProfile + case contacts } public var id: Variant { variant } @@ -32,6 +33,7 @@ public extension ConfigDump.Variant { var configMessageKind: SharedConfigMessage.Kind { switch self { case .userProfile: return .userProfile + case .contacts: return .contacts } } } diff --git a/SessionMessagingKit/LibSessionUtil/SessionUtil.swift b/SessionMessagingKit/LibSessionUtil/SessionUtil.swift index 32c29557d..7f295e39a 100644 --- a/SessionMessagingKit/LibSessionUtil/SessionUtil.swift +++ b/SessionMessagingKit/LibSessionUtil/SessionUtil.swift @@ -24,6 +24,7 @@ import SessionUtilitiesKit // MARK: - Configs private static var userProfileConfig: Atomic?> = Atomic(nil) + private static var contactsConfig: Atomic?> = Atomic(nil) // MARK: - Variables @@ -32,6 +33,9 @@ import SessionUtilitiesKit switch variant { case .userProfile: return (userProfileConfig.wrappedValue.map { config_needs_push($0) } ?? false) + + case .contacts: + return (contactsConfig.wrappedValue.map { config_needs_push($0) } ?? false) } } } @@ -40,6 +44,7 @@ import SessionUtilitiesKit private static func config(for variant: ConfigDump.Variant) -> Atomic?> { switch variant { case .userProfile: return SessionUtil.userProfileConfig + case .contacts: return SessionUtil.contactsConfig } } @@ -49,6 +54,7 @@ import SessionUtilitiesKit guard let secretKey: [UInt8] = ed25519SecretKey else { return } SessionUtil.userProfileConfig.mutate { $0 = loadState(for: .userProfile, secretKey: secretKey) } + SessionUtil.contactsConfig.mutate { $0 = loadState(for: .contacts, secretKey: secretKey) } } private static func loadState( @@ -73,17 +79,17 @@ import SessionUtilitiesKit // Setup initial variables (including getting the memory address for any cached data) var conf: UnsafeMutablePointer? = nil let error: UnsafeMutablePointer? = nil - let cachedDump: (data: UnsafePointer, length: Int)? = cachedData?.withUnsafeBytes { unsafeBytes in + let cachedDump: (data: UnsafePointer, length: Int)? = cachedData?.withUnsafeBytes { unsafeBytes in return unsafeBytes.baseAddress.map { ( - $0.assumingMemoryBound(to: CChar.self), + $0.assumingMemoryBound(to: UInt8.self), unsafeBytes.count ) } } // No need to deallocate the `cachedDump.data` as it'll automatically be cleaned up by - // the `cachedData` lifecycle, but need to deallocate the `error` if it gets set + // the `cachedDump` lifecycle, but need to deallocate the `error` if it gets set defer { error?.deallocate() } @@ -94,6 +100,9 @@ import SessionUtilitiesKit switch variant { case .userProfile: return user_profile_init(&conf, &secretKey, cachedDump?.data, (cachedDump?.length ?? 0), error) + + case .contacts: + return contacts_init(&conf, &secretKey, cachedDump?.data, (cachedDump?.length ?? 0), error) } }() diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64/libsession-util.a b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64/libsession-util.a index 5e58f5b33459945aa3200c0bec0d318957eb4ba5..3f991bb6aadfa330a62538ad0adf8abfb0b9eb53 100644 GIT binary patch delta 80499 zcmce<4_K6C_Q!oc^9P1MDk{okC}>uwV4$c_PL8RmMTts<1u-NR8YvmQPO5Pl^GQk6>U~lQ@IybY&pAWZ?*4wi>w2&Eo$G?nbN<}t zKKI|}nE`GZKT9rKn_3Y)bX@Y7q%n!HvEvda#Ky*sA2)97xY(q`#PP|=v9T#*QYMVw z>^R?Tzfh?k6<$*{RVSPyB#?f%iP@zwdx^YL~8Fc{cMZ;r^K{$BNu^70WeJ zevA8RR&=E?S6<6}br$oy*&<7U0g`Bz@LSQZ6Zt!7X+kWQ+Zo23C-Mg2_d<8ZPe?7knpA6tiND5GrtdWQv`EwU*^00m>vC@-`Nbh)hsEvQn*W~ z4PeIv;XL7MVqc4iOI`k?@I#^HBGx}8th|`zKMNPcvHYMxx2BejV8wRf%fb#}pOI`& z6<(6Va-PVWgwF}T6o!vtzZ7AfuvYjU(Tx@)$Ft)Cp)Q=6!1_AjgQHoVdBrkA=qr%PooRy$3VX$1ooe`>mqiA^MMn z-;8y$<5qE)HiYG;gh8^rRwc9kuyFJ^mX8P@9?$X@!lVf-FG&%mGK(%{Zn%uO-#w8p zdR@-Uoy2^_$*h{p{QL^$>8Z@yZ(>#oUleu-Bi1NYc*3F@aktzHs`U&QdO z$PY?^{i5H%1=PSr9N;ry&8;k7bvyHN@oNw{OM2p4iBnR*e%3pPZi}iD!>Dy^$TJKU z)$2Bvw~75;>8V%6{-}%XrDFfP*oQ4<{l`*%;+-s)h+nzLcafhPV{}v$!%Nt4x(vZ5 z63DiM_4yLuU%4#bByxe2+b%7gEc#jV*>CPLX0qt(MP7)wZki;6#jryv+Lgxz<`gnl z3TuTe!kJ6i{UMg%8&fCWN z&BFdV%hwAJ2!~a({$r+FMLxueSA}ugSN}yo2p831e$mUN8JfIC>}RUBdms z6T$(1BD*_C6&V*n>WJ|2U0g6n=n+08{9M?(mi?9p9}#{i9Q82UXA9lJy}}C~f!&QU z8SyAP?i7A1oLa~Fr-fmUv79Gt6!v?9^?kj}-u29r!VSAw-u@)>jBr>3);~>(Yj8ol zL-?BTgmB;|3w3EveeDH!t% zX7vNX>N(-UeJr;(GS7&9lE`-9DU>(L3Co^ldCpUAzPLmb6%wFbj*sa&$Q&dAe|?eVr-jAB6Vi}}rKS79%&Tqc zLojiUO_d*JW*T(cRDvi@zs81lgmuE@!db#t;m;DVe+!p8@jCN>P!|>orw9iMzoL5G z$f#KocpZT%7TVMg!e`%LIZo&iUMJilezyuQ6MilB>2G3km)KNa;Sgbx@Fvhr4n?B) z6WF%KrdGbiyiqtoXczt@exC>r2sa7~T2b-+HdPIOVx#aK;YndgE8YL$Fj5N46y7hq z<87s4AF`=ug_Xjqg%=Bhg?~di@_$XZTNwV1QjL$;)Z}-WqlEq5#rh}1PvTG`JS;pa z{0J40-`B#Qgcpf@gD_vXM>t71S6G0G6ZhEEcHwt!xv;je;cbzh5#AuYS9k&Zy!&nH zDq*tl?)Q}He#xd>kcsyQpA-H~c)s|}61w-w#ovVX_c_2+VTo|B@R-p40sGAqe%B89 z9h*A*A@fqm7To@!gi3F+q5#g*)mGZwFs-`18aiMV6r&#}_SSbz zTlg8+abcMHNf_}3%WsI>=S%oI!&ENx#4Cj#`dR*7I7;+2B0n#5uaOIv&?$@-o{@qd z3;!GlB)nUAEfVRT9i|e61;S0jeZr|o2uj6;ZwpbL^ljKiQ--<@E+K5XPCP7ZE@H&cA%;(d^F+T0Yg~NpB{T;XO z&oJqPtAsoL?q)+XG9rgI;ZMTzPO$zmVZLya@M+;uVem=zPZrJ--YxVBKM?-YEf<$b zMj8LWGvCQDRouzU5?&!3CJYmHf5(0=qCAyr6&@D`OT1yi%Y-FDca>Z;3f~j{AdHd< z#tLT%3x!*R4Z_31FNE(QQRgq1oWf?|CZ=2cLlnJEDK*0suAT>NvEk}7p;K5Q+$Q|_ zd#sKN!`0`)VBvYf6yaQ9f$$#TZiDV{^|~kq{-9J!e7MRNCJAQVXKZH#`vAt9{TNo>RS^Uhx z2#NcMuunJkg}LEsr0^${bCcq)xFAjuLk`%M8Lrj}9|wImq2)j0@j5qLojlEaU-+DG zyKt#+uJCeUys)3JyBq7D0@D<^=!iZnFK(g=_;eEmk5zHs%luvSNO> z;v+*5uHF=0Ci+3bYM~EIX$x2X5PmBBRk%ku)S{`(@4{7YVX|*X&j{AshQo~#=vLuwuyaT+RW58177M=s<1Xl> zZV1ydSqrFJVj{)=v=@2y28d3cnJLmv}b`*9)H%ejw~-y48@r zT)`&Lb4M?=LO4-4U-$~>T-{6U6;=yB5}p8ko?hycNbDCId#OGHn3oH07q08a`jZCT zz0?b$FbOmIv%@CgOTzDj7fA)z2}^}f3kQo|hQzx__z)6sJ%q#tV#uE8rCx_z;>JY- zU4V1NkSP2{^s69uKHW=g7akP;RoFL5Q-y!-r7pBH|0(jz!Ybiy!pns>z~4;;H{ind zdN1V_z5{l@(Mvhb!#$y`mpTEN7$Nd)VBx2|lt;J|tT@(7eIYz33>n1w1Tep&mzpMA z2bP`crQRHb^-mYMqIg*N%=zf5AA6}F;S6DsaGNkr_;-{e{|_M7{?bcb9}PLIw^}27 zOgLpQ>(3W*BxJ-DO5G`+7w z8>qKAv^n%`=rhg>URbK{8y!67na-+>vHCWXw@8n$2luHAdufOz|Ju1@D>o01tejMB zt?azEj~-hP^h9N^%D%d5n#D4#ICp+=&cemFE=gXvxOmC5IZ5N^FIh~=WjS)8ZyseC z*jEI0Em)G9SNYWRYxD;aESFVwzcj#z72XqTN)k7sGJWdBm5I+-^oFEht}pgnpE+0m zm)iQATicW||A$~>rv0a2l}oRR9GEgi8kCf@Y(a6(Ed@*F-@YKPa_R8s%Gw9*+AZW1 z^_$Zea>^|%ELyVSk6!)%;I(++{M+@;OM+8ObH~#t4Y2>_Fz(ziIol=#kLQ{~dR+8A zmjq9*OgK1vSdVHf3ZWs_&P~io8gp(R=xd*`3>e(wH*P^u?y?2buAQ5dld`ZFLh+I! z!=?A{U36_i@HpL{7#umI$Iw$CDKUq}(HPOnm#-NZ`R^`;g=9D< z)8H-Nu-{abg|q*t$=zxX>#1UDQsr9x!pg>%J?C`&*xS(cONw&l7cIyw=G@!%S*-fN zU#$_ph1Nfb3LaEh{>nM3%KBGE_UegEVQ6^uh{WK*M&Uj^wsE&CxNYHL)E)KPyy)qX zVO=P#I9dFt)~89i$PBbt+%TYwo#BRX^L*qmw8 zrX`Kf$yu^EXVrqDB@$uU3L}fT#ba|YPyT!0dH-|ZF-d<6oO9=b+}r=J(Wm~;(WfT< zUjzNNC;Z3uW2#(o!#sWGAj>}e!MNakdS|6&U*$^~y`M=fxX7d@4z}c0j(+1JJ@zq+ zP5*mbP*~;0izm3}Cg;qYJD&P){KCb{78DiFMBgT%#dj9v7Us~R!Dh=2My(4L=iXAV zAZOvNGc$8@mlchfkdw0zTVP>f(uAB_mlWNZTZEM&OKoNb;*ML9Td;h=vZAE%DR#e!*f=wD_BjjU{3;~3pDVW-j5$UtNN zx5;t-|1f-&ecZSIG34C;mm!xv{cj@5q<(Jx%Q@Lac^Af%NAn2FT{LXmV-&QFz=bA&*p{dCoc(}tiO9naP%`3z7=`8Z-o|V zrC$I~)Mt+ljoP1bp%yvFP$cPVPlVd{FPx;^K0y@w-Uzqfb83Z#FB87Z`%kT~?6^*h zv$u!Ytx1U~V-oeft(F`6`QO4v8+gT;nf|x*L2p|w9~iNnWzw5)X?qtRN?Y~OPHoKK zfUO~feNuL^j~5@OX!_aK$WR@REB)#c&C##0jx}#vnAK0{`_i=` zdf_{kSi7U1l^=&P7c?;Secy*f=?^-!p@Z#BtcsKJ&izVJ{*6fBP9uSB(?f?wH?vo5 ze`fv*?3IttK+JmXT%;NCR`{^XH02NG2H4@~!aJXO4L?H|0sTg$!k|m%0ICI~ueJD^ z2_F}wJ$8TRyOzWx-FchI9-ZS+r(8;9zD64m6XJ6yo5x{0bw#(W)6^YvRHgbaP@D0N z>iw_atw&sC8q*u4C#%i*CUtrM1@~_;MeE&{neud3hACoyqGpY^>7DNf+4Lj%rU<>e zuW82qiJ{i^^Y!!)t7m`2Mb@!b#>A*BrLt^CO)B4Z#H8x92%kx{X({CUCBNSLh_WC0Rws>wi09D&GIMCD!pKJ+{c|)F$X5UzuX|7ZzE2 z+xEZJ5p+h|zj3wo2eW?bx2CCj-?i2;dh9<;)%tCJH{G-U&9&CYEvAU=`l^#bLrl)? z`u3ASm%F_(?cy;a^up)qG_q3-0pD81ZnudBb2H`~dq==7ljlgk-`gX1aJe(l%oG3v zDf39_v+l7@?wel2#{417czyB*p?3ZGd#q8z3dPob0ozF-6MRyx zb_|zWt*@=J+HGT5nySxE)S^tTv3h8@IVPZuH0mGW5vL;vd2YWQlaQI?IEY=J{fo(N z6RAqq%22_0wnggi=^;H*oqp^DO5)U~f zVuX=#NV|yTY<1Cy;U#5@d&HL?LWUxB>q+Q>5Kn5rm&VT~5|2bkwTL$Ty}jW*Mw^~{ zAL8^B+_w$siWIBQ9$@Z~ILrvY81Z8dnn*qKAmUG4ciW|b9A;Ms+2cgY{DXI*cu%}6 z;GMJ~%&uLg|EybMY@*~EO_`VJgSH083>9rHN}M}6oD%BHW%{L+)|mW>9I*~KH@|do zYY;mvv~%qRVy|{^dD?`}wU>*1>g8;Y-I`>Ma_5QUh3mOV)rxnxlf4Tu)6ccHihcDJ zY(E2>TU+EV)|X6S;^VU4*^}AsR;4lkzCQ%WkN{JsaezY9er^K!VsDxu_CGYhC-&i2 zvHg$T;WzBJ@8WlCq%RuXRr?2QIr_2%Osk-C~cpf$ibc-y@<$ zqO8yLwmr;Vd18;(XCDi*$BERAmY=)N*aO}-aj9ry<(WJ;>8s{wLrmquYJ)L0@tU!9 zA6A116ZO7*&Gw;L9AG$dIk$o`sUR&|A4Cz;UHXm0f?WN^x!RDB@cCRWTu*u`)NY!u z^!xjphuB1GF=A`;^+h|wVgkw(J?ZLTdqA@DUa`8Tgs};EekYD76*21%*?A>9e;#My z()-R1wQCEE){jVAz*>AH{JS>!q*TVOf!x<_vf8yWrMh`nSX+mHRh9{ULEvoHhc6$^Wxb7o%(+efO^1?*7z2Zu}vpcb>;BRgo1 z_;QssMw30bdM>67opW?9HmIu|JvF_T65;{tjOrw6X6kdsSUwCnHv3-^~ImeO^t z8i7PAFb31@6Y;WgzHTe;X>E7+c9{(WB_5PQQ)w&(pJ{!zA%R1tTv zgXa$pv5&I8Vl^{d-xp=JYpeB3w^@gT_%}#c{mX5b4`uo)(%SB0EjlUE92JsT&SI6m zcAFKwvWdkOwl-C;SfVGDV~%fTDNBF(>EEOheIGh-#um1@kRqDdbN5M+6kU~U_W*F| zv1f|iFZPN0(r}~|y^Y;@bBPnF8YRyyoG*oaI(u96Q<2ySdZf)*!vQJ9NYhr$o)~p{ zauCU)=T>0Uf0Ooy+v7wcoLgt3)Y&X{mp)WS*@q-wecwWKjYxKVUoi3!DUG`=V54m_ zq_)RqJSUv|ozWtXkl{K#tGHqFDV1;(+@h(3Dv?V>P82yBJg8Kfo#{~E6Yy_C!Y@MK z%5*e=cTcY9ZEtf)^K*KrKiamxGa*bY;R)&D3biTHuk z5|_x$cPdp2IT<8<)(Tm^AjM4tDQ=|57BCz?QB3eJ=jGK3((*U}((-5oX%(yn@#E)& zZafg+N1F+4AXU%^(sC;Xspkqo>Zt?El$sA#feXMxg`7Y$xDs-s$X=owiW)JLf@9HD z9%god=(9j-L59f5Y%fS;W=D&io|Gt_0`CC3@Emms;&n2!PlA-dF_7XN0^L-h4;Nr| z1DFii%gin#2RIgk6fhs8fO*Vp7f1m!K?;}xQoLklb}UHoqM6xe7PH?;km4R&jP*}} zk3d0z+nL#IAO&s#DX*Dv$zKFtZCl3YZ5{yiAbdWiYeTL5ep6q4#T&jD z%Zyqc2?Yg=U}m4WgC|cHNP$m+6xa_^;G@j!BOnEC11YcvB>xhS{0l(x&u3=mf#jbB z8a?L51)f9_;z7FUD3CHcQ^1LJgC(&0K}zr_GrJXB1AQZipBfi5Fth3Jm1#8c2k zh7R_|D;XMom zXaS?ZG>{UG1|z|)Tb05ucO;a9eZVa6Rxll;ax*}q>%j@M{u4!E11SLu)6u+uD{f*s zDnJTU3{qlKK|Iu?Ihl?)kRHjp^RN#<-^Fws1*zh8kSg|pG$geo(`2a@Lq14jGy|jx zeDisX=zS&?%m*XzXhs~43i3oILUzm$nMn4jA`{8(1SxJDNbzDp_gq{=;({2T%VT=d z#q7#q;^Su35B6x0vu!xeQiQl77vjZT#Cf%m<~@C)<1P= zArzEZ21sM)x`_j1ffP7VAyQowl#6anUfN9OUK-vq8l+(xFu3*t_nR>ySI zfYjg$H!iAhQ3`&9N#OzU?2xva=_nR^0Z19=fgi)}Vmh+G7$la-bYy@OCmqDIMp_!v zF%_hG$}_p*Qt)&5x$|*BW0J>oxIkJ3SxiR+NMmXdy%PQE86&He3u0WV?*s=cUn4l;a(!~%BQi~%%3K-6Gv|YymT7`!|@@o{i zL0BvLLScq*B1kPy20upJL?XJ%5swQR!#JiR8l*`_OoZMpG7+*P5~N9YGD9gBcnn;H zfPSXq5J(RmwctwVYnYBI@J`4TOh*~$rdhZe7u3bYAni;AAiYP+2PtD0NEv4_9ho2{ zoWXRYgCC(>8dw6q8BB*0q_`2F(UVMv1*9I&n~SMJ2G?A}!J(LGXXdc%W2PMtxf=W% zDsq9;^%-JM7kfDPCG3Z0a|N}aAM#WXZ#D~@%;qM+A_~v&2!`^NG+@ZX^u<;X;yb%#T9okvs*!$BZoj5%4U!n*a*^J z6s9%M1ty^vq_L@EI%>gB5V!`!Gf7%C(@_CZ3-dvm-4nrgz*vwfvV&BS4Wv19Y$mf^ zcmSjXnm{*Ajz(Ni0u3M~;AJ{$K$;swnj6(36KQT#fiyP?K$;UXK->t^rZOE9!8;(Q zFdc~?_1JKb8qhrh>;Esvyln=zpb?}NctL7G6-X^87A6b3rnA09SS2h5sbvKq&7FLv zBM+px<6=58Kx$aVbo4)MvFV~9(iWQrQp<*eH0v$kI`HU~yydooCREVIbTomt!0rV# z=G zGMJ8ZkSa<8Z-w6sro#zRMJXV~Nd&2@?Mz1mXk{UW!E{UoDPbo#AAS>wn17CBTu?>vpwY!3 zWgN?NM1z#Eo#}`KDd7n47WjoT9Tt${9J+!NE&(agLXZ;80BJQjMV}11NnsH~$7Io%j*}p5Kz@)C zYgtn|WP=hm3u{56 zM?j-T+O%n(2rHspU41 zTCPA!#NB;4k8u~%(FxKRpJX~ZKg5EQ0GL>)C*FkwIF3$0a68JU^bp; zN}1Un@IJ_^nb{>E{otV(!~qe1br#GVPJ!=3@Uap6c42MZVl$L`DcskITL z{h%1A8k-4LSr;gBn5V(S}R0{;xzqFBG7o z7Nkt8L27XYNJCT3bd-TKG^I?32c$r&LEK-`N|=s9km4Lol>|VVoUI_;OJORIB=_^pK^jPL;=xGh-NWS~8te~6XEHmK3kyLCm*TgZihlBS+j%8*?fDb|rXJ*^Lc_`;k;wPIX5ZiuQ zBh%ppu^Xq=F&#A^HDEPJbE6pSRMW9>By!g`gVgnTAZ4BfQs(I(B{&151gA2yoggJR zk*L4;oHfQxaqSQv2HP*;a1~%3QU%hgw-IG&jcx*c;U$ePU{#* z9e)6f#DFyk8xoX$(|&8nLNa#8b7id{H9Aq)j%7-n*v8Cm1!>;xYX0+9N^1xDbKI0ox5OJpKs$DtAY zfntqtHTVwV6oVgt86qcwl&)oj>StUWLT$#*0&daQG+QrDje@=NV&2e>g4CRLkao~E zW_Bw`J7^0t`w*C=f7Wb`GKSI%k&4xVRIG-XT@6yPDrR;CNE>fCh*_Cd#&mcXy4UvcU{P{!wJ3%Go9{z4fGMBKRH~fS&)4o&7xY6{7S*M!4eR& zJ*}AO$Oqe?&lGzah*_RCgXx$Gz7KocaJ26+1hhdx^MOe7!6Gt|=0o=d@>ZIe-3CrT zxfXB>B?MyXrPVMU<)qhN{4?4|-Qk2t?h`?pF3G}pa)TTVlAlH7lfzg(0%BDqq=7VU z6G7_k6lQiJNag7iY$_iq^0A@p=O3y@Qi1F?D9E7zqz<%$-4t8&U9n0H(AT_RjXICw z)j*`?R5KlA;1+!k%@PzO^$ znvRL!jc8sxGdm6}gFKv>9XkZK=^Nk}4Fy(Snw{y00BJgQ4OZ$}@F?g7ec)AKcQif) zCp$<#89fP7BJCh0a!6Pq`ZAGAgf3xpw3`cbozH9&HVNZ|orBn(4q~b&B#ImV<7zq_XtRdd4(my^l-VLGp@Jj*Su(rNur5y#?C$11yT=oGP6&D)Po(& z>|@{!`py@vQM0MPS|IjEdIvz-!W%$i{Dm%%=35psJ45vJyYb}L9>t6R({$@g){B#j z`0Ji ze|RW9yTWL^jJr3rvmk`yq=OVE9Hck}HfAJflmltsP$G8+bGZ(X_7OjrjcI$7nSBJL z+gdv_yA7nfS}TZwO=}6pzJd#f4+>frb>Mce2Hb#x)y(WFuoQ9yGrIsxho1|iMB_k8 zFczc)BS31{$slHnuvu6EQo?0HY5e}86pD|LhzF$i7ps|$LJ*Uuj!5qt3PdK-+lG8_ z9s)T*m!{u*k9nZ!7EOQPY|udWTIjp1+^`n#Zx~T8NN+3ZKuWjnC7dVvOp)V- zT^6<<0V(k|5c#IHG94`-<$Z|h@L7}@Z;bTbW#)mm7(ELE6|CU`Y1K?e6&FaWU^+@c zYA}%+>=Btr4PFgWgEK(d3=$1){ZsHo{b(TkW^OP21~{sJDNubgWU9UqJc_&Yc;9=jEU>-1X2Iud(8ul2e}%^e?|YV z7RG|q|8|i2-v(0uAJdpVA@+DfUn0yGqAQH{#DO#p!}FJ`c8l&7hC|_sV`; zG(+(mNF(_yNF&$;)`G8rG(z_va2c2YdO)hU1T=w#;0iDwG=na18JG!Lz;tjqI0L*B zbb?F46f+(H9zz9*P-sxZfyH1fSOnTZD;NO=fj00$up2$J5u_A#eFQuNeH%zEYXRdyn#APS3~qzH z5v&5e;1;kJ+zeKO6(D*;JqVV84}czU6IcS4azztv`I17veuK{C0Oyu5n@M)mfz=8TPwGQX0h2TbdAk{;=`3^my4S!^`L%*iYdI_+m&3ZBS9z4mp1mDP+_BpC_ z+x1$sX@{l{xn8@-aP(ohl4CPyLx@aemW$%~UtPalQ%Pz4L7*Z(c*5%~YFLhwtTi6?qnO_0pQ9wM&CdO-q}XTFl;} zhN8wIi}^^=(IS6Qu&HHP>#|@|ck!9xU{m?>isiwk(&c6N?p@wM*DK0a1e*&-lz3JKn;KR%t_n8!Rvp6k=2Zvq{pcz`zIU$b!uO6< zC-J>}b;W7~T3v_l)vIgpy=`?nzWdi4TN7;RTGNg1C)af1yZ7#fyERkI-QK%R_+EQ= zu&K&jji#2nEAaiy-5zT8TCHiVhKts$U3jVEKBjf_P?~<{>t%*P4kf>$O&*Z@qSiSiVuK*a+5c)ar=U8?_qZfsLAv*tSt? z-{{6g%SNr$a46Gi${;tCX^q6XGR;eDDbresN6R!nvAs+?LM*>etGExWy-%wnR^O-9 z5UcLjs_zGV_iKlUN6NLM4R`6B#yX?Zl1;w382j{s**U#I^^t zcH*HeTFVynO!F2EmnPzYEzmbsYE6}(w^C~$R#$2@2DfT8TOl`W)f$O)TQ%=i&0_A_ zs&#MG&XDR@wboG$y1fr+4G-a>^C7M4A^0?I*P6C#&D%+}UF#y2?$FA1fM>RA9%91| zt&!;8p&i?SwAy!QxHJ)ukiK-MR<@J;Ycvn>WR2EY1A2C8rMtkkU0VAtR8?K8)wpZ5 z+FIz!AJHlvfzJ1ccIXkUkL)7tC61CMFG$G|g>X`aVH|Kr**V!2nV@PaK~t(ADx ztNDrTUhN36re3S9M|u_Y8ZJ%5s(R@C_1ZCF<8G~KH;un{x7M&5tlq8F5X&31iUzP{ zkJh?JvzdH*wL^Qs=DpehV)tI{%wE_}?$tVpo<^;-5j@tYbr6p>YJOtt(^}ipp#N#@ z81cx{+EL<}r!~(rVB<4dllvKDSoe&EYpnifG%p$2o3tZMU~7}sMm*4@`G|GTYu@L< zLx;7N!{D*QS_iS~4XyhP(D$Zx=uNQcEv@-2u(VYxYXxiCwAwbX?LDpiJ+Se8t?7NR z;X}>c_#s-<@UhnTF?jT2%}+e@vF7;%?D#}GNj&#ABap9Yo(3+MzE%?-y>Zfi60~(7K3?eyzz5 zdcM?3zXYqgwCXNoda}&aS!Tje)tDM;z_Q0p<&T4PkDI)Yn=mwwn+^~gA2&6T-ur~9 z;R(nGo-p}{O;4DbpD%?+jl4JKa$F3&WWJbO%+m+rx}XRoPruc>S=E^D7M)jehM zK7}Cur%cC)o<>t?BiOpn)V2?-e%e&?H1>YFolO21ALKadNxsj4!==BM7q5kk_b7owOa{@D@;UN5R338Mqa1(L-H;Lg)&`b8S!2lfj|ie@S8_k!N!O^^y2DNrFzixu91H$*7=28qn=w`6-dFCK(M19HBw~45POd-(C|3 z`dun=2%MoYE(9`emw~^&esu)Pfj=s5q!z(HaHhtm)I(^oUs`;a5`x?*@&P=eP(1s5 zN*6yQqw;QKJZ?8D{vj<)7kQ<~St55z4;732zVy&akzX@fgj@TQ9B=V$r~q%AO^>nc zSq~ZYm5cu%Bz02T@G4-Xe;7klVp$as?R;GHwQQUd;BucQhzWf}eu+kc@3 zpoapdid==yd#MKkr;F%!)4L)h5G)lwNi9NwzzHLGBWzR{D;2&kJupH1Gx1PH0Rw-S z`@>o;A2@~NnDpRS@xMvraUwswQCg5Hid&?MZWQ@A1w?`miF}0o(Zax=#A;-R9Qcdb z$u#DW%cKYB@9jvQDDtNs$Y`LihI^>gEt4p49?E;2`C#@LBQ8 zLu5KZg6x?hUptfKERnONhn#=n@~zX^en#v;(%=O~f)I9!Vx(kz548X-4jch8lQO0` zAoc??iQW*oP+Ax`5~Nb%o!7_-6p)N~fg?e_mLZ6sA%IOymw+cF;7c;gqn_db!=%e< zrA6;cfLIyBS14g5c(3@cq8@-ePUOpEhzdon^|1YA$W*`DN(mstz%e6}q{SK1f-@qg zh#W5dk-Ip-5z>Gc#QwC%yF^|>4MO~6@voHz2GQRy)9Wf3vkY-al8i^~;|l7eg)WgJ zWl{!?CF#2X6`1jnr1VI!453frWqUXQzsSEz4?63(ezkKL95AcXWuy6CTKv9L__S;^ zf#XHCQ9yKYp4jh29Fprqo<}lT+$9zMC>5qlf?nyNT=&!5!WdEP5qX_-(PtvRLJ1+D zr2lk{ERT~04VHMrq{rMY$!NQD@omp=fkK%?r=`HfG9;;D zpCChKmkO@WLxLK5@03RDdootm7V;MirhT2g{JG5WAb=Ta|iRCh^!c zQen!Y9Npn%kF1N*&%SO$7JcE!25#T)FUVmI8$)r5|%q;r)*ga85Q<>oC6-bOZ=sR zVI;#o(98CpXb7>JI@#`4<}2yLZJ!F9>hk1Nmg6^bfg7fU=NQeRjPWs82&T`-kt*a1+?BPzsUG2Dx<-i$S4PvjrzCy28FEZ?A zHFcVP={MGk`aN011p@9wY;F;%DP zZ+2KOcl#^Z|Fa7@tCm8Rhh5Ba;Gm?XB4?mg^m~5c`!KOej`t4jwAT68aPtbEDr@L4lG@j+aF<6Txi2nk%_fKXy zaE#WVTUn0FV*CC@EC&u@n==mbG*l2cONxFslq&RZ-~yqeS)N+P@-Oi$2abFC0J|Ic z$8FQ!{1!96QSO9usG=ZG&!#hZAxyV^@4|MfPu?-Y6SN|yI} zx%_HM0Oj9$oaKut0m$u7uzVFIU~zlY1EM&KO{Y(gPgO{d1Q|WzQ_a%C6Gn@Ds$1lB zhK&CyC9)p@sk~hp)Fkno67O!An}M^+ZW)LKtQZQlL|=3gLlHQka@1hs7y=bIqH;+z z%iZHS^ZVmiwul@o{&tan8p8Hs%uRaD7Jt`RmP3F(*gFE}Sf0nSTlJh|DHR6Jy&NwA z0!MYyFXvH!zzLf#U(9mgs80HwS+W;mveFB?gdqox)%;S*mq~&*8}Tu=1!ML5{%*Zq zTcdyZck3mles}8q{$ah_Gc?~SuUv$cPxu$K{zwdkNZAF#e zT^mv9smAeVqk|{!w=W2~CshBe$>&J^qJ!) z1TF#`FBfA17Zb*bWDe{f~c&A**Houv1j9%k>KlrlasmR_#Vz)9SC+J#!IezesR-%qXO zxkA7CVZ7GzS<=qie$$(98CQx`Xy&t|12(^vee$snkWcL{OupaFlI|Ca4TfG$<2&|& zLVeX;L6_TIqCZB3@G6s=8J`yY)J59Rep5wtSSEA9GCpm(!l}g$j*y!p{Y;TwDcHCu zeJ|=C$@O~%;4EouFZA;CVtQAwTX!vfw}Z|r?5`(I)`m`e0)JGAOeh&Uxz{W8E9iP2 zPo!9Xc(MvSywKl78(*2=oA^rZIZQe}Sod9T3fE)53JacB6=Ty*tu?6(8%}@5W>SG) zkl4IvQGQC!%j(pLs9l3bE?kt7qp79e2Jaf=)WSw$+g|!G{t_zGsy1WCJJn$h-M#kL zvl+kKHMzcP)+=70Ip;6PY>uAzvn4twR{0!pHk>7GqhFBlI3}G@^^@?+5-~278dHle zAHI~98WW4JT73D{%9s`{)t2Q;EmPeSw873TesllbXmO+~$cgrJ{ah<^P{1#jV3x-VujP7VSrU`HMlLY+srO>^2VP_PrQ{ z|3^+S`j=#U@Hmffe#=G{N*OJ54QWL}P0o%$EXaT0h2RN zEtMuw{v(r9XJ9e8A!A8b45g$cp-IuIr~|zkqtvP6piK)2&41;0ezT3t|D)sK-#Pww zzc;niU+$WUr8cGh>=bRY?#ea|ahrArdeUz;8D(RfYTr7W%J>nz8LR!Ty2$#%t0x*Wc)T zev(x!wQ0MyYtV&e`%-6O#V^vjCwyxT*}Vv(F>_pfLnz)@L3LvJd=G=9wR)q^Ng>1?!=& z2i<%_SD+PWM8468NTU(hOnVv;(EHH1GHFCEU84asg+j1-(tZ<)FQ*oQUbE>3XPeH8 zE*s`N9r{_xmJqax=26$#vr&F@Athnt=cb)5A60iC4NO=3vNifm^EqO%TdEDtJ*Hkh zoYX(1Ij+;(Jk+M`iM4nfwpyOSwg}8z`~s#e+<7`~xH@f9lZ_c|ix#~d`Z(xoF>5t7 zZlDq0^M1g$<=3;><0$WdQw!Q+i*uevo0@EiyevY7qY3fO(<8iC3dsoOo17Zw!xkMe zy(BIoxP&(RNoTC}lm3HEFI8*!`CDD`bw>IW9EAOhN{iy z;Vv9wKJP@W@oyt&Ve_KzFs8gZ;h|>$m-G1F%$z)O2{)uD_w1 znoPCipE*0;AA=bH*{JQz*=L{o^=#9wE7U$ysLI%Nv+RXtwHfD|rDn)pSa!vK-V3`P zRrP+{_T0P~@=ch6pIwxk(s8k~{@Wj%-5pP8_1`Wtbsx`hrqX_O{GdwhLjRq8Ri&Oa zYpG{1z}I|yt;d(ylzO(mw({&KQ|bvciuN_NuWEZP_BD!Y4D1wBDvc#=zNABA7aFbY zm~usGnMoy=-GTw3d!z}Qgmv;B*Shr+bJyVy!~6Oiu5}wGs(pthy2fmrsH{%da34i~ z=ZC7(XWgdyvwhU*+;!_F8fykU=>6f-6l_4_YuDds^r9YnttrxtxxATHHrj4%RK|X#qhEFDpe>2i?5Zjlvd%Pbv%sA2E9V6Q?9y7G=@id}X;f9W8gbliL$E*e0 zUl+OpPS4umhjARAT6Xrgfh1#wiKh+Sd}6f76Axo*&=%c+m3q(=X-t&?##9*s?=G28 ze{3AB*IDa>2D<}$(m;>eJYe|b`h%vB6IWn1`b<7YOQ`d-7rj-B-u>cNRsRM435pjz zPCa-Ps&oxgn>&8co}O{tm)}QWyWVYzdh4oRrc|DQ?)K}pexJD}Y)5FY+MJ`=PIQE* zj1gMYTO(i}0sW}c?ho8r=q)F%O1gjhi67L{Pww`AKS>KaF)yiXJ7#UuB(v>AK5pD` z!ROttPObTX#-HvBc+Ps?X7G>^cR-%Ck9;bCZ%TwY`NLE zKaKa{|H)7;9@JfidRx#LK6DTkRO&7)M%`Bt6m269`qFFrherm}ruTzc)9*YS-ZY?kzhQ2<@i$lc;upo&*Sh3X}ouPEN*}_w_|Yw9EKa<2;2Y{es69* zjz_l>Pfn(Xfm6fJbFMmWMkkJ%V#wc`C#Oz@E;m%$;|lUPzJ+b!ZcF{~M<=Hq*VK*4 z$46m1#U6irtn>6j@Y{>=oOg-y^rF4i`i0}w>Eo|XPF;w-{doWBB@3~))6_+SBHh1Q z>)rp!jzvRljn&r-2tOZBhiLZd0pWJ{+4bi4x^qHt4+z6OARPCAUiH6BG56d9X#ek6 z&+DpV{uQa%a+CdG+~SV&d8PW-zlJB^^%MQ;4}+!P>)?io{;@5_%J#2+)p$boug6Nq zY956|X^;ELs?6Br^o_3tUFGh;qNGXdU+*)vinDIqK=5GqzujhSzm$9sf_-e!XlMN- z42yGLCHAK>V}JVPu4~Y!G&JsN+~}^VM`L-TxPTi(k5l$GCuIg)@Ly&C1{O0Q`8Wm}6JSo$@d+{mFe6T2 zHuTJZuVn^Q{+Ai>NBe)70eXZdcz}CK$a|RlcrsVJmy3a=qX@*diOzhQvJd85#3(*nEHe6vGw)l$Zp!hy~_rq_+Pbd zei&tG4%TA!eF@okuY(7r)84b=>JOeBUvH~()_X4o@wDhQM|H>Gy?9JG9_a9tsBAt* z?RtHpcfB2YQ+-T?I^7X-7!O(96THhlq%C_w)A~8xbi2eypOO9-csC&14D8gk<_zQJ zVfbLD_L}FO-%Z=}%h+jX%l`dVt$+TFWstiT0h`SIje^E)@1Qj`4*$)n;~CRRFIrLi zsOh~g=Ua{Y&%yPBQV#xbehRe?&pSp-X>-RSH4-e71ly5d$HCW9^DTIqf5e&UwWx8^ zk#OMdMhWAwmlD3LC*vwSARuES;mO7$N#yQ8Vic_9m$T#hAjog`ntyKq`E~pY_pGP5 zXQ=Wri%Kr;hkF+ud6wg&1*4HU*3_0>Xyp2H8foT68bgOIlHTakP*SqSt@)hZ?Fuq_ zmvSB0)4TXdMo)4c{j+Z@=i_5o)N$6rb_WaF$oqnG@}2TqzJU)xB=0f* zQ|J7zeKSew`a%0`vVCp-|E6yyN#D5tL*MK=#C>yrVBSnlZK1vy={$`;&uq%aJChkS zfAH4F7}GDzskYweqgVf*_Rc@9sw(gId!KVS=Kx1M2*OcO4vLB<28s&BNlcymK}yP$ zl?Esz8YwB3P1eC;iprTVutmu{;^fSr<1|zhG?(f$@jRE(nZYM#hM93Dnz$3CQn9;ap1BzFXtqY3mRm=aKLW+M?7Q~IRAdJkuY{^JsW@iS)zwZA;{95kF0!_UA zj&0L8zVt^C^bAo_E>`wWR<1XU|rE48Y!n;-oi|%ISeoy zZgxJsNCNxQ!Y(qP^G4Vl4+Bo4$*eIVKd;Nk-_S1ft0(oZZ!(TAHcPzY8i=FI7}mo1 zI2(<}+2{VWMflrrBd_(JH=bMDKRG`u8qcH8;YR&sON{Z{%8Lk=nBqo5j;EElamNkD z$^4IH7|uoMJYSXdLixv_9#k7|Y8i{zH|7Tw$bGUv{@L1i7K6h~ z**8!dQMls7vNoa)$=ZlMw9gWCGJt2fXz|uNw%7urdtm<6h(9VQe%uSQ)qGinFrJkI z6~cIAG_rfhXu3koX#DIVQRpH~zu$6jA0F=Hj8D|SgIBTY1;ITh3O%O=J%{?7@ww1* zqKpfP8Ri@GoGAlc=UH`c*YjpTb{#yJo0UaBQB|o&$8ko$xXDqoIL}(I?O(|oko&If z7xk~&(_-u4^6Y&vMo(+l`p5Jh+?1Z5A1W?=*fBD^9us6NJk!B%-g6Ia)-2s8ap%bA z&%dIQ80cBddGO)dnAyOH>YRpFgAo;Cdhx0oN*pzqU;aYcKi(uUBnJXIp+k}!6-NK%k1E>!)VA~S=6}aY4^eq z?s@PPfPXzfxUZ}n2Rpd0JZ)5?eh4!=+M$24&JOkP1}zSTaD(=yGW0LmIp5~baE^u{ z+y(#2Y*=XiJ?{QFubVQ)uFB~CIsawKxUwX9`se)e--(#_Eis69Idbsxf5%WfdOwD4vZf4MUhn40^f@et4^e z|InvPzIkI8Wwok@H>1z~A#fb6laV1}8F%5%0?2#0STRX2AHcs_@^Bk4?&k_;5K)__Fxe z%n;w`e=WWhgYpMk#uXMfL(K2cF}w*QwsBXBG5l-F&BM{XDQI*zt_2v>g?CZNRPn?2 zZ6h#`#dlkH1(k&PcFbQ*?ak_c?~K+z71Ju_ih@40yM5o+`im`?-?|6yuQ4xQ{Gp}4 z2czeP@s@)d|AM)AgguXNoC!(NokyIQlzkVIwi_^Mi?_bd=u<-Xn)iwYnB)B6_p>nh zA3fQ)Ry=pFw)^(+^DrCiJeiM|C0&@D=ff8B-;PUXahSMimLF&j3$x4J-bo$NoVoU>N?Yzn8nEkkUmf`H$r)3|X zZxZ>lP#|41oHiQ^*eD;oV=(T5F}2M_9r6~PS)t7L4Sc`+F&4TO|0R&oZt0)%7>Y0k zZ-~tIWUK+|(mx5Y^PM)s+>R+vx>aJHhZDGTqwIvtp+w0OGb%B!laKis8lmxP&z)~7 zM!nN;ypCrGWLM<>%AVvYhcC@i(~KT(a*m0>16UkV`k(e5ar|?AMDyA<`zN|6_?sSU zRTJM6BX}WUwxUr(T9~-vZav1IuU>){tCye!K`%ki--njUH%D*dk8h6VX)5J?K zO}rS>#ETA|x2kDkbVq#jP^-C!g7{!bNP;n6EON$$+cH1G$`#|zOx+*%VD9%LWVRUZ zpUlkiMURYM-mftJcEm5rN4lb&ymex>4N3GZ35okE^O!#V2<0?j9%bK$V)|#yWA5LA z6)sN9`G;c8--0>+p?R2>QEt!rS=R%WpAAHW${iX>gHeWyQHChH`z&&bUFGK7U4z}_ z-K+7MMx0*~5_#j$M4Uk)*a|u6&f++O${Si~-!MX>j=nyEcm8ijfPV1r+UmnUB&l;93O(;&+oKEJ>2lNcFb(!#pd(lIB~V9|| zW5e5cYpY5*%A0lY%ml|lCtff1Om-d|I^W(kx!l*YQu}mZz8y{1>BP(OmvOre_D#SH zpcBKNT|UqC{r;+pKF|5hhqEq>#(ag}fTbQoALuY$xLZzz$bMpmIfI2t9Gs#s|I;PM zm*>gv8!_MX1E>h&wG_Lz1am|0bKSz$xozm`C~Z@wIF8qWMVy&Y5Wa?Rc{6!+B_ z60#4X_y;v<=Gobg*>k+2VL3AI$3HpWgg5LLi*iVeerWeimN5=3t^JtGX))$sfdkNoUCg8@*T+;M0^80$ky#B?Q zf_M!tk$bR+Yl@EZ^XH%AlmAqlzl#N087_TJCs zyRvuDo#tV2#9H;f45=PlQ#mQ?AXkCyyGJ|7x8Z!@J23Q@-e-xnap)H%_gOr0*gqPI z6|Y>snG@#B`t+YoU$K!sSwgY_U0Ce8$7_l6$9U%*bYjkhH;1?$=dwX?b=t?s?Cl6l zcQ4#u!)?ectOYxW;r(6QJkI^DcDf#ogRSVbn5<7J7eIaui_A9QweV}``&jha^l?x@ zo8LX7dB44gfmYnJY8cpSkEi&?r|2(V2{pK}~{ucEvcq`%5|q*Kf$Wr zNA&(4RDb9&tfARDum8aq4{w$V^eIxWc_xYz< zG9E;cCK$_wJ;v>pj-p`;--aUGzCt_r9PVry#$$cKxxDtNA=MK}1nU6#>gGi(hmHIG|8)u12 z=?0pk32?WyYT44 z@Wx^}G-j@PO5?;t9;Q$6;BKbWOrhbA$qA+qH9Puit~Bv5XD*APNhcnDx&|6X6rRaG z*JFH0KF0GjWPA_$%|F>^g#U_=1V5kDLx*9IMHx&%lL$k{;!|yaHG)zP#VTJp{y7iv zam;LTtPw8!fjns8&y=8*uc7<1GG60?+ep|)lVdzn5;d&bo|o|;-N$D6rN=0EB*A0< zybL4+OB%K4P&|N{%CDgl8M4xOmw~6q1wx^za(PJD#H>%lld;6=aLB~q3joX&@Xx>V`Rb-z-m-&C9a;&qK0@Qc(Ea| zc%YTyvS+kXb@>|}Sm@)*xHD*WXHW$fGk_{;I)e-Fm-(Z#n?%kJ%rvh@k?BpPToF*`K(2Fdq{m&toR$O`L07sgBE>c{%LCZkU7itc-UzZb(mxbWVK@ zdO8;K%*BmeK5n^xJ3TAC^TWJ!(_YWU?dk7s+-B&~-pM> zvrgQWtPTw+6S?*fw?7J1%u&~=M-7^sa^4-fH(u9IuEiT$PAC;)@`$Ss=W5QASHg|s zXN(OC1Z?`lBe7`EynZ>gkq^Iymr$Wv=)+zcCYW#=5xDm+nMdx;>tDJvzCUZ{e`GGf z{LP#9%su$#z2lbjA6cs%``DNO!ia|}cr{jlJ%pCR8#F&&adCAFM@44k++A1VetsVA z=U;7LD?N#kn{T`{+|ZSYb8p&WJrAm&QCOcJtS($}&P3x)O|fP*Be++A&tI7H zK@M+64mmwH`tF#$V-9e-Zj4bPPRMzf2E*qka%<5<&FQs`R?na{m`gT<@8$Z-;*nf` z=^48IlFKjsUs!)R3QHrn{?duJs!2iXFS#)S*C}jku^!rCjXF|!etz{SB(j8wyxV0Y z=zEwF48{E0sBeev{n$F@&|EBE_M)`zD-#IQFsXZOQ*j;%OrdBY8R*qt4e`D92YsKPG;8U1j;GUnm^_+w;u zq1f`QV~nST2U+h%2}GUjLgXiL&Kb#Kv}De1W+M|NXx;f}-R8_@HvCRv5O~k(IyxesC-oQqbS1ta-*ir5&2!9HC3)ce5BOg|R>`tR5K{a6^BfFk6Wxd#zf-mD$0 zWpBVe?pp|lyEya)dAo>u7Uy?Z;{EIhBTwdY1{Eb;{Gps3&A<1;?5KGwW)viv7h8e( zn&VHn55vc=G0!Q7T;%<9Ig-$hvIxaY>w~z-)YMGtr>F#TX}+o7FBbN?#x~#ZC;OH5 z=D;89kLn`g4g2TK-rw5mZ6f-`usG3m!XAh#N0a3eh@Hqr@%Iled`{0)|9%pGGg4uikJs&2a{E`W07Ly4IQX>0z${~zZ6m%+KaE|ft`GUqTaY@%_V zkk2*&HGltmw4-LUtakKaY%LLwblXSyzp8QdEq@6!e>!GqHO%~BvyAtPH$o4hbDJ|C zY|zCR0OWJxg_|PNpAEKe`IWdF&clp%TLbi0{Z7uj%2dbV0!<@)W5bI)H^5N-Jw_7- zR$V&UgQ1GuoPOp;7@p&?{L`{9?FF2RM~XuNerLX|Oe>tG;exAswR}y>chy+&t59bx z_-wiRxJ7Hz(`zi+S^Y3(mY@@?@8a*#EpQcUIWqiUd2f-v!ccJHCn}1a6&7oy?(EgA zb-Me6Zau6w!C;r);yiBCdMwz2(_(eE+O&3SBEC0ewRPLHUTYRUvSXt{Ctms3LQe2U zzp>}~ZuE6|RD6COhaSnF_Q0R3-GUGDAICWk!@V5m<+`iZf{(RhN>jOC!Jm&Vb2ZpC z{K$(7Kk3n+yISoUK1GW2<5p)q&aF`Cu-SIu)aE)HqVx6tA5MahAtx^$s_FD5=rmZWyc8JKd+oX^l>23p7LB ztz)#aq3+5t+Nm&ipI18@<_vhXa+mwCSF3V4`{T8yVeY=sTH7#pV6@ihk8t_Y7s?yecD^$&M;#cADcSAU{b7fJU6Bix#m5?s$!k^iKVl#uHNyO38H(erwJ1aD4~=(6m*DoSa&w~ zL(srnH6dsMHaL}Aon1Dq(%ObHIcjsm<%EsrMzL1mq)K;n>-a&f!mn`Shq@arF0|lQ z%W6Y!n3kn!SuQjZ{=B@bCh6uM?C8>PgOTnk(-veK0bLqeW1=fxOZjH9m%mqB?AjHA z*41G{gL3tRVCzj{cZk+vX|TcO-bme3br^;g=mddTRYCJY%@(ZXB*1R=EN_=RE5|A&nzh&%dQ!jYiqOM z_oSR?tyMZsm0oCAp{vWHl~!6r(r+!37saGFTiGO?0Uf{N!}A6`ZNR1npA5hwWSq1) zR;z%W3JW_>m4&4qu-V$|S{tGgN8Yh76lK4~GfH}n?iQ85wM2-u5WN%iIQ}3S{#>Ul z=#!`+nCQ0X^%hr;Mc2jXEg_ReU1=n6;7bJM1F}f%u|G0wleP@M6n~pmpv}XtA-Q*k z%xo_0u{^40F5Yx|LCJo=5bo#tJ? zxy-A13pN#Ax_OIt69jmQqW3J{a&F#KR%|kN>{mo~u9xL84YN-?wu@_`tscLUs^EeWU0`_Ozq3j^%_&_t@Zo7-z~5=KF#I4! zsPrEiewy+x!CgI%9rz0lkEM3TvAE|;6c#CkLQHh=VB5e{-9Q3XDSt1<10K2J^yik? z#bwwZ!J`oAMb-w?14_NqE&bDm_;)IQ*9hs~wdZN8$EgI5D0nr@gQqd$u!(uqA)X{9 zbs|@Yb0DH#We9J-jiXJZhNGBANvU{9F{W*h?yfPCtA`{jTlp8qN&oyI;q#S$JGQ#> zD2+0H(rq9$<|m*Qr>9B)L?auQWw+cN3z z64%69M@^OjOD#C2ETz0kDNhr}o$3xXkw%xLEp?Uff#g@7j}UjSWpw5?cE!s1GH14Zl@NiWZSBt4CiemYlQ1 zn<}^-{lgL)+NN}rXnr(ai6!e~TuKZK7NZLX`4$frTL+8oq9A3DGgyiZZ5bpA_YI*= zeY;Gc`Bm9mk(z?;+kQWeGF&&va3?^9^B>0v;!ZvaB201kl`~yhED?#-k&@TCp3@<(tr!30UJmI8b|}DP~kMt z1JVFLSj+@;f(+jQGJFfj@QonD9|jq|7G(Gukl}ZM#dvy1uD}Tm>;P$?5Tt?CAPuYn zX=7tNdDPk{{I4Ho0+CHVwSXy7k zqCpyPfi&O*X`m0inFe}68t4HTz6)gdPLSaPAj7wS4BrGYd_BnUbs)oIYT9oY*aZg~ zr~ql81Y~P2R?Jn*2H%GJ0?>``l#?&wXY8_+OhWdhfz+F(+)3&sDVd~R;#!pdaVUD= z@DdoU=vHhiz`Y>?1|)qAAO`j91CqWn@TUk@2;zE?oiFK2QtrL^GW;n?Uk^yVZb@H< zA16m)pc}(C6L1t{&f660K_;M1(pL%o2>zWnYT9RDm0};R1`Kxsq@8vpH-SuWqol7y z`L9y`{v35O4P-<~lD=+)qM;U$2AU*&Rp8IzUI9J@b|O2kgB>6fPy-$Uv%xMf6Fd!` z!sV6;ZcvN^Vc(zZktfN~ih*y-gtSWf4uDKRy`--MWRb51VLN-3q|d9|dvG;oM!F?^ zT_E*NNc!4AmUu1r8TvGin1&N@O%jOAC40dSK^OQ2sDU)t zf3-~5QSeR3hZT2#kx0OHN#APlFYxcnmUVtu(G4LRq^};N9T#XMUqEND1C4G&`zX9xkf1P4E_&Vh6ATpg?4E_~N zQw;bQONZ^?Bk))NegbBKO$d`N=}QB9P*o|CYn&I~M5Fd6JLO3-KU_|OJ3ty-rI-tHEYDVQw4x2HfP2?`)fhoGx=N7Y^Fd}P5gY-w zUMZ`VLp73ID7(|MacY$o(tH4Mo=1Tf+b{D=#ayMBrWB_s1)Czj9nXmQwR;+@0cmg-NP~rn zSs?Y|K+8NxgBJk z*DB_Mj3^sqMCl+S@+i4CO-9rXGM)yI@#KOC=TFYY2?J&-Vx6ENx6YJo0vSOSI2Eh} zr-1x&_NU+ukl}N{f1m`iCD)`W_tqJ*G4ccbjMxKGFWR7ATVqoSJ*k*xg+eFzG?))k zakb={G>{3I1~S4pMVDenigXVsHY(OD7Aj6tj3d$hlDjUI0UH!+6;~@JD)vm5dhLo8 zAlg}SsghGbG@s-+CHEw28mc?_IM_=)5Ve}TTFFVEAJvo`tsJ_hag`8a(;j!|@ z0&lX78;e~aOQIuAUW8h}bC3^!pMZ5>6RsV20j>FQ;;X?)4@SBw$u))G>rh+`($FH1 zV|o(E2=P|h7|R>M(~#4^{{VZT)CZmd&rlC!cqd5zzELtET_6+EISOr-DLD=YCZq#o zLXJwVsRz;3lj}fq;p9S)26GiN73)1RAtz#G!jFU0Yg24e+^(3bcs2&*kHjT+#>fCA zUA09l3EAgeIbj}t~@11rJy zC|N``ihQHRy7Pb-OR}*;jP$uc7Cqn5v8rf<2|E=jGgJXm&Ig|a`TO(C2!C(>GwmxJga**heC_=u*VzZyhG$X+GsTcF%C zLA2NGbV*+v_zvuQz%!s5d>!pC*@+Y8ynmQvr(zrU65LzCKCn@_*McmeN+t8x0vJAD zF$bi6wvrcsEczty&!AJuJubMT{Ux{Kghg5dvPgG;OkqAq!`Wa5=mLKY_J^y7RIn8} z>{Buc+1CsH26`PJ?H*RFQ_Kfh<*PtH4X5FRh7&90$^HcbGJA0%Z6W zkl`CZh9?>RfRaguuLl{v7;;{n(xU_X2yy_Vf1ToX#bU*2;K%S! z1UoTqcqP}wfhQq*B-c2>4Hk7-R|9vvBf9P2BW=HAX)n zzIWap>;GSH$BGy^;{tvMas&7W@Bqm4VnLdb-g1!XEmZESlsrwb&nEplL8co^dW>`* zmGrfPOm~~4FJQxa(=D2asIZUaXl0akFNo+jJ!p;bGxJ;qcPF?*(F?NlJs?|)6J+UQ zL6^aRB3B2|ov)!uuDc*pKxQWiWa~+k#8-@EEyPLs+`4wTk$#*QrRf6Q$REklbb`ze zu4USvzySC+uogsXy5b?DHQj1)#QN!+4QJ*j4rFWMJK0mX%VN6T#V_gQgD-%qz`uhz z;7`Cs;D3Wz;E%y{umNN~4uZ_bbD#%Y2Qs;9K_>4eP}4EMtiee?B3=!m5V%7;q6gdt zc7dqZ2n-&q&xm&L8884ggDoHv)Ce*hBGCD;R&g9sC`9b~vt#IHS$ zlVUg=0rSCMfvdnLz#Om+Tm=3A%mN<+(?J2IfcJt)U@hncn?N^+5iY_BJ`Vy$guDnL z^Y$!7uh5T%O!k!H(m`ilQVefJk$*HKU(^fyP(tU?5Kn%3nDMhV_7t$6(Sg+06#Fr7 zqRrWRLHc)r^baW3E0!yAz@~mFNPSUWYmJWMS(egBR~jj%Mt!Yynx$V8@Bbl zdcx|G3Brg)6VjzDl|0DEBPo?p5?Cf4B12lzTrSGg5^A7|&xJAu2&|FcPE`xLOSfdI||L z5?rqQw=4fr>Hn9#)^V~b%70+@x?5lZ9`;7i$Z!?xyNnFMh4w|@2X+}_mU7{Uz%U#U z5aUgCs+g&ce|ChHNd^s@Dc9=JnLG=?g&HkNgI%2N^~$|maXZKuNLX0y{$xp~)Si=}0A>t=@~;BWIgEiL|5Kg?C=ofSGF{jT2nU9jmPz2za@X*v9m z-uMvRAJtnQh1~e4-t;Ks);)S)57@s)KT9?U{jl)UL+AkkHVM6j>=d}40Q;ZN&prVI zO?7$;RxMi&*XfPqsXD#44*p$rdNMhTL4NdytCb022y~+O^PU>FJ>t6s*y`uNN0(QTm_mEw`)VqHP9(Yy9hrN;eSM@fs zp-n&BM!8LIYeP%mF=q~HSe;W|h;fp?`TQOHT)I~3|CQk( zw<)=k8G>vs=X$`;6vM$>g>{!QU@p9Js|d_RTc??0=oc2r2qKh0b3s@JO9=kvim)eC z0$evs{e7xL&Go(hBdSQv^}L}`LHrK;0 zQwcIxyk4i`lZ#kU|97eg%~h+fswyxSxK%2H=1NrlelZ*A<)yNO$`}FU8&x-bojHcQ zPsx|71lUTX{sNVNM9PR?J06JuXr<;7&L629XQ=>xQ4xNk3~o~iGFNZzPC$6H^yhDr z5zr=ovfH^;%724x%3dWWsRVI7Cv~;ms*cPBoLlg;!36ENUK)6Rw3I8Aym6G2Yn1$` zO0c%gZeuso#SM2OgXoWCqOj(%&{B3}_{5rGH15vcFb! zW2@QLdPtX7yn$@*ni4kEyt5*@cMgw*fxssoy0mw;8zS2lQKub{xxDMTuB^0f? z=>s5tP21e1@({WqWGn_k-SgP26wHlBw@L-g+>XV!7c^jQ|7cWl>s2zmP_nrnq*KY} zUXpUF4Bxvz>hCb@qyF#29!*F51IG`B7*sPz1ODeQqz6aPIz;|Oh9pQZ!U1bo;tAOw?7+GEVEIz_ zVA+jE8ti`$N-S8OIYcfSqW{5=1b*nz<_RUtPKMc{|IwWILh9oorZ8s<(6SRaO2E&I`$#$3c#}$ro7JXRriV==StRu~z8_(NN zR78{-IfY`=Zs!WFrB)dh=U=-3R$G+lI@4T%=F zoDGSn&Z?g(o;(|pEaHA-pDb=Y7qU{^{a5SosDW*$>1G6_)#YMZ_1z*|d~hyg__!}B zq^9JRY%VA?_Mlep6tTkxRA#L$TEAfv-Ga8a{xQ}udb!-znwl}Nt@Vzgf?M*|ZQi!2 zEHy1JZ%a{0QNh-tJi0Etoj=$9^&4Slef37z8L4@Bn>Xcsr)bM&b1N;ai&Uq5yl}@j z+#=rN7#lN?_JRDT6>i=nuJJfLSp$BlbGD-73)UCqZ7R66Xlp6<;(pUqrhIiOQ)drN zB}#8%b>l0MW51%v7R(S;J=R3=NQixscpRU16W{%jJ-Ez&^PY9Qczu*3QItFFPO;>a zH97Vx_7so%>O@w*e6=ThpfDDsRHy8kTK$7v?&_ca!XrA~w?=%G?J-|rTfFpvHBPMj zv3*98+6;|GwV_Ny!;l-M^R^ZROY4iu#O_OMF%y-)(FD^rY%1Hla7F6ufk5iSP@NF0 zI)BE(6-&R7V(P^eBi;5{vu`cBb=|F{Mk8JN6_u2Vjoe6ZULo2x`mWe@+B#pH`>}ma zb^e;kqIZNnRy^1j5-vWEvR@SMHylaAl|8T5#vuqP(rQuUIOcnr?e|sX@M8PW%Js=P#CEE;*8)izq-3m!Lk z2HIijEHsY1g3{70n{UTH`N!rsX6tLKZ(9-_dqHJJuuAo9iE-8Sk6>ROwJ!Ah)KqG% z#XkC5iVB025?)McjvMFLU=gR1>@L=h|3dA|-mnR^Q??j;@KZ6;+_9yg)EJ@{=PZ@g zXY9@|+ElQ%q$qF0&5KtR6l~oxV@@6mW?gA%>YTirH*dM4U<*o04eX0^QR}l%Xxoam zZb_X@z0I4pmTlR#u51I0uvM&OY_rS&d1YG)@ZEvME5DVuFk?&6%|%;^Hep~gjUWN@ z@)qaF)TEW&Sz5Gk<$^pYbx*?emrzEpseufyj9UWs#z5|?hUPqyXe zt(+(H>9&yJ?&mf@8Mm znPH3K*?bZ6d5C+|Km`p9x<$94!>ybl5^l3C6i1fXQkyqjWm~B?`>wJ%t<7U6ImTLr zHo(P;uM<{7r)Wh-Y^?@o-ao?9DI-Megf zb$P8zJU!j90>0N8MLKLC2Qx7=un`M)ies$d7t|lQYZ``~mH&tAm`(R9uEe9iJUz|(Z?R9( ztA|y~Vu%>fOyk{H_0O-mT6{m*cDeXPlWoFfvoo}-=FiV7+P}je%-I7L2hL{ya~A)8n|+LU^mPn#HY{F zO3H36O*6_#Tu0+S+G3AM99rcw)4mYd3~|Mawy|Pknj>la*GDHF-iq(l{NP2~M6vND z+a#fv;o;%3S&ot4By8g>N18}@8QFim%pN7WXE`RhX3Q{4b;b-9=G3oGgKT8eQ$^Ry zwsGGi-WRqZ&Fg=OT+VvcHo-C@l@VS2%_B-RlbCw3+a2QqA@p>|m~WDn8(+8OgwIIN zOVLW^=PXX0EiTD$j1jYspitKHzd!T8pWbQrip?30FgAiqzIj4Z#LKtqBSU7T%}7lZ zJ5PprniIZbzcI~lNDART}$~!((kTXJ*V0+0WPuNA&vSTtgC`VR`iW z#OPnyu8478DrLG`aO#QYWwsANLSDC+bn6<5xEC2shk$ zc#Z#|H%olyF8dXp6y?53g*RuV#nT^##)_X$(i28h%86%fy$aemM?9UQj}ui{x_2zM z&hYT6hiXr{@lg@26Y(b)@jo^hYHqwn;L(No2_ET~8fGrLmSa;jzZ?-IQs(IinJe*D z8kUS)!h2P&u{vCHVxd$%CT;OB&pnsMaV7re-%R{%!`~#PYG!lqZ*0>XBI#aylFHp? zvFRU)Z7_!W$~;8{?^uX`Zontptyuh<$F7LQ*fUmUgXiFe<@k4inMWxRzikc`jtFI^)d_7h_#BcvWxp~aX_EcRz(0p~k zUOv%}xwwDtQ+)s4m-w)J;`+bY{d$)8!{6+W=#9-A-mzb&H(TGer(5v-FVw(he(7qF z$p6GrYJB7hu6LfY$0Nk!r|fh6+&{#_oHN{kbL3b}F=Db(`8TMBGSvTs@=rvW@)-Kf zsZ+|o3-i-Fs?eH(?BfTwQlv+z*#CEXd_o)Mk9bfI{|3^*jZi#t#amF*R}1}p+_LUa zuB$}?#MCM!^0gule3wu|x(AFLSN?UF{N_=y=a|(ab|PrxDdp9mCUa4C*$$6aNli#f zupw^a;!z^rdLOAN7y1W4g+!&82Pw2py=!o?J9+dmVrqyr9ypZkh<672#iA085XY6P zSIqk!mXFb9LcjUO0r;!Knp~|he&C!5;ZaJL*%Od5*bQ(AE!#oy1v*T#<0ba3n(eFuBj8*a(Z}Qvg>>+jOHOLOZ5QU!$sGEuG4_ zTRG#yJ@_P)K3!}~507^$N4N1wGw}-S_+4n^k6?*vANku!tpcf^15!T|q<%U`eQwsHz6Yd!FLDKae{v5_7~nX_039F$w1W)L z3TA@!AS0*+sb2w7zZ|6gc98ldAoX)V>MsH>1Jgk2r-0N?0_WfrNOJ!)sn`or@dQZ4 zPLPTnAPv`pMgl-10iclp&`1DiBmguL02&DZsh^`*fLzIv%#R~7fCe%^KN<@Y z(hV{|7svpeAR}l1?*Y$FF|Jn0eISdp1?O?*1!)emRJ1b@mQP-vZ_C0ufiXQ_^RX{@L8Y1AX5q^rSlw zz7=GGv`Hv`T#l1F@P>}80GX3g@MQ?eu^kXKhU((kE(!U;L_*%s>kO?Z4 z^i2b)$DKP2e|7@OA1A&}j3Y(xI0_bm+~Y>YZjc7K$Bk?OX%L@PC4Kc^9^8A!$s9E( z;!~?e4)JwVgZ*(bd@s0@c0t@|B%ko(qy{JLAnrht+d!07c0kg{y==ST-U#ji8^8td zKOpI=2XBVVJ#L_nd)#P;Tij5}+1%m=`YJ)%=^LXG0J`z^+TV?n5-4^l2NJUH1n5Tq z?tNp<+d-zh0YoiiACUCbD*r0*F8Eg{7K1FoLXbIK4OW9WAnm1tQSATG%EPTZG;jwL zxVi3ekelk*itE59z)J8@Fb%v0^n#Cp9jG)FeP)q~q-w`Pr*HMrWw}I7Q3ur_D!c_7O<-T3H z7lUkDt3Z}SdL+u9MPY-(6JW1fHm(4;0&*ir_d1XzQ3J9hsw928K$b+MmC9-!AC(Z6QQAYkOsKvj;vLz z05?P40kZB(mHR4?MZQSMS&CjoH%NV#A#*=8PFNQ`p_=wxupOk_pjZjAigH1=g-nnM z^ny%~3%m>DUb;KM77*2afZT+_ZBjA`+1P9M9q3g-Hok{a!V@@f;SA{ojXDHrxX&RC zcY`!c(l8%@DU&pO0;FLswqp1?km0w3Ojt2UeUjk|K|dXMLIe3A4J3gy;00?yZqj2; zxk-=YCOwjy^hj>f+XHfw9xqPZqz4+C^lpaCO?u#b}h zCcS&rCcO%|Nv{&l+@!Y~#0RalB_NmC@tVXh76TnS+49HD-2w-f|V?b`wV?b_>VZh)` zddzS++*#lx^UFBkDy(&muR+(LH(nIXVCOyX90-3RM8_c(0m7DZH zW0T%`$lRm{4%(!5E8K%O=|MI&=`r?V=reY1(z{=7(qr`8q{ryENe|H*oAfAilip&G zoAgL8$Wr!zEPZa$W9fG5k^x0-(xdx!#bQNnWnp%>xorWGnJ8&&(z_WlH|c?cH|eo7 zgE#51G`S0o`RUR$?LII7J_y!=Xidf@y$WG$(xY=WoS7e7nT*zygLHonYc`o)GE0%0 z?Pg*js2iLCGMZ#i1E+!g2!9FK3*HU(fD6Gc5Y=MrwL^6nd+m^qhyZV_HsYiO3f~7C zK?ZC9=Y#bi3c}cI#{g*h9AYEN!CS!XAj6e{tH5ILb}%1=pRw2OdN2p_jo>11HJAl{ z8%*a{QLe>F3LKV$N#J#$7lbimv)wMx33&qu7!itgtD{_C8<|@qaT}R{ANv{#!oD3u z0oqGJx{Dm_Hgor*LDRJtG+e8=>x*XrxG-Fc(r7d_${8+rx0n&G{x>1XXr2)wE5wl_ zI^GU*i{8Cfm(B3Z?+6(?0iInjNSgu0;0;zX_KuK|qo7!>6xbAvM1ul7tRsX={UW@| zo5t|Z-jDnnxd072y~<7i4peAS3am-k8Fwrs)`&)Vqf%rv(tFvl5X|n0P0#|cpX#u` zJE8|0s=9`E566a|$QEp8vs7Ab zn$xl?ttt(>edaXGfrUBU_`fQnCIc=R4fww~R=yn3EN{pEUCX=CKJZI)Gs*tplLkBF(Et>@%Ha3BkP%^vk}H(_nUZrD z9{&7T5|8x^51EVbdCd1pd5V(L>5l|uU21sywQ$xu0^FhuUd6PwpHcGoM^n31`we+{q&wP zkc+X8$NkiY|LW;d&QS&rDF0WzGJ)po?TOUn5w1Ll-@M*;px?Q^_NhY;KVFW0>^MQbk;a#4>ztgtWKYDrIvH_Zq}Q z|J7&<`}+l__aU5gAU%2hJ)5@7(kcKyZ0NTbGTKERdH@YHDuroA0J;5$2Ci2DI3L5~BPE+t z_`FwU0=rOBJl2Ivd*-Zr(=aJ(Uc*}}Hsz_1*)Cs+mI@1amw;mfa?S*~$4U8TC@RW{ zC`ul)JyPZ>d>+xt-<*3t!Xmbp5452k^a{!isvF;^{EHzoe(gte2q_KZryQ*M!sNPEXA{yN+-Jz)<@49)|`J*cu^IZC9u9r2c5jTI~0 zSXaFj=?V7E91@&QUBUj7hv?sgWCi=zAz8ul#3Azc28Xw59~uk1ukde10R{&=hWrQ1 zz9A7U9HJkECLFAP-4Oj@L*$N&e62*1-FD()HOI4=J9fi<@IzR`}KU;!Xj9zH+L@gp~vb~R(=RkcmjJ%=TU zfrO`F^@ds`BX<7GK3XhDb4*N1 z`{G)Si!9$rO{G*+IwI(3p%5YEf(;1HcVW&e%hB$o$s|G5w91CJEIAk=3 zt#bS@LOB=<4PLw1F+b#jhNpQ-iQ~Ru%7F_Fn%nPm)R+zh%Mr_+4>-1lDh)V{Y7X1& zSQ{4X@X%hz4W@&UF#X4lnT}wiIX`oB52r(FilD{=*SzRxzUD>ejlWh}MzGf&4t>K+ zT*5>>wz*|@=y78e1TwhuDZ8in;GWR?Ob2}z(z4|7&?RODBYzBsXMPg8(W#8?{5u>j zYYd%X7EHD74k0f*20@ z{h_Bk!4AcdVFMc1%tb6&(P6I9W-QxWp5_hH!;VB=2;ynJCM#^EnSBKDG{3SiY^&+8 z{{aNKW@*@;!c`DMWASxi51R#TIGnyIEXs6vy1_N7dHl^`OI#|5VdKFqVb2;>figXI zo#V3RyY3C!Zx-QgSq@}>ci2zO@<@FKrLH%GSxp;H-wcg}rmzVEW%`UgwmJV7VY|${ zz-UJE)T3bo4G%VAn|uBkR^wLbFl;=2GVG*HIqW`ai*2s&4LdOQf`g~IAR;{6%swezTFEJaQ;ozAVUSZb0;n0#CUTE|gcq+W+LK^vY3f6~mp;V`8>{B6_0SR|D6Cs7(@OXe#C4JhK{5MwMGwb^yXC=WOo!(Y-iSJ?=rR62N? zUwFXvnK72ZL7#}8eQb~GMx&xk8;ke5))@&igS^(@x=Xh8bS4Z<`#INf**=s*P78hk z(kKt*Q2df>foar;<+aybR--&%lw+#sdefEC?0LhrOD^fc(gh5x0&15w_x{dx+^9pP z+YH@SQ!R2c2C!ee?HWHwqyMDqfSIdnUc#{O!l$lqqn2Ugl^fCN|7sofsICeE4u~pd zSVZ%_kYRfUxrT-gb2k?_hCOV$8UqAe_Xax%IK(!0h7GF-c5S}X^+h#z^Sp>5*4`aH mL=6rx&CQX+zB|a;^-&j7n>=!e8uIa^8O|70D?P)KV*WSy50?J` delta 41875 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 diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64_x86_64-simulator/libsession-util.a b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64_x86_64-simulator/libsession-util.a index 8c1e89f238583fdbe03c3619b9ff30608ff576df..4ee48d353b230abc3f18e192c8943c10b7e75bec 100644 GIT binary patch delta 163347 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
=vSS3?wFy#;{ZL4O#6nc#`VaBtR@hK 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 B((gd5)*cnG;Uev^?pE-3 zbU%etD{<4wj~J{^`f7=<7_3=*2DA2^&t|-+piG1qtRsSR4X!9p ziGXv#+I&r$-xn`6w;N_qApvhlo5AlLv$o6Vci60bX7oR3*3S6&K5Eu}^0^f;-R$f4 zuvvTC*RR>E{o-qV(5$U9UqwNOs=J-0Y16Drv^l+`v5+~wFB-MY2J3pGcAw!PRXY%g z{}n-~6AL~yXkudzORsU~4dMO#{$kLs^+N&QVxXT77*K<8$utbZF~inDT1+2F$8tIc zv{|&5jSu4nTYRl&E!s)nJx1}59+nKT_6H1~ecHnkEneth35&nT5QFG(prpb6gVFGm zp%BOZ8~wjB8tRPx-x>|@Vql!5CU^-xZ%~TQSQKd)+FVUE`TGoRXkQX~r{R+9CD#@$ zUO3-bT0VDC@%1B|#TBK+^U8|nJBJQ+mK0Yw=P$f!VcClQ&a0M|IW=d|lKBIdE_W^g z0ioEn**D8CbLo<@qIqR2G%@LK5%D^4APW}`)DnjKe6JJrJuUU3v8N?(%fr5QADk5?{uJ#K>*HLaVPL{%RLFXq^hcLn z_KuNz;?OWdq?@UAki=`o45@-YPqMaVRh-9>sznALk9;S~>;06xYk2+G+;o2>p9}B~ ze~QCr*Z&KJpIO04r-9*m6lLmAzOToDz@>^$9}J+Yr`WhM*nwTKio};ZI;oekdZBz# zk{@;JBwx>R`aA+%2Sw8k-$*N;Sr#L<^|nNcqFA4}KBb{b<2V|BZ-?$>3we=B?k6&y z$EUOkyDM@+mjpb?>h;k|zM+f5^mP@w(qk2l>=HhV<&}8u(RClHj<-Agm3*8=A1kCQ z9M#8L!MRNF(^d7;&VlrnPu1mke9#pnn*QP&=|(F?S6A&4*3L^)@-%7((?#LE<;{Bde<5#C z@~b_^Gv12y3<)rK9B5|)wah6(1l~0&aydndYqWwd0NxJtXL&oz7l_r*`bH*ZD(%Hx zaxa~=n=e=LK_cT3l-IF}>LD^7^Nn;dwYp18H*wfTmNywXdvY7gYqOQLSt4V*ufwmM z$SF34HdROG_~CL0!*;mIlv$jf65yfyMf~HwkvM7c zhTfJq`d&6&0qVY(3KE8A5WGW%yVNN^RbyEeBU8_iD@Htp@4)4X4Y&BmC9;fmUU=us zbL?d41R13kBQkcvE>p9`4z!br6P1isNqE zN-wQUMT_|B0~~!SCo5t9E)9%+IBxxPCBH?Scq<^%m9MDvNO^C^daY3W<|`Dw4Dc?l zIV`W8spMCSklp@~hS_4~Y(tMNaXwZ1Ut)1l+ zkb5U_Da%W*RMzNm;4QCYc?-+Us*Euet_nec3M(_j(X+Hrk-NH>s%2BjMdHWamL7eY z(ey)`Sv*vPDz+?B#a7q6UYtg0v0kNY zO3LBa;!Q?cOF9d^$w=$M&O&c8(u&rHF5Rp*8EIYAS?EnhS{HW~GC4>ToyUD$qlA6M zviN{uen(c(*xLE?{-Ve)FwW0esmN)fDa|K3h(hkaMX`E{Llc7?A?O0q$G5fQ4T^nG zY#a;CSHL>LtQb+$&(hm(f3?!^R~q#7v)Wq4LdDtZn-DYxth{FwD@bh1@<|9P1FQKZ z#af`8xEHMTuPW9cvF%dCwg;>_X7vy|4w_>E!8zNglxB&hmwcmx!qACGZc?n%B7UWR zOdvSc*A-``IML4{IkmeL$03TW!Et`;nKX-#UA|JGlsWzsx#Z+CCq{W_LVKOZtN`U< zf3Su#3%5p2(~b~lXRVvSvN8)rlClJw*F1U#p+%kdlY+-9et-nRO7X zlEX^NES3#Grht>joN!rq%rRz6$Q+h;V#&ep;qRXpKaKK<4=MwZ{E-UHw*^ilbHY@t zd%&_Y>tdCFr@XWx#Ks21YUxl?MK<^nu+AP)#;@1J*8?m)gBOG6Vp}@zUhuYd;n9aH zPj=z`4BqgMJKO7zKKJ@AyxHI#>B74Wyu_oO!@dGuMQ2{nDe(5|JdyoHK(9bQB*-xi zDP9~H+$#v25}l)o5sQKnNNFdtaPBiz{)fP7W>#OZW1Npe)aUplhL$WXPg=v)YPmMH<9c_any<6?ZiPxlBAu4|QSof2u*6~{&OWS=O< z-@w?;LV6*g%R2G6fW;^WH71F)+z^*1B>a#esaaXiLVEVlWli9a)WGcTD)fOrWcDEl zt=B8F^bR6Jett|Wn!W|bOmQZjnskTTnG@u$PSJtLrdWTle%>auT-iK7S?16e&c ztMnQn!yVvs6_e5o(Yb4(QgW*bPOlD9`H6A>s?lOj&7;dZSO+pH*kBOfq_{2M?mCAoW20Tx1 z5mJbheYwC8@3;+&^gk;hy%b1cCJXmK82L~aVVn}i{tRIY3+Z)1hWtr)dD$F8v?CRX zGyD-1{uZU7SwB3cGJHOSTe}JySa=tNXIV&HeY&jTn3y#gWehUcqsppBb{z+#Mr~_X z;S3g1^LDbUaF|NNSZe5oZ&zmNR1(C;VyeM_|CHmKA-p;U^LhGw-KQ)ToO2%A~> zg)VG6Dl;hd6olGSDkQxN&}Ds>E484+itUB=YiqqyS*wCIN{3SkN5zsix8clkN zKYNstvpdQ1pHrc!7f+Y-dRJU0^8;I4VZY_KA=Eodsp{pq6jH4Li73u&mT%;-9|19LAG-~B3-oRWB2QzlWqBU+$1wloe2ghUuTPP(8xEut3L?a`K+@j} zmEjM7L>B`83LM0E3a=wXA7V5B$-p~!X(2~<0f~MZco`g-&-^LOAI~@dcq!zqb5yuD zfo=+LAAW3rftA22;61ZcgbNsN#hcs1;Jbko(H!7fU<43FJ;@9_2>b?bfa`#JfaKUK zjL$L70g?mbfD~`Y6}VqY!e8-fISPy~fuzs~B>r>E&j(TxUIe6+ScswJmB0~`9tC-Hngt;KwXh?8!JEgU)nkKTO3(pnx9$>CPLb zDE=%U-SKsJgC;{WfFw_4d;u@oBzFPd#Jyzz>p@=vM57WO4qA z=$^zs)?*NY4BY^H4mb};5zGQM19N~mz%f9&gAqV-C>cnOCj#*=HXeU!fZc(l-wjCm zG{`~vx8y4O%Yd6v{$j7jk9r95f#kqAR&W3*;8|E9{@1`KfPZD&2qXuqfJ1;4z+J$} zjAzFy`Y%844+G1Acfi3Vz}+Z+qb|pfMG$@ogX(TnVIz%9+1_aRy@# z#&96%{llfgy#PD_`ccLb#w&mnUk~6)l)t2>#;Sl111Ufi@Ot14K=OD6kUU-t+>J6Z z19%YpOve3}tMH9L3jYY>{lHg2Z(+KWu?To2_=A9MDm3x<;fn~q%2I{p&p2tRs& zLDlWc3{86%cmnti@O>aD?gbtJz5t{Yc?L)+vK>e%vIh7t_%{M6q6LgI7`rq6kgntn zjQ6D@{VBjKW?arVjPVyVQzZX85N%D;2S93g9%a0q6m55pQl6g#QbhY1UjUYXeiT>^ECtdXmayE#I21^Fy@8}h-y9;nlR#;Y@dco? z2bA`Jq~|VSg^7&xjUZC&4kX3z&|Z?_*FZA(7UNDJ=?Ng|%>|O)OqP#eOazji1xR}D zj!=60fUxIIs#8Cbs)3|99Y}e75u=&0E=_)eCj3qy6~0O!m4)kpR2G&4sVrmx$&pb& za=0Hb5E#m|35Zrc>80TsKA4T?|K0dO21fwb10#XA0>2)n@O9v$pq~P+1m3_n1V|Aj z0V$$rAVuWE^!GzmM2`bM1iuPM@uUDLTpyr({yXRg7@rPN_!#3hASvDiq=(EhAU&)W z0^bK_13$nWj|Nis-i)`Ws=~GyND-bJtmqbCHR!j1w*f~0-DDsNKPaLQAQ}33kixGR zpJMzI<1LKWF^*<5GyagG!tZ3fmhmdafs8*SBmF7D*OFC$hZ$!86Tqh#Y?A*v5YukJ zHXzZ@0po$&n7$h51U-XkCom3l5Yu7+zRL-EEs((&@Bt$R*q)^57lF~B zA7Oeausi74OkV_y0^N=2qy6#v33@+}>}_Mbjqy6h6vjA4e>eYV>!$)f1*AfD9piZB z2QvQBS2aZ618;)f0pJ1P?Ti(`D?k^qd?53?Gyc>^>F)wkJnmch$1E1mgg6-t0?q)M zfE3ZuM8&_KaXpYCS_UNfWz6r(7{K^;ZxxYXTm&Th{S~^CV)26_3Imd%wu_a*NLvfJb{NgL@ep z7;j>{21xqzfuui@`Daja=?=dF&IBF-l6(X6%NeH=qWmR|Wkw+5FDU9{_a*$?!ES@5}sf#xtlI(gDUN8Sev<-MfHfcM;Gn^MVy(fn+$C6%L?Ik^BY5M;Vte z763_qD$s36Nloz$v7QIcajUFXFy*dHQ@;?zb``d?KS`@CC`Mb zJ3R!X2%iK}JjIOe8T{j7#xroA6m|kv0&iuU30wtwEbwLEZrt89;3Gha=q}&~aAW~+ zE@&t42=Lo(3Y!^=fku>-nLs$?PAUpfDR2dlA|4B*J3MPw^p`+#c8 zCj;>>>2jtoV|p;tJ(%vs^e;h5|9c?W{}A{(!XE~{gYuWO8$aj{UIx+~JjHlBBYl1N zZt#}@-vwU9{3$@X({!eXF-9_4fu!%l^iNQx6ga`S2k71j#(m7V33w3n7$7C>MZkA} zfk1NX=K%Ezwioyq=x2cfrTTsKWdA+p-vyik{&L1(;KQKJ zKuXAS29bVRR4|IX(~!N|;0-B@E4>Qo_)56*>N?h7Ujk zUja4&Zv#?MSOX+S3xHG-klT{Z1(M#SK)NvpkV?W$u(uD#P?rGrplK_lwas_oM?M() zfpnzlYM=}F6fhlF2^BXYX);6~t`K(uYrp?V+%+z!ND1=j(QQo&n+q`w}x8(0b41grqU zR&XhB1+WD82(SE4LgDNYW)&qf8LxUPk5g%o3GP!{qfWE#GIhtvG z;c+XRr3m!(Vbl4B^o7S|Xf8-@x2gEG&=AGYml%J@cc3plPSo#csq|Mn#u4fZhcj_^ zWKds9Xygc5@|1oiJD{%|rjaVT0nJ^i6pAJOh-NJOkFs2tM z`Lh(B^siF%*W@tiGkrZdO!U=CehE1M+TF59G0w3%Hw@?tZPVGHzNR&i4eIMu-wu&kqUkG8zttUHu9Eam9D$Ro?QC|K zp15>v;cA#rp=c`m?qD+>u-7ZbmngwRuV*@m9n#mM#&VMD>rb!4AOOmURys$8{|Daf ziLPaODc;qIu4j4)J6y;PogIYwPf4gRG0kR=D|Ll9Wk6qA`V&Si$YA@GDncL5bA8=t zH7B{gK6H-_qn3t7tuR;VKZXZ5(dkSd^Gj5WI@DjfR#^P{JoWhK znhm5ZXyFvRmh-)t={KxOUI&`u*RGNgHfqUS2C(-~8gMfGz05O2h$=x>JL}t7-iHlR z@0qUqSzq6wLT{zykiO3UCu9ZPuzjqGUrR^bB8I++U>6rkealD-7rI(>%jp^<^R!XZ zx44vIyo@49E>iN@>`?szMNg9vHfqgGH**SAE|B++ZVWRDS)msjr0zLgUxcd&^hN6b zbShe3)c$3dqU{AzU3>CkMVA&TddNkJ)|aJ+>T)+%{?idkL0@yfGf2^elazr!Q6V!| zY84fV?!|O6w{Br`8lK-Wq4=;Vw7H4yFo(zi%dWrfDh!!93SQG-%%R5L8ER`o1pqt`F=i z{{_vtm%dx0^?6Mr)OI?H{uv;filBS(+X#x8ffv$LYsABE35A{rF-rVj^-k8>#m{+`VU~((v$7^nE!Y&lCBC8VUdI@N$m?ki6K(P4;7xVY`-+5~<|HwDvSlPT zb($^0nqVF-?mO*c3-#3T`M~zEs~3OV-7XBy&$udWFRr zmo5<}?sr6b-NULWmhLgXyTLa3-+PoYw5vzL&?DrcO@+HdqLu9nrjLmG*xW-L{K3a6 zZ2im^i_4~Bk8*5(ht12sZ_oMk6f>t<`fs|U#w<#I^64G%Z#Dw=`1gKpS~ejvz>_Xx zl0|*DkiH@|G{i0jW`tna>KC8j|ABdtG0ifrPe++vvan1;Nl<&83sw|+Q&$z2iIAzL zsE)16sSB5sEzO#oGSm}-e@H#2=gu+*WlbLc`&ua%*4jA4JV0za?-QDE!4iv&*6^%g zK1wZW3{oLY$71vH4F9tjxRvn&|H+~+~>YOws zK_;?Dq-3H@$7~4eE}qJ_%#8GuyObd)3I#=_rOTIIi_Pq!c9&!5rq{E>9UU5jyfrqR zXiOz}M~zNNA^BYFa$i(DpT!ZIT3(HAsJy~b?jz<*Fb7hmxH~ds=)xt)l(KB>k557S zaozHwQrYNc=Z#mnCU?#kFDaV4xVT{9g6#aFq7};r4J)AZm{(ewGOS?1(&g6`Ek^=z zQ=L5(nLPw)RbISedCE}ITe@UL+4AyvWeZ`13d3BAZHOMAplo>&4hG1ca(O{k+VbKB z#mkGA%qvELQAXfEMnQI-@+P(H`qJX8DPsztjDND-9I~_m0fsMFzVw;`93=qH=VfJy zWf`U@QFn*Aw`pp@lngY{rtpr|KSd_wl7;gYi9^dQ!;MphN(Ha><=`^QDAAH`Iw8(y zm@+p-Y_&&uvcc1E7B53(nleaCT427mp?<1qmZ_m;t|it-Skg^FqH?u4IBqIZRvuGu z!ImydjC;g%vAFnAQ@4(|Hyt|Y=%B_4IWGz4nr4;B+iEWRWB4Rxn zgHa;j6(o7{2rVQS6 zx>x+B#@9kc{36R_Vo#?O4eIa`)nAs^x@upNcoq4<-YtXJxXUp_|hz zEUf4#GW`t`FTfPJubV<_oP@G7fEHI3vzBS*-ojaH4i_y4!c2i3O>#;X1z+)WTKGay z_)EmX1S-2zr~m#_f3(Nkzc|E#>`eJzvZI&QfAcKu{;&OMNck?}V#B5-jUh52f<2n4 z)PWKM-?8V4<`Jfm;@PE^5HWsacsG%-#T;rFA_nX+C2snxDKycOtrse|>L`x^^Oi22 zFScD0evtuN>kuBpZAUKar)D zP~)IsWUbF1b!mV|66RjQdNv}|IC$uP81yk=9u_xvh&DDev!J+QUU6wzK^e8VgNAtS zZ3vm{`-i<5BBHmNdxZ~9{jJSZap-Py=znG|Rcw6O5h_02YPO3FZy|}EDz#iJR{n?t z?0dI4yyx%xC2H?BM~PPuvnYGTaj|jGAo8H!?+471IX)mo>i?05ZodcTh7b4*o=$uR zp1y-W#z83*+n7HdTgrv{2C}^srw_yG%4cwX(*F-0rmp|3hp9O9t||JDB(LFKbBg%; z2PV5n`zsP+&gAe=vFbi^1XbYwAUl)AGyM$VzC%(64H_zT+!Gzu@bP`-m&QoO5Mj6@ zI8t1H)IXr%mCww1KCG4z8WUw4k}CRtX`bKB&ci4rc%`PxK2ALTq3O~Hk)mkgW1vE- z$fYwn#M5I9gSyqRtWc?F)*<5S{)S6qv_Xn-%&4#gWB>HCGM`Q;F1Lh?69ZTZOL?3T*I%2!EEO}lr5IPtZyhsc94wvL5PenqxogqGaj zig@BhMv@^^)VmDM*hVr;7seInO2o)6>D66<#b_e_qYyMyOa0?xE|XG?X3*)PBTq=J z9)o}eQ6ns=iTJe^oU`+>3I;=Zcw46>2J-5Szw{sXs?8RsM>>Xy=8sKNjcZedy|-_Y z@wQZPS#RI|4NoCO>Y_V2Z_f&0sVZEX!^!{*mx$Hj;VHv zw?8%gZ0tTz9B45m8G4En-ermA?@p3K zI6^Oy&(#*&R^d!hoStX@FM`eP7aZcohm!Jf#_&%0bt?6>pPygDFp)a!ALqj2$l7{a zpH7GUzd^^vhNR=zaeSX=EBl1Gea{iv z@;fSf^y6mR%onED{DhA>FGG>S;nSRw?v*?7vETP#*HvxBhg!~0!tuBG2H!rGpKZ6T z`B}!g$F=6HV@0>j8dIvxtPAuBeU=`sgSwXbg{M}xABa-$xs&ST8(pS;ns3|VPs|FtLG74%3-NTD)_{R z1K&7kYHqD;GT2_gp}qW7o;Ihe8pjG(&p|}58;GrcHc0nF+Q>MQWtE?iSQ)9Dt6r&P z@5@3Yxam>IGP691F;f5X91PVw#Hg|8O79ldZ8wdk;>kuG`+&|N^aA-$`7)J^v&}Ms|o0G@dH0n-QkSM|_J#Gw7(sd61z0U+HVeL9< zLU28R|6Y-6H?ce&1IKiIhX3B-pJaJ*H!0RGLo@9yZ)CY&DduhHsuZgq#Tiyim76=O zA7S;<7^U4^9XQ0)XTori#o<>OtAq{_{~QkFVahB|Bho2LekS z1&R0u$asp750_#JXNAz=QcT6r@pulubSC4}Nli@oi_ET8NcnH2s%f| zLI)dZEqwY89TrmYxk?N^;fIbiD(%do<-1$|rnJoJL>@ZQsFGRgh@YVE$riKp1BTEU zPCTgs>IV#gRnqD?V93`Obp6+2!&sl5z7OH|RuP|U>F4`Ce(o2i2jZs*lUZlw&+t_I zOl(v3rr|c^C66}>pAS*~g++Hkw4OyXI)yUR%IuwO;xEaT389I6VnsJ37F|}yDRnGP zi=l__S7LhR zNd0fy#Ek{&j2!JvC8Ot!lpSajM-fSA2@5{c1-sisTP^}2Qs-ML5ItmMpa`E%^>!&wS`zwX>+C;xe zK2fprA>4UfnWTnQ3deHJs}n-*g35kYp|(}3^llTgCgBti$Ra;c!RP8S3nJEKElNf$ zr40Ag*W%^5xPO$@(i2KXt)!HF2-zf`Soa3J{$aI1(lW-rj3JEs(WH^Qp0R{6kI|p; zG@41$dz^72ql+<_@tgFJO7P` zt#}NL0lvgI4@izp2BP1U6wmbE@u(w5jsr>l4v->V%lsA0r(KaGp8&*Md8{AF-C(rh zSxW(S0dqj#2OLlQp33kCKnnOaUk+IRK=sOv67*l|5 zQY=Adf+Cm+ECFT$DJw<-Zv^%S!r7!=K$NBM?m!gIBs=gXAazENXt4$$Miyd!#NCko zcRy9;7}puK_1u~_R_FxEhD3y>6xfU|*D0MXw} zx*SN3q%yxh)3JpC;Xn%%{TP42Vk-ESbR1X- z2mcBr2lg@E&gf<=0HP))y@G;qGw^mG)s~q+3OAlHfbr)@ym*4|-hdyZa3kYj#$JpD zAQ_(FP=;xX2pNtBQn+Ig3f~5jL4P1Q{0@>W9rQztTY;4H8-Wv%_ZxsndH1MA_(4fE z4~RE`q$xl$oWcAwU(x**}gcinwp{n{$2TD1kh4COF8v{#8 zx%febdH~6h2p|P80Vzvb5j)Wz1Lpzv11X6g1X4;|1*Ebw5;z?=7)W;d0dD}tGe!X~ z0qqC89{7!2(}vNVe2O1rpczO>^d^v!=yl+7IJOx`25W%i2&EZF1^_sLK-7!;6J+Y(;MI3741 zbOw;}av1XyfRqJxrY(#o;SGg90wn$Sm_7ictl7bM7jQA?YuwDB-HKG0XpbnG#P*8pkrB09=y_afyT?Or59EkKIk z2oO4Q_agCW_aa3=yBGVxU_EdG@FCz-AnjhH2xz|%ML@e3ad5xfy-4=IH!AzIdy(vW z?_MPPcY!|uxSWx8FH*|U?nO#D+Pz2#)51u*7m210J0a~}B&6MogiC-FUhZBb$7%N> zr3`Hfq?DoEi1=0;TfK(KQ z!{IVSu^n~^FQMIw^dl0C1T5IcI31leB6lIi0x`rvM}x>+h|$1y7@7|}3G54O0V2hN zj{uS4auXsV4{iiK3Ahtj4y*@Kxb471U>y)Q9K03r(;drQh-koqD?v{N!fP22cS|eD z#Xb*M*Cj#xj6@*s&fDtsz zDne1a!QsN*JF7Uk-zP9;6-2b-0O?@f3Pi~<*8+*Z#ef}pdDwcFN|eT0XOSVK)ealXNxc`=FfyoxA!XFyWCtf7Toi8j11f5YohItn?sOk-@AN)I&JoE!q($n+z8L;C3OBkVxQU=_c%i5dEU?-Hi<0p478z)7VP z*NY@a1eHu@v%WsyTgCbIwe187tvO# zF1Utrg!+K!6Wydknm!=f8$C2QsMTMr^dGb-x|wNxSCYG)4Q^!z^wH5xoMifFXe&FU zkAC(KR|fS_(1Br!wp0DZRgIR6wkO^*OwkGKus-JbtBP;3rVnyvq5nY(^YsDddn}4} z_D}|TGEH@yu570DLFGe89SUD4c8s<3b{|79B1<{=N~WDg6?|xbk|(pj)KrkZK5?)S z#gFJlG=6lwh(?y^IwT}rC!9=!PuCTAD~Usb^Vq#x%aj4INd*Z-SDbV}(<;%?qw6NL z))b)9qUdf+>k}>I;7bQMf?xRl>X{yj_K@WI+(Z$})%*a;OJBYtJEuSaDj5Z!7j?S& z%K+$iqv+6e1?#tS1pj2Zh3Wm0Mv+2B(e)aqU}>D9V~{drza2R(>vc047GhK;DTO^j zinjMxbe{-C>%-q~AZ19u*{S68LP>No8N_wJOyWjOAGp7%yOQez^@B-nuGDBcUe;^c zmP3quF5|nIrlZs73ZekMm6|@ee-X(+mvNbWfaz&WeF-jADVk$Nmkl;%fN2$!W(b#LvdomcuNn%8Zk*Y;s%{XB;MlHUFg;> z!DrfN6U3#1K16DGhdYFu@utgAV7=+59O4G-H4y1r9rhG+7h$KZ7Pv7>7bl!z^;Sn* zR#TTa7G2aij?cQ7UDCzOuM}SHQ)p<}>iEJe8oGrfY)T*FCxYu7?~5OQ^>H**PqX;= zh{YSiW;WD57($9w{c?j3pqK33E4b(S8Vzp1^XcRineZ83v0cV$3hKWE)cki;&C1LmR#;wM;bx z4o>l`5lh(=vNb|9F0%wRELv_UF^IpuhDBTLsSc|!e`t!}RWwD9SRxzz$}Bz>$rvmq ztqO27B;IH#>&}djzXwD%ytvu&pq&|pLttG0h-He|TchsmMyen` zZe12&#ectsWdZ)5Pvf9X8G&gHcNX~@y@E!HKKr`IHykeUALQ#DL;Mo|H6}gWa7ScA z({les`h6J4sqCBm-_zY*J)nD3!-yLH$yN?>=yHRjVf$wPvL3ooclXGKwCDWSM0#r+ zIp`mz+X$Hw9@XIgq5ot(TEjZTg5^!K)XJv8LKMp;jC@!UVA3-;gcv2O0?NWTNXnGx$cA%w280GP0}HsiH}u;UurS_R zW5??O<8_VGrl6>X?uP=p>shvXr!BH!(vg6d)v7QQ^0_eD=kEcTD*Fcu(s;fq@L4@p zn22n+B0TVb%HLG6%>hP6bl{B_%UDx+VOd6CPZdcjmIT0NRCeIYDm$5RdQxDfDus$6 zaQE@zh9{%@HrzWW@Q6y7R1tC`YR<;10v~j+d0CYvxdWfj9e{?TA#z>dVwGdCb_grm z{=7c$YF(q~h$X6_@9lvvspN;zFEM-i(bv)O4L$D-ob2%;GzL*U8W^eyrc!HYdLi(r z?zmxO408Ilz#CL9Au0+o>8-$ddXSBq{T&U>9|gW2!tQ3I2BWmM1%9r|LaKbfZlN{ZTM~3S6Pz^69^V;pZC^peLZzNC^yDsiAyrJeBsQ`kq&8@c zk!{EzJMIixp*wcyjgY8@(f0%$)>E1q3vvCMNZ84BL4WaB{szrZ&xeCPOJzf7{URIU zKMoqN+D9Y`wOm#0K{x7&BAX%SxuCmLC4+a=E;V-xzR8oY#3<<%{Jwt6vMIYFHF%cp z3>v7YhQn#Wuj@%KYkYlraDTllNygb3!KtcrW0fv7G_J+LWqPuK5!vujMR1$vmPw$uqQ8M zbMV;n!LxJ?*`&lb1wX5&snj_AMzD`wYS2C)x84m-P=$PmDrl3B1shd^Jw%{vqODJ{ z{iKS(5Fra%Ri5p^0Wx0@0W21M! zYnv6vHl#+#x3*2H7)cFBL!-(5ifYO9AmR3C-4E&5p~3biV%dg__U=jcqn(UyTxJiD zMpK4woaFEwK4|!`p&PG>c1NOL@lWbsjWK8sF=FsT(geisWmNb*b#g!lF-_m!B>Hm3 zN6-&XzS5xe#Ty3UDCiM>!gvJza-ttc--Hk=UfuEs4G$9IDa5>Uvq9U7fhWQPQx$HW zrm%3j!m%?HUXicx>}-V#uTW^5sqjX|73Yv$j~^tXJcNlq2+KD^3M_$!!R$M_widuqH=pm|DCe2Q@|I`Tx* znW%){;uVK*5z~7Z>5xX^C-hQC^BF|bdzE@dP8C7)%ZhXQX3{h^}KiMCb-1wZ9S+GYZCRyj@a&hZyg` z7!uJL0~OxOcq@iti2ppJksW-AQ>-7}MoE4z;{nDWfo>A)#rqB66ujjTKEjxaw@9Mz zVf>YGE?!TG|KXJipJGhLYc28DFgcy?33@_nB zj2|)5hct*kE=6H*tirrO3jaUm&Ic~4GW-Ac&Wtc1Du0GyQWP|{(4??Pp%@+iRAjV~ zQBpyUX@y3HhJ~ihC}dMnp^}#r6OFCGs8A_sqogvIEw;t7mWpyJ+r?maakYfP_6&~m9~^(2St=P;iX8kH zr(Y{97iKQt^onBU*OLC3o8=(Mf4|s`kb>V`$NH8hbh?x`#NdP|z7_ci$*^0}ALI;* zbs;Gz7;=(d2Bc6E~3k%REgre)vTDWD@@9eJ6PTz`iG^Z z-WL5cPSzKTp7!~mCLgni`HAFDy^rNWu`3bzezJ2RLz^VfMj+(i3h9DR#gX}LPR|tw zKh9L*9t3_S_zb-0pq$oB?L0jf?hFST{Wx`5flkm#L ztp9^BZVAh)gnttbmI5yj21|KI)?)rs0AH@E8&$WK7JwpY1k3z|1RU{?R2h?|P6EmWn)D_^}v%CV^fthwV0q!-u8d<08K% z@>^@zE=gMOZ!aoJWkrAzwVrvs(6vGio)P|8_@nTqGS2X-F#JiD7Ykd2H*VncwZaIE z0>n92y7uE?63j2h!Ww6;_;(QkfZNj@n?|KpQp9+3V5`HJF6aHC9j|C&Um|cqE zcsx*fMYv!G%Li(iy^=mfWSj5^^6UA8o}DbuddbBH7f3>>I5;5kLXn%LpiYt7grRjf z4ddcJ?rnU(VPBx~=F802MZQ(!MGc((wWLoK+2|63U`ZIdmkmFBjrp{2k#LGIRQMMJ zKm|W9yioE#BD_yHS2$C+@AsU~RV*2^CE;JMvLZ*)V}xarK1%pWJ=={DHtc5k5}`r3 z>=jO5BsEVHKE-q?J#VqWhr&yQ*>7_CoJOW|4|BLU{ONU;cM1!H9a534Qq$dF{8eV< zBT$)TR!a6Uvvj)5c(@TK^t{7-UsxqvD!fJ*EBrwmMl^B0jz2IPgqkp4I9+HJensWF z5K+AZ@CP_@E-))cg)je+<#?f6c)f6)*xfF?RQR>%uXq=OyU?tJ2}cPh2yX^mWUxdM zo(3ydnw4emF>ex16552v#qLvKgK&*7uNhybf7Gm$!=6|xd|%ip3~I*wCxda4;Y#77 z!n^*YD6vnOm6wII9T~Y_?~ds7dS};4pzQ{Oq>SU5jVWy%50`fc^?W&I3)Z* z7$Jri2{1ej63kECK=yVNMeshQu9Kv=ns1<6$ zmBM+#0I{F@4bBbugOwMAc43t8JJ^x_1K~@;bwn2wH%r39l3_pSyKk`a+rQ$+F~x(G zCBiwvi-bnuBcP*fuu>^}1&n2P=ibCxmsvkA#c9WxL-B#|xhjnuLcBWB!xFro)`!Sz)p8CgB9(5aHo= zwtro?Ubs+rxp0i|tiR*z`UM7^aJg{P-(9SzM?_@MB0MfUtAo=o73K;b6YdnY2?IOX zK1q0^@ByJ$_@VH7mmFLw5oP`ZqxkQGm4Ys2ws4wojBv29`=4z0I`UJ#X5nFBp!gdj zyi`~ybd||Lt#H5as4z+jxJY=7FkiS%SR>pgJSg0cKpRhBa0=^%k1<`!KO|wu5&XE$ z5Td*adhj)(&xHTunhks%E{3b;CLKrAKOPDOYPM9ZrNVr|6D@6H&Bv_B)z1;W^ zC095>m?nJe7^c~z5XC6GQTP|=Dg8NNvG6s~e=ST9F8&VFdrF8hndrj7hmx@1dsaLt zoFM#%usa+W{5IQcpUj$l<*A>h|@(e2h6xJL|G+# z7Ib8z=0D(l!Q2p~vxoVC@D<@k;bP%+!pXw%!f;`CH@*Ld!y-wzKnfTk{0aq={?Ed< zgg5+%vt(X~a-lF>cntX{{UhNH;bX!(gz3WiA2I(a!v=A%TzF|OM(xrN!|0CvY-*I7Hb8nHVkdHzMEHhn8L+qFjP>VxCJ5iiKN+ZwbE@hW^AE zl7zPk9}zw;{Ijr2I7|vm7Tzq}06Lz=PkdT%;I0Y5S0`1SKZ)Efd{dY#`fG*Xf{vXb zc)$^}M%XNzFAP^%pCr6Sco(rg#HBpQ2gB(Gxnuo3jOged zNmZKu8G`SZGn0fB4N`G0`sx zP!)5)5ak--TH#jEMT%NU*dzS2@N?mDVOStL8ZS&0x%cLzo>RKREB2l=h46LZSHg+n?`C0<@Oj~f!fvKZ85PC_JOu(>ry#hA6K|fw=)gx?6m zqR?``AENxm#{6F7H-%-wJA{*kvtjR|j1S@<;}1g=ukd})@$L}(loO*Kj}z#CObiwI z4zT{SA&OhL8T1_*q8t?N5e5zC^aQZJeTZ_Ia5beL8KS&99P^(J=1Rg=;V%66tp2+p zN`Np;xJ0-?7%%)gIfng*kh}4?&l{p44<4$l6#h;)eI%!k5FU$OzzH9T!IV)fj}o2` z!;gf!g_`glVGjj@0;9ywB;j26@r)a)ct)w~!{R2buYB0HYiQh%3$=f|Y8|@%f#1jP z{^Mt%JE!Oy&F;=05w<2)vp#H@yxuu|F>UBQeV6OjUN%)8;G3RMus(Hf=zt___&@IFH)KBJBM(jvg#P;WKT2Tqzqf_#md%@X zpK;&i-D^G#4N%Xt`||ngz3)tqOzeM{LVm%LIk(-FpEq~jZQA1JOxElAw;DdWfc?K`x-`GGsM{Na&1 zw8@`^4%J3nU^=2bU1z#n>pB|x&-EGi&D9!rna=RW-=X_g?1(+$KlGyZ#GtS{PxtvNcI*C+K93~-yU$;- zllaL05GQubKUfJNGgk+6=8S&8K6JhuZ$6v(m#V0JA^zXYvNxu{sG$AqhqKVr1 z*WqFDUGFLSE8fWLdQaPUUF2kI^v09v1{~V{jAs!K(w=@g;KGr9T}=?%%-GDk6xZV} zipskOXJkgkhPOP!`dWt4{jBzTYv|-~cNHi6$;9+NCtDM5!QRGKS99Vg!OW#K;K{v> zdH>@0I#$Muhm764;cz1&xQ`?7<%W!ou4l8#2xj4HY*vVyA4cs<+P*k3arkI@zv~O+ zI@n;DkM}&)xQn2SL;9LiH!E&JGX1T>-<7a&Qs@`$&c7itb%NIT_i$VE9Jg}BiOnJA zDC&{Xs*>q5TDBWZ?pbFm?pa#whzN^T5)omx95pK2JqAaQInvQXCW<=cW39pzZqr(f z;gK;xjdsQCwwsSk>o#{8x?|du6yMp(TD+(F;44^br7htX4n^*%%Gz9m(i2I}oo7Wv zYlUxx&)0mPhKFjU3!{Q|zw=P!*=AfpMwxf#mqw0{*4mzkbnkBYL-+yX?)=)wIn!cd zXupVTbDKfQHMbg+DmApxptPvTB?iS~$W^p={}p+S7MUFpw)>K!k$*4@=~F`#w35w~ zq(qP3{nK}mFB-JMT8kdCu*{*PDb8%^a#ChCtbndoS_T& z*D89OSyC`OV+QDt`Smh@TEkD($8O?$z0u5M039hKNzo1tu}%%ku3%;EDCT(D>^e$I z8)~(USs^;~hyHR7()Xq553spHTRqfzOISXp1-&}QF-_Xq@(7z2G|W2NP`p{Yb(nSX zm~ye{O<*a)l5d=X1CwEeH(aUFRg zhG;uNqWhH=?akZ~ws_IC!tub?>k`NFFJ@OZz2ZSDL@d+Rq6y3sS!vPMhTHn3DsAzq zh^U~ZekCpoR16R}&{ zK`l{|;y2!UY`D!Vl1a~Ms7ld-&lw)$Pc^f{y8bLvW1{-A#A?@09MLbCv{jebY@@{z zA9&C}>hHVgr@7F!OSIsJB1Vnvx`gGd)9g~kF6~m*OO3Kclqj8-YQv*#G3HZJ$K;Aw ziL3+1N4oelr{XbdVWSpUQrUMEFfhh!v8xw7O}2shLeW>*IX^AN1NG&i&zQ{mSnWtf zgv}+A7p4QFsu63OgRS#1+6U_CtD5xkOk?%}151nD!s*4+nYdYYiryi5SE+PD<7p0@ zVvuneJD^>A1_n?d`o=WTpH_ip(I?Ji{proo$@+y#n;0ZwZHO5#CX`Cf7?Q#C1e`kG zOGICGgXn>QEnwQp>Cv;9AzIi&5m95~MWnC?np?y?U-aX(2~S7Z{MH9h^?{2`oZtFp zDMVi>)SI=1k4D4*G?ENeI%CXYlg6{9Tf|gd9FvsI9^w$pz!J)&gsdEGV=J6xJGD=V zg>$t};oNAOr)YyWMvOAg^H=Z46s!v(@k|IxIw{_WxhPUH&-8o|ZQ71?SZ?}FY0Wz+ z(c&|~vl>#LwYWi)N$^x_4~L#OG-i$3>G*2h9WY`|!o!TNEE zCr=!mW-wnIge+pcTb9#)@!ApA7*$r}^1IonOxr&U=ZJikGPE!Ux=^Gnc5pz%IJyXn z3hG|Wwl*y+966WxbL!^^r-*s_&~i14*l=2?ZVA;>z`3a{1`fS)(dXUE`gG%|ZP_IH z`em%2f13Yx){j%7?`H$|X$Iq;;q;0XOrDws?+WeRXzQq;&IiS>ws@q~rh2sCkw~>X z!l@bfg*b+52}@;K*hnjySju7{p8%8BvY4&SJ%$DrsZc|g*wWUq&WRXN z&;C==42dysJ?q^7O#1cnMc*mE)6D}?rvD;ZYwCnIA#!8UnVv$ot zjtBQ(XW2NWJp_CX_H79Eb)>g4?TsMbMkLgO*1&cB!^AlByg{=7Tl~Vc{R+OP?1AKu0UT`z`g|BjNAHo9{oVc zNn_^C5IGUdgkcLHm;<8`ddOR6HsM!Wyh*l%5V! z!7UH7oF(*mSayTt$M+D+c|xp(?NWanvf(s=H_&lQw~hR3bcq`V`0SuEGG;1u4FkE zq(C!3sz4P^64!y{APw45kfvv}umvZXZIEk0n!Yv=)7F(>!2x9m0XKlONhGm%IX375 zJHaQxHgF->4Bih`h+GCf0J#9fZI6UB(T@kOha3kk$Lxq@=0t-xAiaGVwuQv}PpHEI z1yBQ0#PpbQ3kF@8uoUz{o)2z?zOGR0K&lD-s*&>Ty$|030v#Zw=iV#R7bJZuNPc5Q z4h2J8P;@Tk>D3C-^k@QUdNhDE3+T6c_z*h51mXkEgf?6dPyr1fO*c14Ew%!rmTI~O zTMUDh;B8<_z61y^gWMo;9q6LSyrL)tFG5q5FmnneJr^W9r^pW0=cO`p;ze%(sX`&( zU7!M90DrxA>&)o}DS$4J{I%ST`A-ElBLU2*2a_PzF>}g5a_9!hVF5@E^O-q$AUT{5 zlEWDw`ExLH#)IT9o|!{GP$j$WMeMh05k@&VK7<5v>|^G%f#moANEzxta$L*IsRYS! z1v94*q(JjQ@;4tOe@@y0mNs=dG*YkVvqt~0a5|EAjV-rFRs{WcC>-(LHgCRm*#(&B+LitJRT3? zD;){#3)z8B*Z`h~m9U;^cY<4B7cH#8TZRb8Zjk(>gA{-RqO#9y3xZp;ny#gdhZjb`Y0C7>1p3bxeUu4O0nPLDK1wJ7DPsW`ic2$M915VfrX&*~+cQNb zl0HLZBI(mX@|y&bzwz@h|F6SAEE0&xbGc8uolHgOoP%B6p^pct&vS2K_U14%L2BA` zkQ_Te8Ux9o8B{>(qPlE-=k9cRjNf7eRFaMPPffZ42^5(Vq`u3$nH}VUwOY(?ljh zw$A`>grjJ1E_mohUh^BlBKU1!+Ur1^;nQoGb}vX3c2(e@3KtnXM>~W8o=g=D5Ku*sTE3tLcSIdmcz#I3J|0$^xk(8Q{%y z{hzKM;QAkY7!GGJa~$AG)Fc_C$m76F&<4`rGJzCW?+wgWkODuzw3mWZum_}qSAdkS zP*^~En*Vt?hyt@k5f75%XpkJ*nD(~o*+HwY1thx$k?VyulDdnI@u z0SO~jJrac`b zztN!Hl1zIjNG+a!9YzW%@~+cq4`HU8MQ)zO`X;8m3j8Yy$^)tCoubbcy$$>l`j%_C zfEv&TIRm6OrRmI^XiyKx#RvA@40gB|q$Ritq?XA855hq_NDktdIcAUslL@3j)_V=- z_krZNjcIQJ$*x}XrJ^qpy(?b~@`Uq2TG_Hh&Hy#Y$spC(BJBJv%Ljz@!YYuut^%a4 zD+6hPD`nbCKw98DOqYEH4ni^5h_u2LicF*xt^lOLmJZSiX8~z&bzQCRL7v{pv>yWV zQIL;mZw09Zn?V`_jUbJY2Cx8j^*UXOy;cmWKpK1%pdL9$gRYcmF9B)Ld6@QMkQ}paY~XOJ(LLAazY|x=wp1xQ^z3Jtw5siJ}U$BE0}yj12iqdlHBxGrnnwBkZM*4(%30r+VepgJ9$jI6QqhcT{xg6 zHd_*iw8UnCRI@~oMtvx_8f?Fums}rcKmlz`dn0%&^mU+$^jfC92BdryAk{b@qyTe4 z3eYv55A05mBFtvmGeC-vNCBpcOr!wQKngGxqyQCg71(+i2iOAMi2|CL_F9kvtO6Gz zy^`s&SKxp$mVgvt9{5*uNjgYfF$1KoNCqkLM3BbJc&0rbq%jl6w8w%pXrsYg*x8u& zP>}q$&Cnkrn&1WB$M{Pq!2uOi3{pV_AQhAcQbD;)`+SfJax(4NAQhAa-VVD=rac{` zf@Xl^Cl#coPG;JZKx*kkBIdt+JPv3fi3e|kVI0#Q4eAk3SCkK-Zw6_wxAO)Nb&VyYV=)!^BfdeWi8PuB?q=?5e?eQQ*9LKcBf)sEx zcq{B|OnWFuep;q+z{Ma1x&ov?ogmGobV+wiL;F)gs3?w2m4yPNKw3cxOnZwM z>=k_@h&M6m4NQBT=(E6YklzAQQ-^@m)ZJ6KB@YPq3Tr^UML=p1S0x|VD?qeFdO6cx z0_rUS>MbI&hh=*)sJ946HBSa_g2N=HeLRRO_4IhAJr<;;*8)<_LqG)LN-*Jo`dDGw zdna=rcQftBKx&~b@J85mGVO;za?}7Ggx(42ODaeKXNydvF3bYy{XsfNEj0twaQ&Z< zj00+tM39n@w54OJ1i0j()6-;{pNd9w0KOfA1-kFN|j{|#_7=(gRFf@Uaz=lhC6xV|1Awvz*o+ars zK(e!lK2-FbmvFvA;2h{%L8?#-NEK=TsYUBAap{kTOs_-26&gnGbdT(B$0i|c=izG2dN+;P9N!wA`>Coy&(CiV&=G_aquiM)=c8N+qodg z3fP63bxvf~fE1VqtON_er@>6H19n{(v)%`iz6B(G4cH026QnN40?AJ@Xu%5PCv4F&`vH^Z;?vr-M{r>xG=|1*yPFkovqt(sPAbIx+tp zIH0~x25&*rBr$X7Q96%89?#5)2A_azW9C@E8`F$8<_Sw5UX)|Ez|A= zDR2)+W5W%0;W{$GjDxL6*qg{rpAS;x^pI4FJR76{GeHV4gPD^KQh;eh?P|L<#zlVP zAd)-Z1?-M?U#)`d0jZ&4MYf52?0iLe2I&WcRUqY`57J0T7Ir6aSY04Bd=qFv_>IE) z1V!txTZ0ym(u71RtaUtBI#uYyG^R#uW9GDiH13;0s`Flu>Rb;}oohj=a}6`c3sRk{ zh+58MsdFksinVX(}qm3o|_T{eeb!vptXZk9Un+5Xd5%96{HpP05hir z%+~IjVvW+fvJN6;s{tvSmzh%qQnpHFP6bE{Z#jrjnO?@Umw+@R=pnMSimU+1Ujaz| z@|ih#Ao=FC4A=W=rBL;^-1E+>8vd%p4m?^$ig=oWpXtFdN*D_Dcf) zq~$nJzpG%L_ZuD^>ENHCjsveodbFf>$Ke5Fkefl8IyE5Km4bf)i$RR`bT`vp0Jb1~ zzUZ?+jPmqMrac4v0Q#gj)bDq2Xh8yv2O^D!P?3o=9!wzBlWt#wIc;b2_&NZtqkupR zy>u_rUQX%S)l*SFYL0Y>lfX2PhKoa(OlFYdL9z=KxqA%Dhd@lAgmjSlEfu6Nl9@U5 zI3CI$3sQcI$cIL=oo}=DKG%m=CZ*&r1&1JuA|kcML-coV8O zo|zL5dLYL!bMX8rmogiM(MZ6|OSduY^jswxj>ksgiF#lg=mi_WnP7J`?t+sZq)$dW zK?>vmNP+AX(!+cx-6L|L&?$_Lc5#MdBbY71I$^x9YdGsOKn(SSM3F5*1*C$y&*B#7 z1Sdg01a1IZK?=+(EEHyh$N}wiy-xdlx;1734Gek!FSXz?kXo>dnbQeU3$`md(t`lyv%>a?36UPhw9~VbZ`BemgE_s^s6xc}E?Ytg z=mc{?%9ak2yJ&EocGqRrbJg|QlZ@AqSzV`nbeZ*v2~+_~I7doP=Oy`A81s;@LKqJ^ zwW}{j(Q{$u!&>16Ye6d73u1_*S267#@K)_Hn7ha<6(V_$7CMHp+&GjYZUE7r>Ge!| z4M_PaK+0DlTp`R8rhznC;zafi;d?N}Amw)s!8oJ%vXOuhm!8G6CxN$W_A4Yl3q+b0 z-634w0T7Ls&%OzG^tYYhf1)()4N?%=XyINsrSFRw6wSq;XIZ%uEIKWs8|( z0crGy1moTndgBV5y{VpgLF^|3BtIb_`N=agEufwcq;*3PxjT^awSzPZd|(cSZ5uPE z71YnJ%$ydG&T7pdIySv25bFvK?2SmEc~J#!1S`M?;i#OMQwA18E@kHAff=xKf)r>x zNCC!z6ksSw73&OOHVNy6r62|D2}tMn7sW{U1cA6gdVjHkY0n2Sc&do>z9CO!BHe|{ z1#g5S2k2C_FNRpGhFeu_)S4)(YZcOu4dRN?gX8{+9`%CswxSB8fGa=>*bP#^^Cg`g zYfJKY;V~1-tsn(X&*enC>CH@g6G(CIW!f7}iV<&&w8w{9theed3k7AY;0)>IOnVt; zNH1mDi$SU|kt*yKnMf600aArCL0SwFb!z876m?EG^@PvJ6{c^3qx{Lkr2KlwRDLbk zhQMo>b}txEJz(-1E~YdAT{_QmDwo7BCn?x3Uh^M3%x$^Aaz6>(~dgm9TCm6hpKq8 zD^&;wdV}H%L%K|)1~r3JA)mr)NF%r!ayf_*^+qU6;q$}WKkh{@f=Yd@y*|mdjKu;al0Jeg^2V1~b!6vXC zY@|o9?8ZSo5?%qRCtn7s2kXE}@EwqP=pi`vfC-=*q=E}U1DFrq3+94G&POuit1HF=7>cT-152dVFTAO_yhR&X!UTR^H= z6F45EK}>e_;0EYx!7|Vbt^+H};4x-X{SaOCnS#$q5$P|R$4=Ba;(I)M&9|uj*#af&!H)$XJI4Fjm zv=op*BAhrt%A5>RdZMIjzTuWwE%aJ=%;ENfJp?pD-=qRuBZ z95^Lit35F&-c}zXnL*N4f_mfBzGJj#c_S_65K4CVle=bFvuv%woT&vQZ6l~>a$aXm z%%CTF>Jfva^?{^q6xNHrR`ivU?iLn`K40`3Vk}%?hZrP_K_VGwBQvEP6;XGi!}apP zP1@Cdbt6Q*xkO#7t5-rDO;NfajE;@3EMY32VibbrXD?++d)5{0- z`h!$3U7}GsU7ArkU5V)dNqViMS4z5DSQw}b;gG~Y%YP&)K9L^WrMm-lcObc|6qbvg zF2G2yl{Oh;pY#Qk(o@7uTE%FK*`%lAQR4Ah*Jw+Kh&Nc{cznUT9v?^r(IUM`d;JFd zXb9u-2I~dDklEIAx%ps8#)bGt#TW^khaL#9 zvM13Oik{X7-IGr|ErO-GX?J9nHO1fxG&Ia>oTnOU=QYeT;D6mbv!QN&{d}{bW_~UH zm(Q=5Z!%Ub_Aahj9B616NZ3RJGhyf&U&?2~~TQ+PF%^LF+2DZIv2m zC|RwRu2xlpd$o!~1F?8D(py%m2Z)tLYE=v9U^&Yi>SnE;ihzC4sE3w_9 zb`pIa^$@ZA5w+qGu;vl9mRR+O>Lpe_s#ZM;Hb1Ji5D%58?ImDaiRvRZm#8ho+Q-y7 z*JGr3O!X0uJ+5{?4t74Sb`jeiSAE2mb?Sk2Xqmn1R2&+JP3w@}uwHFk57w<$>xotC zRj9ZHVqrq z#*OOUjg+)eb#DSoH>qVr&nC5mSiebaAa-t2yEY*#-zF7@2I3*zezRJ(nd~>KCB*Iu zwYLH+*`k(i0o%5yzAY%Ks#5j3D%F}wq?K<|E4Cr6d7Ij@O+B!U%&Jsh71;DUwfT3T z=UKJnS+Mh2wToEpRV%#U0k7IhZ1<|2M4wkZMD$jxHPr~OqFTkFfmm6M^v-Ivi`cMT zZQM@%U$2sZMPs*1oFNy$ZJMQxEI|yY{Kai0*gQ;&;L3chweR<9q7f_rTI- zwX7NRwx~5NVB3Dxw;ycyKyCa0tp7-LHGG5`)qkQkd;+$AqIMEJpQLFt7=W5;Ol>WI|N%VcL9wIh=q3- zsx1e>x`QsYo(_5ss%{_H;8PokC10wgUxJm#)T(2MwA*9o^%&4q6^8l>uF4H<_1Elai*pDHg}1sU%={9Ba_r|aJV^81t@vhNx8 zxBLOf@PBU&%b%{)WtZ}*Bs8sHgUerFgW@$TSBQKqXHfno_H`0qI^HtSE16^z;E@V+ zyII~N@>L|GLUm$KPr4X72>(73gDWTj2L5d_E)If>lO=vyt-szL%d-DR;I&jE*dG&z zpHT~;#$8h5eH0L6rHb=6;1Y%W#fiVIl;4GjFWb%r|BxCwMP4Ryp2%I&Ld7C~AT9K; z$nWSi!Z+BTXMc?Z>h z_%|u=nsK@VrR6-%@VK;4@n)7kmKyuFLwU{LB{EC4lRp$#FZP`>NJC{%y5c0mWXW)y z1mxc*sn1bmsumr578MXq$Sem`U? zUwM)OKmn~1;S?$m4(3Y@dPPnXIYjJZw{U=Cr2_AXey7MUiF`Lz2>u;nUnv!|?%?v3 znbK!YF_<6`U%G<}sFE7yi)@iW>ECrE>_HS@L;=zw1=5B7T}N`<9DwXHqWmN+m{FzI zA7fw)3^1ylve5iXYW$THxKkDy|L!3h$RS#&K=cp856N{R-$*iQtW@F;ukWNlrv&Jg z7Fz7u$p$f!@VdyWrHTG7@>>)T9F|nF{Vx6&5k{)Sti|8+w3MGiYG16kL ze2HkIH1U1A*kQg5q9Bpal`gqbUR(iaJ+jZA%=Ql=Fp`^6 zAftPfbI#&~x)g2PUDi>q3^Dw{#_4TXi0IX1VVS<{Nv}InS@v(-Gv^AH{aa+sgdZx% z=FrWRO_#Fl-(ssq^c7fF==JtFy56W{T&BHym-U?R=a+DXPAM>biDp=2ogDmWA*WZS zXfqdCCx$J(k7T@4!aE##eXp%uWQ_@Xa4{#RPT=GMZO0<(71R71=)Js@)&8CMe(!HL z%n^D$DzbkIy7AI+H7VL9cU!TaR*H7h-PXyjPU-m1f5TDvw@4auF3bLXj~0vU-xlc= z85p6cCA~&r?oxBD$Ye@`>>*`!{d;5L1W(OxmE`v=}45QO<<3sGtCM|DrQ>0n1&oEH~wnjCVC6 z57uS3;_%DM+1|#BjPmwfEVs*|wTOlu{CjtETu&D0vP%h-gz*%B$*q)Bv4NEWfZQqa z@2EhmYVV8u%^j?NLFBc|SboFH`BzW?$p6{1ET2mOKtA*w%QGnelgq69pxNYI9*MvgR0xJaA*z4dDCsSN>E?N8rZgSC$DtqZidQz9c`CQjicUx~6At6k>Sh-^Q z^f|W`&buwYU{1l@Tk~$aSZnCEKBe71Ju+BZ(qsKxE1MA+YMFS^zZ>qJ{R5tH6Yh6) zVSkj`==V(#YLZs?qjjvBr#=3jX}A`=5fz(pdE{_)f;Q*!$QZ45Q$UuM(QAD|d;ZGE zk=lt~>xH|gpRi6*oij79oN!^voJ1vWdd8I#C;1QjoG1qu`VS^uEGd(c=zy|cq#q&s zqzgqiL71F4XLn*nz$jIFtsXkh6nBn?UNIugN*Pp=WD@+sL7GBSX}6Jh%(`oMkg#yO&=1aWuy%@ZTQ3# z8*Y-5*ghGl&*{#*nwjyHvNR0fQW#u`E|H(j*gMH>&1 zS$!qGmO*#zpjnfjE%TUXGWMdSfk8Z$c(5s^OwfR?fTx@88f1ywbG!7`2T3&&Wf~YGn&Gp zgT6DGw)Yr~+kep1%c3s0agI?r@*{e13fK!OA?{h!mfhI#JJ%Q;jBCurS4M2vc=&H> zb^9|)%9r!#YduPt86yH;sacC}LSaX6+x9PwQToQ=q@!Lg*Op!ub#bI^J0)PmT8J{BPDm6k}^>LC2dKLa&()aZo6({P|s-7pUS7BgI3E zaP*|9O5Nc=M^6y=tzM%93`pYK)>BISiWBpy1rMPO-aIkNk{=`%W?ZdAoPjloR*Qz$BYq-8WrbtNFeT zALTM^_qU|aXwdV<;XTn*5lZw{X3VEay@1TmKck7nzGjR_Z660 z+;hiaYc@{Z`Q6!SwJ(smItpEF#n6k?efBN9IQdKX@K>08x4Rlsye`a9&lpTEHL~MN z6og9@iw~_yt?f_8N|x!p)$wXf5LOPXG+u+cw)!T=t5XIki_PkmjVjWDa~e~w#9Uvf zc2D}&7_@yMdSl#3C1UUdM>VZJxjQ@?AKvls#@urhy;rcFTY?8UdP2YbsgLISEPS&r zC3l*VqJ{o8DppG@4Ug8^)1z$G?_`|$KnjXlXH1~B@#?5sW*_s{0+q+6g1 zp$RDnJw6w$ak(hE9bsU&;w#cL~Nj9lClHHSEQ;^UMavocj5(dKALw;??q>6I9@s&cVa_wW9|Z`<@!U(Ur8x8JA< zbuq^~dQhi2b0SZRpg2@vyrXBV7gHe#&Kjqt#5ZDb4!xoiZPMhfHIgS?f$&g>V+Ejh-7bn*M&s$SdXij^=uPDq74=mK& z-$Yw9U+?fhm!{VWBf@r$I=I;!&d+3!{ob z!c%pt!Sbkgp1R*(W-eA`ukozHrcsWbYU7RFd-_tU_ZZLWZtqj8`}z#khhvl;s&M-h zHKp=w!~U(vOE+4|X!YER1Zoi~$n11fn=w72Mk{O2!s$20cveTH{@e$e*F5Lj^%1Xh zxas8YbiA5oP%e&A)V26fb}iX&#Yz3m)imd$^qJ$gM=#)FL0ub!JX0_=ty!4E-lMI_ zUZs0tEXJ7?!%CNp7~50cOlb#?W2K#BQtH~H5R4ktFraBuTgn~5+um6F@rH_;b^0RUMqt+(&xSAOcN z+cHhrVF*?-x7;F2p;1|TY>twWDNCVe+L@QaW6vnnKAiPjycY6ln4I@5OiFG)*HQiL zQAcr*l5z~~*Y~!P(q~jt`p(ARJp2{m&uB>Li%^&Koo7ht zK&5C|Q+AYXoQq|R{OTP$-H<|kNoy~qp|T6~+O|)hmf|reNuFELA#{o~V2v0w^#$kZ zqSU#o@vH5yM!R$MgQ?1ny{XO%*Q6?g9MIu3iuTS8R(kqehU&gyO3&QYt5fwUgBJ82 z{VW;l&&0~2oAg%HDi4HPTo}u1X=0=9`dSsM#2%m%HARq%ZztovgZ`Y5_B~j=26a#L z;d~h{X?Q=#I`l`H+C7na6cb!eqY+_7+Q2?*!s>SnO#!2qZLmW>PE7Iio$N?bW*T_d z(77i@wRCL7(4ZB%9TRnr!J-e9NPVcp!1|aBsM9M)7m=DTGHR5IuRE-6Wo=~K)apHk zppI!6jE#mydsDEZ$BV|QMB^U(NvS@FhnRTL;M9OKQKEBb;pKrmycn+MU-w`LC>%gEs{SDr@Jc=8pCtC3CDA_1;+M$0Gf_9@mF1HMnD@bHbw= zJB}(lpWp8L*A#Vd$Bh#_^ep4LDMoWgE>7F=foDCc99j7xbw8aIaFz9e+321XWHfK0 zAY)ax{apk)E(mJ@()@vro2#tdV~FZ-YNKzD9D8n5$D5eHOJ8(UFW9bB=VG;V;S^16 z7XqgpnA3fR$c|WT+3k@drua>8>!g4EYq~{0J56lF^I#|zH_G;)+$JAuD|9qB0sGN z%HqSY395Z~V=T^qG`eGP1{{Mk;8>gi7yQdue;C(p9nVjttAQhNXE~N1HliKRo36{> z8mFerK-%13^#x~u+x{(d3$~l84?i3XMqr$1%_0gm~QMp3(y$=Z&3A_)jn@p3KrcY-(aqB`v{(^zM^+< z30#!wE7}JZgMR=YO!ZyVq|a?%(cAhZvabkp9rO7-1WK#iSA!HImO0Iu9yQa|j%i8b z)>qW1FBW|+oI-GA_ezdaO_$eT6!4|JA5eIx2S+PIWV@ zQCVIp&gKfy^;9ko8|_h3RM;6t!uK$3$KNTV0T+^V%}AplsCL88kASx^0?wOu>IisV zM!?xWGXl`D7y(I#(b*UPv+52{k`aIr(Sgy>KLWm%5wQMeM!@O%pBVvKOMorXH9crQ z20t#%mF@A_judLpapSo`uivq1B-l*LXo7T^iQvN@J#e`p|8#R(p-tjp(L@`b{i0v}m8YSZlW|iX85$ zgu^;xgq~49@$DIu5|0N`weK=4^P(1&&lvW9Id70YPxcfIPu_EML^9QmuXvO)THY~9 z^#DB*-~j~KzUQ5kToW$mw>eV0CgtKQ5U~IJMgilxmjb@DKjJc6A|PTt;HmmWiDkP# zFml#(qHp3bI5~N?`S%KtUHgwXYrVuRLxp=xN>V{M&R)3aS&DlLdL`!!N@*H`N)`>M zq>(GBcO8~Udb3YmNx|wT=K-yIEI@Bviq+cRx`_jVb89(^B1hmhE6V6Iaaq?5DC-%M z-k?<0&y_)ETYr1}+74{*+pC}MeVU^uP;c;)o!dSK9fG;ydq&#EfHx}CHW=D^+YFbs z*@Ae35ck;w;+=jnUjK~{iTlF;)HuJ`HdCamqw2}Q_O`+dS$Y zH&auZsBOkMdde_va`DzAjm8h&`{;do(3oN#iZ*(CK-^e^`=>sSpG$vs0O8lZ|JJ$J z4;VkO!TR9l0Td&J%^OhI+lKza{#OT3%-h@$H*-VimEB`ViKoh5G@$%>{~P5inUQl9 zZQi2D$WxY~_C0Tb%|WZ-U1Ym)KtM)rHLr12cTgDLcli>xLjB7C z<-^5J&lv*jP6|H5f=<`M{`IiYtPhzSz3@Jj3;$3#Ij^2ke|g9R{`;`RM^OD``1ECM zFukF*;0^7|pDodbT@^JF_n!Lncdkvx`!2TN9qG%sR^MZ=>hE0XB!aJy;zEPhQxC4) zae>j{{GRjB%_xHRqv8Mq?!O+RH0yY!Pt zdmr9=(gKGI3z`$T`v&yJ7Bq+%z46R|2AR$c@;~SeIlEf;^!l^Cftv(+;r9$E{A<2a z^LPE3x;*p$_ukmTZ!Ueff*WwQk=~#?0n{6ECm{FT0ljfhNlBx*F?~RT6mf(6S9@a@ z7Ke*?ZlE_JaK?$E-iX-Fy}WDPn}(IZP$LVk*5ycn)^G8bXw@Ja7#4Z6VNYmsL}ihF8?+6>BE|a z`!n;@{q+9xD|8ZN+J(Cw^!{4Ew}BPaJRYM4D=K!MKpJ1W{}=tZwzuOv(KHs0aGtp8 zzwb!Dx9&L?e(<&kpEmr;fLv#&8QqEb4bKPsSol{uI)fjqa^|z)2diA<&-uaI4*f02 ze{5=8^EAc65w3ag+x`E3K)9~-jDjCrS02&3QQhvM_gnwPKHJ_-7iiINgbTET;^@ES zr*E$-#XKC2a25O~|G>iVZx8LB^sZmV+U2oyPuk~~ab}6Pbx(The^M}Aw^&i`HK@T$ z{}V?sm<1L%!d2L2__+jsH{oyjK%b}GGt_66QD&CQKede6C#M$P8|8+H}`f#qQsP7tj zuAd9AsB1OvM~>6RER77ueJuKL3!g#7bbotP=^lsMD*i7M9K*QV^0?BS zYry@j2k-$l?#$=@%h279)pNlZL-oQha5o-#`;d?Bgv6`n_sqC2dl>g^7vR1vKK9+I zjt$!6zgC=!+nn1Tci{HFBO*nPt25Vou z7H&0tiO(6dj0*iOx~ktA^WQFh74 zrFzb)QQcR~RrY^t9E@MT;^qym1Sp^LS-yKr`Dysm-Q#c3-Y(pEkH!6x>yRhy$id`X z+zE25x<#Lx-F-v*qWl>PzVEBke6Qhq6uwt&CKI*s$tFSr;s!T9zmltTstU>Up#y!! z{5>{^$^D`+rOD7eX#<+jijRr>AC^%kkS*!sQ96CDO?mFcT~A8$;8qXa!=*Hm&5&s| z5&1VM9^Be-;uZ}#A?G)o=&Q>`*OTKI6>lR@U9Ic7sQ6)SXvr;EqIj(@ENbM2^r&_% z^TF`&-T#^ybzIfH%nOe)${p|D45c#&RmOsTQG&HMjNw+7Q$GI8m5)E?4*2-9uLwhw zJ~a9ofApczbo{-IzoW{sz793TdD_RHz6g#+zpg|+A3pYQ;jMkF z#D%NB*XWx7bYZ6DsUvM>x@Mtbb%{TTr%wd5(%+3RrGAI6r07>%a^2gGd%EADF1h$* z$zK=x2#4MCbqKj{BKP?f(Uz0$N%}?ixGnr0nxWr4n)Vo4;lJV@_w)_;>WUfn@`G?M z-++7h|F6CGkBjQK_y5l>3%lrw3oPsci!5ps3>Z*UNZ1Nd8-EakN)k-4pn}1KC@Ll- zG1)aG35mABhz^ak!IpcAsclJX3r%UVHrz)^;%)JUPfJ?blGfXj#M@%SO)$ac`+A+3 zgFw?Z_j|wJ|32p-KF@pRJ@5HF=j@!BbEf7YKPM2D_szj4%-j~p}4joD*2yB z@W=nZBS16%-{j!4AHNcE{{7qSC|^8tc_;!;-$RbPhsRJ{guqTe@yYu^bM&FM-)rZM zCR}O!E}SLaS>u}HN2#8Kx8C7@kLR(fl%u_Qr{0@mJ!Qj_!=d@MQ&Z>B2j>TTLz}eA zZgiN?InAat0Cq36_9d!6i@Bg@r;Rb0g}ojg8cs_veqO?k3f1@(~? zayV&w@7LKqm}2Lz-762RM{(bbCqf0MQ2djcH1lj5#jH3Uy)X&Pd*25ipTV>9Pl|F% zj4Pl$GGE3xwX{xRj;2$eqbbp^H-9fBV%X_&Zecobm${Uy(|Df3nVbn}%EGLA82t1u zNB@sM*6XPz6wjTJRyGk95ibXmZ!R&Bs6TghsI zWIy0D$Yk778LN@rM+RSu$RAyU$%9w%1b7JRuTo7o|M=tY@i+SdoWG4#o+&f(N2lYQ zkFmF6**wX2;sUPc9??$mQ8pjd zjt}m`;n7YDuN~rIc(j`Xdy2m3vT&L$@ACgNX_b1?WckR}admO3Xn8!!`pR!@5 zgtv4p(OMB}pNq=gM@H{MXu1zZX+^K%&S43baGk>7{Wfm-mOrLlYC%h2i+MFR?=t1B zkYB~xu$_3A`zm@iR;iwOe?lQ%L|c6uHx&y|fa~-EjP<`89Q(M)DA}d(cpdi`M#&B$ zzhsaeNM$Ngf4)FuCc4R;1Ox&pNIQ$(m#~iA~)jwsX z7R4t2C9HEw@mn?x-I#L7Wa{Qk07e9?8A=M#_TYtg8ymwKpXJ=oR^0Iw|MlY~T9jNG z%C^Sw&1NhC)wIi8E;{&iEW>@;G&+Q;51)axFZ=RGpWF*#tTUc6Klu_C2mF`|1WY;4 z&Bot0{5^_4vpMIvDANPa`4^aTo+5^n`n{3~MZ=c6A4OQZQ9HFCwl|7OEJ+puv{V)*-0 zamVP~DvQ-ip#Zi^Yy*NHjCX zM6z2WF(PSZRH*3tYLsU#7s>G6l`XLTC8?o>$Ph;N62o_5VQ*GLl)Idda8vO&4T}x$ zMu~WlP_EZu&$Xeeq~b3Lzaj>)cAM^O$ zi`P@ILu|8Fe zd-|d;mS&PHtM~AOo0ErfiP_buQjFPR`C8Y!>F|F~tqu|mXYnI#2$q;JrsfP9Tm6K_ zmV#-4`tinwX9#*@lg|>^B^gd%+=fQXRZ3Z$MkvK(Cw^udDKt{1`(rABDVuO1i26I1 zlZnfiXwrt?DTCt;0?U{RAB&1zf@EV1A3?H@p}%~}z9OdoTTHT_zo)}zU{pomR5XEU z=urIO8DtHhl*6$YSB`hK=lP4tXkx4ZF3*8HX?afSgaxYMC-ZV%<+|8N*hdp%JgIXv zEU(Vbd6Mpld4A~;2agnZoXpQbLa_8ubE2pJhoSr`I*%?Zowpe{RW9QR&yA&%B6*QE{|C{TK&BjPI>=F2{D5oV0 zRz&Uw*IfUTv-3{j5_k%2S?^?Q_cl}NXdo=;8?@r8_j#`IlkNW)+W*jej6_(XcNA4w zk1HhJW_pIVb0~oEp|5hhHR8Iaw?=h+n~C)sSTOY-TGw|GAHrQT9XqVmxII!j+R+IvM8l!R6e=)`*9K|lTsjMTl z*!6^Y(tQVB#&8Oc-ne4$b<>snH;k^rg?we0p7=iILw<{Mjcdkn*lE{7qi^T_?jtPjN;dqBX8WqSf)MkpFG(lv0IQ&GC$@K0vJT>KvP9K{Y~!ckCu+EJD4<@ zcknB@YcYZH+een4`t75$){efuO*{X-J_CdC3n@N|Raj4fFxZ=1y`eTwx&HOr_cfK3J zodW!kgxMBk?LK6Ub7S!j$DT-N)iyB&&}&=QS_t-C|qlh#14-8uaP z*FRRqaQ&nEZ`VI&9`gUq`o}n|OW^uP8y;zfZG`(5wm zql}J+X_ud~q6AQZhEcW<8o7-1k*lrohr&^rmFDn6J!aeMoW5IbN_h7j80CsllB40Z z7(LgaN#{LwFn9SCY;StZG)lcWh~p{5(T4hBi88@`s9&2u)OIKqhNmI2O04|SFeMj` zDY++6$$`helAClXDLd)ltZbzAQV>IO{pT?Mfyt`?ik;nzJ#u*n7H=XEociP?#h8uc zBXB;|CvnfHsX5Nes03qWyrDlT{?i&2 z)A75luC-wug=Ma1@OseAuD^D)-|1?xh@zDV9#OsB74!tqWV!y}AhJ>U#Z{f?hncwB zDXPcs2T@q=T4gaKpW>pI~)8|BVLVx3nWdKnw1uoG*-?Km@W<)O2B_qTQ7<^wk) zyyw$!f5$NV6N7(_a$?pN6LJ{yb$ah{xjjLYD{o|sOwi}bLo4vx<^P8Hzh!W>9mJ+{ zqVeh;7TbXQi4s&Z=f6NZ>OjltK_AA>4v}<^E6)Fq8rR4zFJXGlgsD_CX7AN|oO*O< zW5R-sn0MH`Q{~S+<9^5RX9bPiawD#N`B;hE-6r+N6I$@R3s+-0^7#m_=-hKc`4<>L z7+7^vjy|*2ZOU#mYh$LP@y` zQ%JMPF<=TgZNe`TZP0JF^;xtbGj_dnhB&$`T2IJae3dQ4a>1evhvaEmyM+q&+t=Q3H zHdSKO)1+k?sY7dqOS9P$G;1wpjB!%e88n-!@Uv!;?w|c8einsEY?zHC+6R)cC)?4J ztc{uNjme1G(K<`JXmJcDY6GE;GfCRTP+K5LYq2^8618@#qb*Tuu{kcz(%NmdPH2WZ zx)QXpa7TTDc5#|x#H)=>vjx3c!0tHh)f()!(IoB6497^k);+@!jMw`85sslGZ8XA$ zeV;=!9gT_F=uF$7N4wy#kIvPaBkA56<>*h+x}$7|leII^j&mNZJKEOd(b}DMJaZUw z(tS9_(UYV##M*jY%B3ce&4CP5{-C(Tsu))lQpiZT?U+ zFnePtnt%mPfe_oEMXL|#Mwy(mIN&m1;W+|1_(cNz*)N#z;i>X};KmnUx0~%~!ChuN z`9|0oTArrm+0jV&*>zb>(#=2F(XQd9BHLc0tt`+3+BLMsx%M(GY!A_l-9jL*~QV&`z-C9`Xp)yCN7vwEoS?W*<{kh?#k%YxEu8pj&J)9jLYKeF4xmDc4_PJN%cM2RxKZ& z4LUn5WO2vvuIOh>xodXax3y|#xwm@%wtFfbxZYb)TV1ierlQ=tbg8$pqSjl!^RAsW z`_jC3?XK}^-mSaJuiL%Xy9)w5#gC4Kt_okVdsofY?KS%}vEf2>yXqb%bXdj^gAV z+`PQ~j(LFyHi!OpmbQLV&EnG1%taZcrTZ$k?yV>)x};|Xvo ze=mjx9z|l$W6`cPHQ1ZLqa5kAPEbFf)cYOMKWmDAqw=>$N&i7{@Orn~rX;sGxi-O# zUt{`V5&1ds?i3~UBU^}cJYlDmB|L%Fk8bh85tMVBlq#o`IgjdS{WECesmW6QYqB$?f_F-CQ!r=BgWn?6k0}W#G5nWEZ<~mGG}`4a z<906|Q`D=Kdf77RjW2yns)st|KZ@~^M+^QYwu>g^-;_h&zx6*Y{ry_@^-^JK!wV_{ zJ<6XA4`~=LkY44_@9grJ>OZLbgMY_=Sogn2({gjAfifh2Vh;F;cpm)vG>@qf%vJvG zJl&h$M41#mTlqWlr9bvBHYK=Ilw_Y$eFaK8pfb2pLP}tV zT((xkd)!Gjx>kiKY@70rOYoxyHba7edjTNzlr0`pbC8M zX5Cw}ix-k&-6=|98BL68Olf=9OYJn7&;lho^gfqba*On>M;%QZ3hhwBimJ-o&H=}PT30I?o zXlaKhi-VKJtnJdUQZ`-=tHgoHz8U3{loo z;&Iz{$Z#s>tx8l`?VRB2ahq^|@p3|v5kz**@P4IZ7p7l&+~yscIMft93%cyG{yzAk zo28#q z;cG#LuK^jp3}pBckl~BKO8jU@FTe>6tORKw4Wxm&APsmy8nA;jU;}AD1DSwPG)smb z1{uB|WcXf?;m?5#-w87O8Ia*mgMJ!l#R&~GgEUYF(!c?b25LbXC2b} z1K)Nae}u2Ragd=*LiUYeyrSL+NOzKY9LFe=)Vt`%Ngosk!I!`R#eT)ZU@-#LOZuuo zjOGPZlD=H<8wi&M-VXN^N#AgpbngTi{*0ur9i-lANuR$7C+A?`bcswrBRCBCuwo@h z1LcywLhxVU--3buBd}Pp3s(h(YXzB+1|=T=nc!MUUzYOsN`HU4Tb`tkK#LI#OZrZO zG!y{wui${BuNeF`+zY^Ofi1|+YhV+|1eAc!gHCV|w1AhuGq=eES1Vq?#r7rk|3Uo( zMXy*7G9h)6zABIjsFd_&fh_X5AZ!L>;(TC zw1Mw~_@R%_m1b5zXfX) zSAvm9K%S&;F8CYxcNNGwuTkt@C&TxGZ^FNO9m=1EyWqf-wt;)WRuF|!&?4z;0-2x& zkU6ObYv5le=?j40fqX#HR}0ck4TwT4sFw6qg0#c?T|EJQoH#Hbbb~KKF{oq`vabtd z5x0ZPc^k-p^&m>Kpia_PtNg3MUig_Bevpl^6=b6efDB&@GDCC0D6s2BS=A)31)Y@9 z{#tp$i@|A--Rv+(gT)|Qb&;g65M%^p`LZM&AWOgoGQz<;$u_V7avjJj$^!>M3pfI5 z;CtZka`b;H4&vkrcn)OIb%QLrpro%0WYKj>ZfOD;aRbPR1B%s(S&DYW&d*4_W<|aW zo#F7RbG$zrCwa=jqB!D{3g;BN6!AhSUB4Q97~zV*uYq1gzU93Y@@bGct^pqc%RyE_ zHpql$fQ;9k>z5}NZ_vL5n?3-ZfJYZd#WNrk8x*U-FGA+$Xik86Aoa3A>Nyohu9tcj zK z7eVR;6`Mfn`T3&dD>%tkbSic&(=^mZL8qjz9c1Hd20s8BLAH?wN#9|RZKPguO9{vX z7J-a74~z%BO6JRn4)FfJ7bj!zXa^ZV0r*WY1w0LoE|DAn&q3}1S?5iPMIa+802xs> z$cWrZ9?sGuO78&~PaDX1ion;{{|j)!fVqlT+NaB1izUy1jGzHr0M>)4U;w-f9sn7> z5d07&P$0P_OSyL~l8vziWW;WedQKAUZ;M4K3}s?Y6$<^}3t$;Y#S+OaSs)XV1~NjA zqFu2!L%IhQ+Z9_B%N5fUJ)nOWh6b;b0oxRt6iXE6Dh@4_dOeDDAlg}awURSHG@o>j zl84eY4b`3A2Qr>&5Ve|KqU4lxls~E|-KiV~)3~q_0};poO(04!y-vw|IElha&sDMw zMCQ{+u9f;h5SdCpt>jt|X-_X#at4UBrF)coae?ap-Kbbbct){Su~M;EF;|fdfsODS z8Uon{GJKU{38)WH;8)?Eq1;DOq}~9CsMEXsIH5wb@;Izmt%x^f=n-g&1M{VU7R3gT z5!HjVQ?A@o6dfQV8l5NodqE~NsOWE1Cs_2ZN0g=LQ0{%#$N=3SBkBSfQIm2nQCtZ! zqBP}iQSKviW%vtkTs#zu6;~_T6~~gL;Sunw2-gd;Xz{F9XB|kp zHOfCvxo0RkNfwz!IrMmCz)p}UZU<@juyQX{%mV{(&j9H^mL$VnR2)!jS8Pzk!)85U z1t5mr^lZ>i18(JEQ#?0IDt0NBfUVFg1P7@PJ_OppDDZTmys^L&Z2iXKFvybV^~j4* zCwK*NEBFD}44%QY0}r14Jn=QcVF)8#gXETS@HHrwfHbrkuA1ia#4>CX%SO*q^%&7*BfrBwJf>w}vjfw{p zs}xr%4mo9a?o@05S%q~VtFQoM75Z~=!iX$jJ=ha1i>OhNPp?>aZV+Qh0k&+BK0C;w z=kqvL6^$@q7b9hc>Ojh6;Mc%HkQvDUFM(qY-L5~q4<|Hm4rG8%5Y?4FSIPW&L<7S! zr2&50od%jgCTul08_WaeB7wP*KCg0jgXr=FPD$Trgw!7flhOVPF6t+muLVTIO>YFz zvkDp{eTS8M07M5VI3Vf63oCW~5)d7spjgtkQn}}XXs-p?l0FakN7#3R?|}~RHMGBU z8%~(>(HWBcirwH#aPI;~z;@-{1hRzcmCQHtGklq1AxQlKC9eco^eN!4L7S3??CAgW z=)nn#v=L;H9srrbGLVJ~z+TV}{uCUYE`Q08UC7~xl1a$EVen_r>ji1|v|_Vj8OSOx zo{sXT;Vd}N@LbS=hDy?~SIHy|dq5h#Fijd502#g$WcW6a;Yo&XRWix&Eg-{Jg0F#P z(@_4yILU-17yI9VUj(HSQw(a^PBd}aXnari0dSM0q{GJ z4@ml|K?kaWd=c(dN+u!uDnXQhH9Zd}ztqHUW;kO_10wNpm&^a3us;$iGuQ(@2)PY> z6Kn;UK`cbm(;EPp-g4z$tmHJs5sUQi2bpdx<ixJM) ztt{bIcrakI3{cP{>1&h$3K}GRbs#fLGQ$BSlg#h|5E)J{0)Go;kRtsF*Ze5LT1{mgwc zaEM&n2eyDHzzF7-`t{%t7yuC_q84PhYQ(R72`80scpWSQ{~as_p9KrSW^gt5WiSss z4rYS_%m5z+Q@|$B3!VWTAcnXI8~A+?&?Dqk2$>JdQ}l`-TnU{ohOdOW#qh@1GU1)& zw28`1vF@_$Y5I3!!ZN^7ng$tEQyj%8iS`vX4AOrPq<>JcMKPer(V6X7HW$2pM*F?Rg%-TKo5xAF-EVVrZ|dGQcoF(;D0T` z7wN!Rx5mah_*rWDamdw8);{H`(v2S*4)cnBuhT9Qg%OIjvq9=-fV%$ht+8%V{c4Cs zc#@sA>*BI!Zbzgqf#ZnkrlX;eJ?M%Wxj zC&I%utR2*idvA|*+V$+fg~mnjjW8Kqo^s(Bz%U#G5Z!MOonFXP$GY-bkCdC8{;bW^RgV#{YFu^-)%HYfM`VbYfd$t>zKesLN_@NNh~Bn#Vi= z{NL{x@L0{Ao-X{~H7hvFYHpm>g#Rxl4kwz;jq{r3SBY?LY*(8+Y5x^}7%6Hk&(lckQ;CgZ^&6 z&D`nl^21!6slU#INFOtGJqDhB%GCap$!2bS%GCB0V6gm#!i?5SfFekIbj+-0iJ0#bvDDl zt=V*%JblX4ehO?oWojc^o;S5V4-P$Vx=7Z2!&LtbaO^v#z<0sn@0v!)(KDto{~4TI z=rj#=f@jW}I?sZq&zjoFwjY~L{}{aZW79BM|BC7GE8y@erV+Bf+jO`aErG|fWvF3w zPI(pXviZ$a@4b|8wOcCX+m-C4Y{sx|d^yZV186RWjE%SY_pk@6q=EbBkIrPsH`4&* zVdekPV#tW_`znHYO1`Y*vzgNW@mbVKGe?k(C9(g;96>ggz{V=sQYr1djl?qn#;T+~l&JpgWMj!|sEV*n z<>(=Y3}CE%%}_=9yz<|zO6;_fUspx^EhSr(+^*#KNNLYlEBiYqjW9i{L`)-mKW zO72ocYAmuHVgisuV^QtBs!ed21dn%Aj*X?VD^UE*v9VY#TxF>LW~tw?4E0Zg#%kG0 zRp-X)*oRpq@HbY&)-uN?&0?&f>SGQe8;huZ&+w45x5)^8$MBF3E4iN;f^00f`daN)Rl>o$^$hv7 zyHybz>t_$E6b?!Sty3jPu8+lix9SC43d3Wgl8xoBCscxs<*w^hf{X>Nx2yQ%8dcQ) z11dseQR*wI3JP|}2s2|^?NNOj8^MgTcM$*(cTkV}<(gGxY9C3vMuz#wJB zuk}SD09vWBNb_G*j*Z2ezflo(D1-Y|f{f*vN0Jd9E&aYdGQqUT&t3QImGU28oARKN zQ&fVuV3WGq5miUV3eCOveZd5++$;_JDPGEjO1?Wz%EpS#XH2{0L=){}MW!CV_I{#tIDLnV@DY`u7G)q)6`8TFGFw)WW~?Lh&>sekg@iw4gpiFz zgAX%-kb6~?E>Qj#cF6d(a@mcv9;LvCRtzw#B(zado?&5ugez)iML$ zX9Qu0P*q73W!y>U?UVkm&%`X8DX5*vUn?C>O_L5SO6K+lDsaMp$HU6MXPuPWm4Dw_ z@!(O{Jb%~%sc)<~{(7pE=c4QJFu9~`EGzz8w3Lmdy{{l~jIS6a$>UvISt(Z)Ntr*? zDc6)qd2x!;M?v85Yt{3mgRy?UeW8+7hMJ~R)-+=u#9h}(*&87ZhNVf_*!RI%I_h&q zm&eI#rQB+j@*B$D#VE?C#*cBr0LJ?I=ag)$*Dupc0Kfinq=8)JZ>-nvnj^y->;G5H zma?${B3jArJQ==FFJZM@pUnsxob?3MD*$}3d~-lwX(T*?22UvaDwE_~OU@m+d^L9IzC`~VG<3dVZ&KkIddDoBtK4lDgS zrJt${9#Ha^l)kY&mtm^*=Rlx*zuTQ(VvO`J@!ujNczK3&Fc#P!XQK)W zjE@6JO0M54_1{aD{;QSzmvkwosBxm2`k{gGab<*!5OSUxXWn3V$o^}T!?QF1hx^sQ zvsRBVsFkS*UZsJspw^<~@6rI|A*Fw#o`9e>to(0B_hbn?<;gm`VOb(ViWdIOxtk8TV&6Xl=JpDeFkI9bL!awh42d5XON2CRwp zu3+SzAp13Jj-2SAy%;%JzGq5;#FPj(Pmwt*KOq9`I>%($fwp+nA3fv|l+0BJtVx(6 z*Gvk4ss1Sm{0n;1#PFx4$aAcd{YTJ!$MunUZOaVt;X3O=zd#+1d%*o)(I_X%yOJl% z+olxlCe-;v{Xb9fKQP4}pZrYF57Ba_W7~jh){Ws)a{TgSMQt$}--LkLXQ#+-+Qlym ztg}|7PDxNQ+Tz4;$y35jpHlL*j90vHAuPdcn$dB`&DN(wVvG-Sm+q{o*vsvirMoKb z7a4Cw#)z>(>oRNYeXCY&EGj*kd_1|MrP;O8BnoGTImNrlVG&1LZd)Mc%nnNzB^#|b zh~VrntFX-p%NAe06f!e%6IP)Z+*q(o{)z}Hd*66|8zHP#y?I`=F+Jt5~f*^*BmW-B{D(U{>1VTNxux6 zCC+_-kKE3@Hf)|)USv%WiD|Bx6VmtR%OSJH9Yxl(qfdV!OjLgqGC%eo?E0PckJEW{ z&wBUt@p4(2A=;xN7l_1YY?Zz)KN6GPS3)BG7v@F&t=6@vSKIWioi!R-g520#y02oQ zbXP@*s*UUZxmM;UYn?nEyF{G)I3#+` zC$?DZsz%C6%h77lBaeOAvO;|8S7FOU`|Z{g@$}bR(?s<^m|Zj%TG5Si!ZwKez8xEN z^myg6=uKIrYc?(A-s)w0EB00Fy{`g$tgm&)h{oHjx&HAy(K@>M_PrHbv2EyT>7e`X zn8-o&-?^*2bYsQ7{r7&NfgO7*D&i)@G;Voo`F&e=iO9l4SMwpEnwyKmz zr7YdK3zbr{2AknCF@D^?cWbpi=&mVTCu>dLCSS2@>$a+j(w#fj6mQ+SZ||aIr7Vx_ z)zz8HN_Xtud;iwGC?GXduPH)hFF{%Duh_RYb1C(9@7hc+0s=xdnP+hTV)5=mPu4{s+-d3f!ZvGS zh_L2aW{AMSu!y80l&t7aVc!l2AEs;@23y)1d z8fXs_!;gjqjxIejUld-5EfBSLStks*M|*=e9epks)A6Ibte-buO^-qa`?#uA-zHI?Z8dV6g-6iS~7 zO@8sjkwF~!k!y)4yw~cC7!RwLf%FKxZ26Hlb5ZF{1-IOoUr<`Q9&LK*_R5Ow_h6JY zdh*fC+$8a6PE7RC!JDk+bsNROR@b#5J8Q2tnKaWapWrBN{;?%;rYb`HW&k6uY-WSE zhRqk=hOihh_`1_#zd9smPEiOI-^z*EDax+I?wrH6TXfq$zv|yOZtj!cSfSh5^#73^ zqqY8nYia!7PfthYUt;H(j_wLZ>ID%ou9?LfC~@6S9XE^K>n%5k@9wrnigh={M2R`a z!=g<~#KLY%ia3&sO8MQ{=#=rg{iN0_U*55B`|hf8aWXgN8q*?i7DkT0=n9{nnXOfo zF2rE7F#G6RXPuwkQ2qz8*wwxv#wq6i#Bz-&`-vr5xT~$vF^iTN7Bk1smi^Cc7v!P0 zeda~id|?}njgDEobll?j+0y@+#fL{@6GYU8m}v3!7hO@}-$ht-^x`GjO)FNER@82< zsIDok;dm|nYc$r&0?qie1-fvFR#kIvb(SoOKhk(yQ`kJ`;;g?hzDT^ZA|_FM_@XOi z_CGf-5A`ly!Jy^%%=&P*X7C**T0S`>H1Pww5aKF&9g6B zWR&8fMJ&7p|2z$=^ft3FQPcg+~m{KwVE+c7FBbIMb_3ox`ti%IX{`NgKYfZb#J8_C#aNbPEy@(bmKky1d%<;QmM$KD%pTW~y2N!f zB$U3{BKa2wXC7Ytf2b`H)6A~V#AGPa zDEn|mvIi6HJO=R-pGP((QJKrZTd?DpZ!?I-l9R~f+)bF`h9y0h@GdUWmriRoEFvny z^d^2Lb3>wj+=&1Aw-|r>@i&jDTHH~6TTGf&wAt{UriQiAmgBK5o3O8R&9xcdr4@xM zT^`X89-Zo%8$XqP_1hZ~lIW1xl)QXu-q zQM|yeGQ=}22_MH^6aCz?Z~qbBH~N~E^A_IANq|fLqpmyLZ%? zg5vEem*12pcHZlH+SJ~0`CixUCQpj=DD3lK9K zl*p%XJn-f|4e1^?(x?2JF=x!9PHcDrpHGO~?{Y<6RDNx05>&qCBDqtEe6ip}Q{3{z zqe|@AkMsn@5u#3_UYv&%-mE6+)w^k06ZoQwB-RHE&VN7BC5CG;%w#`+cWD=i z%m)xxtB54VB#Oif(vb)s!5le{NSut|PXU+VxkCDAnp7MHsW<>qu^*&jFG#~Jpq>CwPXMSV z0Mruz>Ine#1b})1KpTw4Q!;j5D`Qyab zk71<(9_PSvkbA|bcmbqA?iC|DK^nwsNl9M|SPJ*ySu#g$ig;D2o=o1P zaH|+fxqw^6KwmvbJ0l4y0iXkqg#8zAQU%39FA4S;?G;2tvOya!~;+d$MpL93*% zN%=Q`55d1qu@YnnmV?Y`33wDN1ZgiDjAs9LDi4S9(7*#w;3l;%f!v(NR@@9e3)X|r zfLY)M&o7QH-p&n$)YIF|_Bw#Y+ z66L;Hx#xjixTh(1w{mxYXb$O`a=+--bC`ZXu?wXA(~8w3i?~cV$z#zz+ zH-ZdUr?^@%TQN;>Bv$HO01KesuH<@->GSLfW6>x zum@z(c1!w#Ad9w3a!V7)I_B;P_ZCz<*$|EL=Sh)r;BGmN z13ghvp;PgIVirjM-bmTF&Vh`$8$1ejf_elXOr;-C?zPIj5@g#d23Zo>ktlx_g#`}J zg2N8kxPstD$n7BAn?aUDBgm3ykn|k}SrYYF{j+@Msl+o$<1ygH@h7Jx!H{u zCvJ8F_04WOAak=DIBBz672L7OEkREace}ws-|ZHFA#QeiRBd*vlbhY@;mpl$M?h|N zTMKgS8m~#*?51ZJWO}*Tjp^cMH@b7P8)a^GBe~g)><5|dUJ&Um;AS^a-|U9;>YLq| z?jSe2-KaLZF#+7{#(>=Hh5-6zHwNTpHwNT>69$~P*^L;QzyEQ-@43YWm0};Kx*^SY6LT2>bTJl+#lir*Pk?t>GB_z{J<|%U1+F~rPbbyOMMw1R|U>Z1z@YjOF z;KSe$xC$HuQ7!tOHB^VbXASv?2=dPAZk%*N;fr89$bfC&3a|x4LFk*-7yxabV{AkK zya%iW8Lk>E1}nk)z%mei`kuATU?Jo?!PQ_1mr=&l2!rUqd;B)q*I$uxgO*V(`{juVWMqny$m3?&{!1 zDxL-5!f>5RqkUZCHiVnF0ZR{;aT~r~L9^bF_%cyF+iADx?!&jmCeDHTAZ*cGP;ugh zC0!94mSW9kVt-6zCpIWG#5KlYS5VyH zIGiUpCgVK$aI)3ho!XOXGk2v1Q?dCdt0~K7KAhE%g>5;@+Lpn>vJ3dXA*V41E;()Z zzd5G`{|9rr@&B3Soy)O7=cd4F?5#gR%`a1kSwmxtRqPe99 z{}0}B0WAZs=DG%@f{Yr+UvVwq!enD&c+XrZ--VvRV-aPPm@)4>#PAd3H)cadO&Sx< z{+aV8JCxD@6uipd7rc-WVW*Pol>CvB3mG2%eBTg{yBHoa7q#EhE zgG>N+P{U1aQv2v zuvLY3Dtlv;5x=%i<;a+Uyp0ABp)n8jjxtb$QIE&t)Q5k`LMaz2gRRQ{6|YR7F>AR; z$;Px~EW@Le4rIyrHIu4>L^$wR!302ItCANOInI>+Of*-&4=s^$naY4Mg}5RT{w6FO zhFu;n&y;enl5fC>Mt{sE(iFBtL!dzpj66Q)g>1%ecNJlVl8t#qmr9T^kJue84W^*# zc>E+v%6!cak2$fBL-ATjm7$wef_pM${91@|FeVifWEE%^R1vS0RiO1M`Ay~DujFre zWrQ}_sk#gzj6psMQ-$KFBOnty79BtdRCs7aKvF|{0{WMjj@ zFQ-ZWJXORENG!t_MM!%`LZocW=59bd^e;hM;PF6`lmjY(mt2(5%`trA@N2(<2OYdI zx`WoC8$hG7OPLcFdI02v$Mf-0HXc^&hdU#zR}oxM8RQHJkF83sQt|?oflggUyC_8u zpn-O!kfsNa+j(eUvkJhe7#{zvWMgKZx5-T4AWDkI_UY1|F$;fYhLkn0?yXfC@&d?g zmuH<)VI}VmaO_0RnIOk3DSs11MR_iYlE+fFl)0*%hg10*v+%F8h{FQoZDfL{9eh?%HO8spWz0F z8R%0b6oE#}rQOwb?It~f$CZQeOy*syR4^VWeE4Xv(!ad6#K2NpDa%_7orW2T9(=Elqw!Q)|0EJc|vKARVlBv*YL!pao!_-Jg@ z)g>F#v#`)YE>y`Bky);I(f6Y38Zr8+CEC0=OPt3t2dp(n#-giR#ln5oF!9t6@u8cq zuE2ts_77uI#NZEIjpAn?#m0AhP;HGjiJxLwR7dPft~X44{O=T3UdGA|+b=B6s}Jkl z9r;1m55shaCE{S`Om|1zPh2Zp${}-8LQcoCzj1vvLOEQr%y4&X{x8>x(5o8mjvxHR zbz;T@hwtrif5VWseq_(-xFf>7F5PBBXV1U zTfBYRnk??VY+cY%lI3oise3IIFZ^e``-#Yv?vBWnai9OGa>ObGcgG7+@o&gfE)^$T zNcKs0{2Owe!cuW?gTvi%#1sE{!+{GIIx@WR1u~~gMgHl8xQ=HR#@}sIMvpub5!W$$ zS^OedTCnjml-3?!{O1#tM*f3{C316oNUY&-I>FtMxjTM^%)3g*k=m>2hqQi!!DH^FK;y;R08YhpzM*jEWUyn4RJ&&X>_(}XmBm4Puc=lZU z-f@R$kGmuFKjMEi-3XEu;qFNOP5dEQ+gjb9rjQoSu)sgK^xHw)O)X2XsA;hrpLX9V`W7`c0vyC!6a%`Hbqa{D# zu#uO{Dx_o0rmIGEjg)N(jSiKLOFy6H?s#)=!n+nDFQ)0Pj=}pAS`#N~oII8=-N?Qk zr-Zi2$%Ho>Jrci4P7;qylA=hNuunS^rLc~F(hr@K2Ics1b-BiaqQ ziEBGf{50XDQI)#J=JN@vub{2E+;JT*{ygD9BbMX{cYMdDw-R<5?E? zcD|nwZKOkY_|jh!UYQi+0h{L)!{}SjOpoihBib|DsD|_Z78&1hBH44&$UYpPG2in$ z!$CK?Io)%}h$TM;ebltn^O2D`(;7I$-QYQ7!~zXhM{t$Ll4O)R9R|xi=f;}@ZM<6J zxxpype1AMT&_kXN$D8)1n7EGX8$IzxEayLKa&=TUc`g{4lMY|?q#32IJ9K{EGh#GL z-J$0t&zTsN4myazK*a2h7yCRP%28;k(A9c>=V>(xC2~_te8JYSMGB98Mih z{MsakonK5mG0{Q1c_h&#%KS6uc3eE1ST@nC174q?+ur#}x@(S2(fvVFVr+*?BtACD qBwQz(q?-74jN_WWjXt$`iY_t}(edXmCmu76mw~&Z<+;R^*#8HCD(WHt delta 83951 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 V-mQ@Fidr$w(88aSiT7+n(qFijS_l9D diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/module.modulemap b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/module.modulemap index 5580079fa..d5540495e 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/module.modulemap +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/module.modulemap @@ -4,8 +4,10 @@ module SessionUtil { header "session/config.h" header "session/config/error.h" header "session/config/user_profile.h" + header "session/config/contacts.h" header "session/config/encrypt.h" header "session/config/base.h" + header "session/config/profile_pic.h" header "session/xed25519.h" export * } diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/base.hpp b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/base.hpp index 86f42533d..be3a4f9cb 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/base.hpp +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/base.hpp @@ -237,6 +237,13 @@ class ConfigBase { /// otherwise. const std::string* string() const { return get_clean(); } + /// Returns the value as a ustring_view, if it exists and is a string; nullopt otherwise. + std::optional uview() const { + if (auto* s = get_clean()) + return ustring_view{reinterpret_cast(s->data()), s->size()}; + return std::nullopt; + } + /// returns the value as a string_view or a fallback if the value doesn't exist (or isn't a /// string). The returned view is directly into the value (or fallback) and so mustn't be /// used beyond the validity of either. @@ -278,8 +285,12 @@ class ConfigBase { /// intermediate dicts needed to reach the given key, including replacing non-dict values if /// they currently exist along the path. void operator=(std::string value) { assign_if_changed(std::move(value)); } - /// Same as above, but takes a string_view for convenience. + /// Same as above, but takes a string_view for convenience (this makes a copy). void operator=(std::string_view value) { *this = std::string{value}; } + /// Same as above, but takes a ustring_view + void operator=(ustring_view value) { + *this = std::string{reinterpret_cast(value.data()), value.size()}; + } /// Replace the current value with the given integer. See above. void operator=(int64_t value) { assign_if_changed(value); } /// Replace the current value with the given set. See above. @@ -378,6 +389,14 @@ class ConfigBase { // nothing. virtual void load_extra_data(oxenc::bt_dict extra) {} + // Called to load an ed25519 key for encryption; this is meant for use by single-ownership + // config types, like UserProfile, but not shared config types (closed groups). + // + // Takes a binary string which is either the 32-byte seed, or 64-byte libsodium secret (which is + // just the seed and pubkey concatenated together), and then calls `key(...)` with the seed. + // Throws std::invalid_argument if given something that doesn't match the required input. + void load_key(ustring_view ed25519_secretkey); + public: virtual ~ConfigBase(); diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.h b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.h new file mode 100644 index 000000000..a889c7cb9 --- /dev/null +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.h @@ -0,0 +1,147 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "base.h" +#include "profile_pic.h" + +typedef struct contacts_contact { + char session_id[67]; // in hex; 66 hex chars + null terminator. + + // These can be NULL. When setting, either NULL or empty string will clear the setting. + const char* name; + const char* nickname; + user_profile_pic profile_pic; + + bool approved; + bool approved_me; + bool blocked; + +} contacts_contact; + +/// Constructs a contacts config object and sets a pointer to it in `conf`. +/// +/// \param ed25519_secretkey must be the 32-byte secret key seed value. (You can also pass the +/// pointer to the beginning of the 64-byte value libsodium calls the "secret key" as the first 32 +/// bytes of that are the seed). This field cannot be null. +/// +/// \param dump - if non-NULL this restores the state from the dumped byte string produced by a past +/// instantiation's call to `dump()`. To construct a new, empty object this should be NULL. +/// +/// \param dumplen - the length of `dump` when restoring from a dump, or 0 when `dump` is NULL. +/// +/// \param error - the pointer to a buffer in which we will write an error string if an error +/// occurs; error messages are discarded if this is given as NULL. If non-NULL this must be a +/// buffer of at least 256 bytes. +/// +/// Returns 0 on success; returns a non-zero error code and write the exception message as a +/// C-string into `error` (if not NULL) on failure. +/// +/// When done with the object the `config_object` must be destroyed by passing the pointer to +/// config_free() (in `session/config/base.h`). +int contacts_init( + config_object** conf, + const unsigned char* ed25519_secretkey, + const unsigned char* dump, + size_t dumplen, + char* error) __attribute__((warn_unused_result)); + +/// Returns true if session_id has the right form (66 hex digits). This is a quick check, not a +/// robust one: it does not check the leading byte prefix, nor the cryptographic properties of the +/// pubkey for actual validity. +bool session_id_is_valid(const char* session_id); + +/// Fills `contact` with the contact info given a session ID (specified as a null-terminated hex +/// string), if the contact exists, and returns true. If the contact does not exist then `contact` +/// is left unchanged and false is returned. +bool contacts_get(const config_object* conf, contacts_contact* contact, const char* session_id) + __attribute__((warn_unused_result)); + +/// Same as the above except that when the contact does not exist, this sets all the contact fields +/// to defaults and loads it with the given session_id. +/// +/// Returns true as long as it is given a valid session_id. A false return is considered an error, +/// and means the session_id was not a valid session_id. +/// +/// This is the method that should usually be used to create or update a contact, followed by +/// setting fields in the contact, and then giving it to contacts_set(). +bool contacts_get_or_create( + const config_object* conf, contacts_contact* contact, const char* session_id) + __attribute__((warn_unused_result)); + +/// Adds or updates a contact from the given contact info struct. +void contacts_set(config_object* conf, const contacts_contact* contact); + +// NB: wrappers for set_name, set_nickname, etc. C++ methods are deliberately omitted as they would +// save very little in actual calling code. The procedure for updating a single field without them +// is simple enough; for example to update `approved` and leave everything else unchanged: +// +// contacts_contact c; +// if (contacts_get_or_create(conf, &c, some_session_id)) { +// const char* new_nickname = "Joe"; +// c.approved = new_nickname; +// contacts_set_or_create(conf, &c); +// } else { +// // some_session_id was invalid! +// } + +/// Erases a contact from the contact list. session_id is in hex. Returns true if the contact was +/// found and removed, false if the contact was not present. You must not call this during +/// iteration; see details below. +bool contacts_erase(config_object* conf, const char* session_id); + +/// Functions for iterating through the entire contact list, in sorted order. Intended use is: +/// +/// contacts_contact c; +/// contacts_iterator *it = contacts_iterator_new(contacts); +/// for (; !contacts_iterator_done(it, &c); contacts_iterator_advance(it)) { +/// // c.session_id, c.nickname, etc. are loaded +/// } +/// contacts_iterator_free(it); +/// +/// It is permitted to modify records (e.g. with a call to `contacts_set`) and add records while +/// iterating. +/// +/// If you need to remove while iterating then usage is slightly different: you must advance the +/// iteration by calling either contacts_iterator_advance if not deleting, or +/// contacts_iterator_erase to erase and advance. Usage looks like this: +/// +/// contacts_contact c; +/// contacts_iterator *it = contacts_iterator_new(contacts); +/// while (!contacts_iterator_done(it, &c)) { +/// // c.session_id, c.nickname, etc. are loaded +/// +/// bool should_delete = /* ... */; +/// +/// if (should_delete) +/// contacts_iterator_erase(it); +/// else +/// contacts_iterator_advance(it); +/// } +/// contacts_iterator_free(it); +/// +/// + +typedef struct contacts_iterator { + void* _internals; +} contacts_iterator; + +// Starts a new iterator. +contacts_iterator* contacts_iterator_new(const config_object* conf); +// Frees an iterator once no longer needed. +void contacts_iterator_free(contacts_iterator* it); + +// Returns true if iteration has reached the end. Otherwise `c` is populated and false is returned. +bool contacts_iterator_done(contacts_iterator* it, contacts_contact* c); + +// Advances the iterator. +void contacts_iterator_advance(contacts_iterator* it); + +// Erases the current contact while advancing the iterator to the next contact in the iteration. +void contacts_iterator_erase(config_object* conf, contacts_iterator* it); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.hpp b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.hpp new file mode 100644 index 000000000..1601c6146 --- /dev/null +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/contacts.hpp @@ -0,0 +1,187 @@ +#pragma once + +#include +#include +#include +#include + +#include "base.hpp" +#include "namespaces.hpp" +#include "profile_pic.hpp" + +extern "C" struct contacts_contact; + +namespace session::config { + +/// keys used in this config, either currently or in the past (so that we don't reuse): +/// +/// c - dict of contacts; within this dict each key is the session pubkey (binary, 33 bytes) and +/// value is a dict containing keys: +/// +/// ! - dummy value that is always set to an empty string. This ensures that we always have at +/// least one key set, which is required to keep the dict value alive (empty dicts get +/// pruned when serialied). +/// n - contact name (string) +/// N - contact nickname (string) +/// p - profile url (string) +/// q - profile decryption key (binary) +/// a - 1 if approved, omitted otherwise (int) +/// A - 1 if remote has approved me, omitted otherwise (int) +/// b - 1 if contact is blocked, omitted otherwise + +/// Struct containing contact info. Note that data must be copied/used immediately as the data will +/// not remain valid beyond other calls into the library. When settings things in this externally +/// (e.g. to pass into `set()`), take note that the `name` and `nickname` are string_views: that is, +/// they must reference existing string data that remains valid for the duration of the contact_info +/// instance. +struct contact_info { + std::string session_id; // in hex + std::optional name; + std::optional nickname; + std::optional profile_picture; + bool approved = false; + bool approved_me = false; + bool blocked = false; + + contact_info(std::string sid); + + // Internal ctor/method for C API implementations: + contact_info(const struct contacts_contact& c); // From c struct + void into(contacts_contact& c); // Into c struct + + private: + friend class Contacts; + + void load(const dict& info_dict); +}; + +class Contacts : public ConfigBase { + + public: + // No default constructor + Contacts() = delete; + + /// Constructs a contact list from existing data (stored from `dump()`) and the user's secret + /// key for generating the data encryption key. To construct a blank list (i.e. with no + /// pre-existing dumped data to load) pass `std::nullopt` as the second argument. + /// + /// \param ed25519_secretkey - contains the libsodium secret key used to encrypt/decrypt the + /// data when pushing/pulling from the swarm. This can either be the full 64-byte value (which + /// is technically the 32-byte seed followed by the 32-byte pubkey), or just the 32-byte seed of + /// the secret key. + /// + /// \param dumped - either `std::nullopt` to construct a new, empty object; or binary state data + /// that was previously dumped from an instance of this class by calling `dump()`. + Contacts(ustring_view ed25519_secretkey, std::optional dumped); + + Namespace storage_namespace() const override { return Namespace::Contacts; } + + const char* encryption_domain() const override { return "Contacts"; } + + /// Looks up and returns a contact by session ID (hex). Returns nullopt if the session ID was + /// not found, otherwise returns a filled out `contact_info`. + std::optional get(std::string_view pubkey_hex) const; + + /// Similar to get(), but if the session ID does not exist this returns a filled-out + /// contact_info containing the session_id (all other fields will be empty/defaulted). This is + /// intended to be combined with `set` to set-or-create a record. Note that this does not add + /// the session id to the contact list when called: that requires also calling `set` with this + /// value. + contact_info get_or_create(std::string_view pubkey_hex) const; + + /// Sets or updates multiple contact info values at once with the given info. The usual use is + /// to access the current info, change anything desired, then pass it back into set_contact, + /// e.g.: + /// + /// auto c = contacts.get_or_create(pubkey); + /// c.name = "Session User 42"; + /// c.nickname = "BFF"; + /// contacts.set(c); + void set(const contact_info& contact); + + /// Alternative to `set()` for setting individual fields. + void set_name(std::string_view session_id, std::string_view name); + void set_nickname(std::string_view session_id, std::string_view nickname); + void set_profile_pic(std::string_view session_id, profile_pic pic); + void set_approved(std::string_view session_id, bool approved); + void set_approved_me(std::string_view session_id, bool approved_me); + void set_blocked(std::string_view session_id, bool blocked); + + /// Removes a contact, if present. Returns true if it was found and removed, false otherwise. + /// Note that this removes all fields related to a contact, even fields we do not know about. + bool erase(std::string_view session_id); + + struct iterator; + + /// This works like erase, but takes an iterator to the contact to remove. The element is + /// removed and the iterator to the next element after the removed one is returned. This is + /// intended for use where elements are to be removed during iteration: see below for an + /// example. + iterator erase(iterator it); + + /// Iterators for iterating through all contacts. Typically you access this implicit via a for + /// loop over the `Contacts` object: + /// + /// for (auto& contact : contacts) { + /// // use contact.session_id, contact.name, etc. + /// } + /// + /// This iterates in sorted order through the session_ids. + /// + /// It is permitted to modify and add records while iterating (e.g. by modifying `contact` and + /// then calling set()). + /// + /// If you need to erase the current contact during iteration then care is required: you need to + /// advance the iterator via the iterator version of erase when erasing an element rather than + /// incrementing it regularly. For example: + /// + /// for (auto it = contacts.begin(); it != contacts.end(); ) { + /// if (should_remove(*it)) + /// it = contacts.erase(it); + /// else + /// ++it; + /// } + /// + /// Alternatively, you can use the first version with two loops: the first loop through all + /// contacts doesn't erase but just builds a vector of IDs to erase, then the second loops + /// through that vector calling `erase()` for each one. + /// + iterator begin() const { return iterator{data["c"].dict()}; } + iterator end() const { return iterator{nullptr}; } + + using iterator_category = std::input_iterator_tag; + using value_type = contact_info; + using reference = value_type&; + using pointer = value_type*; + using difference_type = std::ptrdiff_t; + + struct iterator { + private: + std::shared_ptr _val; + dict::const_iterator _it; + const dict* _contacts; + void _load_info(); + iterator(const dict* contacts) : _contacts{contacts} { + if (_contacts) { + _it = _contacts->begin(); + _load_info(); + } + } + friend class Contacts; + + public: + bool operator==(const iterator& other) const; + bool operator!=(const iterator& other) const { return !(*this == other); } + bool done() const; // Equivalent to comparing against the end iterator + contact_info& operator*() const { return *_val; } + contact_info* operator->() const { return _val.get(); } + iterator& operator++(); + iterator operator++(int) { + auto copy{*this}; + ++*this; + return copy; + } + }; +}; + +} // namespace session::config diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/namespaces.hpp b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/namespaces.hpp index f5ab57c20..1ba0226ca 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/namespaces.hpp +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/namespaces.hpp @@ -6,6 +6,7 @@ namespace session::config { enum class Namespace : std::int16_t { UserProfile = 2, + Contacts = 3, ClosedGroupInfo = 11, }; diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.h b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.h new file mode 100644 index 000000000..dc9887dd8 --- /dev/null +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.h @@ -0,0 +1,21 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef struct user_profile_pic { + // Null-terminated C string containing the uploaded URL of the pic. Will be NULL if there is no + // profile pic. + const char* url; + // The profile pic decryption key, in bytes. This is a byte buffer of length `keylen`, *not* a + // null-terminated C string. Will be NULL if there is no profile pic. + const unsigned char* key; + size_t keylen; +} user_profile_pic; + +#ifdef __cplusplus +} +#endif diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.hpp b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.hpp new file mode 100644 index 000000000..00cd90062 --- /dev/null +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/profile_pic.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "session/types.hpp" + +namespace session::config { +// Profile pic info. Note that `url` is null terminated (though the null lies just beyond the end +// of the string view: that is, it views into a full std::string). +struct profile_pic { + std::string_view url; + ustring_view key; + + profile_pic(std::string_view url, ustring_view key) : url{url}, key{key} {} + + // Returns true if either url or key are empty + bool empty() const { return url.empty() || key.empty(); } + + // Guard against accidentally passing in a temporary string or ustring: + template < + typename UrlType, + typename KeyType, + std::enable_if_t< + std::is_same_v || std::is_same_v>> + profile_pic(UrlType&& url, KeyType&& key) = delete; +}; + +} // namespace session::config diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.h b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.h index 8b438591e..03f382c85 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.h +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.h @@ -5,6 +5,7 @@ extern "C" { #endif #include "base.h" +#include "profile_pic.h" /// Constructs a user profile config object and sets a pointer to it in `conf`. /// @@ -41,16 +42,6 @@ const char* user_profile_get_name(const config_object* conf); /// error (and sets the config_object's error string). int user_profile_set_name(config_object* conf, const char* name); -typedef struct user_profile_pic { - // Null-terminated C string containing the uploaded URL of the pic. Will be NULL if there is no - // profile pic. - const char* url; - // The profile pic decryption key, in bytes. This is a byte buffer of length `keylen`, *not* a - // null-terminated C string. Will be NULL if there is no profile pic. - const unsigned char* key; - size_t keylen; -} user_profile_pic; - // Obtains the current profile pic. The pointers in the returned struct will be NULL if a profile // pic is not currently set, and otherwise should be copied right away (they will not be valid // beyond other API calls on this config object). diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.hpp b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.hpp index f13a83867..cb3b1eb32 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.hpp +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_profile.hpp @@ -5,6 +5,7 @@ #include "base.hpp" #include "namespaces.hpp" +#include "profile_pic.hpp" namespace session::config { @@ -14,13 +15,6 @@ namespace session::config { /// p - user profile url /// q - user profile decryption key (binary) -// Profile pic info. Note that `url` is null terminated (though the null lies just beyond the end -// of the string view: that is, it views into a full std::string). -struct profile_pic { - std::string_view url; - ustring_view key; -}; - class UserProfile final : public ConfigBase { public: @@ -31,12 +25,13 @@ class UserProfile final : public ConfigBase { /// key for generating the data encryption key. To construct a blank profile (i.e. with no /// pre-existing dumped data to load) pass `std::nullopt` as the second argument. /// - /// \param ed25519_secretkey - contains the libsodium secret key used to encrypt/decrypt user - /// profile messages; these can either be the full 64-byte value (which is technically the - /// 32-byte seed followed by the 32-byte pubkey), or just the 32-byte seed of the secret key. + /// \param ed25519_secretkey - contains the libsodium secret key used to encrypt/decrypt the + /// data when pushing/pulling from the swarm. This can either be the full 64-byte value (which + /// is technically the 32-byte seed followed by the 32-byte pubkey), or just the 32-byte seed of + /// the secret key. /// - /// \param dumped - either `std::nullopt` to construct a new, empty user profile; or binary - /// state data that was previously dumped from a UserProfile object by calling `dump()`. + /// \param dumped - either `std::nullopt` to construct a new, empty object; or binary state data + /// that was previously dumped from an instance of this class by calling `dump()`. UserProfile(ustring_view ed25519_secretkey, std::optional dumped); Namespace storage_namespace() const override { return Namespace::UserProfile; } @@ -44,7 +39,7 @@ class UserProfile final : public ConfigBase { const char* encryption_domain() const override { return "UserProfile"; } /// Returns the user profile name, or std::nullopt if there is no profile name set. - const std::optional get_name() const; + std::optional get_name() const; /// Sets the user profile name; if given an empty string then the name is removed. void set_name(std::string_view new_name); @@ -57,9 +52,6 @@ class UserProfile final : public ConfigBase { /// one is empty. void set_profile_pic(std::string_view url, ustring_view key); void set_profile_pic(profile_pic pic); - - private: - void load_key(ustring_view ed25519_secretkey); }; } // namespace session::config diff --git a/SessionMessagingKit/Messages/Control Messages/SharedConfigMessage.swift b/SessionMessagingKit/Messages/Control Messages/SharedConfigMessage.swift index ad4054fb4..96bb65f4c 100644 --- a/SessionMessagingKit/Messages/Control Messages/SharedConfigMessage.swift +++ b/SessionMessagingKit/Messages/Control Messages/SharedConfigMessage.swift @@ -21,10 +21,12 @@ public final class SharedConfigMessage: ControlMessage { public enum Kind: CustomStringConvertible, Codable { case userProfile + case contacts public var description: String { switch self { case .userProfile: return "userProfile" + case .contacts: return "contacts" } } } @@ -74,6 +76,7 @@ public final class SharedConfigMessage: ControlMessage { kind: { switch sharedConfigMessage.kind { case .userProfile: return .userProfile + case .contacts: return .contacts } }(), seqNo: sharedConfigMessage.seqno, @@ -87,6 +90,7 @@ public final class SharedConfigMessage: ControlMessage { kind: { switch self.kind { case .userProfile: return .userProfile + case .contacts: return .contacts } }(), seqno: self.seqNo, @@ -121,6 +125,7 @@ public extension SharedConfigMessage.Kind { var configDumpVariant: ConfigDump.Variant { switch self { case .userProfile: return .userProfile + case .contacts: return .contacts } } } diff --git a/SessionMessagingKit/Protos/Generated/SNProto.swift b/SessionMessagingKit/Protos/Generated/SNProto.swift index 26060b939..b13cf6585 100644 --- a/SessionMessagingKit/Protos/Generated/SNProto.swift +++ b/SessionMessagingKit/Protos/Generated/SNProto.swift @@ -3714,17 +3714,20 @@ extension SNProtoAttachmentPointer.SNProtoAttachmentPointerBuilder { @objc public enum SNProtoSharedConfigMessageKind: Int32 { case userProfile = 1 + case contacts = 2 } private class func SNProtoSharedConfigMessageKindWrap(_ value: SessionProtos_SharedConfigMessage.Kind) -> SNProtoSharedConfigMessageKind { switch value { case .userProfile: return .userProfile + case .contacts: return .contacts } } private class func SNProtoSharedConfigMessageKindUnwrap(_ value: SNProtoSharedConfigMessageKind) -> SessionProtos_SharedConfigMessage.Kind { switch value { case .userProfile: return .userProfile + case .contacts: return .contacts } } diff --git a/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift b/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift index 0d8cd6e48..3dd86bfb7 100644 --- a/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift +++ b/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift @@ -1621,6 +1621,7 @@ struct SessionProtos_SharedConfigMessage { enum Kind: SwiftProtobuf.Enum { typealias RawValue = Int case userProfile // = 1 + case contacts // = 2 init() { self = .userProfile @@ -1629,6 +1630,7 @@ struct SessionProtos_SharedConfigMessage { init?(rawValue: Int) { switch rawValue { case 1: self = .userProfile + case 2: self = .contacts default: return nil } } @@ -1636,6 +1638,7 @@ struct SessionProtos_SharedConfigMessage { var rawValue: Int { switch self { case .userProfile: return 1 + case .contacts: return 2 } } @@ -3332,5 +3335,6 @@ extension SessionProtos_SharedConfigMessage: SwiftProtobuf.Message, SwiftProtobu extension SessionProtos_SharedConfigMessage.Kind: SwiftProtobuf._ProtoNameProviding { static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "USER_PROFILE"), + 2: .same(proto: "CONTACTS"), ] } diff --git a/SessionMessagingKit/Protos/SessionProtos.proto b/SessionMessagingKit/Protos/SessionProtos.proto index 13ec388c2..839dd78b6 100644 --- a/SessionMessagingKit/Protos/SessionProtos.proto +++ b/SessionMessagingKit/Protos/SessionProtos.proto @@ -275,6 +275,7 @@ message AttachmentPointer { message SharedConfigMessage { enum Kind { USER_PROFILE = 1; + CONTACTS = 2; } // @required diff --git a/SessionMessagingKitTests/LibSessionUtil/ConfigContactsSpec.swift b/SessionMessagingKitTests/LibSessionUtil/ConfigContactsSpec.swift new file mode 100644 index 000000000..b2f9c7744 --- /dev/null +++ b/SessionMessagingKitTests/LibSessionUtil/ConfigContactsSpec.swift @@ -0,0 +1,324 @@ +// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. + +import Foundation +import Sodium +import SessionUtil +import SessionUtilitiesKit + +import Quick +import Nimble + +/// This spec is designed to replicate the initial test cases for the libSession-util to ensure the behaviour matches +class ConfigContactsSpec: QuickSpec { + // MARK: - Spec + + override func spec() { + it("generates Contact configs correctly") { + let seed: Data = Data(hex: "0123456789abcdef0123456789abcdef") + + // FIXME: Would be good to move these into the libSession-util instead of using Sodium separately + let identity = try! Identity.generate(from: seed) + var edSK: [UInt8] = identity.ed25519KeyPair.secretKey + expect(edSK.toHexString().suffix(64)) + .to(equal("4cb76fdc6d32278e3f83dbf608360ecc6b65727934b85d2fb86862ff98c46ab7")) + expect(identity.x25519KeyPair.publicKey.toHexString()) + .to(equal("d2ad010eeb72d72e561d9de7bd7b6989af77dcabffa03a5111a6c859ae5c3a72")) + expect(String(edSK.toHexString().prefix(32))).to(equal(seed.toHexString())) + + // Initialize a brand new, empty config because we have no dump data to deal with. + let error: UnsafeMutablePointer? = nil + var conf: UnsafeMutablePointer? = nil + expect(contacts_init(&conf, &edSK, nil, 0, error)).to(equal(0)) + error?.deallocate() + + // Empty contacts shouldn't have an existing contact + var definitelyRealId: [CChar] = "050000000000000000000000000000000000000000000000000000000000000000" + .bytes + .map { CChar(bitPattern: $0) } + let contactPtr: UnsafeMutablePointer? = nil + expect(contacts_get(conf, contactPtr, &definitelyRealId)).to(beFalse()) + + var contact2: contacts_contact = contacts_contact() + expect(contacts_get_or_create(conf, &contact2, &definitelyRealId)).to(beTrue()) + expect(contact2.name).to(beNil()) + expect(contact2.nickname).to(beNil()) + expect(contact2.approved).to(beFalse()) + expect(contact2.approved_me).to(beFalse()) + expect(contact2.blocked).to(beFalse()) + expect(contact2.profile_pic).toNot(beNil()) // Creates an empty instance apparently + expect(contact2.profile_pic.url).to(beNil()) + expect(contact2.profile_pic.key).to(beNil()) + expect(contact2.profile_pic.keylen).to(equal(0)) + + // We don't need to push anything, since this is a default contact + expect(config_needs_push(conf)).to(beFalse()) + // And we haven't changed anything so don't need to dump to db + expect(config_needs_dump(conf)).to(beFalse()) + + var toPush: UnsafeMutablePointer? = nil + var toPushLen: Int = 0 + // We don't need to push since we haven't changed anything, so this call is mainly just for + // testing: + let seqno: Int64 = config_push(conf, &toPush, &toPushLen) + expect(toPush).toNot(beNil()) + expect(seqno).to(equal(0)) + expect(toPushLen).to(equal(256)) + + // Update the contact data + let contact2Name: [CChar] = "Joe" + .bytes + .map { CChar(bitPattern: $0) } + let contact2Nickname: [CChar] = "Joey" + .bytes + .map { CChar(bitPattern: $0) } + contact2Name.withUnsafeBufferPointer { contact2.name = $0.baseAddress } + contact2Nickname.withUnsafeBufferPointer { contact2.nickname = $0.baseAddress } + contact2.approved = true + contact2.approved_me = true + + // Update the contact + contacts_set(conf, &contact2) + + // Ensure the contact details were updated + var contact3: contacts_contact = contacts_contact() + expect(contacts_get(conf, &contact3, &definitelyRealId)).to(beTrue()) + expect(String(cString: contact3.name)).to(equal("Joe")) + expect(String(cString: contact3.nickname)).to(equal("Joey")) + expect(contact3.approved).to(beTrue()) + expect(contact3.approved_me).to(beTrue()) + expect(contact3.profile_pic).toNot(beNil()) // Creates an empty instance apparently + expect(contact3.profile_pic.url).to(beNil()) + expect(contact3.profile_pic.key).to(beNil()) + expect(contact3.profile_pic.keylen).to(equal(0)) + expect(contact3.blocked).to(beFalse()) + + let contact3SessionId: [CChar] = withUnsafeBytes(of: contact3.session_id) { [UInt8]($0) } + .map { CChar($0) } + expect(contact3SessionId).to(equal(definitelyRealId.nullTerminated())) + + // Since we've made changes, we should need to push new config to the swarm, *and* should need + // to dump the updated state: + expect(config_needs_push(conf)).to(beTrue()) + expect(config_needs_dump(conf)).to(beTrue()) + + var toPush2: UnsafeMutablePointer? = nil + var toPush2Len: Int = 0 + let seqno2: Int64 = config_push(conf, &toPush2, &toPush2Len); + // incremented since we made changes (this only increments once between + // dumps; even though we changed multiple fields here). + expect(seqno2).to(equal(1)) + toPush2?.deallocate() + + // Pretend we uploaded it + config_confirm_pushed(conf, seqno2) + expect(config_needs_push(conf)).to(beFalse()) + expect(config_needs_dump(conf)).to(beTrue()) + + // NB: Not going to check encrypted data and decryption here because that's general (not + // specific to contacts) and is covered already in the user profile tests. + var dump1: UnsafeMutablePointer? = nil + var dump1Len: Int = 0 + config_dump(conf, &dump1, &dump1Len) + + let error2: UnsafeMutablePointer? = nil + var conf2: UnsafeMutablePointer? = nil + expect(contacts_init(&conf2, &edSK, dump1, dump1Len, error2)).to(equal(0)) + error?.deallocate() + dump1?.deallocate() + + expect(config_needs_push(conf2)).to(beFalse()) + expect(config_needs_dump(conf2)).to(beFalse()) + + var toPush3: UnsafeMutablePointer? = nil + var toPush3Len: Int = 0 + let seqno3: Int64 = config_push(conf, &toPush3, &toPush3Len); + expect(seqno3).to(equal(1)) + toPush3?.deallocate() + + // Because we just called dump() above, to load up contacts2 + expect(config_needs_dump(conf)).to(beFalse()) + + // Ensure the contact details were updated + var contact4: contacts_contact = contacts_contact() + expect(contacts_get(conf2, &contact4, &definitelyRealId)).to(beTrue()) + expect(String(cString: contact4.name)).to(equal("Joe")) + expect(String(cString: contact4.nickname)).to(equal("Joey")) + expect(contact4.approved).to(beTrue()) + expect(contact4.approved_me).to(beTrue()) + expect(contact4.profile_pic).toNot(beNil()) // Creates an empty instance apparently + expect(contact4.profile_pic.url).to(beNil()) + expect(contact4.profile_pic.key).to(beNil()) + expect(contact4.profile_pic.keylen).to(equal(0)) + expect(contact4.blocked).to(beFalse()) + + var anotherId: [CChar] = "051111111111111111111111111111111111111111111111111111111111111111" + .bytes + .map { CChar(bitPattern: $0) } + var contact5: contacts_contact = contacts_contact() + expect(contacts_get_or_create(conf2, &contact5, &anotherId)).to(beTrue()) + expect(contact5.name).to(beNil()) + expect(contact5.nickname).to(beNil()) + expect(contact5.approved).to(beFalse()) + expect(contact5.approved_me).to(beFalse()) + expect(contact5.profile_pic).toNot(beNil()) // Creates an empty instance apparently + expect(contact5.profile_pic.url).to(beNil()) + expect(contact5.profile_pic.key).to(beNil()) + expect(contact5.profile_pic.keylen).to(equal(0)) + expect(contact5.blocked).to(beFalse()) + + // We're not setting any fields, but we should still keep a record of the session id + contacts_set(conf2, &contact5) + expect(config_needs_push(conf2)).to(beTrue()) + + var toPush4: UnsafeMutablePointer? = nil + var toPush4Len: Int = 0 + let seqno4: Int64 = config_push(conf2, &toPush4, &toPush4Len); + expect(seqno4).to(equal(2)) + + // Check the merging + var mergeData: [UnsafePointer?] = [UnsafePointer(toPush4)] + var mergeSize: [Int] = [toPush4Len] + expect(config_merge(conf, &mergeData, &mergeSize, 1)).to(equal(1)) + config_confirm_pushed(conf2, seqno4) + toPush4?.deallocate() + + expect(config_needs_push(conf)).to(beFalse()) + + var toPush5: UnsafeMutablePointer? = nil + var toPush5Len: Int = 0 + let seqno5: Int64 = config_push(conf2, &toPush5, &toPush5Len); + expect(seqno5).to(equal(2)) + toPush5?.deallocate() + + // Iterate through and make sure we got everything we expected + var sessionIds: [String] = [] + var nicknames: [String] = [] + var contact6: contacts_contact = contacts_contact() + let contactIterator: UnsafeMutablePointer = contacts_iterator_new(conf) + while !contacts_iterator_done(contactIterator, &contact6) { + sessionIds.append( + String(cString: withUnsafeBytes(of: contact6.session_id) { [UInt8]($0) } + .map { CChar($0) } + .nullTerminated() + ) + ) + nicknames.append( + contact6.nickname.map { String(cString: $0) } ?? + "(N/A)" + ) + contacts_iterator_advance(contactIterator) + } + contacts_iterator_free(contactIterator) // Need to free the iterator + + expect(sessionIds.count).to(equal(2)) + expect(sessionIds.first).to(equal(String(cString: definitelyRealId.nullTerminated()))) + expect(sessionIds.last).to(equal(String(cString: anotherId.nullTerminated()))) + expect(nicknames.first).to(equal("Joey")) + expect(nicknames.last).to(equal("(N/A)")) + + // Conflict! Oh no! + + // On client 1 delete a contact: + contacts_erase(conf, definitelyRealId) + + // Client 2 adds a new friend: + var thirdId: [CChar] = "052222222222222222222222222222222222222222222222222222222222222222" + .bytes + .map { CChar(bitPattern: $0) } + let nickname7: [CChar] = "Nickname 3" + .bytes + .map { CChar(bitPattern: $0) } + let profileUrl7: [CChar] = "http://example.com/huge.bmp" + .bytes + .map { CChar(bitPattern: $0) } + let profileKey7: [UInt8] = "qwerty".bytes + var contact7: contacts_contact = contacts_contact() + expect(contacts_get_or_create(conf2, &contact7, &thirdId)).to(beTrue()) + nickname7.withUnsafeBufferPointer { contact7.nickname = $0.baseAddress } + contact7.approved = true + contact7.approved_me = true + profileUrl7.withUnsafeBufferPointer { contact7.profile_pic.url = $0.baseAddress } + profileKey7.withUnsafeBufferPointer { contact7.profile_pic.key = $0.baseAddress } + contact7.profile_pic.keylen = 6 + contacts_set(conf2, &contact7) + + expect(config_needs_push(conf)).to(beTrue()) + expect(config_needs_push(conf2)).to(beTrue()) + + var toPush6: UnsafeMutablePointer? = nil + var toPush6Len: Int = 0 + let seqno6: Int64 = config_push(conf, &toPush6, &toPush6Len); + expect(seqno6).to(equal(3)) + + var toPush7: UnsafeMutablePointer? = nil + var toPush7Len: Int = 0 + let seqno7: Int64 = config_push(conf2, &toPush7, &toPush7Len); + expect(seqno7).to(equal(3)) + + expect(String(pointer: toPush6, length: toPush6Len, encoding: .ascii)) + .toNot(equal(String(pointer: toPush7, length: toPush7Len, encoding: .ascii))) + + config_confirm_pushed(conf, seqno6) + config_confirm_pushed(conf2, seqno7) + + var mergeData2: [UnsafePointer?] = [UnsafePointer(toPush7)] + var mergeSize2: [Int] = [toPush7Len] + expect(config_merge(conf, &mergeData2, &mergeSize2, 1)).to(equal(1)) + expect(config_needs_push(conf)).to(beTrue()) + + var mergeData3: [UnsafePointer?] = [UnsafePointer(toPush6)] + var mergeSize3: [Int] = [toPush6Len] + expect(config_merge(conf2, &mergeData3, &mergeSize3, 1)).to(equal(1)) + expect(config_needs_push(conf2)).to(beTrue()) + toPush6?.deallocate() + toPush7?.deallocate() + + var toPush8: UnsafeMutablePointer? = nil + var toPush8Len: Int = 0 + let seqno8: Int64 = config_push(conf, &toPush8, &toPush8Len); + expect(seqno8).to(equal(4)) + + var toPush9: UnsafeMutablePointer? = nil + var toPush9Len: Int = 0 + let seqno9: Int64 = config_push(conf2, &toPush9, &toPush9Len); + expect(seqno9).to(equal(seqno8)) + + expect(String(pointer: toPush8, length: toPush8Len, encoding: .ascii)) + .to(equal(String(pointer: toPush9, length: toPush9Len, encoding: .ascii))) + toPush8?.deallocate() + toPush9?.deallocate() + + config_confirm_pushed(conf, seqno8) + config_confirm_pushed(conf2, seqno9) + + expect(config_needs_push(conf)).to(beFalse()) + expect(config_needs_push(conf2)).to(beFalse()) + + // Validate the changes + var sessionIds2: [String] = [] + var nicknames2: [String] = [] + var contact8: contacts_contact = contacts_contact() + let contactIterator2: UnsafeMutablePointer = contacts_iterator_new(conf) + while !contacts_iterator_done(contactIterator2, &contact8) { + sessionIds2.append( + String(cString: withUnsafeBytes(of: contact8.session_id) { [UInt8]($0) } + .map { CChar($0) } + .nullTerminated() + ) + ) + nicknames2.append( + contact8.nickname.map { String(cString: $0) } ?? + "(N/A)" + ) + contacts_iterator_advance(contactIterator2) + } + contacts_iterator_free(contactIterator2) // Need to free the iterator + + expect(sessionIds2.count).to(equal(2)) + expect(sessionIds2.first).to(equal(String(cString: anotherId.nullTerminated()))) + expect(sessionIds2.last).to(equal(String(cString: thirdId.nullTerminated()))) + expect(nicknames2.first).to(equal("(N/A)")) + expect(nicknames2.last).to(equal("Nickname 3")) + } + } +} diff --git a/SessionMessagingKitTests/LibSessionUtil/ConfigUserProfileSpec.swift b/SessionMessagingKitTests/LibSessionUtil/ConfigUserProfileSpec.swift index 93ba46791..ef9324420 100644 --- a/SessionMessagingKitTests/LibSessionUtil/ConfigUserProfileSpec.swift +++ b/SessionMessagingKitTests/LibSessionUtil/ConfigUserProfileSpec.swift @@ -13,7 +13,7 @@ class ConfigUserProfileSpec: QuickSpec { // MARK: - Spec override func spec() { - it("generates configs correctly") { + it("generates UserProfile configs correctly") { let seed: Data = Data(hex: "0123456789abcdef0123456789abcdef") // FIXME: Would be good to move these into the libSession-util instead of using Sodium separately @@ -309,11 +309,11 @@ class ConfigUserProfileSpec: QuickSpec { // down more than one). var mergeData2: [UnsafePointer?] = [UnsafePointer(toPush3)] var mergeSize2: [Int] = [toPush3Len] - config_merge(conf2, &mergeData2, &mergeSize2, 1) + expect(config_merge(conf2, &mergeData2, &mergeSize2, 1)).to(equal(1)) toPush3?.deallocate() var mergeData3: [UnsafePointer?] = [UnsafePointer(toPush4)] var mergeSize3: [Int] = [toPush4Len] - config_merge(conf, &mergeData3, &mergeSize3, 1) + expect(config_merge(conf, &mergeData3, &mergeSize3, 1)).to(equal(1)) toPush4?.deallocate() // Now after the merge we *will* want to push from both client, since both will have generated a diff --git a/SessionUtilitiesKit/General/Array+Utilities.swift b/SessionUtilitiesKit/General/Array+Utilities.swift index cf350e86d..85e9cd6d6 100644 --- a/SessionUtilitiesKit/General/Array+Utilities.swift +++ b/SessionUtilitiesKit/General/Array+Utilities.swift @@ -63,3 +63,11 @@ public extension Array where Element == String { return self.reversed() } } + +public extension Array where Element == CChar { + func nullTerminated() -> [Element] { + guard self.last != CChar(0) else { return self } + + return self.appending(CChar(0)) + } +}