From 13e305129827f46cfb47810beef612d42e4388a9 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 25 Oct 2007 18:35:24 +0000 Subject: [PATCH 1/2] Monotone-Parent: 411e18da9b8303cd9a4927e92d807baf5025523f Monotone-Revision: 32dfb6e6d5b5c65eb70d4f6d9673a8e57b99795d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-10-25T18:35:24 Monotone-Branch: ca.inverse.sogo --- SOPE/sope-patchset-r1546.diff | 281 ++++++++++++++++++++++++++-------- 1 file changed, 216 insertions(+), 65 deletions(-) diff --git a/SOPE/sope-patchset-r1546.diff b/SOPE/sope-patchset-r1546.diff index a9908ac1e..6bf1888e2 100644 --- a/SOPE/sope-patchset-r1546.diff +++ b/SOPE/sope-patchset-r1546.diff @@ -1,68 +1,3 @@ -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.h -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (révision 1546) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (copie de travail) -@@ -28,6 +28,7 @@ - #define ___PostgreSQL72_Channel_H___ - - #include -+#include - #include - - @class NSArray, NSString, NSMutableDictionary; -@@ -40,7 +41,7 @@ - int modification; - } PostgreSQL72FieldInfo; - --@interface PostgreSQL72Channel : EOAdaptorChannel -+@interface PostgreSQL72Channel : EOAdaptorChannel - { - // connection is valid after an openChannel call - PGConnection *connection; -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1546) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail) -@@ -713,6 +713,39 @@ - return ms; - } - -+/* GCSEOAdaptorChannel protocol */ -+static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_name VARCHAR (256) NOT NULL,\n" -+ @" c_content VARCHAR (100000) NOT NULL,\n" -+ @" c_creationdate INT4 NOT NULL,\n" -+ @" c_lastmodified INT4 NOT NULL,\n" -+ @" c_version INT4 NOT NULL,\n" -+ @" c_deleted INT4 NULL\n" -+ @")"); -+static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_uid VARCHAR (256) NOT NULL,\n" -+ @" c_object VARCHAR (256) NOT NULL,\n" -+ @" c_role VARCHAR (80) NOT NULL\n" -+ @")"); -+ -+- (NSException *) createGCSFolderTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ -+- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ - @end /* PostgreSQL72Channel */ - - @implementation PostgreSQL72Channel(PrimaryKeyGeneration) Index: sope-mime/NGImap4/NGImap4Connection.m =================================================================== --- sope-mime/NGImap4/NGImap4Connection.m (révision 1546) @@ -385,6 +320,71 @@ Index: sope-mime/NGMime/NGMimePartParser.m contentType = ([ctype isKindOfClass:[NGMimeType class]]) ? ctype : [NGMimeType mimeType:[ctype stringValue]]; +Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.h +=================================================================== +--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (révision 1546) ++++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (copie de travail) +@@ -28,6 +28,7 @@ + #define ___PostgreSQL72_Channel_H___ + + #include ++#include + #include + + @class NSArray, NSString, NSMutableDictionary; +@@ -40,7 +41,7 @@ + int modification; + } PostgreSQL72FieldInfo; + +-@interface PostgreSQL72Channel : EOAdaptorChannel ++@interface PostgreSQL72Channel : EOAdaptorChannel + { + // connection is valid after an openChannel call + PGConnection *connection; +Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m +=================================================================== +--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1546) ++++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail) +@@ -713,6 +713,39 @@ + return ms; + } + ++/* GCSEOAdaptorChannel protocol */ ++static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ ++ @" c_name VARCHAR (256) NOT NULL,\n" ++ @" c_content VARCHAR (100000) NOT NULL,\n" ++ @" c_creationdate INT4 NOT NULL,\n" ++ @" c_lastmodified INT4 NOT NULL,\n" ++ @" c_version INT4 NOT NULL,\n" ++ @" c_deleted INT4 NULL\n" ++ @")"); ++static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ ++ @" c_uid VARCHAR (256) NOT NULL,\n" ++ @" c_object VARCHAR (256) NOT NULL,\n" ++ @" c_role VARCHAR (80) NOT NULL\n" ++ @")"); ++ ++- (NSException *) createGCSFolderTableWithName: (NSString *) tableName ++{ ++ NSString *sql; ++ ++ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; ++ ++ return [self evaluateExpressionX: sql]; ++} ++ ++- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName ++{ ++ NSString *sql; ++ ++ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; ++ ++ return [self evaluateExpressionX: sql]; ++} ++ + @end /* PostgreSQL72Channel */ + + @implementation PostgreSQL72Channel(PrimaryKeyGeneration) Index: sope-appserver/NGObjWeb/GNUmakefile.postamble =================================================================== --- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1546) @@ -515,6 +515,157 @@ Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h BOOL sidInUrl; /* 'ivar' associations */ +Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m +=================================================================== +--- sope-appserver/NGObjWeb/SoObjects/SoObject.m (révision 1546) ++++ sope-appserver/NGObjWeb/SoObjects/SoObject.m (copie de travail) +@@ -39,22 +39,34 @@ + static int debugLookup = -1; + static int debugBaseURL = -1; + static int useRelativeURLs = -1; ++static int redirectInitted = -1; ++static NSURL *redirectURL = nil; ++ + static void _initialize(void) { ++ NSString *url; ++ NSUserDefaults *ud; ++ ++ ud = [NSUserDefaults standardUserDefaults]; ++ + if (debugLookup == -1) { +- debugLookup = [[NSUserDefaults standardUserDefaults] +- boolForKey:@"SoDebugKeyLookup"] ? 1 : 0; ++ debugLookup = [ud boolForKey:@"SoDebugKeyLookup"] ? 1 : 0; + NSLog(@"Note(SoObject): SoDebugKeyLookup is enabled!"); + } + if (debugBaseURL == -1) { +- debugBaseURL = [[NSUserDefaults standardUserDefaults] +- boolForKey:@"SoDebugBaseURL"] ? 1 : 0; ++ debugBaseURL = [ud boolForKey:@"SoDebugBaseURL"] ? 1 : 0; + NSLog(@"Note(SoObject): SoDebugBaseURL is enabled!"); + } + if (useRelativeURLs == -1) { +- useRelativeURLs = [[NSUserDefaults standardUserDefaults] +- boolForKey:@"WOUseRelativeURLs"] ?1:0; ++ useRelativeURLs = [ud boolForKey:@"WOUseRelativeURLs"] ?1:0; + NSLog(@"Note(SoObject): relative base URLs are enabled."); + } ++ if (redirectInitted == -1) { ++ url = [ud stringForKey:@"WOApplicationRedirectURL"]; ++ if ([url length]) { ++ redirectURL = [[NSURL alloc] initWithString: url]; ++ } ++ redirectInitted = 1; ++ } + } + + /* classes */ +@@ -318,56 +330,61 @@ + + rq = [_ctx request]; + ms = [[NSMutableString alloc] initWithCapacity:128]; ++ ++ if (redirectURL) { ++ [ms appendString: [redirectURL absoluteString]]; ++ } ++ else { ++ if (!useRelativeURLs) { ++ port = [[rq headerForKey:@"x-webobjects-server-port"] intValue]; + +- if (!useRelativeURLs) { +- port = [[rq headerForKey:@"x-webobjects-server-port"] intValue]; +- +- /* this is actually a bug in Apache */ +- if (port == 0) { +- static BOOL didWarn = NO; +- if (!didWarn) { +- [self warnWithFormat:@"(%s:%i): got an empty port from Apache!", +- __PRETTY_FUNCTION__, __LINE__]; +- didWarn = YES; ++ /* this is actually a bug in Apache */ ++ if (port == 0) { ++ static BOOL didWarn = NO; ++ if (!didWarn) { ++ [self warnWithFormat:@"(%s:%i): got an empty port from Apache!", ++ __PRETTY_FUNCTION__, __LINE__]; ++ didWarn = YES; ++ } ++ port = 80; + } +- port = 80; +- } + +- if ((tmp = [rq headerForKey:@"host"]) != nil) { +- /* check whether we have a host header with port */ +- if ([tmp rangeOfString:@":"].length == 0) +- tmp = nil; +- } +- if (tmp != nil) { /* we have a host header with port */ +- isHTTPS = +- [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"]; +- [ms appendString:isHTTPS ? @"https://" : @"http://"]; +- [ms appendString:tmp]; +- } +- else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) { +- /* sometimes the URL is just wrong! (suggests port 80) */ +- if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad +- [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'", +- __PRETTY_FUNCTION__, tmp]; +- tmp = [tmp substringToIndex:([tmp length] - 2)]; ++ if ((tmp = [rq headerForKey:@"host"]) != nil) { ++ /* check whether we have a host header with port */ ++ if ([tmp rangeOfString:@":"].length == 0) ++ tmp = nil; + } +- else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) { +- /* see OGo bug #1435, Debian Apache hack */ +- [self warnWithFormat:@"%s: got 'http' protocol but 443 port, " +- @"assuming Debian/Apache bug (OGo #1435): '%@'", +- __PRETTY_FUNCTION__, tmp]; +- tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)]; +- tmp = [@"https" stringByAppendingString:tmp]; ++ if (tmp != nil) { /* we have a host header with port */ ++ isHTTPS = ++ [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"]; ++ [ms appendString:isHTTPS ? @"https://" : @"http://"]; ++ [ms appendString:tmp]; + } +- [ms appendString:tmp]; +- } +- else { +- // TODO: isHTTPS always no in this case? +- [ms appendString:isHTTPS ? @"https://" : @"http://"]; ++ else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) { ++ /* sometimes the URL is just wrong! (suggests port 80) */ ++ if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad ++ [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'", ++ __PRETTY_FUNCTION__, tmp]; ++ tmp = [tmp substringToIndex:([tmp length] - 2)]; ++ } ++ else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) { ++ /* see OGo bug #1435, Debian Apache hack */ ++ [self warnWithFormat:@"%s: got 'http' protocol but 443 port, " ++ @"assuming Debian/Apache bug (OGo #1435): '%@'", ++ __PRETTY_FUNCTION__, tmp]; ++ tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)]; ++ tmp = [@"https" stringByAppendingString:tmp]; ++ } ++ [ms appendString:tmp]; ++ } ++ else { ++ // TODO: isHTTPS always no in this case? ++ [ms appendString:isHTTPS ? @"https://" : @"http://"]; + +- [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]]; +- if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0) +- [ms appendFormat:@":%i", port]; ++ [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]]; ++ if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0) ++ [ms appendFormat:@":%i", port]; ++ } + } + } + Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m =================================================================== --- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1546) From 9657b7f1d8ddbf67b5efe770da0ba2134a491155 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 25 Oct 2007 20:07:56 +0000 Subject: [PATCH 2/2] Monotone-Parent: 32dfb6e6d5b5c65eb70d4f6d9673a8e57b99795d Monotone-Revision: 92223c349e36554e352239ae2da737603abfaea3 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-10-25T20:07:56 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 ++ UI/MailerUI/UIxMailListView.m | 29 ++++++++++++-- UI/WebServerResources/MailerUI.css | 37 ++++++++++++++++-- UI/WebServerResources/icon-deleted.png | Bin 0 -> 705 bytes .../icon-forwarded-replied.png | Bin 0 -> 734 bytes UI/WebServerResources/icon-forwarded.png | Bin 0 -> 546 bytes UI/WebServerResources/icon-new.png | Bin 0 -> 396 bytes UI/WebServerResources/icon-replied.png | Bin 0 -> 541 bytes UI/WebServerResources/message-mail.png | Bin 626 -> 0 bytes 9 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 UI/WebServerResources/icon-deleted.png create mode 100644 UI/WebServerResources/icon-forwarded-replied.png create mode 100644 UI/WebServerResources/icon-forwarded.png create mode 100644 UI/WebServerResources/icon-new.png create mode 100644 UI/WebServerResources/icon-replied.png delete mode 100644 UI/WebServerResources/message-mail.png diff --git a/ChangeLog b/ChangeLog index 1fd10a59b..2239ac960 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2007-10-25 Wolfgang Sourdeau + * UI/MailerUI/UIxMailListView.m ([UIxMailListView + -messageSubjectCellStyleClass]): added support for replied, + forwarded, forwarded and replied mails. + * SoObjects/Mailer/NSData+Mail.m ([NSData -bodyDataFromEncoding:encoding]): new utility method that decodes the NSData instance properly depending on the encoding string diff --git a/UI/MailerUI/UIxMailListView.m b/UI/MailerUI/UIxMailListView.m index e2cb26daf..7c6a855bb 100644 --- a/UI/MailerUI/UIxMailListView.m +++ b/UI/MailerUI/UIxMailListView.m @@ -173,9 +173,32 @@ static int attachmentFlagSize = 8096; - (NSString *) messageSubjectCellStyleClass { - return ([self isMessageRead] - ? @"mailer_readmailsubject" - : @"mailer_unreadmailsubject"); + NSArray *flags; + NSString *cellClass; + + flags = [[self message] valueForKey:@"flags"]; + + if ([flags containsObject: @"seen"]) + { + if ([flags containsObject: @"answered"]) + { + if ([flags containsObject: @"$forwarded"]) + cellClass = @"mailer_forwardedrepliedmailsubject"; + else + cellClass = @"mailer_repliedmailsubject"; + } + else if ([flags containsObject: @"$forwarded"]) + cellClass = @"mailer_forwardedmailsubject"; + else + cellClass = @"mailer_readmailsubject"; + } + else + cellClass = @"mailer_unreadmailsubject"; + + return cellClass; +// return ([self isMessageRead] +// ? @"mailer_readmailsubject" +// : @"mailer_unreadmailsubject"); } - (BOOL) hasMessageAttachment diff --git a/UI/WebServerResources/MailerUI.css b/UI/WebServerResources/MailerUI.css index abd9a6ec1..22c3feb52 100644 --- a/UI/WebServerResources/MailerUI.css +++ b/UI/WebServerResources/MailerUI.css @@ -240,21 +240,50 @@ span.mailer_datefield TD.mailer_readmailsubject { - background-image: url(message-mail-read.png) !important; - background-repeat: no-repeat !important; - background-position: 0px 0px !important; padding-left: 20px !important; } TD.mailer_unreadmailsubject { - background-image: url(message-mail.png) !important; + background-image: url(icon-new.png) !important; background-repeat: no-repeat !important; background-position: 0px 0px !important; padding-left: 20px !important; font-weight: bold !important; } +TD.mailer_repliedmailsubject +{ + background-image: url(icon-replied.png) !important; + background-repeat: no-repeat !important; + background-position: 0px 0px !important; + padding-left: 20px !important; +} + +TD.mailer_forwardedmailsubject +{ + background-image: url(icon-forwarded.png) !important; + background-repeat: no-repeat !important; + background-position: 0px 0px !important; + padding-left: 20px !important; +} + +TD.mailer_forwardedrepliedmailsubject +{ + background-image: url(icon-forwarded-replied.png) !important; + background-repeat: no-repeat !important; + background-position: 0px 0px !important; + padding-left: 20px !important; +} + +TD.mailer_deletedmailsubject +{ + background-image: url(icon-deleted.png) !important; + background-repeat: no-repeat !important; + background-position: 0px 0px !important; + padding-left: 20px !important; +} + TD.mailer_readmailsubject a { color: black; diff --git a/UI/WebServerResources/icon-deleted.png b/UI/WebServerResources/icon-deleted.png new file mode 100644 index 0000000000000000000000000000000000000000..147db859d585970babc07a0b534c222961e07faa GIT binary patch literal 705 zcmV;y0zUnTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L04ERt04ERulxa~J00007bV*G`2iFQ2 z6Dk$Bn6qgB000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006UNkl%~%E9;V2e7~-ghWJk z8W|aBfBW|B|6xhVWse>`Du{mm{0*|^Bj)CQzyJK1^zp-oNtf>5FGX>|N?F+le0+TJ znwpvn($dll4<0;te)Zb5h=AL-4{cLXVV6-g?f(%!$Uj6#w#S8neM~}{;t7k$Nh<)?sdHCbUNt|3R69w|S3@ZhD0sHnJ*u<*xQ_wJd5-MxDUSuHcV z=KTx|ERx2?+rE7HVsQKR?Ylp}e%1N;`?nm!|No|fe0&zNPoFM0$iVOqrx$qa?Hiex zm~3v{y2ZfAz)%qT?%k(rj~~aqd;50T&tJdHEVZ=@aC%{zii)AEvht}nZ{D!HdiCm1 z_~Xa+Fu9ow46H(Oa=ZEX`Hen)`lJ^2@Zk##7qD`2M*aNxljY5uHw^z78Jm&i(is?j z|NikK{LAOh-#FRWYOuOsjf8|e2S0!3w{PDbg*|>;hAn_sNJ|H^u(2)q_x-zE*ozmh n$;v>hWMp=(mX>y)N^S%Is}k4{L6r^r00000NkvXXu0mjfSpQt5 literal 0 HcmV?d00001 diff --git a/UI/WebServerResources/icon-forwarded-replied.png b/UI/WebServerResources/icon-forwarded-replied.png new file mode 100644 index 0000000000000000000000000000000000000000..17c18ffe456d412953f5abc65fced2abe9748f30 GIT binary patch literal 734 zcmV<40wMj0P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L04ERt04ERulxa~J00007bV*G`2iFQ2 z6DcXY+MF!_000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006xNkl1J`?g*k{?MPQP&q>y9(k;8WWaJ$Y!(GNY?)JkKVgEeK@Y9?Ihd&6yP>g>-gc_H{8GD ztcnB*;z1tL!XNWQ*%ed>h67Q)V5g{YJFqpC)S5z{Q1 zPfBpkxY5~j9LJ=xvEK#AOHswzcYac{xS(u#lVur-qQK|#qV=31?+6e=Ozz#Mz0hZt zGj(z~gz6iQ#{<9Lk1W$DF5Q8=9jH2K0x-0?l8{1Q)^Yoa9mzxnrDa-N?ypBxP4UBA zpqiwUq(kMMwSTsA`s*|Yd+hAL^olD>N|Iz(E_^zkiZ2aJ3^0{Rk)$ALAnEOX)=lfY zl{0TbOs6tol8w2rF|rm(w?A#CWRf-mhBp!$vB4LEluQzX--9G+BUzzl3rRk4gdB25vPB?5r}gxGqN`igoOn~c=!^jGu2oAZyj!)~@dXr*M5 zD48VM{5FPGLnP@U*@C}`Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L04ERt04ERulxa~J00007bV*G`2iFQ2 z6Dl8AO_CX>@2HM@dakSAh-}0004fNklNTfCh3JSVODS}x5&{v0Y81x1A}z2)FJ?sv!Wob>+$PzqGsxA}3> zvVX^qQVvj)rq=;Yw*k}z7h_C*3IhzL>B;Dx1uz6;+ytoF3B~c(2RMu*0fvD>z;3CX zWqIKcUkjGy8i0?$Y4eLI-aMb;+lNgY$B6(>?&1&IUmxJ-QVd`Y$h)h-tk^*k kU;uF6$DuEQ+JE{(XQMFfkfT0kYXATM07*qoM6N<$f;MUA5dZ)H literal 0 HcmV?d00001 diff --git a/UI/WebServerResources/icon-new.png b/UI/WebServerResources/icon-new.png new file mode 100644 index 0000000000000000000000000000000000000000..227ab50e4db0dc9acdd31d256911bfa7ea20141f GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85q=o`qTv&r(_070tMMiJbhi+uX9NXYjLib`CbhuBw6AbQR1AR zo12TU0NS}?f-xK;y?diFZudEeOr<6hLy=jJ`^|Hd_UiR zzVU`tn~b}^o;dV0Ud;a2|L5P%@6Va^h$m_G`AtI4n(G%yqQ?|fW!1Kn+)r%UctB4z?wGEwtXA=l!hi3r?f;*Wshe|NSylF!o^GUD jkyXXhPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L04ERt04ERulxa~J00007bV*G`2iFQ2 z6Dk1JMOT6V000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004aNklHjkz4vcr3oB=W|{=|)c z6I5%}2H;3is6$~7@V;Cv9|Qzn0s9+T$ere_bX5vVayoS#0KON_3nV`$X*3%E!@#GC zR|!&EDNe3V0FsjQqOEuwIM^(1zS?*9pmH8acoh`Q_HT&5@zPL0~Tua+Rpm7^}a&6ATv|FUY9fADE2a@w3F88(C80I^JaG0 zNx;_u!CAJHW%A=Bi4TcK5%++%K&YGD_X9`AY|%&x``4>X#0xHWwx}j zQ4<{%mSqKnrm|pWq%%wVv2<=Z+`jGGPG^&ipmq`6b>QKBUU;AP=bZNt{No}2L4pZS zhd(9=(pXf0z`!^XJO$y8eiS?(32r}ru7rGWJL$scV#rpnMYdSNa>f7}o408mpSM&% zBpAT=AvfGTgV=Vm?g$xu<)ACn26!Lap{lG#jzpSK%>S6dNOva+^m;sW+{3O@7tQ3| zi`!JQZa3y;zGBdI3)-!Fu_SldZ{l#k2al@_g@!VSmx^%LVu$hcC5{X|v(mz{>SSPW z`U?i^O(>~30I@7DEe`po(PwLgZsU4LbJ>^z4@cu2)SkJ_5l>eW)m9kOZTmluquYD| zRYy-iBF{s}H-$$g6H1LcAz!ITiV@{uYiz^5vke@1{ooqaZP=3(N5gY?-e7`UslsS) z4Qf9f7ys4Si)PvRRU5%Y7WIzsZqar-`m9--NfFPACmk$*K?{=~fff zQatc&67Sy(qexqT7V8rnGPiQ%rM;f!ugZr^U4$I5D5E&ZnGMa(!te9L)!v80SM3~m zYCRuBEG|lISf&k3Y^d;y9}0(sW6kYc;xDKfHZy1#vi{;5B%W>fCztP4N->$d8~^|S M07*qoM6N<$f&gkEa{vGU