From d9d1d86f31d91c6f84bb9ad32dc4e4cc7ba56a70 Mon Sep 17 00:00:00 2001 From: Thong Nguyen Date: Wed, 17 Oct 2012 11:57:27 +0100 Subject: [PATCH] Added AutoRecoveringHttpDataSource --- .DS_Store | Bin 0 -> 6148 bytes Audjustable.xcodeproj/project.pbxproj | 20 +++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11762 bytes .../xcschemes/Audjustable.xcscheme | 86 +++++++++ .../xcschemes/xcschememanagement.plist | 22 +++ Audjustable/Classes/.DS_Store | Bin 0 -> 6148 bytes Audjustable/Classes/AudioPlayer/AudioPlayer.h | 1 + Audjustable/Classes/AudioPlayer/AudioPlayer.m | 43 ++++- .../AutoRecoveringHttpDataSource.h | 19 ++ .../AutoRecoveringHttpDataSource.m | 169 ++++++++++++++++++ .../Classes/AudioPlayer/DataSourceWrapper.h | 17 ++ .../Classes/AudioPlayer/DataSourceWrapper.m | 84 +++++++++ Default-568h@2x.png | Bin 0 -> 18594 bytes 14 files changed, 465 insertions(+), 3 deletions(-) create mode 100644 .DS_Store create mode 100644 Audjustable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Audjustable.xcodeproj/project.xcworkspace/xcuserdata/tum.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Audjustable.xcodeproj/xcuserdata/tum.xcuserdatad/xcschemes/Audjustable.xcscheme create mode 100644 Audjustable.xcodeproj/xcuserdata/tum.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Audjustable/Classes/.DS_Store create mode 100644 Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.h create mode 100644 Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.m create mode 100644 Audjustable/Classes/AudioPlayer/DataSourceWrapper.h create mode 100644 Audjustable/Classes/AudioPlayer/DataSourceWrapper.m create mode 100644 Default-568h@2x.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..61bcb88932409e54f9b1f9fb4f37b6497ff24a53 GIT binary patch literal 6148 zcmeHKK~BRk5S)b`DskxriKAbD)DJ+Y!VCHVAgO?=Q6gw0j=3N{!UK2+zu+UxdQBlB zms}8nUCBEeuXk;a6x$0x7Hv5PW&oyailWAVX!oFNFAbg$CFW>xk1Z~7h0Q>s-`J&V zKg1bYlvq=Lu78DNJfJ{L&k7ChXstKb^JP(2jcw)Wc3gB-=Xu#~3*hzn^fBfbF?Us$ zyXcd*vC+-V*OkB623$J>&VV!E4E#q1cxS6j4-8#91I~amuwy{ahrp(oCF~62(LohU z0HQvlqtMn`LSsV0EMaFz4@E4LXrYoy46$(bhcqrr*cn0KMxF4$CbT&D(w mcJC3u4?RbYqSO3AZH~(lc7~co`(rrK9|DmOSI)o>Fz^mW3_-O3 literal 0 HcmV?d00001 diff --git a/Audjustable.xcodeproj/project.pbxproj b/Audjustable.xcodeproj/project.pbxproj index 3ea6ff9..eab1bea 100644 --- a/Audjustable.xcodeproj/project.pbxproj +++ b/Audjustable.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + A16CB9AD162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A16CB9AA162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.m */; }; + A16CB9AE162EC4AB00CFD1E8 /* DataSourceWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = A16CB9AC162EC4AB00CFD1E8 /* DataSourceWrapper.m */; }; + A16CB9B1162EC5E300CFD1E8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A16CB9B0162EC5E300CFD1E8 /* SystemConfiguration.framework */; }; + A16CB9B3162EC5E900CFD1E8 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A16CB9B2162EC5E900CFD1E8 /* Default-568h@2x.png */; }; A186B4E4157F80E700BD0084 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A186B4E3157F80E700BD0084 /* UIKit.framework */; }; A186B4E6157F80E700BD0084 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A186B4E5157F80E700BD0084 /* Foundation.framework */; }; A186B4EE157F80E700BD0084 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A186B4EC157F80E700BD0084 /* InfoPlist.strings */; }; @@ -25,6 +29,12 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + A16CB9A9162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoRecoveringHttpDataSource.h; sourceTree = ""; }; + A16CB9AA162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AutoRecoveringHttpDataSource.m; sourceTree = ""; }; + A16CB9AB162EC4AB00CFD1E8 /* DataSourceWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataSourceWrapper.h; sourceTree = ""; }; + A16CB9AC162EC4AB00CFD1E8 /* DataSourceWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataSourceWrapper.m; sourceTree = ""; }; + A16CB9B0162EC5E300CFD1E8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + A16CB9B2162EC5E900CFD1E8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; A186B4DF157F80E600BD0084 /* Audjustable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Audjustable.app; sourceTree = BUILT_PRODUCTS_DIR; }; A186B4E3157F80E700BD0084 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; A186B4E5157F80E700BD0084 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -58,6 +68,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A16CB9B1162EC5E300CFD1E8 /* SystemConfiguration.framework in Frameworks */, A186B51A157F819500BD0084 /* CFNetwork.framework in Frameworks */, A186B518157F818900BD0084 /* CoreFoundation.framework in Frameworks */, A186B514157F817500BD0084 /* AudioToolbox.framework in Frameworks */, @@ -72,6 +83,7 @@ A186B4D4157F80E600BD0084 = { isa = PBXGroup; children = ( + A16CB9B0162EC5E300CFD1E8 /* SystemConfiguration.framework */, A186B4E9157F80E700BD0084 /* Audjustable */, A186B4E2157F80E700BD0084 /* Frameworks */, A186B4E0157F80E600BD0084 /* Products */, @@ -116,6 +128,7 @@ A186B51B157F81D900BD0084 /* Resources */, A186B4EB157F80E700BD0084 /* Audjustable-Info.plist */, A186B4EC157F80E700BD0084 /* InfoPlist.strings */, + A16CB9B2162EC5E900CFD1E8 /* Default-568h@2x.png */, A186B4EF157F80E700BD0084 /* main.m */, A186B4F1157F80E700BD0084 /* Audjustable-Prefix.pch */, ); @@ -135,6 +148,10 @@ A186B4FF157F813100BD0084 /* AudioPlayer */ = { isa = PBXGroup; children = ( + A16CB9A9162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.h */, + A16CB9AA162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.m */, + A16CB9AB162EC4AB00CFD1E8 /* DataSourceWrapper.h */, + A16CB9AC162EC4AB00CFD1E8 /* DataSourceWrapper.m */, A186B500157F813100BD0084 /* AudioPlayer.h */, A186B501157F813100BD0084 /* AudioPlayer.m */, A186B502157F813100BD0084 /* CoreFoundationDataSource.h */, @@ -209,6 +226,7 @@ files = ( A186B4EE157F80E700BD0084 /* InfoPlist.strings in Resources */, A186B51D157F825400BD0084 /* sample.m4a in Resources */, + A16CB9B3162EC5E900CFD1E8 /* Default-568h@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -227,6 +245,8 @@ A186B50F157F813100BD0084 /* HttpDataSource.m in Sources */, A186B510157F813100BD0084 /* LocalFileDataSource.m in Sources */, A186B511157F813100BD0084 /* AudioPlayerView.m in Sources */, + A16CB9AD162EC4AB00CFD1E8 /* AutoRecoveringHttpDataSource.m in Sources */, + A16CB9AE162EC4AB00CFD1E8 /* DataSourceWrapper.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Audjustable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Audjustable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..94b1065 --- /dev/null +++ b/Audjustable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Audjustable.xcodeproj/project.xcworkspace/xcuserdata/tum.xcuserdatad/UserInterfaceState.xcuserstate b/Audjustable.xcodeproj/project.xcworkspace/xcuserdata/tum.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..c8f9c0de6a0a8899cda91afdc5aff07bf3d0e38e GIT binary patch literal 11762 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Audjustable.xcodeproj/xcuserdata/tum.xcuserdatad/xcschemes/xcschememanagement.plist b/Audjustable.xcodeproj/xcuserdata/tum.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..02da18f --- /dev/null +++ b/Audjustable.xcodeproj/xcuserdata/tum.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Audjustable.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + A186B4DE157F80E600BD0084 + + primary + + + + + diff --git a/Audjustable/Classes/.DS_Store b/Audjustable/Classes/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0f9a380c4330ccee1f87b65f146a7c9930c78a18 GIT binary patch literal 6148 zcmeHK%}T>S5T0$TCRCvpp~uB@k%~$cJj7DLW1)o}tY|`t4TPj5sYPlvc=Bz08=uFS z-K|(^!IOxcf!S{|KUwxm*x3aD(H#2+02KhRPzeh*4&MmHNtdKxJcL5MBZfAF;KBn8 zma^IL7a5>$SB7&KgAW0G{eFozNk?87dzkU&jlv+!>h*U~D3&%hw=CPXw)?#x^5aP} z9!Gw9)fvWD)05NVnmjr@ znbqX9(Wq;CW?PnBd9`-;_RlW6?&Iv~IoC`I{OOeJ7@Wfk8Y>oc-$|k{j_xpHUOlg3 zWCoZ4W?*d?FdLv%UYiy3LYV<(;HM1G{vc5a9fP?>wRPY?$482n2uaYUy9A*$=orj3 zVgyC#Qbb)U%oRiEa`a1+=NQa2>T(cjW_*vCS(qD&P_v_7s&o*JMjn{~W?+$lqJFGU z|G!v$|6eTPCuV>d_*V>wQmfNy;*v~nU0NLVT8Vm#N 0) + { + [array addObject:[[bufferingQueue dequeue] queueItemId]]; + } + + for (QueueEntry* entry in upcomingQueue) + { + [array addObject:entry.queueItemId]; + } + [upcomingQueue removeAllObjects]; + + dispatch_async(dispatch_get_main_queue(), ^ + { + if ([self.delegate respondsToSelector:@selector(audioPlayer:didCancelQueuedItems:)]) + { + [self.delegate audioPlayer:self didCancelQueuedItems:array]; + } + }); } } @@ -1258,13 +1285,18 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ currentlyReadingEntry.dataSource.delegate = nil; [currentlyReadingEntry.dataSource unregisterForEvents]; - if (currentlyReadingEntry) + if (currentlyPlayingEntry) { [self processDidFinishPlaying:currentlyPlayingEntry withNext:nil]; } pthread_mutex_lock(&queueBuffersMutex); + if ([bufferingQueue peek] == currentlyPlayingEntry) + { + [bufferingQueue dequeue]; + } + currentlyPlayingEntry = nil; currentlyReadingEntry = nil; seekToTimeWasRequested = NO; @@ -1276,15 +1308,20 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ currentlyReadingEntry.dataSource.delegate = nil; [currentlyReadingEntry.dataSource unregisterForEvents]; - if (currentlyReadingEntry) + if (currentlyPlayingEntry) { [self processDidFinishPlaying:currentlyPlayingEntry withNext:nil]; } pthread_mutex_lock(&queueBuffersMutex); + + if ([bufferingQueue peek] == currentlyPlayingEntry) + { + [bufferingQueue dequeue]; + } + currentlyPlayingEntry = nil; currentlyReadingEntry = nil; - pthread_mutex_unlock(&queueBuffersMutex); [self resetAudioQueue]; diff --git a/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.h b/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.h new file mode 100644 index 0000000..e83cedb --- /dev/null +++ b/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.h @@ -0,0 +1,19 @@ +// +// AutoRecoveringHttpDataSource.h +// bloom +// +// Created by Thong Nguyen on 16/10/2012. +// Copyright (c) 2012 DDN Ltd. All rights reserved. +// + +#import "DataSource.h" +#import "HttpDataSource.h" +#import "DataSourceWrapper.h" + +@interface AutoRecoveringHttpDataSource : DataSourceWrapper + +-(id) initWithHttpDataSource:(HttpDataSource*)innerDataSource; + +@property (readonly) HttpDataSource* innerDataSource; + +@end diff --git a/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.m b/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.m new file mode 100644 index 0000000..755143a --- /dev/null +++ b/Audjustable/Classes/AudioPlayer/AutoRecoveringHttpDataSource.m @@ -0,0 +1,169 @@ +// +// AutoRecoveringHttpDataSource.m +// bloom +// +// Created by Thong Nguyen on 16/10/2012. +// Copyright (c) 2012 DDN Ltd. All rights reserved. +// + +#import +#import +#import +#import +#import +#import +#import +#import +#import "AutoRecoveringHttpDataSource.h" + +#define MAX_IMMEDIATE_RECONNECT_ATTEMPTS (8) + +@interface AutoRecoveringHttpDataSource() +{ + int reconnectAttempts; + BOOL waitingForNetwork; + SCNetworkReachabilityRef reachabilityRef; +} + +-(void) reachabilityChanged; + +@end + +static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) +{ + @autoreleasepool + { + AutoRecoveringHttpDataSource* dataSource = (__bridge AutoRecoveringHttpDataSource*)info; + + [dataSource reachabilityChanged]; + } +} + +@implementation AutoRecoveringHttpDataSource + +-(HttpDataSource*) innerHttpDataSource +{ + return (HttpDataSource*)self.innerDataSource; +} + +-(id) initWithHttpDataSource:(HttpDataSource*)innerDataSourceIn +{ + if (self = [super initWithDataSource:innerDataSourceIn]) + { + self.innerDataSource.delegate = self; + + struct sockaddr_in zeroAddress; + + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); + } + + return self; +} + +-(BOOL) startNotifierOnRunLoop:(NSRunLoop*)runLoop +{ + BOOL retVal = NO; + SCNetworkReachabilityContext context = { 0, (__bridge void*)self, NULL, NULL, NULL }; + + if (SCNetworkReachabilitySetCallback(reachabilityRef, ReachabilityCallback, &context)) + { + if(SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef, runLoop.getCFRunLoop, kCFRunLoopDefaultMode)) + { + retVal = YES; + } + } + + return retVal; +} + +-(BOOL) registerForEvents:(NSRunLoop*)runLoop +{ + [super registerForEvents:runLoop]; + [self startNotifierOnRunLoop:runLoop]; + + return YES; +} + +-(void) unregisterForEvents +{ + [self stopNotifier]; +} + +-(void) stopNotifier +{ + if (reachabilityRef != NULL) + { + SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + } +} + +-(BOOL) hasGotNetworkConnection +{ + SCNetworkReachabilityFlags flags; + + if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + } + + return NO; +} + +-(void) dealloc +{ + [self stopNotifier]; + + if (reachabilityRef!= NULL) + { + CFRelease(reachabilityRef); + } +} + +-(void) reachabilityChanged +{ + if (waitingForNetwork) + { + waitingForNetwork = NO; + + [self attemptReconnect]; + } +} + +-(void) dataSourceDataAvailable:(DataSource*)dataSource +{ + reconnectAttempts = 0; + + [super dataSourceDataAvailable:dataSource]; +} + +-(void) attemptReconnect +{ + reconnectAttempts++; + + [self seekToOffset:self.position]; +} + +-(void) dataSourceErrorOccured:(DataSource*)dataSource +{ + if (![self hasGotNetworkConnection]) + { + waitingForNetwork = YES; + + return; + } + + if (reconnectAttempts > MAX_IMMEDIATE_RECONNECT_ATTEMPTS) + { + [self performSelector:@selector(attemptReconnect) withObject:nil afterDelay:5]; + } + else + { + [self attemptReconnect]; + } +} + +@end diff --git a/Audjustable/Classes/AudioPlayer/DataSourceWrapper.h b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.h new file mode 100644 index 0000000..b7b7406 --- /dev/null +++ b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.h @@ -0,0 +1,17 @@ +// +// DataSourceWrapper.h +// bloom +// +// Created by Thong Nguyen on 16/10/2012. +// Copyright (c) 2012 DDN Ltd. All rights reserved. +// + +#import "DataSource.h" + +@interface DataSourceWrapper : DataSource + +-(id) initWithDataSource:(DataSource*)innerDataSource; + +@property (readonly) DataSource* innerDataSource; + +@end diff --git a/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m new file mode 100644 index 0000000..1df450a --- /dev/null +++ b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m @@ -0,0 +1,84 @@ +// +// DataSourceWrapper.m +// bloom +// +// Created by Thong Nguyen on 16/10/2012. +// Copyright (c) 2012 DDN Ltd. All rights reserved. +// + +#import "DataSourceWrapper.h" + +@interface DataSourceWrapper() +@property (readwrite) DataSource* innerDataSource; +@end + +@implementation DataSourceWrapper + +-(id) initWithDataSource:(DataSource*)innerDataSourceIn +{ + if (self = [super init]) + { + self.innerDataSource = innerDataSourceIn; + + self.innerDataSource.delegate = self; + } + + return self; +} + +-(long long) length +{ + return self.innerDataSource.length; +} + +-(void) seekToOffset:(long long)offset +{ + return [self.innerDataSource seekToOffset:offset]; +} + +-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size +{ + return [self.innerDataSource readIntoBuffer:buffer withSize:size]; +} + +-(long long) position +{ + return self.innerDataSource.position; +} + +-(BOOL) registerForEvents:(NSRunLoop*)runLoop +{ + return [self.innerDataSource registerForEvents:runLoop]; +} + +-(void) unregisterForEvents +{ + [self.innerDataSource unregisterForEvents]; +} + +-(void) close +{ + [self.innerDataSource close]; +} + +-(BOOL) hasBytesAvailable +{ + return self.innerDataSource.hasBytesAvailable; +} + +-(void) dataSourceDataAvailable:(DataSource*)dataSource +{ + [self.delegate dataSourceDataAvailable:self]; +} + +-(void) dataSourceErrorOccured:(DataSource*)dataSource +{ + [self.delegate dataSourceErrorOccured:self]; +} + +-(void) dataSourceEof:(DataSource*)dataSource +{ + [self.delegate dataSourceEof:self]; +} + +@end diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001