From 8c7cb24faf3d6da005e23c6b6bea299636df0c4a Mon Sep 17 00:00:00 2001 From: Warif Akhand Rishi Date: Thu, 1 Aug 2013 21:06:41 +0600 Subject: [PATCH 1/2] 1. The board is an 8x8 grid and by default 10 hidden mines are randomly placed into the board. > 2. New Game: start a new, randomly generated game. > 3. Validate: check that a user has correctly marked all the tiles and end the game in either victory or failure > 4. Cheat: reveal the locations of the mines without ending the game. --- CellButton.h | 4 +- CellButton.m | 36 ++--- Default-568h@2x.png | Bin 0 -> 18594 bytes GameController.h | 0 GameController.m | 136 ++++++++++++------ HomeController.h | 0 HomeController.m | 0 Info.plist | 0 MineSweeper.xcodeproj/project.pbxproj | 27 ++-- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 42029 bytes .../WorkspaceSettings.xcsettings | 10 ++ .../xcdebugger/Breakpoints.xcbkptlist | 5 + .../xcschemes/MineSweeper.xcscheme | 86 +++++++++++ .../xcschemes/xcschememanagement.plist | 22 +++ MineSweeperAppDelegate.h | 0 MineSweeperAppDelegate.m | 6 +- MineSweeper_Prefix.pch | 0 main.m | 0 tile1.gif | Bin tile2.gif | Bin 21 files changed, 263 insertions(+), 76 deletions(-) mode change 100644 => 100755 CellButton.h mode change 100644 => 100755 CellButton.m create mode 100644 Default-568h@2x.png mode change 100644 => 100755 GameController.h mode change 100644 => 100755 GameController.m mode change 100644 => 100755 HomeController.h mode change 100644 => 100755 HomeController.m mode change 100644 => 100755 Info.plist mode change 100644 => 100755 MineSweeper.xcodeproj/project.pbxproj create mode 100644 MineSweeper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 MineSweeper.xcodeproj/project.xcworkspace/xcuserdata/warifakhandrishi.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MineSweeper.xcodeproj/project.xcworkspace/xcuserdata/warifakhandrishi.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 MineSweeper.xcodeproj/xcuserdata/warifakhandrishi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 MineSweeper.xcodeproj/xcuserdata/warifakhandrishi.xcuserdatad/xcschemes/MineSweeper.xcscheme create mode 100644 MineSweeper.xcodeproj/xcuserdata/warifakhandrishi.xcuserdatad/xcschemes/xcschememanagement.plist mode change 100644 => 100755 MineSweeperAppDelegate.h mode change 100644 => 100755 MineSweeperAppDelegate.m mode change 100644 => 100755 MineSweeper_Prefix.pch mode change 100644 => 100755 main.m mode change 100644 => 100755 tile1.gif mode change 100644 => 100755 tile2.gif diff --git a/CellButton.h b/CellButton.h old mode 100644 new mode 100755 index a5177b2..53b59d7 --- a/CellButton.h +++ b/CellButton.h @@ -15,10 +15,12 @@ BOOL isOpened; } +@property (readwrite) BOOL isMine; +@property (readonly) BOOL isOpened; + - (void) addAdjCell: (CellButton *) cell; - (void) addRoundCell: (CellButton *) cell; - (int) open; - (void) markFlag; -@property (readwrite) BOOL isMine; @end diff --git a/CellButton.m b/CellButton.m old mode 100644 new mode 100755 index 0f7636c..7fe2a05 --- a/CellButton.m +++ b/CellButton.m @@ -9,6 +9,10 @@ #import "CellButton.h" @implementation CellButton + +@synthesize isMine; +@synthesize isOpened; + - (id) init { if( self = [super init]){ @@ -17,12 +21,10 @@ - (id) init isMine = NO; isOpened = NO; - [self setBackgroundImage:[[UIImage imageNamed:@"tile1.gif"] - stretchableImageWithLeftCapWidth:18.0 topCapHeight: 0.0] + [self setBackgroundImage:[UIImage imageNamed:@"tile1.gif"] forState: UIControlStateNormal]; - [self setBackgroundImage:[[UIImage imageNamed:@"tile2.gif"] - stretchableImageWithLeftCapWidth:18.0 topCapHeight: 0.0] + [self setBackgroundImage:[UIImage imageNamed:@"tile2.gif"] forState: UIControlStateHighlighted]; } @@ -65,25 +67,27 @@ - (int) open int value = [self getValue]; if(isOpened) return value; isOpened = YES; - - if(value > 0){ + [self setBackgroundImage:[UIImage imageNamed:@"tile2.gif"] + forState: UIControlStateNormal]; + + if (value > 0) { + [self setTitle:[NSString stringWithFormat:@"%i", value] forState:UIControlStateNormal]; [self setTitle:[NSString stringWithFormat:@"%i", value] forState:UIControlStateHighlighted]; - }else if(value == -1){ + + } else if (value == -1) { + [self setTitle:@"X" forState:UIControlStateNormal]; [self setTitle:@"X" forState:UIControlStateHighlighted]; - } - [self setBackgroundImage:[[UIImage imageNamed:@"tile2.gif"] - stretchableImageWithLeftCapWidth:18.0 topCapHeight: 0.0] - forState: UIControlStateNormal]; - - if(value == 0){ - for(CellButton * cell in round_cells_){ + + } else if (value == 0) { + + for(CellButton * cell in round_cells_) { + [cell open]; } } - return value; } @@ -91,6 +95,4 @@ - (void) markFlag { } -@synthesize isMine; - @end \ No newline at end of file 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 diff --git a/GameController.h b/GameController.h old mode 100644 new mode 100755 diff --git a/GameController.m b/GameController.m old mode 100644 new mode 100755 index 0d1c1b7..e88dd34 --- a/GameController.m +++ b/GameController.m @@ -9,87 +9,129 @@ #import "GameController.h" #import "CellButton.h" +#define MINE_COUNT 10 +#define CELL_COUNT_COLUMN 8 +#define CELL_COUNT_ROW 8 + @implementation GameController - (id) init { - if( self = [super init]){ - cells_ = [NSMutableArray array]; - [cells_ retain]; - isInitedCells = NO; - } - return self; + if( self = [super init]){ + cells_ = [NSMutableArray array]; + [cells_ retain]; + isInitedCells = NO; + self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:self action:@selector(actionRevealAllMinesButton:)] autorelease]; + } + return self; } - (void) dealloc { - [cells_ release]; - [super dealloc]; + [cells_ release]; + [super dealloc]; } - (void) initCells : (CellButton *) sender { - int MINE_COUNT = 16; - for(int i = 0; i < MINE_COUNT; i++){ - while(1){ - int rand = random() % [cells_ count]; - CellButton * cell = [cells_ objectAtIndex:rand]; - if(cell != sender && !cell.isMine){ - cell.isMine = YES; - break; - } + for(int i = 0; i < MINE_COUNT; i++){ + while(1){ + int rand = random() % [cells_ count]; + CellButton * cell = [cells_ objectAtIndex:rand]; + if(cell != sender && !cell.isMine){ + cell.isMine = YES; + break; + } + } } - } - isInitedCells = YES; + isInitedCells = YES; } - (void) clickCell : (CellButton *) sender { - if(! isInitedCells) [self initCells: sender]; - [sender open]; + if(! isInitedCells) [self initCells: sender]; + [sender open]; + + if (sender.isMine) + [self displayMessage:@":-("]; + + else if ([self isAllMinesDetected]) + [self displayMessage:@":-)"]; } -(void)loadView { - [super loadView]; + [super loadView]; - UIView * contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; - contentView.backgroundColor = [UIColor whiteColor]; - - int WIDTH = 16; - int HEIGHT = 16; + UIView * contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; + contentView.backgroundColor = [UIColor whiteColor]; + + int WIDTH = CELL_COUNT_COLUMN; + int HEIGHT = CELL_COUNT_ROW; + + CGSize canvasSize = self.view.frame.size; + canvasSize.height = self.view.frame.size.height - self.navigationController.navigationBar.frame.size.height; + int cellWidth = canvasSize.width / WIDTH; + int cellHeight = canvasSize.height / HEIGHT; + for(int x = 0; x < WIDTH; x++) { for(int y = 0; y < HEIGHT; y++){ - CellButton * cell = [[CellButton alloc] init]; - [cell setFrame:CGRectMake(x * 18.0f, y * 18.0f, 18.0f, 18.0f)]; + CellButton * cell = [[CellButton alloc] init]; + [cell setFrame:CGRectMake(x * cellWidth, y * cellHeight, cellWidth, cellHeight)]; //[cell setCenter:CGPointMake(160.0f, 208.0f)]; [cell addTarget:self action:@selector(clickCell:) forControlEvents:UIControlEventTouchUpInside]; [contentView addSubview: cell]; - [cells_ addObject: cell]; - [cell release]; + [cells_ addObject: cell]; + [cell release]; } - } - + } + for(int x = 0; x < WIDTH; x++) { for(int y = 0; y < HEIGHT; y++){ - CellButton * cell = [cells_ objectAtIndex:(x + y * WIDTH)]; - for(int i = -1; i <= 1; i++){ - for(int j = -1; j <= 1; j++){ - if(x + i < 0 || x + i >= WIDTH) continue; - if(y + j < 0 || y + j >= HEIGHT) continue; - - CellButton * cell_to = [cells_ objectAtIndex:( (x+i) + (y+j) * WIDTH)]; - [cell addRoundCell:cell_to]; - if(i == 0 || y == 0){ - [cell addAdjCell:cell_to]; - } - } - } + CellButton * cell = [cells_ objectAtIndex:(x + y * WIDTH)]; + for(int i = -1; i <= 1; i++){ + for(int j = -1; j <= 1; j++){ + if(x + i < 0 || x + i >= WIDTH) continue; + if(y + j < 0 || y + j >= HEIGHT) continue; + + CellButton * cell_to = [cells_ objectAtIndex:( (x+i) + (y+j) * WIDTH)]; + [cell addRoundCell:cell_to]; + if(i == 0 || y == 0){ + [cell addAdjCell:cell_to]; + } + } + } } } - + self.view = contentView; [contentView release]; } +- (BOOL)isAllMinesDetected +{ + for (CellButton *cell in cells_) + if ((!cell.isMine && !cell.isOpened) || (cell.isMine && cell.isOpened)) + return NO; + + return YES; +} + +- (void)actionRevealAllMinesButton:(id)sender +{ + if(! isInitedCells) [self initCells: sender]; + + for (CellButton *cell in cells_) + if (cell.isMine) + [cell open]; +} + +- (void)displayMessage:(NSString *)message +{ + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:message message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; + [alertView show]; + [alertView release]; + +} + @end diff --git a/HomeController.h b/HomeController.h old mode 100644 new mode 100755 diff --git a/HomeController.m b/HomeController.m old mode 100644 new mode 100755 diff --git a/Info.plist b/Info.plist old mode 100644 new mode 100755 diff --git a/MineSweeper.xcodeproj/project.pbxproj b/MineSweeper.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index 0033c26..1108c74 --- a/MineSweeper.xcodeproj/project.pbxproj +++ b/MineSweeper.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 45; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -16,6 +16,7 @@ 31F756D40F9220F500B1F870 /* HomeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 31F756D30F9220F500B1F870 /* HomeController.m */; }; 31F757270F92292400B1F870 /* tile1.gif in Resources */ = {isa = PBXBuildFile; fileRef = 31F757250F92292400B1F870 /* tile1.gif */; }; 31F757280F92292400B1F870 /* tile2.gif in Resources */ = {isa = PBXBuildFile; fileRef = 31F757260F92292400B1F870 /* tile2.gif */; }; + BC50F2C217A9844900C0A5BE /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BC50F2C117A9844900C0A5BE /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -35,6 +36,7 @@ 31F757260F92292400B1F870 /* tile2.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = tile2.gif; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* MineSweeper_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MineSweeper_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC50F2C117A9844900C0A5BE /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -61,6 +63,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + BC50F2C117A9844900C0A5BE /* Default-568h@2x.png */, 31F756CE0F921F7500B1F870 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, @@ -138,9 +141,16 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MineSweeper" */; - compatibilityVersion = "Xcode 3.1"; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; hasScannedForEncodings = 1; + knownRegions = ( + en, + ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; projectRoot = ""; @@ -157,6 +167,7 @@ files = ( 31F757270F92292400B1F870 /* tile1.gif in Resources */, 31F757280F92292400B1F870 /* tile2.gif in Resources */, + BC50F2C217A9844900C0A5BE /* Default-568h@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -187,6 +198,7 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MineSweeper_Prefix.pch; + GCC_VERSION = ""; INFOPLIST_FILE = Info.plist; PRODUCT_NAME = MineSweeper; }; @@ -214,11 +226,10 @@ GCC_VERSION = 4.0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 2.2.1; - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + ONLY_ACTIVE_ARCH = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos2.0; + SDKROOT = iphoneos; }; name = Debug; }; @@ -230,8 +241,8 @@ GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - SDKROOT = iphoneos2.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + SDKROOT = iphoneos; }; name = Release; }; diff --git a/MineSweeper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MineSweeper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..63a14da --- /dev/null +++ b/MineSweeper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MineSweeper.xcodeproj/project.xcworkspace/xcuserdata/warifakhandrishi.xcuserdatad/UserInterfaceState.xcuserstate b/MineSweeper.xcodeproj/project.xcworkspace/xcuserdata/warifakhandrishi.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2a3eb57c7614bd664dad350084b55aa1617f9d01 GIT binary patch literal 42029 zcmc$H2Y3@l)9~%yNjk{|cU&;Y-QX(8m10zAADa?uXDRUWfGjj{GmD$GJ%G}1>&fLM=$=t;} zz-(t8Wp*-8GEXtjG0!tEFb9~|nU9%Im`|CnnZqaqg`!a?427cz6p5lxG>So^Q7no> zi6{xBp$RAph;bUV5qJ&tyxC(x7VDfAqA1HFmfL!Y6~(YNS3 z^ga3s{fvG=zoI|TUzo!x9DyTo6dr>U@mQRWGjJvzkEh_Ncp5IldR&eTxB?q-Ev~~& z*o^1mdDx2Q<4(K`FUKqJN_+}lg;(P>_*8rrJ{w?k&pjbq2M>1+m@$>y^fR?ALgE7<95BWq?`*fw?+JCE&PyVxbHgLSdzvK!d**z?&7 z*bCW<*o)aq*h|^V*p2KUyNTV*Zeed{?`H2~A7me4_p$rg1MDm8LG}>)D*GDyI{OCu zCi^A(75g>&4f`$o9ebGliT#Z|!Z94j$v7o9iVNeSxkPR(H;z+tN!)mD0++?*aXPM; zo5bn4a?Zfja}At{Yvg8dOHqlN!BE5mbJ=e%jU`2Wu3Av z*5BD=vlSZ@ z7bq@PT&B2EagE}7#YV+u#m$OsirW=;DehG~pm<2JL-Ckmx8fsHt7Zv*yuP9zs zyrFnk@wMU`#kY#@6o(bxD}GS?rubcPlvnUPujEyH1Ru#q@v(d&Kb9ZIXYiT)czyz( z%Qx~CekMPgpT{rYZG1Q1!}sw^`2l_fznVXdKb>FCpTnQWU&LR^U&&v?-@p&@H}PBf z+xffr9sHyGPW~}|7ymfFn}33TiGP{j$M5Ig;os%o;<-g+(^WXD-@kf=6 zGFTa+3{}P}6O?0=iOTWH3Cb*Gv9d&2s+_2-R8}dgl@?{QvPC&l*`e%I+LQ~GPNhrP zuN+Vk5R$ijKN_m~~dgW&27Ufpu-OBrw4=Hyl_b8uNzN9>$JfwU> z`L^;yvsANHb5wIxU8+T@ZdI>psfwu9s!ms}Q=Oq& zuR2F{p6Yzn1*!{Gm#Q|Zwy17WZByNI$R>OR%|s)tk$t9Gg$Q$3-2Qng3*tm=j4 zRQo_r&jCissF)xomww10~@V`5Z2q}Y1C^JgH0z1frGZ6wu z5VnS;78{L~+I+n(r?R5dkW*kVl;)Hd8MHZ-Mf&neV{v{_v0i5li>j$G&U84Jxcb^V zY!!}%wBg%BZ>AS4t6S8^dvD4s{jblW=}%PXDjy*6vuRDZgb_5}uqz2E8R>9IMj zhT`&)l8SOejx;mUTo4wxA2@GWWGa#|%!4<(+RTZUf2yhg^dGneMdh;>*1;S z6SFuRJqy~MHLjL!SNDP*AQtOo1XwH&cony5mA0rLTdmQRuE|!f(iG(9XRAx|^Vh8L zjY0u4Rmj-N6f#9jF;l{nG836e%w%SYFiHp$!i5MSQiu|wg&1Mj?JFGv{noHBVAQAqDDh>9#GG(0NhOcSGbJ zfTF_Y>h7`+gMl(6;qSJ&s3t+P%I+RpV|)Lix$sr$18o?_D1m4dXqay-b9;S)Y++i3 zjE&4pVa!IRO-Qtcg;%s#y!_Vm+j?F5!RmsTIm}!keUO>QScS1dss}+Zvw*Qtd+T62 zg>iyo!^v`~#m$5Srrf-&H(RN_A zRr+Xi&1o=Kbc2>T?Cs8#g8;R(wZUu>(?uT-{mk+qJgfvB(o)JCYCj6AnKkno%=H8P z?Vy2rr?Y+KCT2BrDzg+^i1<}vL|}+DEYb_;qrQm|D18sv7-k)Fj*zj1IfGfxoXMQU zoGpwOCJ0$Vwve-hIhWbMoX4EcTp;8M)q+h}EG)5xsare1(sE&dYPG7nXru{Z&x4p|~r{e(q83jNdo-N>xBo}O4(bsP8 zv~`LqC_NrS0S)!${`UR>*Rgo0{{yn%p+=@feVkV=0VK+83ms0I7pt3*Rja`FQ9-)TzurO&O zvqP9XyT03QGcUK<`fN@g&@N^-1$tbVvXOa0m^#xyBb@&LJ;OXp0rm*fHZpsKvSCcS z(St3Rd5PKQ