[
  {
    "path": "Classes/NSNumber+SP.h",
    "content": "//\n//  NSNumber+SL.h\n//  SpotLook\n//\n//  Created by Nicolas Seriot on 31.03.08.\n//  Copyright 2008 __MyCompanyName__. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n\n@interface NSNumber (SP)\n\n- (NSString *)prettyBytes;\n\n@end\n"
  },
  {
    "path": "Classes/NSNumber+SP.m",
    "content": "//\n//  NSNumber+SL.m\n//  SpotLook\n//\n//  Created by Nicolas Seriot on 31.03.08.\n//  Copyright 2008 __MyCompanyName__. All rights reserved.\n//\n\n#import \"NSNumber+SP.h\"\n\n\n@implementation NSNumber (SP)\n\n- (NSString *)prettyBytes {\n\tfloat bytes = [self longValue];\n\tNSUInteger unit = 0;\n\n\tif(bytes < 1) { return @\"-\"; }\n\n\twhile(bytes > 1024) {\n\t\tbytes = bytes / 1024.0;\n\t\tunit++;\n\t}\n\t\n\tif(unit > 4) { return @\"HUGE\"; }\n\t\n\tNSString *unitString = [[NSArray arrayWithObjects:/* @\"Bytes\", */ @\"KB\", @\"MB\", @\"GB\", @\"TB\", @\"PB\", nil] objectAtIndex:unit];\n\t\n\tif(unit == 0) {\n\t\treturn [NSString stringWithFormat:@\"%d %@\", (int)bytes, unitString];\n\t} else {\n\t\treturn [NSString stringWithFormat:@\"%.2f %@\", (float)bytes, unitString];\n\t}\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPAllSourcesTVC.h",
    "content": "//\n//  SourcesTVController.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n\n@class SPSourceEmailTVC;\n@class SPSourceWifiTVC;\n@class SPSourcePhoneTVC;\n@class SPSourceLocationTVC;\n@class SPSourcePhotosTVC;\n@class SPSourceAddressBookTVC;\n@class SPSourceKeyboardTVC;\n\n@interface SPAllSourcesTVC : UITableViewController <UITableViewDataSource, UITableViewDelegate> {\n\tNSArray *sources;\n\t\n\tIBOutlet SPSourceEmailTVC *sourceEmailTVC;\n\tIBOutlet SPSourceWifiTVC *sourceWifiTVC;\n\tIBOutlet SPSourcePhoneTVC *sourcePhoneTVC;\n\tIBOutlet SPSourceLocationTVC *sourceLocationTVC;\n\tIBOutlet SPSourcePhotosTVC *sourcePhotosTVC;\n\tIBOutlet SPSourceAddressBookTVC *sourceAddressBookTVC;\n\tIBOutlet SPSourceKeyboardTVC *sourceKeyboardTVC;\n}\n\n@property (nonatomic, retain) NSArray *sources;\n\n- (NSString *)emailForReport;\n- (NSString *)report;\n\n@end\n"
  },
  {
    "path": "Classes/SPAllSourcesTVC.m",
    "content": "//\n//  SourcesTVController.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPAllSourcesTVC.h\"\n#import \"SPSourceTVC.h\"\n#import \"SPCell.h\"\n\n@implementation SPAllSourcesTVC\n\n@synthesize sources;\n\n- (void)loadSources {\n\tif(sources) return;\n\t\n\tif(!self.isViewLoaded) [self loadView];\n\t\n \tself.sources = [NSArray arrayWithObjects:\n\t\t\t\t\tsourceEmailTVC,\n\t\t\t\t\tsourceWifiTVC,\n\t\t\t\t\tsourcePhoneTVC,\n\t\t\t\t\tsourceLocationTVC,\n\t\t\t\t\tsourcePhotosTVC,\n\t\t\t\t\tsourceAddressBookTVC,\n\t\t\t\t\tsourceKeyboardTVC,\n\t\t\t\t\tnil];\n}\n\n- (NSString *)emailForReport {\n\tif(!self.isViewLoaded) [self loadView];\n\n\treturn [sourceEmailTVC emailForReport];\n}\n\n// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.\n- (void)viewDidLoad {\n    [super viewDidLoad];\n \n\tif(!sources) [self loadSources];\n}\n\n- (NSString *)report {\n\t[self loadSources];\n\t\n\tNSMutableString *s = [NSMutableString string];\n\t\n\tfor(SPSourceTVC *source in sources) {\n\t\t[s appendString:[NSString stringWithFormat:@\"----- %@ -----\\n\\n\", [source.title uppercaseString]]];\n\t\t\n\t\t[source loadData];\n\t\tNSArray *a = source.contentsDictionaries;\n\t\tfor(NSDictionary *d in a) {\n\t\t\t[s appendString:[NSString stringWithFormat:@\"[[ %@ ]]\\n\", [[d allKeys] lastObject]]];\n\t\t\t[s appendString:[[[d allValues] lastObject] componentsJoinedByString:@\"\\n\"]];\n\t\t\t[s appendString:@\"\\n\\n\"];\n\t\t}\n\t\t//[s appendString:@\"\\n\"];\n\t}\n\t\n\treturn s;\n}\n\n- (void)dealloc {\n\t[sources release];\n    [super dealloc];\n}\n\n#pragma mark UITableViewDataSource\n\n- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {\n\treturn [sources count];\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n\n\tstatic NSString *SourceCellIdentifier = @\"SPCell\";\n\t\n\tSPCell *cell = (SPCell *)[tableView dequeueReusableCellWithIdentifier:SourceCellIdentifier];\n\tif (cell == nil) {\n\t\tcell = (SPCell *)[[[NSBundle mainBundle] loadNibNamed:@\"SPCell\" owner:self options:nil] lastObject];\n\t}\n\t\n\tSPSourceTVC *sourceTVC = [sources objectAtIndex:indexPath.row];\t\n\t\n\tcell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;\n\tcell.textLabel.text = [sourceTVC title];\n\tcell.imageView.image = [sourceTVC image];\n\treturn cell;\n}\n\n#pragma mark UITableViewDelegate\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n\tUIViewController *sourceVC = [sources objectAtIndex:indexPath.row];\n\t[self.navigationController pushViewController:sourceVC animated:YES];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPCell.h",
    "content": "//\n//  SPCell.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n\n\n@interface SPCell : UITableViewCell {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPCell.m",
    "content": "//\n//  SPCell.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPCell.h\"\n\n\n@implementation SPCell\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailASAccount.h",
    "content": "//\n//  SPEmailASAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n@interface SPEmailASAccount : SPEmailAccount {\n\t\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailASAccount.m",
    "content": "//\n//  SPEmailASAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailASAccount.h\"\n\n\n@implementation SPEmailASAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailASAccount *account = [[SPEmailASAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\t//account.fullname = nil;\n\taccount.emails = [NSArray arrayWithObject:[d valueForKey:@\"ASAccountEmailAddress\"]];\n\taccount.hostname = [d valueForKey:@\"ASAccountHost\"];\n\taccount.username = [d valueForKey:@\"ASAccountUsername\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailAccount.h",
    "content": "//\n//  SPEmailAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <Foundation/Foundation.h>\n\n// TODO: subclass for AOL accounts\n\n@interface SPEmailAccount : NSObject {\n\tNSString *fullname;\n\tNSArray *emails;\n\tNSString *type;\n\tNSString *hostname;\n\tNSString *username;\n\tNSString *displayName;\n\tNSMutableArray *calendars;\n}\n\n@property (nonatomic, retain) NSString *fullname;\n@property (nonatomic, retain) NSArray *emails;\n@property (nonatomic, retain) NSString *type;\n@property (nonatomic, retain) NSString *hostname;\n@property (nonatomic, retain) NSString *username;\n@property (nonatomic, retain) NSString *displayName;\n@property (nonatomic, retain) NSArray *calendars;\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d;\n- (NSArray *)infoArray;\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailAccount.m",
    "content": "//\n//  SPEmailAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n\n@implementation SPEmailAccount\n\n@synthesize fullname;\n@synthesize emails;\n@synthesize type;\n@synthesize hostname;\n@synthesize username;\n@synthesize displayName;\n@synthesize calendars;\n\n- (void)dealloc {\n\t[fullname release];\n\t[emails release];\n\t[type release];\n\t[hostname release];\n\t[username release];\n\t[displayName release];\n\t[super dealloc];\n}\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\treturn nil; // for subclasses\n}\n\n- (NSArray *)infoArray {\n\tNSMutableArray *a = [NSMutableArray array];\n\t\n\tif(fullname) [a addObject:[NSString stringWithFormat:@\"Name: %@\", fullname]];\n\tif(type) [a addObject:[NSString stringWithFormat:@\"Type: %@\", type]];\n\tif(hostname) [a addObject:[NSString stringWithFormat:@\"Host: %@\", hostname]];\n\tif(username) [a addObject:[NSString stringWithFormat:@\"User: %@\", username]];\n\tif(emails) {\n\t\tfor (id emailAddress in emails)\n\t\t\t[a addObject:[NSString stringWithFormat:@\"Email: %@\", emailAddress]];\n\t}\n\tif (calendars) {\n\t\tfor (id calendar in calendars)\n\t\t\t[a addObject:[NSString stringWithFormat:@\"Calendar URL: %@\", calendar]];\n\t}\n\n\treturn a;\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailGmailAccount.h",
    "content": "//\n//  SPEmailGmailAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n\n@interface SPEmailGmailAccount : SPEmailAccount {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailGmailAccount.m",
    "content": "//\n//  SPEmailGmailAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailGmailAccount.h\"\n\n\n@implementation SPEmailGmailAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailGmailAccount *account = [[SPEmailGmailAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\taccount.fullname = [d valueForKey:@\"FullUserName\"];\n\taccount.hostname = [d valueForKey:@\"Hostname\"];\n\taccount.username = [d valueForKey:@\"Username\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\n\tNSString *theEmail = [d valueForKey:@\"Username\"];\n\tif(![[theEmail lowercaseString] hasSuffix:@\"@gmail.com\"]) {\n\t\ttheEmail = [theEmail stringByAppendingString:@\"@gmail.com\"];\n\t}\n\taccount.emails = [NSArray arrayWithObject:theEmail];\n\t\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailIMAPAccount.h",
    "content": "//\n//  SPEmailIMAPAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n\n@interface SPEmailIMAPAccount : SPEmailAccount {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailIMAPAccount.m",
    "content": "//\n//  SPEmailIMAPAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailIMAPAccount.h\"\n\n\n@implementation SPEmailIMAPAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailIMAPAccount *account = [[SPEmailIMAPAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\taccount.fullname = [d valueForKey:@\"FullUserName\"];\n\taccount.emails = [d valueForKey:@\"EmailAddresses\"];\n\taccount.hostname = [d valueForKey:@\"Hostname\"];\n\taccount.username = [d valueForKey:@\"Username\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\t\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailIToolsAccount.h",
    "content": "//\n//  SPEmailIToolsAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n@interface SPEmailIToolsAccount : SPEmailAccount {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailIToolsAccount.m",
    "content": "//\n//  SPEmailIToolsAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailIToolsAccount.h\"\n\n\n@implementation SPEmailIToolsAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailIToolsAccount *account = [[SPEmailIToolsAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\taccount.fullname = [d valueForKey:@\"FullUserName\"];\n\tNSArray *theEmailAddresses = [d valueForKey:@\"EmailAddresses\"];\n\tNSMutableArray *theEmails = [NSMutableArray array];\n\tfor (id emailAddress in theEmailAddresses) {\n\t\t[theEmails addObject:[NSString stringWithFormat:@\"%@@me.com\", emailAddress]];\n\t}\n\taccount.emails = theEmails;\n\t//account.hostname = nil;\n\taccount.username = [d valueForKey:@\"Username\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailMobileMeAccount.h",
    "content": "//\n//  SPEmailMobileMeAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n\n@interface SPEmailMobileMeAccount : SPEmailAccount {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailMobileMeAccount.m",
    "content": "//\n//  SPEmailMobileMeAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailMobileMeAccount.h\"\n\n\n@implementation SPEmailMobileMeAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailMobileMeAccount *account = [[SPEmailMobileMeAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\taccount.fullname = [d valueForKey:@\"FullUserName\"];\n\taccount.emails = [d valueForKey:@\"EmailAddresses\"];\n\taccount.username = [d valueForKey:@\"Username\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\t\n\tNSMutableArray *theCalendars = [NSMutableArray array];\n\tNSDictionary *calendars = [d valueForKey:@\"Subscribed Calendars\"];\n\tif (calendars) {\n\t\tfor(id calendarItem in [calendars allValues]) {\n\t\t\t[theCalendars addObject:[calendarItem valueForKey:@\"com.apple.ical.urlsubscribe.url\"]];\n\t\t}\n\t\t\t\t\t\t\n\t\taccount.calendars = theCalendars;\n\t}\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailPOPAccount.h",
    "content": "//\n//  SPEMailPOPAccount.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailAccount.h\"\n\n@interface SPEmailPOPAccount : SPEmailAccount {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailPOPAccount.m",
    "content": "//\n//  SPEMailPOPAccount.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/20/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailPOPAccount.h\"\n\n\n@implementation SPEmailPOPAccount\n\n+ (SPEmailAccount *)accountWithDictionary:(NSDictionary *)d {\n\tSPEmailPOPAccount *account = [[SPEmailPOPAccount alloc] init];\n\t\n\taccount.type = [d valueForKey:@\"Short Type String\"];\n\taccount.fullname = [d valueForKey:@\"FullUserName\"];\n\taccount.emails = [d valueForKey:@\"EmailAddresses\"];\n\taccount.hostname = [d valueForKey:@\"Hostname\"];\n\taccount.username = [d valueForKey:@\"Username\"];\n\taccount.displayName = [d valueForKey:@\"DisplayName\"];\n\n\treturn [account autorelease];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailReportVC.h",
    "content": "//\n//  SPEmailReportVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/22/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import <MessageUI/MFMailComposeViewController.h>\n#import \"SPAllSourcesTVC.h\"\n\n@interface SPEmailReportVC : UIViewController <MFMailComposeViewControllerDelegate> {\n\tIBOutlet UILabel *message;\n\tIBOutlet SPAllSourcesTVC *allSources;\n}\n\n@property (nonatomic, retain) IBOutlet UILabel *message;\n@property (nonatomic, retain) IBOutlet SPAllSourcesTVC *allSources;\n\n- (IBAction)sendReport:(id)sender;\n\n@end\n"
  },
  {
    "path": "Classes/SPEmailReportVC.m",
    "content": "//\n//  SPEmailReportVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/22/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPEmailReportVC.h\"\n\n@implementation SPEmailReportVC\n\n@synthesize message;\n@synthesize allSources;\n\n\n- (IBAction)sendReport:(id)sender {\n\tif([MFMailComposeViewController canSendMail] == NO) {\n\t\tmessage.text = @\"Error: this device can't send emails.\";\n\t\treturn;\n\t}\n\t\n\tMFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];\n    picker.mailComposeDelegate = self;\n    \n    [picker setSubject:@\"SpyPhone Report\"];\n\n    // Set up recipients\n\tNSString *email = [allSources emailForReport];\n\tif(email) [picker setToRecipients:[NSArray arrayWithObject:email]];\n    \n    // Fill out the email body text\n    NSString *emailBody = [allSources report];\n    [picker setMessageBody:emailBody isHTML:NO];\n    \n    [self presentModalViewController:picker animated:YES];\n    [picker release];\n}\n\n// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.\n- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {    \n    // message.hidden = NO;\n    // Notifies users about errors associated with the interface\n    switch (result) {\n        case MFMailComposeResultCancelled:\n            message.text = @\"Result: canceled\";\n            break;\n        case MFMailComposeResultSaved:\n            message.text = @\"Result: saved\";\n            break;\n        case MFMailComposeResultSent:\n            message.text = @\"Result: sent\";\n            break;\n        case MFMailComposeResultFailed:\n            message.text = @\"Result: failed\";\n            break;\n        default:\n            message.text = @\"Result: not sent\";\n            break;\n    }\n\t\n    [self dismissModalViewControllerAnimated:YES];\n}\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)viewDidUnload {\n\t// Release any retained subviews of the main view.\n\t// e.g. self.myOutlet = nil;\n}\n\n- (void)dealloc {\n    [allSources release];\n    [message release];\n    [super dealloc];\n}\n\n\n@end\n"
  },
  {
    "path": "Classes/SPImageAnnotation.h",
    "content": "//\n//  SPImageAnnotation.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <MapKit/MapKit.h>\n\n@protocol MKAnnotation;\n\n@interface SPImageAnnotation : NSObject <MKAnnotation> {\n\tNSString *title;\n\tNSString *path;\n\tCLLocationCoordinate2D coordinate;\n}\n\n@property (nonatomic, retain) NSString *title;\n@property (nonatomic, retain) NSString *path;\n@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;\n\n+ (SPImageAnnotation *) annotationWithCoordinate:(CLLocationCoordinate2D)coord date:(NSDate *)date path:(NSString *)path;\n\n- (NSString *)annotationViewIdentifier;\n- (BOOL)hasValidCoordinates;\n\n@end\n"
  },
  {
    "path": "Classes/SPImageAnnotation.m",
    "content": "//\n//  SPImageAnnotation.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPImageAnnotation.h\"\n\n\n@implementation SPImageAnnotation\n\n@synthesize title;\n@synthesize path;\n@synthesize coordinate;\n\n- (BOOL)hasValidCoordinates {\n    return coordinate.longitude != 0.0 && coordinate.latitude != 0.0;\n}\n\n+ (SPImageAnnotation *)annotationWithCoordinate:(CLLocationCoordinate2D)coord date:(NSDate *)date path:(NSString *)path {\n    \n\tSPImageAnnotation *annotation = [[SPImageAnnotation alloc] init];\n\tannotation.coordinate = coord;\n\tannotation.path = path;\n\n\tNSDateFormatter *df = [[NSDateFormatter alloc] init];\n\t[df setDateFormat:@\"yyyy-MM-dd HH:mm\"];\t\n\tannotation.title = [df stringFromDate:date];\n\t[df release];\n\t\n\treturn [annotation autorelease];\n}\n\n- (void)dealloc {\n\t[path release];\n\t[title release];\n\t[super dealloc];\n}\n\n- (NSString *)annotationViewIdentifier {\n\treturn title;\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPImageMapVC.h",
    "content": "//\n//  SPMapVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import <MapKit/MapKit.h>\n\n@class SPImageVC;\n\n@interface SPImageMapVC : UIViewController <MKMapViewDelegate> {\n\tNSArray *annotations;\n\t\n\tIBOutlet MKMapView *mapView;\n\tIBOutlet SPImageVC *imageVC;\n}\n\n@property (nonatomic, retain) NSArray *annotations;\n\n- (void)addAnnotation:(id <MKAnnotation>)annotation;\n\n- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;\n\n@end\n"
  },
  {
    "path": "Classes/SPImageMapVC.m",
    "content": "//\n//  SPMapVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPImageMapVC.h\"\n#import \"SPImageVC.h\"\n\n@implementation SPImageMapVC\n\n@synthesize annotations;\n\n- (void)addAnnotation:(id <MKAnnotation>)annotation {\n\t[mapView addAnnotation:annotation];\n}\n\n- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation {\n\t\n\tif([annotation isKindOfClass:[MKUserLocation class]]) return nil;\n\t\n    NSString *annID = @\"SPImageAnnotation\";\n    MKAnnotationView *av = [aMapView dequeueReusableAnnotationViewWithIdentifier:annID];\n\t\n\tif(av == nil) {\n\t\tav = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annID] autorelease];\n\t\t[av setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];\n\t\tav.canShowCallout = YES;\n\t}\n\treturn av;\n}\n\n- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {\n\n\tNSString *path = [(id)view.annotation path];\n\t\n\tNSError *error = nil;\n\tNSDictionary *d = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error];\n\tif(!d) {\n\t\tNSLog(@\"Error: can't read file attributes at path %@, %@ %@\", path, [error description], [error userInfo]);\n\t}\n\t\n\tNSDate *date = [d fileModificationDate];\t\n\tNSDateFormatter *df = [[NSDateFormatter alloc] init];\n\t[df setDateFormat:@\"yyyy-MM-dd HH:mm\"];\t\n\timageVC.title = error ? @\"Photo\" : [df stringFromDate:date];\n\t[df release];\n\t\n\timageVC.path = path;\n\t[self.navigationController pushViewController:imageVC animated:YES];\t\n}\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n\n\t//mapView.showsUserLocation = YES;\n\n\tif([annotations count] == 0) return;\n\t\n\tMKCoordinateRegion region;\n\tMKCoordinateSpan span = MKCoordinateSpanMake(0.03, 0.03);\n\t\n\tfor(id <MKAnnotation>annotation in annotations) {\n\t\tregion = [mapView regionThatFits:MKCoordinateRegionMake(annotation.coordinate, span)];\n\t}\n\t\n\t[mapView setRegion:region];\n\t[mapView addAnnotations:annotations];\n}\n\n/*\n// Override to allow orientations other than the default portrait orientation.\n- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {\n    // Return YES for supported orientations\n    return (interfaceOrientation == UIInterfaceOrientationPortrait);\n}\n*/\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)viewDidUnload {\n\t// Release any retained subviews of the main view.\n\t// e.g. self.myOutlet = nil;\n\tself.annotations = nil;\n}\n\n- (void)dealloc {\n\t[annotations release];\n    [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPImageVC.h",
    "content": "//\n//  SPImageVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n@interface SPImageVC : UIViewController {\n\tNSString *path;\n\tIBOutlet UIImageView *imageView;\n}\n\n@property (nonatomic, retain) UIImageView *imageView;\n@property (nonatomic, retain) NSString *path;\n\n@end\n"
  },
  {
    "path": "Classes/SPImageVC.m",
    "content": "//\n//  SPImageVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. All rights reserved.\n//\n\n#import \"SPImageVC.h\"\n\n\n@implementation SPImageVC\n\n@synthesize imageView;\n@synthesize path;\n\n- (void)viewDidAppear:(BOOL)animated {\n\timageView.image = [UIImage imageWithContentsOfFile:path];\n}\n\n- (void)viewDidDisappear:(BOOL)animated {\n\timageView.image = nil;\n}\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)viewDidUnload {\n\t// Release any retained subviews of the main view.\n\t// e.g. self.myOutlet = nil;\n}\n\n\n- (void)dealloc {\n\t[path release];\n\t[imageView release];\n    [super dealloc];\n}\n\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceAddressBookTVC.h",
    "content": "//\n//  SPSourceAddressBookTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/16/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPSourceTVC.h\"\n\n@interface SPSourceAddressBookTVC : SPSourceTVC {\n\t\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceAddressBookTVC.m",
    "content": "//\n//  SPSourceAddressBookTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/16/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceAddressBookTVC.h\"\n#import <AddressBook/AddressBook.h>\n\n\n@implementation SPSourceAddressBookTVC\n\n- (void)loadData {\n\tif(contentsDictionaries) return;\n\n\tABAddressBookRef addressBook = ABAddressBookCreate();\n\t\n\tNSArray *people = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);\n\t\n\tNSMutableArray *allEmails = [NSMutableArray array];\n\t\n\tfor(id record in people) {\n\t\tABMultiValueRef emailsContainer = ABRecordCopyValue(record, kABPersonEmailProperty);\n\t\tCFArrayRef emails = ABMultiValueCopyArrayOfAllValues(emailsContainer);\n\t\tCFRelease(emailsContainer);\n\t\tif(emails) {\n\t\t\t[allEmails addObjectsFromArray:(NSArray *)emails];\n\t\t\tCFRelease(emails);\n\t\t}\n\t}\n\t\n\t[people release];\n\t\n\tCFRelease(addressBook);\n\t\t\n\tNSString *keyName = [NSString stringWithFormat:@\"%d Email Addresses\", [allEmails count]];\n\tself.contentsDictionaries = [NSArray arrayWithObject:[NSDictionary dictionaryWithObject:allEmails forKey:keyName]];\n}\n\n/*\n// Override to allow orientations other than the default portrait orientation.\n- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {\n    // Return YES for supported orientations\n    return (interfaceOrientation == UIInterfaceOrientationPortrait);\n}\n*/\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)viewDidUnload {\n\t// Release any retained subviews of the main view.\n\t// e.g. self.myOutlet = nil;\n}\n\n\n- (void)dealloc {\n    [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceEmailTVC.h",
    "content": "//\n//  SPSourceEmailTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPSourceTVC.h\"\n\n@interface SPSourceEmailTVC : SPSourceTVC {\n\tNSMutableArray *emails;\n}\n\n@property (nonatomic, retain) NSMutableArray *emails;\n\n- (NSString *)emailForReport;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceEmailTVC.m",
    "content": "//\n//  SPSourceEmailTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceEmailTVC.h\"\n#import \"SPCell.h\"\n#import \"SPEmailASAccount.h\"\n#import \"SPEmailPOPAccount.h\"\n#import \"SPEmailIToolsAccount.h\"\n#import \"SPEmailGmailAccount.h\"\n#import \"SPEmailIMAPAccount.h\"\n#import \"SPEmailMobileMeAccount.h\"\n\n@implementation SPSourceEmailTVC\n\n@synthesize emails;\n\n- (void)dealloc {\n\t[emails release];\n\t[super dealloc];\n}\n\n- (NSString *)emailForReport {\n\t[self loadData];\n\t\n\tif([emails count] < 1) return nil;\n\treturn [emails objectAtIndex:0];\n}\n\n- (void)loadData {\n\tif(contentsDictionaries) return;\n\t\n\tself.emails = [NSMutableArray array];\n\tself.contentsDictionaries = [NSMutableArray array];\n\t\n\tNSMutableArray *accountsFound = [NSMutableArray array];\n\t\n\tNSString *path = @\"/var/mobile/Library/Preferences/com.apple.accountsettings.plist\";\n\tNSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:path];\n\tNSArray *accounts = [d valueForKey:@\"Accounts\"];\n\tfor(NSDictionary *account in accounts) {\n\t\tNSString *classValue = [account valueForKey:@\"Class\"];\n\t\tif([classValue isEqualToString:@\"ASAccount\"])       [accountsFound addObject:[SPEmailASAccount accountWithDictionary:account]];\n\t\tif([classValue isEqualToString:@\"POPAccount\"])      [accountsFound addObject:[SPEmailPOPAccount accountWithDictionary:account]];\n\t\tif([classValue isEqualToString:@\"iToolsAccount\"])   [accountsFound addObject:[SPEmailIToolsAccount accountWithDictionary:account]];\n\t\tif([classValue isEqualToString:@\"GmailAccount\"])    [accountsFound addObject:[SPEmailGmailAccount accountWithDictionary:account]];\n\t\tif([classValue isEqualToString:@\"IMAPAccount\"])\t    [accountsFound addObject:[SPEmailIMAPAccount accountWithDictionary:account]];\n\t\tif([classValue isEqualToString:@\"MobileMeAccount\"])\t[accountsFound addObject:[SPEmailMobileMeAccount accountWithDictionary:account]];\n\t}\n\t\n\tfor(SPEmailAccount *account in accountsFound) {\n\t\tif(!account.emails) continue;\n\t\t[emails addObjectsFromArray:account.emails];\n\t\t[contentsDictionaries addObject:[NSDictionary dictionaryWithObject:[account infoArray] forKey:account.displayName]];\t\t\t\n\t}\t\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceKeyboardTVC.h",
    "content": "//\n//  SPSourceKeyboardTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/16/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPSourceTVC.h\"\n\n@interface SPSourceKeyboardTVC : SPSourceTVC {\n\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceKeyboardTVC.m",
    "content": "//\n//  SPSourceKeyboardTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/16/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceKeyboardTVC.h\"\n\n\n@implementation SPSourceKeyboardTVC\n\n- (BOOL)caseInsensitiveString:(NSString *)s startsWithUnichar:(unichar)c {\n\tif(![s length]) return NO;\n\t\n\tunichar c1 = [[s lowercaseString] characterAtIndex:0];\n\tunichar c2 = [[[NSString stringWithFormat:@\"%c\", c] lowercaseString] characterAtIndex:0];\n\treturn c1 == c2;\n}\n\n- (NSString *)sanitizeString:(NSString *)s {\n\tNSString *s2 = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n\ts2 = [s2 stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]];\n\treturn [s2 stringByTrimmingCharactersInSet:[NSCharacterSet illegalCharacterSet]];\n}\n\n- (NSArray *)wordsInDictionaryCacheFileAtPath:(NSString *)path {\n\t\n\tNSData *data = [NSData dataWithContentsOfFile:path];\n\tif(!data) return nil;\n\t\n\tstatic const int BUFSIZE = 256;\n\t\n\tint length = [data length];\n\tint len = 0;\n\tint pos = 0;\n\tNSRange range;\n\tchar buf[BUFSIZE];\n\tNSString *w = nil;\n\n\tNSMutableArray *words = [NSMutableArray array];\n\t\n\twhile(pos < length) {\n\t\trange = NSMakeRange(pos, MIN(BUFSIZE, length-pos));\n\t\t[data getBytes:buf range:range];\n\t\tlen = strlen(buf);\n\t\tw = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding];\n\t\tif([w length]) {\n\t\t\t[words addObject:[self sanitizeString:w]];\n\t\t}\n\t\t[w release];\n\t\tpos += (len + 1);\n\t}\n\t\n\treturn words;\n}\n\n- (void)loadData {\n\tif(contentsDictionaries) return;\n\n\tNSMutableSet *set = [NSMutableSet set];\n\t\n\tNSString *dir = @\"/var/mobile/Library/Keyboard/\";\n\tNSError *error = nil;\n\tNSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:&error];\n\t\n\tif(dirContents == nil) {\n\t\tNSLog(@\"-- error: %@\", error);\n\t\treturn;\n\t}\n\t\n\tfor(NSString *filePath in dirContents) {\n\t\tif(![filePath hasSuffix:@\".dat\"]) continue;\n\t\tNSArray *a = [self wordsInDictionaryCacheFileAtPath:[dir stringByAppendingPathComponent:filePath]];\n\t\tif(!a) continue;\n\t\t[set addObjectsFromArray:a];\n\t}\n\t\n\tNSArray *words = [[set allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];\n\t\n\tNSMutableArray *letters = [NSMutableArray array];\n\tNSMutableArray *letterWords = [[NSMutableArray alloc] init];\n\t\n\tNSString *current = nil;\n\t\n\tfor(NSString *w in words) {\n\t\tif([w length] == 0) continue;\n\t\t\n\t\tNSString *s = [[w substringToIndex:1] lowercaseString];\n\t\t\n\t\tif([s isEqualToString:current]) {\n\t\t\t// w starts with current letter\n\t\t\t[letterWords addObject:w];\n\t\t} else {\n\t\t\t// w start with new letter\n\n\t\t\t// add previous letterWords to letters\n\t\t\tif(current) {\n\t\t\t\t[letters addObject:[NSDictionary dictionaryWithObjectsAndKeys:letterWords, current, nil]];\n\t\t\t}\n\t\t\t\n\t\t\t// update current\n\t\t\tcurrent = s;\n\n\t\t\t// create new letterWords\n\t\t\t[letterWords release];\n\t\t\tletterWords = [[NSMutableArray alloc] init];\n\t\t\t[letterWords addObject:w];\n\t\t}\n\t}\n\t\n\tif(!current) current = @\"\";\n\t\n\t[letters addObject:[NSDictionary dictionaryWithObjectsAndKeys:letterWords, current, nil]];\n\t\n\t[letterWords release];\n\t\n\tself.contentsDictionaries = letters;\n}\n\n#pragma mark UITableViewDataSource\n\n- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {\n\tNSMutableArray *a = [NSMutableArray array];\n\tfor(NSDictionary *d in contentsDictionaries) {\n\t\t[a addObject:[[d allKeys] lastObject]];\n\t}\n\treturn a;\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceLocationTVC.h",
    "content": "//\n//  SPSourceLocationTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import <MapKit/MapKit.h>\n#import \"SPSourceTVC.h\"\n\n@class CLLocation;\n\n@interface SPSourceLocationTVC : SPSourceTVC /* <MKReverseGeocoderDelegate> */ {\n\tNSArray *items;\n//\tMKReverseGeocoder *geo;\n\tNSString *geoString;\n\t\n\tNSString *locString;\n\tNSString *locDateString;\n\tNSString *timezone;\n\tNSArray *cities;\n\t\n\tCLLocation *cachedLocationFromMaps;\n}\n\n//@property (nonatomic, retain) MKReverseGeocoder *geo;\n@property (nonatomic, retain) NSString *geoString;\n@property (nonatomic, retain) CLLocation *cachedLocationFromMaps;\n@property (nonatomic, retain) NSArray *cities;\n@property (nonatomic, retain) NSString *locString;\n@property (nonatomic, retain) NSString *locDateString;\n@property (nonatomic, retain) NSString *timezone;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceLocationTVC.m",
    "content": "//\n//  SPSourceLocationTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceLocationTVC.h\"\n#import <CoreLocation/CoreLocation.h>\n#import \"SPImageMapVC.h\"\n#import \"SPImageAnnotation.h\"\n\n@implementation SPSourceLocationTVC\n\n@synthesize cities;\n//@synthesize geo;\n@synthesize geoString;\n@synthesize locString;\n@synthesize locDateString;\n@synthesize timezone;\n@synthesize cachedLocationFromMaps;\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n\tif(indexPath.section == 0 && indexPath.row == 0 && cachedLocationFromMaps) {\n\t\tSPImageMapVC *mapVC = [[SPImageMapVC alloc] initWithNibName:@\"SPImageMapVC\" bundle:[NSBundle mainBundle]];\n\t\t[self.navigationController pushViewController:mapVC animated:YES];\n\t\tSPImageAnnotation *annotation = [SPImageAnnotation annotationWithCoordinate:cachedLocationFromMaps.coordinate date:nil path:nil];\n        if(annotation)\n            [mapVC addAnnotation:annotation];\n\t}\n}\n\n- (void)loadData {\n\tif(contentsDictionaries) return;\n\n\tNSString *path = @\"/var/mobile/Library/Preferences/com.apple.Maps.plist\";\n\tNSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:path];\n\tNSData *data = [d valueForKey:@\"UserLocation\"];\n\tCLLocation *loc = data ? [NSKeyedUnarchiver unarchiveObjectWithData:data] : nil;\n\tself.cachedLocationFromMaps = loc;\n\tself.locString = @\"\";\n\tself.locDateString = @\"\";\n\tif(loc) {\n\t\tself.locString = [NSString stringWithFormat:@\"%f, %f\", loc.coordinate.latitude, loc.coordinate.longitude];\n\t\tself.locDateString = [NSString stringWithFormat:@\"%@\", loc.timestamp];\n\t}\n\t\n\tpath = @\"/var/mobile/Library/Preferences/com.apple.preferences.datetime.plist\";\n\td = [NSDictionary dictionaryWithContentsOfFile:path];\t\n\tself.timezone = [NSString stringWithFormat:@\"%@\", [d valueForKey:@\"timezone\"]];\n\n\tpath = @\"/var/mobile/Library/Preferences/com.apple.weather.plist\";\n\td = [NSDictionary dictionaryWithContentsOfFile:path];\n\tNSMutableArray *citiesNames = [NSMutableArray array];\n\tfor(NSDictionary *dict in [d valueForKey:@\"Cities\"]) {\n\t\t[citiesNames addObject:[dict objectForKey:@\"Name\"]];\n\t}\n\tself.cities = citiesNames;\n\n\tself.contentsDictionaries = [NSArray arrayWithObjects:\n\t\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:locString], @\"Location\", nil],\n\t\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:locDateString], @\"Location Date\", nil],\n\t\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:timezone], @\"Timezone\", nil],\n\t\t\t[NSDictionary dictionaryWithObjectsAndKeys:cities, @\"Weather Cities\", nil],\n\t\t\tnil];\n\t/*\n\tself.geo = [[[MKReverseGeocoder alloc] initWithCoordinate:loc.coordinate] autorelease];\n\tgeo.delegate = self;\n\t[geo start];\n\t */\n}\n\n- (void)dealloc {\n\t[items release];\n//\t[geo release];\n\t[geoString release];\n\t[cachedLocationFromMaps release];\n    [super dealloc];\n}\n/*\n#pragma mark MKReverseGeocoderDelegate\n\n- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {\n\tself.geoString = [NSString stringWithFormat:@\"%@ %@\", placemark.locality, placemark.country];\n\t\n\tself.contentsDictionaries = [NSArray arrayWithObjects:\n\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:[NSString stringWithFormat:@\"%@ %@\", locString, geoString]], @\"Location\", nil],\n\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:locDateString], @\"Location Date\", nil],\n\t\t[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:timezone], @\"Timezone\", nil],\n\t\t[NSDictionary dictionaryWithObjectsAndKeys:cities, @\"Weather Cities\", nil],\n\t\tnil];\n\n\t[self.tableView reloadData];\n}\n\n- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {\n\tNSLog(@\"-- Error: %@\", [error description]);\n}\n*/\n@end\n"
  },
  {
    "path": "Classes/SPSourcePhoneTVC.h",
    "content": "//\n//  SPSourcePhoneTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPSourceTVC.h\"\n\n@interface SPSourcePhoneTVC : SPSourceTVC  {\n\tNSString *ICCID;\n//\tNSString *IMEI;\n\tNSString *IMSI;\n\tNSString *phone;\n\tNSString *UUID;\t\n\tNSString *lastDialed;\t\n\tNSString *lastContact;\n\tNSString *lastForwardNumber;\n\tNSMutableArray *callHistories;\n\tNSString *prettyBytesSent;\n\tNSString *prettyBytesReceived;\n}\n\n@property (nonatomic, retain) NSString *ICCID;\n//@property (nonatomic, retain) NSString *IMEI;\n@property (nonatomic, retain) NSString *IMSI;\n@property (nonatomic, retain) NSString *phone;\n@property (nonatomic, retain) NSString *UUID;\n@property (nonatomic, retain) NSString *lastDialed;\n@property (nonatomic, retain) NSString *lastContact;\n@property (nonatomic, retain) NSString *lastForwardNumber;\n@property (nonatomic, retain) NSString *prettyBytesSent;\n@property (nonatomic, retain) NSString *prettyBytesReceived;\n@property (nonatomic, retain) NSMutableArray *callHistories;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourcePhoneTVC.m",
    "content": "//\n//  SPSourcePhoneTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourcePhoneTVC.h\"\n#import \"SPCell.h\"\n#import <AddressBook/AddressBook.h>\n#import \"FMDatabase.h\"\n#import \"NSNumber+SP.h\"\n#import <CoreTelephony/CTTelephonyNetworkInfo.h>\n#import <CoreTelephony/CTCarrier.h>\n\n@implementation SPSourcePhoneTVC\n\n@synthesize ICCID;\n//@synthesize IMEI;\n@synthesize IMSI;\n@synthesize phone;\n@synthesize UUID;\n@synthesize lastDialed;\n@synthesize lastContact;\n@synthesize lastForwardNumber;\n@synthesize callHistories;\n@synthesize prettyBytesSent;\n@synthesize prettyBytesReceived;\n\n- (NSString *)nameOfABPersonWithID:(NSUInteger)recordID {\n\tABAddressBookRef addressBook = ABAddressBookCreate();\n\tABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, recordID);\n\n\tif(!person) {\n\t\tCFRelease(addressBook);\n\t\treturn nil;\n\t}\n\n\tNSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);\n\tNSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);\n\t\n\tNSString *fullName = nil;\n\t\n\tif(firstName && lastName) {\n\t\tfullName = [NSString stringWithFormat:@\"%@ %@\", firstName, lastName];\n\t} else if (firstName) {\n\t\tfullName = [NSString stringWithString:firstName];\n\t} else if (lastName) {\n\t\tfullName = [NSString stringWithString:lastName];\n\t}\n\t\n\t[firstName release];\n\t[lastName release];\n\tCFRelease(addressBook);\n\t\n\treturn fullName;\n}\n\n- (void)loadData {\n\n\tif(contentsDictionaries) return;\n\n\tNSString *path = @\"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist\";\n\tNSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:path];\n\tself.ICCID = [d valueForKey:@\"ICCID\"];\n\tself.IMSI = [d valueForKey:@\"IMSI\"];\n\t\n\tself.phone = [[NSUserDefaults standardUserDefaults] valueForKey:@\"SBFormattedPhoneNumber\"];\n\tself.UUID = [[UIDevice currentDevice] uniqueIdentifier];\n\t/*\n\tNSBundle *b = [NSBundle bundleWithPath:@\"/System/Library/PrivateFrameworks/Message.framework\"];\n\tBOOL success = [b load];\n    if(success) {\n\t\tClass NetworkController = NSClassFromString(@\"NetworkController\");\n\t\tid nc = [NetworkController sharedInstance];\n\t\tif([nc respondsToSelector:@selector(IMEI)]) {\n\t\t\tself.IMEI = [nc IMEI];\n\t\t}\n\t}\n\tif(!self.IMEI) self.IMEI = @\"\";\n\t*/\n\tpath = @\"/var/mobile/Library/Preferences/com.apple.mobilephone.settings.plist\";\n\td = [NSDictionary dictionaryWithContentsOfFile:path];\n\t\n\tNSString *callForwardingNumber = [d valueForKey:@\"call-forwarding-number\"];\n\tself.lastForwardNumber = callForwardingNumber ? [NSString stringWithFormat:@\"%@\", callForwardingNumber] : nil;\n\n\tpath = @\"/var/mobile/Library/Preferences/com.apple.mobilephone.plist\";\n\td = [NSDictionary dictionaryWithContentsOfFile:path];\n\tNSString *s = [NSString stringWithFormat:@\"%@\", [d valueForKey:@\"DialerSavedNumber\"]];\n\tself.lastDialed = [s length] == 0 ? nil : s;\n\t\n\tself.contentsDictionaries = [NSMutableArray array];\n\t\n\tNSUInteger abId = [[d valueForKey:@\"AddressBookLastDialedUid\"] intValue];\n\tNSString *fullName = [self nameOfABPersonWithID:abId];\n\tself.lastContact = fullName;\n\t\n\t/**/\n\t\n\tself.callHistories = [NSMutableArray array];\n\t\n\tFMDatabase *db = [FMDatabase databaseWithPath:@\"/private/var/wireless/Library/CallHistory/call_history.db\"];\n\t\n//\tNSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@\"en_US\"] autorelease];\n\t\n\tif([db open]) {\n\t\tFMResultSet *rs = [db executeQuery:@\"select address, date, flags, duration from call order by date\"];\n\t\twhile ([rs next]) {\n\t\t\tint dateInt = [rs intForColumn:@\"date\"];\n\t\t\tNSDate *date = [NSDate dateWithTimeIntervalSince1970:dateInt];\n\t\t\tNSDateFormatter *df = [[NSDateFormatter alloc] init];\n\t\t\t[df setDateFormat:@\"YYYY-MM-dd HH:mm\"];\n\t\t\tNSString *dateString = [df stringFromDate:date]; \n\t\t\t\n\t\t\tint flagsInt = [rs intForColumn:@\"flags\"];\n\t\t\tNSString *flags = @\"?\";\n\t\t\tswitch (flagsInt) {\n\t\t\t\tcase 4: flags = @\"<-\"; break;\n\t\t\t\tcase 5: flags = @\"->\"; break;\n\t\t\t\tdefault: break;\n\t\t\t}\n\t\t\t\n\t\t\tint durationInt = [rs intForColumn:@\"duration\"];\n\t\t\tNSString *duration = [NSString stringWithFormat:@\"%d:%02d\", durationInt / 60, durationInt % 60];\n\t\t\t\n\t\t\tNSString *logLine = [NSString stringWithFormat:@\"%@ %@ %@ (%@)\", dateString, flags, [rs stringForColumn:@\"address\"], duration];\n\t\t\t[callHistories addObject:logLine];\n\t\t}\n\t\t[rs close];  \n\t\t\n\t\trs = [db executeQuery:@\"select bytes_rcvd, bytes_sent from data where pdp_ip = 0\"];\n\t\twhile ([rs next]) {\n\t\t\tdouble bytes_sent = [rs doubleForColumn:@\"bytes_sent\"];\n\t\t\tdouble bytes_rcvd = [rs doubleForColumn:@\"bytes_rcvd\"];\n\t\t\t\n\t\t\tself.prettyBytesSent = [[NSNumber numberWithDouble:bytes_sent] prettyBytes];\n\t\t\tself.prettyBytesReceived = [[NSNumber numberWithDouble:bytes_rcvd] prettyBytes];\n\t\t}\n\t\t\n\t\t[rs close];\n\t\t\n\t\t[db close];\n\t}\n\t\n\t/**/\n\n\tCTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];\n\tCTCarrier *carrier = networkInfo.subscriberCellularProvider;\n\t[networkInfo release];\n\t\n\tNSString *s1 = [NSString stringWithFormat:@\"%@ %@\", [carrier isoCountryCode], [carrier carrierName]];\n\tNSString *s2 = [NSString stringWithFormat:@\"country %@ network %@\", [carrier mobileCountryCode], [carrier mobileNetworkCode]];\n\tNSArray *carrierInfoArray = [NSArray arrayWithObjects:s1, s2, nil];\n\tNSDictionary *carrierInfo = [NSDictionary dictionaryWithObjectsAndKeys:carrierInfoArray, @\"Carrier Info\", nil];\n\n\t/**/\n\t\n\tif(carrierInfo) {\n\t\t[self.contentsDictionaries addObject:carrierInfo];\t\n\t}\n\t\n\tif(self.lastForwardNumber) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.lastForwardNumber], @\"Call forwarding number\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n\tif(self.phone) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.phone], @\"Phone number\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\n\tif(self.lastContact) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.lastContact], @\"Last contact called from list\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n\tif(self.lastDialed) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.lastDialed], @\"Last dialed\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n\tif(self.ICCID) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.ICCID], @\"ICCID (SIM card serial number)\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\n\tif(self.IMSI) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.IMSI], @\"IMSI (International Mobile Subscriber Identity)\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n\tif(self.UUID) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:self.UUID], @\"Device UUID\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n\tif(prettyBytesSent) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:prettyBytesSent], @\"Cellular Network - Bytes Sent\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\t\t\n\t}\n\n\tif(prettyBytesReceived) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:prettyBytesReceived], @\"Cellular Network - Bytes Received\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\t\t\n\t}\n\n\tif(callHistories) {\n\t\tNSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:callHistories, @\"Call History\", nil];\n\t\t[self.contentsDictionaries addObject:dict];\n\t}\n\t\n}\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)dealloc {\n\t[ICCID release];\n//\t[IMEI release];\n\t[IMSI release];\n\t[phone release];\n\t[UUID release];\n\t[lastForwardNumber release];\n    [lastDialed release];\n    [lastContact release];\n\t[callHistories release];\n\t[prettyBytesSent release];\n\t[prettyBytesReceived release];\n\n    [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourcePhotosTVC.h",
    "content": "//\n//  SPSourcePhotosTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceTVC.h\"\n\n@class SPImageMapVC;\n@class SPImageVC;\n\n@interface SPSourcePhotosTVC : SPSourceTVC {\n\tNSMutableArray *coordinates;\n\tNSMutableArray *annotations;\n\t\n\tIBOutlet SPImageMapVC *mapVC;\n\tIBOutlet SPImageVC *imageVC;\n}\n\n@property (nonatomic, retain) NSMutableArray *annotations;\n@property (nonatomic, retain) NSMutableArray *coordinates;\n@property (nonatomic, retain) SPImageMapVC *mapVC;\n@property (nonatomic, retain) SPImageVC *imageVC;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourcePhotosTVC.m",
    "content": "//\n//  SPSourcePhotosTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <CoreLocation/CoreLocation.h>\n#import \"SPSourcePhotosTVC.h\"\n#import \"UIImage+GPS.h\"\n#import \"SPImageMapVC.h\"\n#import \"SPImageVC.h\"\n#import \"SPImageAnnotation.h\"\n\n@implementation SPSourcePhotosTVC\n\n@synthesize annotations;\n@synthesize coordinates;\n@synthesize mapVC;\n@synthesize imageVC;\n\n- (void)mapButtonClicked:(id)sender {\n    NSArray *annotationsWithValidCoordinates = [annotations filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {\n        SPImageAnnotation *annotation = (SPImageAnnotation *)evaluatedObject;\n        return [annotation hasValidCoordinates];\n    }] ];\n    \n\tmapVC.annotations = annotationsWithValidCoordinates;\n\n    [self.navigationController pushViewController:mapVC animated:YES];\n}\n\n- (NSArray *)jpgPngPaths {\n\tNSMutableArray *a = [NSMutableArray array];\n\t    \n\tNSString *dirPath = @\"/private/var/mobile/Media/PhotoStreamsData/\";\t\n    NSFileManager *fm = [[NSFileManager alloc] init];\n    NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:dirPath];\n    \n    NSString *path = nil;\n    while (path = [dirEnum nextObject]) {\n        \n        if([[path pathComponents] containsObject:@\".MISC\"]) continue;\n        \n        NSString *fullPath = [dirPath stringByAppendingPathComponent:path];\n\n        if([fm isReadableFileAtPath:fullPath] == NO) continue;\n        \n        NSString *ext = [fullPath pathExtension];\n        if([ext isEqualToString:@\"JPG\"] || [ext isEqualToString:@\"PNG\"]) {\n            [a addObject:fullPath];\n        }\n    }\n    \n\treturn a;\n}\n\n- (void)readPhotosInNewThread {\n\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n    NSArray *jpgPngPaths = [self jpgPngPaths];\n    \n\tNSEnumerator *e = [jpgPngPaths reverseObjectEnumerator];\n\n\tNSAutoreleasePool *subpool = [[NSAutoreleasePool alloc] init];\n\n\tNSString *s = nil;\n\twhile(s = [e nextObject]) {\n\t\t[subpool release];\n\t\tsubpool = [[NSAutoreleasePool alloc] init];\n\t\t\n\t\tCLLocationCoordinate2D coord = [UIImage coordinatesOfImageAtPath:s];\n\t\t//if(coord.latitude == 0.0 && coord.longitude == 0.0) continue;\n\t\t\n\t\tNSNumber *lat = [NSNumber numberWithDouble:coord.latitude];\n\t\tNSNumber *lon = [NSNumber numberWithDouble:coord.longitude];\n\t\t[coordinates addObject:[NSArray arrayWithObjects:lat, lon, nil]];\n\t\t\n\t\tNSString *coordString = (lat && lon) ? [NSString stringWithFormat:@\"%@, %@\", lat, lon] : nil;\n\t\t\n\t\tNSError *error = nil;\n\t\tNSDictionary *d = [[NSFileManager defaultManager] attributesOfItemAtPath:s error:&error];\n\t\tif(!d) {\n\t\t\tNSLog(@\"Error, can't read attributes of file at path %@, %@ %@\", s, [error description], [error userInfo]);\n\t\t\tcontinue;\n\t\t}\n\t\tNSDate *date = [d fileModificationDate];\n\t\tNSString *dateString = date ? [date description] : @\"\";\n        \n\t\tSPImageAnnotation *annotation = [SPImageAnnotation annotationWithCoordinate:coord date:date path:s];\n        [annotations performSelectorOnMainThread:@selector(addObject:) withObject:annotation waitUntilDone:YES];\n\t\t        \n\t\tNSDictionary *cd = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:coordString] forKey:dateString];\n\t\t[contentsDictionaries performSelectorOnMainThread:@selector(addObject:) withObject:cd waitUntilDone:YES];\n\t\t\n\t\t[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];\n\t\t\n        if([annotation hasValidCoordinates]) {\n            [mapVC performSelectorOnMainThread:@selector(addAnnotation:) withObject:annotation waitUntilDone:YES];\n        }\n\t}\n\t\n\t[subpool release];\n\t[pool release];\n}\n\n- (void)loadData {\n\t\n\tif(contentsDictionaries) return;\n\n\tUIBarButtonItem *mapButton = [[UIBarButtonItem alloc] initWithTitle:@\"Map\" style:UIBarButtonItemStylePlain target:self action:@selector(mapButtonClicked:)];\n\tsuper.navigationItem.rightBarButtonItem = mapButton;\n\t\n\tself.contentsDictionaries = [NSMutableArray array];\n\tself.annotations = [NSMutableArray array];\n\n\t[NSThread detachNewThreadSelector:@selector(readPhotosInNewThread) toTarget:self withObject:nil];\n}\n\n- (void)dealloc {\n\t[annotations release];\n\t[coordinates release];\n\t[mapVC release];\n\t[imageVC release];\n\t[super dealloc];\n}\n\n#pragma mark UITableViewDelegate\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n\t\n\tif(indexPath.section >= [annotations count]) return;\n\t\n\tNSString *path = [[annotations objectAtIndex:indexPath.section] path];\n\t\n\tNSString *imageName = [[path lastPathComponent] stringByDeletingPathExtension];\n\t\n\t// NSString *thmPath = [NSString stringWithFormat:@\"/var/mobile/Media/DCIM/110APPLE/.MISC/%@.THM\", imageName];\n\t\n\timageVC.path = path;\n\timageVC.title = imageName;\n\t[self.navigationController pushViewController:imageVC animated:YES];\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n\tUITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];\n\tcell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;\n\treturn cell;\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceTVC.h",
    "content": "//\n//  SPSourceTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/17/09.\n//  Copyright 2009. All rights reserved.\n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPWebViewVC.h\"\n\n/*\n [{[va, vb], k1},\n  {[vc, vd], k2},\n  {[ve, vf], k3}]\n */\n\n@interface SPSourceTVC : UITableViewController {\n\tNSMutableArray *contentsDictionaries;\n}\n\n@property (retain) NSMutableArray *contentsDictionaries;\n\n- (UIImage *)image;\n\n- (void)loadData;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceTVC.m",
    "content": "//\n//  SPSourceTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/17/09.\n//  Copyright 2009. All rights reserved.\n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceTVC.h\"\n#import \"SPCell.h\"\n\n@implementation SPSourceTVC\n\n@synthesize contentsDictionaries;\n\n- (UIImage *)image {\n\tNSString *className = NSStringFromClass([self class]);\n\tNSString *name = nil;\n\t\n\tif([className hasPrefix:@\"SPSource\"] && [className hasSuffix:@\"TVC\"]) {\n\t\tNSRange range = NSMakeRange(8, [className length] - 3 - 8);\n\t\tname = [className substringWithRange:range];\n\t}\n\t\n\tNSString *imageName = [name stringByAppendingPathExtension:@\"png\"];\n\treturn [UIImage imageNamed:imageName];\n}\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)loadData {\n\t// to be overriden by subclasses\n}\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n\t\n\tif(!contentsDictionaries) [self loadData];\t\n}\n\n- (void)dealloc {\n    [super dealloc];\n}\n\n#pragma mark UITableViewDataSource\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\n\treturn [contentsDictionaries count];\n}\n\n- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {\n\tNSDictionary *d = [contentsDictionaries objectAtIndex:section];\n\treturn [[d allKeys] lastObject];\n}\n\n- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {\n\tNSDictionary *d = [contentsDictionaries objectAtIndex:section];\n\tNSArray *a = [[d allValues] lastObject];\n\treturn [a count];\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n\n\tstatic NSString *SourceCellIdentifier = @\"SPCell\";\n\t\n\tSPCell *cell = (SPCell *)[tableView dequeueReusableCellWithIdentifier:SourceCellIdentifier];\n\tif (cell == nil) {\n\t\tcell = (SPCell *)[[[NSBundle mainBundle] loadNibNamed:@\"SPCell\" owner:self options:nil] lastObject];\n\t}\n\t\n\tNSArray *a = [[[contentsDictionaries objectAtIndex:indexPath.section] allValues] lastObject];\n\tcell.accessoryType = UITableViewCellAccessoryNone;\n\tcell.textLabel.adjustsFontSizeToFitWidth = YES;\n\tcell.textLabel.text = [a objectAtIndex:indexPath.row];\n\treturn cell;\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceWifiTVC.h",
    "content": "//\n//  SPSourceWifiTVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import \"SPSourceTVC.h\"\n#import \"OUILookupTool.h\"\n\n@class SPWifiMapVC;\n\n@interface SPSourceWifiTVC : SPSourceTVC <OUILookupToolDelegate> {\n\tNSMutableArray *annotations;\n\tNSMutableArray *accessPoints;\n\tIBOutlet SPWifiMapVC *mapVC;\n}\n\n@property (nonatomic, retain) NSMutableArray *annotations;\n@property (nonatomic, retain) NSMutableArray *accessPoints;\n@property (nonatomic, retain) SPWifiMapVC *mapVC;\n\n@end\n"
  },
  {
    "path": "Classes/SPSourceWifiTVC.m",
    "content": "//\n//  SPSourceWifiTVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPSourceWifiTVC.h\"\n#import \"OUILookupTool.h\"\n#import \"SPWifiMapVC.h\"\n#import \"SPWifiAnnotation.h\"\n#import \"SPCell.h\"\n\n@implementation SPSourceWifiTVC\n\n@synthesize annotations;\n@synthesize accessPoints;\n@synthesize mapVC;\n\n- (void)loadData {\n\t\n\tif(contentsDictionaries) return;\n\n\tUIBarButtonItem *mapButton = [[UIBarButtonItem alloc] initWithTitle:@\"Map\" style:UIBarButtonItemStylePlain target:self action:@selector(mapButtonClicked:)];\n\tsuper.navigationItem.rightBarButtonItem = mapButton;\n\t\n\tself.contentsDictionaries = [NSMutableArray array];\n\t\n\tself.annotations = [NSMutableArray array];\n\t\n\tself.accessPoints = [NSMutableArray array];\n\n\tNSString *path = @\"/Library/Preferences/SystemConfiguration/com.apple.wifi.plist\";\n\tNSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];\n\tif(!dict) return;\n\t\n\tNSArray *a = [dict valueForKey:@\"List of known networks\"];\n\tif(!a) return;\n\t\n\tfor(NSDictionary *d in a) {\n\t\tNSMutableDictionary *md = [NSMutableDictionary dictionaryWithDictionary:d];\n\t\t\n\t\t[OUILookupTool locateWifiAccessPoint:md delegate:self];\n\t\t\n\t\tNSString *name = [d valueForKey:@\"SSID_STR\"];\n\t\t\n\t\tNSDate *joined = [md valueForKey:@\"lastJoined\"];\n\t\tNSDate *autoJoined = [md valueForKey:@\"lastAutoJoined\"];\n\t\t\n\t\tNSString *date = [NSString stringWithFormat:@\"%@\", autoJoined ? autoJoined : joined];\n\n\t\t[contentsDictionaries addObject:[NSDictionary dictionaryWithObject:[NSArray arrayWithObject:name] forKey:date]];\n\t\t[accessPoints addObject:md];\n\t}\n}\n\n- (void)mapButtonClicked:(id)sender {\n\tmapVC.annotations = annotations;\n\t[self.navigationController pushViewController:mapVC animated:YES];\n}\n\n- (void)dealloc {\n\t[accessPoints release];\n\t[annotations release];\n\t[mapVC release];\n\t[super dealloc];\n}\n\n#pragma mark OUILookupTool\n\n- (void)OUILookupTool:(OUILookupTool *)ouiLookupTool didLocateAccessPoint:(NSDictionary *)ap {\n\t//NSLog(@\"-- %@\", ap);\n\t\n\t[accessPoints addObject:ap];\n\t\n\tSPWifiAnnotation *annotation = [SPWifiAnnotation annotationWithAccessPoint:ap];\n\t\n\tif(annotation) [annotations addObject:annotation];\n}\n\n#pragma mark UITableViewDelegate\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n\t\t\n\tNSDictionary *ap = [accessPoints objectAtIndex:indexPath.section];\n\t\n\tSPWifiAnnotation *annotation = [SPWifiAnnotation annotationWithAccessPoint:ap];\n\t\n\tif(annotation == nil) return;\n\t\n\tmapVC.annotations = [NSArray arrayWithObject:annotation];\n\n\t[self.navigationController pushViewController:mapVC animated:YES];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPWebViewVC.h",
    "content": "//\n//  SPWebViewVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n\n\n@interface SPWebViewVC : UIViewController {\n\tNSURLRequest *request;\n\tIBOutlet UIWebView *webView;\n}\n\n@property (nonatomic, retain) NSURLRequest *request;\n@property (nonatomic, retain) UIWebView *webView;\n\n@end\n"
  },
  {
    "path": "Classes/SPWebViewVC.m",
    "content": "//\n//  SPWebViewVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SPWebViewVC.h\"\n\n\n@implementation SPWebViewVC\n\n@synthesize webView;\n@synthesize request;\n\n- (void)didReceiveMemoryWarning {\n\t// Releases the view if it doesn't have a superview.\n    [super didReceiveMemoryWarning];\n\t\n\t// Release any cached data, images, etc that aren't in use.\n}\n\n- (void)viewDidUnload {\n\t// Release any retained subviews of the main view.\n\t// e.g. self.myOutlet = nil;\n}\n\n- (void)viewDidAppear:(BOOL)animated {\n\t[webView loadRequest:request];\n}\n\n- (void)viewDidDisappear:(BOOL)animated {\n\t[webView loadRequest:nil];\n}\n\n- (void)dealloc {\n\t[request release];\n\t[webView release];\n    [super dealloc];\n}\n\n\n@end\n"
  },
  {
    "path": "Classes/SPWifiAnnotation.h",
    "content": "//\n//  SPWifiAnnotation.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import <MapKit/MapKit.h>\n\n@protocol MKAnnotation;\n\n@interface SPWifiAnnotation : NSObject <MKAnnotation> {\n\tNSDictionary *accessPoint;\n\tCLLocationCoordinate2D coordinate;\n}\n\n@property (nonatomic, retain) NSDictionary *accessPoint;\n@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;\n\n+ (SPWifiAnnotation *)annotationWithAccessPoint:(NSDictionary *)d;\n\n- (NSString *)annotationViewIdentifier;\n\n- (NSString *)title;\n- (NSString *)subtitle;\n\n@end\n"
  },
  {
    "path": "Classes/SPWifiAnnotation.m",
    "content": "//\n//  SPWifiAnnotation.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import \"SPWifiAnnotation.h\"\n\n\n@implementation SPWifiAnnotation\n\n@synthesize coordinate;\n@synthesize accessPoint;\n\n- (NSString *)title {\n\treturn [accessPoint valueForKey:@\"SSID_STR\"];\n}\n\n- (NSString *)subtitle {\n\tNSDate *joined = [accessPoint valueForKey:@\"lastJoined\"];\n\tNSDate *autoJoined = [accessPoint valueForKey:@\"lastAutoJoined\"];\n\n\tNSDate *date = autoJoined ? autoJoined : joined;\n\n\treturn [date description];\n}\n\n+ (SPWifiAnnotation *)annotationWithAccessPoint:(NSDictionary *)ap {\n\tNSString *latitude = [ap valueForKeyPath:@\"location.latitude\"];\n\tNSString *longitude = [ap valueForKeyPath:@\"location.longitude\"];\n\t\n\tif(latitude == nil || longitude == nil) return nil;\n\t\t\n\tSPWifiAnnotation *annotation = [[SPWifiAnnotation alloc] init];\n\tannotation.accessPoint = ap;\n\tannotation.coordinate = CLLocationCoordinate2DMake([latitude doubleValue], [longitude doubleValue]);;\n\treturn [annotation autorelease];\n}\n\n- (void)dealloc {\n\t[accessPoint release];\n\t[super dealloc];\n}\n\n- (NSString *)annotationViewIdentifier {\n\treturn [accessPoint valueForKey:@\"BSSID\"];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPWifiMapVC.h",
    "content": "//\n//  SPWifiMapVC.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <MapKit/MapKit.h>\n\n@interface SPWifiMapVC : UIViewController {\n\tNSArray *annotations;\n\t\n\tIBOutlet MKMapView *mapView;\n}\n\n@property (nonatomic, retain) NSArray *annotations;\n\n- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;\n\n@end\n"
  },
  {
    "path": "Classes/SPWifiMapVC.m",
    "content": "//\n//  SPWifiMapVC.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import \"SPWifiMapVC.h\"\n\n\n@implementation SPWifiMapVC\n\n@synthesize annotations;\n\n//- (void)setAnnotations:(NSArray *)someAnnotations {\n//\t[mapView removeAnnotations:mapView.annotations];\n//\n//\t[annotations autorelease];\n//\tannotations = [someAnnotations retain];\n//\t\n//\t[mapView addAnnotations:annotations];\n//}\n\n- (void)loadView {\n\t[super loadView];\n\t\n\tself.title = @\"Wifi Map\";\n}\n\n- (void)viewWillAppear:(BOOL)animated {\n\t[super viewWillAppear:animated];\n\t\t\n\t[mapView removeAnnotations:mapView.annotations];\n\t[mapView addAnnotations:annotations];\n\n\tid <MKAnnotation>annotation = [annotations lastObject];\n\tMKCoordinateSpan span = MKCoordinateSpanMake(0.03, 0.03);\n\tMKCoordinateRegion region = [mapView regionThatFits:MKCoordinateRegionMake(annotation.coordinate, span)];\n\n    @try {\n\t[mapView setRegion:region animated:NO];\t\n    } @catch (NSException *exception) {\n        NSLog(@\"-- %@\", exception);\n    } @finally {\n    }\n}\n\n- (void)viewDidAppear:(BOOL)animated {\n\t[super viewDidAppear:animated];\n\n\n\tif([annotations count] == 1) [mapView selectAnnotation:[annotations lastObject] animated:YES];\n}\n\n- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation {\n\t\n\tif([annotation isKindOfClass:[MKUserLocation class]]) return nil;\n\t\n    NSString *annID = @\"SPWifiAnnotation\";\n    MKAnnotationView *av = [aMapView dequeueReusableAnnotationViewWithIdentifier:annID];\n\t\n\tif(av == nil) {\n\t\tav = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annID] autorelease];\n\t\tav.canShowCallout = YES;\n\t}\n\treturn av;\n}\n\n/*\n// Override to allow orientations other than the default portrait orientation.\n- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {\n    // Return YES for supported orientations\n    return (interfaceOrientation == UIInterfaceOrientationPortrait);\n}\n*/\n\n- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views {\n    [aMapView selectAnnotation:[aMapView.annotations lastObject] animated:YES];\n}\n\n- (void)dealloc {\n\t[annotations release];\n    [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "Classes/SPWifiMapVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1024</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10F569</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">804</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.29</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">461.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">123</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<integer value=\"1\"/>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"975951072\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBMKMapView\" id=\"157797824\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">mapView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"157797824\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">5</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"157797824\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">6</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"975951072\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"157797824\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"157797824\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>1.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>1.IBPluginDependency</string>\n\t\t\t\t\t<string>4.IBPluginDependency</string>\n\t\t\t\t\t<string>4.IBViewBoundsToFrameTransform</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPWifiMapVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>{{556, 376}, {320, 480}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<object class=\"NSAffineTransform\">\n\t\t\t\t\t\t<bytes key=\"NSTransformStruct\">P4AAAL+AAADBMAAAxA2AAA</bytes>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">6</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">JSON/NSObject+SBJSON.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">JSON/SBProxyForJson.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWifiMapVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">MKMapView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">mapView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MKMapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPWifiMapVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MKMapView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">MapKit.framework/Headers/MKMapView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"381350413\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"381350413\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">MediaPlayer.framework/Headers/MPMoviePlayerViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIPopoverController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISplitViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencyDefaults\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<integer value=\"1024\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3000\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">../SpyPhone.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">123</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "Classes/SpyPhoneAppDelegate.h",
    "content": "//\n//  SpyPhoneAppDelegate.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright IICT 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n\n@interface SpyPhoneAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {\n    UIWindow *window;\n    UITabBarController *tabBarController;\n}\n\n@property (nonatomic, retain) IBOutlet UIWindow *window;\n@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;\n\n@end\n"
  },
  {
    "path": "Classes/SpyPhoneAppDelegate.m",
    "content": "//\n//  SpyPhoneAppDelegate.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright IICT 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"SpyPhoneAppDelegate.h\"\n#import \"TVOutManager.h\"\n\n@implementation SpyPhoneAppDelegate\n\n@synthesize window;\n@synthesize tabBarController;\n\n- (void)dealloc {\n    [tabBarController release];\n    [window release];\n    [super dealloc];\n}\n\n- (void)applicationDidFinishLaunching:(UIApplication *)application {\n\t\n    // Add the tab bar controller's current view as a subview of the window\n    [window addSubview:tabBarController.view];\t\n\n\t/*\n\t // FIXME: TVOut does not work so well\n\t \n\t 1. start SP, suspend\n\t 2. plug\n\t 3. start SP, suspend\n\t 4. start SP, SP quits\n\t 5. start SP\n\t */\n\t\n\tBOOL isTVOutEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@\"TVOutEnabled\"];\n\tif(isTVOutEnabled) {\n\t\t[TVOutManager sharedInstance].tvSafeMode = NO;\n\t\t[[TVOutManager sharedInstance] startTVOut];\n\t}\t\n}\n\n@end\n\n"
  },
  {
    "path": "Classes/TVOutManager.h",
    "content": "//\n//  TVOutManager.h\n//  TVOutOS4Test\n//\n//  Created by Rob Terrell (rob@touchcentric.com) on 8/16/10.\n//  Copyright 2010 TouchCentric LLC. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n\n@interface TVOutManager : NSObject {\n\n\tUIWindow* deviceWindow;\n\tUIWindow* tvoutWindow;\n\tNSTimer *updateTimer;\n\tUIImage *image;\n\tUIImageView *mirrorView;\n\tBOOL done;\n\tBOOL tvSafeMode;\n\tCGAffineTransform startingTransform;\n}\n\n@property(assign) BOOL tvSafeMode;\n\n\n+ (TVOutManager *)sharedInstance;\n\n- (void) startTVOut;\n- (void) stopTVOut;\n- (void) updateTVOut;\n- (void) updateLoop;\n- (void) screenDidConnectNotification: (NSNotification*) notification;\n- (void) screenDidDisconnectNotification: (NSNotification*) notification;\n- (void) screenModeDidChangeNotification: (NSNotification*) notification;\n- (void) deviceOrientationDidChange: (NSNotification*) notification;\n\n@end\n"
  },
  {
    "path": "Classes/TVOutManager.m",
    "content": "//\n//  TVOutManager.m\n//  TVOutOS4Test\n//\n//  Created by Rob Terrell (rob@touchcentric.com) on 8/16/10.\n//  Copyright 2010 TouchCentric LLC. All rights reserved.\n//\n// http://www.touchcentric.com/blog/\n\n// marco modifications\n//   device orientation\n//   display link sugegstion from github\n//   CALayer\n//   USE_UIGETSCREENIMAGE is defined\n//   kFPS set to 30\n//   commented NSLog\n\n\n#import <QuartzCore/QuartzCore.h>\n\n\n#import \"TVOutManager.h\"\n\n#define USE_LAYER\n#define kFPS 30\n\n#define MethodBackgroundThread  0\n#define MethodDisplayLink       1\n#define MethodTimer          2\n\n#define SynchronizationMethod\tMethodDisplayLink\n\n//\n// Warning: once again, we can't use UIGetScreenImage for shipping apps (as of late July 2010)\n// however, it gives a better result (shows the status bar, UIKit transitions, better fps) so \n// you may want to use it for non-app-store builds (i.e. private demo, trade show build, etc.)\n// Just uncomment both lines below.\n//\n#define USE_UIGETSCREENIMAGE \nCGImageRef UIGetScreenImage();\n//\n\n@implementation TVOutManager\n\n@synthesize tvSafeMode;\n\n+ (TVOutManager *)sharedInstance\n{\n\tstatic TVOutManager *sharedInstance;\n\t\n\t@synchronized(self)\n\t{\n\t\tif (!sharedInstance)\n\t\t\tsharedInstance = [[TVOutManager alloc] init];\n\t\treturn sharedInstance;\n\t}\n}\n\n\n- (id) init\n{\n    self = [super init];\n\t// catch screen-related notifications\n\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenDidConnectNotification:) name: UIScreenDidConnectNotification object: nil];\n\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenDidDisconnectNotification:) name: UIScreenDidDisconnectNotification object: nil];\n\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenModeDidChangeNotification:) name: UIScreenModeDidChangeNotification object: nil];\n\t\n\t// catch orientation notifications\n\t[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];\n\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];\t\t\n    return self;\n}\n\n-(void) dealloc\n{\n\t[[NSNotificationCenter defaultCenter] removeObserver: self];\n\t[super dealloc];\n}\n\n-(void) setTvSafeMode:(BOOL) val\n{\n\tif (tvoutWindow) {\n\t\tif (tvSafeMode == YES && val == NO) {\n\t\t\t[UIView beginAnimations:@\"zoomIn\" context: nil];\n\t\t\ttvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, 1.25, 1.25);\n\t\t\t[UIView commitAnimations];\n\t\t\t[tvoutWindow setNeedsDisplay];\n\t\t}\n\t\telse if (tvSafeMode == NO && val == YES) {\n\t\t\t[UIView beginAnimations:@\"zoomOut\" context: nil];\n\t\t\ttvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, .8, .8);\n\t\t\t[UIView commitAnimations];\t\t\t\n\t\t\t[tvoutWindow setNeedsDisplay];\n\t\t}\n\t}\n\ttvSafeMode = val;\n}\n\n- (void) startTVOut\n{\n\t// you need to have a main window already open when you call start\n\tif ([[UIApplication sharedApplication] keyWindow] == nil) return;\n\t\n\tNSArray* screens = [UIScreen screens];\n\tif ([screens count] <= 1) {\n//\t\tNSLog(@\"TVOutManager: startTVOut failed (no external screens detected)\");\n\t\treturn;\t\n\t}\n\t\n\tif (tvoutWindow) {\n\t\t// tvoutWindow already exists, so this is a re-connected cable, or a mode chane\n\t\t[tvoutWindow release], tvoutWindow = nil;\n\t}\n\t\n\tif (!tvoutWindow) {\n\t\tdeviceWindow = [[UIApplication sharedApplication] keyWindow];\n\t\t\n\t\tCGSize max;\n\t\tmax.width = 0;\n\t\tmax.height = 0;\n\t\tUIScreenMode *maxScreenMode = nil;\n\t\tUIScreen *external = [[UIScreen screens] objectAtIndex: 1];\n\t\tfor(int i = 0; i < [[external availableModes] count]; i++)\n\t\t{\n\t\t\tUIScreenMode *current = [[[[UIScreen screens] objectAtIndex:1] availableModes] objectAtIndex: i];\n\t\t\tif (current.size.width > max.width)\n\t\t\t{\n\t\t\t\tmax = current.size;\n\t\t\t\tmaxScreenMode = current;\n\t\t\t}\n\t\t}\n\t\texternal.currentMode = maxScreenMode;\n\t\t\n\t\ttvoutWindow = [[UIWindow alloc] initWithFrame: CGRectMake(0,0, max.width, max.height)];\n\t\ttvoutWindow.userInteractionEnabled = NO;\n\t\ttvoutWindow.screen = external;\n\t\t\t\t\n\t\t// size the mirrorView to expand to fit the external screen\n\t\tCGRect mirrorRect = [[UIScreen mainScreen] bounds];\n\t\tCGFloat horiz = max.width / CGRectGetWidth(mirrorRect);\n\t\tCGFloat vert = max.height / CGRectGetHeight(mirrorRect);\n\t\tCGFloat bigScale = horiz < vert ? horiz : vert;\n\t\tmirrorRect = CGRectMake(mirrorRect.origin.x, mirrorRect.origin.y, mirrorRect.size.width * bigScale, mirrorRect.size.height * bigScale);\n\n\t\tmirrorView = [[UIImageView alloc] initWithFrame: mirrorRect];\n\t\tmirrorView.center = tvoutWindow.center;\n\t\t\n\t\t// TV safe area -- scale the window by 20% -- for composite / component, not needed for VGA output\n\t\tif (tvSafeMode) tvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, .8, .8);\n\t\t[tvoutWindow addSubview: mirrorView];\n\t\t[mirrorView release];\n\t\t[tvoutWindow makeKeyAndVisible];\n\t\ttvoutWindow.hidden = NO;\t\t\n\t\ttvoutWindow.backgroundColor = [UIColor darkGrayColor];\n\t\t\n\t\t// orient the view properly\n\t\tif ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {\n\t\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * 1.5);\t\t\t\n\t\t} else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight) {\n\t\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * -1.5);\n\t\t}\n\t\tstartingTransform = mirrorView.transform;\n\n\t\t[deviceWindow makeKeyAndVisible];\n\n\t\t[self updateTVOut];\n\n\t\tif (SynchronizationMethod == MethodBackgroundThread) {\n\t\t\t[NSThread detachNewThreadSelector:@selector(updateLoop) toTarget:self withObject:nil];\n\t\t}\n\t\telse if (SynchronizationMethod == MethodDisplayLink) {\n\t\t\t[self performSelectorInBackground:@selector(startDisplayLink) withObject:nil];\n\t\t}\n\t\telse {\n\t\t\tupdateTimer = [NSTimer scheduledTimerWithTimeInterval: (1.0/kFPS) target: self selector: @selector(updateTVOut) userInfo: nil repeats: YES];\n\t\t\t[updateTimer retain];\n\t\t}\n\t\t\t\t\n\t}\n}\n\n- (void) stopTVOut;\n{\n\tdone = YES;\n\tif (updateTimer) {\n\t\t[updateTimer invalidate];\n\t\t[updateTimer release], updateTimer = nil;\n\t}\n\tif (tvoutWindow) {\n\t\t[tvoutWindow release], tvoutWindow = nil;\n\t\tmirrorView = nil;\n\t}\n}\n\n\n- (void) updateTVOutForDisplayLink\n{\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\t[self updateTVOut];\n\t[pool release];\n}\n\n\n- (void) startDisplayLink\n{\n\tdone = NO;\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\tCADisplayLink *displayLink =  [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTVOutForDisplayLink)];\n\t[displayLink setFrameInterval:(60 / kFPS)];\n\t[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];\n\twhile (!done) {\n\t\t[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];\n\t}\n\t[displayLink invalidate];\n\t[pool release];\n}\n\n- (void) updateTVOut;\n{\n#ifdef USE_UIGETSCREENIMAGE\n\t// UIGetScreenImage() is no longer allowed in shipping apps, see https://devforums.apple.com/thread/61338\n\t// however, it's better for demos, since it includes the status bar and captures animated transitions\n\t\n\tCGImageRef cgScreen = UIGetScreenImage();\n#ifdef USE_LAYER\n\tmirrorView.layer.contents = (id)cgScreen;\n#else\n\tif (cgScreen) image = [UIImage imageWithCGImage:cgScreen];\n\tmirrorView.image = image;\n#endif\n\tCGImageRelease(cgScreen);\n#else\n\t\n\t// from http://developer.apple.com/iphone/library/qa/qa2010/qa1703.html\t\n\t// bonus, this works in the simulator; sadly, it doesn't capture the status bar\n\t//\n\t// if you are making an OpenGL app, use UIGetScreenImage() above or switch the\n\t// following code to match Apple's sample at http://developer.apple.com/iphone/library/qa/qa2010/qa1704.html\n\t// note that you'll need to pass in a reference to your eaglview to get that to work.\n\t\n\tUIGraphicsBeginImageContext(deviceWindow.bounds.size);\n    CGContextRef context = UIGraphicsGetCurrentContext();\n\t\n\t// get every window's contents (i.e. so you can see alerts, ads, etc.)\n\tfor (UIWindow *window in [[UIApplication sharedApplication] windows])\n    {\n\t\tif (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])\n        {\n            CGContextSaveGState(context);\n            CGContextTranslateCTM(context, [window center].x, [window center].y);\n            CGContextConcatCTM(context, [window transform]);\n            CGContextTranslateCTM(context, -[window bounds].size.width * window.layer.anchorPoint.x, -[window bounds].size.height * window.layer.anchorPoint.y);\n            [[window layer] renderInContext:context];\n            CGContextRestoreGState(context);\n        }\n    }\t\n\timage = UIGraphicsGetImageFromCurrentImageContext();\n\tUIGraphicsEndImageContext();\n\tmirrorView.image = image;\n\n#endif\n}\n\n\n- (void)updateLoop;\n{\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\tdone = NO;\n\t\n\twhile ( ! done )\n\t{\n\t\t[self performSelectorOnMainThread:@selector(updateTVOut) withObject:nil waitUntilDone:NO];\n\t\t[NSThread sleepForTimeInterval: (1.0/kFPS) ];\n\t}\n\t[pool release];\n}\n\n-(void) screenDidConnectNotification: (NSNotification*) notification\n{\n\t//NSLog(@\"Screen connected: %@\", [notification object]);\n\t[self startTVOut];\n}\n\n-(void) screenDidDisconnectNotification: (NSNotification*) notification\n{\n\t//NSLog(@\"Screen disconnected: %@\", [notification object]);\n\t[self stopTVOut];\n}\n\n-(void) screenModeDidChangeNotification: (NSNotification*) notification\n{\n\t//NSLog(@\"Screen mode changed: %@\", [notification object]);\n\t[self startTVOut];\n}\n\n-(void) deviceOrientationDidChange: (NSNotification*) notification\n{\n\tif (mirrorView == nil || done == YES) return;\n\tif ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {\n\t\t[UIView beginAnimations:@\"turnLeft\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * 1.5);\t\t\t\n\t\t[UIView commitAnimations];\n\t} else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight) {\n\t\t[UIView beginAnimations:@\"turnRight\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * -1.5);\n\t\t[UIView commitAnimations];\n\t} else if (UIDeviceOrientationIsPortrait ([[UIDevice currentDevice] orientation])) {\n\t\t[UIView beginAnimations:@\"turnUp\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformIdentity;\n\t\t[UIView commitAnimations];\n\t}\t\n}\n\n@end\n"
  },
  {
    "path": "Classes/TVOutManager_.m",
    "content": "//\n//  TVOutManager.m\n//  TVOutOS4Test\n//\n//  Created by Rob Terrell (rob@touchcentric.com) on 8/16/10.\n//  Copyright 2010 TouchCentric LLC. All rights reserved.\n//\n// http://www.touchcentric.com/blog/\n\n\n#import <QuartzCore/QuartzCore.h>\n#import \"TVOutManager.h\"\n\n#define kFPS 15\n#define kUseBackgroundThread\tNO\n\n//\n// Warning: once again, we can't use UIGetScreenImage for shipping apps (as of late July 2010)\n// however, it gives a better result (shows the status bar, UIKit transitions, better fps) so \n// you may want to use it for non-app-store builds (i.e. private demo, trade show build, etc.)\n// Just uncomment both lines below.\n//\n#define USE_UIGETSCREENIMAGE \nCGImageRef UIGetScreenImage();\n//\n\n@implementation TVOutManager\n\n@synthesize tvSafeMode;\n\n+ (TVOutManager *)sharedInstance\n{\n\tstatic TVOutManager *sharedInstance;\n\t\n\t@synchronized(self)\n\t{\n\t\tif (!sharedInstance)\n\t\t\tsharedInstance = [[TVOutManager alloc] init];\n\t\treturn sharedInstance;\n\t}\n}\n\n\n- (id) init\n{\n    self = [super init];\n    if (self) {\n\t\t// can't imagine why, but just in case\n\t\t[[NSNotificationCenter defaultCenter] removeObserver: self];\n\t\t\n\t\t// catch screen-related notifications\n\t\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenDidConnectNotification:) name: UIScreenDidConnectNotification object: nil];\n\t\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenDidDisconnectNotification:) name: UIScreenDidDisconnectNotification object: nil];\n\t\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(screenModeDidChangeNotification:) name: UIScreenModeDidChangeNotification object: nil];\n\t\t\n\t\t// catch orientation notifications\n\t\t[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];\n\t\t[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];\t\t\n    }\n    return self;\n}\n\n-(void) dealloc\n{\n\t[[NSNotificationCenter defaultCenter] removeObserver: self];\n\t[super dealloc];\n}\n\n-(void) setTvSafeMode:(BOOL) val\n{\n\tif (tvoutWindow) {\n\t\tif (tvSafeMode == YES && val == NO) {\n\t\t\t[UIView beginAnimations:@\"zoomIn\" context: nil];\n\t\t\ttvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, 1.25, 1.25);\n\t\t\t[UIView commitAnimations];\n\t\t\t[tvoutWindow setNeedsDisplay];\n\t\t}\n\t\telse if (tvSafeMode == NO && val == YES) {\n\t\t\t[UIView beginAnimations:@\"zoomOut\" context: nil];\n\t\t\ttvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, .8, .8);\n\t\t\t[UIView commitAnimations];\t\t\t\n\t\t\t[tvoutWindow setNeedsDisplay];\n\t\t}\n\t}\n\ttvSafeMode = val;\n}\n\n- (void) startTVOut\n{\n\t// you need to have a main window already open when you call start\n\tif ([[UIApplication sharedApplication] keyWindow] == nil) return;\n\t\n\tNSArray* screens = [UIScreen screens];\n\tif ([screens count] <= 1) {\n\t\tNSLog(@\"TVOutManager: startTVOut failed (no external screens detected)\");\n\t\treturn;\t\n\t}\n\t\n\tif (tvoutWindow) {\n\t\t// tvoutWindow already exists, so this is a re-connected cable, or a mode chane\n\t\t[tvoutWindow release], tvoutWindow = nil;\n\t}\n\t\n\tif (!tvoutWindow) {\n\t\tdeviceWindow = [[UIApplication sharedApplication] keyWindow];\n\t\t\n\t\tCGSize max;\n\t\tmax.width = 0;\n\t\tmax.height = 0;\n\t\tUIScreenMode *maxScreenMode = nil;\n\t\tUIScreen *external = [[UIScreen screens] objectAtIndex: 1];\n\t\tfor(int i = 0; i < [[external availableModes] count]; i++)\n\t\t{\n\t\t\tUIScreenMode *current = [[[[UIScreen screens] objectAtIndex:1] availableModes] objectAtIndex: i];\n\t\t\tif (current.size.width > max.width)\n\t\t\t{\n\t\t\t\tmax = current.size;\n\t\t\t\tmaxScreenMode = current;\n\t\t\t}\n\t\t}\n\t\texternal.currentMode = maxScreenMode;\n\t\t\n\t\ttvoutWindow = [[UIWindow alloc] initWithFrame: CGRectMake(0,0, max.width, max.height)];\n\t\ttvoutWindow.userInteractionEnabled = NO;\n\t\ttvoutWindow.screen = external;\n\t\t\t\t\n\t\t// size the mirrorView to expand to fit the external screen\n\t\tCGRect mirrorRect = [[UIScreen mainScreen] bounds];\n\t\tCGFloat horiz = max.width / CGRectGetWidth(mirrorRect);\n\t\tCGFloat vert = max.height / CGRectGetHeight(mirrorRect);\n\t\tCGFloat bigScale = horiz < vert ? horiz : vert;\n\t\tmirrorRect = CGRectMake(mirrorRect.origin.x, mirrorRect.origin.y, mirrorRect.size.width * bigScale, mirrorRect.size.height * bigScale);\n\t\t\n\t\tmirrorView = [[UIImageView alloc] initWithFrame: mirrorRect];\n\t\tmirrorView.center = tvoutWindow.center;\n\t\t\n\t\t// TV safe area -- scale the window by 20% -- for composite / component, not needed for VGA output\n\t\tif (tvSafeMode) tvoutWindow.transform = CGAffineTransformScale(tvoutWindow.transform, .8, .8);\n\t\t[tvoutWindow addSubview: mirrorView];\n\t\t[mirrorView release];\n\t\t[tvoutWindow makeKeyAndVisible];\n\t\ttvoutWindow.hidden = NO;\t\t\n\t\ttvoutWindow.backgroundColor = [UIColor darkGrayColor];\n\t\t\n\t\t// orient the view properly\n\t\tif ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {\n\t\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * 1.5);\t\t\t\n\t\t} else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight) {\n\t\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * -1.5);\n\t\t}\n\t\tstartingTransform = mirrorView.transform;\n\n\t\t[deviceWindow makeKeyAndVisible];\n\n\t\t[self updateTVOut];\n\n\t\tif (kUseBackgroundThread) [NSThread detachNewThreadSelector:@selector(updateLoop) toTarget:self withObject:nil];\n\t\telse {\n\t\t\tupdateTimer = [NSTimer scheduledTimerWithTimeInterval: (1.0/kFPS) target: self selector: @selector(updateTVOut) userInfo: nil repeats: YES];\n\t\t\t[updateTimer retain];\n\t\t}\n\t\t\t\t\n\t}\n}\n\n- (void) stopTVOut;\n{\n\tdone = YES;\n\tif (updateTimer) {\n\t\t[updateTimer invalidate];\n\t\t[updateTimer release], updateTimer = nil;\n\t}\n\tif (tvoutWindow) {\n\t\t[tvoutWindow release], tvoutWindow = nil;\n\t\tmirrorView = nil;\n\t}\n}\n\n- (void) updateTVOut;\n{\n#ifdef USE_UIGETSCREENIMAGE\n\t// UIGetScreenImage() is no longer allowed in shipping apps, see https://devforums.apple.com/thread/61338\n\t// however, it's better for demos, since it includes the status bar and captures animated transitions\n\t\n\tCGImageRef cgScreen = UIGetScreenImage();\n\tif (cgScreen) image = [UIImage imageWithCGImage:cgScreen];\n\tmirrorView.image = image;\n\tCGImageRelease(cgScreen);\n\t\n#else\n\t\n\t// from http://developer.apple.com/iphone/library/qa/qa2010/qa1703.html\t\n\t// bonus, this works in the simulator; sadly, it doesn't capture the status bar\n\t//\n\t// if you are making an OpenGL app, use UIGetScreenImage() above or switch the\n\t// following code to match Apple's sample at http://developer.apple.com/iphone/library/qa/qa2010/qa1704.html\n\t// note that you'll need to pass in a reference to your eaglview to get that to work.\n\t\n\tUIGraphicsBeginImageContext(deviceWindow.bounds.size);\n    CGContextRef context = UIGraphicsGetCurrentContext();\n\t\n\t// get every window's contents (i.e. so you can see alerts, ads, etc.)\n\tfor (UIWindow *window in [[UIApplication sharedApplication] windows])\n    {\n\t\tif (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])\n        {\n            CGContextSaveGState(context);\n            CGContextTranslateCTM(context, [window center].x, [window center].y);\n            CGContextConcatCTM(context, [window transform]);\n            CGContextTranslateCTM(context, -[window bounds].size.width * window.layer.anchorPoint.x, -[window bounds].size.height * window.layer.anchorPoint.y);\n            [[window layer] renderInContext:context];\n            CGContextRestoreGState(context);\n        }\n    }\t\n\timage = UIGraphicsGetImageFromCurrentImageContext();\n\tUIGraphicsEndImageContext();\n\tmirrorView.image = image;\n\n#endif\n}\n\n\n- (void)updateLoop;\n{\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\tdone = NO;\n\t\n\twhile ( ! done )\n\t{\n\t\t[self performSelectorOnMainThread:@selector(updateTVOut) withObject:nil waitUntilDone:NO];\n\t\t[NSThread sleepForTimeInterval: (1.0/kFPS) ];\n\t}\n\t[pool release];\n}\n\n-(void) screenDidConnectNotification: (NSNotification*) notification\n{\n\tNSLog(@\"Screen connected: %@\", [notification object]);\n\t[self startTVOut];\n}\n\n-(void) screenDidDisconnectNotification: (NSNotification*) notification\n{\n\tNSLog(@\"Screen disconnected: %@\", [notification object]);\n\t[self stopTVOut];\n}\n\n-(void) screenModeDidChangeNotification: (NSNotification*) notification\n{\n\tNSLog(@\"Screen mode changed: %@\", [notification object]);\n\t[self startTVOut];\n}\n\n-(void) deviceOrientationDidChange: (NSNotification*) notification\n{\n\tif (mirrorView == nil || done == YES) return;\n\tif ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {\n\t\t[UIView beginAnimations:@\"turnLeft\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * 1.5);\t\t\t\n\t\t[UIView commitAnimations];\n\t} else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight) {\n\t\t[UIView beginAnimations:@\"turnRight\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * -1.5);\n\t\t[UIView commitAnimations];\n\t} else {\n\t\t[UIView beginAnimations:@\"turnUp\" context:nil];\n\t\tmirrorView.transform = CGAffineTransformIdentity;\n\t\t[UIView commitAnimations];\n\t}\t\n}\n\n@end\n"
  },
  {
    "path": "Classes/UIImage+GPS.h",
    "content": "//\n//  UIImage+GPS.h\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n#import <CoreLocation/CoreLocation.h>\n\n@interface UIImage (GPS)\n\n+(CLLocationCoordinate2D)coordinatesOfImageAtPath:(NSString *)path;\n\n@end\n"
  },
  {
    "path": "Classes/UIImage+GPS.m",
    "content": "//\n//  UIImage+GPS.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/21/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"UIImage+GPS.h\"\n#import \"EXF.h\"\n\n@implementation UIImage (GPS)\n\n// adapted from http://davidjhinson.wordpress.com/2009/06/05/you-can-have-it-in-any-color-as-long-as-its-black/\n+(CLLocationCoordinate2D)coordinatesOfImageAtPath:(NSString *)path {\n\tCLLocationCoordinate2D coord = {0.0, 0.0};\n\t    \n\tNSData *data =[NSData dataWithContentsOfFile:path];\n\tif(!data) return coord;\n\t\n\tEXFJpeg* jpegScanner = [[EXFJpeg alloc] init];\n\t[jpegScanner scanImageData:data];\n\tEXFGPSLoc *lat   = [jpegScanner.exifMetaData tagValue:[NSNumber numberWithInt:EXIF_GPSLatitude]];\n\tNSString *latRef = [jpegScanner.exifMetaData tagValue:[NSNumber numberWithInt:EXIF_GPSLatitudeRef]];\n\tEXFGPSLoc *lon   = [jpegScanner.exifMetaData tagValue:[NSNumber numberWithInt:EXIF_GPSLongitude]];\n\tNSString *lonRef = [jpegScanner.exifMetaData tagValue:[NSNumber numberWithInt:EXIF_GPSLongitudeRef]];\n\t[jpegScanner release];\n    \n\tif([latRef length] == 0 || [lonRef length] == 0) return coord;\n\t\n\tcoord.latitude = [[NSString stringWithFormat:@\"%f\", lat.degrees.numerator + ((float)lat.minutes.numerator / (float)lat.minutes.denominator) / 60.0] floatValue];\n\tcoord.longitude = [[NSString stringWithFormat:@\"%f\", lon.degrees.numerator + ((float)lon.minutes.numerator / (float)lon.minutes.denominator) / 60.0] floatValue];\n\t\n\tif([[latRef substringToIndex:1] isEqualToString:@\"S\"]) coord.latitude = -coord.latitude;\n\tif([[lonRef substringToIndex:1] isEqualToString:@\"W\"]) coord.longitude = -coord.longitude;\n\t\n\treturn coord;\n}\n\n@end\n"
  },
  {
    "path": "EXIF/EXF.h",
    "content": "/*\n *  EXF.h\n *  \n *\n *  Created by steve woodcock on 23/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n */\n\n/*!\n@header EXF.h\n@abstract The group of the entire EXIF API headers\n@discussion These are:\n1) EXFConstants.h\n2) EXFMetaData.h\n3) EXFJFIF.h\n4) EXFJpeg.h\n5) EXFGPS.h\n6) EXFHandlers.h\n\nTo use the framework just use the follwoign import statement \n#import \"EXF.h\"\n*/\n \n/*\nDetails the Constants for the tag Ids, enums etc\n*/\n#import \"EXFConstants.h\"\n\n\n/*\nDetails the EXFObject which represents the meta information of the JPEG image.\n*/\n#import \"EXFMetaData.h\"\n\n/*\nThe JFIF is an alternative meta format used to encode information.\n*/\n#import \"EXFJFIF.h\"\n\n/*\nThe entry point which is used to scan an existing file and reconstruct a new image\n*/\n#import \"EXFJpeg.h\"\n\n/*\nA GPS Location object\n*/\n#import \"EXFGPS.h\"\n\n/*\nThe tag specific handlers which represent special processing required for some tags.\n*/\n#import \"EXFHandlers.h\"\n\n"
  },
  {
    "path": "EXIF/EXFConstants.h",
    "content": "/*\n *  EXFConstants.h\n *  \n *\n *  Created by steve woodcock on 30/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n * Constants used in the EXIF library.\n *\n *\n */\n/*!\n@header EXFConstants.h\n@abstract EXFConstants.h provides the definition of commonly used enums, definitions and basic interfaces.\n*/\n\n/*\nType defs for some of the internal definitions\n*/\n/*!\n@typedef ByteArray  \n*/\ntypedef UInt8 ByteArray;\n\n/*!\n @typedef EXFTagId \n @discussion The data type for tag ids.  \n */\ntypedef UInt16 EXFTagId;\n\n/*!\n@enum EXFDataType\n@abstract The possible types that an EXIF tag data can be specified as.\n@discussion These are the only legal types to be used in the EXFTagDefinition to determine the type of data to be read/written and the number\nof bytes that each data type will then occupy.\n*/\nenum EXFDataType {\n    FMT_BYTE =       1,\n    FMT_STRING  =    2,\n    FMT_USHORT  =    3,\n    FMT_ULONG   =    4,\n    FMT_URATIONAL  = 5,\n    FMT_SBYTE      = 6,\n    FMT_UNDEFINED  = 7,\n    FMT_SSHORT     = 8,\n    FMT_SLONG      = 9,\n    FMT_SRATIONAL  =10,\n    FMT_SINGLE     =11,\n    FMT_DOUBLE     =12\n};\n\n/*!\n @typedef EXFDataType  \n */\n \ntypedef enum EXFDataType EXFDataType;\n\n\n/*\n  EXF Tag Ids \n \n*/\n#define EXIF_ImageWidth                       0x0100     \n#define EXIF_ImageLength                      0x0101     \n#define EXIF_BitsPerSample                    0x0102     \n#define EXIF_Compression                      0x0103     \n#define EXIF_PhotometricInterpretation        0x0106     \n#define EXIF_ImageDescription                 0x010e     \n#define EXIF_Make                             0x010f     \n#define EXIF_Model                            0x0110     \n#define EXIF_StripOffsets                     0x0111     \n#define EXIF_Orientation                      0x0112     \n#define EXIF_SamplesPerPixel                  0x0115     \n#define EXIF_RowsPerStrip                     0x0116     \n#define EXIF_StripByteCounts                  0x0117     \n#define EXIF_XResolution                      0x011a     \n#define EXIF_YResolution                      0x011b     \n#define EXIF_PlanarConfiguration              0x011c     \n#define EXIF_ResolutionUnit                   0x0128\n#define EXIF_Software                         0x0131     \n#define EXIF_DateTime                         0x0132\n#define EXIF_Artist                           0x013b\n#define EXIF_HostComputer                     0x013c\n#define EXIF_Predictor                        0x013d\n#define EXIF_WhitePoint                       0x013e\n#define EXIF_PrimaryChromaticities            0x013f\n#define EXIF_JPEGInterchangeFormat            0x0201\n#define EXIF_JPEGInterchangeFormatLength      0x0202 \n#define EXIF_YCbCrCoefficients                0x0211 \n#define EXIF_YCbCrSubSampling                 0x0212\n#define EXIF_YCbCrPositioning                 0x0213\n#define EXIF_ReferenceBlackWhite              0x0214\n#define EXIF_Copyright                        0x8298\n#define EXIF_Exif                             0x8769      \n#define EXIF_GPS                              0x8825\n#define EXIF_SpectralSensitivity              0x8824\n#define EXIF_ExposureProgram                  0x8822 \n#define EXIF_ISOSpeedratings                  0x8827     \n#define EXIF_ExposureTime                     0x829a     \n#define EXIF_FNumber                          0x829d     \n#define EXIF_ExifVersion                      0x9000     \n#define EXIF_DateTimeOriginal                 0x9003 \n#define EXIF_DateTimeDigitized                0x9004 \n#define EXIF_ComponentsConfiguration          0x9101\n#define EXIF_CompressedBitsPerPixel           0x9102\n#define EXIF_ShutterSpeedValue                0x9201     \n#define EXIF_ApertureValue                    0x9202     \n#define EXIF_BrightnessValue                  0x9203     \n#define EXIF_ExposureBiasValue                0x9204     \n#define EXIF_MaxApertureRatioValue            0x9205     \n#define EXIF_SubjectDistance                  0x9206     \n#define EXIF_MeteringMode                     0x9207     \n#define EXIF_LightSource                      0x9208     \n#define EXIF_Flash                            0x9209     \n#define EXIF_FocalLength                      0x920a\n#define EXIF_MakerNote                        0x927c\n#define EXIF_UserComment                      0x9286\n#define EXIF_SubSecTime                       0x9290     \n#define EXIF_SubSecTimeOriginal               0x9291 \n#define EXIF_SubSecTimeDigitized              0x9292 \n#define EXIF_FileSource                       0xa300 \n#define EXIF_SceneType                        0xa301\n#define EXIF_CFAPattern                       0xa302\n#define EXIF_FlashpixVersion                  0xa000     \n#define EXIF_ColorSpace                       0xa001 \n#define EXIF_PixelXDimension                  0xa002\n#define EXIF_PixelYDimension                  0xa003\n#define EXIF_FocalPlaneXResolution            0xa20e\n#define EXIF_FocalPlaneYResolution            0xa20f\n#define EXIF_FocalPlaneResolutionUnit         0xa210 \n#define EXIF_SubjectLocation                  0xa214\n#define EXIF_ExposureIndex                    0xa215\n#define EXIF_SensingMethod                    0xa217\n#define EXIF_CustomRendered                   0xa401\n#define EXIF_ExposureMode                     0xa402\n#define EXIF_WhiteBalance                     0xa403\n#define EXIF_DigitalZoomRatio                 0xa404\n#define EXIF_FocalLengthIn35mmFilm            0xa405\n#define EXIF_SceneCaptureType                 0xa406\n#define EXIF_GainControl                      0xa407\n#define EXIF_Contrast                         0xa408\n#define EXIF_Saturation                       0xa409\n#define EXIF_Sharpness                        0xa40a\n#define EXIF_DeviceSettingDescription         0xa40b\n#define EXIF_SubjectDistanceRange             0xa40c\n#define EXIF_Gamma                            0xa500\n#define EXIF_GPSVersion                       0x0000  \n#define EXIF_GPSLatitudeRef                   0x0001     \n#define EXIF_GPSLatitude                      0x0002     \n#define EXIF_GPSLongitudeRef                  0x0003     \n#define EXIF_GPSLongitude                     0x0004     \n#define EXIF_GPSAltitudeRef                   0x0005     \n#define EXIF_GPSAltitude                      0x0006     \n#define EXIF_GPSTimeStamp                     0x0007     \n#define EXIF_GPSSatellites                    0x0008     \n#define EXIF_GPSStatus                        0x0009     \n#define EXIF_GPSMeasureMode                   0x000a     \n#define EXIF_GPSDOP                           0x000b     \n#define EXIF_GPSSpeedRef                      0x000c     \n#define EXIF_GPSSpeed                         0x000d     \n#define EXIF_GPSTrackRef                      0x000e     \n#define EXIF_GPSTrack                         0x000f     \n#define EXIF_GPSImgDirectionRef               0x0010     \n#define EXIF_GPSImgDirection                  0x0011     \n#define EXIF_GPSMapDatum                      0x0012     \n#define EXIF_GPSDestLatitudeRef               0x0013     \n#define EXIF_GPSDestLatitude                  0x0014     \n#define EXIF_GPSDestLongitudeRef              0x0015     \n#define EXIF_GPSDestLongitude                 0x0016     \n#define EXIF_GPSDestBearingRef                0x0017     \n#define EXIF_GPSDestBearing                   0x0018     \n#define EXIF_GPSDestDistanceRef               0x0019     \n#define EXIF_GPSDestDistance                  0x001a \n\n\n\n\n/*!\n@class EXFraction\n@abstract A simple fraction class used to store all rational data types\n@discussion The fraction class is used to avoid precision issues when converting from the fraction format stored \nin the JPEG image.   \nThe image data is stored as two longs (numerator and denominator)\n*/\n\n@interface EXFraction: NSObject {\n    \n    long numerator;\n    long denominator;\n}\n\n/*!\n@method initWith\n@abstract initialises the EXFraction with a numerator and denominator\n\n*/\n-(id) initWith: (long) numerator: (long) denominator;\n\n/*!\n @property numerator\n @abstract the numerator part of the fraction\n \n */\n@property (readonly) long numerator;\n\n/*!\n @property denominator\n @abstract the denominator part of the fraction\n \n */\n@property (readonly) long denominator;\n\n/*!\n @method description\n @abstract Returns a String representing the double format of the fraction.\n @discussion If a true representation of the Fraction is required use the accessor methods to retrieve the two \n longs and construct the required format.\n \n */\n-(NSString*) description;\n\n@end\n\n\n/*!\n@class EXFTag\n@abstract Definition data of an EXF Tag\n@discussion The EXFTag consists of an tagId, dataType, shortName, parentTagId, whether it is user editable and the number of \ncomponents that each tag consists of. \n\nThe dataType can only be one of the valid EXFDataType enum values.\nThe shortName is as specified in the EXF specification. If localised or more user readable names are required you should use these \nas the key values to the localised form.\nThe parentTagId shows the hierarchical parent Tag of each EXFTag. This is required in order to work out which directory or subdirectory \na tag value should be inserted into.\nEditable tags are those that can be altered or add by users of the library. Attempting to alter a non-writable tag will result in an exception.\nComponents defines the number of instances of each data type. As each data type is a certain number of bytes the actual byte size occupied \nfor each tag is components * dataType size.\nFor more detail see the EXF specification <a href=\"http://www.exif.org/Exif2-2.PDF\">http://www.exif.org/Exif2-2.PDF</a>\n\n*/\n\n@interface EXFTag : NSObject {\n    \n     \n    EXFTagId tagId;\n    EXFDataType dataType;\n    int parentTagId;\n    NSString* name;\n    BOOL editable;\n    int components;\n    \n}\n\n/*!\n@method initWith\n*/\n\n-(id) initWith: (EXFTagId) aTagId: (EXFDataType)aDataType: (NSString*) aName: (int) parentTagId: (BOOL)editable: (int) components;\n\n\n@property (readonly) EXFTagId tagId;\n@property (readonly) EXFDataType dataType;\n@property (readonly, retain) NSString* name;\n@property (readonly) int parentTagId;\n@property (readonly) BOOL editable;\n@property (readonly) int components;\n\n\n@end\n\n"
  },
  {
    "path": "EXIF/EXFGPS.h",
    "content": "/*!\n   @header EXFGPS Structures\n   Created by steve woodcock on 30/03/2008.\n   @copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n \n @discussion A set of fractions that represent the 3 rational numbers that make up the \n  GPS Location. these are:\n  Degrees\n  Minutes\n  Seconds\n \n  The EXF Specification suggests the location should be displayed as 3 rationals. Although we use fractions \n  to actually represent any stored number without getting precision errors.\n */\n\n#import \"EXFConstants.h\"\n\n/*!\n\t@class EXFGPSLoc\n\t@abstract A GPS Location\n\t@discussion EXFGPSLoc represents a GPS Location. In order to remian aligned to the EXIF format for GPS data, the actual object is \n\tstructured as 3 EXFraction objects, one each for degrees, minutes and seconds. \n\t\n\t\n\t*/\n\n@interface EXFGPSLoc : NSObject {\n    EXFraction* degrees;\n    EXFraction* minutes;\n    EXFraction* seconds;\n}\n\n\n@property (retain) EXFraction* degrees;\n@property (retain) EXFraction* minutes;\n@property (retain) EXFraction* seconds;\n\n-(double) descriptionAsDecimal;\n\n@end\n\n/*!\n\t@class EXFGPSTimeStamp\n\t@abstract A GPS Timestamp\n\t@discussion EXFGPSTimeStamp represents a GPS Timestamp. In order to remian aligned to the EXIF format for GPS data, the actual object is \n\tstructured as 3 EXFraction objects, one each for hours, minutes and seconds. \n\t\n\t\n\t*/\n\n@interface EXFGPSTimeStamp : NSObject {\n    EXFraction* hours;\n    EXFraction* minutes;\n    EXFraction* seconds;\n}\n\n\n@property (retain) EXFraction* hours;\n@property (retain) EXFraction* minutes;\n@property (retain) EXFraction* seconds;\n\n@end"
  },
  {
    "path": "EXIF/EXFGPS.m",
    "content": "/*\n *  EXFGPSLoc.m\n *  \n *\n *  Created by steve woodcock on 30/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n * A set of fractions that represent the 3 rational numbers that make up the \n * GPS Location. these are:\n * Degrees\n * Minutes\n * Seconds\n *\n * The EXF Specification suggests the location should be displayed as 3 rationals. ALthough we use fractions \n * to actually represent any stored number without getting precision errors.\n */\n\n#import \"EXFGPS.h\"\n\n\n\n@implementation EXFGPSLoc\n\n@synthesize degrees;\n@synthesize minutes;\n@synthesize seconds;\n\n-(NSString*) description{\n    \n    return [NSString stringWithFormat:@\"%@\\xC2\\xB0 %@' %@\\\"\",degrees, minutes,seconds];\n}\n\n\n-(double) descriptionAsDecimal{\n\t\t\t\treturn ((double)degrees.numerator/degrees.denominator) +(((double)minutes.numerator/ minutes.denominator)/60) + (((double)seconds.numerator /seconds.denominator)/3600) ;\n}\n\n-(void) dealloc{\n    self.degrees =nil;\n    self.minutes=nil;\n    self.seconds =nil;\n    \n    [super dealloc];\n}\n@end\n\n@implementation EXFGPSTimeStamp\n\n@synthesize hours;\n@synthesize minutes;\n@synthesize seconds; \n\n-(NSString*) description{\n    \n\t\t\t\tNSString* hoursStr = [NSString stringWithFormat:@\"%i\", (int)hours.numerator/hours.denominator];\n\t\t\t\tNSString* minutesStr = [NSString stringWithFormat:@\"%i\", (int)minutes.numerator/minutes.denominator];\n\t\t\t\tNSString* secondsStr = [NSString stringWithFormat:@\"%i\", (int)seconds.numerator/seconds.denominator];\n\t\t\t\t\n\t\t\t\tif ([hoursStr length] ==1){\n\t\t\t\t\t\t\t\thoursStr =  [NSString stringWithFormat:@\"0%@\", hoursStr];\n\t\t\t\t}\n\t\t\t\tif ([minutesStr length] ==1){\n\t\t\t\t\t\t\t\tminutesStr =  [NSString stringWithFormat:@\"0%@\", minutesStr];\n\t\t\t\t}\n\t\t\t\tif ([secondsStr length] ==1){\n\t\t\t\t\t\t\t\tsecondsStr =  [NSString stringWithFormat:@\"0%@\", secondsStr];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\t\t\t\n    return [NSString stringWithFormat:@\"%@:%@:%@\",hoursStr,minutesStr,secondsStr];\n}\n\n-(void) dealloc{\n    self.hours =nil;\n    self.minutes=nil;\n    self.seconds =nil;\n    \n    [super dealloc];\n}\n@end\n"
  },
  {
    "path": "EXIF/EXFHandlers.h",
    "content": "/*!\n  @header EXFTagHandler\n  @copyright 2008. Created by steve woodcock on 30/03/2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n\t\t\t\t@discussion The EXFHandlers are to enable either overriding of default tag handling, or to be able to handle tags that \n  are not recognised by the parser.\n \n  In order to use this the implementation must support the protocol that at the very least provides:\n  1) Decoding the tag data from a byte format\n  2) The size in bytes that the value will occupy\n  3) Whether it will support the object type provided \n  4) Encoding of the value into a byte form\n  5) (Optionally) the tagFomat (see EXFConstants for the tagFormat enumeration)\n  \n \n */\n\n/*!\n\t@protocol EXFTagHandler\n\t@abstract Prtocol defintion for User defined Tag Handlers\n\t*/\n@protocol EXFTagHandler\n\n/*!\n   Decoding of the tag from a byte buffer and insertion into the provided dictionary under the key provided\n */\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder;\n\n-(int) getSizeOfValue:(id)value;\n\n-(BOOL)supportsValueType:(id) value;\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder;\n\n@optional\n\n-(int) tagFormat;\n-(int) parentTagId;\n-(BOOL) isEditable;\n\n@end\n\n/*\n These are the internal Handlers used to provide specialised handling for \n certain tags.\n */\n\n@interface EXFGPSLocationHandler: NSObject<EXFTagHandler>\n\n@end\n\n@interface EXFGPSTimeHandler: NSObject<EXFTagHandler>\n\n@end\n\n@interface EXFTextHandler: NSObject<EXFTagHandler>\n\n@end\n\n@interface EXFASCIIHandler: NSObject<EXFTagHandler>\n\n@end\n\n@interface EXFByteHandler: NSObject<EXFTagHandler>\n@end\n\n@interface  EXFByteArrayHandler: NSObject<EXFTagHandler>\n@end\n"
  },
  {
    "path": "EXIF/EXFHandlers.m",
    "content": "//\n//  EXFHandlers.m\n//  iphone-test\n//\n//  Created by steve woodcock on 30/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"EXFHandlers.h\"\n#import \"EXFUtils.h\"\n#import \"EXFGPS.h\"\n#import \"EXFConstants.h\"\n\n\n\n// character set start byte for for text tags\nconst UInt8 ASCIIChars[8] = {0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00};\nconst UInt8 JISChars[8] =   {0x4a,0x49,0x53,0x00,0x00,0x0,0x00,0x00};\nconst UInt8 UNIChars[8] =  {0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00};\n\n@implementation EXFGPSLocationHandler\n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    \n    // Debug(@\"In timestamp method for %x\",tag);\n    // we first need to get the hours\n    \n    UInt32 num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    ptr +=4;\n    UInt32 denom =  [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    EXFGPSLoc* location = [[EXFGPSLoc alloc] init];\n    \n    EXFraction* value = [[EXFraction alloc] initWith:num :denom];\n    location.degrees =value;\n    [value release];\n    \n    // Debug(@\"Got hours num %i nad denom %i\", num, denom);\n    \n    ptr +=4;\n    \n    num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    ptr+=4;\n    denom = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    value = [[EXFraction alloc] initWith:num :denom];\n    location.minutes =value;\n    [value release];\n    \n    // Debug(@\"Got minutes num %i and denom %i\", num, denom);\n    \n    \n    //  get seconds\n    ptr+=4;\n    num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    ptr+=4;\n    denom = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    // Debug(@\"Got seconds num %i and denom %i\", num, denom);\n    value = [[EXFraction alloc] initWith:num :denom];\n    location.seconds =value;\n    [value release];\n    \n    // Debug(@\"Got Timestamp %@ Degrees %@ Minutes %@ Seconds\",timestamp.degrees , timestamp.minutes,timestamp.seconds);\n    [keyedValues setObject: location forKey: tagId];\n    \n    [location release];\n     \n\n}\n\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    EXFGPSLoc* loc = (EXFGPSLoc*)tagData;\n    \n    \n    [EXFUtils appendFractionToData:targetBuffer :loc.degrees :bigEndianOrder];\n    \n    [EXFUtils appendFractionToData:targetBuffer :loc.minutes :bigEndianOrder];\n    [EXFUtils appendFractionToData:targetBuffer :loc.seconds :bigEndianOrder];\n    \n    \n    \n}\n\n-(BOOL)supportsValueType:(id) value{\n\n    if ([value isKindOfClass:[EXFGPSLoc class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be a GPS Loc\n    return 3;\n}\n\n-(NSString*) description{\n        return @\"GPSLocation Handler\";\n}\n@end\n\n\n@implementation EXFGPSTimeHandler \n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    \n    // Debug(@\"In timestamp method for %x\",tag);\n    // we first need to get the hours\n    \n    UInt32 num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    ptr +=4;\n    UInt32 denom =  [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    EXFGPSTimeStamp* timestamp = [[EXFGPSTimeStamp alloc] init];\n    \n    EXFraction* value = [[EXFraction alloc] initWith:num :denom];\n   \n    timestamp.hours =value;\n    [value release];\n    \n    // Debug(@\"Got hours num %i nad denom %i\", num, denom);\n    \n    ptr +=4;\n    \n    num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    ptr+=4;\n    denom = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    \n    value =  [[EXFraction alloc] initWith:num :denom];\n    timestamp.minutes =value;\n    [value release];\n    \n    // Debug(@\"Got minutes num %i and denom %i\", num, denom);\n    \n    \n    //  get seconds\n    ptr+=4;\n    num = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    ptr+=4;\n    denom = [EXFUtils read4Bytes:&ptr:bigEndianOrder];\n    // Debug(@\"Got seconds num %i and denom %i\", num, denom);\n    value =  [[EXFraction alloc] initWith:num :denom];\n    timestamp.seconds =value;\n    [value release];\n    \n    // Debug(@\"Got Timestamp %@ Degrees %@ Minutes %@ Seconds\",timestamp.degrees , timestamp.minutes,timestamp.seconds);\n    [keyedValues setObject: timestamp forKey: tagId];\n    \n    [timestamp release];\n    \n    \n}\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    EXFGPSTimeStamp* time = (EXFGPSTimeStamp*)tagData;\n    \n\n    [EXFUtils appendFractionToData:targetBuffer :time.hours :bigEndianOrder];\n    \n    [EXFUtils appendFractionToData:targetBuffer :time.minutes :bigEndianOrder];\n    [EXFUtils appendFractionToData:targetBuffer :time.seconds :bigEndianOrder];\n       \n    \n    \n}\n\n-(BOOL)supportsValueType:(id) value{\n    \n    if ([value isKindOfClass:[EXFGPSTimeStamp class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be a GPS Time\n    return 3;\n}\n\n-(NSString*) description{\n    return @\"GPSTime Handler\";\n}\n\n@end\n\n\n@implementation EXFTextHandler\n\n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    \n    // get the first 8 bytes to see the char set\n    // Debug(@\"offset %i\" ,valueOffset);\n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    \n    CFIndex length = CFDataGetLength(*tagData);\n    \n    if (length <9){\n        return;    \n    }\n    \n    UInt8 bytes[8];\n    for(int i=0;i<8;i++){\n        bytes[i]=ptr[i];\n    }\n\n    // Debug(@\"got bytes %x,%x,%x,%x,%x,%x,%x,%x\", bytes[0],bytes[1],bytes[2],bytes[3],bytes[4],bytes[5],bytes[6],bytes[7]);\n    \n    NSStringEncoding encoding = NSASCIIStringEncoding;\n    \n    if (bytes[0] == 0x0 && bytes[1] == 0x0 && bytes[2] == 0x0 &&  bytes[3] == 0x0 && bytes[4] == 0x0 && \n        bytes[5] == 0x0 && bytes[6] == 0x0 && bytes[7] == 0x0  ){\n        // Debug(@\"Undefined charset here\");\n        // we can try ascii here\n         \n        \n    }else if (bytes[0] == JISChars[0] && bytes[1] == JISChars[1] && bytes[2] == JISChars[2] ){\n        encoding = NSShiftJISStringEncoding;\n        // Debug(@\"JIF charset here\");\n    }else if (bytes[0] == UNIChars[0] && bytes[1] == UNIChars[1] && bytes[2] == UNIChars[2] && bytes[3] == UNIChars[3] && \n              bytes[4] == UNIChars[4] && bytes[5] == UNIChars[5] && bytes[6] == UNIChars[6] ){\n        encoding = NSUnicodeStringEncoding;\n        // Debug(@\"Unicode charset\");\n    } else{\n        // Debug(@\"Unknown charset %x,%x,%x,%x,%x,%x,%x,%x\", bytes[0],bytes[1],bytes[2],bytes[3],bytes[4],bytes[5],bytes[6],bytes[7]);\n        encoding = 0;\n    }\n    // now try and create the string\n    if (encoding != 0){\n        UInt8* start_ptr = ptr+8;\n        NSString* string =[EXFUtils newStringFromBuffer:&start_ptr: length-8:encoding];\n        // Debug(@\"Got String in text field %@\", string);\n        [keyedValues setObject: string forKey: tagId];\n        \n        [string release];\n    \n    }\n    \n    \n    \n}\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    int length = [((NSString*)tagData) lengthOfBytesUsingEncoding:NSASCIIStringEncoding];\n    const char* cString = [((NSString*)tagData) cStringUsingEncoding:NSASCIIStringEncoding];\n    [targetBuffer appendBytes:ASCIIChars length:8];\n    [targetBuffer appendBytes: cString length:length];\n    \n    \n}\n-(BOOL)supportsValueType:(id) value{\n    \n    if ([value isKindOfClass:[NSString class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be a GPS Loc\n    if ([value isKindOfClass:[NSString class]]){\n        \n        return[((NSString*)value) lengthOfBytesUsingEncoding:NSASCIIStringEncoding] +8;\n    }\n    return -1;\n    \n}\n\n-(NSString*) description{\n    return @\"EXF Text Handler\";\n}\n\n@end\n\n@implementation EXFASCIIHandler\n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    CFIndex byteLength = CFDataGetLength(*tagData);\n    NSString* value = [EXFUtils newStringFromBuffer:&ptr: byteLength: NSASCIIStringEncoding];\n    // Debug(@\"Assigned string %@\",value);\n    \n    [keyedValues setObject: value forKey: tagId];\n    \n    [value release];\n    \n}\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    int length = [((NSString*)tagData) lengthOfBytesUsingEncoding:NSASCIIStringEncoding];\n    const char* cString = [((NSString*)tagData) cStringUsingEncoding:NSASCIIStringEncoding];\n    [targetBuffer appendBytes: cString length:length];\n    \n    \n}\n\n-(BOOL)supportsValueType:(id) value{\n    \n    if ([value isMemberOfClass:[NSString class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be a GPS Loc\n    if ([value isKindOfClass:[NSString class]]){\n        \n        return[((NSString*)value) lengthOfBytesUsingEncoding:NSASCIIStringEncoding];\n    }else{\n        return -1;\n    }\n}\n\n-(NSString*) description{\n    return @\"EXF ASCII Handler\";\n}\n@end\n\n@implementation EXFByteHandler\n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    NSNumber* num = [[NSNumber alloc] initWithInt: (*ptr) & 0xff] ;\n    [keyedValues setObject: num forKey: tagId];\n    \n    [num release];\n}\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    UInt8 byte[1];\n    \n        byte[0] = (UInt8) [((NSNumber*) tagData) intValue];\n        [targetBuffer appendBytes:byte length:1];\n    \n    \n}\n\n-(BOOL)supportsValueType:(id) value{\n    \n    if ([value isKindOfClass:[NSNumber class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be a GPS Loc\n    if ([value isKindOfClass:[NSNumber class]]){\n        \n        return 1;\n    }else{\n        return -1;\n    }\n}\n\n-(NSString*) description{\n    return @\"EXF Byte Handler\";\n}\n@end\n\n@implementation EXFByteArrayHandler\n\n-(void)decodeTag:(NSMutableDictionary*) keyedValues: (NSNumber*) tagId: (CFDataRef*) tagData: (BOOL) bigEndianOrder{\n    \n    UInt8* ptr = (UInt8*) CFDataGetBytePtr(*tagData);\n    CFIndex byteLength = CFDataGetLength(*tagData);\n    NSMutableArray* byteArray = [[NSMutableArray alloc] init];\n    \n    for (int i =0;i<byteLength;i++){\n        NSNumber* num = [[NSNumber alloc] initWithInt: (*(ptr+i)) & 0xff] ;\n        [byteArray addObject: num];\n        [num release];\n    }\n    // Debug(@\"Assigned string %@\",value);\n    \n    [keyedValues setObject: byteArray forKey: tagId];\n    \n    [byteArray release];\n    \n}\n\n-(void)encodeTag: (NSMutableData*) targetBuffer: (id) tagData:(BOOL) bigEndianOrder{\n    // tag data is an array of NSNumber\n    UInt8 byte[1];\n    for(NSNumber* val in ((NSArray*)tagData)){\n        byte[0] =(UInt8) [val intValue];\n        [targetBuffer appendBytes:byte length:1];\n    }\n    \n}\n\n-(BOOL)supportsValueType:(id) value{\n    \n    if ([value isKindOfClass:[NSArray class]]){\n        return TRUE;\n    }else{\n        return FALSE;\n    }\n}\n\n-(int) getSizeOfValue:(id)value{\n    // value should be an array\n    if ([value isKindOfClass:[NSArray class]]){\n        \n        return [((NSArray*)value) count];\n    }else{\n        return -1;\n    }\n}\n\n-(NSString*) description{\n    return @\"EXF Byte Array Handler\";\n}\n@end\n"
  },
  {
    "path": "EXIF/EXFJFIF.h",
    "content": "//\n//  EXFJFIF.h\n//  iphone-test\n//\n//  Created by steve woodcock on 24/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n\n#define EXIF_JPEGCoding                       0x10     \n#define EXIF_1ByteCoding                      0x11     \n#define EXIF_3ByteCoding                      0x13\n\nenum JFIFUnits {\n    JFIF_NONE =0,\n    JFIF_DPI =     1,\n    JFIF_DPC  =    2\n};\ntypedef enum JFIFUnits JFIFUnits;\n\n@interface EXFJFIF : NSObject {\n\n    NSString* identifier;\n    int length;\n    int resolutionX;\n    int resolutionY;\n    int thumbnailX;\n    int thumbnailY;\n    NSData* thumbnail;\n    NSString* version;\n    JFIFUnits units;\n}\n\n@property (readonly, retain) NSString* identifier;\n@property (readonly, retain) NSString* version;\n\n@property (readonly) int length;\n@property (readonly) int resolutionX;\n@property (readonly) int resolutionY;\n\n@property (readonly) int thumbnailX;\n@property (readonly) int thumbnailY;\n@property (readonly,retain) NSData* thumbnail;\n@property (readonly) JFIFUnits units;\n\n\n\n@end\n"
  },
  {
    "path": "EXIF/EXFJFIF.m",
    "content": "//\n//  EXFJFIF.m\n//  iphone-test\n//\n//  Created by steve woodcock on 24/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"EXFMutableMetaData.h\"\n#import \"EXFLogging.h\"\n\n@implementation EXFJFIF\n\n@synthesize identifier; \n@synthesize version;\n@synthesize length;\n@synthesize resolutionX;\n@synthesize resolutionY;\n\n@synthesize thumbnailX;\n@synthesize thumbnailY;\n\n@synthesize thumbnail;\n@synthesize units;\n\nconst NSString* JFIF_IDENTIFIER = @\"JFIF\\0\";\nconst int JFIF_MIN_LENGTH =14;\n\n-(id) init{\n    if (self = [super init]) {\n        self.identifier =nil;\n        self.version =nil;\n        self.thumbnail =nil;\n        \n        self.length =0;\n    }\n    return self;\n}\n\n-(void) dealloc{\n    self.identifier = nil;\n    self.version =nil;\n    self.thumbnail=nil;\n    \n    [super dealloc];\n}\n\n- (void) parseJfif:(CFDataRef*) theJfifData{\n    \n    CFIndex dataLen = CFDataGetLength(*theJfifData);\n\n    // make sure the data len is big enough for the parsing\n    \n    if (dataLen < JFIF_MIN_LENGTH )\n    {\n        Debug(@\"Length for JFIF is too short at %i\", dataLen);\n        return;\n    }else{\n        int strLen =[JFIF_IDENTIFIER length];\n        // get a pointer in the array\n        UInt8* bytePtr = (UInt8 *) CFDataGetBytePtr(*theJfifData);\n        \n        \n        // get the text identifier\n        NSData* commentData = [NSData dataWithBytes:bytePtr length:strLen]; \n        \n        NSString* comments = [[NSString alloc] initWithBytes:[commentData bytes] length:strLen encoding:NSASCIIStringEncoding];\n            \n        // if identifier is nil or not JFIF then it is some app specific thing that we can skip\n        if (comments != nil &&   ([JFIF_IDENTIFIER compare: comments] == NSOrderedSame)){\n        \n            self.length = dataLen;\n            \n            self.identifier =comments;\n             \n             // get the version\n             UInt8 majorVersion = bytePtr[strLen];\n             UInt8 minorVersion = bytePtr[strLen+1];\n             NSString* ver = [[NSString alloc] initWithFormat:@\"%x.%x\",majorVersion, minorVersion];\n             self.version = ver;\n             [ver release];\n             \n           \n            // get the units\n            self.units = bytePtr[strLen+2];\n            \n            //JFIF is always big endian\n            \n            \n            \n            self.resolutionX = ((bytePtr[strLen+3] << 8) | bytePtr[strLen+4]);\n           \n            self.resolutionY =((bytePtr[strLen+5] << 8) | bytePtr[strLen+6]);\n            \n            \n            // get the thumbnail data\n            \n            self.thumbnailX = bytePtr[strLen+7];\n            self.thumbnailY = bytePtr[strLen+8];\n            \n            if (self.thumbnailX  !=0 && self.thumbnailY != 0){\n                // thumbnail is 3n where n = thumbnailX x thumnailY\n                long thumbnailBytes = 3 * (self.thumbnailX * self.thumbnailY);\n                \n                // see if the data len is enough for the image\n                if (thumbnailBytes == (dataLen -JFIF_MIN_LENGTH)){\n                    NSData* thumbnailData = [NSData dataWithBytes: &bytePtr[JFIF_MIN_LENGTH] length:thumbnailBytes]; \n                    self.thumbnail = thumbnailData;\n                }else{\n                    Debug(@\"Thumbnail bytes %i is not equal to data length remaining %i\", thumbnailBytes,dataLen -JFIF_MIN_LENGTH);\n                }\n            }\n            \n            }\n        // release our comments string\n        [comments release];\n    }\n    \n    \n     \n}\n\n\n\n@end\n"
  },
  {
    "path": "EXIF/EXFJpeg.h",
    "content": "/*\n *  EXFJpeg.h\n *  iphoneGeo\n *\n *  Created by steve woodcock on 30/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n * The EXFJpeg object is used to scan the original image in order to extract the JFIF/EXIF data and \n * following any changes to the EXIF object will return the bytes representing the new image.\n */\n\n#import \"EXFMetaData.h\"\n#import \"EXFJFIF.h\"\n#import \"EXFJpeg.h\"\n#import \"EXFConstants.h\"\n\n\n@interface EXFJpeg : NSObject {\n    \n    // stores length of the image in bytes\n    CFIndex imageLength;\n    \n    // pointer to the start of the image byte array\n    ByteArray* imageStartPtr;\n    \n    // pointer to the current parsing point in the byte array \n    ByteArray* imageBytePtr;\n    \n    // A dictionary of the EXIF blocks in the file that have been parsed\n    NSMutableDictionary* keyedHeaders;\n    \n    // The EXF MetaData image attributes \n    EXFMetaData* exifMetaData;\n    \n    // Image attributes outside EXIF in the Components section of the file\n    int numComponents;\n\n   // The JFIF MetaData image attributes \n    EXFJFIF* jfif;\n\t\t\t\t\n\t\t\t\tNSData* remainingData;\n} \n\n/*\n Returns the EXIF MetaData object. \n*/\n@property (readonly, retain) EXFMetaData* exifMetaData;\n\n/*\n Returns the JFIF Meta Data of a scanned Image\n*/\n@property (readonly, retain) EXFJFIF* jfif;\n\n\n/*\n Scans the Image Data\n*/\n-(void) scanImageData:(NSData*) imageData;\n\n/*\n Returns the image byte array for the new image with amended data\n*/\n-(void) populateImageData: (NSMutableData*) newImageData;\n\n\n@end\n"
  },
  {
    "path": "EXIF/EXFJpeg.m",
    "content": "//\n//  Jpeg.m\n//  iphone-test\n//\n//  Created by steve woodcock on 10/03/2008.\n//  Copyright 2008 __MyCompanyName__. All rights reserved.\n//\n\n#import \"EXFJpeg.h\"\n#import \"EXFLogging.h\"\n#import \"EXFConstants.h\"\n#import \"EXFMutableMetaData.h\"\n#import \"EXFUtils.h\"\n\n#define M_BEG\t0xff\t/* Start of marker. Used for all markers tags in format ffxx */\n\n/*The next set of bytes define the second part of the tag - e.g the xx part */\n\n/* Start of image. This is the first tag in the file after the header */\n#define M_SOI\t0xd8\t\n\n/* The app tags store the extra dat - usually we expect to see only app1 (and optionally app2) - but other apps could be \n present */\n#define M_APP0\t0xe0\t/* APP0 marker. */\n#define M_APP1\t0xe1\t/* APP1 marker. */\n#define M_APP2\t0xe2\t/* APP2 marker. */\n#define M_APP3\t0xe3\t/* APP3 marker. */\n#define M_APP4\t0xe4\t/* APP4 marker. */\n#define M_APP5\t0xe5\t/* APP5 marker. */\n#define M_APP6\t0xe6\t/* APP6 marker. */\n#define M_APP7\t0xe7\t/* APP7 marker. */\n#define M_APP8\t0xe8\t/* APP8 marker. */\n#define M_APP9\t0xe9\t/* APP9 marker. */\n#define M_APP10\t0xea\t/* APP10 marker. */\n#define M_APP11\t0xeb\t/* APP11 marker. */\n#define M_APP12\t0xec\t/* APP12 marker. */\n#define M_APP13\t0xed\t/* APP13 marker. */\n#define M_APP14\t0xee\t/* APP14 marker. */\n#define M_APP15\t0xef\t/* APP15 marker. */\n\n#define M_DQT\t0xdb\t/* Quantatization Table. */\n#define M_DHT\t0xc4\t/* Huffman Table. */\n#define M_DRI\t0xdd\t/* Restart Interoperability. */\n\n/* Start of frame of image data... */\n#define M_SOF0\t0xc0\t\n#define M_SOF1\t0xc1\n#define M_SOF2\t0xc2\n#define M_SOF3\t0xc3\n#define M_SOF5\t0xc5\n#define M_SOF6\t0xc6\n#define M_SOF7\t0xc7\n#define M_SOF9\t0xc9\n#define M_SOF10\t0xca\n#define M_SOF11\t0xcb\n#define M_SOF13\t0xcd\n#define M_SOF14\t0xce\n#define M_SOF15\t0xcf\n\n#define M_SOS\t0xda\t/* Start of scan. */\n\n#define M_EOI\t0xd9\t/* End of image. */\n\n\n#define M_ERR\t0x100\n\n#define M_COM\t0xfe\n\n@interface EXFJpeg ()\n    @property (readwrite, retain) NSMutableDictionary* keyedHeaders;\n    @property (readwrite, retain) EXFMetaData* exifMetaData;\n    @property (readwrite, retain) EXFJFIF* jfif;\n\t\t\t\t@property (readwrite, retain) NSData* remainingData;\n@end\n\n@implementation EXFJpeg\n\n@synthesize keyedHeaders;\n@synthesize exifMetaData;\n@synthesize jfif;\n@synthesize remainingData;\n\n-(id) init {\n    if (self = [super init]) {\n\t\t// Initializeyour own data\n        NSMutableDictionary* headerDictionary = [[NSMutableDictionary alloc] init];\n        self.keyedHeaders =headerDictionary;\n        [headerDictionary release];\n        \n        EXFMetaData* exifParam =[[EXFMetaData alloc]init];\n        self.exifMetaData = exifParam;\n        [exifParam release];\n        \n        self.jfif =nil;\n        \n        // initialise pointers\n        imageBytePtr =NULL;\n        imageStartPtr =NULL;\n        \n\t}\n\treturn self;\n        \n    \n}\n\n-(void) dealloc{\n    \n    self.keyedHeaders = nil;\n    self.exifMetaData = nil;\n    self.jfif =nil;\n    self.remainingData =nil;\n\t\t\t\t\n    imageBytePtr =NULL;\n    imageStartPtr =NULL;\n    \n    // release super class\n    [super dealloc];\n}\n\n\n-(bool) imageLengthCheck:(int) length{\n\n    int remaining = imageLength -(imageBytePtr - imageStartPtr);\n    return (length < remaining);\n    \n}\n\n- (void) skipBytes: (int) bytes\n{\n\t  \n    // increment to leave us at the next byte\n    *(imageBytePtr+=bytes);\n\t\n}\n\n- (UInt8) readNextbyte\n{\n\tUInt8 byte;\n    // increment the marker ptr\n    \n\tbyte = *(imageBytePtr);\n    \n    // increment to leave us at the next byte\n    *(imageBytePtr++);\n    return byte;\n\t\n}\n\n\n- (int) readNext2bytes\n{\n\tUInt8 b1, b2;\n    // increment the marker ptr\n   \n\tb1 = *imageBytePtr;\n   \n    // get the next value\n    *(imageBytePtr++);\n    b2 = *imageBytePtr;\n\n    *(imageBytePtr++);\n    // return the values we have got\n    return ((b1 << 8) | b2);\n\t\n}\n\n\n\n-(UInt8) nextMarker {\n    UInt8 val = [self readNextbyte];\n    \n    /* Find 0xFF byte; count and skip any non-FFs. */\n    while (val != M_BEG){\n        val =  [self readNextbyte];\n    }\n    \n    \n    do {\n        val =  [self readNextbyte];\n    } while(val == M_BEG);\n    \n    // increment to one after\n    return val;\n}\n\n- (void) readImageInfo \n{\n\tint len = [self readNext2bytes] - 2;\n    \n\tif (len < 0 ){\n\t   // throw new JpegException(\"Erroneous JPEG marker length\");\n        NSLog(@\"ERROR: Length is negative in reading image info \");\n        return;\n    }\n    \n    if (len > imageLength){\n        NSLog(@\"ERROR: Length is bigger than image length \");\n        return;\n    }\n    \n    Warn(@\"Length in image info %i \",len);\n    \n\tint bitsPerPixel = [self readNextbyte]; len--;\n   \n\tint height = [self readNext2bytes]; len -= 2;\n\tint width = [self readNext2bytes]; len -= 2;\n    \n\tnumComponents = [self readNextbyte]; len--;\n    \n    Warn(@\"Skipping length %i\", len);\n    //skip over the remainder length - how do we check the length here?\n     *(imageBytePtr += len);\n    \n    // set them into EXIF Data\n    self.exifMetaData.height = height;\n    self.exifMetaData.width =width;\n    self.exifMetaData.bitsPerPixel = bitsPerPixel;\n    \n\t\n}\n\n/**\n * skip the body after a marker\n */\n- (void) skipVariable \n{\n\tint len = [self readNext2bytes] - 2;\n    \n\tif (len < 0 ){\n        NSLog(@\"Error in skip variable length\");\n        return;\n    }\n    if (![self imageLengthCheck:len]){\n        NSLog(@\"ERROR: Length is bigger than image length \");\n        return;\n    }\n    \n\t// skip the rest\n    \n     Warn(@\"Skipping length %i\", len);\n    //skip over the remainder length - how do we check the length here?\n    *(imageBytePtr += len);\n}\n\n\n- (NSData*) processComment\n{\n\tint length;\n    \n\t/* Get the marker parameter length count */\n\tlength = [self readNext2bytes];\n \n\t Debug(@\"Got length of comment of %i\", length);\n    \n    /* Length includes itself, so must be at least 2 */\n\tif (length < 2)\n    {\n        Debug(@\"length must be at least 2\");\n        // make sure we do not overun the image length\n        \n    }\n    if (![self imageLengthCheck:length]){\n        NSLog(@\"ERROR: Length is bigger than image length \");\n        return nil;\n    }\n    \n    length -=2;\n    \n   \n    \n    // get the comment characters - currently use iso latin - could this be different?\n\n   \n    NSData* commentData = [NSData dataWithBytes:imageBytePtr length:length]; \n    \n    Debug(@\"comment data without length 2 bytes %i\", [commentData length]);\n    // skip the bytes we have just read\n    [self skipBytes:length];\n   \n    return commentData;\n   }\n\n\n-(void) parseExif:(CFDataRef*) exifData\n{\n    \n    [self.exifMetaData parseExif:exifData];\n    \n}\n\n-(void) parseJfif:(CFDataRef*) jfifData\n{\n    // we only need to set the jfif if it is a recognized one\n    EXFJFIF* localJfif =[[EXFJFIF alloc]init];\n   \n    \n    [localJfif parseJfif:jfifData];\n     \n    if (localJfif.identifier != nil){\n    \n        self.jfif = localJfif;\n    }\n    [localJfif release];\n    \n    // we may need to add the additional stuff here for jfif extensions\n    \n}\n\n\n-(void) scanImageData: (NSData*) jpegData {\n\n    Debug(@\"Starting scan headers\");\n\n    // pointer to the end of the EXIF Data and the start of the rest of the image\n    ByteArray* endOfEXFPtr = NULL;\n   \n    imageLength = CFDataGetLength((CFDataRef)jpegData);\n    \n   // CFRetain(&imageLength);\n    \n    Debug(@\"Length of image %i\", imageLength);\n    \n    imageBytePtr = (UInt8 *) CFDataGetBytePtr((CFDataRef)jpegData);\n    imageStartPtr = imageBytePtr;\n    \n    // check if a valid jpeg file\n    UInt8 val = [self readNextbyte];\n    \n    if (val != M_BEG){\n         Debug(@\"Not a valid JPEG File\");\n        return;\n    }\n     \n    val = [self readNextbyte];\n    \n    if (val != M_SOI){\n        Debug(@\"Not a valid start of image JPEG File\");\n        return;\n    }\n   \n   \n    // increment this to position after second byte\n    BOOL finished =FALSE;\n\t\t\t\t\n    while(!finished){\n        // increment the marker\n        \n        val = [self nextMarker];\n        \n        Debug(@\"Got next marker %x at byte count %i\", val, (imageBytePtr - imageStartPtr));\n        \n        switch(val){\n                case M_SOF0:\t /* Baseline */\n                case M_SOF1:\t /* Extended sequential, Huffman */\n                case M_SOF2:\t /* Progressive, Huffman */\n                case M_SOF3:\t /* Lossless, Huffman */\n                case M_SOF5:\t /* Differential sequential, Huffman */\n                case M_SOF6:\t /* Differential progressive, Huffman */\n                case M_SOF7:\t /* Differential lossless, Huffman */\n                case M_SOF9:\t /* Extended sequential, arithmetic */\n                case M_SOF10:\t /* Progressive, arithmetic */\n                case M_SOF11:\t /* Lossless, arithmetic */\n                case M_SOF13:\t /* Differential sequential, arithmetic */\n                case M_SOF14:\t /* Differential progressive, arithmetic */\n                case M_SOF15:\t /* Differential lossless, arithmetic */\n                    // Remember the kind of compression we saw\n                    {\n                        int compression = *imageBytePtr;\n                        self.exifMetaData.compression = compression;\n                        \n                        // Get the intrinsic properties fo the image\n                        [self readImageInfo];\n                    }\n                    break;\n                \n               case M_SOS:\t /* stop before hitting compressed data */\n                Debug(@\"Found SOS at %i\", imageBytePtr - imageStartPtr);\n              //  [self skipVariable];\n              \n                // Update the EXIF\n             //  updateExif();\n                    finished = TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n               case M_EOI:\t /* in case it's a tables-only JPEG stream */\n                    Debug(@\"End of Image reached at %i \", imageBytePtr - imageStartPtr);\n                    finished =TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n               case M_COM:\n                    Debug(@\"Got com  at %i\",imageBytePtr - imageStartPtr);\n                    break;\n                \n               case M_APP0:\n               case M_APP1:\n               case M_APP2:\n               case M_APP3:\n               case M_APP4:\n               case M_APP5:\n               case M_APP6:\n               case M_APP7:\n               case M_APP8:\n               case M_APP9:\n               case M_APP10:\n               case M_APP11:\n               case M_APP12:\n               case M_APP13:\n               case M_APP14:\n               case M_APP15:\n               // Some digital camera makers put useful textual\n               // information into APP1 and APP12 markers, so we print\n               // those out too when in -verbose mode.\n                {\n                    Debug(@\"Found app %x at %i\", val, imageBytePtr - imageStartPtr);\n                    \n                    \n                    NSData* commentData = [self processComment];\n                    NSNumber* key = [[NSNumber alloc]initWithInt:val];\n \n                    // add comments to dictionary\n                    [self.keyedHeaders  setObject:commentData forKey:key];\n                    [key release];\n                    // will always mark the end of the app_x block\n                    endOfEXFPtr = imageBytePtr;\n                     \n                    // we pass a pointer to the NSData pointer here\n                    if (val == M_APP0){\n                         Debug(@\"Parsing JFIF APP_0 at %i\", imageBytePtr - imageStartPtr);\n                        [self parseJfif:(CFDataRef*)&commentData];\n                    } else if (val == M_APP1){\n                        [self parseExif:(CFDataRef*)&commentData];\n                        Debug(@\"Finished App1 at %i\", endOfEXFPtr - imageStartPtr);\n                    } else if (val == M_APP2){\n                        Debug(@\"Finished APP2 at %i\", imageBytePtr - imageStartPtr);\n                    }else{\n                        Debug(@\"Finished App &x at %i\", val, imageBytePtr - imageStartPtr);\n                    }\n                    \n                }\n               \n               \n               break;\n            case M_SOI:\n                Debug(@\"SOI encountered at %i\",imageBytePtr - imageStartPtr);\n                \n                break;\n               default:\t          // Anything else just gets skipped\n                Debug(@\"NOt handled %x skipping at %i\",val, imageBytePtr - imageStartPtr);\n                [self skipVariable];  // we assume it has a parameter count...\n               break;\n               }     \n               \n        }\n        \n        \n    \n    // add in the bytes after the exf block\n\t\t\t\tNSData* theRemainingdata = [[NSData alloc] initWithBytes:endOfEXFPtr length:imageLength - (endOfEXFPtr - imageStartPtr)];\n    self.remainingData = theRemainingdata;\n\t\t\t\t[theRemainingdata release];\n\t\t\t\t\n\t\t\t\tendOfEXFPtr = NULL;\n\t\t\t\timageStartPtr = NULL;\n\t\t\t\timageBytePtr = NULL;\n\t\t\t\t\n}\n\n-(void) populateImageData: (NSMutableData*) newImage {\n    \n    if (newImage ==nil){\n\t\t\t\t\t\t\t\tNSLog(@\"Image array cannot be null\");\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t}\n    \n    UInt8 bytes[4];\n    UInt8* ptr = bytes;\n     \n    bytes[0] = M_BEG;\n    bytes[1] = M_SOI;\n    bytes [2] = bytes[3] =0;\n    [newImage appendBytes:ptr length: 2];\n    \n    for (int i =0xe0;i<0xf0;i++){\n    // use the values we have parsed for M_APP1\n        if (i == M_APP1){\n            if ([exifMetaData.keyedTagValues count] !=0){\n                bytes[0] = M_BEG;\n                bytes[1] = (UInt8) i;\n                bytes[2] = bytes[3] = 0;\n                [newImage appendBytes:ptr length:4];\n                \n                int initialSize = [newImage length] -2;\n                \n                Debug(@\"Image length before is now %i\",initialSize);\n                \n                \n                // process the EXF Data and write into the image\n                [exifMetaData getData: newImage];\n                \n                // calculate the block size\n                \n                UInt8* ptr = bytes;\n                \n                [EXFUtils write2Bytes:&ptr :[NSNumber numberWithInt:[newImage length] -initialSize]:TRUE];\n                // now append this to the writer\n                [newImage replaceBytesInRange:NSMakeRange(initialSize, 2) withBytes:bytes];\n                \n                Debug(@\"Image length after exif is now %i\",[newImage length]);\n                \n            } \n            \n        }else{\n            NSNumber* key = [[NSNumber alloc] initWithInt:i];\n            NSData* data = [keyedHeaders objectForKey:key];\n            if (data != nil){\n                Debug(@\"writing app %x with length %i to image\",i,[data length] +2);\n                [EXFUtils write2Bytes: &ptr:[NSNumber numberWithInt:[data length]+2] :TRUE];\n                bytes[2] = bytes[0];\n                bytes[3] = bytes[1];\n                bytes[0] = M_BEG;\n                bytes[1] = (UInt8) i;\n                \n                [newImage appendBytes:ptr length:4];\n                [newImage appendData:data];\n            }\n            [key release];\n        }\n    }\n     \n    NSLog(@\"About to append remaining data\");\n    // add in the bytes after the exf block\n    [newImage appendData:self.remainingData];\n    \n\t\t\t\n     Debug(@\"new Image length is now %i - original image length %i\",[newImage length], imageLength);   \n}\n\n@end\n"
  },
  {
    "path": "EXIF/EXFLogging.h",
    "content": "/*\n *  logging.h\n * \n *\n *  Created by steve woodcock on 28/02/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n */\n\n// Logging.h\n//extern BOOL gLogging;\n#define Debug(FMT,...)  /*NSLog(@\"DEBUG: \" FMT, ##__VA_ARGS__)*/\n#define Warn(FMT,...)   /*NSLog(@\"WARNING: \" FMT, ##__VA_ARGS__)*/"
  },
  {
    "path": "EXIF/EXFMetaData.h",
    "content": "/*\n *  EXFMetaData.h\n *  iphoneGeo\n *\n *  Created by steve woodcock on 30/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n * The EXFMetaData stores the EXIF Meta Data itself, as well as the meta data and bytes of the thumbnail image if there is one.\n * \n * \n */\n\n#import \"EXFTagDefinitionHolder.h\"\n#import \"EXFConstants.h\"\n#import \"EXFHandlers.h\"\n\n\n@interface EXFMetaData : NSObject {\n    \n    // endian ordering for image\n    BOOL bigEndianOrder;\n    \n    // Dictionary of special tag handlers\n    NSMutableDictionary* keyedHandlers; \n    \n    // Dictionary of user supplied handlers\n    NSMutableDictionary* userKeyedHandlers;\n    \n    // dictionary of parsed EXIF Data\n    NSMutableDictionary* keyedTagValues;\n     \n    // Dictionary of parsed Thumbnail EXIF Data\n    NSMutableDictionary* keyedThumbnailTagValues;\n     \n    // pointer to byte array of EXIF Block\n    ByteArray* exif_ptr;\n    \n    // The NSByte array for the thumbnail data\n    NSData* thumbnailBytes;\n    \n    // tag definitions\n    EXFTagDefinitionHolder* tagDefinitions;\n    \n    // Image attributes outside EXIF\n    int compression;\n    int bitsPerPixel;\n    int height;\n    int width;\n    int numComponents;\n    \n    // length of image\n    CFIndex byteLength;\n}\n\n/*\n Add a user specified handler prior to parsing the data. Allows over-ride of existing behaviour or \n handling of tags that are not in the EXIF spec.\n \n The handler will throw an NSException if:\n 1) the Key is not a valid Number\n 2) The tag handler is nil\n 3) The tag handler does not conform to the EXFHandler protocol\n 4) The handler attempts to override one for the container tags that contains other tags\n 5) The handler does not conform to the optional part of the protocol if is being used to handle a tag that is not already defined.\n 6) The handler returns an invalid parent Id or tagformat if it supports the optional part of the protocol\n */\n-(void) addHandler:(id<EXFTagHandler>) aTagHandler forKey:(NSNumber*) aKey;\n\n/*\n Remove a handler. Note this only removes user handlers and cannot be used to remove a built in handler\n */\n-(void) removeHandler: (NSNumber*) aKey;\n\n/*\n Removes all user handlers.\n */\n-(void) removeAllHandlers;\n\n\n// Returns a tag definition for a particular tag\n- (EXFTag*) tagDefinition: (NSNumber*)aTagId ;\n\n//returns all keys for parent id\n-(NSMutableArray*) tagDefinitionsForParent:(NSNumber*) parent withoutImmutable:(BOOL) includeImmutable ;\n\n// Gets the tag value from a parsed file (if any)\n- (id) tagValue: (NSNumber*)aTagId; \n\n\n// Gets the thumbnail tag value from a parsed file (if any)\n- (id) thumbnailTagValue: (NSNumber*)aTagId;\n\n\n-(void) addTagValue:(id)value forKey:(NSNumber*) atagKey;\n\n-(void) removeTagValue:(NSNumber*) atagKey;\n\n// returns the tag definitions for the EXIF Data\n@property (readonly,retain) NSDictionary* keyedTagDefinitions;\n\n// The parsed Exif tag values.\n@property (readonly,retain) NSMutableDictionary* keyedTagValues;\n\n// The parsed Exif thumbnail values\n@property (readonly,retain) NSMutableDictionary* keyedThumbnailTagValues;\n\n// The thumbnail bytes if any\n@property (readonly,retain) NSData* thumbnailBytes;\n\n// Compression value\n@property (readonly) int compression;\n\n// bits per pixel\n@property (readonly) int bitsPerPixel;\n\n// image height\n@property (readonly) int height;\n\n// image width\n@property (readonly) int width;\n\n// byte length\n@property (readonly) CFIndex byteLength;\n\n// byte order\n@property (readonly) BOOL bigEndianOrder;\n@end\n\n\n\n"
  },
  {
    "path": "EXIF/EXFMetaData.m",
    "content": "//\n//  Exif.m\n//  iphone-test\n//\n//  Created by steve woodcock on 14/03/2008.\n//  Copyright 2008. All rights reserved.\n//\n\n\n#import \"EXFMutableMetaData.h\"\n#import \"EXFLogging.h\"\n#import \"EXFGPS.h\"\n#import \"EXFConstants.h\"\n#import \"EXFUtils.h\"\n\n\n\n@implementation EXFraction\n\n-(id) initWith: (long) aNumerator : (long) aDenominator{\n    \n     if (self = [super init]) {\n         numerator = aNumerator;\n         denominator = aDenominator;\n     }\n    return self;\n}\n\n\n@synthesize numerator;\n@synthesize denominator;\n\n-(NSString*) description{\n    \n    return [NSString stringWithFormat:@\"%@\",[NSNumber numberWithDouble:(double)numerator/(double) denominator]];\n}\n@end\n\n\n@interface EXFTag ()\n@property (readwrite) EXFTagId tagId;\n@property (readwrite) int parentTagId;\n@property (readwrite) EXFDataType dataType;\n@property (readwrite, retain) NSString* name;\n@property (readwrite) BOOL editable;\n@property (readwrite) int components;\n@end\n\n\n@interface EXFWriter : NSObject {\n    NSMutableData* tagData;\n    NSMutableData* overflowData;\n    }\n@property (readwrite, retain) NSMutableData* tagData;\n@property (readwrite, retain) NSMutableData* overflowData;\n@property (readonly) int blockLength;\n@end\n\n\n@implementation EXFTag\n\n@synthesize tagId;\n@synthesize parentTagId;\n@synthesize dataType;\n@synthesize name;\n@synthesize editable;\n@synthesize components;\n\n-(id) initWith: (EXFTagId) aTag: (EXFDataType)aDataType: (NSString*) aName : (int) aParentTagId: (BOOL)isEditable: (int)theComponets{\n    if (self = [super init]) {\n        self.tagId = aTag;\n        self.dataType = aDataType;\n        self.name =aName;\n        self.parentTagId = aParentTagId;\n        self.editable = isEditable;\n        self.components = theComponets;\n    }\n    return self;\n}\n\n-(void) dealloc{\n    self.name = nil;\n    [super dealloc];\n}\n\n@end\n\n@implementation EXFWriter\n\n@synthesize tagData;\n@synthesize overflowData;\n\n-(id) init{\nif (self = [super init]) {\n    NSMutableData* theData = [[NSMutableData alloc] init];\n    self.tagData = theData;\n    [theData release];\n    \n    NSMutableData* theOverflow = [[NSMutableData alloc] init];\n    self.overflowData = theOverflow;\n    [theOverflow release];\n    }\n    return self;\n}\n\n-(int) blockLength {\n    // length of block in 2 bytes at start of tagData\n    int temp =0;\n    temp += [tagData length];\n    temp += [overflowData length];\n    return temp;\n    \n    }\n\n\n-(void) dealloc{\n    self.tagData = nil;\n    self.overflowData = nil;\n    [super dealloc];\n}\n\n@end\n    \n\n\n\n@implementation EXFMetaData \n\n@synthesize  compression;\n@synthesize bitsPerPixel;\n@synthesize height;\n@synthesize  width;\n@synthesize  byteLength;\n@synthesize  bigEndianOrder;\n@synthesize  exif_ptr;\n\n@synthesize userKeyedHandlers;\n@synthesize keyedTagValues;\n@synthesize keyedHandlers;\n@synthesize tagDefinitions;\n@synthesize  keyedThumbnailTagValues;\n@synthesize thumbnailBytes;\n\n// start of Exif String\nconst UInt8 exifChars[5] = {0x45,0x78,0x69,0x66,0x00};\n \n// Big endian or Little endian constant chars\nconst UInt8 M_ORDER = 0x4d;\nconst UInt8 I_ORDER = 0x49;\n\n// tag constants\nconst UInt16 bytesPerFormat[] = {0,1,1,2,4,8,1,1,2,4,8,4,8};\n\n// Tags that have nested tag sets\nconst int TAG_EXIF_ROOT = -1;\nconst UInt16 TAG_EXIF_OFFSET = 0x8769;\nconst UInt16 TAG_INTEROP_OFFSET = 0xa005;\nconst UInt16 TAG_EXIF_GPS = 0x8825;\n\n\n// allowed substitutes\nconst NSString* typeMappings [13] ={@\"\",@\"CciISs\",@\"NSString\",@\"SsCcIi\",@\"LlIiSsCc\",@\"EXFraction\",@\"cCiISs\", @\"NSData\", @\"IisSCc\",@\"LlIiSsCc\",@\"EXFraction\",@\"EXFraction\",@\"EXFraction\"};\n\n-(EXFTag*) tagDefinition: (NSNumber*) aTagId{\n    return [self.tagDefinitions.definitions objectForKey:aTagId];\n}\n  \n-(NSMutableArray*) tagDefinitionsForParent:(NSNumber*) parent withoutImmutable:(BOOL) includeImmutable {\n\t\t\t\t\n\t\t\t\t// see if a sub array\n\t\t\t\tNSMutableArray* returnArray = [NSMutableArray arrayWithCapacity:[self.tagDefinitions.definitions count]];\n\t\t\t\t\n\t\t\t\tNSArray* keys = [self.tagDefinitions.definitions allKeys];\n\t\t\t\t\n\t\t\t\tfor(id key in keys){\n\t\t\t\t\t\t\t\tEXFTag* tag = [self.tagDefinitions.definitions objectForKey:key];\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif ([tag parentTagId] == [parent intValue]){\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif ([tag editable]){\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[returnArray addObject:tag];\n\t\t\t\t\t\t\t\t\t\t\t\t}else if (includeImmutable){\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[returnArray addObject:tag];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\treturn returnArray;\n\t\t\t\t\n}\n\n-(id) tagValue: (NSNumber*) aTagId{\n    // in order - first try and get the tag definition to find parent\n    \n    id value = [self.keyedTagValues objectForKey:aTagId];\n    \n    if (value == nil){\n    \n       EXFTag* tag = [self.tagDefinitions.definitions objectForKey:aTagId];\n       \n       if (tag != nil){\n           NSDictionary* dict = [self.keyedTagValues objectForKey:[NSNumber numberWithInt: tag.parentTagId]];\n           if (dict != nil){\n               value = [dict objectForKey:aTagId];\n           }\n           \n       }else{\n            NSDictionary* dict = [self.keyedTagValues objectForKey:[NSNumber numberWithInt: EXIF_GPS ]];\n            value = [dict objectForKey:aTagId];\n            \n            if (value ==nil){\n                dict = [self.keyedTagValues objectForKey:[NSNumber numberWithInt: EXIF_Exif]];\n                value = [dict objectForKey:aTagId];\n            }\n       }\n       // try the geo and then the \n       // \n\n        \n\n    }\n    return value;\n   \n}\n\n\n-(id) thumbnailTagValue: (NSNumber*) aTagId{\n    return [self.keyedThumbnailTagValues objectForKey:aTagId];\n}\n\n/* End of setter and getter methods */\n\n\n\n/* Add the handler to the handler dictionary */\n\n-(void) addHandler:(id)handler: (UInt16) keyValue{\n    \n    NSNumber* _key =nil;\n    // add the invocation into the handler map\n     _key = [[NSNumber alloc] initWithUnsignedInt:keyValue];\n    \n    [self.keyedHandlers setObject:handler forKey: _key];\n    \n       \n    // release number objects\n\n    [_key release];\n   \n    \n}\n\n/* Set up the handlers we know about. */\n\n-(void) setupHandlers{\n    \n    // Set up the GPS location handlers\n    EXFGPSLocationHandler* locationHandler = [[EXFGPSLocationHandler alloc] init];\n    [self addHandler:locationHandler :EXIF_GPSLatitude];   \n    [self addHandler:locationHandler :EXIF_GPSLongitude];\n    [self addHandler:locationHandler :EXIF_GPSDestLatitude];    \n    [self addHandler:locationHandler :EXIF_GPSDestLongitude];\n    [locationHandler release];\n    \n    // do the gps timestamp\n    EXFGPSTimeHandler* timeHandler = [[EXFGPSTimeHandler alloc] init];\n    [self addHandler:timeHandler :EXIF_GPSTimeStamp];\n    [timeHandler release];\n   \n  \n   \n    // do the char set tags\n    EXFTextHandler* textHandler = [[EXFTextHandler alloc] init];\n    [self addHandler:textHandler :EXIF_UserComment];\n    [textHandler release];\n\n    \n    // Set up the ascii handlers\n    EXFASCIIHandler* asciiHandler = [[EXFASCIIHandler alloc] init];\n    [self addHandler:asciiHandler :EXIF_ExifVersion];\n    [self addHandler:asciiHandler :EXIF_FlashpixVersion];\n    [asciiHandler release];\n    \n    \n    // set up the byte handler for individual bytes and undefined tag types\n    EXFByteHandler* byteHandler = [[EXFByteHandler alloc] init];\n    [self addHandler:byteHandler :EXIF_FileSource]; \n    [byteHandler release];\n    \n    // byte array tag handler\n    EXFByteArrayHandler* byteArrayHandler = [[EXFByteArrayHandler alloc] init];\n    [self addHandler:byteArrayHandler :EXIF_ComponentsConfiguration];\n    [byteArrayHandler release];\n}\n\n\n-(void) addHandler:(id<EXFTagHandler>) aTagHandler forKey:(NSNumber*) aKey{\n    // test key type\n    if (aKey == nil || ! [aKey isMemberOfClass:[NSNumber class]]){\n        //throw an error here\n        NSException* myException = [NSException\n                                    exceptionWithName:@\"InvalidKey\"\n                                    reason:@\"Key is nil or not a Number\"\n                                    userInfo:nil];\n        @throw myException;\n    }\n    \n    // test the tag handler is not null\n    if (aTagHandler == nil){\n        //throw an error here\n        NSException* myException = [NSException\n                                    exceptionWithName:@\"InvalidHandler\"\n                                    reason:@\"Tag Handler is nil\"\n                                    userInfo:nil];\n        @throw myException;\n    }\n    if ( ! [((NSObject*)aTagHandler) conformsToProtocol:@protocol(EXFTagHandler)]  ) {\n        // Object does not conform to EXFTagHandler protocol\n        NSException* myException = [NSException\n                                    exceptionWithName:@\"InvalidHandler\"\n                                    reason:@\"Tag Handler Does not conform to protocol EXFTagHandler\"\n                                    userInfo:nil];\n        @throw myException;\n    }\n    \n    // do not allow overwrite of nested values\n    if ([aKey intValue] == TAG_EXIF_OFFSET || [aKey intValue] == TAG_INTEROP_OFFSET ||\n        [aKey intValue] == TAG_EXIF_GPS){\n        NSException* myException = [NSException\n                                    exceptionWithName:@\"InvalidHandler\"\n                                    reason:@\"Tag Handler cannot override tags that are containers for other tag sets\"\n                                    userInfo:nil];\n        @throw myException;\n    }\n    \n    \n    // now check optional conformance - if no tag exists then it must implement all the methods\n     EXFTag* tag =  [self.keyedTagDefinitions objectForKey:aKey];\n     if (tag == nil){\n         // check that all the types are specified\n         NSException* myException = nil;\n         if ([((NSObject*)aTagHandler) respondsToSelector:@selector(tagFormat)] ){\n             if (([aTagHandler tagFormat] <0 && [aTagHandler tagFormat] != -99) || \n             [aTagHandler tagFormat] < FMT_BYTE || [aTagHandler tagFormat] >FMT_DOUBLE){\n                 myException = [NSException\n                                exceptionWithName:@\"InvalidHandler\"\n                                reason:@\"Tag Handler tagFormat is not valid - please see documentation\"\n                                userInfo:nil]; \n                 \n             }\n         }else{\n             myException = [NSException\n                            exceptionWithName:@\"InvalidHandler\"\n                            reason:@\"Tag Handler must implement tagFormat to support new tag Id\"\n                            userInfo:nil]; \n         }\n         if ([((NSObject*)aTagHandler) respondsToSelector:@selector(parentTagId)] ){\n             if ([aTagHandler parentTagId]  != TAG_EXIF_GPS || [aTagHandler parentTagId] != TAG_EXIF_OFFSET\n                  || [aTagHandler parentTagId] != TAG_EXIF_ROOT || [aTagHandler parentTagId] != TAG_INTEROP_OFFSET){\n                 myException = [NSException\n                                exceptionWithName:@\"InvalidHandler\"\n                                reason:@\"Tag Handler parent Tag Id is invalid - please see documentation\"\n                                userInfo:nil]; \n                 \n             }\n         }else{\n             myException = [NSException\n                            exceptionWithName:@\"InvalidHandler\"\n                            reason:@\"Tag Handler must implement tagFormat to support new tag Id\"\n                            userInfo:nil]; \n         }\n         if (![((NSObject*)aTagHandler) respondsToSelector:@selector(isEditable)] ){\n                     myException = [NSException\n                                    exceptionWithName:@\"InvalidHandler\"\n                                    reason:@\"Tag Handler must implement isEditable to support new tag Id\"\n                                    userInfo:nil]; \n        }\n         \n         if (myException != nil){\n             @throw myException;\n         }\n             \n         \n     }\n    \n    \n    // otherwise add it to the user handlers\n    [self.userKeyedHandlers setObject:aTagHandler forKey:aKey];\n}\n\n-(void) removeHandler: (NSNumber*) aKey{\n    [self.userKeyedHandlers removeObjectForKey:aKey]; \n}\n\n-(void) removeAllHandlers{\n    [self.userKeyedHandlers removeAllObjects];\n}\n\n\n\n/* Init method */\n\n-(id) init {\n    if (self = [super init]) {\n        \n\t\t// Initialize the tag definitions\n        EXFTagDefinitionHolder* theTagDefs = [[EXFTagDefinitionHolder alloc] init];\n        self.tagDefinitions = theTagDefs;\n        [theTagDefs release];\n        \n        // initialise the tag values\n        NSMutableDictionary* keyedValues = [[NSMutableDictionary alloc] init];\n        self.keyedTagValues =keyedValues;\n        [keyedValues release];\n        \n        // initialise the handlers\n        NSMutableDictionary* handlerDict = [[NSMutableDictionary alloc] init];\n        self.keyedHandlers = handlerDict;\n        [handlerDict release];\n        \n        //initialise the user handlers\n        NSMutableDictionary* userDict = [[NSMutableDictionary alloc] init];\n        self.userKeyedHandlers = userDict;\n        [userDict release];\n        \n        \n        NSMutableDictionary* theKeyedThumbnailTagValues = [[NSMutableDictionary alloc] init];\n        self.keyedThumbnailTagValues = theKeyedThumbnailTagValues;\n        [theKeyedThumbnailTagValues release];\n        \n        self.thumbnailBytes =nil;\n        \n        // initialise the default image values\n        self.height = 0;\n        self.width=0;\n        self.compression=0;\n        self.bitsPerPixel=0;\n        self.byteLength =0;\n        self.bigEndianOrder =NO;\n        self.exif_ptr =NULL;\n        \n        // set up the special handlers\n        [self setupHandlers];\n      \n\t}\n\treturn self;\n}\n\n-(void) dealloc{\n    \n    \n    self.exif_ptr = NULL;\n   \n    self.keyedHandlers = nil;\n    self.keyedTagValues =nil;\n    self.tagDefinitions=nil;\n    self.userKeyedHandlers=nil;\n    self.keyedThumbnailTagValues  =nil;\n    self.thumbnailBytes =nil;\n    [super dealloc];\n}\n\n\n-(void) addTagValue:(id)value forKey:(NSNumber*) aTagKey {\n    \n\n    // get tag definition - may be nil\n    EXFTag* tag =  [self.keyedTagDefinitions objectForKey:aTagKey];\n    \n    int parentTagId = -1;\n    \n    // see if we have a user registered handler for support\n    id<EXFTagHandler> handler = [self.userKeyedHandlers objectForKey:aTagKey];\n    \n    if (handler == nil){\n        //see if we have one of our default handlers\n        handler = [self.keyedHandlers objectForKey:aTagKey];\n    }\n    \n    if(handler != nil){\n         NSException *e =nil;\n        if (![handler supportsValueType:value]){\n           e = [NSException\n                              exceptionWithName:@\"InvalidTypeException\"\n                              reason:[NSString stringWithFormat: @\"Handler %@ does not support value for %@\",handler, value]\n                              userInfo:nil];      \n        }\n        \n        \n        if ([((NSObject*)handler) respondsToSelector:@selector(isEditable)]){\n            if ([handler isEditable] == FALSE){\n                e = [NSException\n                     exceptionWithName:@\"NonEditableKeyException\"\n                     reason:[NSString stringWithFormat: @\"Handler %@ does not support editing for %@\",handler, aTagKey]\n                     userInfo:nil];  \n            }\n        }else{\n            if (![tag editable]){\n                e = [NSException\n                     exceptionWithName:@\"NonEditableKeyException\"\n                     reason:[NSString stringWithFormat: @\"Tag does not support editing for %@\", aTagKey]\n                     userInfo:nil];\n            }\n        }\n        if ([((NSObject*)handler) respondsToSelector:@selector(parentTagId)]){\n            parentTagId = [handler parentTagId];\n        }else{\n            if (tag != nil){\n                parentTagId = [tag parentTagId];\n            }else{\n                e = [NSException\n                     exceptionWithName:@\"NonEditableKeyException\"\n                     reason:[NSString stringWithFormat: @\"Tag definition not found for %@ - and parentTagId not supported by handler\", aTagKey]\n                     userInfo:nil];\n            }\n        }\n        if (e != nil){\n            @throw e;\n        }\n    } else{\n        \n        if (tag == nil){\n            Debug(@\"Tag %i is not found\",tag.tagId);\n            NSException *e = [NSException\n                              exceptionWithName:@\"NonEditableKeyException\"\n                              reason:[NSString stringWithFormat: @\"No Tag found for Key %@\", aTagKey]\n                              userInfo:nil];\n            @throw e;\n            \n        }\n        \n        // check if it exists that it is editable\n        if (! tag.editable){\n            Debug(@\"Tag %x is not editiable\",tag.tagId);\n            NSException *e = [NSException\n                              exceptionWithName:@\"NonEditableKeyException\"\n                              reason:@\"Tag is not editable\"\n                              userInfo:nil];\n            @throw e;\n            \n        }\n        \n         parentTagId = tag.parentTagId;\n         \n        // lets check the type mappings for the standard tags\n        int type = tag.dataType;\n       \n        // else lets get the string that matches the types\n        NSString* dataTypeStr = (NSString*) typeMappings[type];\n        \n        if ([@\"NSString\" isEqualToString:dataTypeStr ]) {\n             // it has to match the class name in the typemappings\n            if(! [value isKindOfClass:[NSString class]] || (! [value canBeConvertedToEncoding:NSASCIIStringEncoding])  ){\n                NSException *e = [NSException\n                               exceptionWithName:@\"InvalidTypeForHandlerException\"\n                               reason:[NSString stringWithFormat: @\"Tag %@ only supports NSString in ASCII format\",aTagKey]\n                               userInfo:nil];\n                @throw e;\n             }\n        } else if ([@\"NSData\" isEqualToString:dataTypeStr] ){\n            if(! [value isKindOfClass:[NSData class]] ){\n                    NSException *e = [NSException\n                                      exceptionWithName:@\"InvalidTypeForHandlerException\"\n                                      reason:[NSString stringWithFormat: @\"Tag %@ only supports NSData\",aTagKey]\n                                      userInfo:nil];\n                    @throw e;\n            }  \n        } else if ([@\"EXFraction\" isEqualToString:dataTypeStr] ){\n            if(! [value isKindOfClass:[EXFraction class]] ){\n                NSException *e = [NSException\n                                  exceptionWithName:@\"InvalidTypeForHandlerException\"\n                                  reason:[NSString stringWithFormat: @\"Tag %@ only supports EXFraction\",aTagKey]\n                                  userInfo:nil];\n                @throw e;\n            }  \n        }else{\n            // it can opnly be a number - or an array of numbers\n            // Array handling is a bit wierd here - to do in a more elegant manner\n            id tempValue = value;\n            int i=0;\n            \n            if ([value isKindOfClass:[NSArray class]]){\n                tempValue = [((NSArray*)value) objectAtIndex:i];\n                \n            } \n            \n            while(true){\n                    Debug(@\"tempvalue class %@\",[tempValue class]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (! [tempValue isKindOfClass:[NSNumber class]] ) \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNSException *e = [NSException\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texceptionWithName:@\"InvalidTypeException\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treason:[NSString stringWithFormat: @\"Tag %@ supports only numeric types of %@ - unsupported type %@\",aTagKey, dataTypeStr, [tempValue class]]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tuserInfo:nil];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@throw e;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} \n                    if (! [tempValue isKindOfClass:[NSNumber class]]  ||\n                        [dataTypeStr rangeOfString:[NSString stringWithFormat:@\"%s\",[tempValue objCType]]].location == NSNotFound) \n                       {\n                        NSException *e = [NSException\n                                          exceptionWithName:@\"InvalidTypeException\"\n                                          reason:[NSString stringWithFormat: @\"Tag %@ does not support numeric type %c for %@\",aTagKey, [tempValue objCType],value]\n                                          userInfo:nil];\n                        @throw e;\n                    } \n                    i++;\n               if ([value isKindOfClass:[NSArray class]] && i<[((NSArray*)value) count]){\n                   tempValue = [((NSArray*)value) objectAtIndex:i];\n               }else{\n                   break;\n               }\n            \n           }\n                         \n        }\n             \n        \n    }\n    \n    // now add the value - and make sure we add in the right sub dir\n    NSMutableDictionary* dictionary =  self.keyedTagValues ;\n    \n   \n    \n    if (parentTagId != -1)\n    {\n    // let dictionary = subdictionary\n        NSNumber* parentTagNumber = [[NSNumber alloc] initWithInt:parentTagId]; \n        dictionary = [self.keyedTagValues objectForKey: parentTagNumber];\n        if (dictionary == nil){\n                 dictionary = [[NSMutableDictionary alloc] init];\n                 [self.keyedTagValues setObject:dictionary forKey: parentTagNumber];\n                [dictionary release];\n                 dictionary = [self.keyedTagValues objectForKey:parentTagNumber];\n        }\n        [parentTagNumber release];\n    }\n                 \n    // set the value\n    [dictionary setObject:value forKey:aTagKey];\n}\n  \n\n\n-(void) removeTagValue:(NSNumber*) aTagKey {\n    \n\t\t\t\t\n    // get tag definition - may be nil\n    EXFTag* tag =  [self.keyedTagDefinitions objectForKey:aTagKey];\n    \n    int parentTagId = -1;\n\n\t\t\t\tif (tag == nil){\n\t\t\t\t\t\t\t\t// see if one of the sub tags\n\t\t\t\t\t\t\t\tif ([aTagKey intValue] == EXIF_Exif){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tDebug(@\"Tag %i is not found\",tag.tagId);\n\t\t\t\t\t\t\t\tNSException *e = [NSException\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texceptionWithName:@\"NonEditableKeyException\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treason:[NSString stringWithFormat: @\"Tag group %@ cannot be removed\", aTagKey]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tuserInfo:nil];\n\t\t\t\t\t\t\t\t@throw e;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t}else\tif (! tag.editable){\n\t\t\t\t\t\t\t\tDebug(@\"Tag %x is not editiable\",tag.tagId);\n\t\t\t\t\t\t\t\tNSException *e = [NSException\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texceptionWithName:@\"NonEditableKeyException\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treason:@\"Tag is not editable\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tuserInfo:nil];\n\t\t\t\t\t\t\t\t@throw e;\n\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//it is either an editable tag or a gps block\n\t\t\t\t\t\t\t\t\n\t\t\t\tif (tag != nil){\n\t\t\t\t\t\t\t\tparentTagId = tag.parentTagId;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// remove the tag\n\t\t\t\tNSMutableDictionary* dictionary =  self.keyedTagValues ;\n    \n\t\t\t\t\n    \n    if (parentTagId != -1)\n    {\n\t\t\t\t\t\t\t\t// let dictionary = subdictionary\n        NSNumber* parentTagNumber = [[NSNumber alloc] initWithInt:parentTagId]; \n        dictionary = [self.keyedTagValues objectForKey: parentTagNumber];\n        if (dictionary == nil){\n\t\t\t\t\t\t\t\t\t\t\t\t// we can just return as no parent to release\n\t\t\t\t\t\t\t\t\t\t\t\tDebug(@\"No Parent tag %@ found for tag %@\", parentTagNumber,aTagKey);\n        }\n        [parentTagNumber release];\n    }\n\t\t\t\t\n\t\t\t\t// otherwise rmove tag\n\t\t\t\t[dictionary removeObjectForKey:aTagKey];\n\t\t\t\n\t\t\t\t//remove the parent if empty\n\t\t\t\tif ([dictionary count] ==0 && parentTagId != -1){\n\t\t\t\t\t\t\t\t[self removeTagValue:[NSNumber numberWithInt:parentTagId]];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n}\n-(NSDictionary*) keyedTagDefinitions{\n    return self.tagDefinitions.definitions;  \n}\n\n\n\n\n\n\n/* End of utility helper methods */\n\n/* start of tag population methods */\n\n-(void) assignElements: (NSMutableDictionary*) keyedValues: (NSNumber*) tag: (id) elements: (UInt32) components{\n    if (components > 1){\n        [keyedValues setObject: elements forKey: tag];\n    }else{\n        [keyedValues setObject: [elements objectAtIndex:0] forKey: tag]; \n    }\n}\n\n-(void) assignSByte:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n\n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        SInt8 val = exif_ptr[valueOffset];\n        // Debug(@\"Got Signed byte %i\",val);\n        // create the byte\n        NSNumber* value = [[NSNumber alloc] initWithInt:val];\n        valueOffset+=1;\n        [elements addObject:value];\n        [value release];\n    }\n    \n    [self assignElements:keyedValues :tag :elements :components];\n    \n    [elements release];\n\n   \n    \n}\n\n-(void) assignByte:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        \n        UInt8 val = exif_ptr[valueOffset];\n    // Debug(@\"Got byte %i\",val);\n    \n        NSNumber* value = [[NSNumber alloc]  initWithUnsignedInt:val];\n    \n        valueOffset+=1;\n        [elements addObject:value];\n        [value release];\n    }\n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];\n    \n}\n\n-(void) assignUShort:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        \n        UInt8* ptr = exif_ptr+valueOffset;\n        UInt16 val = [EXFUtils read2Bytes:&ptr: self.bigEndianOrder];\n    // Debug(@\"Got U Short %i\",val);\n        NSNumber* value = [[NSNumber alloc] initWithUnsignedInt:val];\n    \n        \n        valueOffset+=2;\n        [elements addObject:value];\n        [value release];\n    }\n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];\n}\n\n-(void) assignShort:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        UInt8* ptr = exif_ptr+valueOffset;\n        SInt16 val = [EXFUtils read2SignedBytes:&ptr: self.bigEndianOrder];\n        // Debug(@\"Got U Short %i\",val);\n        NSNumber* value = [[NSNumber alloc] initWithInt:val];\n        \n        valueOffset+=2;\n        [elements addObject:value];\n        [value release];\n        \n    }    \n   \n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];\n    \n}\n\n-(void) assignLong:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n   \n        \n        UInt8* ptr = exif_ptr+valueOffset;\n        SInt32 val = [EXFUtils read4SignedBytes:&ptr: self.bigEndianOrder];\n        // Debug(@\"Got Long %i\",val);\n    \n        NSNumber* value = [[NSNumber alloc] initWithLong:val];\n    \n        valueOffset+=4;\n        [elements addObject:value];\n        [value release];\n        \n    }    \n    \n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];\n}\n\n-(void) assignULong:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        \n        UInt8* ptr = exif_ptr+valueOffset;\n        UInt32 val = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n    // Debug(@\"Got U Long %i\",val);\n    \n        NSNumber* value = [[NSNumber alloc] initWithUnsignedLong:val];\n    \n        valueOffset+=4;\n        [elements addObject:value];\n        [value release];\n        \n    }    \n    \n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];\n}\n\n-(void) assignString:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    UInt8* ptr = exif_ptr+valueOffset;\n    NSString* value = [EXFUtils newStringFromBuffer:&ptr: components: NSASCIIStringEncoding];\n    // Debug(@\"Assigned string %@\",value);\n    \n    [keyedValues setObject: value forKey: tag];\n    \n    [value release];\n    \n}\n\n-(void) assignData:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    UInt8* ptr = exif_ptr+valueOffset;\n    NSData* value = [[NSData alloc] initWithBytes:ptr length: components];\n    Debug(@\"Assigned data block %@\",value);\n    \n    [keyedValues setObject: value forKey: tag];\n    \n    [value release];\n    \n}\n\n-(void) assignFraction:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        UInt8* ptr = exif_ptr+valueOffset;\n        UInt32 num = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n        ptr = exif_ptr+valueOffset+4;\n        UInt32 denom = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n   \n        EXFraction* value = [[EXFraction alloc] initWith:num: denom];\n        \n        valueOffset+=8;\n        [elements addObject:value];\n        [value release];\n        \n    }    \n    \n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];    \n    \n}\n\n-(void) assignSignedFraction:(NSMutableDictionary*) keyedValues: (NSNumber*) tag: (UInt32) valueOffset: (UInt32) components{\n    \n    // have to use byte count for list\n    NSMutableArray* elements = [[NSMutableArray alloc] init];\n    \n    for(int i =0;i<components;i++){\n        \n        UInt8* ptr = exif_ptr+valueOffset;\n        SInt32 num = [EXFUtils read4SignedBytes:&ptr: self.bigEndianOrder];\n        ptr = exif_ptr+valueOffset+4;\n        SInt32 denom = [EXFUtils read4SignedBytes:&ptr: self.bigEndianOrder];\n    \n          EXFraction* value = [[EXFraction alloc] initWith:num: denom];\n    // Debug(@\"Assign signed rational called %@\", value);\n        valueOffset+=8;\n        [elements addObject:value];\n        [value release];\n        \n    }    \n    \n    \n    // release the val\n    [self assignElements:keyedValues :tag :elements :components];\n    \n    \n    [elements release];       \n    \n}\n\n-(void) appendDataFromBytes: (NSMutableData*) data: (NSArray*) bytes{\n    UInt8 byte[1];\n    for(NSNumber* val in bytes){\n        byte[0] = [val intValue] && 0xff;\n        [data appendBytes:byte length:1];\n    }\n}\n\n-(int) processExifDir:(NSMutableDictionary*) keyedValues: (int) dirStart: (int) offsetBase: (BOOL) thumbnail{\n     \n    // if we have a tag failure it is not safe to get the thumbnail as the offsets could be wrong\n    BOOL tagFailure =FALSE;\n   \n    Debug(@\"********** Entering exif processing at offset %i ********\",dirStart);\n    UInt8* ptr = exif_ptr+dirStart;\n    UInt16 numEntries = [EXFUtils read2Bytes:&ptr: self.bigEndianOrder];\n    \n    // the possible thumbnail offset with no overflow values\n    int thumbnailDataCount = dirStart;\n    \n     Debug(@\"Number of entries in block %i\", numEntries);\n    \n    for (int de =0;de <numEntries;de++){\n        int dirOffset = dirStart +2 +(12*de);\n        \n        // count of current processed values\n        int processedValueCount = [keyedValues count];\n        \n        // get the tag id\n        ptr = exif_ptr+dirOffset;\n        UInt16 tag = [EXFUtils read2Bytes:&ptr: self.bigEndianOrder];\n        \n        // this is a hack for IPhone - which appears to have an off by one error in the EXIF block\n        // this may be a problem in the GPS blok if tag 0 is the last one\n        if (tag ==0 && de == numEntries -1){\n            numEntries -=1;\n            NSLog(@\"*** Warning IPhone off by one count - skipping non-existent tag\");\n            continue;\n        }\n        \n        \n        Debug(@\"Parsing tag %i at location %i\",tag, dirOffset);\n              \n        // get format\n        ptr = exif_ptr + dirOffset +2;\n        UInt16 format = [EXFUtils read2Bytes:&ptr: self.bigEndianOrder];\n        \n        // get number of components\n         ptr = exif_ptr + dirOffset +4;\n        UInt32 components = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n        \n        // check format is known\n        \n        if ((format < FMT_BYTE) ||( format > FMT_DOUBLE)) {\n            NSLog(@\"*** Warning Unknown format %i for tag %i\",format, tag);\n            tagFailure =TRUE;\n            continue;\n\t       }\n        \n        // work out how many bytes we need for format\n        UInt32 byteCount = components * bytesPerFormat[format];\n        \n        // offset to read from if data in tag (default)\n        UInt32 valueOffset = dirOffset + 8;\n        \n        // if more than 4 bytes then must be in overflow - so set the valueOffset to be the location in the overflow\n        if (byteCount > 4) {\n             ptr = exif_ptr + dirOffset +8;\n            UInt32 offsetVal = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n            valueOffset = offsetBase + offsetVal;\n            Debug(@\"Offset %i found for tag %i with bytecount %i\",valueOffset, tag,byteCount);\n            \n        }\n        \n       // sometimes thumbnail has no tag just runs on end of data - so keep track of where we are in block\n       \n         if (byteCount <4 && (valueOffset +4 > thumbnailDataCount)){\n            thumbnailDataCount = valueOffset + 4;\n        }else if (valueOffset + byteCount > thumbnailDataCount){\n          thumbnailDataCount = valueOffset + byteCount;   \n        }\n        \n         \n        // get a tagNumber object to work with the maps\n        NSNumber* tagNumber = [[NSNumber alloc] initWithUnsignedInt:tag];\n        \n      \n        // if this a nested tag type then create a new value map and recurse into this method\n        if (tag == TAG_EXIF_OFFSET || tag == TAG_INTEROP_OFFSET || tag == TAG_EXIF_GPS) {\n             \n            ptr = exif_ptr + valueOffset;\n            UInt32 subdirOffset = [EXFUtils read4Bytes:&ptr: self.bigEndianOrder];\n            \n            \n            Debug(@\"Nested pointer to %i found for tag %i with bytecount %i\",subdirOffset +offsetBase, tag,byteCount);\n            \n            // create a new sub directory for the tag\n            NSMutableDictionary* subDir = [[NSMutableDictionary alloc] init];\n            \n            // set it into the current directory\n            [keyedValues setObject: subDir forKey:tagNumber];\n            \n            // process the sub dir - ignore the return value as should always be 0\n            [self processExifDir:subDir: offsetBase+subdirOffset: offsetBase: FALSE];\n            \n            // release the map we created\n            [subDir release];\n         }else{\n            \n            // see if we have a user handler\n            id<EXFTagHandler> handler = [[self userKeyedHandlers] objectForKey:tagNumber];\n            \n            // if not see if we have a default specific handler\n            if (handler == nil){\n                handler = [[self keyedHandlers] objectForKey:tagNumber];\n\n            }\n            \n            // a handler is dealing with this tag\n            if (handler != nil){\n                Debug(@\"Handler %@ invoked for tag %@ invoked with offset %i and byte count %i\",handler, tagNumber, valueOffset, byteCount);\n                \n                \n                // create the NSData object to pass to the handler\n                NSData* tagData = [NSData dataWithBytes:&self.exif_ptr[valueOffset] length:byteCount];\n            \n                 \n                Debug(@\"Retain count for tagData is %i\", [tagData retainCount]);\n                // try and decode the tag here - catch any errors\n                @try {\n                                   \n                    [handler decodeTag: keyedValues: tagNumber:(CFDataRef*) &tagData: self.bigEndianOrder];\n                                   \n                }@catch (NSException *theError) {\n                                   NSLog(@\"Unable to process Tag %i due to error %@\", tagNumber,  theError);           \n                 \n                } \n               \n            }else{\n                // see if we have a known tag definition\n                \n                EXFTag* tagDefinition = [self.keyedTagDefinitions objectForKey:tagNumber];\n                \n                if (tagDefinition == nil){\n                    // we should ignore this\n                    Debug(@\"*** Ignoring unknown tag definition for %@\", tagNumber);\n                    tagFailure = TRUE;\n                    continue;\n                }else{\n                        switch (format) {\n                            case FMT_UNDEFINED:\n                                // ignore this for now\n                                 Debug(@\"Undefined format found for tag %@ treating as NSData\", tagNumber);\n                                // this gets put in as an nsdata entry\n                                [self assignData:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_STRING:\n                                [self assignString:keyedValues: tagNumber :valueOffset :components];\n                                \n                                break;\n                            case FMT_SBYTE:\n                                [self assignSByte:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_BYTE:\n                                [self assignByte:keyedValues :tagNumber :valueOffset :components];\n                                break;\n                            case FMT_USHORT:\n                                [self assignUShort:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_SSHORT:\n                                [self assignShort:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_SLONG:\n                                [self assignLong:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_ULONG:\n                                [self assignLong:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_URATIONAL:\n                                [self assignFraction:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                            case FMT_SRATIONAL:\n                                [self assignSignedFraction:keyedValues: tagNumber :valueOffset :components];\n                                break;\n                           default:\n                                 Debug(@\"Unexpected format for tag %x\", tag);\n                                tagFailure =TRUE;\n                                break;   \n                        } \n                    }\n                   \n                }\n\n        \n\n        }\n        // make sure we release the tag number\n        if ([keyedValues count] == processedValueCount){\n            tagFailure =TRUE;\n            Debug(@\"*** Warning No entry added for tag %@\", tagNumber);    \n        }\n        [tagNumber release];\n        \n       \n    }\n    \n\n    // now get the offset pointer to thumbnail if any\n    int nextIFD =  dirStart +2 +(12*numEntries);\n    \n    UInt8* nextPtr = exif_ptr + nextIFD;\n    UInt32 nextOffset = [EXFUtils read4Bytes:&nextPtr: self.bigEndianOrder] ;\n\n    Debug(@\"Next Offset %i at %i\",nextOffset, nextIFD);\n    \n    \n    // bit of a hack but needs to be done here as some times we get thumbnail with no tags \n    if(thumbnail){\n        long thumbnailStart = 0;\n        long thumbnailLength =0;\n        \n        // get the offset to the data\n        NSNumber* jpegOffset = [keyedValues objectForKey : [NSNumber numberWithInt: EXIF_JPEGInterchangeFormat]];\n        \n        // if we have a tag identifying offset we should be able to get length\n        if (jpegOffset != nil){\n            // get the length\n            NSNumber* jpegLength = [keyedValues objectForKey : [NSNumber numberWithInt: EXIF_JPEGInterchangeFormatLength]];\n            \n            thumbnailStart = [jpegOffset longValue];\n            thumbnailLength = [jpegLength longValue];\n            \n        }else if (! tagFailure) {\n            // tags are missing but we could still work this out - if we have not had a tag Failure\n            \n             // make sure if we are at the end of thumbnail tags we include overflow \n            if (nextIFD +4 > thumbnailDataCount){\n                thumbnailStart = nextIFD +4;\n            }else{\n                thumbnailStart = thumbnailDataCount;\n            }\n            thumbnailLength = self.byteLength - thumbnailStart;\n        }else if (tagFailure){\n            NSLog(@\"Tag Failure occurred so unable to calculate if any thumbnail exists\");\n        }\n            \n            // see if thubnail data is less than block length - as there may be no thumbnail at all\n        if (thumbnailLength >0 && thumbnailStart + thumbnailLength == self.byteLength){\n            // looks ok - try and get remaining block as thumbnail\n                nextPtr = exif_ptr + thumbnailStart ;\n                NSData* thumbnailDataArray = [[NSData alloc] initWithBytes:nextPtr length: thumbnailLength];\n                self.thumbnailBytes = thumbnailDataArray;\n                [thumbnailDataArray release];                \n                \n        } else if (thumbnailStart + thumbnailLength > self.byteLength){\n                \n                Debug(@\"*** Thumbnail start of %i and length %i is more than total block length %i\", thumbnailStart, thumbnailLength, self.byteLength);\n        }else{\n                \n                Debug(@\"*** Thumbnail start of %i and length %i is less than total block length %i\", thumbnailStart, thumbnailLength, self.byteLength);\n        }\n    }\n        // if there has not been an offset value \n       \n    \n      Debug(@\"********** Leaving exif processing at %i with nextOffset %i***********\",dirStart  , nextOffset);\n    return nextOffset;\n}\n\n-(void) parseExif: (CFDataRef*) exifData\n {\n     \n    // get the byte length\n     self.byteLength = CFDataGetLength(*exifData);\n    \n     Debug(@\"Length of exif %i\", byteLength);\n     \n     // must be at least 13 bytes\n     if (self.byteLength <13){\n         NSLog(@\"***Warning byte length for EXIF is too short %i must be at least 13 bytes\", self.byteLength);\n         return;\n     }\n     \n    \n    //get the first 4 bytes and make sure they equal the exif chars\n    \n    \n    UInt8 bytes[4];\n    CFDataGetBytes(*exifData, CFRangeMake(0,4), bytes);\n    \n                      // test the start of the EXIF Data\n    for (int i=0;i<4;i++){\n         if(exifChars[i] != bytes[i]){\n             NSLog(@\"***Warning 'EXIF' string not present at start of Exif data\");\n            return;\n        }\n    }\n    \n                      \n    // skip the next two padding bytes\n    \n    // get the endian of the bytes\n     UInt8 order[2];\n     //CFDataGetBytes(*exifData, CFRangeMake(6,8), order);\n\t CFDataGetBytes(*exifData, CFRangeMake(6,2), order);\n\n     \n     if (M_ORDER == order[0] && M_ORDER == order[1]){\n         self.bigEndianOrder =YES;\n         Debug(@\"Big endian type found for data \");\n     }else if (I_ORDER == order[0]&& I_ORDER == order[1]){\n         // intel order\n         self.bigEndianOrder = NO;\n           Debug(@\"Little endian type found for data\");\n     }else{\n         // we have an unrecognized type\n        NSLog(@\"*** Warning Unrecognized endian type %x %x\", order[0], order[1]);\n        return;\n     }\n     \n                      \n     // create initial pointer to start of data\n     \n     self.exif_ptr = (UInt8*) CFDataGetBytePtr(*exifData);\n     \n     \n    // check header is TIFF header\n     UInt8* ptr = exif_ptr +8;\n     UInt16 value = [EXFUtils read2Bytes:&ptr:self.bigEndianOrder];\n     if ( value != 0x2a) {        \n          NSLog(@\"*** Warning Not a valid TIFF Header: %x should be 0x2a\", value);\n         return;\n     }\n     \n     // get the first offset\n     ptr = exif_ptr +10;\n     UInt32 offset = [EXFUtils read4Bytes:&ptr:self.bigEndianOrder];\n                      \n     // now process the tag data and get back number of bytes processed\n     int thumbnailOffset =  [self processExifDir: self.keyedTagValues: offset+6:6:FALSE];\n     \n     \n     // if we are less than the image size then we need to see if we have a JPEG thumbnail\n     if (thumbnailOffset > 0){\n         [self processExifDir: self.keyedThumbnailTagValues: thumbnailOffset+6:6:TRUE];\n         Debug(@\"Got thumbnail data %@\", self.keyedThumbnailTagValues);\n     }\n     \n     \n    // obviously we need the last 6 here as well\n   //  lastOffset+=6;\n     Debug(@\"Returning from parsing at %i \",thumbnailOffset);\n}\n\n/*\nBytes 0-1  Tag \nBytes 2-3 Type \nBytes 4-7 Count \nBytes 8-11 Value Offset \n\n */\n\n\n-(void) writeDataToBuffer: (NSMutableData*) target: (id) obj : (int) dataType: (int) tagByteSize: (UInt8**) bytes{\n    \n    // Appends data to the NSMutableData buffer depending on type - padding must be done OUTSIDE this method as\n    // there is not enough information to deal with array structures\n    switch (dataType) {\n        case FMT_UNDEFINED:{\n                \n            if ([obj isKindOfClass:[NSData class]]){\n                // assume this is an NSData object\n                      [target appendData: (NSData*)obj];\n                }else{\n                      NSLog(@\"Data %@ is not NSData class - populating empty tag data\", obj);\n                      [target increaseLengthBy:tagByteSize];\n                }\n            }\n            break;\n        case FMT_STRING:{\n            Debug(@\"Writing ASCII String %@ with count of \", obj, tagByteSize);\n            const char* cString = [((NSString*)obj) cStringUsingEncoding:NSASCIIStringEncoding];\n            [target appendBytes: cString length:tagByteSize];\n            \n            // seems to be required for examples - check other files\n            \n          /*  if (tagByteSize >4 && tagByteSize %2!= 0){\n                [target increaseLengthBy:1]; \n            }\n            */\n            }break;\n        case FMT_SBYTE:\n            [EXFUtils write1SignedByte:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:1]; \n            break;\n            \n        case FMT_BYTE:\n            [EXFUtils write1Byte:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:1]; \n            break;\n            \n        case FMT_USHORT:\n            [EXFUtils write2Bytes:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:2]; \n            break;\n        case FMT_SSHORT:\n            [EXFUtils write2SignedBytes:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:2]; \n            break;\n        case FMT_SLONG:\n            [EXFUtils write4SignedBytes:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:4]; \n            break;\n        case FMT_ULONG:\n            [EXFUtils write4Bytes:bytes :(NSNumber*)obj :self.bigEndianOrder];\n            [target appendBytes:*bytes length:4]; \n            break;       \n            // these can't be 4 or less\n        case FMT_URATIONAL:\n            [EXFUtils appendFractionToData:target :(EXFraction*) obj :self.bigEndianOrder];\n            break;\n        case FMT_SRATIONAL:\n            [EXFUtils appendFractionToData:target :(EXFraction*) obj :self.bigEndianOrder];\n            break;\n            \n        default:\n            Debug(@\"Unexpected format for val %@ with tagSize %i\", obj, tagByteSize);\n            break;   \n    } \n    \n}\n\n\n/*\n \n Note: \n 1) Tags which are containers for nested values have no definition\n 2) Tags that handlers deal with can have no definition\n 3) ALL other tags are expected to have a definition\n \n */\n-(void) getDataFromMap: (NSDictionary*) dictionary :(NSMutableArray*) dataWriterArray: (UInt8**) bytes: (int) overflowOffset: (int) offsetBase{ \n\n    // create a data writer for these tags\n    EXFWriter* dataWriter = [[EXFWriter alloc] init];\n                    \n \n    Debug(@\"****** Entering data map at %i\", overflowOffset);\n    // get the tag keys that we have\n    NSArray* allKeys = [dictionary allKeys];\n    \n    // a placeholder for nested tags that we need to deal with after all the other tags\n    NSMutableArray* nestedTags = [[NSMutableArray alloc] init];\n    \n    // Sort the tags so we do them in ascending order                  \n    NSArray *sortedKeysArray =\n      [allKeys sortedArrayUsingSelector:@selector(compare:)];\n    \n    \n    // get the size of the key list\n    int size = [sortedKeysArray count] ;\n    \n    \n    // the extra plus 4 is where the next ifd for any thumbnail is set\n    // if no value then 00000000 pads between blocks \n    int blockCount = (size *12 +2)  +4;\n    \n    Debug(@\"Number of ELements %i and block size of %i\",size, blockCount);\n   \n    // write the number of elements in the first 2 bytes\n    [EXFUtils write2Bytes:bytes :[NSNumber numberWithInt:size] :self.bigEndianOrder];\n    [dataWriter.tagData appendBytes:*bytes length:2];\n    \n    // loop through all the elements and add to the current block\n   \n    for (int de =0;de <size;de++) {\n    \n        // get the key of the tag\n        NSNumber *key = [sortedKeysArray objectAtIndex:de];\n  \n        // get the value for the key in the value list\n        id obj = [dictionary objectForKey:key];\n        \n        //if it is a dictionary - then record for later as a nested tag block\n        if ([obj isKindOfClass:[NSDictionary class]]){\n            Debug(@\"dictionary found at %@\", key);\n            [nestedTags addObject:key];\n        }else{\n            // get the tag definition\n            EXFTag* tag = [self.keyedTagDefinitions objectForKey:key];\n             \n                   \n            // number of bytes the tag will occupy - this is not the same as the number of \n            // coponents in the tag          \n            int tagComponentSize = 0;\n                \n            //get the type of data we are writing - default to undefined\n            int tagDataType =FMT_UNDEFINED;\n                  \n            // see if we have a user handler registered first\n            id<EXFTagHandler> handler = [[self userKeyedHandlers] objectForKey:key];\n                \n            // if not see if we have a default handler\n            if (handler == nil){\n                handler = [[self keyedHandlers] objectForKey:key];    \n            }\n                \n            // get the dynamic tag byte data size from the handler\n            if (handler != nil){\n                tagComponentSize = [handler getSizeOfValue: obj];\n                \n                // override the tag type if necessary\n                if ([(NSObject*)handler respondsToSelector: @selector(tagFormat)]){\n                    tagDataType = [handler tagFormat];\n                }else if (tag != nil){\n                     tagDataType = tag.dataType;\n                }\n                    \n            }else{\n                // set the data type from the tag definition\n                tagDataType = tag.dataType;\n                \n                // now deal with the tags that have arbitrary sizes\n                // this must be either NSData or NSString\n                if (tag.components <0){\n                    // must be size of the data\n                    // can be either -1 which is undefined or -99 which is any\n                    if ([obj isKindOfClass:[NSData class]]){\n                        // this must be a byte length from the data\n                        tagComponentSize = [((NSData*)obj) length];\n                    } else  if ([obj isKindOfClass:[NSString class]]){\n                        // String length is determined by ascii encoding only\n                        tagComponentSize = [((NSString*)obj) lengthOfBytesUsingEncoding:NSASCIIStringEncoding];\n                        Debug(@\"Got String value of %@\",obj);\n                    }else{\n                        // we have a problem here\n                        NSLog(@\"*** Warning Data in undexpected format for key %@ got format class %@\",key, [obj class] );\n                            continue;\n                        }\n                }else{\n                    // static types are based on compoenets in tag definition * bytes for each format\n                    tagComponentSize = tag.components ;\n                }\n            }\n                \n            // now we have tag id/tag size/tag type - we need to get the data byte size\n            int tagByteSize = tagComponentSize* bytesPerFormat[tagDataType];\n\n            // if we have a negative tag size we should ignore the tag\n            if (tagByteSize <0){\n                NSLog(@\"*** Warning Unexpected tagsize of %i returned for tag %@ - ignoring tag\",tagByteSize, key);\n                // we might want to have a dictionary of ignored tags here\n            } else{\n                // this line tells us where int he final unified block the data will be\n                Debug(@\"Writing value for key %@ at final location %i\",key, [dataWriter.tagData length] + overflowOffset + offsetBase);\n                \n                // for each tag write the tag id\n                [EXFUtils write2Bytes:bytes :key :self.bigEndianOrder];\n                // now append this to the writer\n                [dataWriter.tagData appendBytes:*bytes length:2];\n                \n                // write the data type\n                [EXFUtils write2Bytes:bytes :[NSNumber numberWithInt: tagDataType] :self.bigEndianOrder];\n                [dataWriter.tagData appendBytes:*bytes length:2];\n                \n                // now write the count\n                Debug(@\"Writing byte count of %i key %@ \",tagComponentSize, key);\n                [EXFUtils write4Bytes:bytes :[NSNumber numberWithInt: tagComponentSize] :self.bigEndianOrder];\n                [dataWriter.tagData appendBytes:*bytes length:4]; \n                \n                // the target data array is either the block if size is 4 bytes or less or \n                // overflow block if more\n                NSMutableData* target = nil;\n                \n                \n                // now set up the data elements to be written\n                 if (tagByteSize <=4){\n                     target = dataWriter.tagData; \n                 }else{\n                    \n                     target = dataWriter.overflowData;\n                     \n                     // write location of the data offset block\n                     int temp = blockCount + overflowOffset + [dataWriter.overflowData length];\n                     \n                     Debug(@\"Writing overflow location of %i (%i) for key %@ \",temp,temp+offsetBase, key);\n                     \n                     [EXFUtils write4Bytes:bytes :[NSNumber numberWithInt: temp] :self.bigEndianOrder];\n                     [dataWriter.tagData appendBytes:*bytes length:4]; \n                    \n                      Debug(@\"Length of tagData %i \",[dataWriter.tagData length]);\n                 }\n                \n                // Now we write the data to the target buffer\n                \n                if (handler != nil){\n                    Debug(@\"Encoding with handler for tag %@\", key);\n                    \n                    // We use a temporary buffer here to the user cannot change the real buffer\n                    NSMutableData* tagData = [[NSMutableData alloc] init];\n                    \n                    // encode the data\n                    @try {\n                      \n                        [handler encodeTag:tagData :obj :self.bigEndianOrder];\n                      \n                    }@catch (NSException *theError) {\n                        NSLog(@\"***Warning Unable to process Tag %@ due to error %@ - writing empty bytes to tag\", key,  theError);            \n                    }\n                      \n                    // the handler returned a different amount than it said\n                    if ([tagData length] != tagByteSize){\n                        NSLog(@\"***Warning Handler %@ returned %i bytes for tag %@ - expected %i. Altering buffer size to projected size\", handler, [tagData length],key,tagByteSize);\n                        // we should truncate or expand based on the value here\n                      [tagData setLength:tagByteSize];\n                    } \n                    // pad if we need to\n                    if ([tagData length] <4){\n                        Debug(@\"Tag data less than 4 for tag %@ from handler %@ - padding %i bytes\", key, handler, 4 - [tagData length]);\n                        [tagData increaseLengthBy: 4 - [tagData length]];\n                    }\n                    // write the data to the target\n                    [target appendData:tagData];\n                    // release the temporary buffer\n                    [tagData release];\n                    \n                } else{\n                    // if it is an array and undefined then treat as array of bytes\n                     if ([obj isKindOfClass:[NSArray class]] && tagDataType == FMT_UNDEFINED){\n                         // treat this as a byte array\n                         [self appendDataFromBytes:target :(NSArray*)obj];\n                    // else we can treat as array of object types\n                     }else  if ([obj isKindOfClass:[NSArray class]]){\n                        \n                        for (id val in ((NSArray*)obj)){\n                            [self writeDataToBuffer:target :val :tagDataType :tagByteSize:bytes];\n                        }\n                         // else it is a single type object - could be an nsdata block though\n                    }else{\n                        [self writeDataToBuffer:target :obj :tagDataType :tagByteSize:bytes];\n                    }\n                    // pad if we need to\n                    if (tagByteSize <4){\n                         [target increaseLengthBy: 4 - tagByteSize];\n                    }\n                    \n                }\n                Debug(@\"Overflow size of %i\", [dataWriter.overflowData length]);\n\n               \n                }\n                            \n                \n            }\n            \n       \n       }\n    \n    // now do the offsets as we should know how big the tag data and the overflow data is\n    // note the oustanding nested tags are all fixed size so we do not worry about those yet\n\n    // add the current data writer to the accumulated array\n    [dataWriterArray addObject:dataWriter];\n         // now do each nested set\n\n\n \n    int nestedOffset= overflowOffset + blockCount + [dataWriter.overflowData length] ;\n    \n    for(int i=0;i< [nestedTags count];i++){\n        \n        NSNumber* key = (NSNumber*) [nestedTags objectAtIndex:i];\n        \n        \n        Debug(@\"Writing value for key %@ at location %i\",key, [dataWriter.tagData length] + overflowOffset + offsetBase);\n        \n        // write the nested tag id \n        [EXFUtils write2Bytes:bytes :key :self.bigEndianOrder];\n        // now append this to the writer\n        [dataWriter.tagData appendBytes:*bytes length:2];\n        \n        // write the data type\n        [EXFUtils write2Bytes:bytes :[NSNumber numberWithInt: FMT_ULONG] :self.bigEndianOrder];\n        [dataWriter.tagData appendBytes:*bytes length:2];\n        \n        // now write the count\n        [EXFUtils write4Bytes:bytes :[NSNumber numberWithInt: 1] :self.bigEndianOrder];\n        [dataWriter.tagData appendBytes:*bytes length:4];\n        \n        \n        Debug(@\"Writing nested tag location of %i (%i) for key %@ \",nestedOffset, nestedOffset +offsetBase, key);\n        \n        \n        [EXFUtils write4Bytes:bytes :[NSNumber numberWithInt: nestedOffset] :self.bigEndianOrder];\n        [dataWriter.tagData appendBytes:*bytes length:4];\n        \n        // now process the nested tag\n        [self getDataFromMap:[dictionary objectForKey:key]: dataWriterArray: bytes: nestedOffset: offsetBase];\n        \n         // release thye current data writer\n        EXFWriter* lastWriter = [dataWriterArray lastObject];\n        nestedOffset += [lastWriter blockLength] + 4;\n        \n        // note the counts will be incorrect if there is more than 1 level nesting - fix this up later \n\n       \n\n    }\n    \n    [nestedTags release];\n    Debug(@\"Expected blockCount %i - actual count %i\",blockCount,[dataWriter.tagData length]);\n    Debug(@\"Overflow size is %i\",[dataWriter.overflowData length]);\n    \n    Debug(@\"Reporting block count of %i\",[dataWriter blockLength]);\n    \n    [dataWriter release];\n    \n    //make sure we clean up the tags\n   \n    Debug(@\"****** Leaving data map at %i\", overflowOffset);\n    \n    \n}\n\n\n-(void) getData: (NSMutableData*)imageData {\n    //first create the NSData\n    // first of all we have to construct a a data holder for the image data\n     \n    \n   \n     \n    int initialSize = [imageData length];\n    \n\n     \n    NSMutableArray* dataWriters = [[NSMutableArray alloc] init];\n    \n    // first set up a byte array to hold the temporary values\n    UInt8 bytes[4];\n    \n    UInt8* ptr = bytes;\n    [self getDataFromMap:self.keyedTagValues: dataWriters: &ptr: 8: 6];\n      \n    // add the first 14 bytes first then\n    [imageData appendBytes:self.exif_ptr length:14];\n    \n    int thumbnailOffsetPointer =0;\n    for(int i=0;i<[dataWriters count];i++){\n    \n        EXFWriter* temp = [dataWriters objectAtIndex:i];\n\n        [imageData appendData:temp.tagData];\n        // add back in any thubnail values here\n        if (i ==0 && [self.keyedThumbnailTagValues count] >0){\n            Debug(@\"Current image data %@\", imageData);\n            // take into account the first 6 chars in the file as a whole\n            thumbnailOffsetPointer = [imageData length];\n            Debug(@\"Got pointer to re-write thumbnail at %i\", thumbnailOffsetPointer);\n        }\n        [imageData increaseLengthBy:4];\n        \n        [imageData appendData:temp.overflowData];\n       \n    }\n    \n    [dataWriters removeAllObjects];\n    \n    // for each dictionary get the \n    \n     //add in the thumbnail - if any\n     if (thumbnailOffsetPointer != 0){\n         \n         [EXFUtils write4Bytes:&ptr :[NSNumber numberWithInt:([imageData length] -initialSize) -6]:TRUE];\n         Debug(@\"Replacing bytes at %i with thumbnailOffset Pointer %i\",thumbnailOffsetPointer,([imageData length] -initialSize)-6);\n         [imageData replaceBytesInRange:NSMakeRange(thumbnailOffsetPointer, 4) withBytes:bytes];\n         \n         Debug(@\" Adding  thumbnail Data %@\", self.keyedThumbnailTagValues);\n         \n         [self getDataFromMap:self.keyedThumbnailTagValues: dataWriters: &ptr: 8: 6];\n          EXFWriter* temp = [dataWriters objectAtIndex:0];\n          \n         [imageData appendData:temp.tagData];\n         // add back in any thubnail values here\n         [imageData increaseLengthBy:4];\n         \n         [imageData appendData:temp.overflowData];\n         if (self.thumbnailBytes != nil){\n             Debug(@\"Adding %i thumbnail bytes to block\",[self.thumbnailBytes length]);\n             [imageData appendData:self.thumbnailBytes];\n         }else{\n             \n             Debug(@\"No Thumbnail bytes found\");\n         }\n         \n    } else{\n        \n        Debug(@\"No thumbnail tags found\");\n    }\n     [dataWriters release];\n     \n    Debug(@\"Got Final data block of size %i\", [imageData length] -initialSize);\n    // write the size back out\n    \n\n    \n}\n\n@end\n"
  },
  {
    "path": "EXIF/EXFMutableMetaData.h",
    "content": "/*\n *  EXFMutableMetaData.h\n *  iphoneGeo\n *\n *  Created by steve woodcock on 23/03/2008.\n *  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n */\n#import \"EXFMetaData.h\"\n#import \"EXFJFIF.h\"\n\n \n/* Mutable interface Category for EXFJFIF */\n\n@interface EXFJFIF ()\n\n\n- (void) parseJfif:(CFDataRef*) theJfifData;\n\n@property (readwrite, retain) NSString* identifier;\n@property (readwrite, retain) NSString* version;\n\n@property (readwrite, retain) NSData* thumbnail;\n\n// primitive attributes\n@property (readwrite) JFIFUnits units;\n@property (readwrite) int length;\n@property (readwrite) int resolutionX;\n@property (readwrite) int resolutionY;\n\n@property (readwrite) int thumbnailX;\n@property (readwrite) int thumbnailY;\n\n@end\n\n/* Mutable interface Category for EXFObject */\n@interface EXFMetaData ()\n\n\n\n- (void) parseExif:(CFDataRef*) theExifData;\n- (void) getData: (NSMutableData*) imageData;\n\n-(void) setupHandlers;\n\n\n@property (readwrite,retain) NSMutableDictionary* userKeyedHandlers;\n\n@property (readwrite,retain) NSMutableDictionary* keyedHandlers;\n@property (readwrite,retain) EXFTagDefinitionHolder* tagDefinitions;\n@property (readwrite, retain) NSMutableDictionary* keyedTagValues;\n\n@property (readwrite,retain) NSMutableDictionary* keyedThumbnailTagValues;\n\n@property (readwrite,retain) NSData* thumbnailBytes;\n\n@property (readwrite) int compression;\n@property (readwrite) int bitsPerPixel;\n@property (readwrite) int height;\n@property (readwrite) int width;\n@property (readwrite) CFIndex byteLength;\n\n@property (readwrite) BOOL bigEndianOrder;\n@property (readwrite) ByteArray* exif_ptr;\n\n\n@end"
  },
  {
    "path": "EXIF/EXFTagDefinitionHolder.h",
    "content": "//\n//  EXFTagDefinition.h\n//  iphone-test\n//\n//  Created by steve woodcock on 26/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"EXFConstants.h\"\n\n@interface EXFTagDefinitionHolder :NSObject {\n\nNSMutableDictionary* definitions;\n}\n \n@property (readwrite, retain) NSDictionary* definitions;\n\n-(void) addTagDefinition: (EXFTag*) aTagDefinition forKey: (NSNumber*) aTagKey;\n\n@end\n\n\n\n"
  },
  {
    "path": "EXIF/EXFTagDefinitionHolder.m",
    "content": "//\n//  EXFTagDefinition.m\n//  iphone-test\n//\n//  Created by steve woodcock on 26/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n/*\nThe Follwoing specifications were used for tag data:\nhttp://www.exif.org/Exif2-2.PDF\nhttp://ceres.informatik.fh-kl.de/pbw/lehre/20041/foto/resourcen/Dokumentation/Exif/cp3461.pdf\n*/\n\n#import \"EXFTagDefinitionHolder.h\"\n#import \"EXFMetaData.h\"\n\n\n\n\n@implementation EXFTagDefinitionHolder: NSObject\n\n@synthesize definitions;\n\n-(void) addTagDefinition: (EXFTag*) aTagDefinition forKey: (NSNumber*) aTagKey{\n   // [definitions setObject:aTagDefinition forKey:aTagKey];\n}\n\n-(void) createTags {\n    NSMutableDictionary* tags = [[NSMutableDictionary alloc] init];\n    \n    EXFTag* tag = [[EXFTag alloc] initWith: 0x0100 : FMT_ULONG :@\"ImageWidth\":-1: TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x100]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0101 : FMT_ULONG :@\"ImageLength\":-1: TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x101]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0102 : FMT_USHORT :@\"BitsPerSample\":-1: TRUE:3];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x102]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0103 : FMT_USHORT :@\"Compression\":-1: TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x103]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0106 : FMT_USHORT :@\"PhotometricInterpretation\":-1: TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x106]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0111 : FMT_ULONG :@\"StripOffsets\":-1: TRUE:-1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x111]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0112 : FMT_USHORT :@\"Orientation\":-1: TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x112]];\n    [tag release];\n     \n    tag = [[EXFTag alloc] initWith:0x0115 : FMT_USHORT :@\"SamplesPerPixel\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x115]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0116 : FMT_ULONG :@\"RowsPerStrip\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x116]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0117 : FMT_ULONG :@\"StripByteCounts\":-1:TRUE:-1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x117]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x010e : FMT_STRING :@\"ImageDescription\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x010e]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x010f : FMT_STRING :@\"Make\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x010f]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0110 : FMT_STRING :@\"Model\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0110]];\n    [tag release];\n    \n    \n    tag = [[EXFTag alloc] initWith:0x011a : FMT_URATIONAL :@\"XResolution\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x011a]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x011b : FMT_URATIONAL :@\"YResolution\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x011b]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x011c : FMT_USHORT :@\"PlanarConfiguration\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x011c]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0128 : FMT_USHORT :@\"ResolutionUnit\":-1:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0128]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0131 : FMT_STRING :@\"Software\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0131]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0132 : FMT_STRING :@\"DateTime\":-1:  TRUE:20];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0132]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x013b : FMT_STRING :@\"Artist\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x013b]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x013c : FMT_STRING :@\"HostComputer\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x013c]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x013d : FMT_USHORT :@\"Predictor\":-1:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x013d]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x013e : FMT_URATIONAL :@\"WhitePoint\":-1:  TRUE:2];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x013e]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x013f : FMT_URATIONAL :@\"PrimaryChromaticities\":-1:  TRUE:6];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x013f]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0201 : FMT_ULONG :@\"JPEGInterchangeFormat\":-1:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0201]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0202 : FMT_ULONG :@\"JPEGInterchangeFormatLength\":-1:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0202]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0211 : FMT_URATIONAL :@\"YCbCrCoefficients\":-1:  TRUE:3];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0211]];\n    [tag release];\n    \n    \n    tag = [[EXFTag alloc] initWith:0x0212 : FMT_USHORT :@\"YCbCrSubSampling\":-1:  TRUE:2];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0212]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0213 : FMT_USHORT :@\"YCbCrPositioning\":-1:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0213]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0214 : FMT_URATIONAL :@\"ReferenceBlackWhite\":-1:  TRUE:6];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0214]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x8298 : FMT_STRING :@\"Copyright\":-1:  TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x08298]];\n    [tag release];\n    \n    // Exif ID Tags\n    \n    tag = [[EXFTag alloc] initWith:0x829a : FMT_URATIONAL :@\"ExposureTime\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x829a]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x829d : FMT_URATIONAL :@\"FNumber\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x829d]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x8822 : FMT_USHORT :@\"ExposureProgram\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x8822]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x8824 : FMT_STRING :@\"SpectralSensitivity\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x8824]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x8827 : FMT_STRING :@\"ISOSpeedratings\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x8827]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9000 : FMT_UNDEFINED :@\"ExifVersion\":0x8769:TRUE:4];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9000]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9003 : FMT_STRING :@\"DateTimeOriginal\":0x8769:TRUE:20];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9003]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9004 : FMT_STRING :@\"DateTimeDigitized\":0x8769:TRUE:20];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9004]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9102 : FMT_URATIONAL :@\"CompressedBitsPerPixel\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9102]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9201 : FMT_SRATIONAL :@\"ShutterSpeedValue\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9201]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9202 : FMT_URATIONAL :@\"ApertureValue\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9202]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9203 : FMT_SRATIONAL :@\"BrightnessValue\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9203]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9204 : FMT_SRATIONAL :@\"ExposureBiasValue\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9204]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9205 : FMT_URATIONAL :@\"MaxApertureRatioValue\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9205]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9206 : FMT_URATIONAL :@\"SubjectDistance\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9206]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9207 : FMT_USHORT :@\"MeteringMode\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9207]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9208 : FMT_USHORT :@\"LightSource\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9208]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9209 : FMT_USHORT :@\"Flash\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9209]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x920a : FMT_URATIONAL :@\"FocalLength\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x920a]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x927c : FMT_UNDEFINED :@\"MakerNote\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x927c]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9286 : FMT_UNDEFINED :@\"UserComment\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9286]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9290 : FMT_STRING :@\"SubSecTime\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9290]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9291 : FMT_STRING :@\"SubSecTimeOriginal\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9291]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x9292 : FMT_STRING :@\"SubSecTimeDigitized\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x9292]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa300 : FMT_UNDEFINED :@\"FileSource\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa300]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa301 : FMT_UNDEFINED :@\"SceneType\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa301]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa302 : FMT_UNDEFINED :@\"CFAPattern\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa302]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa000 : FMT_UNDEFINED :@\"FlashpixVersion\":0x8769:TRUE:4];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa000]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa001 : FMT_USHORT :@\"ColorSpace\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa001]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa002 : FMT_ULONG :@\"PixelXDimension\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa002]];\n    [tag release];\n\n    \n    tag = [[EXFTag alloc] initWith:0xa003 : FMT_ULONG :@\"PixelYDimension\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa003]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa20e : FMT_URATIONAL :@\"FocalPlaneXResolution\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa20e]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa20f : FMT_URATIONAL :@\"FocalPlaneYResolution\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa20f]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa210 : FMT_USHORT :@\"FocalPlaneResolutionUnit\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa210]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa214 : FMT_USHORT :@\"SubjectLocation\":0x8769:TRUE:2];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa214]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa215 : FMT_URATIONAL :@\"ExposureTime\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa215]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa217 : FMT_USHORT :@\"SensingMethod\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa217]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa300 : FMT_UNDEFINED :@\"FileSource\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa300]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa302 : FMT_UNDEFINED :@\"CFAPattern\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa302]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa301 : FMT_UNDEFINED :@\"SceneType\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa301]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa401 : FMT_USHORT :@\"CustomRendered\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa401]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa402 : FMT_USHORT :@\"ExposureMode\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa402]];\n    [tag release];\n    \n    \n    tag = [[EXFTag alloc] initWith:0xa403 : FMT_USHORT :@\"WhiteBalance\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa403]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa404 : FMT_URATIONAL :@\"DigitalZoomRatio\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa404]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa405 : FMT_USHORT :@\"FocalLengthIn35mmFilm\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa405]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa406 : FMT_USHORT :@\"SceneCaptureType\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa406]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa407 : FMT_URATIONAL :@\"GainControl\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa407]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa408 : FMT_USHORT :@\"Contrast\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa408]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa409 : FMT_USHORT :@\"Saturation\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa409]];\n    [tag release];\n    \n    \n    tag = [[EXFTag alloc] initWith:0xa40a : FMT_USHORT :@\"Sharpness\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa40a]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa40b : FMT_UNDEFINED :@\"DeviceSettingDescription\":0x8769:TRUE:-99];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa40b]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0xa40c : FMT_USHORT :@\"SubjectDistanceRange\":0x8769:TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa40c]];\n    [tag release];\n    \n    \n    tag = [[EXFTag alloc] initWith:0xa500 : FMT_URATIONAL :@\"Gamma\":0x8769:FALSE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0xa500]];\n    [tag release];\n    // gps tags\n    tag = [[EXFTag alloc] initWith:0x0000 : FMT_BYTE :@\"GPSVersion\":0x8825:TRUE:4];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0000]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0001 : FMT_STRING :@\"GPSLatitudeRef\":0x8825:  TRUE:2];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0001]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0002 : FMT_URATIONAL :@\"GPSLatitude\":0x8825:  TRUE:3];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0002]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0003 : FMT_STRING :@\"GPSLongitudeRef\":0x8825:  TRUE:2];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0003]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0004 : FMT_URATIONAL :@\"GPSLongitude\":0x8825:  TRUE:3];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0004]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0005 : FMT_BYTE :@\"GPSAltitudeRef\":0x8825:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0005]];\n    [tag release];\n    \n    tag = [[EXFTag alloc] initWith:0x0006 : FMT_URATIONAL :@\"GPSAltitude\":0x8825:  TRUE:1];\n    [tags setObject:tag forKey:[NSNumber numberWithInt:0x0006]];\n     [tag release];\n     \n     tag = [[EXFTag alloc] initWith:0x0007 : FMT_URATIONAL :@\"GPSTimeStamp\":0x8825:  TRUE:3];\n     [tags setObject:tag forKey:[NSNumber numberWithInt:0x0007]];\n      [tag release];\n      \n      tag = [[EXFTag alloc] initWith:0x0008 : FMT_STRING :@\"GPSSatellites\":0x8825:  TRUE:-99];\n      [tags setObject:tag forKey:[NSNumber numberWithInt:0x0008]];\n       [tag release];\n       \n       tag = [[EXFTag alloc] initWith:0x0009 : FMT_STRING :@\"GPSStatus\":0x8825:  TRUE:2];\n       [tags setObject:tag forKey:[NSNumber numberWithInt:0x0009]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x000a : FMT_STRING :@\"GPSMeasureMode\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000a]];\n        [tag release]; \n        \n        tag = [[EXFTag alloc] initWith:0x000b : FMT_URATIONAL :@\"GPSDOP\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000b]];\n        [tag release]; \n        \n        tag = [[EXFTag alloc] initWith:0x000c : FMT_STRING :@\"GPSSpeedRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000c]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x000d : FMT_URATIONAL :@\"GPSSpeed\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000d]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x000e : FMT_STRING :@\"GPSTrackRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000e]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x000f : FMT_URATIONAL :@\"GPSTrack\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x000f]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0010 : FMT_STRING :@\"GPSImgDirectionRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0010]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0011 : FMT_URATIONAL :@\"GPSImgDirection\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0011]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0012 : FMT_STRING :@\"GPSMapDatum\":0x8825:  TRUE:-99];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0012]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0013 : FMT_STRING :@\"GPSDestLatitudeRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0013]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0014 : FMT_URATIONAL :@\"GPSDestLatitude\":0x8825:  TRUE:3];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0014]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0015 : FMT_STRING :@\"GPSDestLongitudeRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0015]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0016 : FMT_URATIONAL :@\"GPSDestLongitude\":0x8825:  TRUE:3];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0016]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0017 : FMT_STRING :@\"GPSDestBearingRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0017]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0018 : FMT_URATIONAL :@\"GPSDestBearing\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0018]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x0019 : FMT_STRING :@\"GPSDestDistanceRef\":0x8825:  TRUE:2];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x0019]];\n        [tag release];\n        \n        tag = [[EXFTag alloc] initWith:0x001a : FMT_URATIONAL :@\"GPSDestDistance\":0x8825:  TRUE:1];\n        [tags setObject:tag forKey:[NSNumber numberWithInt:0x001a]];\n        [tag release];\n        \n        \n        \n        self.definitions = tags;\n        \n        [tags release];\n        \n        \n     \n        }\n        \n-(id) init {\n\n    if (self = [super init]) {\n        [self createTags];\n    }\n    return self;\n}\n\n-(void) dealloc{\n\n    self.definitions =nil;\n    [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "EXIF/EXFUtils.h",
    "content": "/*\n *  EXFUtils.h\n *  iphoneGeo\n *\n *  Created by steve woodcock on 23/03/2008.\n *  Copyright 2008. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n *\n * Static helper methods to deal with byte array read/write and big endian/little endian ordering\n */\n\n#import \"EXFConstants.h\"\n\n\n@interface EXFUtils : NSObject {\n \n}\n\n+(UInt32) read4Bytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder;\n+(SInt32) read4SignedBytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder;\n+(UInt16) read2Bytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder;\n+(SInt16) read2SignedBytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder;\n\n+(void) write1Byte:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder;\n+(void) write1SignedByte:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder;\n+(void) write4Bytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder;\n+(void) write4SignedBytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder;\n+(void) write2Bytes:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder;\n+(void) write2SignedBytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder;\n\n+(NSString*)newStringFromBuffer:(UInt8**) ptr: (UInt32) byteCount: (NSStringEncoding) encoding;\n\n\n+(void) appendRationalToData:( NSMutableData*) target: (NSNumber*) rational: (BOOL) bigEndianOrder;\n+(void) appendFractionToData:( NSMutableData*) target: (EXFraction*) fraction: (BOOL) bigEndianOrder;\n\n+(void) convertRationalToFraction: (long**) numDenumArray: (NSNumber*) rational;\n\n\n@end\n"
  },
  {
    "path": "EXIF/EXFUtils.m",
    "content": "//\n//  EXFUtils.m\n//  iphone-test\n//\n//  Created by steve woodcock on 30/03/2008.\n//  Copyright 2008 __MyCompanyName__. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import \"EXFUtils.h\"\n#import \"EXFConstants.h\"\n\n@implementation EXFUtils\n\n/* Start of utility helper methods */\n+(UInt32) read4Bytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder\n{\n    UInt8* ptr = *bytePtr;\n    UInt32 val =0;\n\tif (bigEndianOrder)\n\t\tval= ((ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]);\n\telse\n\t\tval = ((ptr[3] << 24) | (ptr[2] << 16) | (ptr[1] << 8) | ptr[0]);\n    return val;\n}\n\n\n\n+(SInt32) read4SignedBytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder\n{\n    UInt8* ptr = *bytePtr;\n    SInt32 val =0;\n\tif (bigEndianOrder)\n\t\tval= ((ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]);\n\telse\n\t\tval = ((ptr[3] << 24) | (ptr[2] << 16) | (ptr[1] << 8) | ptr[0]);\n    return val;\n}\n\n\n\n+(UInt16) read2Bytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder\n{\n     UInt8* ptr = *bytePtr;\n    UInt16 val =0;\n    \n\tif (bigEndianOrder){\n     \n\t\tval = ((ptr[0] << 8) | ptr[1]);\n\t}else{\n\t\tval =((ptr[1] << 8) | ptr[0]);\n    }\n    return val;\n}\n\n+(SInt16) read2SignedBytes:(UInt8**) bytePtr: (BOOL) bigEndianOrder\n{\n     UInt8* ptr = *bytePtr;\n    SInt16 val =0;\n    \n\tif (bigEndianOrder){\n\t\tval = ((ptr[0] << 8) | ptr[1]);\n\t}else{\n\t\tval =((ptr[1] << 8) | ptr[0]);\n    }\n    return val;\n}\n\n\n+(void) write4Bytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder{\n    UInt32 val = [((NSNumber*)value) unsignedLongValue];\n    \n    UInt8* ptr = *bytePtr;\n    \n\tif (bigEndianOrder){\n        ptr[0] = (UInt8) (val >> 24);\n        ptr[1] = (UInt8) ( val >> 16);\n        ptr[2] = (UInt8) (val >> 8);\n        ptr[3] = (UInt8) (val);\n        }\n\telse{\n\t\tptr[3] = (UInt8) (val >> 24);\n        ptr[2] = (UInt8) (val >> 16);\n        ptr[1] = (UInt8) (val >> 8);\n        ptr[0] = (UInt8) (val );\n        }\n    }\n\n+(void) write4SignedBytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder{\n    SInt32 val = [((NSNumber*)value) longValue];\n    \n    UInt8* ptr = *bytePtr;\n    \n    if (bigEndianOrder){\n        ptr[0] = (UInt8) (val >> 24);\n        ptr[1] = (UInt8) (val >> 16);\n        ptr[2] = (UInt8) (val >> 8);\n        ptr[3] = (UInt8) (val & 0xff);\n    }\n\telse{\n    ptr[3] = (UInt8) (val >> 24);\n    ptr[2] = (UInt8) (val >> 16);\n    ptr[1] = (UInt8) (val >> 8);\n    ptr[0] = (UInt8) (val & 0xff);\n        }\n\n    \n    }\n\n+(void) write2Bytes:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder{\n    UInt16 val = [((NSNumber*)value) unsignedIntValue];\n    \n    UInt8* ptr = *bytePtr;\n    if (bigEndianOrder){\n        ptr[0] = (UInt8) (val >> 8);\n        ptr[1] = (UInt8) (val & 0xff);\n        ptr[2] = ptr[3] =0;\n    }\n\telse{\n        ptr[1] = (UInt8) (val >> 8);\n        ptr[0] = (UInt8) (val & 0xff);\n        ptr[2] = ptr[3] =0;\n    }\n    \n    }\n\n+(void) write1Byte:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder{\n    UInt16 val = [((NSNumber*)value) unsignedCharValue];\n    \n    UInt8* ptr = *bytePtr;\n\n        ptr[0] = (UInt8) (val & 0xff);\n        ptr[1] = ptr[2] = ptr[3] =0;\n   \n    \n}\n\n+(void) write1SignedByte:(UInt8**) bytePtr: (id) value:(BOOL) bigEndianOrder{\n    UInt16 val = [((NSNumber*)value) intValue];\n    \n    UInt8* ptr = *bytePtr;\n    \n    ptr[0] = (UInt8) (val & 0xff);\n    ptr[1] = ptr[2] = ptr[3] =0;\n    \n    \n}\n\n+(void) write2SignedBytes:(UInt8**) bytePtr: (id) value: (BOOL) bigEndianOrder{\n    SInt16 val = [((NSNumber*)value) intValue];\n    UInt8* ptr = *bytePtr;\n    \n    if (bigEndianOrder){\n        ptr[0] = (UInt8) (val >> 8);\n        ptr[1] = (UInt8) (val & 0xff);\n        ptr[2] = ptr[3] =0;\n    }\n\telse{\n        ptr[1] = (UInt8) (val >> 8);\n        ptr[0] = (UInt8) (val & 0xff);\n        ptr[2] = ptr[3] =0;\n    }\n    \n}\n\n+(NSString*)newStringFromBuffer:(UInt8**) ptr: (UInt32) byteCount: (NSStringEncoding) encoding{\n    \n    NSString* result =   [[NSString alloc] initWithBytes:*ptr length:byteCount encoding:encoding];\n    // Debug(@\"Created string %@\", result);\n    return result;                          \n}\n\n+(void) appendRationalToData:( NSMutableData*) target: (NSNumber*) rational: (BOOL) bigEndianOrder {\n   \n    UInt8* bytes[4];\n    UInt8* bytePtr = (UInt8*)bytes;\n    \n    long temp[2] = {0.0L, 0.0L};\n    long* ptr = temp;\n    [EXFUtils convertRationalToFraction:&ptr :rational];\n    \n    [EXFUtils write4Bytes:&bytePtr :[NSNumber numberWithLong:temp[0]] :bigEndianOrder];\n    [target appendBytes:bytePtr length:4]; \n    \n    [EXFUtils write4Bytes:&bytePtr :[NSNumber numberWithLong:temp[1]] :bigEndianOrder];\n    [target appendBytes:bytePtr length:4];    \n    }\n    \n+(void) appendFractionToData:( NSMutableData*) target: (EXFraction*) fraction: (BOOL) bigEndianOrder {\n    \n    UInt8* bytes[4];\n    UInt8* bytePtr = (UInt8*)bytes;\n    \n    \n    [EXFUtils write4Bytes:&bytePtr :[NSNumber numberWithLong:fraction.numerator] :bigEndianOrder];\n    [target appendBytes:bytePtr length:4]; \n    \n    [EXFUtils write4Bytes:&bytePtr :[NSNumber numberWithLong:fraction.denominator] :bigEndianOrder];\n    [target appendBytes:bytePtr length:4];    \n}\n\n+(long) ofr_gcd_euclid:  (long) n:  (long) m\n{\n    /*\n     Finds greatest divisor, d, of n and m:   n%d==0, m%d==0\n     Restate that as:  n=n'*d, m=m'*d for some n', m',d; find d\n     Note that if you have any numbers q,r such that q*m+r=n, then q*m+r=n'd --> r=(n'-q*m')d\n     */\n    \n    if (n < m) {\n        long t = n;\n        n = m;\n        m = t;\n    }\n    for(;;) {\n      //  assert (n >= m);\n        long r = n % m;\n        if (r == 0)\n            return m;  /* n is a multiple of m */\n        n = m;\n        m = r;\n    }\n}\n\n\n\n+(void) convertRationalToFraction: (long**) numDenumArray: (NSNumber*) rational{\n    \n    // see how many digits there are\n    double originalNumber = [rational doubleValue];\n    double number = originalNumber;\n    BOOL negative = FALSE;\n    long long den =0;\n    long long num =0;\n    \n    long* ptr = *numDenumArray;\n    \n    long long count =1;\n    \n    if (number <0){\n        negative = TRUE;\n       \n    }\n    \n         \n    // we should now have number / thousands\n    // now work out gcd;\n           \n    if (number == 0) {\n        // set denominator to 1 to prevent divide by 0 issues\n        den =1;\n    } else if (number ==1){\n        // set all to 1\n        den= num = 1;\n    } else{\n        // count the number of digits\n        while (number != ((long long)number)){\n               number *=10;\n               count*=10;\n            // overflow - restrict to 9 decimal places\n                if (number <0 || count >=10000000){\n                    count =1000000;\n                    number = (long long)(originalNumber * count);\n                    break;\n                    }\n               }\n        long gcd =  [EXFUtils ofr_gcd_euclid: number:  count];\n               num = number/gcd;\n               den = count/gcd;\n    }\n    \n    if (negative){\n        num = abs(num);\n    }\n    ptr[0]\t= num;\n    ptr[1] = den;\n     \n}\n \n\n@end\n"
  },
  {
    "path": "FMDB/FMDatabase.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n#import \"FMResultSet.h\"\n\n@interface FMDatabase : NSObject \n{\n\tsqlite3*    db;\n\tNSString*   databasePath;\n    BOOL        logsErrors;\n    BOOL        crashOnErrors;\n    BOOL        inUse;\n    BOOL        inTransaction;\n    BOOL        traceExecution;\n    BOOL        checkedOut;\n    int         busyRetryTimeout;\n    BOOL        shouldCacheStatements;\n    NSMutableDictionary *cachedStatements;\n}\n\n\n+ (id)databaseWithPath:(NSString*)inPath;\n- (id)initWithPath:(NSString*)inPath;\n\n- (BOOL)open;\n#if SQLITE_VERSION_NUMBER >= 3005000\n- (BOOL)openWithFlags:(int)flags;\n#endif\n- (BOOL)close;\n- (BOOL)goodConnection;\n- (void)clearCachedStatements;\n\n// encryption methods.  You need to have purchased the sqlite encryption extensions for these to work.\n- (BOOL)setKey:(NSString*)key;\n- (BOOL)rekey:(NSString*)key;\n\n\n- (NSString *)databasePath;\n\n- (NSString*)lastErrorMessage;\n\n- (int)lastErrorCode;\n- (BOOL)hadError;\n- (sqlite_int64)lastInsertRowId;\n\n- (sqlite3*)sqliteHandle;\n\n- (BOOL)executeUpdate:(NSString*)sql, ...;\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;\n- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; // you shouldn't ever need to call this.  use the previous two instead.\n\n- (id)executeQuery:(NSString*)sql, ...;\n- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; // you shouldn't ever need to call this.  use the previous two instead.\n\n- (BOOL)rollback;\n- (BOOL)commit;\n- (BOOL)beginTransaction;\n- (BOOL)beginDeferredTransaction;\n\n- (BOOL)logsErrors;\n- (void)setLogsErrors:(BOOL)flag;\n\n- (BOOL)crashOnErrors;\n- (void)setCrashOnErrors:(BOOL)flag;\n\n- (BOOL)inUse;\n- (void)setInUse:(BOOL)value;\n\n- (BOOL)inTransaction;\n- (void)setInTransaction:(BOOL)flag;\n\n- (BOOL)traceExecution;\n- (void)setTraceExecution:(BOOL)flag;\n\n- (BOOL)checkedOut;\n- (void)setCheckedOut:(BOOL)flag;\n\n- (int)busyRetryTimeout;\n- (void)setBusyRetryTimeout:(int)newBusyRetryTimeout;\n\n- (BOOL)shouldCacheStatements;\n- (void)setShouldCacheStatements:(BOOL)value;\n\n- (NSMutableDictionary *)cachedStatements;\n- (void)setCachedStatements:(NSMutableDictionary *)value;\n\n\n+ (NSString*)sqliteLibVersion;\n\n- (int)changes;\n\n@end\n\n@interface FMStatement : NSObject {\n    sqlite3_stmt *statement;\n    NSString *query;\n    long useCount;\n}\n\n\n- (void)close;\n- (void)reset;\n\n- (sqlite3_stmt *)statement;\n- (void)setStatement:(sqlite3_stmt *)value;\n\n- (NSString *)query;\n- (void)setQuery:(NSString *)value;\n\n- (long)useCount;\n- (void)setUseCount:(long)value;\n\n\n@end\n\n"
  },
  {
    "path": "FMDB/FMDatabase.m",
    "content": "#import \"FMDatabase.h\"\n#import \"unistd.h\"\n\n@implementation FMDatabase\n\n+ (id)databaseWithPath:(NSString*)aPath {\n    return [[[self alloc] initWithPath:aPath] autorelease];\n}\n\n- (id)initWithPath:(NSString*)aPath {\n    self = [super init];\n\t\n    if (self) {\n        databasePath        = [aPath copy];\n        db                  = 0x00;\n        logsErrors          = 0x00;\n        crashOnErrors       = 0x00;\n        busyRetryTimeout    = 0x00;\n    }\n\t\n\treturn self;\n}\n\n- (void)dealloc {\n\t[self close];\n    \n    [cachedStatements release];\n    [databasePath release];\n\t\n    [super dealloc];\n}\n\n+ (NSString*)sqliteLibVersion {\n    return [NSString stringWithFormat:@\"%s\", sqlite3_libversion()];\n}\n\n- (NSString *)databasePath {\n    return databasePath;\n}\n\n- (sqlite3*)sqliteHandle {\n    return db;\n}\n\n- (BOOL)open {\n\tint err = sqlite3_open([databasePath fileSystemRepresentation], &db );\n\tif(err != SQLITE_OK) {\n        NSLog(@\"error opening!: %d\", err);\n\t\treturn NO;\n\t}\n\t\n\treturn YES;\n}\n\n#if SQLITE_VERSION_NUMBER >= 3005000\n- (BOOL)openWithFlags:(int)flags {\n    int err = sqlite3_open_v2([databasePath fileSystemRepresentation], &db, flags, NULL /* Name of VFS module to use */);\n\tif(err != SQLITE_OK) {\n\t\tNSLog(@\"error opening!: %d\", err);\n\t\treturn NO;\n\t}\n\treturn YES;\n}\n#endif\n\n\n- (BOOL)close {\n    \n    [self clearCachedStatements];\n    \n\tif (!db) {\n        return YES;\n    }\n    \n    int  rc;\n    BOOL retry;\n    int numberOfRetries = 0;\n    do {\n        retry   = NO;\n        rc      = sqlite3_close(db);\n        if (SQLITE_BUSY == rc) {\n            retry = YES;\n            usleep(20);\n            if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {\n                NSLog(@\"%s:%d\", __FUNCTION__, __LINE__);\n                NSLog(@\"Database busy, unable to close\");\n                return NO;\n            }\n        }\n        else if (SQLITE_OK != rc) {\n            NSLog(@\"error closing!: %d\", rc);\n        }\n    }\n    while (retry);\n    \n\tdb = nil;\n    return YES;\n}\n\n- (void)clearCachedStatements {\n    \n    NSEnumerator *e = [cachedStatements objectEnumerator];\n    FMStatement *cachedStmt;\n\n    while ((cachedStmt = [e nextObject])) {\n    \t[cachedStmt close];\n    }\n    \n    [cachedStatements removeAllObjects];\n}\n\n- (FMStatement*)cachedStatementForQuery:(NSString*)query {\n    return [cachedStatements objectForKey:query];\n}\n\n- (void)setCachedStatement:(FMStatement*)statement forQuery:(NSString*)query {\n    //NSLog(@\"setting query: %@\", query);\n    query = [query copy]; // in case we got handed in a mutable string...\n    [statement setQuery:query];\n    [cachedStatements setObject:statement forKey:query];\n    [query release];\n}\n\n\n- (BOOL)rekey:(NSString*)key {\n#ifdef SQLITE_HAS_CODEC\n    if (!key) {\n        return NO;\n    }\n    \n    int rc = sqlite3_rekey(db, [key UTF8String], strlen([key UTF8String]));\n    \n    if (rc != SQLITE_OK) {\n        NSLog(@\"error on rekey: %d\", rc);\n        NSLog(@\"%@\", [self lastErrorMessage]);\n    }\n    \n    return (rc == SQLITE_OK);\n#else\n    return NO;\n#endif\n}\n\n- (BOOL)setKey:(NSString*)key {\n#ifdef SQLITE_HAS_CODEC\n    if (!key) {\n        return NO;\n    }\n    \n    int rc = sqlite3_key(db, [key UTF8String], strlen([key UTF8String]));\n    \n    return (rc == SQLITE_OK);\n#else\n    return NO;\n#endif\n}\n\n- (BOOL)goodConnection {\n    \n    if (!db) {\n        return NO;\n    }\n    \n    FMResultSet *rs = [self executeQuery:@\"select name from sqlite_master where type='table'\"];\n    \n    if (rs) {\n        [rs close];\n        return YES;\n    }\n    \n    return NO;\n}\n\n- (void)compainAboutInUse {\n    NSLog(@\"The FMDatabase %@ is currently in use.\", self);\n    \n    if (crashOnErrors) {\n        NSAssert1(false, @\"The FMDatabase %@ is currently in use.\", self);\n    }\n}\n\n- (NSString*)lastErrorMessage {\n    return [NSString stringWithUTF8String:sqlite3_errmsg(db)];\n}\n\n- (BOOL)hadError {\n    int lastErrCode = [self lastErrorCode];\n    \n    return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW);\n}\n\n- (int)lastErrorCode {\n    return sqlite3_errcode(db);\n}\n\n- (sqlite_int64)lastInsertRowId {\n    \n    if (inUse) {\n        [self compainAboutInUse];\n        return NO;\n    }\n    [self setInUse:YES];\n    \n    sqlite_int64 ret = sqlite3_last_insert_rowid(db);\n    \n    [self setInUse:NO];\n    \n    return ret;\n}\n\n- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt; {\n    \n    if ((!obj) || ((NSNull *)obj == [NSNull null])) {\n        sqlite3_bind_null(pStmt, idx);\n    }\n    \n    // FIXME - someday check the return codes on these binds.\n    else if ([obj isKindOfClass:[NSData class]]) {\n        sqlite3_bind_blob(pStmt, idx, [obj bytes], (int)[obj length], SQLITE_STATIC);\n    }\n    else if ([obj isKindOfClass:[NSDate class]]) {\n        sqlite3_bind_double(pStmt, idx, [obj timeIntervalSince1970]);\n    }\n    else if ([obj isKindOfClass:[NSNumber class]]) {\n        \n        if (strcmp([obj objCType], @encode(BOOL)) == 0) {\n            sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0));\n        }\n        else if (strcmp([obj objCType], @encode(int)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longValue]);\n        }\n        else if (strcmp([obj objCType], @encode(long)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longValue]);\n        }\n        else if (strcmp([obj objCType], @encode(long long)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longLongValue]);\n        }\n        else if (strcmp([obj objCType], @encode(float)) == 0) {\n            sqlite3_bind_double(pStmt, idx, [obj floatValue]);\n        }\n        else if (strcmp([obj objCType], @encode(double)) == 0) {\n            sqlite3_bind_double(pStmt, idx, [obj doubleValue]);\n        }\n        else {\n            sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC);\n        }\n    }\n    else {\n        sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC);\n    }\n}\n\n- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args {\n    \n    if (inUse) {\n        [self compainAboutInUse];\n        return nil;\n    }\n    \n    [self setInUse:YES];\n    \n    FMResultSet *rs = nil;\n    \n    int rc                  = 0x00;;\n    sqlite3_stmt *pStmt     = 0x00;;\n    FMStatement *statement  = 0x00;\n    \n    if (traceExecution && sql) {\n        NSLog(@\"%@ executeQuery: %@\", self, sql);\n    }\n    \n    if (shouldCacheStatements) {\n        statement = [self cachedStatementForQuery:sql];\n        pStmt = statement ? [statement statement] : 0x00;\n    }\n    \n    int numberOfRetries = 0;\n    BOOL retry          = NO;\n    \n    if (!pStmt) {\n        do {\n            retry   = NO;\n            rc      = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0);\n            \n            if (SQLITE_BUSY == rc) {\n                retry = YES;\n                usleep(20);\n                \n                if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {\n                    NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                    NSLog(@\"Database busy\");\n                    sqlite3_finalize(pStmt);\n                    [self setInUse:NO];\n                    return nil;\n                }\n            }\n            else if (SQLITE_OK != rc) {\n                \n                \n                if (logsErrors) {\n                    NSLog(@\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    NSLog(@\"DB Query: %@\", sql);\n                    if (crashOnErrors) {\n//#if defined(__BIG_ENDIAN__) && !TARGET_IPHONE_SIMULATOR\n//                        asm{ trap };\n//#endif\n                        NSAssert2(false, @\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    }\n                }\n                \n                sqlite3_finalize(pStmt);\n                \n                [self setInUse:NO];\n                return nil;\n            }\n        }\n        while (retry);\n    }\n    \n    id obj;\n    int idx = 0;\n    int queryCount = sqlite3_bind_parameter_count(pStmt); // pointed out by Dominic Yu (thanks!)\n    \n    while (idx < queryCount) {\n        \n        if (arrayArgs) {\n            obj = [arrayArgs objectAtIndex:idx];\n        }\n        else {\n            obj = va_arg(args, id);\n        }\n        \n        if (traceExecution) {\n            NSLog(@\"obj: %@\", obj);\n        }\n        \n        idx++;\n        \n        [self bindObject:obj toColumn:idx inStatement:pStmt];\n    }\n    \n    if (idx != queryCount) {\n        NSLog(@\"Error: the bind count is not correct for the # of variables (executeQuery)\");\n        sqlite3_finalize(pStmt);\n        [self setInUse:NO];\n        return nil;\n    }\n    \n    [statement retain]; // to balance the release below\n    \n    if (!statement) {\n        statement = [[FMStatement alloc] init];\n        [statement setStatement:pStmt];\n        \n        if (shouldCacheStatements) {\n            [self setCachedStatement:statement forQuery:sql];\n        }\n    }\n    \n    // the statement gets close in rs's dealloc or [rs close];\n    rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self];\n    [rs setQuery:sql];\n    \n    statement.useCount = statement.useCount + 1;\n    \n    [statement release];    \n    \n    [self setInUse:NO];\n    \n    return rs;\n}\n\n- (id)executeQuery:(NSString*)sql, ... {\n    va_list args;\n    va_start(args, sql);\n    \n    id result = [self executeQuery:sql withArgumentsInArray:nil orVAList:args];\n    \n    va_end(args);\n    return result;\n}\n\n- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments {\n    return [self executeQuery:sql withArgumentsInArray:arguments orVAList:nil];\n}\n\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args {\n    \n    if (inUse) {\n        [self compainAboutInUse];\n        return NO;\n    }\n    \n    [self setInUse:YES];\n    \n    int rc                   = 0x00;\n    sqlite3_stmt *pStmt      = 0x00;\n    FMStatement *cachedStmt = 0x00;\n    \n    if (traceExecution && sql) {\n        NSLog(@\"%@ executeUpdate: %@\", self, sql);\n    }\n    \n    if (shouldCacheStatements) {\n        cachedStmt = [self cachedStatementForQuery:sql];\n        pStmt = cachedStmt ? [cachedStmt statement] : 0x00;\n    }\n    \n    int numberOfRetries = 0;\n    BOOL retry          = NO;\n    \n    if (!pStmt) {\n        \n        do {\n            retry   = NO;\n            rc      = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0);\n            if (SQLITE_BUSY == rc) {\n                retry = YES;\n                usleep(20);\n                \n                if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {\n                    NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                    NSLog(@\"Database busy\");\n                    sqlite3_finalize(pStmt);\n                    [self setInUse:NO];\n                    return NO;\n                }\n            }\n            else if (SQLITE_OK != rc) {\n                \n                \n                if (logsErrors) {\n                    NSLog(@\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    NSLog(@\"DB Query: %@\", sql);\n                    if (crashOnErrors) {\n//#if defined(__BIG_ENDIAN__) && !TARGET_IPHONE_SIMULATOR\n//                        asm{ trap };\n//#endif\n                        NSAssert2(false, @\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    }\n                }\n                \n                sqlite3_finalize(pStmt);\n                [self setInUse:NO];\n                \n                return NO;\n            }\n        }\n        while (retry);\n    }\n    \n    \n    id obj;\n    int idx = 0;\n    int queryCount = sqlite3_bind_parameter_count(pStmt);\n    \n    while (idx < queryCount) {\n        \n        if (arrayArgs) {\n            obj = [arrayArgs objectAtIndex:idx];\n        }\n        else {\n            obj = va_arg(args, id);\n        }\n        \n        \n        if (traceExecution) {\n            NSLog(@\"obj: %@\", obj);\n        }\n        \n        idx++;\n        \n        [self bindObject:obj toColumn:idx inStatement:pStmt];\n    }\n    \n    if (idx != queryCount) {\n        NSLog(@\"Error: the bind count is not correct for the # of variables (%@) (executeUpdate)\", sql);\n        sqlite3_finalize(pStmt);\n        [self setInUse:NO];\n        return NO;\n    }\n    \n    /* Call sqlite3_step() to run the virtual machine. Since the SQL being\n     ** executed is not a SELECT statement, we assume no data will be returned.\n     */\n    numberOfRetries = 0;\n    do {\n        rc      = sqlite3_step(pStmt);\n        retry   = NO;\n        \n        if (SQLITE_BUSY == rc) {\n            // this will happen if the db is locked, like if we are doing an update or insert.\n            // in that case, retry the step... and maybe wait just 10 milliseconds.\n            retry = YES;\n            usleep(20);\n            \n            if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {\n                NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                NSLog(@\"Database busy\");\n                retry = NO;\n            }\n        }\n        else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {\n            // all is well, let's return.\n        }\n        else if (SQLITE_ERROR == rc) {\n            NSLog(@\"Error calling sqlite3_step (%d: %s) SQLITE_ERROR\", rc, sqlite3_errmsg(db));\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        else if (SQLITE_MISUSE == rc) {\n            // uh oh.\n            NSLog(@\"Error calling sqlite3_step (%d: %s) SQLITE_MISUSE\", rc, sqlite3_errmsg(db));\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        else {\n            // wtf?\n            NSLog(@\"Unknown error calling sqlite3_step (%d: %s) eu\", rc, sqlite3_errmsg(db));\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        \n    } while (retry);\n    \n    assert( rc!=SQLITE_ROW );\n    \n    \n    if (shouldCacheStatements && !cachedStmt) {\n        cachedStmt = [[FMStatement alloc] init];\n        \n        [cachedStmt setStatement:pStmt];\n        \n        [self setCachedStatement:cachedStmt forQuery:sql];\n        \n        [cachedStmt release];\n    }\n    \n    if (cachedStmt) {\n        cachedStmt.useCount = cachedStmt.useCount + 1;\n        rc = sqlite3_reset(pStmt);\n    }\n    else {\n        /* Finalize the virtual machine. This releases all memory and other\n         ** resources allocated by the sqlite3_prepare() call above.\n         */\n        rc = sqlite3_finalize(pStmt);\n    }\n    \n    [self setInUse:NO];\n    \n    return (rc == SQLITE_OK);\n}\n\n\n- (BOOL)executeUpdate:(NSString*)sql, ... {\n    va_list args;\n    va_start(args, sql);\n    \n    BOOL result = [self executeUpdate:sql withArgumentsInArray:nil orVAList:args];\n    \n    va_end(args);\n    return result;\n}\n\n\n\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments {\n    return [self executeUpdate:sql withArgumentsInArray:arguments orVAList:nil];\n}\n\n/*\n- (id) executeUpdate:(NSString *)sql arguments:(va_list)args {\n    \n}\n*/\n\n- (BOOL)rollback {\n    BOOL b = [self executeUpdate:@\"ROLLBACK TRANSACTION;\"];\n    if (b) {\n        inTransaction = NO;\n    }\n    return b;\n}\n\n- (BOOL)commit {\n    BOOL b =  [self executeUpdate:@\"COMMIT TRANSACTION;\"];\n    if (b) {\n        inTransaction = NO;\n    }\n    return b;\n}\n\n- (BOOL)beginDeferredTransaction {\n    BOOL b =  [self executeUpdate:@\"BEGIN DEFERRED TRANSACTION;\"];\n    if (b) {\n        inTransaction = YES;\n    }\n    return b;\n}\n\n- (BOOL)beginTransaction {\n    BOOL b =  [self executeUpdate:@\"BEGIN EXCLUSIVE TRANSACTION;\"];\n    if (b) {\n        inTransaction = YES;\n    }\n    return b;\n}\n\n- (BOOL)logsErrors {\n    return logsErrors;\n}\n- (void)setLogsErrors:(BOOL)flag {\n    logsErrors = flag;\n}\n\n- (BOOL)crashOnErrors {\n    return crashOnErrors;\n}\n- (void)setCrashOnErrors:(BOOL)flag {\n    crashOnErrors = flag;\n}\n\n- (BOOL)inUse {\n    return inUse || inTransaction;\n}\n\n- (void)setInUse:(BOOL)b {\n    inUse = b;\n}\n\n- (BOOL)inTransaction {\n    return inTransaction;\n}\n- (void)setInTransaction:(BOOL)flag {\n    inTransaction = flag;\n}\n\n- (BOOL)traceExecution {\n    return traceExecution;\n}\n- (void)setTraceExecution:(BOOL)flag {\n    traceExecution = flag;\n}\n\n- (BOOL)checkedOut {\n    return checkedOut;\n}\n- (void)setCheckedOut:(BOOL)flag {\n    checkedOut = flag;\n}\n\n\n- (int)busyRetryTimeout {\n    return busyRetryTimeout;\n}\n- (void)setBusyRetryTimeout:(int)newBusyRetryTimeout {\n    busyRetryTimeout = newBusyRetryTimeout;\n}\n\n\n- (BOOL)shouldCacheStatements {\n    return shouldCacheStatements;\n}\n\n- (void)setShouldCacheStatements:(BOOL)value {\n    \n    shouldCacheStatements = value;\n    \n    if (shouldCacheStatements && !cachedStatements) {\n        [self setCachedStatements:[NSMutableDictionary dictionary]];\n    }\n    \n    if (!shouldCacheStatements) {\n        [self setCachedStatements:nil];\n    }\n}\n\n- (NSMutableDictionary *) cachedStatements {\n    return cachedStatements;\n}\n\n- (void)setCachedStatements:(NSMutableDictionary *)value {\n    if (cachedStatements != value) {\n        [cachedStatements release];\n        cachedStatements = [value retain];\n    }\n}\n\n\n- (int)changes {\n    return(sqlite3_changes(db));\n}\n\n@end\n\n\n\n@implementation FMStatement\n\n- (void)dealloc {\n\t[self close];\n    [query release];\n\t[super dealloc];\n}\n\n\n- (void)close {\n    if (statement) {\n        sqlite3_finalize(statement);\n        statement = 0x00;\n    }\n}\n\n- (void)reset {\n    if (statement) {\n        sqlite3_reset(statement);\n    }\n}\n\n- (sqlite3_stmt *)statement {\n    return statement;\n}\n\n- (void)setStatement:(sqlite3_stmt *)value {\n    statement = value;\n}\n\n- (NSString *)query {\n    return query;\n}\n\n- (void)setQuery:(NSString *)value {\n    if (query != value) {\n        [query release];\n        query = [value retain];\n    }\n}\n\n- (long)useCount {\n    return useCount;\n}\n\n- (void)setUseCount:(long)value {\n    if (useCount != value) {\n        useCount = value;\n    }\n}\n\n- (NSString*)description {\n    return [NSString stringWithFormat:@\"%@ %d hit(s) for query %@\", [super description], useCount, query];\n}\n\n\n@end\n\n"
  },
  {
    "path": "FMDB/FMDatabaseAdditions.h",
    "content": "//\n//  FMDatabaseAdditions.h\n//  fmkit\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n@interface FMDatabase (FMDatabaseAdditions)\n\n\n- (int)intForQuery:(NSString*)objs, ...;\n- (long)longForQuery:(NSString*)objs, ...; \n- (BOOL)boolForQuery:(NSString*)objs, ...;\n- (double)doubleForQuery:(NSString*)objs, ...;\n- (NSString*)stringForQuery:(NSString*)objs, ...; \n- (NSData*)dataForQuery:(NSString*)objs, ...;\n- (NSDate*)dateForQuery:(NSString*)objs, ...;\n\n// Notice that there's no dataNoCopyForQuery:.\n// That would be a bad idea, because we close out the result set, and then what\n// happens to the data that we just didn't copy?  Who knows, not I.\n\n\n- (BOOL)tableExists:(NSString*)tableName;\n- (FMResultSet*)getSchema;\n- (FMResultSet*)getTableSchema:(NSString*)tableName;\n- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName;\n\n@end\n"
  },
  {
    "path": "FMDB/FMDatabaseAdditions.m",
    "content": "//\n//  FMDatabaseAdditions.m\n//  fmkit\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.. All rights reserved.\n//\n\n#import \"FMDatabase.h\"\n#import \"FMDatabaseAdditions.h\"\n\n@implementation FMDatabase (FMDatabaseAdditions)\n\n#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel)             \\\nva_list args;                                                        \\\nva_start(args, query);                                               \\\nFMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orVAList:args];   \\\nva_end(args);                                                        \\\nif (![resultSet next]) { return (type)0; }                           \\\ntype ret = [resultSet sel:0];                                        \\\n[resultSet close];                                                   \\\n[resultSet setParentDB:nil];                                         \\\nreturn ret;\n\n\n- (NSString*)stringForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex);\n}\n\n- (int)intForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex);\n}\n\n- (long)longForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex);\n}\n\n- (BOOL)boolForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex);\n}\n\n- (double)doubleForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex);\n}\n\n- (NSData*)dataForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex);\n}\n\n- (NSDate*)dateForQuery:(NSString*)query, ...; {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex);\n}\n\n\n//check if table exist in database (patch from OZLB)\n- (BOOL)tableExists:(NSString*)tableName {\n    \n    BOOL returnBool;\n    //lower case table name\n    tableName = [tableName lowercaseString];\n    //search in sqlite_master table if table exists\n    FMResultSet *rs = [self executeQuery:@\"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?\", tableName];\n    //if at least one next exists, table exists\n    returnBool = [rs next];\n    //close and free object\n    [rs close];\n    \n    return returnBool;\n}\n\n//get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]\n//check if table exist in database  (patch from OZLB)\n- (FMResultSet*)getSchema {\n    \n    //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]\n    FMResultSet *rs = [self executeQuery:@\"SELECT type, name, tbl_name, rootpage, sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type != 'meta' AND name NOT LIKE 'sqlite_%' ORDER BY tbl_name, type DESC, name\"];\n    \n    return rs;\n}\n\n//get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]\n- (FMResultSet*)getTableSchema:(NSString*)tableName {\n    \n    //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]\n    FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @\"PRAGMA table_info(%@)\", tableName]];\n    \n    return rs;\n}\n\n\n//check if column exist in table\n- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName {\n    \n    BOOL returnBool = NO;\n    //lower case table name\n    tableName = [tableName lowercaseString];\n    //lower case column name\n    columnName = [columnName lowercaseString];\n    //get table schema\n    FMResultSet *rs = [self getTableSchema: tableName];\n    //check if column is present in table schema\n    while ([rs next]) {\n        if ([[[rs stringForColumn:@\"name\"] lowercaseString] isEqualToString: columnName]) {\n            returnBool = YES;\n            break;\n        }\n    }\n    //close and free object\n    [rs close];\n    \n    return returnBool;\n}\n\n@end\n"
  },
  {
    "path": "FMDB/FMResultSet.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n\n#ifndef __has_feature      // Optional.\n#define __has_feature(x) 0 // Compatibility with non-clang compilers.\n#endif\n\n#ifndef NS_RETURNS_NOT_RETAINED\n#if __has_feature(attribute_ns_returns_not_retained)\n#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))\n#else\n#define NS_RETURNS_NOT_RETAINED\n#endif\n#endif\n\n@class FMDatabase;\n@class FMStatement;\n\n@interface FMResultSet : NSObject {\n    FMDatabase *parentDB;\n    FMStatement *statement;\n    \n    NSString *query;\n    NSMutableDictionary *columnNameToIndexMap;\n    BOOL columnNamesSetup;\n}\n\n\n+ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB;\n\n- (void)close;\n\n- (NSString *)query;\n- (void)setQuery:(NSString *)value;\n\n- (FMStatement *)statement;\n- (void)setStatement:(FMStatement *)value;\n\n- (void)setParentDB:(FMDatabase *)newDb;\n\n- (BOOL)next;\n- (BOOL)hasAnotherRow;\n\n- (int)columnIndexForName:(NSString*)columnName;\n- (NSString*)columnNameForIndex:(int)columnIdx;\n\n- (int)intForColumn:(NSString*)columnName;\n- (int)intForColumnIndex:(int)columnIdx;\n\n- (long)longForColumn:(NSString*)columnName;\n- (long)longForColumnIndex:(int)columnIdx;\n\n- (long long int)longLongIntForColumn:(NSString*)columnName;\n- (long long int)longLongIntForColumnIndex:(int)columnIdx;\n\n- (BOOL)boolForColumn:(NSString*)columnName;\n- (BOOL)boolForColumnIndex:(int)columnIdx;\n\n- (double)doubleForColumn:(NSString*)columnName;\n- (double)doubleForColumnIndex:(int)columnIdx;\n\n- (NSString*)stringForColumn:(NSString*)columnName;\n- (NSString*)stringForColumnIndex:(int)columnIdx;\n\n- (NSDate*)dateForColumn:(NSString*)columnName;\n- (NSDate*)dateForColumnIndex:(int)columnIdx;\n\n- (NSData*)dataForColumn:(NSString*)columnName;\n- (NSData*)dataForColumnIndex:(int)columnIdx;\n\n- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx;\n- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName;\n\n/*\nIf you are going to use this data after you iterate over the next row, or after you close the\nresult set, make sure to make a copy of the data first (or just use dataForColumn:/dataForColumnIndex:)\nIf you don't, you're going to be in a world of hurt when you try and use the data.\n*/\n- (NSData*)dataNoCopyForColumn:(NSString*)columnName NS_RETURNS_NOT_RETAINED;\n- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;\n\n\n- (BOOL)columnIndexIsNull:(int)columnIdx;\n- (BOOL)columnIsNull:(NSString*)columnName;\n\n- (void)kvcMagic:(id)object;\n- (NSDictionary *)resultDict;\n\n@end\n"
  },
  {
    "path": "FMDB/FMResultSet.m",
    "content": "#import \"FMResultSet.h\"\n#import \"FMDatabase.h\"\n#import \"unistd.h\"\n\n@interface FMResultSet (Private)\n- (NSMutableDictionary *)columnNameToIndexMap;\n- (void)setColumnNameToIndexMap:(NSMutableDictionary *)value;\n@end\n\n@implementation FMResultSet\n\n+ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB {\n    \n    FMResultSet *rs = [[FMResultSet alloc] init];\n    \n    [rs setStatement:statement];\n    [rs setParentDB:aDB];\n    \n    return [rs autorelease];\n}\n\n- (void)dealloc {\n    [self close];\n    \n    [query release];\n    query = nil;\n    \n    [columnNameToIndexMap release];\n    columnNameToIndexMap = nil;\n    \n    [super dealloc];\n}\n\n- (void)close {\n    \n    [statement reset];\n    [statement release];\n    statement = nil;\n    \n    // we don't need this anymore... (i think)\n    //[parentDB setInUse:NO];\n    parentDB = nil;\n}\n\n- (void)setupColumnNames {\n    \n    if (!columnNameToIndexMap) {\n        [self setColumnNameToIndexMap:[NSMutableDictionary dictionary]];\n    }    \n    \n    int columnCount = sqlite3_column_count(statement.statement);\n    \n    int columnIdx = 0;\n    for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {\n        [columnNameToIndexMap setObject:[NSNumber numberWithInt:columnIdx]\n                                 forKey:[[NSString stringWithUTF8String:sqlite3_column_name(statement.statement, columnIdx)] lowercaseString]];\n    }\n    columnNamesSetup = YES;\n}\n\n- (void)kvcMagic:(id)object {\n    \n    int columnCount = sqlite3_column_count(statement.statement);\n    \n    int columnIdx = 0;\n    for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {\n        \n        const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx);\n        \n        // check for a null row\n        if (c) {\n            NSString *s = [NSString stringWithUTF8String:c];\n            \n            [object setValue:s forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement.statement, columnIdx)]];\n        }\n    }\n}\n\n- (NSDictionary *)resultDict {\n    \n    NSInteger num_cols = sqlite3_data_count(statement.statement);\n    \n    if (num_cols > 0) {\n        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols];\n        \n        NSInteger i;\n        for (i = 0; i < num_cols; i++) {\n            \n            const char *col_name = sqlite3_column_name(statement.statement, i);\n            \n            if (col_name) {\n                NSString *colName = [NSString stringWithUTF8String:col_name];\n                id value = nil;\n                \n                // fetch according to type\n                switch (sqlite3_column_type(statement.statement, i)) {\n                    case SQLITE_INTEGER: {\n                        value = [NSNumber numberWithInt:[self intForColumnIndex:i]];\n                        break;\n                    }\n                    case SQLITE_FLOAT: {\n                        value = [NSNumber numberWithDouble:[self doubleForColumnIndex:i]];\n                        break;\n                    }\n                    case SQLITE_TEXT: {\n                        value = [self stringForColumnIndex:i];\n                        break;\n                    }\n                    case SQLITE_BLOB: {\n                        value = [self dataForColumnIndex:i];\n                        break;\n                    }\n                }\n                \n                // save to dict\n                if (value) {\n                    [dict setObject:value forKey:colName];\n                }\n            }\n        }\n        \n        return [[dict copy] autorelease];\n    }\n    else {\n        NSLog(@\"Warning: There seem to be no columns in this set.\");\n    }\n    \n    return nil;\n}\n\n- (BOOL)next {\n    \n    int rc;\n    BOOL retry;\n    int numberOfRetries = 0;\n    do {\n        retry = NO;\n        \n        rc = sqlite3_step(statement.statement);\n        \n        if (SQLITE_BUSY == rc) {\n            // this will happen if the db is locked, like if we are doing an update or insert.\n            // in that case, retry the step... and maybe wait just 10 milliseconds.\n            retry = YES;\n            usleep(20);\n            \n            if ([parentDB busyRetryTimeout] && (numberOfRetries++ > [parentDB busyRetryTimeout])) {\n                \n                NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [parentDB databasePath]);\n                NSLog(@\"Database busy\");\n                break;\n            }\n        }\n        else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {\n            // all is well, let's return.\n        }\n        else if (SQLITE_ERROR == rc) {\n            NSLog(@\"Error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([parentDB sqliteHandle]));\n            break;\n        } \n        else if (SQLITE_MISUSE == rc) {\n            // uh oh.\n            NSLog(@\"Error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([parentDB sqliteHandle]));\n            break;\n        }\n        else {\n            // wtf?\n            NSLog(@\"Unknown error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([parentDB sqliteHandle]));\n            break;\n        }\n        \n    } while (retry);\n    \n    \n    if (rc != SQLITE_ROW) {\n        [self close];\n    }\n    \n    return (rc == SQLITE_ROW);\n}\n\n- (BOOL)hasAnotherRow {\n    return sqlite3_errcode([parentDB sqliteHandle]) == SQLITE_ROW;\n}\n\n- (int)columnIndexForName:(NSString*)columnName {\n    \n    if (!columnNamesSetup) {\n        [self setupColumnNames];\n    }\n    \n    columnName = [columnName lowercaseString];\n    \n    NSNumber *n = [columnNameToIndexMap objectForKey:columnName];\n    \n    if (n) {\n        return [n intValue];\n    }\n    \n    NSLog(@\"Warning: I could not find the column named '%@'.\", columnName);\n    \n    return -1;\n}\n\n\n\n- (int)intForColumn:(NSString*)columnName {\n    return [self intForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (int)intForColumnIndex:(int)columnIdx {\n    return sqlite3_column_int(statement.statement, columnIdx);\n}\n\n- (long)longForColumn:(NSString*)columnName {\n    return [self longForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (long)longForColumnIndex:(int)columnIdx {\n    return (long)sqlite3_column_int64(statement.statement, columnIdx);\n}\n\n- (long long int)longLongIntForColumn:(NSString*)columnName {\n    return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (long long int)longLongIntForColumnIndex:(int)columnIdx {\n    return sqlite3_column_int64(statement.statement, columnIdx);\n}\n\n- (BOOL)boolForColumn:(NSString*)columnName {\n    return [self boolForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (BOOL)boolForColumnIndex:(int)columnIdx {\n    return ([self intForColumnIndex:columnIdx] != 0);\n}\n\n- (double)doubleForColumn:(NSString*)columnName {\n    return [self doubleForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (double)doubleForColumnIndex:(int)columnIdx {\n    return sqlite3_column_double(statement.statement, columnIdx);\n}\n\n- (NSString*)stringForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx);\n    \n    if (!c) {\n        // null row.\n        return nil;\n    }\n    \n    return [NSString stringWithUTF8String:c];\n}\n\n- (NSString*)stringForColumn:(NSString*)columnName {\n    return [self stringForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSDate*)dateForColumn:(NSString*)columnName {\n    return [self dateForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSDate*)dateForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]];\n}\n\n\n- (NSData*)dataForColumn:(NSString*)columnName {\n    return [self dataForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSData*)dataForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    int dataSize = sqlite3_column_bytes(statement.statement, columnIdx);\n    \n    NSMutableData *data = [NSMutableData dataWithLength:dataSize];\n    \n    memcpy([data mutableBytes], sqlite3_column_blob(statement.statement, columnIdx), dataSize);\n    \n    return data;\n}\n\n\n- (NSData*)dataNoCopyForColumn:(NSString*)columnName {\n    return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    int dataSize = sqlite3_column_bytes(statement.statement, columnIdx);\n    \n    NSData *data = [NSData dataWithBytesNoCopy:(void *)sqlite3_column_blob(statement.statement, columnIdx) length:dataSize freeWhenDone:NO];\n    \n    return data;\n}\n\n\n- (BOOL)columnIndexIsNull:(int)columnIdx {\n    return sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL;\n}\n\n- (BOOL)columnIsNull:(NSString*)columnName {\n    return [self columnIndexIsNull:[self columnIndexForName:columnName]];\n}\n\n- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    return sqlite3_column_text(statement.statement, columnIdx);\n}\n\n- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName {\n    return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n\n// returns autoreleased NSString containing the name of the column in the result set\n- (NSString*)columnNameForIndex:(int)columnIdx {\n    return [NSString stringWithUTF8String: sqlite3_column_name(statement.statement, columnIdx)];\n}\n\n- (void)setParentDB:(FMDatabase *)newDb {\n    parentDB = newDb;\n}\n\n\n- (NSString *)query {\n    return query;\n}\n\n- (void)setQuery:(NSString *)value {\n    [value retain];\n    [query release];\n    query = value;\n}\n\n- (NSMutableDictionary *)columnNameToIndexMap {\n    return columnNameToIndexMap;\n}\n\n- (void)setColumnNameToIndexMap:(NSMutableDictionary *)value {\n    [value retain];\n    [columnNameToIndexMap release];\n    columnNameToIndexMap = value;\n}\n\n- (FMStatement *)statement {\n    return statement;\n}\n\n- (void)setStatement:(FMStatement *)value {\n    if (statement != value) {\n        [statement release];\n        statement = [value retain];\n    }\n}\n\n\n\n@end\n"
  },
  {
    "path": "JSON/JSON.h",
    "content": "/*\n Copyright (C) 2009-2010 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n @mainpage A strict JSON parser and generator for Objective-C\n\n JSON (JavaScript Object Notation) is a lightweight data-interchange\n format. This framework provides two apis for parsing and generating\n JSON. One standard object-based and a higher level api consisting of\n categories added to existing Objective-C classes.\n\n This framework does its best to be as strict as possible, both in what it accepts and what it generates. For example, it does not support trailing commas in arrays or objects. Nor does it support embedded comments, or anything else not in the JSON specification. This is considered a feature. \n  \n @section Links\n\n @li <a href=\"http://stig.github.com/json-framework\">Project home page</a>.\n @li Online version of the <a href=\"http://stig.github.com/json-framework/api\">API documentation</a>. \n \n*/\n\n\n// This setting of 1 is best if you copy the source into your project. \n// The build transforms the 1 to a 0 when building the framework and static lib.\n\n#if 1\n\n#import \"SBJsonParser.h\"\n#import \"SBJsonWriter.h\"\n#import \"SBJsonStreamWriter.h\"\n#import \"NSObject+SBJSON.h\"\n#import \"NSString+SBJSON.h\"\n\n#else\n\n#import <JSON/SBJsonParser.h>\n#import <JSON/SBJsonWriter.h>\n#import <JSON/SBJsonStreamWriter.h>\n#import <JSON/NSObject+SBJSON.h>\n#import <JSON/NSString+SBJSON.h>\n\n#endif\n"
  },
  {
    "path": "JSON/LICENSE",
    "content": "Copyright (C) 2007-2010 Stig Brautaset. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n* Neither the name of the author nor the names of its contributors may be used\n  to endorse or promote products derived from this software without specific\n  prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "JSON/NSObject+SBJSON.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\n\n/**\n @brief Adds JSON generation to Foundation classes\n \n This is a category on NSObject that adds methods for returning JSON representations\n of standard objects to the objects themselves. This means you can call the\n -JSONRepresentation method on an NSArray object and it'll do what you want.\n */\n@interface NSObject (NSObject_SBJSON)\n\n/**\n @brief Returns a string containing the receiver encoded in JSON.\n\n This method is added as a category on NSObject but is only actually\n supported for the following objects:\n @li NSDictionary\n @li NSArray\n */\n- (NSString *)JSONRepresentation;\n\n@end\n\n"
  },
  {
    "path": "JSON/NSObject+SBJSON.m",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"NSObject+SBJSON.h\"\n#import \"SBJsonWriter.h\"\n\n@implementation NSObject (NSObject_SBJSON)\n\n- (NSString *)JSONRepresentation {\n    SBJsonWriter *jsonWriter = [SBJsonWriter new];    \n    NSString *json = [jsonWriter stringWithObject:self];\n    if (!json)\n        NSLog(@\"-JSONRepresentation failed. Error trace is: %@\", [jsonWriter errorTrace]);\n    [jsonWriter release];\n    return json;\n}\n\n@end\n"
  },
  {
    "path": "JSON/NSString+SBJSON.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n @brief Adds JSON parsing methods to NSString\n \nThis is a category on NSString that adds methods for parsing the target string.\n*/\n@interface NSString (NSString_SBJSON)\n\n/**\n @brief Returns the NSDictionary or NSArray represented by the current string's JSON representation.\n \n Returns the dictionary or array represented in the receiver, or nil on error.\n\n Returns the NSDictionary or NSArray represented by the current string's JSON representation.\n */\n- (id)JSONValue;\n\n@end\n"
  },
  {
    "path": "JSON/NSString+SBJSON.m",
    "content": "/*\n Copyright (C) 2007-2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"NSString+SBJSON.h\"\n#import \"SBJsonParser.h\"\n\n@implementation NSString (NSString_SBJSON)\n\n- (id)JSONValue\n{\n    SBJsonParser *jsonParser = [SBJsonParser new];\n    id repr = [jsonParser objectWithString:self];\n    if (!repr)\n        NSLog(@\"-JSONValue failed. Error trace is: %@\", [jsonParser errorTrace]);\n    [jsonParser release];\n    return repr;\n}\n\n@end\n"
  },
  {
    "path": "JSON/Readme.markdown",
    "content": "JSON Framework\n==============\n\nJSON is a light-weight data interchange format that's easy to read and\nwrite for humans and computers alike. This framework implements a strict\nJSON parser and generator in Objective-C.\n\nFeatures\n--------\n\n* BSD license.\n* Easy-to-use API.\n* Strict parsing & generation.\n* Stack of error available in case of failure so you can easily figure out what is wrong.\n* Optional pretty-printing of JSON output.\n* Optionally sorted dictionary keys in JSON output.\n* Configurable recursion depth for parsing, for added security.\n\nLinks\n-----\n\n* The GitHub [project page][src].\n* The online [API documentation][api].\n* The new [website][web].\n\n[api]: http://stig.github.com/json-framework/api\n[web]: http://stig.github.com/json-framework\n[src]: http://github.com/stig/json-framework\n"
  },
  {
    "path": "JSON/SBJsonBase.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\nextern NSString * SBJSONErrorDomain;\n\n\nenum {\n    EUNSUPPORTED = 1,\n    EPARSENUM,\n    EPARSE,\n    EFRAGMENT,\n    ECTRL,\n    EUNICODE,\n    EDEPTH,\n    EESCAPE,\n    ETRAILCOMMA,\n    ETRAILGARBAGE,\n    EEOF,\n    EINPUT\n};\n\n/**\n @brief Common base class for parsing & writing.\n\n This class contains the common error-handling code and option between the parser/writer.\n */\n@interface SBJsonBase : NSObject {\n    NSMutableArray *errorTrace;\n\n@protected\n    NSUInteger depth, maxDepth;\n}\n\n/**\n @brief The maximum recursing depth.\n \n Defaults to 512. If the input is nested deeper than this the input will be deemed to be\n malicious and the parser returns nil, signalling an error. (\"Nested too deep\".) You can\n turn off this security feature by setting the maxDepth value to 0.\n */\n@property NSUInteger maxDepth;\n\n/**\n @brief Return an error trace, or nil if there was no errors.\n \n Note that this method returns the trace of the last method that failed.\n You need to check the return value of the call you're making to figure out\n if the call actually failed, before you know call this method.\n */\n @property(copy,readonly) NSArray* errorTrace;\n\n/// @internal for use in subclasses to add errors to the stack trace\n- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str;\n\n/// @internal for use in subclasess to clear the error before a new parsing attempt\n- (void)clearErrorTrace;\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonBase.m",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"SBJsonBase.h\"\nNSString * SBJSONErrorDomain = @\"org.brautaset.JSON.ErrorDomain\";\n\n\n@implementation SBJsonBase\n\n@synthesize errorTrace;\n@synthesize maxDepth;\n\n- (id)init {\n    self = [super init];\n    if (self)\n        self.maxDepth = 512;\n    return self;\n}\n\n- (void)dealloc {\n    [errorTrace release];\n    [super dealloc];\n}\n\n- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str {\n    NSDictionary *userInfo;\n    if (!errorTrace) {\n        errorTrace = [NSMutableArray new];\n        userInfo = [NSDictionary dictionaryWithObject:str forKey:NSLocalizedDescriptionKey];\n        \n    } else {\n        userInfo = [NSDictionary dictionaryWithObjectsAndKeys:\n                    str, NSLocalizedDescriptionKey,\n                    [errorTrace lastObject], NSUnderlyingErrorKey,\n                    nil];\n    }\n    \n    NSError *error = [NSError errorWithDomain:SBJSONErrorDomain code:code userInfo:userInfo];\n\n    [self willChangeValueForKey:@\"errorTrace\"];\n    [errorTrace addObject:error];\n    [self didChangeValueForKey:@\"errorTrace\"];\n}\n\n- (void)clearErrorTrace {\n    [self willChangeValueForKey:@\"errorTrace\"];\n    [errorTrace release];\n    errorTrace = nil;\n    [self didChangeValueForKey:@\"errorTrace\"];\n}\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonParser.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n#import \"SBJsonBase.h\"\n\n/**\n @brief The JSON parser class.\n \n JSON is mapped to Objective-C types in the following way:\n \n @li Null -> NSNull\n @li String -> NSMutableString\n @li Array -> NSMutableArray\n @li Object -> NSMutableDictionary\n @li Boolean -> NSNumber (initialised with -initWithBool:)\n @li Number -> (NSNumber | NSDecimalNumber)\n \n Since Objective-C doesn't have a dedicated class for boolean values, these turns into NSNumber\n instances. These are initialised with the -initWithBool: method, and \n round-trip back to JSON properly. (They won't silently suddenly become 0 or 1; they'll be\n represented as 'true' and 'false' again.)\n \n As an optimisation short JSON integers turn into NSNumber instances, while complex ones turn into NSDecimalNumber instances.\n We can thus avoid any loss of precision as JSON allows ridiculously large numbers.\n \n */\n@interface SBJsonParser : SBJsonBase {\n    \n@private\n    const char *c;\n}\n\n/**\n @brief Return the object represented by the given string\n \n Returns the object represented by the passed-in string or nil on error. The returned object can be\n a string, number, boolean, null, array or dictionary.\n \n @param repr the json string to parse\n */\n- (id)objectWithString:(NSString *)repr;\n\n/**\n @brief Return the object represented by the given string\n \n Returns the object represented by the passed-in string or nil on error. The returned object can be\n a string, number, boolean, null, array or dictionary.\n \n @param jsonText the json string to parse\n @param error pointer to an NSError object to populate on error\n */\n\n- (id)objectWithString:(NSString*)jsonText\n                 error:(NSError**)error;\n\n\n@end\n\n\n"
  },
  {
    "path": "JSON/SBJsonParser.m",
    "content": "/*\n Copyright (C) 2009,2010 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"SBJsonParser.h\"\n\n@interface SBJsonParser ()\n\n- (BOOL)scanValue:(NSObject **)o;\n\n- (BOOL)scanRestOfArray:(NSMutableArray **)o;\n- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o;\n- (BOOL)scanRestOfNull:(NSNull **)o;\n- (BOOL)scanRestOfFalse:(NSNumber **)o;\n- (BOOL)scanRestOfTrue:(NSNumber **)o;\n- (BOOL)scanRestOfString:(NSMutableString **)o;\n\n// Cannot manage without looking at the first digit\n- (BOOL)scanNumber:(NSNumber **)o;\n\n- (BOOL)scanHexQuad:(unichar *)x;\n- (BOOL)scanUnicodeChar:(unichar *)x;\n\n- (BOOL)scanIsAtEnd;\n\n@end\n\n#define skipWhitespace(c) while (isspace(*c)) c++\n#define skipDigits(c) while (isdigit(*c)) c++\n\n\n@implementation SBJsonParser\n\nstatic char ctrl[0x22];\n\n\n+ (void)initialize {\n    ctrl[0] = '\\\"';\n    ctrl[1] = '\\\\';\n    for (int i = 1; i < 0x20; i++)\n        ctrl[i+1] = i;\n    ctrl[0x21] = 0;    \n}\n\n- (id)objectWithString:(NSString *)repr {\n    [self clearErrorTrace];\n    \n    if (!repr) {\n        [self addErrorWithCode:EINPUT description:@\"Input was 'nil'\"];\n        return nil;\n    }\n    \n    depth = 0;\n    c = [repr UTF8String];\n    \n    id o;\n    if (![self scanValue:&o]) {\n        return nil;\n    }\n    \n    // We found some valid JSON. But did it also contain something else?\n    if (![self scanIsAtEnd]) {\n        [self addErrorWithCode:ETRAILGARBAGE description:@\"Garbage after JSON\"];\n        return nil;\n    }\n    \n    NSAssert1(o, @\"Should have a valid object from %@\", repr);\n    \n    // Check that the object we've found is a valid JSON container.\n    if (![o isKindOfClass:[NSDictionary class]] && ![o isKindOfClass:[NSArray class]]) {\n        [self addErrorWithCode:EFRAGMENT description:@\"Valid fragment, but not JSON\"];\n        return nil;\n    }\n    \n    return o;\n}\n\n- (id)objectWithString:(NSString*)repr error:(NSError**)error {\n    id tmp = [self objectWithString:repr];\n    if (tmp)\n        return tmp;\n    \n    if (error)\n        *error = [self.errorTrace lastObject];\n    return nil;\n}\n\n\n/*\n In contrast to the public methods, it is an error to omit the error parameter here.\n */\n- (BOOL)scanValue:(NSObject **)o\n{\n    skipWhitespace(c);\n    \n    switch (*c++) {\n        case '{':\n            return [self scanRestOfDictionary:(NSMutableDictionary **)o];\n            break;\n        case '[':\n            return [self scanRestOfArray:(NSMutableArray **)o];\n            break;\n        case '\"':\n            return [self scanRestOfString:(NSMutableString **)o];\n            break;\n        case 'f':\n            return [self scanRestOfFalse:(NSNumber **)o];\n            break;\n        case 't':\n            return [self scanRestOfTrue:(NSNumber **)o];\n            break;\n        case 'n':\n            return [self scanRestOfNull:(NSNull **)o];\n            break;\n        case '-':\n        case '0'...'9':\n            c--; // cannot verify number correctly without the first character\n            return [self scanNumber:(NSNumber **)o];\n            break;\n        case '+':\n            [self addErrorWithCode:EPARSENUM description: @\"Leading + disallowed in number\"];\n            return NO;\n            break;\n        case 0x0:\n            [self addErrorWithCode:EEOF description:@\"Unexpected end of string\"];\n            return NO;\n            break;\n        default:\n            [self addErrorWithCode:EPARSE description: @\"Unrecognised leading character\"];\n            return NO;\n            break;\n    }\n    \n    NSAssert(0, @\"Should never get here\");\n    return NO;\n}\n\n- (BOOL)scanRestOfTrue:(NSNumber **)o\n{\n    if (!strncmp(c, \"rue\", 3)) {\n        c += 3;\n        *o = [NSNumber numberWithBool:YES];\n        return YES;\n    }\n    [self addErrorWithCode:EPARSE description:@\"Expected 'true'\"];\n    return NO;\n}\n\n- (BOOL)scanRestOfFalse:(NSNumber **)o\n{\n    if (!strncmp(c, \"alse\", 4)) {\n        c += 4;\n        *o = [NSNumber numberWithBool:NO];\n        return YES;\n    }\n    [self addErrorWithCode:EPARSE description: @\"Expected 'false'\"];\n    return NO;\n}\n\n- (BOOL)scanRestOfNull:(NSNull **)o {\n    if (!strncmp(c, \"ull\", 3)) {\n        c += 3;\n        *o = [NSNull null];\n        return YES;\n    }\n    [self addErrorWithCode:EPARSE description: @\"Expected 'null'\"];\n    return NO;\n}\n\n- (BOOL)scanRestOfArray:(NSMutableArray **)o {\n    if (maxDepth && ++depth > maxDepth) {\n        [self addErrorWithCode:EDEPTH description: @\"Nested too deep\"];\n        return NO;\n    }\n    \n    *o = [NSMutableArray arrayWithCapacity:8];\n    \n    for (; *c ;) {\n        id v;\n        \n        skipWhitespace(c);\n        if (*c == ']' && c++) {\n            depth--;\n            return YES;\n        }\n        \n        if (![self scanValue:&v]) {\n            [self addErrorWithCode:EPARSE description:@\"Expected value while parsing array\"];\n            return NO;\n        }\n        \n        [*o addObject:v];\n        \n        skipWhitespace(c);\n        if (*c == ',' && c++) {\n            skipWhitespace(c);\n            if (*c == ']') {\n                [self addErrorWithCode:ETRAILCOMMA description: @\"Trailing comma disallowed in array\"];\n                return NO;\n            }\n        }        \n    }\n    \n    [self addErrorWithCode:EEOF description: @\"End of input while parsing array\"];\n    return NO;\n}\n\n- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o \n{\n    if (maxDepth && ++depth > maxDepth) {\n        [self addErrorWithCode:EDEPTH description: @\"Nested too deep\"];\n        return NO;\n    }\n    \n    *o = [NSMutableDictionary dictionaryWithCapacity:7];\n    \n    for (; *c ;) {\n        id k, v;\n        \n        skipWhitespace(c);\n        if (*c == '}' && c++) {\n            depth--;\n            return YES;\n        }    \n        \n        if (!(*c == '\\\"' && c++ && [self scanRestOfString:&k])) {\n            [self addErrorWithCode:EPARSE description: @\"Object key string expected\"];\n            return NO;\n        }\n        \n        skipWhitespace(c);\n        if (*c != ':') {\n            [self addErrorWithCode:EPARSE description: @\"Expected ':' separating key and value\"];\n            return NO;\n        }\n        \n        c++;\n        if (![self scanValue:&v]) {\n            NSString *string = [NSString stringWithFormat:@\"Object value expected for key: %@\", k];\n            [self addErrorWithCode:EPARSE description: string];\n            return NO;\n        }\n        \n        [*o setObject:v forKey:k];\n        \n        skipWhitespace(c);\n        if (*c == ',' && c++) {\n            skipWhitespace(c);\n            if (*c == '}') {\n                [self addErrorWithCode:ETRAILCOMMA description: @\"Trailing comma disallowed in object\"];\n                return NO;\n            }\n        }        \n    }\n    \n    [self addErrorWithCode:EEOF description: @\"End of input while parsing object\"];\n    return NO;\n}\n\n- (BOOL)scanRestOfString:(NSMutableString **)o \n{\n    // if the string has no control characters in it, return it in one go, without any temporary allocations.\n    size_t len = strcspn(c, ctrl);\n    if (len && *(c + len) == '\\\"')\n    {\n        *o = [[[NSMutableString alloc] initWithBytes:(char*)c length:len encoding:NSUTF8StringEncoding] autorelease];\n        c += len + 1;\n        return YES;\n    }\n    \n    *o = [NSMutableString stringWithCapacity:16];\n    do {\n        // First see if there's a portion we can grab in one go. \n        // Doing this caused a massive speedup on the long string.\n        len = strcspn(c, ctrl);\n        if (len) {\n            // check for \n            id t = [[NSString alloc] initWithBytesNoCopy:(char*)c\n                                                  length:len\n                                                encoding:NSUTF8StringEncoding\n                                            freeWhenDone:NO];\n            if (t) {\n                [*o appendString:t];\n                [t release];\n                c += len;\n            }\n        }\n        \n        if (*c == '\"') {\n            c++;\n            return YES;\n            \n        } else if (*c == '\\\\') {\n            unichar uc = *++c;\n            switch (uc) {\n                case '\\\\':\n                case '/':\n                case '\"':\n                    break;\n                    \n                case 'b':   uc = '\\b';  break;\n                case 'n':   uc = '\\n';  break;\n                case 'r':   uc = '\\r';  break;\n                case 't':   uc = '\\t';  break;\n                case 'f':   uc = '\\f';  break;                    \n                    \n                case 'u':\n                    c++;\n                    if (![self scanUnicodeChar:&uc]) {\n                        [self addErrorWithCode:EUNICODE description: @\"Broken unicode character\"];\n                        return NO;\n                    }\n                    c--; // hack.\n                    break;\n                default:\n                    [self addErrorWithCode:EESCAPE description: [NSString stringWithFormat:@\"Illegal escape sequence '0x%x'\", uc]];\n                    return NO;\n                    break;\n            }\n            CFStringAppendCharacters((CFMutableStringRef)*o, &uc, 1);\n            c++;\n            \n        } else if (*c < 0x20) {\n            [self addErrorWithCode:ECTRL description: [NSString stringWithFormat:@\"Unescaped control character '0x%x'\", *c]];\n            return NO;\n            \n        } else {\n            NSLog(@\"should not be able to get here\");\n        }\n    } while (*c);\n    \n    [self addErrorWithCode:EEOF description:@\"Unexpected EOF while parsing string\"];\n    return NO;\n}\n\n- (BOOL)scanUnicodeChar:(unichar *)x\n{\n    unichar hi, lo;\n    \n    if (![self scanHexQuad:&hi]) {\n        [self addErrorWithCode:EUNICODE description: @\"Missing hex quad\"];\n        return NO;        \n    }\n    \n    if (hi >= 0xd800) {     // high surrogate char?\n        if (hi < 0xdc00) {  // yes - expect a low char\n            \n            if (!(*c == '\\\\' && ++c && *c == 'u' && ++c && [self scanHexQuad:&lo])) {\n                [self addErrorWithCode:EUNICODE description: @\"Missing low character in surrogate pair\"];\n                return NO;\n            }\n            \n            if (lo < 0xdc00 || lo >= 0xdfff) {\n                [self addErrorWithCode:EUNICODE description:@\"Invalid low surrogate char\"];\n                return NO;\n            }\n            \n            hi = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000;\n            \n        } else if (hi < 0xe000) {\n            [self addErrorWithCode:EUNICODE description:@\"Invalid high character in surrogate pair\"];\n            return NO;\n        }\n    }\n    \n    *x = hi;\n    return YES;\n}\n\n- (BOOL)scanHexQuad:(unichar *)x\n{\n    *x = 0;\n    for (int i = 0; i < 4; i++) {\n        unichar uc = *c;\n        c++;\n        int d = (uc >= '0' && uc <= '9')\n        ? uc - '0' : (uc >= 'a' && uc <= 'f')\n        ? (uc - 'a' + 10) : (uc >= 'A' && uc <= 'F')\n        ? (uc - 'A' + 10) : -1;\n        if (d == -1) {\n            [self addErrorWithCode:EUNICODE description:@\"Missing hex digit in quad\"];\n            return NO;\n        }\n        *x *= 16;\n        *x += d;\n    }\n    return YES;\n}\n\n- (BOOL)scanNumber:(NSNumber **)o\n{\n    BOOL simple = YES;\n    \n    const char *ns = c;\n    \n    // The logic to test for validity of the number formatting is relicensed\n    // from JSON::XS with permission from its author Marc Lehmann.\n    // (Available at the CPAN: http://search.cpan.org/dist/JSON-XS/ .)\n    \n    if ('-' == *c)\n        c++;\n    \n    if ('0' == *c && c++) {        \n        if (isdigit(*c)) {\n            [self addErrorWithCode:EPARSENUM description: @\"Leading 0 disallowed in number\"];\n            return NO;\n        }\n        \n    } else if (!isdigit(*c) && c != ns) {\n        [self addErrorWithCode:EPARSENUM description: @\"No digits after initial minus\"];\n        return NO;\n        \n    } else {\n        skipDigits(c);\n    }\n    \n    // Fractional part\n    if ('.' == *c && c++) {\n        simple = NO;\n        if (!isdigit(*c)) {\n            [self addErrorWithCode:EPARSENUM description: @\"No digits after decimal point\"];\n            return NO;\n        }        \n        skipDigits(c);\n    }\n    \n    // Exponential part\n    if ('e' == *c || 'E' == *c) {\n        simple = NO;\n        c++;\n        \n        if ('-' == *c || '+' == *c)\n            c++;\n        \n        if (!isdigit(*c)) {\n            [self addErrorWithCode:EPARSENUM description: @\"No digits after exponent\"];\n            return NO;\n        }\n        skipDigits(c);\n    }\n    \n    // If we are only reading integers, don't go through the expense of creating an NSDecimal.\n    // This ends up being a very large perf win.\n    if (simple) {\n        BOOL negate = NO;\n        long long val = 0;\n        const char *d = ns;\n        \n        if (*d == '-') {\n            negate = YES;\n            d++;\n        }\n        \n        while (isdigit(*d)) {\n            val *= 10;\n            if (val < 0)\n                goto longlong_overflow;\n            val += *d - '0';\n            if (val < 0)\n                goto longlong_overflow;\n            d++;\n        }\n        \n        *o = [NSNumber numberWithLongLong:negate ? -val : val];\n        return YES;\n        \n    } else {\n        // jumped to by simple branch, if an overflow occured\n        longlong_overflow:;\n        \n        id str = [[NSString alloc] initWithBytesNoCopy:(char*)ns\n                                                length:c - ns\n                                              encoding:NSUTF8StringEncoding\n                                          freeWhenDone:NO];\n        [str autorelease];\n        if (str && (*o = [NSDecimalNumber decimalNumberWithString:str]))\n            return YES;\n        \n        [self addErrorWithCode:EPARSENUM description: @\"Failed creating decimal instance\"];\n        return NO;\n    }\n}\n\n- (BOOL)scanIsAtEnd\n{\n    skipWhitespace(c);\n    return !*c;\n}\n\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonStreamWriter.h",
    "content": "/*\n Copyright (c) 2010, Stig Brautaset.\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n \n   Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n  \n   Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n \n   Neither the name of the the author nor the names of its contributors\n   may be used to endorse or promote products derived from this software\n   without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\n@class SBJsonStreamWriterStateMachine;\n\n/**\n @brief The Stream Writer class.\n \n SBJsonStreamWriter accepts various messages and writes JSON text to an\n NSOutputStream designated at iniatilisation time. \n \n A range of high-, mid- and low-level methods. You can mix and match calls\n to these. For example, you may want to call -writeArrayOpen to start an\n array and then repeatedly call -writeObject: with an object.\n \n In JSON the keys of an object must be strings. NSDictionary keys need\n not be, but attempting to convert an NSDictionary with non-string keys\n into JSON will result in an error.\n \n NSNumber instances created with the +initWithBool: method are\n converted into the JSON boolean \"true\" and \"false\" values, and vice\n versa. Any other NSNumber instances are converted to a JSON number the\n way you would expect.\n \n */\n\n@interface SBJsonStreamWriter : NSObject {\n@private\n\tNSString *error;\n\tSBJsonStreamWriterStateMachine **states;\n\tNSOutputStream *stream;\n\tNSUInteger depth, maxDepth;\n    BOOL sortKeys, humanReadable;\n}\n\n/**\n @brief The maximum recursing depth.\n \n Defaults to 512. If the input is nested deeper than this the input will be deemed to be\n malicious and the parser returns nil, signalling an error. (\"Nested too deep\".) You can\n turn off this security feature by setting the maxDepth value to 0.\n */\n@property NSUInteger maxDepth;\n\n/**\n @brief Whether we are generating human-readable (multiline) JSON.\n \n Set whether or not to generate human-readable JSON. The default is NO, which produces\n JSON without any whitespace between tokens. If set to YES, generates human-readable\n JSON with linebreaks after each array value and dictionary key/value pair, indented two\n spaces per nesting level.\n */\n@property BOOL humanReadable;\n\n/**\n @brief Whether or not to sort the dictionary keys in the output.\n \n If this is set to YES, the dictionary keys in the JSON output will be in sorted order.\n (This is useful if you need to compare two structures, for example.) The default is NO.\n */\n@property BOOL sortKeys;\n\n/**\n @brief Contains the error description after an error has occured.\n */\n@property (copy, readonly) NSString *error;\n\n/**\n @brief Initialise a stream writer.\n \n You have to create an output stream first. You should not open/close the  stream\n manually; this class takes care of that.\n */\n- (id)initWithStream:(NSOutputStream*)stream;\n\n/**\n @brief Write an NSDictionary to the JSON stream.\n */\n- (BOOL)writeObject:(NSDictionary*)dict;\n\n/**\n @brief Write an NSArray to the JSON stream.\n */\n- (BOOL)writeArray:(NSArray *)array;\n\n/// Start writing an Object to the stream\n- (BOOL)writeObjectOpen;\n\n/// Close the current object being written\n- (BOOL)writeObjectClose;\n\n/// Start writing an Array to the stream\n- (BOOL)writeArrayOpen;\n\n/// Close the current Array being written\n- (BOOL)writeArrayClose;\n\n/// Write a null to the stream\n- (BOOL)writeNull;\n\n/// Write a boolean to the stream\n- (BOOL)writeBool:(BOOL)x;\n\n//- (BOOL)writeInteger:(long)l;\n//- (BOOL)writeDouble:(double)d;\n\n/// Write a Number to the stream\n- (BOOL)writeNumber:(NSNumber*)n;\n\n/// Write a String to the stream\n- (BOOL)writeString:(NSString*)s;\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonStreamWriter.m",
    "content": "/*\n Copyright (c) 2010, Stig Brautaset.\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n \n   Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n  \n   Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n \n   Neither the name of the the author nor the names of its contributors\n   may be used to endorse or promote products derived from this software\n   without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"SBJsonStreamWriter.h\"\n#import \"SBProxyForJson.h\"\n\n@interface SBJsonStreamWriter ()\n@property(copy) NSString *error;\n@property(readonly) NSObject **states;\n@property(readonly) NSUInteger depth;\n@property(readonly) NSOutputStream *stream;\n- (BOOL)writeValue:(id)v;\n- (void)write:(char const *)utf8 len:(NSUInteger)len;\n@end\n\n@interface SBJsonStreamWriterStateMachine : NSObject\n- (BOOL)isInvalidState:(SBJsonStreamWriter*)writer;\n- (void)appendSeparator:(SBJsonStreamWriter*)writer;\n- (BOOL)expectingKey:(SBJsonStreamWriter*)writer;\n- (void)transitionState:(SBJsonStreamWriter*)writer;\n- (void)appendWhitespace:(SBJsonStreamWriter*)writer;\n@end\n\n@interface ObjectOpenState : SBJsonStreamWriterStateMachine\n@end\n\n@interface ObjectKeyState : ObjectOpenState\n@end\n\n@interface ObjectValueState : SBJsonStreamWriterStateMachine\n@end\n\n@interface ArrayOpenState : SBJsonStreamWriterStateMachine\n@end\n\n@interface ArrayValueState : SBJsonStreamWriterStateMachine\n@end\n\n@interface StartState : SBJsonStreamWriterStateMachine\n@end\n\n@interface CompleteState : SBJsonStreamWriterStateMachine\n@end\n\n@interface ErrorState : SBJsonStreamWriterStateMachine\n@end\n\nstatic NSMutableDictionary *stringCache;\nstatic NSDecimalNumber *notANumber;\n\n// States\nstatic StartState *openState;\nstatic CompleteState *closeState;\nstatic ErrorState *errorState;\nstatic ObjectOpenState *objectOpenState;\nstatic ObjectKeyState *objectKeyState;\nstatic ObjectValueState *objectValueState;\nstatic ArrayOpenState *arrayOpenState;\nstatic ArrayValueState *arrayValueState;\n\n\n@implementation SBJsonStreamWriterStateMachine\n- (BOOL)isInvalidState:(SBJsonStreamWriter*)writer { return NO; }\n- (void)appendSeparator:(SBJsonStreamWriter*)writer {}\n- (BOOL)expectingKey:(SBJsonStreamWriter*)writer { return NO; }\n- (void)transitionState:(SBJsonStreamWriter *)writer {}\n- (void)appendWhitespace:(SBJsonStreamWriter*)writer {\n\t[writer write:\"\\n\" len:1];\n\tfor (int i = 0; i < writer.depth; i++)\n\t    [writer write:\"  \" len: 2];\n}\n@end\n\n@implementation ObjectOpenState\n- (void)transitionState:(SBJsonStreamWriter *)writer {\n\twriter.states[writer.depth] = objectValueState;\n}\n- (BOOL)expectingKey:(SBJsonStreamWriter *)writer {\n\twriter.error = @\"JSON object key must be string\";\n\treturn YES;\n}\n@end\n\n@implementation ObjectKeyState\n- (void)appendSeparator:(SBJsonStreamWriter *)writer {\n\t[writer write:\",\" len:1];\n}\n@end\n\n@implementation ObjectValueState\n- (void)appendSeparator:(SBJsonStreamWriter *)writer {\n\t[writer write:\":\" len:1];\n}\n- (void)transitionState:(SBJsonStreamWriter *)writer {\n\twriter.states[writer.depth] = objectKeyState;\n}\n- (void)appendWhitespace:(SBJsonStreamWriter *)writer {\n\t[writer write:\" \" len:1];\n}\n@end\n\n@implementation ArrayOpenState\n- (void)transitionState:(SBJsonStreamWriter *)writer {\n\twriter.states[writer.depth] = arrayValueState;\n}\n@end\n\n@implementation ArrayValueState\n- (void)appendSeparator:(SBJsonStreamWriter *)writer {\n\t[writer write:\",\" len:1];\n}\n@end\n\n@implementation StartState\n- (void)transitionState:(SBJsonStreamWriter *)writer {\n\twriter.states[writer.depth] = closeState;\n\t[writer.stream close];\n}\n- (void)appendSeparator:(SBJsonStreamWriter *)writer {\n\t[writer.stream open];\n}\n@end\n\n@implementation CompleteState\n- (BOOL)isInvalidState:(SBJsonStreamWriter*)writer {\n\twriter.error = @\"Stream is closed\";\n\treturn YES;\n}\n@end\n\n@implementation ErrorState\n@end\n\n@implementation SBJsonStreamWriter\n\n@synthesize error;\n@dynamic depth;\n@synthesize maxDepth;\n@synthesize states;\n@synthesize stream;\n@synthesize humanReadable;\n@synthesize sortKeys;\n\n+ (void)initialize {\n\tnotANumber = [NSDecimalNumber notANumber];\n\tstringCache = [NSMutableDictionary new];\n\n\topenState = [StartState new];\n\tcloseState = [CompleteState new];\n\terrorState = [ErrorState new];\n\tobjectOpenState = [ObjectOpenState new];\n\tobjectKeyState = [ObjectKeyState new];\n\tobjectValueState = [ObjectValueState new];\n\tarrayOpenState = [ArrayOpenState new];\n\tarrayValueState = [ArrayValueState new];\n}\n\n#pragma mark Housekeeping\n\n- (id)initWithStream:(NSOutputStream*)stream_ {\n\tself = [super init];\n\tif (self) {\n\t\tstream = [stream_ retain];\n\t\tmaxDepth = 512;\n\t\tstates = calloc(maxDepth, sizeof(SBJsonStreamWriterStateMachine*));\n\t\tNSAssert(states, @\"States not initialised\");\n\t\tstates[0] = openState;\n\t}\n\treturn self;\n}\n\n- (void)dealloc {\n\tself.error = nil;\n\tfree(states);\n\t[stream release];\n\t[super dealloc];\n}\n\n#pragma mark Methods\n\n- (BOOL)writeObject:(NSDictionary *)dict {\n\tif (![self writeObjectOpen])\n\t\treturn NO;\n\t\n\tNSArray *keys = [dict allKeys];\n\tif (sortKeys)\n\t\tkeys = [keys sortedArrayUsingSelector:@selector(compare:)];\n\t\n\tfor (id k in keys) {\n\t\tif (![k isKindOfClass:[NSString class]]) {\n\t\t\tself.error = [NSString stringWithFormat:@\"JSON object key must be string: %@\", k];\n\t\t\treturn NO;\n\t\t}\n\n\t\tif (![self writeString:k])\n\t\t\treturn NO;\n\t\tif (![self writeValue:[dict objectForKey:k]])\n\t\t\treturn NO;\n\t}\n\t\n\treturn [self writeObjectClose];\n}\n\n- (BOOL)writeArray:(NSArray*)array {\n\tif (![self writeArrayOpen])\n\t\treturn NO;\n\tfor (id v in array)\n\t\tif (![self writeValue:v])\n\t\t\treturn NO;\n\treturn [self writeArrayClose];\n}\n\n\n- (BOOL)writeObjectOpen {\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\tif ([s expectingKey:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable && depth) [s appendWhitespace:self];\n\t\n\tif (maxDepth && ++depth > maxDepth) {\n\t\tself.error = @\"Nested too deep\";\n\t\treturn NO;\n\t}\n\n\tstates[depth] = objectOpenState;\n\t[self write:\"{\" len:1];\n\treturn YES;\n}\n\n- (BOOL)writeObjectClose {\n\tSBJsonStreamWriterStateMachine *state = states[depth--];\n\tif ([state isInvalidState:self]) return NO;\n\tif (humanReadable) [state appendWhitespace:self];\n\t[self write:\"}\" len:1];\n\t[states[depth] transitionState:self];\n\treturn YES;\n}\n\n- (BOOL)writeArrayOpen {\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\tif ([s expectingKey:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable && depth) [s appendWhitespace:self];\n\t\n\tif (maxDepth && ++depth > maxDepth) {\n\t\tself.error = @\"Nested too deep\";\n\t\treturn NO;\n\t}\n\n\tstates[depth] = arrayOpenState;\n\t[self write:\"[\" len:1];\n\treturn YES;\n}\n\n- (BOOL)writeArrayClose {\n\tSBJsonStreamWriterStateMachine *state = states[depth--];\n\tif ([state isInvalidState:self]) return NO;\n\tif ([state expectingKey:self]) return NO;\n\tif (humanReadable) [state appendWhitespace:self];\n\t\n\t[self write:\"]\" len:1];\n\t[states[depth] transitionState:self];\n\treturn YES;\n}\n\n- (BOOL)writeNull {\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\tif ([s expectingKey:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable) [s appendWhitespace:self];\n\n\t[self write:\"null\" len:4];\n\t[s transitionState:self];\n\treturn YES;\n}\n\n- (BOOL)writeBool:(BOOL)x {\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\tif ([s expectingKey:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable) [s appendWhitespace:self];\n\t\n\tif (x)\n\t\t[self write:\"true\" len:4];\n\telse\n\t\t[self write:\"false\" len:5];\n\t[s transitionState:self];\n\treturn YES;\n}\n\n\n- (BOOL)writeValue:(id)o {\n\tif ([o isKindOfClass:[NSDictionary class]]) {\n\t\treturn [self writeObject:o];\n\n\t} else if ([o isKindOfClass:[NSArray class]]) {\n\t\treturn [self writeArray:o];\n\n\t} else if ([o isKindOfClass:[NSString class]]) {\n\t\t[self writeString:o];\n\t\treturn YES;\n\n\t} else if ([o isKindOfClass:[NSNumber class]]) {\n\t\treturn [self writeNumber:o];\n\n\t} else if ([o isKindOfClass:[NSNull class]]) {\n\t\treturn [self writeNull];\n\t\t\n\t} else if ([o respondsToSelector:@selector(proxyForJson)]) {\n\t\treturn [self writeValue:[o proxyForJson]];\n\n\t}\t\n\t\n\tself.error = [NSString stringWithFormat:@\"JSON serialisation not supported for @%\", [o class]];\n\treturn NO;\n}\n\nstatic const char *strForChar(int c) {\t\n\tswitch (c) {\n\t\tcase 0: return \"\\\\u0000\"; break;\n\t\tcase 1: return \"\\\\u0001\"; break;\n\t\tcase 2: return \"\\\\u0002\"; break;\n\t\tcase 3: return \"\\\\u0003\"; break;\n\t\tcase 4: return \"\\\\u0004\"; break;\n\t\tcase 5: return \"\\\\u0005\"; break;\n\t\tcase 6: return \"\\\\u0006\"; break;\n\t\tcase 7: return \"\\\\u0007\"; break;\n\t\tcase 8: return \"\\\\b\"; break;\n\t\tcase 9: return \"\\\\t\"; break;\n\t\tcase 10: return \"\\\\n\"; break;\n\t\tcase 11: return \"\\\\u000b\"; break;\n\t\tcase 12: return \"\\\\f\"; break;\n\t\tcase 13: return \"\\\\r\"; break;\n\t\tcase 14: return \"\\\\u000e\"; break;\n\t\tcase 15: return \"\\\\u000f\"; break;\n\t\tcase 16: return \"\\\\u0010\"; break;\n\t\tcase 17: return \"\\\\u0011\"; break;\n\t\tcase 18: return \"\\\\u0012\"; break;\n\t\tcase 19: return \"\\\\u0013\"; break;\n\t\tcase 20: return \"\\\\u0014\"; break;\n\t\tcase 21: return \"\\\\u0015\"; break;\n\t\tcase 22: return \"\\\\u0016\"; break;\n\t\tcase 23: return \"\\\\u0017\"; break;\n\t\tcase 24: return \"\\\\u0018\"; break;\n\t\tcase 25: return \"\\\\u0019\"; break;\n\t\tcase 26: return \"\\\\u001a\"; break;\n\t\tcase 27: return \"\\\\u001b\"; break;\n\t\tcase 28: return \"\\\\u001c\"; break;\n\t\tcase 29: return \"\\\\u001d\"; break;\n\t\tcase 30: return \"\\\\u001e\"; break;\n\t\tcase 31: return \"\\\\u001f\"; break;\n\t\tcase 34: return \"\\\\\\\"\"; break;\n\t\tcase 92: return \"\\\\\\\\\"; break;\n\t}\n\tNSLog(@\"FUTFUTFUT: -->'%c'<---\", c);\n\treturn \"FUTFUTFUT\";\n}\n\n- (BOOL)writeString:(NSString*)string {\t\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable) [s appendWhitespace:self];\n\t\n\tNSMutableData *data = [stringCache objectForKey:string];\n\tif (data) {\n\t\t[self write:[data bytes] len:[data length]];\n\t\t[s transitionState:self];\n\t\treturn YES;\n\t}\n\t\n\tNSUInteger len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n\tconst char *utf8 = [string UTF8String];\n\tNSUInteger written = 0, i = 0;\n\t\t\n\tdata = [NSMutableData dataWithCapacity:len * 1.1];\n\t[data appendBytes:\"\\\"\" length:1];\n\t\n\tfor (i = 0; i < len; i++) {\n\t\tint c = utf8[i];\n\t\tif (c >= 0 && c < 32 || c == '\"' || c == '\\\\') {\n\t\t\tif (i - written)\n\t\t\t\t[data appendBytes:utf8 + written length:i - written];\n\t\t\twritten = i + 1;\n\n\t\t\tconst char *t = strForChar(c);\n\t\t\t[data appendBytes:t length:strlen(t)];\n\t\t}\n\t}\n\n\tif (i - written)\n\t\t[data appendBytes:utf8 + written length:i - written];\n\n\t[data appendBytes:\"\\\"\" length:1];\n\t[self write:[data bytes] len:[data length]];\n\t[stringCache setObject:data forKey:string];\n\t[s transitionState:self];\n\treturn YES;\n}\n\n- (BOOL)writeNumber:(NSNumber*)number {\n\tif ((CFBooleanRef)number == kCFBooleanTrue || (CFBooleanRef)number == kCFBooleanFalse)\n\t\treturn [self writeBool:[number boolValue]];\n\t\n\tSBJsonStreamWriterStateMachine *s = states[depth];\n\tif ([s isInvalidState:self]) return NO;\n\tif ([s expectingKey:self]) return NO;\n\t[s appendSeparator:self];\n\tif (humanReadable) [s appendWhitespace:self];\n\t\t\n\tif ((CFNumberRef)number == kCFNumberPositiveInfinity) {\n\t\tself.error = @\"+Infinity is not a valid number in JSON\";\n\t\treturn NO;\n\n\t} else if ((CFNumberRef)number == kCFNumberNegativeInfinity) {\n\t\tself.error = @\"-Infinity is not a valid number in JSON\";\n\t\treturn NO;\n\n\t} else if ((CFNumberRef)number == kCFNumberNaN) {\n\t\tself.error = @\"NaN is not a valid number in JSON\";\n\t\treturn NO;\n\t\t\n\t} else if (number == notANumber) {\n\t\tself.error = @\"NaN is not a valid number in JSON\";\n\t\treturn NO;\n\t}\n\t\n\tconst char *objcType = [number objCType];\n\tchar num[64];\n\tsize_t len;\n\t\n\tswitch (objcType[0]) {\n\t\tcase 'c': case 'i': case 's': case 'l': case 'q':\n\t\t\tlen = sprintf(num, \"%lld\", [number longLongValue]);\n\t\t\tbreak;\n\t\tcase 'C': case 'I': case 'S': case 'L': case 'Q':\n\t\t\tlen = sprintf(num, \"%llu\", [number unsignedLongLongValue]);\n\t\t\tbreak;\n\t\tcase 'f': case 'd': default:\n\t\t\tif ([number isKindOfClass:[NSDecimalNumber class]]) {\n\t\t\t\tchar const *utf8 = [[number stringValue] UTF8String];\n\t\t\t\t[self write:utf8 len: strlen(utf8)];\n\t\t\t\t[s transitionState:self];\n\t\t\t\treturn YES;\n\t\t\t}\n\t\t\tlen = sprintf(num, \"%g\", [number doubleValue]);\n\t\t\tbreak;\n\t}\n\t[self write:num len: len];\n\t[s transitionState:self];\n\treturn YES;\n}\n\n#pragma mark Private methods\n\n- (NSUInteger)depth {\n\treturn depth;\n}\n\n- (void)write:(char const *)utf8 len:(NSUInteger)len {\n    NSUInteger written = 0;\n    do {\n        NSInteger w = [stream write:(const uint8_t *)utf8 maxLength:len - written];\t\n\t    if (w > 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t   \twritten += w;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t} while (written < len);\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\n\n- (void)setMaxDepth:(NSUInteger)x {\n\tNSAssert(x, @\"maxDepth must be greater than 0\");\n\tmaxDepth = x;\n\tstates = realloc(states, x);\n\tNSAssert(states, @\"Failed to reallocate more memory for states\");\n}\t\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonWriter.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n#import \"SBJsonBase.h\"\n\n/**\n @brief The JSON writer class.\n \n Objective-C types are mapped to JSON types in the following way:\n \n @li NSNull -> Null\n @li NSString -> String\n @li NSArray -> Array\n @li NSDictionary -> Object\n @li NSNumber (-initWithBool:) -> Boolean\n @li NSNumber -> Number\n \n In JSON the keys of an object must be strings. NSDictionary keys need\n not be, but attempting to convert an NSDictionary with non-string keys\n into JSON will throw an exception.\n \n NSNumber instances created with the +initWithBool: method are\n converted into the JSON boolean \"true\" and \"false\" values, and vice\n versa. Any other NSNumber instances are converted to a JSON number the\n way you would expect.\n \n */\n@interface SBJsonWriter : SBJsonBase {\n\n@private\n    BOOL sortKeys, humanReadable;\n}\n\n/**\n @brief Whether we are generating human-readable (multiline) JSON.\n \n Set whether or not to generate human-readable JSON. The default is NO, which produces\n JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable\n JSON with linebreaks after each array value and dictionary key/value pair, indented two\n spaces per nesting level.\n */\n@property BOOL humanReadable;\n\n/**\n @brief Whether or not to sort the dictionary keys in the output.\n \n If this is set to YES, the dictionary keys in the JSON output will be in sorted order.\n (This is useful if you need to compare two structures, for example.) The default is NO.\n */\n@property BOOL sortKeys;\n\n/**\n @brief Return JSON representation for the given object.\n \n Returns a string containing JSON representation of the passed in value, or nil on error.\n If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error.\n \n @param value any instance that can be represented as JSON text.\n */\n- (NSString*)stringWithObject:(id)value;\n\n/**\n @brief Return JSON representation for the given object.\n \n Returns an NSData object containing JSON represented as UTF8 text, or nil on error.\n \n @param value any instance that can be represented as JSON text.\n */\n- (NSData*)dataWithObject:(id)value;\n\n/**\n @brief Return JSON representation (or fragment) for the given object.\n \n Returns a string containing JSON representation of the passed in value, or nil on error.\n If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error.\n \n @param value any instance that can be represented as a JSON fragment\n @param error pointer to object to be populated with NSError on failure\n \n */- (NSString*)stringWithObject:(id)value\n                           error:(NSError**)error;\n\n\n@end\n"
  },
  {
    "path": "JSON/SBJsonWriter.m",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"SBJsonWriter.h\"\n#import \"SBJsonStreamWriter.h\"\n#import \"SBProxyForJson.h\"\n\n@interface SBJsonWriter ()\n\n- (NSData*)dataWithObject:(id)value;\n\n@end\n\n@implementation SBJsonWriter\n\n@synthesize sortKeys;\n@synthesize humanReadable;\n\n\n- (NSString*)stringWithObject:(id)value {\n    [self clearErrorTrace];\n    \n\tNSData *data = [self dataWithObject:value];\n\tif (data)\n\t\treturn [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];\n\treturn nil;\n}\t\n\n- (NSString*)stringWithObject:(id)value error:(NSError**)error {\n    NSString *tmp = [self stringWithObject:value];\n    if (tmp)\n        return tmp;\n    \n    if (error)\n        *error = [self.errorTrace lastObject];\n    return nil;\n}\n\n- (NSData*)dataWithObject:(id)object {\n\tNSOutputStream *stream = [[[NSOutputStream alloc] initToMemory] autorelease];\n\t\n\tSBJsonStreamWriter *streamWriter = [[[SBJsonStreamWriter alloc] initWithStream:stream] autorelease];\n\tstreamWriter.sortKeys = self.sortKeys;\n\tstreamWriter.maxDepth = self.maxDepth;\n\tstreamWriter.humanReadable = self.humanReadable;\n\t\n\tBOOL ok = NO;\n\tif ([object isKindOfClass:[NSDictionary class]])\n\t\tok = [streamWriter writeObject:object];\n\t\n\telse if ([object isKindOfClass:[NSArray class]])\n\t\tok = [streamWriter writeArray:object];\n\t\t\n\telse if ([object respondsToSelector:@selector(proxyForJson)])\n\t\treturn [self dataWithObject:[object proxyForJson]];\n\telse {\n\t\t[self addErrorWithCode:EUNSUPPORTED description:@\"Not valid type for JSON\"];\n\t\treturn nil;\n\t}\n\t\n\tif (ok)\n\t\treturn [stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];\n\t\n\t[self addErrorWithCode:EUNSUPPORTED description:streamWriter.error];\n\treturn nil;\t\n}\n\t\n\t\n\n@end\n"
  },
  {
    "path": "JSON/SBProxyForJson.h",
    "content": "/*\n Copyright (c) 2010, Stig Brautaset.\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n \n   Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n  \n   Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n \n   Neither the name of the the author nor the names of its contributors\n   may be used to endorse or promote products derived from this software\n   without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n @brief Allows generation of JSON for otherwise unsupported classes.\n \n If you have a custom class that you want to create a JSON representation for you can implement\n this method in your class. It should return a representation of your object defined\n in terms of objects that can be translated into JSON. For example, a Person\n object might implement it like this:\n \n @code\n - (id)proxyForJson {\n return [NSDictionary dictionaryWithObjectsAndKeys:\n name, @\"name\",\n phone, @\"phone\",\n email, @\"email\",\n nil];\n }\n @endcode\n \n */\n@interface NSObject (SBProxyForJson)\n\n- (id)proxyForJson;\n\n@end\n"
  },
  {
    "path": "MainWindow.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">11C74</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">1938</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1138.23</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">567.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">933</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>IBUIImageView</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUINavigationBar</string>\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUICustomObject</string>\n\t\t\t<string>IBUIWindow</string>\n\t\t\t<string>IBUITabBar</string>\n\t\t\t<string>IBUINavigationItem</string>\n\t\t\t<string>IBUITabBarItem</string>\n\t\t\t<string>IBUIView</string>\n\t\t\t<string>IBUINavigationController</string>\n\t\t\t<string>IBUIViewController</string>\n\t\t\t<string>IBUITabBarController</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"532797962\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUICustomObject\" id=\"664661524\">\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIWindow\" id=\"380026005\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">1316</int>\n\t\t\t\t<object class=\"NSPSMatrix\" key=\"NSFrameMatrix\"/>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 480}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\" id=\"131293388\">\n\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIVisibleAtLaunch\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITabBarController\" id=\"1034742383\">\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t\t<object class=\"IBUINavigationController\" key=\"IBUISelectedViewController\" id=\"652737156\">\n\t\t\t\t\t<string key=\"IBUITitle\">Data Sources</string>\n\t\t\t\t\t<object class=\"IBUITabBarItem\" key=\"IBUITabBarItem\" id=\"947032985\">\n\t\t\t\t\t\t<string key=\"IBUITitle\">Data Sources</string>\n\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"IBUIImage\">\n\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t<string key=\"NSResourceName\">data.png</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSArray\" key=\"IBUIToolbarItems\" id=\"0\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<reference key=\"IBUIParentViewController\" ref=\"1034742383\"/>\n\t\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t\t\t<object class=\"IBUINavigationBar\" key=\"IBUINavigationBar\" id=\"325782924\">\n\t\t\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 44}</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"IBUIViewControllers\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"IBUIViewController\" id=\"216723952\">\n\t\t\t\t\t\t\t<string key=\"IBUITitle\">Data Sources</string>\n\t\t\t\t\t\t\t<reference key=\"IBUIToolbarItems\" ref=\"0\"/>\n\t\t\t\t\t\t\t<object class=\"IBUINavigationItem\" key=\"IBUINavigationItem\" id=\"459063531\">\n\t\t\t\t\t\t\t\t<string key=\"IBUITitle\">Data Sources</string>\n\t\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"IBUIParentViewController\" ref=\"652737156\"/>\n\t\t\t\t\t\t\t<string key=\"IBUINibName\">Sources</string>\n\t\t\t\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"IBUIViewControllers\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBUIViewController\" id=\"1024858337\">\n\t\t\t\t\t\t<string key=\"IBUITitle\">SpyPhone</string>\n\t\t\t\t\t\t<object class=\"IBUIView\" key=\"IBUIView\" id=\"434903890\">\n\t\t\t\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"IBUILabel\" id=\"375618992\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">306</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{80, 156}, {159, 43}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MSAwAA</bytes>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\" id=\"911360926\">\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t\t\t<string key=\"IBUIText\">SpyPhone</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"131293388\"/>\n\t\t\t\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">1</int>\n\t\t\t\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">10</float>\n\t\t\t\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"name\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<string key=\"family\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<int key=\"traits\">0</int>\n\t\t\t\t\t\t\t\t\t\t<double key=\"pointSize\">36</double>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">36</double>\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"IBUITextView\" id=\"876077251\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">306</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 238}, {280, 153}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEgMAA</bytes>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<object class=\"IBUIAccessibilityConfiguration\" key=\"IBUIAccessibilityConfiguration\">\n\t\t\t\t\t\t\t\t\t\t<integer value=\"256\" key=\"IBUIAccessibilityTraits\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIBounces\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIScrollEnabled\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIShowsHorizontalScrollIndicator\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIShowsVerticalScrollIndicator\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIDelaysContentTouches\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUICanCancelContentTouches\">NO</bool>\n\t\t\t\t\t\t\t\t\t<float key=\"IBUIMinimumZoomScale\">0.0</float>\n\t\t\t\t\t\t\t\t\t<float key=\"IBUIMaximumZoomScale\">0.0</float>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIBouncesZoom\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"IBUIText\">VGhpcyBhcHAgc2hvd3MgdGhlIGtpbmQgb2YgZGF0YQphIHJvZ3VlIGFwcGxpY2F0aW9uIGNhbiBjb2xs\nZWN0LgoKTm8gcHJpdmF0ZSBBUElzIHdlcmUgdXNlZC4KVGhpcyBhcHAgZG9lcyBub3QgcGhvbmUgaG9t\nZS4KCmh0dHA6Ly9zZXJpb3QuY2g</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"911360926\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"name\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<string key=\"family\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<int key=\"traits\">0</int>\n\t\t\t\t\t\t\t\t\t\t<double key=\"pointSize\">16</double>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">16</double>\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"IBUIImageView\" id=\"51808458\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{40, 20}, {240, 128}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"434903890\"/>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\" id=\"596749065\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwAA</bytes>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t\t\t\t\t\t<int key=\"IBUIContentMode\">4</int>\n\t\t\t\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"IBUIImage\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">white_hat.png</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 20}, {320, 411}}</string>\n\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t\t\t\t<object class=\"IBUIAccessibilityConfiguration\" key=\"IBUIAccessibilityConfiguration\">\n\t\t\t\t\t\t\t\t<integer value=\"258\" key=\"IBUIAccessibilityTraits\"/>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUITabBarItem\" key=\"IBUITabBarItem\" id=\"765670903\">\n\t\t\t\t\t\t\t<string key=\"IBUITitle\">About</string>\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"IBUIImage\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">white_hat_mask.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIParentViewController\" ref=\"1034742383\"/>\n\t\t\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<reference ref=\"652737156\"/>\n\t\t\t\t\t<object class=\"IBUIViewController\" id=\"810586621\">\n\t\t\t\t\t\t<string key=\"IBUITitle\">Report</string>\n\t\t\t\t\t\t<object class=\"IBUITabBarItem\" key=\"IBUITabBarItem\" id=\"217035927\">\n\t\t\t\t\t\t\t<string key=\"IBUITitle\">Email Report</string>\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"IBUIImage\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">report.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIToolbarItems\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"IBUIParentViewController\" ref=\"1034742383\"/>\n\t\t\t\t\t\t<string key=\"IBUINibName\">SPEmailReportVC</string>\n\t\t\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUITabBar\" key=\"IBUITabBar\" id=\"795333663\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t<string key=\"NSFrame\">{{0, 431}, {320, 49}}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"596749065\"/>\n\t\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"664661524\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">99</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">window</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"664661524\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"380026005\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">9</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">tabBarController</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"664661524\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1034742383\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">147</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">allSources</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"810586621\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"216723952\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">148</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"380026005\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"664661524\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">106</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1034742383\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"795333663\"/>\n\t\t\t\t\t\t\t<reference ref=\"1024858337\"/>\n\t\t\t\t\t\t\t<reference ref=\"652737156\"/>\n\t\t\t\t\t\t\t<reference ref=\"810586621\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">107</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"795333663\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1034742383\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">108</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1024858337\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"765670903\"/>\n\t\t\t\t\t\t\t<reference ref=\"434903890\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1034742383\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">111</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"765670903\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1024858337\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"532797962\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">119</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"434903890\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"375618992\"/>\n\t\t\t\t\t\t\t<reference ref=\"51808458\"/>\n\t\t\t\t\t\t\t<reference ref=\"876077251\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1024858337\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">121</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"375618992\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"434903890\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">123</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"876077251\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"434903890\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">134</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"652737156\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"947032985\"/>\n\t\t\t\t\t\t\t<reference ref=\"325782924\"/>\n\t\t\t\t\t\t\t<reference ref=\"216723952\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1034742383\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">135</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"947032985\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"652737156\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">138</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"325782924\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"652737156\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">136</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"216723952\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"459063531\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"652737156\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">137</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"459063531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"216723952\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">144</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"51808458\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"434903890\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">145</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"810586621\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"217035927\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1034742383\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">146</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"217035927\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"810586621\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-1.IBPluginDependency</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>-2.IBPluginDependency</string>\n\t\t\t\t\t<string>106.IBPluginDependency</string>\n\t\t\t\t\t<string>107.IBPluginDependency</string>\n\t\t\t\t\t<string>108.IBPluginDependency</string>\n\t\t\t\t\t<string>111.IBPluginDependency</string>\n\t\t\t\t\t<string>119.IBPluginDependency</string>\n\t\t\t\t\t<string>121.IBPluginDependency</string>\n\t\t\t\t\t<string>123.IBPluginDependency</string>\n\t\t\t\t\t<string>134.IBPluginDependency</string>\n\t\t\t\t\t<string>135.IBPluginDependency</string>\n\t\t\t\t\t<string>136.CustomClassName</string>\n\t\t\t\t\t<string>136.IBPluginDependency</string>\n\t\t\t\t\t<string>137.IBPluginDependency</string>\n\t\t\t\t\t<string>138.IBPluginDependency</string>\n\t\t\t\t\t<string>144.IBPluginDependency</string>\n\t\t\t\t\t<string>145.CustomClassName</string>\n\t\t\t\t\t<string>145.IBPluginDependency</string>\n\t\t\t\t\t<string>146.IBPluginDependency</string>\n\t\t\t\t\t<string>2.IBAttributePlaceholdersKey</string>\n\t\t\t\t\t<string>2.IBPluginDependency</string>\n\t\t\t\t\t<string>3.CustomClassName</string>\n\t\t\t\t\t<string>3.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>UIApplication</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPAllSourcesTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPEmailReportVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SpyPhoneAppDelegate</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">148</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\"/>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencyDefaults\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>data.png</string>\n\t\t\t\t<string>report.png</string>\n\t\t\t\t<string>white_hat.png</string>\n\t\t\t\t<string>white_hat_mask.png</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>{32, 29}</string>\n\t\t\t\t<string>{36, 39}</string>\n\t\t\t\t<string>{180, 124}</string>\n\t\t\t\t<string>{30, 30}</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">933</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "OUILookupTool/OUILookupTool.h",
    "content": "//\n//  OUILookupTool.h\n//  OUILookup\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class OUILookupTool;\n\n@protocol OUILookupToolDelegate\n- (void)OUILookupTool:(OUILookupTool *)ouiLookupTool didLocateAccessPoint:(NSDictionary *)ap;\n@end\n\n@interface OUILookupTool : NSObject {\n\tNSObject <OUILookupToolDelegate> *delegate;\n}\n\n@property (nonatomic, retain) NSObject <OUILookupToolDelegate> *delegate;\n\n// ap should have a \"bssid\" key\n+ (OUILookupTool *)locateWifiAccessPoint:(NSDictionary *)ap delegate:(NSObject <OUILookupToolDelegate> *)aDelegate;\n\n@end\n"
  },
  {
    "path": "OUILookupTool/OUILookupTool.m",
    "content": "//\n//  OUILookupTool.m\n//  OUILookup\n//\n//  Created by Nicolas Seriot on 10/31/10.\n//  Copyright 2010 IICT. All rights reserved.\n//\n\n#import \"OUILookupTool.h\"\n#import \"JSON.h\"\n\n@implementation OUILookupTool\n\n@synthesize delegate;\n\n- (void)fetchLocationForAccessPointInNewThread:(NSMutableDictionary *)ap {\n\t\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\t\n\tNSString *aBSSID = [ap valueForKey:@\"BSSID\"];\n\t\n\tNSDictionary *d = [NSDictionary dictionaryWithObject:aBSSID forKey:@\"mac_address\"];\n\tNSArray *wifiTowers = [NSArray arrayWithObject:d];\n\t\n\tNSDictionary *postDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];\n\t[postDictionary setValue:@\"1.1.0\" forKey:@\"version\"];\n\t[postDictionary setValue:@\"ouilookup\" forKey:@\"host\"];\n\t[postDictionary setValue:wifiTowers forKey:@\"wifi_towers\"];\n\t\n\tNSString *postJSON = [postDictionary JSONRepresentation];\n\t[postDictionary release];\n\t\n\tNSData *data = [postJSON dataUsingEncoding:NSUTF8StringEncoding];\n\t\n\tNSURL *url = [NSURL URLWithString:@\"http://66.249.92.104/loc/json\"];\n\t\n\tNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];\n\t[request setHTTPBody:data];\n\t[request setCachePolicy:NSURLRequestUseProtocolCachePolicy];\n\t[request setHTTPMethod:@\"POST\"];\n\t[request setValue:@\"application/json\" forHTTPHeaderField:@\"Content-type\"];\n\tNSString *contentLength = [NSString stringWithFormat:@\"%d\", [data length]];\n\t[request setValue:contentLength forHTTPHeaderField:@\"Content-Length\"];\n\t[request setValue:@\"www.google.com\" forHTTPHeaderField:@\"Host\"];\n\t\n\tNSError *error = nil;\n\tNSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];\n\tNSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];\n\t\n\tNSDictionary *responseDict = [responseString JSONValue];\n\t\n\tNSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:ap, @\"originalDict\", responseDict, @\"responseDict\", nil];\n\t\n\t[self performSelectorOnMainThread:@selector(didFinishLookup:) withObject:params waitUntilDone:YES];\n\t\n\t[pool release];\n}\n\n- (void)didFinishLookup:(NSDictionary *)params {\n//\tNSLog(@\"-- %@\", ap);\n\n\tNSMutableDictionary *ap = [params objectForKey:@\"originalDict\"];\n\tNSDictionary *responseDict = [params objectForKey:@\"responseDict\"];\n\t\n\t[ap addEntriesFromDictionary:responseDict];\n\t\n\t[delegate OUILookupTool:self didLocateAccessPoint:ap];\n}\n\n- (void)dealloc {\n\t[delegate release];\n\t[super dealloc];\n}\n\n+ (NSString *)formattedBSSID:(NSString *)aBSSID {\n\tNSArray *comps = [aBSSID componentsSeparatedByString:@\":\"];\n\t\n\tif([comps count] != 6) return nil;\n\t\n\tNSMutableArray *a = [NSMutableArray array];\n\t\n\tfor(NSString *comp in comps) {\n\t\tNSUInteger length = [comp length];\n\t\tif(length == 0 || length > 2) return nil;\n\n\t\tNSString *s = length == 2 ? comp : [@\"0\" stringByAppendingString:comp];\n\t\t[a addObject:s];\n\t}\n\t\n\treturn [a componentsJoinedByString:@\":\"];\n}\n\n+ (OUILookupTool *)locateWifiAccessPoint:(NSMutableDictionary *)ap delegate:(NSObject <OUILookupToolDelegate> *)aDelegate {\n\tNSString *aBSSID = [ap valueForKey:@\"BSSID\"];\n\tNSString *formattedBSSID = [self formattedBSSID:aBSSID];\t\n\tif(formattedBSSID == nil) return nil;\n\t\n\t[ap setValue:formattedBSSID forKey:@\"BSSID\"];\n\t\n\tOUILookupTool *olt = [[OUILookupTool alloc] init];\n\tolt.delegate = aDelegate;\n\t\n\t[NSThread detachNewThreadSelector:@selector(fetchLocationForAccessPointInNewThread:) toTarget:olt withObject:ap];\n\treturn [olt autorelease];\n}\n\n@end\n"
  },
  {
    "path": "README.markdown",
    "content": "At BlackHat DC 2010, I presented a paper called [iPhone Privacy](http://seriot.ch/resources/talks_papers/iPhonePrivacy.pdf).\n\nIn this paper, I call the following Apple claim into question:\n\n> Applications on the device are \"sandboxed\" so they cannot access data stored by other applications.\n\n> In addition, system files, resources, and the kernel are shielded from the user's application space.\n\n> Source: [iPhone in Business - Security Overview](http://www.apple.com/iphone/business/docs/iPhone_Security.pdf)\n\nSpyPhone demoes it is not exactly true. It shows the kind of data a rogue application can collect in a non jailbroken iPhone.\n\nThese data do certainly interest marketers, spammers, thieves, competitors and law enforcement officials.\n\n"
  },
  {
    "path": "SPCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">784</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10C540</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">740</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.25</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">458.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">62</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewCell\" id=\"327842776\">\n\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBUIView\" id=\"493392374\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"327842776\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 43}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"327842776\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">4</int>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 44}</string>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<int key=\"IBUISeparatorStyle\">1</int>\n\t\t\t\t<reference key=\"IBUIContentView\" ref=\"493392374\"/>\n\t\t\t\t<bool key=\"IBUIShouldIndentWhileEditing\">NO</bool>\n\t\t\t\t<string key=\"IBUIReuseIdentifier\">SPCell</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"327842776\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>2.CustomClassName</string>\n\t\t\t\t\t<string>2.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>2.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>SPCell</string>\n\t\t\t\t\t<string>{{126, 652}, {320, 44}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">6</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPCell</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewCell</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPCell.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPCell</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewCell</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">label</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UILabel</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"643013005\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UILabel</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UILabel.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"643013005\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UITableViewCell</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITableViewCell.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">MyData.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">3.1</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SPEmailReportVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1024</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10F569</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">804</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.29</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">461.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">123</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"210793899\">\n\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"869339370\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"210793899\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{103, 275}, {114, 37}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"210793899\"/>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Send Report</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"95363601\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"210793899\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 320}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"210793899\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"917063709\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">1</int>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">10</float>\n\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"689037925\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"210793899\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">306</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{55, 20}, {210, 43}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"210793899\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MSAwAA</bytes>\n\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\" id=\"843226447\">\n\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Email Report</string>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">36</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"917063709\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">1</int>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">10</float>\n\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"649992635\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"210793899\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">306</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 71}, {280, 196}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"210793899\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEgMAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<object class=\"IBUIAccessibilityConfiguration\" key=\"IBUIAccessibilityConfiguration\">\n\t\t\t\t\t\t\t<integer value=\"256\" key=\"IBUIAccessibilityTraits\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIBounces\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIScrollEnabled\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIShowsHorizontalScrollIndicator\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIShowsVerticalScrollIndicator\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIDelaysContentTouches\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUICanCancelContentTouches\">NO</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumZoomScale\">0.0</float>\n\t\t\t\t\t\t<float key=\"IBUIMaximumZoomScale\">0.0</float>\n\t\t\t\t\t\t<bool key=\"IBUIBouncesZoom\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"IBUIText\">WW91IGNhbiBzZW5kIGEgcmVwb3J0IGNvbnRhaW5pbmcgU3B5UGhvbmUgcGVyc29uYWwgZGF0YSBieSBl\nbWFpbC4KCllvdSBjYW4gY2hvb3NlIHRoZSBlbWFpbCBhZGRyZXNzLgoKWW91IHdpbGwgc2VlIHRoZSBy\nZXBvcnQgYmVmb3JlIHlvdSBhZ3JlZSB0byBzZW5kIGl0LgoKTm90aGluZyBpcyBzZW50IGVsc2V3aGVy\nZS4</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"843226447\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">16</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"210793899\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">4</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sendReport:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"869339370\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"841351856\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">6</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">message</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"95363601\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">8</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"210793899\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"649992635\"/>\n\t\t\t\t\t\t\t<reference ref=\"869339370\"/>\n\t\t\t\t\t\t\t<reference ref=\"95363601\"/>\n\t\t\t\t\t\t\t<reference ref=\"689037925\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">5</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"869339370\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"210793899\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">7</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"95363601\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"210793899\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">9</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"689037925\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"210793899\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">10</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"649992635\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"210793899\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>10.IBPluginDependency</string>\n\t\t\t\t\t<string>3.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>3.IBPluginDependency</string>\n\t\t\t\t\t<string>5.IBPluginDependency</string>\n\t\t\t\t\t<string>7.IBPluginDependency</string>\n\t\t\t\t\t<string>9.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPEmailReportVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>{{483, 203}, {320, 460}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">10</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPAllSourcesTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>sourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>sourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>sourceSafariTVC</string>\n\t\t\t\t\t\t\t<string>sourceWifiTVC</string>\n\t\t\t\t\t\t\t<string>sourceYouTubeTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPSourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>SPSourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>SPSourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceSafariTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceWifiTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceYouTubeTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>sourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>sourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>sourceSafariTVC</string>\n\t\t\t\t\t\t\t<string>sourceWifiTVC</string>\n\t\t\t\t\t\t\t<string>sourceYouTubeTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceAddressBookTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceEmailTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceEmailTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceKeyboardTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceLocationTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceLocationTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourcePhoneTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourcePhoneTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourcePhotosTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourcePhotosTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceSafariTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceSafariTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceWifiTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceWifiTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceYouTubeTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceYouTubeTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPAllSourcesTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPEmailReportVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">sendReport:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">sendReport:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">sendReport:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>allSources</string>\n\t\t\t\t\t\t\t<string>message</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPAllSourcesTVC</string>\n\t\t\t\t\t\t\t<string>UILabel</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>allSources</string>\n\t\t\t\t\t\t\t<string>message</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">allSources</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPAllSourcesTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">message</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">UILabel</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPEmailReportVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageMapVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t\t\t<string>MKMapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">imageVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">mapView</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">MKMapView</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIImageView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">imageView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">UIImageView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">SPImageVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceAddressBookTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceAddressBookTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceEmailTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceEmailTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceKeyboardTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceKeyboardTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceLocationTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceLocationTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourcePhoneTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourcePhoneTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourcePhotosTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t\t\t<string>SPImageMapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">imageVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">mapVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageMapVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourcePhotosTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceSafariTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webViewVC</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">SPWebViewVC</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webViewVC</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">webViewVC</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPWebViewVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceSafariTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceWifiTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceWifiTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceYouTubeTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPSourceYouTubeTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWebViewVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIWebView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">webView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">UIWebView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Classes/SPWebViewVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MKMapView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">MapKit.framework/Headers/MKMapView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"612973240\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIButton</string>\n\t\t\t\t\t<string key=\"superclassName\">UIControl</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIButton.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIControl</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIControl.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIImageView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIImageView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UILabel</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UILabel.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"612973240\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIScrollView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIScrollView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UITableViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITableViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UITextView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIScrollView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIWebView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIWebView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">SpyPhone.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">123</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SPImageMapVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1024</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10F569</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">804</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.29</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">461.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">123</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"834637860\">\n\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBMKMapView\" id=\"92182951\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"834637860\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"834637860\"/>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">4</int>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"834637860\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">mapView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"92182951\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">6</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"92182951\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"841351856\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">7</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"834637860\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"92182951\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"92182951\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"834637860\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>2.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>2.IBPluginDependency</string>\n\t\t\t\t\t<string>4.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPImageMapVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>{{451, 121}, {320, 460}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">8</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageMapVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t\t\t<string>MKMapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">imageVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">mapView</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">MKMapView</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIImageView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">imageView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">UIImageView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">SPImageVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MKMapView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">MapKit.framework/Headers/MKMapView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"899568980\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIImageView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIImageView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"899568980\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">SpyPhone.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">123</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SPImageVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">784</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10C540</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">740</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.25</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">458.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">62</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<integer value=\"4\"/>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"1008344061\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBUIImageView\" id=\"46473948\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"1008344061\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"1008344061\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">1</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1008344061\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">5</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">imageView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"46473948\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">7</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1008344061\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"46473948\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">6</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"46473948\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1008344061\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>4.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>4.IBPluginDependency</string>\n\t\t\t\t\t<string>6.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>{{417, 270}, {320, 460}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">7</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIImageView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">SPImageVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"1067982049\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIImageView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIImageView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"1067982049\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">SpyPhone.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">3.1</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SPSourceTVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">784</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10C540</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">740</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.25</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">458.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">62</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableView\" id=\"897669329\">\n\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 247}</string>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<bool key=\"IBUIBouncesZoom\">NO</bool>\n\t\t\t\t<int key=\"IBUISeparatorStyle\">1</int>\n\t\t\t\t<int key=\"IBUISectionIndexMinimumDisplayRowCount\">0</int>\n\t\t\t\t<bool key=\"IBUIShowsSelectionImmediatelyOnTouchBegin\">YES</bool>\n\t\t\t\t<float key=\"IBUIRowHeight\">44</float>\n\t\t\t\t<float key=\"IBUISectionHeaderHeight\">22</float>\n\t\t\t\t<float key=\"IBUISectionFooterHeight\">22</float>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">dataSource</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"897669329\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"841351856\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"897669329\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"841351856\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">4</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"897669329\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">5</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"897669329\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>2.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPSourceTVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">5</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">SPWebViewVC</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWebViewVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIWebView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"894436110\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"894436110\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIScrollView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIScrollView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UITableView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIScrollView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITableView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UITableViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITableViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIWebView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIWebView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">MyData.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">3.1</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SPWebViewVC.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">784</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10C540</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">740</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.25</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">458.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">62</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"841351856\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"371349661\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"812978162\">\n\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBUIWebView\" id=\"757408207\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"812978162\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"812978162\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIDataDetectorTypes\">1</int>\n\t\t\t\t\t\t<bool key=\"IBUIDetectsPhoneNumbers\">YES</bool>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 460}</string>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\">\n\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">webView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"757408207\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">5</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"812978162\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">6</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"841351856\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"371349661\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"812978162\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"757408207\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"757408207\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"812978162\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>3.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>3.IBPluginDependency</string>\n\t\t\t\t\t<string>4.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPWebViewVC</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>{{315, 29}, {320, 460}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">6</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWebViewVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIWebView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSNetServices.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPort.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSStream.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSXMLParser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"952507796\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"952507796\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchBar</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchBar.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UISearchDisplayController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UISearchDisplayController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITextField.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UINavigationController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UITabBarController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">UIWebView</string>\n\t\t\t\t\t<string key=\"superclassName\">UIView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">UIKit.framework/Headers/UIWebView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">MyData.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">3.1</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "Settings.bundle/Root.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>StringsTable</key>\n\t<string>Root</string>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSToggleSwitchSpecifier</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>TV OUT</string>\n\t\t\t<key>Key</key>\n\t\t\t<string>TVOutEnabled</string>\n\t\t\t<key>DefaultValue</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">11C74</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">1938</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1138.23</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">567.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">933</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>IBUITableViewController</string>\n\t\t\t<string>IBUITableView</string>\n\t\t\t<string>IBUIViewController</string>\n\t\t\t<string>IBProxyObject</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableView\" id=\"709995038\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<string key=\"NSFrameSize\">{320, 247}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t<bool key=\"IBUIClearsContextBeforeDrawing\">NO</bool>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">3</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIBouncesZoom\">NO</bool>\n\t\t\t\t<int key=\"IBUISeparatorStyle\">1</int>\n\t\t\t\t<int key=\"IBUISectionIndexMinimumDisplayRowCount\">0</int>\n\t\t\t\t<bool key=\"IBUIShowsSelectionImmediatelyOnTouchBegin\">YES</bool>\n\t\t\t\t<float key=\"IBUIRowHeight\">44</float>\n\t\t\t\t<float key=\"IBUISectionHeaderHeight\">22</float>\n\t\t\t\t<float key=\"IBUISectionFooterHeight\">22</float>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"786123895\">\n\t\t\t\t<string key=\"IBUITitle\">Email Accounts</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIViewController\" id=\"730440001\">\n\t\t\t\t<string key=\"IBUINibName\">SPWebViewVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"735436302\">\n\t\t\t\t<string key=\"IBUITitle\">Wifi</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"1004435595\">\n\t\t\t\t<string key=\"IBUITitle\">Phone</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"166000552\">\n\t\t\t\t<string key=\"IBUITitle\">Location</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"204828993\">\n\t\t\t\t<string key=\"IBUITitle\">Photos</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"167539377\">\n\t\t\t\t<string key=\"IBUITitle\">AddressBook</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUITableViewController\" id=\"682700138\">\n\t\t\t\t<string key=\"IBUITitle\">Keyboard Cache</string>\n\t\t\t\t<string key=\"IBUINibName\">SPSourceTVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIViewController\" id=\"715101110\">\n\t\t\t\t<string key=\"IBUITitle\">Map</string>\n\t\t\t\t<string key=\"IBUINibName\">SPImageMapVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIViewController\" id=\"486827528\">\n\t\t\t\t<string key=\"IBUINibName\">SPImageVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIViewController\" id=\"887580274\">\n\t\t\t\t<string key=\"IBUINibName\">SPWifiMapVC</string>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedOrientationMetrics\" key=\"IBUISimulatedOrientationMetrics\">\n\t\t\t\t\t<int key=\"IBUIInterfaceOrientation\">1</int>\n\t\t\t\t\t<int key=\"interfaceOrientation\">1</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t<bool key=\"IBUIHorizontal\">NO</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"709995038\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">9</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourceEmailTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"786123895\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">72</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourceWifiTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"735436302\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">73</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourcePhoneTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1004435595\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">74</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourceLocationTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"166000552\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">75</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourcePhotosTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"204828993\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">78</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourceAddressBookTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"167539377\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">79</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sourceKeyboardTVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"682700138\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">80</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">dataSource</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"709995038\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">10</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"709995038\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">11</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">mapVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"735436302\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"887580274\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">93</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">mapVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"204828993\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"715101110\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">88</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">imageVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"204828993\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"486827528\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">91</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">imageVC</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"715101110\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"486827528\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">90</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"object\" id=\"0\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">8</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"709995038\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">13</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"786123895\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">49</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"730440001\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">60</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"735436302\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">64</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1004435595\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">65</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"166000552\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">68</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"204828993\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">69</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"167539377\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">70</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"682700138\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">86</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"715101110\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">89</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"486827528\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">92</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"887580274\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.CustomClassName</string>\n\t\t\t\t\t<string>-1.IBPluginDependency</string>\n\t\t\t\t\t<string>-2.CustomClassName</string>\n\t\t\t\t\t<string>-2.IBPluginDependency</string>\n\t\t\t\t\t<string>13.CustomClassName</string>\n\t\t\t\t\t<string>13.IBPluginDependency</string>\n\t\t\t\t\t<string>49.CustomClassName</string>\n\t\t\t\t\t<string>49.IBPluginDependency</string>\n\t\t\t\t\t<string>60.CustomClassName</string>\n\t\t\t\t\t<string>60.IBPluginDependency</string>\n\t\t\t\t\t<string>64.CustomClassName</string>\n\t\t\t\t\t<string>64.IBPluginDependency</string>\n\t\t\t\t\t<string>65.CustomClassName</string>\n\t\t\t\t\t<string>65.IBPluginDependency</string>\n\t\t\t\t\t<string>68.CustomClassName</string>\n\t\t\t\t\t<string>68.IBPluginDependency</string>\n\t\t\t\t\t<string>69.CustomClassName</string>\n\t\t\t\t\t<string>69.IBPluginDependency</string>\n\t\t\t\t\t<string>70.CustomClassName</string>\n\t\t\t\t\t<string>70.IBPluginDependency</string>\n\t\t\t\t\t<string>8.IBPluginDependency</string>\n\t\t\t\t\t<string>86.CustomClassName</string>\n\t\t\t\t\t<string>86.IBPluginDependency</string>\n\t\t\t\t\t<string>89.CustomClassName</string>\n\t\t\t\t\t<string>89.IBPluginDependency</string>\n\t\t\t\t\t<string>92.CustomClassName</string>\n\t\t\t\t\t<string>92.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>SPAllSourcesTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>UIResponder</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourceEmailTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPWebViewVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourceWifiTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourcePhoneTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourceLocationTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourcePhotosTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourceAddressBookTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPSourceKeyboardTVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPImageMapVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t\t<string>SPWifiMapVC</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">93</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPAllSourcesTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>sourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>sourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>sourceWifiTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPSourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>SPSourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>SPSourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>SPSourceWifiTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t<string>sourceEmailTVC</string>\n\t\t\t\t\t\t\t<string>sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t<string>sourceLocationTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhoneTVC</string>\n\t\t\t\t\t\t\t<string>sourcePhotosTVC</string>\n\t\t\t\t\t\t\t<string>sourceWifiTVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceAddressBookTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceAddressBookTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceEmailTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceEmailTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceKeyboardTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceKeyboardTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceLocationTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceLocationTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourcePhoneTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourcePhoneTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourcePhotosTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourcePhotosTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">sourceWifiTVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPSourceWifiTVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPAllSourcesTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageMapVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t\t\t<string>MKMapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">imageVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">mapView</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">MKMapView</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPImageMapVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPImageVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIImageView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">imageView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">imageView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">UIImageView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPImageVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceAddressBookTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceAddressBookTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceEmailTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceEmailTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceKeyboardTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceKeyboardTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceLocationTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceLocationTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourcePhoneTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourcePhoneTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourcePhotosTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>SPImageVC</string>\n\t\t\t\t\t\t\t<string>SPImageMapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>imageVC</string>\n\t\t\t\t\t\t\t<string>mapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">imageVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">mapVC</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPImageMapVC</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourcePhotosTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UITableViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPSourceWifiTVC</string>\n\t\t\t\t\t<string key=\"superclassName\">SPSourceTVC</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapVC</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">SPWifiMapVC</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapVC</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">mapVC</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">SPWifiMapVC</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPSourceWifiTVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWebViewVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">UIWebView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">webView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">webView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">UIWebView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPWebViewVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SPWifiMapVC</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapView</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">MKMapView</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">mapView</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">mapView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MKMapView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SPWifiMapVC.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencyDefaults\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3100\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">933</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "SpyPhone-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>ch.seriot.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSMainNibFile</key>\n\t<string>MainWindow</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string></string>\n\t<key>UIPrerenderedIcon</key>\n\t<string>YES</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "SpyPhone.xcodeproj/nst.pbxuser",
    "content": "// !$*UTF8*$!\n{\n\t030AFB2B127D08BF00C9E0C6 /* SPWifiMapVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {705, 325}}\";\n\t\t\tsepNavSelRange = \"{225, 0}\";\n\t\t\tsepNavVisRange = \"{0, 498}\";\n\t\t};\n\t};\n\t030AFB2C127D08BF00C9E0C6 /* SPWifiMapVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 1040}}\";\n\t\t\tsepNavSelRange = \"{617, 0}\";\n\t\t\tsepNavVisRange = \"{510, 776}\";\n\t\t};\n\t};\n\t030AFBA2127D0D6F00C9E0C6 /* SPWifiAnnotation.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 411}}\";\n\t\t\tsepNavSelRange = \"{187, 56}\";\n\t\t\tsepNavVisRange = \"{0, 596}\";\n\t\t};\n\t};\n\t030AFBA3127D0D6F00C9E0C6 /* SPWifiAnnotation.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 676}}\";\n\t\t\tsepNavSelRange = \"{166, 33}\";\n\t\t\tsepNavVisRange = \"{0, 812}\";\n\t\t};\n\t};\n\t030AFF8F127D3AED00C9E0C6 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 033805D1127CECF900EAFE64 /* NSString+SBJSON.m */;\n\t\tname = \"NSString+SBJSON.m: 2\";\n\t\trLen = 4;\n\t\trLoc = 23;\n\t\trType = 0;\n\t\tvrLen = 1618;\n\t\tvrLoc = 0;\n\t};\n\t030AFF90127D3AED00C9E0C6 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tname = \"FirstViewController.h: 6\";\n\t\trLen = 5;\n\t\trLoc = 101;\n\t\trType = 0;\n\t\tvrLen = 272;\n\t\tvrLoc = 0;\n\t};\n\t030AFF9A127D3BF000C9E0C6 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 030AFB2C127D08BF00C9E0C6 /* SPWifiMapVC.m */;\n\t\tname = \"SPWifiMapVC.m: 34\";\n\t\trLen = 0;\n\t\trLoc = 617;\n\t\trType = 0;\n\t\tvrLen = 776;\n\t\tvrLoc = 510;\n\t};\n\t0310C65310C4BE0800E7ACD2 /* SPImageVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 435}}\";\n\t\t\tsepNavSelRange = \"{191, 50}\";\n\t\t\tsepNavVisRange = \"{0, 351}\";\n\t\t};\n\t};\n\t0310C65410C4BE0800E7ACD2 /* SPImageVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 559}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{78, 644}\";\n\t\t};\n\t};\n\t0312C759133561EA00E99BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 5F0DA1BA12829A6E00CD3B56 /* TVOutManager.h */;\n\t\tname = \"TVOutManager.h: 16\";\n\t\trLen = 0;\n\t\trLoc = 311;\n\t\trType = 0;\n\t\tvrLen = 727;\n\t\tvrLoc = 0;\n\t};\n\t0312C75B133561EA00E99BA4 /* PlistBookmark */ = {\n\t\tisa = PlistBookmark;\n\t\tfRef = 8D1107310486CEB800E47090 /* SpyPhone-Info.plist */;\n\t\tfallbackIsa = PBXBookmark;\n\t\tisK = 0;\n\t\tkPath = (\n\t\t\tUIPrerenderedIcon,\n\t\t);\n\t\tname = \"/Users/nst/Projects/SpyPhone/SpyPhone-Info.plist\";\n\t\trLen = 0;\n\t\trLoc = 9223372036854775808;\n\t};\n\t0312C764133561EB00E99BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */;\n\t\tname = \"SPSourcePhotosTVC.m: 149\";\n\t\trLen = 0;\n\t\trLoc = 4871;\n\t\trType = 0;\n\t\tvrLen = 2267;\n\t\tvrLoc = 1618;\n\t};\n\t0312C7731335623A00E99BA4 /* PlistBookmark */ = {\n\t\tisa = PlistBookmark;\n\t\tfRef = 8D1107310486CEB800E47090 /* SpyPhone-Info.plist */;\n\t\tfallbackIsa = PBXBookmark;\n\t\tisK = 0;\n\t\tkPath = (\n\t\t);\n\t\tname = \"/Users/nst/Projects/SpyPhone/SpyPhone-Info.plist\";\n\t\trLen = 0;\n\t\trLoc = 9223372036854775807;\n\t};\n\t0312C7741335623A00E99BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */;\n\t\tname = \"SPSourcePhotosTVC.m: 149\";\n\t\trLen = 0;\n\t\trLoc = 4871;\n\t\trType = 0;\n\t\tvrLen = 2267;\n\t\tvrLoc = 1618;\n\t};\n\t031748B710B6E35C00B6116E /* SPEmailASAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 635}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 262}\";\n\t\t};\n\t};\n\t031748B810B6E35C00B6116E /* SPEmailASAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 527}}\";\n\t\t\tsepNavSelRange = \"{457, 7}\";\n\t\t\tsepNavVisRange = \"{0, 742}\";\n\t\t};\n\t};\n\t031748BE10B6E63E00B6116E /* SPEmailAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{846, 0}\";\n\t\t\tsepNavVisRange = \"{0, 876}\";\n\t\t};\n\t};\n\t031748BF10B6E63E00B6116E /* SPEmailAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 728}}\";\n\t\t\tsepNavSelRange = \"{1259, 0}\";\n\t\t\tsepNavVisRange = \"{646, 655}\";\n\t\t};\n\t};\n\t031748C510B6E98800B6116E /* SPEmailPOPAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 465}}\";\n\t\t\tsepNavSelRange = \"{221, 0}\";\n\t\t\tsepNavVisRange = \"{0, 268}\";\n\t\t};\n\t};\n\t031748C610B6E98800B6116E /* SPEmailPOPAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 527}}\";\n\t\t\tsepNavSelRange = \"{488, 7}\";\n\t\t\tsepNavVisRange = \"{0, 726}\";\n\t\t};\n\t};\n\t031748C810B6E9A000B6116E /* SPEmailIToolsAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 550}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 269}\";\n\t\t};\n\t};\n\t031748C910B6E9A000B6116E /* SPEmailIToolsAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 442}}\";\n\t\t\tsepNavSelRange = \"{586, 0}\";\n\t\t\tsepNavVisRange = \"{214, 722}\";\n\t\t};\n\t};\n\t0317498410B6F3A300B6116E /* SPEmailGmailAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{138, 27}\";\n\t\t\tsepNavVisRange = \"{0, 268}\";\n\t\t};\n\t};\n\t0317498510B6F3A300B6116E /* SPEmailGmailAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{830, 7}\";\n\t\t\tsepNavVisRange = \"{0, 917}\";\n\t\t};\n\t};\n\t0317498710B6F49300B6116E /* SPEmailIMAPAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{164, 0}\";\n\t\t\tsepNavVisRange = \"{0, 266}\";\n\t\t};\n\t};\n\t0317498810B6F49300B6116E /* SPEmailIMAPAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{493, 7}\";\n\t\t\tsepNavVisRange = \"{0, 732}\";\n\t\t};\n\t};\n\t0328F4AB10B05E890074A5A1 /* SpyPhone */ = {\n\t\tisa = PBXExecutable;\n\t\tactiveArgIndices = (\n\t\t);\n\t\targumentStrings = (\n\t\t);\n\t\tautoAttachOnCrash = 1;\n\t\tbreakpointsEnabled = 1;\n\t\tconfigStateDict = {\n\t\t};\n\t\tcustomDataFormattersEnabled = 1;\n\t\tdataTipCustomDataFormattersEnabled = 1;\n\t\tdataTipShowTypeColumn = 1;\n\t\tdataTipSortType = 0;\n\t\tdebuggerPlugin = GDBDebugging;\n\t\tdisassemblyDisplayState = 0;\n\t\tdylibVariantSuffix = \"\";\n\t\tenableDebugStr = 1;\n\t\tenvironmentEntries = (\n\t\t);\n\t\texecutableSystemSymbolLevel = 0;\n\t\texecutableUserSymbolLevel = 0;\n\t\tlibgmallocEnabled = 0;\n\t\tname = SpyPhone;\n\t\tsavedGlobals = {\n\t\t};\n\t\tshowTypeColumn = 0;\n\t\tsourceDirectories = (\n\t\t);\n\t\tvariableFormatDictionary = {\n\t\t};\n\t};\n\t0328F4B810B05E8E0074A5A1 /* Source Control */ = {\n\t\tisa = PBXSourceControlManager;\n\t\tfallbackIsa = XCSourceControlManager;\n\t\tisSCMEnabled = 0;\n\t\tscmConfiguration = {\n\t\t\trepositoryNamesForRoots = {\n\t\t\t\t\"\" = \"\";\n\t\t\t};\n\t\t};\n\t};\n\t0328F4B910B05E8E0074A5A1 /* Code sense */ = {\n\t\tisa = PBXCodeSenseManager;\n\t\tindexTemplatePath = \"\";\n\t};\n\t0328F4CD10B0614A0074A5A1 /* SPAllSourcesTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 546}}\";\n\t\t\tsepNavSelRange = \"{575, 16}\";\n\t\t\tsepNavVisRange = \"{42, 1059}\";\n\t\t};\n\t};\n\t0328F4CE10B0614A0074A5A1 /* SPAllSourcesTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 1612}}\";\n\t\t\tsepNavSelRange = \"{1522, 0}\";\n\t\t\tsepNavVisRange = \"{1089, 449}\";\n\t\t};\n\t};\n\t0328F50810B065530074A5A1 /* SPCell.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 247}}\";\n\t\t\tsepNavSelRange = \"{164, 15}\";\n\t\t\tsepNavVisRange = \"{0, 240}\";\n\t\t};\n\t};\n\t0328F50910B065530074A5A1 /* SPCell.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 479}}\";\n\t\t\tsepNavSelRange = \"{144, 23}\";\n\t\t\tsepNavVisRange = \"{0, 173}\";\n\t\t};\n\t};\n\t0328F56810B071110074A5A1 /* SPSourceEmailTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 507}}\";\n\t\t\tsepNavSelRange = \"{285, 0}\";\n\t\t\tsepNavVisRange = \"{0, 389}\";\n\t\t};\n\t};\n\t0328F56910B071110074A5A1 /* SPSourceEmailTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 832}}\";\n\t\t\tsepNavSelRange = \"{671, 0}\";\n\t\t\tsepNavVisRange = \"{470, 1758}\";\n\t\t};\n\t};\n\t0328F58F10B072870074A5A1 /* objc_exception_throw */ = {\n\t\tisa = PBXSymbolicBreakpoint;\n\t\tactions = (\n\t\t);\n\t\tbreakpointStyle = 1;\n\t\tcontinueAfterActions = 0;\n\t\tcountType = 0;\n\t\tdelayBeforeContinue = 0;\n\t\thitCount = 0;\n\t\tignoreCount = 0;\n\t\tlocation = libobjc.A.dylib;\n\t\tmodificationTime = 322160371.991012;\n\t\toriginalNumberOfMultipleMatches = 1;\n\t\tstate = 1;\n\t\tsymbolName = objc_exception_throw;\n\t};\n\t0328F61710B07F360074A5A1 /* SPSourceWifiTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 411}}\";\n\t\t\tsepNavSelRange = \"{410, 11}\";\n\t\t\tsepNavVisRange = \"{0, 608}\";\n\t\t};\n\t};\n\t0328F61810B07F360074A5A1 /* SPSourceWifiTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1132, 1287}}\";\n\t\t\tsepNavSelRange = \"{1971, 0}\";\n\t\t\tsepNavVisRange = \"{1882, 855}\";\n\t\t};\n\t};\n\t0328F6BA10B088DD0074A5A1 /* SPSourcePhoneTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 520}}\";\n\t\t\tsepNavSelRange = \"{1048, 0}\";\n\t\t\tsepNavVisRange = \"{42, 1075}\";\n\t\t};\n\t};\n\t0328F6BB10B088DD0074A5A1 /* SPSourcePhoneTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 2821}}\";\n\t\t\tsepNavSelRange = \"{4446, 0}\";\n\t\t\tsepNavVisRange = \"{3845, 792}\";\n\t\t};\n\t};\n\t0328F75010B09AA60074A5A1 /* SPSourceLocationTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 494}}\";\n\t\t\tsepNavSelRange = \"{526, 22}\";\n\t\t\tsepNavVisRange = \"{0, 930}\";\n\t\t};\n\t};\n\t0328F75110B09AA60074A5A1 /* SPSourceLocationTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1097, 1326}}\";\n\t\t\tsepNavSelRange = \"{513, 524}\";\n\t\t\tsepNavVisRange = \"{305, 1346}\";\n\t\t};\n\t};\n\t0328F80D10B0A8B70074A5A1 /* SPSourcePhotosTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 435}}\";\n\t\t\tsepNavSelRange = \"{414, 218}\";\n\t\t\tsepNavVisRange = \"{0, 639}\";\n\t\t};\n\t};\n\t0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1132, 1937}}\";\n\t\t\tsepNavSelRange = \"{4871, 0}\";\n\t\t\tsepNavVisRange = \"{1618, 2267}\";\n\t\t\tsepNavWindowFrame = \"{{15, 4}, {994, 869}}\";\n\t\t};\n\t};\n\t0328F8BE10B0B1AE0074A5A1 /* SPWebViewVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 435}}\";\n\t\t\tsepNavSelRange = \"{364, 0}\";\n\t\t\tsepNavVisRange = \"{0, 408}\";\n\t\t};\n\t};\n\t0328F8BF10B0B1AE0074A5A1 /* SPWebViewVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 598}}\";\n\t\t\tsepNavSelRange = \"{269, 529}\";\n\t\t\tsepNavVisRange = \"{198, 607}\";\n\t\t};\n\t};\n\t0328F95F10B0CB140074A5A1 /* SPSourceAddressBookTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 483}}\";\n\t\t\tsepNavSelRange = \"{239, 0}\";\n\t\t\tsepNavVisRange = \"{0, 292}\";\n\t\t};\n\t};\n\t0328F96010B0CB140074A5A1 /* SPSourceAddressBookTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 910}}\";\n\t\t\tsepNavSelRange = \"{349, 0}\";\n\t\t\tsepNavVisRange = \"{0, 881}\";\n\t\t};\n\t};\n\t032A7E0410B84C1800E7FB65 /* UIImage+GPS.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 467}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 335}\";\n\t\t};\n\t};\n\t032A7E0510B84C1800E7FB65 /* UIImage+GPS.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1167, 546}}\";\n\t\t\tsepNavSelRange = \"{94, 4}\";\n\t\t\tsepNavVisRange = \"{0, 1457}\";\n\t\t};\n\t};\n\t032A7EAF10B85E9C00E7FB65 /* SPImageMapVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 435}}\";\n\t\t\tsepNavSelRange = \"{192, 26}\";\n\t\t\tsepNavVisRange = \"{0, 604}\";\n\t\t};\n\t};\n\t032A7EB010B85E9C00E7FB65 /* SPImageMapVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 1313}}\";\n\t\t\tsepNavSelRange = \"{2717, 0}\";\n\t\t\tsepNavVisRange = \"{17, 914}\";\n\t\t};\n\t};\n\t032A7EC910B8617C00E7FB65 /* SPImageAnnotation.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 412}}\";\n\t\t\tsepNavSelRange = \"{359, 0}\";\n\t\t\tsepNavVisRange = \"{0, 692}\";\n\t\t};\n\t};\n\t032A7ECA10B8617C00E7FB65 /* SPImageAnnotation.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 559}}\";\n\t\t\tsepNavSelRange = \"{330, 0}\";\n\t\t\tsepNavVisRange = \"{208, 681}\";\n\t\t};\n\t};\n\t032A819510B8E7C600E7FB65 /* SPEmailReportVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 325}}\";\n\t\t\tsepNavSelRange = \"{602, 0}\";\n\t\t\tsepNavVisRange = \"{105, 497}\";\n\t\t};\n\t};\n\t032A819610B8E7C600E7FB65 /* SPEmailReportVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {669, 1196}}\";\n\t\t\tsepNavSelRange = \"{805, 0}\";\n\t\t\tsepNavVisRange = \"{450, 537}\";\n\t\t};\n\t};\n\t033805B6127CEC4200EAFE64 /* OUILookupTool.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 452}}\";\n\t\t\tsepNavSelRange = \"{638, 0}\";\n\t\t\tsepNavVisRange = \"{0, 638}\";\n\t\t};\n\t};\n\t033805B7127CEC4200EAFE64 /* OUILookupTool.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 1339}}\";\n\t\t\tsepNavSelRange = \"{132, 0}\";\n\t\t\tsepNavVisRange = \"{0, 1042}\";\n\t\t};\n\t};\n\t033805CC127CECF900EAFE64 /* JSON.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 793}}\";\n\t\t\tsepNavSelRange = \"{18, 4}\";\n\t\t\tsepNavVisRange = \"{0, 1725}\";\n\t\t};\n\t};\n\t033805CE127CECF900EAFE64 /* NSObject+SBJSON.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 624}}\";\n\t\t\tsepNavSelRange = \"{18, 4}\";\n\t\t\tsepNavVisRange = \"{0, 1606}\";\n\t\t};\n\t};\n\t033805D0127CECF900EAFE64 /* NSString+SBJSON.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 598}}\";\n\t\t\tsepNavSelRange = \"{18, 4}\";\n\t\t\tsepNavVisRange = \"{0, 1602}\";\n\t\t};\n\t};\n\t033805D1127CECF900EAFE64 /* NSString+SBJSON.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 559}}\";\n\t\t\tsepNavSelRange = \"{23, 4}\";\n\t\t\tsepNavVisRange = \"{0, 1618}\";\n\t\t};\n\t};\n\t0364933F10B16DDD00C88803 /* SPSourceKeyboardTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 452}}\";\n\t\t\tsepNavSelRange = \"{241, 0}\";\n\t\t\tsepNavVisRange = \"{0, 241}\";\n\t\t};\n\t};\n\t0364934010B16DDD00C88803 /* SPSourceKeyboardTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 1664}}\";\n\t\t\tsepNavSelRange = \"{1701, 101}\";\n\t\t\tsepNavVisRange = \"{1297, 926}\";\n\t\t};\n\t};\n\t0364948A10B28BC800C88803 /* SPSourceTVC.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 412}}\";\n\t\t\tsepNavSelRange = \"{490, 0}\";\n\t\t\tsepNavVisRange = \"{0, 497}\";\n\t\t};\n\t};\n\t0364948B10B28BC800C88803 /* SPSourceTVC.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 1131}}\";\n\t\t\tsepNavSelRange = \"{1427, 0}\";\n\t\t\tsepNavVisRange = \"{1123, 521}\";\n\t\t};\n\t};\n\t037D3A7F10F3D57B003A85B0 /* SPEmailMobileMeAccount.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 540}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 274}\";\n\t\t};\n\t};\n\t037D3A8010F3D57B003A85B0 /* SPEmailMobileMeAccount.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 481}}\";\n\t\t\tsepNavSelRange = \"{856, 0}\";\n\t\t\tsepNavVisRange = \"{396, 640}\";\n\t\t};\n\t};\n\t037F2DF1128D2DCF00EE7E19 /* PBXBookmark */ = {\n\t\tisa = PBXBookmark;\n\t\tfRef = 032A811B10B883FB00E7FB65 /* Default.png */;\n\t};\n\t037F2DF2128D2DCF00EE7E19 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 03B6EFC910BB547600CF9139 /* gpl-2.0.txt */;\n\t\tname = \"gpl-2.0.txt: 15\";\n\t\trLen = 0;\n\t\trLoc = 653;\n\t\trType = 0;\n\t\tvrLen = 1773;\n\t\tvrLoc = 0;\n\t};\n\t037F2DF3128D2DCF00EE7E19 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 033805B6127CEC4200EAFE64 /* OUILookupTool.h */;\n\t\tname = \"OUILookupTool.h: 27\";\n\t\trLen = 0;\n\t\trLoc = 638;\n\t\trType = 0;\n\t\tvrLen = 638;\n\t\tvrLoc = 0;\n\t};\n\t037F2E13128D2E6500EE7E19 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 033805B7127CEC4200EAFE64 /* OUILookupTool.m */;\n\t\tname = \"OUILookupTool.m: 8\";\n\t\trLen = 0;\n\t\trLoc = 132;\n\t\trType = 0;\n\t\tvrLen = 1042;\n\t\tvrLoc = 0;\n\t};\n\t037F2E34128D3E6D00EE7E19 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = 5F0DA1BB12829A6E00CD3B56 /* TVOutManager.m */;\n\t\tname = \"TVOutManager.m: 20\";\n\t\trLen = 0;\n\t\trLoc = 418;\n\t\trType = 0;\n\t\tvrLen = 823;\n\t\tvrLoc = 0;\n\t};\n\t03B6EFC910BB547600CF9139 /* gpl-2.0.txt */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 4459}}\";\n\t\t\tsepNavSelRange = \"{653, 0}\";\n\t\t\tsepNavVisRange = \"{0, 1773}\";\n\t\t};\n\t};\n\t03F2481D1236EFAC0017F214 /* NSNumber+SP.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 460}}\";\n\t\t\tsepNavSelRange = \"{202, 0}\";\n\t\t\tsepNavVisRange = \"{0, 238}\";\n\t\t};\n\t};\n\t03F2481E1236EFAC0017F214 /* NSNumber+SP.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 481}}\";\n\t\t\tsepNavSelRange = \"{483, 0}\";\n\t\t\tsepNavVisRange = \"{261, 470}\";\n\t\t};\n\t};\n\t1D3623240D0F684500981E51 /* SpyPhoneAppDelegate.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1160, 446}}\";\n\t\t\tsepNavSelRange = \"{462, 0}\";\n\t\t\tsepNavVisRange = \"{0, 462}\";\n\t\t};\n\t};\n\t1D3623250D0F684500981E51 /* SpyPhoneAppDelegate.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 689}}\";\n\t\t\tsepNavSelRange = \"{748, 0}\";\n\t\t\tsepNavVisRange = \"{453, 683}\";\n\t\t};\n\t};\n\t1D6058900D05DD3D006BFB54 /* SpyPhone */ = {\n\t\tactiveExec = 0;\n\t\texecutables = (\n\t\t\t0328F4AB10B05E890074A5A1 /* SpyPhone */,\n\t\t);\n\t};\n\t28A0AB4B0D9B1048005BE974 /* SpyPhone_Prefix.pch */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 465}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 185}\";\n\t\t};\n\t};\n\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\tactiveBuildConfigurationName = Debug;\n\t\tactiveExecutable = 0328F4AB10B05E890074A5A1 /* SpyPhone */;\n\t\tactiveSDKPreference = iphoneos4.3;\n\t\tactiveTarget = 1D6058900D05DD3D006BFB54 /* SpyPhone */;\n\t\taddToTargets = (\n\t\t\t1D6058900D05DD3D006BFB54 /* SpyPhone */,\n\t\t);\n\t\tbreakpoints = (\n\t\t\t0328F58F10B072870074A5A1 /* objc_exception_throw */,\n\t\t);\n\t\tcodeSenseManager = 0328F4B910B05E8E0074A5A1 /* Code sense */;\n\t\texecutables = (\n\t\t\t0328F4AB10B05E890074A5A1 /* SpyPhone */,\n\t\t);\n\t\tperUserDictionary = {\n\t\t\t\"PBXConfiguration.PBXBreakpointsDataSource.v1:1CA23EDF0692099D00951B8B\" = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t20,\n\t\t\t\t\t250,\n\t\t\t\t\t20,\n\t\t\t\t\t250,\n\t\t\t\t\t250,\n\t\t\t\t\t248,\n\t\t\t\t\t20,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXBreakpointsDataSource_ActionID,\n\t\t\t\t\tPBXBreakpointsDataSource_TypeID,\n\t\t\t\t\tPBXBreakpointsDataSource_BreakpointID,\n\t\t\t\t\tPBXBreakpointsDataSource_UseID,\n\t\t\t\t\tPBXBreakpointsDataSource_LocationID,\n\t\t\t\t\tPBXBreakpointsDataSource_ConditionID,\n\t\t\t\t\tPBXBreakpointsDataSource_IgnoreCountID,\n\t\t\t\t\tPBXBreakpointsDataSource_ContinueID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t200,\n\t\t\t\t\t200,\n\t\t\t\t\t697.58349609375,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXBookmarksDataSource_LocationID,\n\t\t\t\t\tPBXBookmarksDataSource_NameID,\n\t\t\t\t\tPBXBookmarksDataSource_CommentsID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t22,\n\t\t\t\t\t300,\n\t\t\t\t\t776,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXExecutablesDataSource_ActiveFlagID,\n\t\t\t\t\tPBXExecutablesDataSource_NameID,\n\t\t\t\t\tPBXExecutablesDataSource_CommentsID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t888,\n\t\t\t\t\t20,\n\t\t\t\t\t48,\n\t\t\t\t\t43,\n\t\t\t\t\t43,\n\t\t\t\t\t20,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFileDataSource_FiletypeID,\n\t\t\t\t\tPBXFileDataSource_Filename_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Built_ColumnID,\n\t\t\t\t\tPBXFileDataSource_ObjectSize_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Errors_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Warnings_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Target_ColumnID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t200,\n\t\t\t\t\t902,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFindDataSource_MessageID,\n\t\t\t\t\tPBXFindDataSource_LocationID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t20,\n\t\t\t\t\t864,\n\t\t\t\t\t20,\n\t\t\t\t\t48,\n\t\t\t\t\t43,\n\t\t\t\t\t43,\n\t\t\t\t\t20,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFileDataSource_SCM_ColumnID,\n\t\t\t\t\tPBXFileDataSource_FiletypeID,\n\t\t\t\t\tPBXFileDataSource_Filename_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Built_ColumnID,\n\t\t\t\t\tPBXFileDataSource_ObjectSize_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Errors_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Warnings_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Target_ColumnID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t848,\n\t\t\t\t\t60,\n\t\t\t\t\t20,\n\t\t\t\t\t48,\n\t\t\t\t\t43,\n\t\t\t\t\t43,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFileDataSource_FiletypeID,\n\t\t\t\t\tPBXFileDataSource_Filename_ColumnID,\n\t\t\t\t\tPBXTargetDataSource_PrimaryAttribute,\n\t\t\t\t\tPBXFileDataSource_Built_ColumnID,\n\t\t\t\t\tPBXFileDataSource_ObjectSize_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Errors_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Warnings_ColumnID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXPerProjectTemplateStateSaveDate = 322265618;\n\t\t\tPBXWorkspaceStateSaveDate = 322265618;\n\t\t};\n\t\tperUserProjectItems = {\n\t\t\t030AFF8F127D3AED00C9E0C6 /* PBXTextBookmark */ = 030AFF8F127D3AED00C9E0C6 /* PBXTextBookmark */;\n\t\t\t030AFF90127D3AED00C9E0C6 /* PBXTextBookmark */ = 030AFF90127D3AED00C9E0C6 /* PBXTextBookmark */;\n\t\t\t030AFF9A127D3BF000C9E0C6 /* PBXTextBookmark */ = 030AFF9A127D3BF000C9E0C6 /* PBXTextBookmark */;\n\t\t\t0312C759133561EA00E99BA4 /* PBXTextBookmark */ = 0312C759133561EA00E99BA4 /* PBXTextBookmark */;\n\t\t\t0312C75B133561EA00E99BA4 /* PlistBookmark */ = 0312C75B133561EA00E99BA4 /* PlistBookmark */;\n\t\t\t0312C764133561EB00E99BA4 /* PBXTextBookmark */ = 0312C764133561EB00E99BA4 /* PBXTextBookmark */;\n\t\t\t0312C7731335623A00E99BA4 /* PlistBookmark */ = 0312C7731335623A00E99BA4 /* PlistBookmark */;\n\t\t\t0312C7741335623A00E99BA4 /* PBXTextBookmark */ = 0312C7741335623A00E99BA4 /* PBXTextBookmark */;\n\t\t\t037F2DF1128D2DCF00EE7E19 /* PBXBookmark */ = 037F2DF1128D2DCF00EE7E19 /* PBXBookmark */;\n\t\t\t037F2DF2128D2DCF00EE7E19 /* PBXTextBookmark */ = 037F2DF2128D2DCF00EE7E19 /* PBXTextBookmark */;\n\t\t\t037F2DF3128D2DCF00EE7E19 /* PBXTextBookmark */ = 037F2DF3128D2DCF00EE7E19 /* PBXTextBookmark */;\n\t\t\t037F2E13128D2E6500EE7E19 /* PBXTextBookmark */ = 037F2E13128D2E6500EE7E19 /* PBXTextBookmark */;\n\t\t\t037F2E34128D3E6D00EE7E19 /* PBXTextBookmark */ = 037F2E34128D3E6D00EE7E19 /* PBXTextBookmark */;\n\t\t};\n\t\tsourceControlManager = 0328F4B810B05E8E0074A5A1 /* Source Control */;\n\t\tuserBuildSettings = {\n\t\t};\n\t};\n\t29B97316FDCFA39411CA2CEA /* main.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 535}}\";\n\t\t\tsepNavSelRange = \"{390, 0}\";\n\t\t\tsepNavVisRange = \"{0, 390}\";\n\t\t};\n\t};\n\t5F0DA1BA12829A6E00CD3B56 /* TVOutManager.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1391, 520}}\";\n\t\t\tsepNavSelRange = \"{311, 0}\";\n\t\t\tsepNavVisRange = \"{0, 497}\";\n\t\t};\n\t};\n\t5F0DA1BB12829A6E00CD3B56 /* TVOutManager.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1078, 4264}}\";\n\t\t\tsepNavSelRange = \"{418, 0}\";\n\t\t\tsepNavVisRange = \"{0, 823}\";\n\t\t};\n\t};\n}\n"
  },
  {
    "path": "SpyPhone.xcodeproj/nst.perspectivev3",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ActivePerspectiveName</key>\n\t<string>Project</string>\n\t<key>AllowedModules</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Groups and Files Outline View</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Editor</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCTaskListModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Task List</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDetailModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>File and Smart Group Detail Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Detailed Build Results Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Batch Find Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCProjectFormatConflictsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Format Conflicts List</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXCVSModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Source Code Control Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugBreakpointsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Breakpoints Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDockableInspector</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Inspector</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXOpenQuicklyModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Open Quickly Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Console</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCSnapshotModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Snapshots Tool</string>\n\t\t</dict>\n\t</array>\n\t<key>BundlePath</key>\n\t<string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>\n\t<key>Description</key>\n\t<string>AIODescriptionKey</string>\n\t<key>DockingSystemVisible</key>\n\t<false/>\n\t<key>Extension</key>\n\t<string>perspectivev3</string>\n\t<key>FavBarConfig</key>\n\t<dict>\n\t\t<key>PBXProjectModuleGUID</key>\n\t\t<string>0328F4B710B05E8E0074A5A1</string>\n\t\t<key>XCBarModuleItemNames</key>\n\t\t<dict/>\n\t\t<key>XCBarModuleItems</key>\n\t\t<array/>\n\t</dict>\n\t<key>FirstTimeWindowDisplayed</key>\n\t<false/>\n\t<key>Identifier</key>\n\t<string>com.apple.perspectives.project.defaultV3</string>\n\t<key>MajorVersion</key>\n\t<integer>34</integer>\n\t<key>MinorVersion</key>\n\t<integer>0</integer>\n\t<key>Name</key>\n\t<string>All-In-One</string>\n\t<key>Notifications</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>XCObserverAutoDisconnectKey</key>\n\t\t\t<true/>\n\t\t\t<key>XCObserverDefintionKey</key>\n\t\t\t<dict/>\n\t\t\t<key>XCObserverFactoryKey</key>\n\t\t\t<string>XCPerspectivesSpecificationIdentifier</string>\n\t\t\t<key>XCObserverGUIDKey</key>\n\t\t\t<string>XCObserverProjectIdentifier</string>\n\t\t\t<key>XCObserverNotificationKey</key>\n\t\t\t<string>PBXStatusBuildStateMessageNotification</string>\n\t\t\t<key>XCObserverTargetKey</key>\n\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t<key>XCObserverTriggerKey</key>\n\t\t\t<string>awakenModuleWithObserver:</string>\n\t\t\t<key>XCObserverValidationKey</key>\n\t\t\t<dict/>\n\t\t</dict>\n\t</array>\n\t<key>OpenEditors</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>03F248D81237A3EE0017F214</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>SPSourcePhotosTVC.m</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>03F248D91237A3EE0017F214</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>SPSourcePhotosTVC.m</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>10</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>0312C7741335623A00E99BA4</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>0312C764133561EB00E99BA4</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {994, 772}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>15 60 994 813 0 0 1440 878 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n\t<key>PerspectiveWidths</key>\n\t<array>\n\t\t<integer>1440</integer>\n\t\t<integer>1440</integer>\n\t</array>\n\t<key>Perspectives</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ChosenToolbarItems</key>\n\t\t\t<array>\n\t\t\t\t<string>XCToolbarPerspectiveControl</string>\n\t\t\t\t<string>NSToolbarSeparatorItem</string>\n\t\t\t\t<string>active-combo-popup</string>\n\t\t\t\t<string>active-target-popup</string>\n\t\t\t\t<string>action</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>debugger-enable-breakpoints</string>\n\t\t\t\t<string>build-and-go</string>\n\t\t\t\t<string>com.apple.ide.PBXToolbarStopButton</string>\n\t\t\t\t<string>get-info</string>\n\t\t\t\t<string>toggle-editor</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>com.apple.pbx.toolbar.searchfield</string>\n\t\t\t</array>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string></string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>WindowOfProject</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.project</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<false/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FAAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05539CD112110102</string>\n\t\t\t\t\t\t\t<string>E2644B35053B69B200211256</string>\n\t\t\t\t\t\t\t<string>1C37FABC04509CD000100104</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90044410B</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90041110B</string>\n\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>1CA23ED40692098700951B8B</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t<real>269</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>TargetStatusColumn</string>\n\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>29B97314FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>080E96DDFE201D6D7F000001</string>\n\t\t\t\t\t\t\t\t<string>033805B5127CEC4200EAFE64</string>\n\t\t\t\t\t\t\t\t<string>031748C210B6E68E00B6116E</string>\n\t\t\t\t\t\t\t\t<string>29B97315FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>29B97317FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>0317DE7B10FF98E900C5C2D4</string>\n\t\t\t\t\t\t\t\t<string>29B97323FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>19C28FACFE9D520D11CA2CBB</string>\n\t\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<integer>66</integer>\n\t\t\t\t\t\t\t\t\t<integer>54</integer>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t<string>{{0, 826}, {291, 712}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t<false/>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {308, 730}}</string>\n\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>TargetStatusColumn</string>\n\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t<real>269</real>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t<string>0 107 1440 771 0 0 1440 878 </string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>308pt</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>0328F4B210B05E8E0074A5A1</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>SpyPhone-Info.plist</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>0328F4B310B05E8E0074A5A1</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>SpyPhone-Info.plist</string>\n\t\t\t\t\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t\t\t\t\t<integer>10</integer>\n\t\t\t\t\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t\t\t\t\t<string>0312C7731335623A00E99BA4</string>\n\t\t\t\t\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>030AFF8F127D3AED00C9E0C6</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>030AFF90127D3AED00C9E0C6</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>030AFF9A127D3BF000C9E0C6</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>037F2DF1128D2DCF00EE7E19</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>037F2DF2128D2DCF00EE7E19</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>037F2DF3128D2DCF00EE7E19</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>037F2E13128D2E6500EE7E19</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>037F2E34128D3E6D00EE7E19</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>0312C759133561EA00E99BA4</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>0312C75B133561EA00E99BA4</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t\t<key>XCSharingToken</key>\n\t\t\t\t\t\t\t\t<string>com.apple.Xcode.CommonNavigatorGroupSharingToken</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {1127, 463}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>0 107 1440 771 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>463pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>262pt</string>\n\t\t\t\t\t\t\t<key>Tabs</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CA23EDF0692099D00951B8B</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{10, 27}, {1127, 235}}</string>\n\t\t\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t\t\t<string>0 107 1440 771 0 0 1440 878 </string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CA23EE00692099D00951B8B</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>Project Find</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{10, 27}, {1127, 207}}</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXCVSModuleFilterTypeKey</key>\n\t\t\t\t\t\t\t\t\t\t<integer>1032</integer>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CA23EE10692099D00951B8B</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>SCM Results</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{10, 31}, {603, 297}}</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>Build Results</string>\n\t\t\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Collapse</key>\n\t\t\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Open</key>\n\t\t\t\t\t\t\t\t\t\t<integer>1010</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{10, 27}, {1127, 221}}</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>1127pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t<string>XCDockableTabModule</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>0312C76F1335621A00E99BA4</string>\n\t\t\t\t<string>1CA23ED40692098700951B8B</string>\n\t\t\t\t<string>0312C7701335621A00E99BA4</string>\n\t\t\t\t<string>0328F4B210B05E8E0074A5A1</string>\n\t\t\t\t<string>0312C7711335621A00E99BA4</string>\n\t\t\t\t<string>1CA23EDF0692099D00951B8B</string>\n\t\t\t\t<string>1CA23EE00692099D00951B8B</string>\n\t\t\t\t<string>1CA23EE10692099D00951B8B</string>\n\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfigUserDefaultsMinorVersion</key>\n\t\t\t<string>2</string>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.defaultV3</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ChosenToolbarItems</key>\n\t\t\t<array>\n\t\t\t\t<string>XCToolbarPerspectiveControl</string>\n\t\t\t\t<string>NSToolbarSeparatorItem</string>\n\t\t\t\t<string>active-combo-popup</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>debugger-enable-breakpoints</string>\n\t\t\t\t<string>build-and-go</string>\n\t\t\t\t<string>com.apple.ide.PBXToolbarStopButton</string>\n\t\t\t\t<string>debugger-restart-executable</string>\n\t\t\t\t<string>debugger-pause</string>\n\t\t\t\t<string>debugger-step-over</string>\n\t\t\t\t<string>debugger-step-into</string>\n\t\t\t\t<string>debugger-step-out</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>servicesModulebreakpoints</string>\n\t\t\t\t<string>debugger-show-console-window</string>\n\t\t\t</array>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>DebugTabIcon</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.debug</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>1CCC7628064C1048000F2A68</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Debugger Console</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {1440, 155}}</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>155pt</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Debugger</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {703, 190}}</string>\n\t\t\t\t\t\t\t\t\t<string>{{703, 0}, {737, 190}}</string>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {1440, 190}}</string>\n\t\t\t\t\t\t\t\t\t<string>{{0, 190}, {1440, 380}}</string>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t<string>8</string>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>1CCC7629064C1048000F2A68</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Debug</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>DebugConsoleVisible</key>\n\t\t\t\t\t\t<string>None</string>\n\t\t\t\t\t\t<key>DebugConsoleWindowFrame</key>\n\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t<key>DebugSTDIOWindowFrame</key>\n\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 160}, {1440, 570}}</string>\n\t\t\t\t\t\t<key>PBXDebugSessionStackFrameViewKey</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>DebugVariablesTableConfiguration</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>Name</string>\n\t\t\t\t\t\t\t\t<real>120</real>\n\t\t\t\t\t\t\t\t<string>Value</string>\n\t\t\t\t\t\t\t\t<real>85</real>\n\t\t\t\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t\t\t\t<real>507</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t<string>{{703, 0}, {737, 190}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>570pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t\t<string>PBXDebugProcessAndThreadModule</string>\n\t\t\t\t<string>PBXDebugProcessViewModule</string>\n\t\t\t\t<string>PBXDebugThreadViewModule</string>\n\t\t\t\t<string>PBXDebugStackFrameViewModule</string>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>0312C75F133561EB00E99BA4</string>\n\t\t\t\t<string>1CCC7628064C1048000F2A68</string>\n\t\t\t\t<string>1CCC7629064C1048000F2A68</string>\n\t\t\t\t<string>0312C760133561EB00E99BA4</string>\n\t\t\t\t<string>0312C761133561EB00E99BA4</string>\n\t\t\t\t<string>0312C762133561EB00E99BA4</string>\n\t\t\t\t<string>0312C763133561EB00E99BA4</string>\n\t\t\t\t<string>0328F4B210B05E8E0074A5A1</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfigUserDefaultsMinorVersion</key>\n\t\t\t<string>2</string>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debugV3</string>\n\t\t</dict>\n\t</array>\n\t<key>PerspectivesBarVisible</key>\n\t<true/>\n\t<key>ShelfIsVisible</key>\n\t<false/>\n\t<key>SourceDescription</key>\n\t<string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecification.xcperspec'</string>\n\t<key>StatusbarIsVisible</key>\n\t<true/>\n\t<key>TimeStamp</key>\n\t<real>322265658.83325499</real>\n\t<key>ToolbarConfigUserDefaultsMinorVersion</key>\n\t<string>2</string>\n\t<key>ToolbarDisplayMode</key>\n\t<integer>1</integer>\n\t<key>ToolbarIsVisible</key>\n\t<true/>\n\t<key>ToolbarSizeMode</key>\n\t<integer>1</integer>\n\t<key>Type</key>\n\t<string>Perspectives</string>\n\t<key>UpdateMessage</key>\n\t<string></string>\n\t<key>WindowJustification</key>\n\t<integer>5</integer>\n\t<key>WindowOrderList</key>\n\t<array>\n\t\t<string>03F248D81237A3EE0017F214</string>\n\t\t<string>/Users/nst/Projects/SpyPhone/SpyPhone.xcodeproj</string>\n\t</array>\n\t<key>WindowString</key>\n\t<string>0 107 1440 771 0 0 1440 878 </string>\n\t<key>WindowToolsV3</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugger</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Debugger</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {317, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{317, 0}, {377, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 164}, {694, 216}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t\t\t<string>8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debug - GLUTExamples (Underwater)</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>DebugConsoleDrawerSize</key>\n\t\t\t\t\t\t\t\t<string>{100, 120}</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleVisible</key>\n\t\t\t\t\t\t\t\t<string>None</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>DebugSTDIOWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 380}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t\t<string>1C0AD2AB069F1E9B00FABCE6</string>\n\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t<string>1C0AD2AC069F1E9B00FABCE6</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debugV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.build</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>&lt;No Editor&gt;</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CD052900623707200166675</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {500, 215}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>192 257 500 500 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>218pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Build Results</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 222}, {500, 236}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>192 257 500 500 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>236pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>458pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Build Results</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAA5065D492600B07095</string>\n\t\t\t\t<string>1C78EAA6065D492600B07095</string>\n\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.buildV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>192 257 500 500 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.find</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>&lt;No Editor&gt;</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t<string>1CD0528D0623707200166675</string>\n\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {781, 167}}</string>\n\t\t\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t\t\t<string>62 385 781 470 0 0 1440 878 </string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t\t\t<string>781pt</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>50%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Project Find</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{8, 0}, {773, 254}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>62 385 781 470 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>50%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>428pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Find</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t\t<string>1C530D58069F1CE1000CFCEE</string>\n\t\t\t\t<string>1C530D59069F1CE1000CFCEE</string>\n\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t<string>1C530D5A069F1CE1000CFCEE</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>62 385 781 470 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.snapshots</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCSnapshotModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Snapshots</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCSnapshotModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<string>Yes</string>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.snapshots</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>315 824 300 550 0 0 1440 878 </string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<string>Yes</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debuggerConsole</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debugger Console</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {440, 359}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>21 455 440 400 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>359pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>359pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger Console</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C530D5B069F1CE1000CFCEE</string>\n\t\t\t\t<string>032E9C6E1236DB7000B08386</string>\n\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.consoleV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>21 455 440 400 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C530D5B069F1CE1000CFCEE</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.scm</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>&lt;No Editor&gt;</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1C78EAB3065D492600B07095</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>0pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>SCM</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ConsoleFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 259}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 7}, {452, 259}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t\t<key>TableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>Status</string>\n\t\t\t\t\t\t\t\t\t<real>30</real>\n\t\t\t\t\t\t\t\t\t<string>FileName</string>\n\t\t\t\t\t\t\t\t\t<real>199</real>\n\t\t\t\t\t\t\t\t\t<string>Path</string>\n\t\t\t\t\t\t\t\t\t<real>197.09500122070312</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>TableFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 250}}</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>262pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>266pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>SCM</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAB4065D492600B07095</string>\n\t\t\t\t<string>1C78EAB5065D492600B07095</string>\n\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.scmV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.breakpoints</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t\t\t<string>no</string>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {168, 350}}</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {185, 368}}</string>\n\t\t\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>185pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{190, 0}, {554, 368}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>554pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>368pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>MajorVersion</key>\n\t\t\t<integer>3</integer>\n\t\t\t<key>MinorVersion</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Name</key>\n\t\t\t<string>Breakpoints</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t\t<string>1CDDB66907F98D9800BB5817</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.breakpointsV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugAnimator</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Visualizer</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debugAnimatorV3</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>100 100 700 500 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.bookmarks</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>166pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>166pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>538 42 401 187 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.projectFormatConflicts</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>03E9845810DAB6EA00F8E5F6</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {472, 302}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>21 533 472 322 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCProjectFormatConflictsModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>302pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>302pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Format Conflicts</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCProjectFormatConflictsModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<false/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>03E9845910DAB6EA00F8E5F6</string>\n\t\t\t\t<string>038823F410E622DD00CEA830</string>\n\t\t\t\t<string>03E9845810DAB6EA00F8E5F6</string>\n\t\t\t</array>\n\t\t\t<key>WindowContentMinSize</key>\n\t\t\t<string>450 300</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>21 533 472 322 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>03E9845910DAB6EA00F8E5F6</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.classBrowser</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>OptionsSetName</key>\n\t\t\t\t\t\t\t\t<string>Hierarchy, all classes</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Class Browser - NSObject</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ClassesFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {369, 96}}</string>\n\t\t\t\t\t\t\t\t<key>ClassesTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXClassNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>208</real>\n\t\t\t\t\t\t\t\t\t<string>PBXClassBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {616, 353}}</string>\n\t\t\t\t\t\t\t\t<key>MembersFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 105}, {369, 395}}</string>\n\t\t\t\t\t\t\t\t<key>MembersTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeIconColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>216</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>94</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>597 125 616 374 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>354pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>354pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EABA065D492600B07095</string>\n\t\t\t\t<string>1C78EABB065D492600B07095</string>\n\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.classbrowser</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>597 125 616 374 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.refactoring</string>\n\t\t\t<key>IncludeInToolsMenu</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>0364952110B2E3D100C88803</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {500, 315}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>21 499 500 356 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCRefactoringModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>315pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>315pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Refactoring</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCRefactoringModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>0364952210B2E3D100C88803</string>\n\t\t\t\t<string>030AFB45127D090100C9E0C6</string>\n\t\t\t\t<string>0364952110B2E3D100C88803</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>21 499 500 356 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>0364952210B2E3D100C88803</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "SpyPhone.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t030AFB2E127D08BF00C9E0C6 /* SPWifiMapVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 030AFB2C127D08BF00C9E0C6 /* SPWifiMapVC.m */; };\n\t\t030AFB2F127D08BF00C9E0C6 /* SPWifiMapVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 030AFB2D127D08BF00C9E0C6 /* SPWifiMapVC.xib */; };\n\t\t030AFBA4127D0D6F00C9E0C6 /* SPWifiAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 030AFBA3127D0D6F00C9E0C6 /* SPWifiAnnotation.m */; };\n\t\t0310C65510C4BE0800E7ACD2 /* SPImageVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0310C65410C4BE0800E7ACD2 /* SPImageVC.m */; };\n\t\t031748B910B6E35C00B6116E /* SPEmailASAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 031748B810B6E35C00B6116E /* SPEmailASAccount.m */; };\n\t\t031748C010B6E63E00B6116E /* SPEmailAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 031748BF10B6E63E00B6116E /* SPEmailAccount.m */; };\n\t\t031748C710B6E98800B6116E /* SPEmailPOPAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 031748C610B6E98800B6116E /* SPEmailPOPAccount.m */; };\n\t\t031748CA10B6E9A000B6116E /* SPEmailIToolsAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 031748C910B6E9A000B6116E /* SPEmailIToolsAccount.m */; };\n\t\t0317498610B6F3A300B6116E /* SPEmailGmailAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 0317498510B6F3A300B6116E /* SPEmailGmailAccount.m */; };\n\t\t0317498910B6F49300B6116E /* SPEmailIMAPAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 0317498810B6F49300B6116E /* SPEmailIMAPAccount.m */; };\n\t\t031749AF10B6FB9C00B6116E /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 031749AE10B6FB9C00B6116E /* AddressBook.framework */; };\n\t\t0317DE6910FF95CC00C5C2D4 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0317DE6810FF95CC00C5C2D4 /* MediaPlayer.framework */; };\n\t\t0317DE7C10FF98E900C5C2D4 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0317DE7B10FF98E900C5C2D4 /* Settings.bundle */; };\n\t\t031CD55010BB4A29007C133E /* Email.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD54810BB4A29007C133E /* Email.png */; };\n\t\t031CD55110BB4A29007C133E /* Location.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD54910BB4A29007C133E /* Location.png */; };\n\t\t031CD55310BB4A29007C133E /* Phone.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD54B10BB4A29007C133E /* Phone.png */; };\n\t\t031CD55410BB4A29007C133E /* Photos.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD54C10BB4A29007C133E /* Photos.png */; };\n\t\t031CD5BC10BB4F7B007C133E /* AddressBook.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD5BB10BB4F7B007C133E /* AddressBook.png */; };\n\t\t031CD5BE10BB5004007C133E /* YouTube.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD5BD10BB5004007C133E /* YouTube.png */; };\n\t\t031CD5C210BB502A007C133E /* Wifi.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD5C110BB502A007C133E /* Wifi.png */; };\n\t\t031CD5EB10BB5152007C133E /* Safari.png in Resources */ = {isa = PBXBuildFile; fileRef = 031CD5EA10BB5152007C133E /* Safari.png */; };\n\t\t0328F4CF10B0614A0074A5A1 /* SPAllSourcesTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F4CE10B0614A0074A5A1 /* SPAllSourcesTVC.m */; };\n\t\t0328F50A10B065530074A5A1 /* SPCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F50910B065530074A5A1 /* SPCell.m */; };\n\t\t0328F51410B065B80074A5A1 /* SPCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0328F51310B065B80074A5A1 /* SPCell.xib */; };\n\t\t0328F56310B070AE0074A5A1 /* SPSourceTVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0328F56210B070AE0074A5A1 /* SPSourceTVC.xib */; };\n\t\t0328F56A10B071110074A5A1 /* SPSourceEmailTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F56910B071110074A5A1 /* SPSourceEmailTVC.m */; };\n\t\t0328F61910B07F360074A5A1 /* SPSourceWifiTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F61810B07F360074A5A1 /* SPSourceWifiTVC.m */; };\n\t\t0328F6BC10B088DD0074A5A1 /* SPSourcePhoneTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F6BB10B088DD0074A5A1 /* SPSourcePhoneTVC.m */; };\n\t\t0328F74310B095BA0074A5A1 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0328F74210B095BA0074A5A1 /* MapKit.framework */; };\n\t\t0328F75210B09AA60074A5A1 /* SPSourceLocationTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F75110B09AA60074A5A1 /* SPSourceLocationTVC.m */; };\n\t\t0328F80F10B0A8B70074A5A1 /* SPSourcePhotosTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */; };\n\t\t0328F8BC10B0B1780074A5A1 /* SPWebViewVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0328F8BB10B0B1780074A5A1 /* SPWebViewVC.xib */; };\n\t\t0328F8C010B0B1AE0074A5A1 /* SPWebViewVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F8BF10B0B1AE0074A5A1 /* SPWebViewVC.m */; };\n\t\t0328F96110B0CB140074A5A1 /* SPSourceAddressBookTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0328F96010B0CB140074A5A1 /* SPSourceAddressBookTVC.m */; };\n\t\t032A7D9010B844EF00E7FB65 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 032A7D8F10B844EF00E7FB65 /* CoreLocation.framework */; };\n\t\t032A7E0610B84C1800E7FB65 /* UIImage+GPS.m in Sources */ = {isa = PBXBuildFile; fileRef = 032A7E0510B84C1800E7FB65 /* UIImage+GPS.m */; };\n\t\t032A7EAD10B85E7F00E7FB65 /* SPImageMapVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 032A7EAC10B85E7F00E7FB65 /* SPImageMapVC.xib */; };\n\t\t032A7EB110B85E9C00E7FB65 /* SPImageMapVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 032A7EB010B85E9C00E7FB65 /* SPImageMapVC.m */; };\n\t\t032A7ECB10B8617C00E7FB65 /* SPImageAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 032A7ECA10B8617C00E7FB65 /* SPImageAnnotation.m */; };\n\t\t032A809A10B8799300E7FB65 /* SPImageVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 032A809910B8799300E7FB65 /* SPImageVC.xib */; };\n\t\t032A80F410B8816300E7FB65 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 032A80F210B8816300E7FB65 /* Icon.png */; };\n\t\t032A810110B8821D00E7FB65 /* white_hat.png in Resources */ = {isa = PBXBuildFile; fileRef = 032A80F110B8816300E7FB65 /* white_hat.png */; };\n\t\t032A811C10B883FB00E7FB65 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 032A811B10B883FB00E7FB65 /* Default.png */; };\n\t\t032A819310B8E7BA00E7FB65 /* SPEmailReportVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 032A819210B8E7BA00E7FB65 /* SPEmailReportVC.xib */; };\n\t\t032A819710B8E7C600E7FB65 /* SPEmailReportVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 032A819610B8E7C600E7FB65 /* SPEmailReportVC.m */; };\n\t\t032A81CA10B8EB6100E7FB65 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 032A81C910B8EB6100E7FB65 /* MessageUI.framework */; };\n\t\t03380599127CEC2500EAFE64 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 03380594127CEC2500EAFE64 /* FMDatabase.m */; };\n\t\t0338059A127CEC2500EAFE64 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 03380596127CEC2500EAFE64 /* FMDatabaseAdditions.m */; };\n\t\t0338059B127CEC2500EAFE64 /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 03380598127CEC2500EAFE64 /* FMResultSet.m */; };\n\t\t033805AE127CEC3100EAFE64 /* EXFGPS.m in Sources */ = {isa = PBXBuildFile; fileRef = 0338059F127CEC3100EAFE64 /* EXFGPS.m */; };\n\t\t033805AF127CEC3100EAFE64 /* EXFHandlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805A1127CEC3100EAFE64 /* EXFHandlers.m */; };\n\t\t033805B0127CEC3100EAFE64 /* EXFJFIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805A3127CEC3100EAFE64 /* EXFJFIF.m */; };\n\t\t033805B1127CEC3100EAFE64 /* EXFJpeg.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805A5127CEC3100EAFE64 /* EXFJpeg.m */; };\n\t\t033805B2127CEC3100EAFE64 /* EXFMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805A8127CEC3100EAFE64 /* EXFMetaData.m */; };\n\t\t033805B3127CEC3100EAFE64 /* EXFTagDefinitionHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805AB127CEC3100EAFE64 /* EXFTagDefinitionHolder.m */; };\n\t\t033805B4127CEC3100EAFE64 /* EXFUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805AD127CEC3100EAFE64 /* EXFUtils.m */; };\n\t\t033805B8127CEC4200EAFE64 /* OUILookupTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805B7127CEC4200EAFE64 /* OUILookupTool.m */; };\n\t\t033805DC127CECF900EAFE64 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 033805CD127CECF900EAFE64 /* LICENSE */; };\n\t\t033805DD127CECF900EAFE64 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805CF127CECF900EAFE64 /* NSObject+SBJSON.m */; };\n\t\t033805DE127CECF900EAFE64 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805D1127CECF900EAFE64 /* NSString+SBJSON.m */; };\n\t\t033805DF127CECF900EAFE64 /* Readme.markdown in Resources */ = {isa = PBXBuildFile; fileRef = 033805D2127CECF900EAFE64 /* Readme.markdown */; };\n\t\t033805E0127CECF900EAFE64 /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805D4127CECF900EAFE64 /* SBJsonBase.m */; };\n\t\t033805E1127CECF900EAFE64 /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805D6127CECF900EAFE64 /* SBJsonParser.m */; };\n\t\t033805E2127CECF900EAFE64 /* SBJsonStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805D8127CECF900EAFE64 /* SBJsonStreamWriter.m */; };\n\t\t033805E3127CECF900EAFE64 /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 033805DA127CECF900EAFE64 /* SBJsonWriter.m */; };\n\t\t0364934110B16DDD00C88803 /* SPSourceKeyboardTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0364934010B16DDD00C88803 /* SPSourceKeyboardTVC.m */; };\n\t\t0364948C10B28BC800C88803 /* SPSourceTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0364948B10B28BC800C88803 /* SPSourceTVC.m */; };\n\t\t037D3A8110F3D57B003A85B0 /* SPEmailMobileMeAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 037D3A8010F3D57B003A85B0 /* SPEmailMobileMeAccount.m */; };\n\t\t037F2E0E128D2E6300EE7E19 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 037F2E0D128D2E6300EE7E19 /* QuartzCore.framework */; };\n\t\t03B2C04E10BB624F00E05ECB /* Keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = 03B2C04D10BB624F00E05ECB /* Keyboard.png */; };\n\t\t03B2C06110BB62A300E05ECB /* data.png in Resources */ = {isa = PBXBuildFile; fileRef = 03B2C06010BB62A300E05ECB /* data.png */; };\n\t\t03B2C09410BB66DB00E05ECB /* report.png in Resources */ = {isa = PBXBuildFile; fileRef = 03B2C09310BB66DB00E05ECB /* report.png */; };\n\t\t03B6EFCA10BB547600CF9139 /* gpl-2.0.txt in Resources */ = {isa = PBXBuildFile; fileRef = 03B6EFC910BB547600CF9139 /* gpl-2.0.txt */; };\n\t\t03B6F00410BB588A00CF9139 /* white_hat_mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 03B6F00310BB588A00CF9139 /* white_hat_mask.png */; };\n\t\t03B6F03510BB5F4800CF9139 /* email_mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 03B6F03410BB5F4800CF9139 /* email_mask.png */; };\n\t\t03F2472F1236E25E0017F214 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 03F2472E1236E25E0017F214 /* libsqlite3.dylib */; };\n\t\t03F2481F1236EFAC0017F214 /* NSNumber+SP.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F2481E1236EFAC0017F214 /* NSNumber+SP.m */; };\n\t\t1D3623260D0F684500981E51 /* SpyPhoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* SpyPhoneAppDelegate.m */; };\n\t\t1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };\n\t\t1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };\n\t\t1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };\n\t\t282CCBFE0DB6C98000C4EA27 /* Sources.xib in Resources */ = {isa = PBXBuildFile; fileRef = 282CCBFD0DB6C98000C4EA27 /* Sources.xib */; };\n\t\t288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; };\n\t\t28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD73870D9D96C1002E5188 /* MainWindow.xib */; };\n\t\t5F0DA1BC12829A6E00CD3B56 /* TVOutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F0DA1BB12829A6E00CD3B56 /* TVOutManager.m */; };\n\t\t5F38C609127EBB37003CA424 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F38C608127EBB37003CA424 /* CoreTelephony.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t030AFB2B127D08BF00C9E0C6 /* SPWifiMapVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWifiMapVC.h; sourceTree = \"<group>\"; };\n\t\t030AFB2C127D08BF00C9E0C6 /* SPWifiMapVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWifiMapVC.m; sourceTree = \"<group>\"; };\n\t\t030AFB2D127D08BF00C9E0C6 /* SPWifiMapVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SPWifiMapVC.xib; path = Classes/SPWifiMapVC.xib; sourceTree = \"<group>\"; };\n\t\t030AFBA2127D0D6F00C9E0C6 /* SPWifiAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWifiAnnotation.h; sourceTree = \"<group>\"; };\n\t\t030AFBA3127D0D6F00C9E0C6 /* SPWifiAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWifiAnnotation.m; sourceTree = \"<group>\"; };\n\t\t0310C65310C4BE0800E7ACD2 /* SPImageVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPImageVC.h; sourceTree = \"<group>\"; };\n\t\t0310C65410C4BE0800E7ACD2 /* SPImageVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPImageVC.m; sourceTree = \"<group>\"; };\n\t\t031748B710B6E35C00B6116E /* SPEmailASAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailASAccount.h; sourceTree = \"<group>\"; };\n\t\t031748B810B6E35C00B6116E /* SPEmailASAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailASAccount.m; sourceTree = \"<group>\"; };\n\t\t031748BE10B6E63E00B6116E /* SPEmailAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailAccount.h; sourceTree = \"<group>\"; };\n\t\t031748BF10B6E63E00B6116E /* SPEmailAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailAccount.m; sourceTree = \"<group>\"; };\n\t\t031748C510B6E98800B6116E /* SPEmailPOPAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailPOPAccount.h; sourceTree = \"<group>\"; };\n\t\t031748C610B6E98800B6116E /* SPEmailPOPAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailPOPAccount.m; sourceTree = \"<group>\"; };\n\t\t031748C810B6E9A000B6116E /* SPEmailIToolsAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailIToolsAccount.h; sourceTree = \"<group>\"; };\n\t\t031748C910B6E9A000B6116E /* SPEmailIToolsAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailIToolsAccount.m; sourceTree = \"<group>\"; };\n\t\t0317498410B6F3A300B6116E /* SPEmailGmailAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailGmailAccount.h; sourceTree = \"<group>\"; };\n\t\t0317498510B6F3A300B6116E /* SPEmailGmailAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailGmailAccount.m; sourceTree = \"<group>\"; };\n\t\t0317498710B6F49300B6116E /* SPEmailIMAPAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailIMAPAccount.h; sourceTree = \"<group>\"; };\n\t\t0317498810B6F49300B6116E /* SPEmailIMAPAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailIMAPAccount.m; sourceTree = \"<group>\"; };\n\t\t031749AE10B6FB9C00B6116E /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; };\n\t\t0317DE6810FF95CC00C5C2D4 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };\n\t\t0317DE7B10FF98E900C5C2D4 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.plug-in\"; path = Settings.bundle; sourceTree = \"<group>\"; };\n\t\t031CD54810BB4A29007C133E /* Email.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Email.png; sourceTree = \"<group>\"; };\n\t\t031CD54910BB4A29007C133E /* Location.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Location.png; sourceTree = \"<group>\"; };\n\t\t031CD54B10BB4A29007C133E /* Phone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Phone.png; sourceTree = \"<group>\"; };\n\t\t031CD54C10BB4A29007C133E /* Photos.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Photos.png; sourceTree = \"<group>\"; };\n\t\t031CD5BB10BB4F7B007C133E /* AddressBook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AddressBook.png; sourceTree = \"<group>\"; };\n\t\t031CD5BD10BB5004007C133E /* YouTube.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = YouTube.png; sourceTree = \"<group>\"; };\n\t\t031CD5C110BB502A007C133E /* Wifi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Wifi.png; sourceTree = \"<group>\"; };\n\t\t031CD5EA10BB5152007C133E /* Safari.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Safari.png; sourceTree = \"<group>\"; };\n\t\t0328F4CD10B0614A0074A5A1 /* SPAllSourcesTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAllSourcesTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F4CE10B0614A0074A5A1 /* SPAllSourcesTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPAllSourcesTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F50810B065530074A5A1 /* SPCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPCell.h; sourceTree = \"<group>\"; };\n\t\t0328F50910B065530074A5A1 /* SPCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPCell.m; sourceTree = \"<group>\"; };\n\t\t0328F51310B065B80074A5A1 /* SPCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPCell.xib; sourceTree = \"<group>\"; };\n\t\t0328F56210B070AE0074A5A1 /* SPSourceTVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPSourceTVC.xib; sourceTree = \"<group>\"; };\n\t\t0328F56810B071110074A5A1 /* SPSourceEmailTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceEmailTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F56910B071110074A5A1 /* SPSourceEmailTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceEmailTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F61710B07F360074A5A1 /* SPSourceWifiTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceWifiTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F61810B07F360074A5A1 /* SPSourceWifiTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceWifiTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F6BA10B088DD0074A5A1 /* SPSourcePhoneTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourcePhoneTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F6BB10B088DD0074A5A1 /* SPSourcePhoneTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourcePhoneTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F74210B095BA0074A5A1 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };\n\t\t0328F75010B09AA60074A5A1 /* SPSourceLocationTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceLocationTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F75110B09AA60074A5A1 /* SPSourceLocationTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceLocationTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F80D10B0A8B70074A5A1 /* SPSourcePhotosTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourcePhotosTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourcePhotosTVC.m; sourceTree = \"<group>\"; };\n\t\t0328F8BB10B0B1780074A5A1 /* SPWebViewVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPWebViewVC.xib; sourceTree = \"<group>\"; };\n\t\t0328F8BE10B0B1AE0074A5A1 /* SPWebViewVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWebViewVC.h; sourceTree = \"<group>\"; };\n\t\t0328F8BF10B0B1AE0074A5A1 /* SPWebViewVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWebViewVC.m; sourceTree = \"<group>\"; };\n\t\t0328F95F10B0CB140074A5A1 /* SPSourceAddressBookTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceAddressBookTVC.h; sourceTree = \"<group>\"; };\n\t\t0328F96010B0CB140074A5A1 /* SPSourceAddressBookTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceAddressBookTVC.m; sourceTree = \"<group>\"; };\n\t\t032A7D8F10B844EF00E7FB65 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };\n\t\t032A7E0410B84C1800E7FB65 /* UIImage+GPS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIImage+GPS.h\"; sourceTree = \"<group>\"; };\n\t\t032A7E0510B84C1800E7FB65 /* UIImage+GPS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIImage+GPS.m\"; sourceTree = \"<group>\"; };\n\t\t032A7EAC10B85E7F00E7FB65 /* SPImageMapVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPImageMapVC.xib; sourceTree = \"<group>\"; };\n\t\t032A7EAF10B85E9C00E7FB65 /* SPImageMapVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPImageMapVC.h; sourceTree = \"<group>\"; };\n\t\t032A7EB010B85E9C00E7FB65 /* SPImageMapVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPImageMapVC.m; sourceTree = \"<group>\"; };\n\t\t032A7EC910B8617C00E7FB65 /* SPImageAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPImageAnnotation.h; sourceTree = \"<group>\"; };\n\t\t032A7ECA10B8617C00E7FB65 /* SPImageAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPImageAnnotation.m; sourceTree = \"<group>\"; };\n\t\t032A809910B8799300E7FB65 /* SPImageVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPImageVC.xib; sourceTree = \"<group>\"; };\n\t\t032A80F110B8816300E7FB65 /* white_hat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = white_hat.png; sourceTree = \"<group>\"; };\n\t\t032A80F210B8816300E7FB65 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = \"<group>\"; };\n\t\t032A811B10B883FB00E7FB65 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = \"<group>\"; };\n\t\t032A819210B8E7BA00E7FB65 /* SPEmailReportVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SPEmailReportVC.xib; sourceTree = \"<group>\"; };\n\t\t032A819510B8E7C600E7FB65 /* SPEmailReportVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailReportVC.h; sourceTree = \"<group>\"; };\n\t\t032A819610B8E7C600E7FB65 /* SPEmailReportVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailReportVC.m; sourceTree = \"<group>\"; };\n\t\t032A81C910B8EB6100E7FB65 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };\n\t\t03380593127CEC2500EAFE64 /* FMDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FMDatabase.h; path = FMDB/FMDatabase.h; sourceTree = SOURCE_ROOT; };\n\t\t03380594127CEC2500EAFE64 /* FMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FMDatabase.m; path = FMDB/FMDatabase.m; sourceTree = SOURCE_ROOT; };\n\t\t03380595127CEC2500EAFE64 /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FMDatabaseAdditions.h; path = FMDB/FMDatabaseAdditions.h; sourceTree = SOURCE_ROOT; };\n\t\t03380596127CEC2500EAFE64 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseAdditions.m; path = FMDB/FMDatabaseAdditions.m; sourceTree = SOURCE_ROOT; };\n\t\t03380597127CEC2500EAFE64 /* FMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FMResultSet.h; path = FMDB/FMResultSet.h; sourceTree = SOURCE_ROOT; };\n\t\t03380598127CEC2500EAFE64 /* FMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FMResultSet.m; path = FMDB/FMResultSet.m; sourceTree = SOURCE_ROOT; };\n\t\t0338059C127CEC3100EAFE64 /* EXF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXF.h; path = EXIF/EXF.h; sourceTree = SOURCE_ROOT; };\n\t\t0338059D127CEC3100EAFE64 /* EXFConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFConstants.h; path = EXIF/EXFConstants.h; sourceTree = SOURCE_ROOT; };\n\t\t0338059E127CEC3100EAFE64 /* EXFGPS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFGPS.h; path = EXIF/EXFGPS.h; sourceTree = SOURCE_ROOT; };\n\t\t0338059F127CEC3100EAFE64 /* EXFGPS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFGPS.m; path = EXIF/EXFGPS.m; sourceTree = SOURCE_ROOT; };\n\t\t033805A0127CEC3100EAFE64 /* EXFHandlers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFHandlers.h; path = EXIF/EXFHandlers.h; sourceTree = SOURCE_ROOT; };\n\t\t033805A1127CEC3100EAFE64 /* EXFHandlers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFHandlers.m; path = EXIF/EXFHandlers.m; sourceTree = SOURCE_ROOT; };\n\t\t033805A2127CEC3100EAFE64 /* EXFJFIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFJFIF.h; path = EXIF/EXFJFIF.h; sourceTree = SOURCE_ROOT; };\n\t\t033805A3127CEC3100EAFE64 /* EXFJFIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFJFIF.m; path = EXIF/EXFJFIF.m; sourceTree = SOURCE_ROOT; };\n\t\t033805A4127CEC3100EAFE64 /* EXFJpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFJpeg.h; path = EXIF/EXFJpeg.h; sourceTree = SOURCE_ROOT; };\n\t\t033805A5127CEC3100EAFE64 /* EXFJpeg.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFJpeg.m; path = EXIF/EXFJpeg.m; sourceTree = SOURCE_ROOT; };\n\t\t033805A6127CEC3100EAFE64 /* EXFLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFLogging.h; path = EXIF/EXFLogging.h; sourceTree = SOURCE_ROOT; };\n\t\t033805A7127CEC3100EAFE64 /* EXFMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFMetaData.h; path = EXIF/EXFMetaData.h; sourceTree = SOURCE_ROOT; };\n\t\t033805A8127CEC3100EAFE64 /* EXFMetaData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFMetaData.m; path = EXIF/EXFMetaData.m; sourceTree = SOURCE_ROOT; };\n\t\t033805A9127CEC3100EAFE64 /* EXFMutableMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFMutableMetaData.h; path = EXIF/EXFMutableMetaData.h; sourceTree = SOURCE_ROOT; };\n\t\t033805AA127CEC3100EAFE64 /* EXFTagDefinitionHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFTagDefinitionHolder.h; path = EXIF/EXFTagDefinitionHolder.h; sourceTree = SOURCE_ROOT; };\n\t\t033805AB127CEC3100EAFE64 /* EXFTagDefinitionHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFTagDefinitionHolder.m; path = EXIF/EXFTagDefinitionHolder.m; sourceTree = SOURCE_ROOT; };\n\t\t033805AC127CEC3100EAFE64 /* EXFUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EXFUtils.h; path = EXIF/EXFUtils.h; sourceTree = SOURCE_ROOT; };\n\t\t033805AD127CEC3100EAFE64 /* EXFUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EXFUtils.m; path = EXIF/EXFUtils.m; sourceTree = SOURCE_ROOT; };\n\t\t033805B6127CEC4200EAFE64 /* OUILookupTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OUILookupTool.h; sourceTree = \"<group>\"; };\n\t\t033805B7127CEC4200EAFE64 /* OUILookupTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OUILookupTool.m; sourceTree = \"<group>\"; };\n\t\t033805CC127CECF900EAFE64 /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = \"<group>\"; };\n\t\t033805CD127CECF900EAFE64 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = \"<group>\"; };\n\t\t033805CE127CECF900EAFE64 /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSObject+SBJSON.h\"; sourceTree = \"<group>\"; };\n\t\t033805CF127CECF900EAFE64 /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSObject+SBJSON.m\"; sourceTree = \"<group>\"; };\n\t\t033805D0127CECF900EAFE64 /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+SBJSON.h\"; sourceTree = \"<group>\"; };\n\t\t033805D1127CECF900EAFE64 /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+SBJSON.m\"; sourceTree = \"<group>\"; };\n\t\t033805D2127CECF900EAFE64 /* Readme.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Readme.markdown; sourceTree = \"<group>\"; };\n\t\t033805D3127CECF900EAFE64 /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = \"<group>\"; };\n\t\t033805D4127CECF900EAFE64 /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = \"<group>\"; };\n\t\t033805D5127CECF900EAFE64 /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = \"<group>\"; };\n\t\t033805D6127CECF900EAFE64 /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = \"<group>\"; };\n\t\t033805D7127CECF900EAFE64 /* SBJsonStreamWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonStreamWriter.h; sourceTree = \"<group>\"; };\n\t\t033805D8127CECF900EAFE64 /* SBJsonStreamWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonStreamWriter.m; sourceTree = \"<group>\"; };\n\t\t033805D9127CECF900EAFE64 /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = \"<group>\"; };\n\t\t033805DA127CECF900EAFE64 /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = \"<group>\"; };\n\t\t033805DB127CECF900EAFE64 /* SBProxyForJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBProxyForJson.h; sourceTree = \"<group>\"; };\n\t\t0364933F10B16DDD00C88803 /* SPSourceKeyboardTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceKeyboardTVC.h; sourceTree = \"<group>\"; };\n\t\t0364934010B16DDD00C88803 /* SPSourceKeyboardTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceKeyboardTVC.m; sourceTree = \"<group>\"; };\n\t\t0364948A10B28BC800C88803 /* SPSourceTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSourceTVC.h; sourceTree = \"<group>\"; };\n\t\t0364948B10B28BC800C88803 /* SPSourceTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSourceTVC.m; sourceTree = \"<group>\"; };\n\t\t037D3A7F10F3D57B003A85B0 /* SPEmailMobileMeAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEmailMobileMeAccount.h; sourceTree = \"<group>\"; };\n\t\t037D3A8010F3D57B003A85B0 /* SPEmailMobileMeAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEmailMobileMeAccount.m; sourceTree = \"<group>\"; };\n\t\t037F2E0D128D2E6300EE7E19 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };\n\t\t03B2C04D10BB624F00E05ECB /* Keyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Keyboard.png; sourceTree = \"<group>\"; };\n\t\t03B2C06010BB62A300E05ECB /* data.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = data.png; sourceTree = \"<group>\"; };\n\t\t03B2C09310BB66DB00E05ECB /* report.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = report.png; sourceTree = \"<group>\"; };\n\t\t03B6EFC910BB547600CF9139 /* gpl-2.0.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = \"gpl-2.0.txt\"; sourceTree = \"<group>\"; };\n\t\t03B6F00310BB588A00CF9139 /* white_hat_mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = white_hat_mask.png; sourceTree = \"<group>\"; };\n\t\t03B6F03410BB5F4800CF9139 /* email_mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = email_mask.png; sourceTree = \"<group>\"; };\n\t\t03F2472E1236E25E0017F214 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libsqlite3.dylib; path = /usr/lib/libsqlite3.dylib; sourceTree = \"<absolute>\"; };\n\t\t03F2481D1236EFAC0017F214 /* NSNumber+SP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSNumber+SP.h\"; sourceTree = \"<group>\"; };\n\t\t03F2481E1236EFAC0017F214 /* NSNumber+SP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSNumber+SP.m\"; sourceTree = \"<group>\"; };\n\t\t1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t1D3623240D0F684500981E51 /* SpyPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpyPhoneAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1D3623250D0F684500981E51 /* SpyPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpyPhoneAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1D6058910D05DD3D006BFB54 /* SpyPhone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpyPhone.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t282CCBFD0DB6C98000C4EA27 /* Sources.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Sources.xib; sourceTree = \"<group>\"; };\n\t\t288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t28A0AB4B0D9B1048005BE974 /* SpyPhone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpyPhone_Prefix.pch; sourceTree = \"<group>\"; };\n\t\t28AD73870D9D96C1002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = \"<group>\"; };\n\t\t29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t5F0DA1BA12829A6E00CD3B56 /* TVOutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TVOutManager.h; sourceTree = \"<group>\"; };\n\t\t5F0DA1BB12829A6E00CD3B56 /* TVOutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TVOutManager.m; sourceTree = \"<group>\"; };\n\t\t5F38C608127EBB37003CA424 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };\n\t\t8D1107310486CEB800E47090 /* SpyPhone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"SpyPhone-Info.plist\"; plistStructureDefinitionIdentifier = \"com.apple.xcode.plist.structure-definition.iphone.info-plist\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,\n\t\t\t\t1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,\n\t\t\t\t288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t0328F74310B095BA0074A5A1 /* MapKit.framework in Frameworks */,\n\t\t\t\t031749AF10B6FB9C00B6116E /* AddressBook.framework in Frameworks */,\n\t\t\t\t032A7D9010B844EF00E7FB65 /* CoreLocation.framework in Frameworks */,\n\t\t\t\t032A81CA10B8EB6100E7FB65 /* MessageUI.framework in Frameworks */,\n\t\t\t\t0317DE6910FF95CC00C5C2D4 /* MediaPlayer.framework in Frameworks */,\n\t\t\t\t03F2472F1236E25E0017F214 /* libsqlite3.dylib in Frameworks */,\n\t\t\t\t5F38C609127EBB37003CA424 /* CoreTelephony.framework in Frameworks */,\n\t\t\t\t037F2E0E128D2E6300EE7E19 /* QuartzCore.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t031748C110B6E67C00B6116E /* SPEmailAccounts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t031748BE10B6E63E00B6116E /* SPEmailAccount.h */,\n\t\t\t\t031748BF10B6E63E00B6116E /* SPEmailAccount.m */,\n\t\t\t\t031748B710B6E35C00B6116E /* SPEmailASAccount.h */,\n\t\t\t\t031748B810B6E35C00B6116E /* SPEmailASAccount.m */,\n\t\t\t\t031748C510B6E98800B6116E /* SPEmailPOPAccount.h */,\n\t\t\t\t031748C610B6E98800B6116E /* SPEmailPOPAccount.m */,\n\t\t\t\t031748C810B6E9A000B6116E /* SPEmailIToolsAccount.h */,\n\t\t\t\t031748C910B6E9A000B6116E /* SPEmailIToolsAccount.m */,\n\t\t\t\t0317498410B6F3A300B6116E /* SPEmailGmailAccount.h */,\n\t\t\t\t0317498510B6F3A300B6116E /* SPEmailGmailAccount.m */,\n\t\t\t\t0317498710B6F49300B6116E /* SPEmailIMAPAccount.h */,\n\t\t\t\t0317498810B6F49300B6116E /* SPEmailIMAPAccount.m */,\n\t\t\t\t037D3A7F10F3D57B003A85B0 /* SPEmailMobileMeAccount.h */,\n\t\t\t\t037D3A8010F3D57B003A85B0 /* SPEmailMobileMeAccount.m */,\n\t\t\t);\n\t\t\tname = SPEmailAccounts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t031748C210B6E68E00B6116E /* SPSources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0364948A10B28BC800C88803 /* SPSourceTVC.h */,\n\t\t\t\t0364948B10B28BC800C88803 /* SPSourceTVC.m */,\n\t\t\t\t0328F56810B071110074A5A1 /* SPSourceEmailTVC.h */,\n\t\t\t\t0328F56910B071110074A5A1 /* SPSourceEmailTVC.m */,\n\t\t\t\t0328F61710B07F360074A5A1 /* SPSourceWifiTVC.h */,\n\t\t\t\t0328F61810B07F360074A5A1 /* SPSourceWifiTVC.m */,\n\t\t\t\t0328F6BA10B088DD0074A5A1 /* SPSourcePhoneTVC.h */,\n\t\t\t\t0328F6BB10B088DD0074A5A1 /* SPSourcePhoneTVC.m */,\n\t\t\t\t0328F75010B09AA60074A5A1 /* SPSourceLocationTVC.h */,\n\t\t\t\t0328F75110B09AA60074A5A1 /* SPSourceLocationTVC.m */,\n\t\t\t\t0328F80D10B0A8B70074A5A1 /* SPSourcePhotosTVC.h */,\n\t\t\t\t0328F80E10B0A8B70074A5A1 /* SPSourcePhotosTVC.m */,\n\t\t\t\t0328F95F10B0CB140074A5A1 /* SPSourceAddressBookTVC.h */,\n\t\t\t\t0328F96010B0CB140074A5A1 /* SPSourceAddressBookTVC.m */,\n\t\t\t\t0364933F10B16DDD00C88803 /* SPSourceKeyboardTVC.h */,\n\t\t\t\t0364934010B16DDD00C88803 /* SPSourceKeyboardTVC.m */,\n\t\t\t);\n\t\t\tname = SPSources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t032A7B9010B829D100E7FB65 /* EXIF */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0338059C127CEC3100EAFE64 /* EXF.h */,\n\t\t\t\t0338059D127CEC3100EAFE64 /* EXFConstants.h */,\n\t\t\t\t0338059E127CEC3100EAFE64 /* EXFGPS.h */,\n\t\t\t\t0338059F127CEC3100EAFE64 /* EXFGPS.m */,\n\t\t\t\t033805A0127CEC3100EAFE64 /* EXFHandlers.h */,\n\t\t\t\t033805A1127CEC3100EAFE64 /* EXFHandlers.m */,\n\t\t\t\t033805A2127CEC3100EAFE64 /* EXFJFIF.h */,\n\t\t\t\t033805A3127CEC3100EAFE64 /* EXFJFIF.m */,\n\t\t\t\t033805A4127CEC3100EAFE64 /* EXFJpeg.h */,\n\t\t\t\t033805A5127CEC3100EAFE64 /* EXFJpeg.m */,\n\t\t\t\t033805A6127CEC3100EAFE64 /* EXFLogging.h */,\n\t\t\t\t033805A7127CEC3100EAFE64 /* EXFMetaData.h */,\n\t\t\t\t033805A8127CEC3100EAFE64 /* EXFMetaData.m */,\n\t\t\t\t033805A9127CEC3100EAFE64 /* EXFMutableMetaData.h */,\n\t\t\t\t033805AA127CEC3100EAFE64 /* EXFTagDefinitionHolder.h */,\n\t\t\t\t033805AB127CEC3100EAFE64 /* EXFTagDefinitionHolder.m */,\n\t\t\t\t033805AC127CEC3100EAFE64 /* EXFUtils.h */,\n\t\t\t\t033805AD127CEC3100EAFE64 /* EXFUtils.m */,\n\t\t\t\t032A7E0410B84C1800E7FB65 /* UIImage+GPS.h */,\n\t\t\t\t032A7E0510B84C1800E7FB65 /* UIImage+GPS.m */,\n\t\t\t);\n\t\t\tname = EXIF;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t033805B5127CEC4200EAFE64 /* OUILookupTool */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t033805B6127CEC4200EAFE64 /* OUILookupTool.h */,\n\t\t\t\t033805B7127CEC4200EAFE64 /* OUILookupTool.m */,\n\t\t\t);\n\t\t\tpath = OUILookupTool;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t033805CB127CECF900EAFE64 /* JSON */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t033805CC127CECF900EAFE64 /* JSON.h */,\n\t\t\t\t033805CD127CECF900EAFE64 /* LICENSE */,\n\t\t\t\t033805CE127CECF900EAFE64 /* NSObject+SBJSON.h */,\n\t\t\t\t033805CF127CECF900EAFE64 /* NSObject+SBJSON.m */,\n\t\t\t\t033805D0127CECF900EAFE64 /* NSString+SBJSON.h */,\n\t\t\t\t033805D1127CECF900EAFE64 /* NSString+SBJSON.m */,\n\t\t\t\t033805D2127CECF900EAFE64 /* Readme.markdown */,\n\t\t\t\t033805D3127CECF900EAFE64 /* SBJsonBase.h */,\n\t\t\t\t033805D4127CECF900EAFE64 /* SBJsonBase.m */,\n\t\t\t\t033805D5127CECF900EAFE64 /* SBJsonParser.h */,\n\t\t\t\t033805D6127CECF900EAFE64 /* SBJsonParser.m */,\n\t\t\t\t033805D7127CECF900EAFE64 /* SBJsonStreamWriter.h */,\n\t\t\t\t033805D8127CECF900EAFE64 /* SBJsonStreamWriter.m */,\n\t\t\t\t033805D9127CECF900EAFE64 /* SBJsonWriter.h */,\n\t\t\t\t033805DA127CECF900EAFE64 /* SBJsonWriter.m */,\n\t\t\t\t033805DB127CECF900EAFE64 /* SBProxyForJson.h */,\n\t\t\t);\n\t\t\tpath = JSON;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t03B6EFF510BB577A00CF9139 /* SPSourcesIcons */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t031CD54810BB4A29007C133E /* Email.png */,\n\t\t\t\t031CD5C110BB502A007C133E /* Wifi.png */,\n\t\t\t\t031CD54B10BB4A29007C133E /* Phone.png */,\n\t\t\t\t031CD54910BB4A29007C133E /* Location.png */,\n\t\t\t\t031CD5EA10BB5152007C133E /* Safari.png */,\n\t\t\t\t031CD5BD10BB5004007C133E /* YouTube.png */,\n\t\t\t\t031CD54C10BB4A29007C133E /* Photos.png */,\n\t\t\t\t031CD5BB10BB4F7B007C133E /* AddressBook.png */,\n\t\t\t\t03B2C04D10BB624F00E05ECB /* Keyboard.png */,\n\t\t\t);\n\t\t\tname = SPSourcesIcons;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t03F2470B1236E1180017F214 /* FMDB */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t03380593127CEC2500EAFE64 /* FMDatabase.h */,\n\t\t\t\t03380594127CEC2500EAFE64 /* FMDatabase.m */,\n\t\t\t\t03380595127CEC2500EAFE64 /* FMDatabaseAdditions.h */,\n\t\t\t\t03380596127CEC2500EAFE64 /* FMDatabaseAdditions.m */,\n\t\t\t\t03380597127CEC2500EAFE64 /* FMResultSet.h */,\n\t\t\t\t03380598127CEC2500EAFE64 /* FMResultSet.m */,\n\t\t\t);\n\t\t\tname = FMDB;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t080E96DDFE201D6D7F000001 /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F0DA1BA12829A6E00CD3B56 /* TVOutManager.h */,\n\t\t\t\t5F0DA1BB12829A6E00CD3B56 /* TVOutManager.m */,\n\t\t\t\t03F2470B1236E1180017F214 /* FMDB */,\n\t\t\t\t032A7B9010B829D100E7FB65 /* EXIF */,\n\t\t\t\t033805CB127CECF900EAFE64 /* JSON */,\n\t\t\t\t033805B5127CEC4200EAFE64 /* OUILookupTool */,\n\t\t\t\t031748C110B6E67C00B6116E /* SPEmailAccounts */,\n\t\t\t\t031748C210B6E68E00B6116E /* SPSources */,\n\t\t\t\t0328F50810B065530074A5A1 /* SPCell.h */,\n\t\t\t\t0328F50910B065530074A5A1 /* SPCell.m */,\n\t\t\t\t1D3623240D0F684500981E51 /* SpyPhoneAppDelegate.h */,\n\t\t\t\t1D3623250D0F684500981E51 /* SpyPhoneAppDelegate.m */,\n\t\t\t\t0328F4CD10B0614A0074A5A1 /* SPAllSourcesTVC.h */,\n\t\t\t\t0328F4CE10B0614A0074A5A1 /* SPAllSourcesTVC.m */,\n\t\t\t\t0328F8BE10B0B1AE0074A5A1 /* SPWebViewVC.h */,\n\t\t\t\t0328F8BF10B0B1AE0074A5A1 /* SPWebViewVC.m */,\n\t\t\t\t032A7EAF10B85E9C00E7FB65 /* SPImageMapVC.h */,\n\t\t\t\t032A7EB010B85E9C00E7FB65 /* SPImageMapVC.m */,\n\t\t\t\t030AFB2B127D08BF00C9E0C6 /* SPWifiMapVC.h */,\n\t\t\t\t030AFB2C127D08BF00C9E0C6 /* SPWifiMapVC.m */,\n\t\t\t\t0310C65310C4BE0800E7ACD2 /* SPImageVC.h */,\n\t\t\t\t0310C65410C4BE0800E7ACD2 /* SPImageVC.m */,\n\t\t\t\t032A7EC910B8617C00E7FB65 /* SPImageAnnotation.h */,\n\t\t\t\t032A7ECA10B8617C00E7FB65 /* SPImageAnnotation.m */,\n\t\t\t\t030AFBA2127D0D6F00C9E0C6 /* SPWifiAnnotation.h */,\n\t\t\t\t030AFBA3127D0D6F00C9E0C6 /* SPWifiAnnotation.m */,\n\t\t\t\t032A819510B8E7C600E7FB65 /* SPEmailReportVC.h */,\n\t\t\t\t032A819610B8E7C600E7FB65 /* SPEmailReportVC.m */,\n\t\t\t\t03F2481D1236EFAC0017F214 /* NSNumber+SP.h */,\n\t\t\t\t03F2481E1236EFAC0017F214 /* NSNumber+SP.m */,\n\t\t\t);\n\t\t\tpath = Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FACFE9D520D11CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1D6058910D05DD3D006BFB54 /* SpyPhone.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97314FDCFA39411CA2CEA /* MyData */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t03B6EFC910BB547600CF9139 /* gpl-2.0.txt */,\n\t\t\t\t080E96DDFE201D6D7F000001 /* Classes */,\n\t\t\t\t29B97315FDCFA39411CA2CEA /* Other Sources */,\n\t\t\t\t29B97317FDCFA39411CA2CEA /* Resources */,\n\t\t\t\t29B97323FDCFA39411CA2CEA /* Frameworks */,\n\t\t\t\t19C28FACFE9D520D11CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = MyData;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97315FDCFA39411CA2CEA /* Other Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t28A0AB4B0D9B1048005BE974 /* SpyPhone_Prefix.pch */,\n\t\t\t\t29B97316FDCFA39411CA2CEA /* main.m */,\n\t\t\t);\n\t\t\tname = \"Other Sources\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97317FDCFA39411CA2CEA /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t03B6F00310BB588A00CF9139 /* white_hat_mask.png */,\n\t\t\t\t03B6F03410BB5F4800CF9139 /* email_mask.png */,\n\t\t\t\t03B2C06010BB62A300E05ECB /* data.png */,\n\t\t\t\t03B2C09310BB66DB00E05ECB /* report.png */,\n\t\t\t\t03B6EFF510BB577A00CF9139 /* SPSourcesIcons */,\n\t\t\t\t032A811B10B883FB00E7FB65 /* Default.png */,\n\t\t\t\t032A80F210B8816300E7FB65 /* Icon.png */,\n\t\t\t\t032A80F110B8816300E7FB65 /* white_hat.png */,\n\t\t\t\t28AD73870D9D96C1002E5188 /* MainWindow.xib */,\n\t\t\t\t282CCBFD0DB6C98000C4EA27 /* Sources.xib */,\n\t\t\t\t0328F51310B065B80074A5A1 /* SPCell.xib */,\n\t\t\t\t8D1107310486CEB800E47090 /* SpyPhone-Info.plist */,\n\t\t\t\t0328F56210B070AE0074A5A1 /* SPSourceTVC.xib */,\n\t\t\t\t0328F8BB10B0B1780074A5A1 /* SPWebViewVC.xib */,\n\t\t\t\t032A7EAC10B85E7F00E7FB65 /* SPImageMapVC.xib */,\n\t\t\t\t030AFB2D127D08BF00C9E0C6 /* SPWifiMapVC.xib */,\n\t\t\t\t032A809910B8799300E7FB65 /* SPImageVC.xib */,\n\t\t\t\t032A819210B8E7BA00E7FB65 /* SPEmailReportVC.xib */,\n\t\t\t\t0317DE7B10FF98E900C5C2D4 /* Settings.bundle */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97323FDCFA39411CA2CEA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F38C608127EBB37003CA424 /* CoreTelephony.framework */,\n\t\t\t\t03F2472E1236E25E0017F214 /* libsqlite3.dylib */,\n\t\t\t\t1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,\n\t\t\t\t1D30AB110D05D00D00671497 /* Foundation.framework */,\n\t\t\t\t288765070DF74369002DB57D /* CoreGraphics.framework */,\n\t\t\t\t0328F74210B095BA0074A5A1 /* MapKit.framework */,\n\t\t\t\t031749AE10B6FB9C00B6116E /* AddressBook.framework */,\n\t\t\t\t032A7D8F10B844EF00E7FB65 /* CoreLocation.framework */,\n\t\t\t\t032A81C910B8EB6100E7FB65 /* MessageUI.framework */,\n\t\t\t\t0317DE6810FF95CC00C5C2D4 /* MediaPlayer.framework */,\n\t\t\t\t037F2E0D128D2E6300EE7E19 /* QuartzCore.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1D6058900D05DD3D006BFB54 /* SpyPhone */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"SpyPhone\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1D60588D0D05DD3D006BFB54 /* Resources */,\n\t\t\t\t1D60588E0D05DD3D006BFB54 /* Sources */,\n\t\t\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SpyPhone;\n\t\t\tproductName = MyData;\n\t\t\tproductReference = 1D6058910D05DD3D006BFB54 /* SpyPhone.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0420;\n\t\t\t};\n\t\t\tbuildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject \"SpyPhone\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 29B97314FDCFA39411CA2CEA /* MyData */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1D6058900D05DD3D006BFB54 /* SpyPhone */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1D60588D0D05DD3D006BFB54 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */,\n\t\t\t\t282CCBFE0DB6C98000C4EA27 /* Sources.xib in Resources */,\n\t\t\t\t0328F51410B065B80074A5A1 /* SPCell.xib in Resources */,\n\t\t\t\t0328F56310B070AE0074A5A1 /* SPSourceTVC.xib in Resources */,\n\t\t\t\t0328F8BC10B0B1780074A5A1 /* SPWebViewVC.xib in Resources */,\n\t\t\t\t032A7EAD10B85E7F00E7FB65 /* SPImageMapVC.xib in Resources */,\n\t\t\t\t032A809A10B8799300E7FB65 /* SPImageVC.xib in Resources */,\n\t\t\t\t032A80F410B8816300E7FB65 /* Icon.png in Resources */,\n\t\t\t\t032A810110B8821D00E7FB65 /* white_hat.png in Resources */,\n\t\t\t\t032A811C10B883FB00E7FB65 /* Default.png in Resources */,\n\t\t\t\t032A819310B8E7BA00E7FB65 /* SPEmailReportVC.xib in Resources */,\n\t\t\t\t031CD55010BB4A29007C133E /* Email.png in Resources */,\n\t\t\t\t031CD55110BB4A29007C133E /* Location.png in Resources */,\n\t\t\t\t031CD55310BB4A29007C133E /* Phone.png in Resources */,\n\t\t\t\t031CD55410BB4A29007C133E /* Photos.png in Resources */,\n\t\t\t\t031CD5BC10BB4F7B007C133E /* AddressBook.png in Resources */,\n\t\t\t\t031CD5BE10BB5004007C133E /* YouTube.png in Resources */,\n\t\t\t\t031CD5C210BB502A007C133E /* Wifi.png in Resources */,\n\t\t\t\t031CD5EB10BB5152007C133E /* Safari.png in Resources */,\n\t\t\t\t03B6EFCA10BB547600CF9139 /* gpl-2.0.txt in Resources */,\n\t\t\t\t03B6F00410BB588A00CF9139 /* white_hat_mask.png in Resources */,\n\t\t\t\t03B6F03510BB5F4800CF9139 /* email_mask.png in Resources */,\n\t\t\t\t03B2C04E10BB624F00E05ECB /* Keyboard.png in Resources */,\n\t\t\t\t03B2C06110BB62A300E05ECB /* data.png in Resources */,\n\t\t\t\t03B2C09410BB66DB00E05ECB /* report.png in Resources */,\n\t\t\t\t0317DE7C10FF98E900C5C2D4 /* Settings.bundle in Resources */,\n\t\t\t\t033805DC127CECF900EAFE64 /* LICENSE in Resources */,\n\t\t\t\t033805DF127CECF900EAFE64 /* Readme.markdown in Resources */,\n\t\t\t\t030AFB2F127D08BF00C9E0C6 /* SPWifiMapVC.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1D60588E0D05DD3D006BFB54 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1D60589B0D05DD56006BFB54 /* main.m in Sources */,\n\t\t\t\t1D3623260D0F684500981E51 /* SpyPhoneAppDelegate.m in Sources */,\n\t\t\t\t0328F4CF10B0614A0074A5A1 /* SPAllSourcesTVC.m in Sources */,\n\t\t\t\t0328F50A10B065530074A5A1 /* SPCell.m in Sources */,\n\t\t\t\t0328F56A10B071110074A5A1 /* SPSourceEmailTVC.m in Sources */,\n\t\t\t\t0328F61910B07F360074A5A1 /* SPSourceWifiTVC.m in Sources */,\n\t\t\t\t0328F6BC10B088DD0074A5A1 /* SPSourcePhoneTVC.m in Sources */,\n\t\t\t\t0328F75210B09AA60074A5A1 /* SPSourceLocationTVC.m in Sources */,\n\t\t\t\t0328F80F10B0A8B70074A5A1 /* SPSourcePhotosTVC.m in Sources */,\n\t\t\t\t0328F8C010B0B1AE0074A5A1 /* SPWebViewVC.m in Sources */,\n\t\t\t\t0328F96110B0CB140074A5A1 /* SPSourceAddressBookTVC.m in Sources */,\n\t\t\t\t0364934110B16DDD00C88803 /* SPSourceKeyboardTVC.m in Sources */,\n\t\t\t\t0364948C10B28BC800C88803 /* SPSourceTVC.m in Sources */,\n\t\t\t\t031748B910B6E35C00B6116E /* SPEmailASAccount.m in Sources */,\n\t\t\t\t031748C010B6E63E00B6116E /* SPEmailAccount.m in Sources */,\n\t\t\t\t031748C710B6E98800B6116E /* SPEmailPOPAccount.m in Sources */,\n\t\t\t\t031748CA10B6E9A000B6116E /* SPEmailIToolsAccount.m in Sources */,\n\t\t\t\t0317498610B6F3A300B6116E /* SPEmailGmailAccount.m in Sources */,\n\t\t\t\t0317498910B6F49300B6116E /* SPEmailIMAPAccount.m in Sources */,\n\t\t\t\t032A7E0610B84C1800E7FB65 /* UIImage+GPS.m in Sources */,\n\t\t\t\t032A7EB110B85E9C00E7FB65 /* SPImageMapVC.m in Sources */,\n\t\t\t\t032A7ECB10B8617C00E7FB65 /* SPImageAnnotation.m in Sources */,\n\t\t\t\t032A819710B8E7C600E7FB65 /* SPEmailReportVC.m in Sources */,\n\t\t\t\t0310C65510C4BE0800E7ACD2 /* SPImageVC.m in Sources */,\n\t\t\t\t037D3A8110F3D57B003A85B0 /* SPEmailMobileMeAccount.m in Sources */,\n\t\t\t\t03F2481F1236EFAC0017F214 /* NSNumber+SP.m in Sources */,\n\t\t\t\t03380599127CEC2500EAFE64 /* FMDatabase.m in Sources */,\n\t\t\t\t0338059A127CEC2500EAFE64 /* FMDatabaseAdditions.m in Sources */,\n\t\t\t\t0338059B127CEC2500EAFE64 /* FMResultSet.m in Sources */,\n\t\t\t\t033805AE127CEC3100EAFE64 /* EXFGPS.m in Sources */,\n\t\t\t\t033805AF127CEC3100EAFE64 /* EXFHandlers.m in Sources */,\n\t\t\t\t033805B0127CEC3100EAFE64 /* EXFJFIF.m in Sources */,\n\t\t\t\t033805B1127CEC3100EAFE64 /* EXFJpeg.m in Sources */,\n\t\t\t\t033805B2127CEC3100EAFE64 /* EXFMetaData.m in Sources */,\n\t\t\t\t033805B3127CEC3100EAFE64 /* EXFTagDefinitionHolder.m in Sources */,\n\t\t\t\t033805B4127CEC3100EAFE64 /* EXFUtils.m in Sources */,\n\t\t\t\t033805B8127CEC4200EAFE64 /* OUILookupTool.m in Sources */,\n\t\t\t\t033805DD127CECF900EAFE64 /* NSObject+SBJSON.m in Sources */,\n\t\t\t\t033805DE127CECF900EAFE64 /* NSString+SBJSON.m in Sources */,\n\t\t\t\t033805E0127CECF900EAFE64 /* SBJsonBase.m in Sources */,\n\t\t\t\t033805E1127CECF900EAFE64 /* SBJsonParser.m in Sources */,\n\t\t\t\t033805E2127CECF900EAFE64 /* SBJsonStreamWriter.m in Sources */,\n\t\t\t\t033805E3127CECF900EAFE64 /* SBJsonWriter.m in Sources */,\n\t\t\t\t030AFB2E127D08BF00C9E0C6 /* SPWifiMapVC.m in Sources */,\n\t\t\t\t030AFBA4127D0D6F00C9E0C6 /* SPWifiAnnotation.m in Sources */,\n\t\t\t\t5F0DA1BC12829A6E00CD3B56 /* TVOutManager.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1D6058940D05DD3E006BFB54 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = SpyPhone_Prefix.pch;\n\t\t\t\tINFOPLIST_FILE = \"SpyPhone-Info.plist\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = SpyPhone;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1D6058950D05DD3E006BFB54 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = SpyPhone_Prefix.pch;\n\t\t\t\tINFOPLIST_FILE = \"SpyPhone-Info.plist\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = SpyPhone;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tC01FCF4F08A954540054247B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = c99;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\t\"PROVISIONING_PROFILE[sdk=iphoneos*]\" = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC01FCF5008A954540054247B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = c99;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\t\"PROVISIONING_PROFILE[sdk=iphoneos*]\" = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"SpyPhone\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1D6058940D05DD3E006BFB54 /* Debug */,\n\t\t\t\t1D6058950D05DD3E006BFB54 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n\t\tC01FCF4E08A954540054247B /* Build configuration list for PBXProject \"SpyPhone\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC01FCF4F08A954540054247B /* Debug */,\n\t\t\t\tC01FCF5008A954540054247B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 29B97313FDCFA39411CA2CEA /* Project object */;\n}\n"
  },
  {
    "path": "SpyPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:SpyPhone.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SpyPhone.xcodeproj/project.xcworkspace/xcuserdata/nst.xcuserdatad/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>\n\t<true/>\n\t<key>IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "SpyPhone_Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'SpyPhone' target in the 'SpyPhone' project\n//\n\n#ifdef __OBJC__\n    #import <Foundation/Foundation.h>\n    #import <UIKit/UIKit.h>\n#endif\n"
  },
  {
    "path": "gpl-2.0.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "main.m",
    "content": "//\n//  main.m\n//  SpyPhone\n//\n//  Created by Nicolas Seriot on 11/15/09.\n//  Copyright 2009. \n//  Licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.txt\n//\n\n#import <UIKit/UIKit.h>\n\nint main(int argc, char *argv[]) {\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n    int retVal = UIApplicationMain(argc, argv, nil, nil);\n    [pool release];\n    return retVal;\n}\n\n"
  }
]