From 663d25e5160e97eefed1444bac0b4ac964f3368e Mon Sep 17 00:00:00 2001 From: matt handler Date: Sun, 24 Apr 2011 21:00:46 -0400 Subject: still a bit off from a solid state... added fmdatabase, updated acidcow parser with a formate, added some standard stuff to piccast app delegate, created a section dictionary, did some serializing to/from db for topics, added a bunch of logic to topic view controller, added db table --- Classes/AcidCowFeedburnerParser.m | 4 +- Classes/FMDatabase.h | 118 +++ Classes/FMDatabase.m | 815 +++++++++++++++ Classes/FMDatabaseAdditions.h | 31 + Classes/FMDatabaseAdditions.m | 114 ++ Classes/FMResultSet.h | 93 ++ Classes/FMResultSet.m | 405 +++++++ Classes/PicCastAppDelegate.h | 2 + Classes/PicCastAppDelegate.m | 45 + Classes/SectionDictionary.h | 23 + Classes/SectionDictionary.m | 64 ++ Classes/Topic.h | 8 +- Classes/Topic.m | 58 +- Classes/TopicsViewController.h | 7 +- Classes/TopicsViewController.m | 96 +- Classes/fmdb_Prefix.pch | 7 + PicCast.xcodeproj/handler.mode1v3 | 76 +- PicCast.xcodeproj/handler.pbxuser | 2092 +++++++++++++++++++++---------------- PicCast.xcodeproj/project.pbxproj | 53 +- PicCastSqlTable.db | Bin 0 -> 5120 bytes 20 files changed, 3182 insertions(+), 929 deletions(-) create mode 100644 Classes/FMDatabase.h create mode 100644 Classes/FMDatabase.m create mode 100644 Classes/FMDatabaseAdditions.h create mode 100644 Classes/FMDatabaseAdditions.m create mode 100644 Classes/FMResultSet.h create mode 100644 Classes/FMResultSet.m create mode 100644 Classes/SectionDictionary.h create mode 100644 Classes/SectionDictionary.m create mode 100644 Classes/fmdb_Prefix.pch create mode 100644 PicCastSqlTable.db diff --git a/Classes/AcidCowFeedburnerParser.m b/Classes/AcidCowFeedburnerParser.m index 46d7ec5..118aa43 100644 --- a/Classes/AcidCowFeedburnerParser.m +++ b/Classes/AcidCowFeedburnerParser.m @@ -15,12 +15,12 @@ - (void)downloadAndParse:(NSURL *)url { - NSLog(@"downloadAndParse"); self.downloadAndParsePool = [[NSAutoreleasePool alloc] init]; done = NO; self.parseFormatter = [[[NSDateFormatter alloc] init] autorelease]; [parseFormatter setDateStyle:NSDateFormatterLongStyle]; [parseFormatter setTimeStyle:NSDateFormatterNoStyle]; + [parseFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"]; // necessary because iTunes RSS feed is not localized, so if the device region has been set to other than US // the date formatter must be set to US locale in order to parse the dates [parseFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]]; @@ -169,7 +169,7 @@ static NSString *kName_Guid = @"guid"; } else if ([elementName isEqualToString:kName_Guid]) { currentTopic.guid = currentString; } else if ([elementName isEqualToString:kName_Creator]) { - currentTopic.creator = currentString; + //currentTopic.creator = currentString; } else if ([elementName isEqualToString:kName_Description]) { NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"http\\S+(jpg|png|gif|jpeg)" options:NSRegularExpressionCaseInsensitive diff --git a/Classes/FMDatabase.h b/Classes/FMDatabase.h new file mode 100644 index 0000000..f125d61 --- /dev/null +++ b/Classes/FMDatabase.h @@ -0,0 +1,118 @@ +#import +#import "sqlite3.h" +#import "FMResultSet.h" + +@interface FMDatabase : NSObject +{ + sqlite3* db; + NSString* databasePath; + BOOL logsErrors; + BOOL crashOnErrors; + BOOL inUse; + BOOL inTransaction; + BOOL traceExecution; + BOOL checkedOut; + int busyRetryTimeout; + BOOL shouldCacheStatements; + NSMutableDictionary *cachedStatements; + NSMutableSet *openResultSets; +} + + ++ (id)databaseWithPath:(NSString*)inPath; +- (id)initWithPath:(NSString*)inPath; + +- (BOOL)open; +#if SQLITE_VERSION_NUMBER >= 3005000 +- (BOOL)openWithFlags:(int)flags; +#endif +- (BOOL)close; +- (BOOL)goodConnection; +- (void)clearCachedStatements; +- (void)closeOpenResultSets; + +// encryption methods. You need to have purchased the sqlite encryption extensions for these to work. +- (BOOL)setKey:(NSString*)key; +- (BOOL)rekey:(NSString*)key; + + +- (NSString *)databasePath; + +- (NSString*)lastErrorMessage; + +- (int)lastErrorCode; +- (BOOL)hadError; +- (sqlite_int64)lastInsertRowId; + +- (sqlite3*)sqliteHandle; + +- (BOOL)update:(NSString*)sql error:(NSError**)outErr bind:(id)bindArgs, ...; +- (BOOL)executeUpdate:(NSString*)sql, ...; +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; +- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; // you shouldn't ever need to call this. use the previous two instead. + +- (FMResultSet *)executeQuery:(NSString*)sql, ...; +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; // you shouldn't ever need to call this. use the previous two instead. + +- (BOOL)rollback; +- (BOOL)commit; +- (BOOL)beginTransaction; +- (BOOL)beginDeferredTransaction; + +- (BOOL)logsErrors; +- (void)setLogsErrors:(BOOL)flag; + +- (BOOL)crashOnErrors; +- (void)setCrashOnErrors:(BOOL)flag; + +- (BOOL)inUse; +- (void)setInUse:(BOOL)value; + +- (BOOL)inTransaction; +- (void)setInTransaction:(BOOL)flag; + +- (BOOL)traceExecution; +- (void)setTraceExecution:(BOOL)flag; + +- (BOOL)checkedOut; +- (void)setCheckedOut:(BOOL)flag; + +- (int)busyRetryTimeout; +- (void)setBusyRetryTimeout:(int)newBusyRetryTimeout; + +- (BOOL)shouldCacheStatements; +- (void)setShouldCacheStatements:(BOOL)value; + +- (NSMutableDictionary *)cachedStatements; +- (void)setCachedStatements:(NSMutableDictionary *)value; + + ++ (NSString*)sqliteLibVersion; + +- (int)changes; + +@end + +@interface FMStatement : NSObject { + sqlite3_stmt *statement; + NSString *query; + long useCount; +} + + +- (void)close; +- (void)reset; + +- (sqlite3_stmt *)statement; +- (void)setStatement:(sqlite3_stmt *)value; + +- (NSString *)query; +- (void)setQuery:(NSString *)value; + +- (long)useCount; +- (void)setUseCount:(long)value; + + +@end + diff --git a/Classes/FMDatabase.m b/Classes/FMDatabase.m new file mode 100644 index 0000000..46d963b --- /dev/null +++ b/Classes/FMDatabase.m @@ -0,0 +1,815 @@ +#import "FMDatabase.h" +#import "unistd.h" + +@implementation FMDatabase + ++ (id)databaseWithPath:(NSString*)aPath { + return [[[self alloc] initWithPath:aPath] autorelease]; +} + +- (id)initWithPath:(NSString*)aPath { + self = [super init]; + + if (self) { + databasePath = [aPath copy]; + openResultSets = [[NSMutableSet alloc] init]; + db = 0x00; + logsErrors = 0x00; + crashOnErrors = 0x00; + busyRetryTimeout = 0x00; + } + + return self; +} + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + + [openResultSets release]; + [cachedStatements release]; + [databasePath release]; + + [super dealloc]; +} + ++ (NSString*)sqliteLibVersion { + return [NSString stringWithFormat:@"%s", sqlite3_libversion()]; +} + +- (NSString *)databasePath { + return databasePath; +} + +- (sqlite3*)sqliteHandle { + return db; +} + +- (BOOL)open { + if (db) { + return YES; + } + + int err = sqlite3_open((databasePath ? [databasePath fileSystemRepresentation] : ":memory:"), &db ); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + + return YES; +} + +#if SQLITE_VERSION_NUMBER >= 3005000 +- (BOOL)openWithFlags:(int)flags { + int err = sqlite3_open_v2((databasePath ? [databasePath fileSystemRepresentation] : ":memory:"), &db, flags, NULL /* Name of VFS module to use */); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + return YES; +} +#endif + + +- (BOOL)close { + + [self clearCachedStatements]; + [self closeOpenResultSets]; + + if (!db) { + return YES; + } + + int rc; + BOOL retry; + int numberOfRetries = 0; + do { + retry = NO; + rc = sqlite3_close(db); + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + retry = YES; + usleep(20); + if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) { + NSLog(@"%s:%d", __FUNCTION__, __LINE__); + NSLog(@"Database busy, unable to close"); + return NO; + } + } + else if (SQLITE_OK != rc) { + NSLog(@"error closing!: %d", rc); + } + } + while (retry); + + db = nil; + return YES; +} + +- (void)clearCachedStatements { + + NSEnumerator *e = [cachedStatements objectEnumerator]; + FMStatement *cachedStmt; + + while ((cachedStmt = [e nextObject])) { + [cachedStmt close]; + } + + [cachedStatements removeAllObjects]; +} + +- (void)closeOpenResultSets { + //Copy the set so we don't get mutation errors + NSSet *resultSets = [[openResultSets copy] autorelease]; + + NSEnumerator *e = [resultSets objectEnumerator]; + NSValue *returnedResultSet = nil; + + while((returnedResultSet = [e nextObject])) { + FMResultSet *rs = (FMResultSet *)[returnedResultSet pointerValue]; + if ([rs respondsToSelector:@selector(close)]) { + [rs close]; + } + } +} + +- (void)resultSetDidClose:(FMResultSet *)resultSet { + NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet]; + [openResultSets removeObject:setValue]; +} + +- (FMStatement*)cachedStatementForQuery:(NSString*)query { + return [cachedStatements objectForKey:query]; +} + +- (void)setCachedStatement:(FMStatement*)statement forQuery:(NSString*)query { + //NSLog(@"setting query: %@", query); + query = [query copy]; // in case we got handed in a mutable string... + [statement setQuery:query]; + [cachedStatements setObject:statement forKey:query]; + [query release]; +} + + +- (BOOL)rekey:(NSString*)key { +#ifdef SQLITE_HAS_CODEC + if (!key) { + return NO; + } + + int rc = sqlite3_rekey(db, [key UTF8String], strlen([key UTF8String])); + + if (rc != SQLITE_OK) { + NSLog(@"error on rekey: %d", rc); + NSLog(@"%@", [self lastErrorMessage]); + } + + return (rc == SQLITE_OK); +#else + return NO; +#endif +} + +- (BOOL)setKey:(NSString*)key { +#ifdef SQLITE_HAS_CODEC + if (!key) { + return NO; + } + + int rc = sqlite3_key(db, [key UTF8String], strlen([key UTF8String])); + + return (rc == SQLITE_OK); +#else + return NO; +#endif +} + +- (BOOL)goodConnection { + + if (!db) { + return NO; + } + + FMResultSet *rs = [self executeQuery:@"select name from sqlite_master where type='table'"]; + + if (rs) { + [rs close]; + return YES; + } + + return NO; +} + +- (void)compainAboutInUse { + NSLog(@"The FMDatabase %@ is currently in use.", self); + +#ifndef NS_BLOCK_ASSERTIONS + if (crashOnErrors) { + NSAssert1(false, @"The FMDatabase %@ is currently in use.", self); + } +#endif +} + +- (NSString*)lastErrorMessage { + return [NSString stringWithUTF8String:sqlite3_errmsg(db)]; +} + +- (BOOL)hadError { + int lastErrCode = [self lastErrorCode]; + + return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW); +} + +- (int)lastErrorCode { + return sqlite3_errcode(db); +} + +- (sqlite_int64)lastInsertRowId { + + if (inUse) { + [self compainAboutInUse]; + return NO; + } + [self setInUse:YES]; + + sqlite_int64 ret = sqlite3_last_insert_rowid(db); + + [self setInUse:NO]; + + return ret; +} + +- (int)changes { + if (inUse) { + [self compainAboutInUse]; + return 0; + } + + [self setInUse:YES]; + int ret = sqlite3_changes(db); + [self setInUse:NO]; + + return ret; +} + +- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt { + + if ((!obj) || ((NSNull *)obj == [NSNull null])) { + sqlite3_bind_null(pStmt, idx); + } + + // FIXME - someday check the return codes on these binds. + else if ([obj isKindOfClass:[NSData class]]) { + sqlite3_bind_blob(pStmt, idx, [obj bytes], (int)[obj length], SQLITE_STATIC); + } + else if ([obj isKindOfClass:[NSDate class]]) { + sqlite3_bind_double(pStmt, idx, [obj timeIntervalSince1970]); + } + else if ([obj isKindOfClass:[NSNumber class]]) { + + if (strcmp([obj objCType], @encode(BOOL)) == 0) { + sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0)); + } + else if (strcmp([obj objCType], @encode(int)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longValue]); + } + else if (strcmp([obj objCType], @encode(long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longValue]); + } + else if (strcmp([obj objCType], @encode(long long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longLongValue]); + } + else if (strcmp([obj objCType], @encode(float)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj floatValue]); + } + else if (strcmp([obj objCType], @encode(double)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj doubleValue]); + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args { + + if (inUse) { + [self compainAboutInUse]; + return nil; + } + + [self setInUse:YES]; + + FMResultSet *rs = nil; + + int rc = 0x00;; + sqlite3_stmt *pStmt = 0x00;; + FMStatement *statement = 0x00; + + if (traceExecution && sql) { + NSLog(@"%@ executeQuery: %@", self, sql); + } + + if (shouldCacheStatements) { + statement = [self cachedStatementForQuery:sql]; + pStmt = statement ? [statement statement] : 0x00; + } + + int numberOfRetries = 0; + BOOL retry = NO; + + if (!pStmt) { + do { + retry = NO; + rc = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0); + + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + retry = YES; + usleep(20); + + if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) { + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]); + NSLog(@"Database busy"); + sqlite3_finalize(pStmt); + [self setInUse:NO]; + return nil; + } + } + else if (SQLITE_OK != rc) { + + + if (logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); +#ifndef NS_BLOCK_ASSERTIONS + if (crashOnErrors) { + NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + } +#endif + } + + sqlite3_finalize(pStmt); + + [self setInUse:NO]; + return nil; + } + } + while (retry); + } + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); // pointed out by Dominic Yu (thanks!) + + while (idx < queryCount) { + + if (arrayArgs) { + obj = [arrayArgs objectAtIndex:idx]; + } + else { + obj = va_arg(args, id); + } + + if (traceExecution) { + NSLog(@"obj: %@", obj); + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + + if (idx != queryCount) { + NSLog(@"Error: the bind count is not correct for the # of variables (executeQuery)"); + sqlite3_finalize(pStmt); + [self setInUse:NO]; + return nil; + } + + [statement retain]; // to balance the release below + + if (!statement) { + statement = [[FMStatement alloc] init]; + [statement setStatement:pStmt]; + + if (shouldCacheStatements) { + [self setCachedStatement:statement forQuery:sql]; + } + } + + // the statement gets closed in rs's dealloc or [rs close]; + rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self]; + [rs setQuery:sql]; + NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs]; + [openResultSets addObject:openResultSet]; + + statement.useCount = statement.useCount + 1; + + [statement release]; + + [self setInUse:NO]; + + return rs; +} + +- (FMResultSet *)executeQuery:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + id result = [self executeQuery:sql withArgumentsInArray:nil orVAList:args]; + + va_end(args); + return result; +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeQuery:sql withArgumentsInArray:arguments orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args { + + if (inUse) { + [self compainAboutInUse]; + return NO; + } + + [self setInUse:YES]; + + int rc = 0x00; + sqlite3_stmt *pStmt = 0x00; + FMStatement *cachedStmt = 0x00; + + if (traceExecution && sql) { + NSLog(@"%@ executeUpdate: %@", self, sql); + } + + if (shouldCacheStatements) { + cachedStmt = [self cachedStatementForQuery:sql]; + pStmt = cachedStmt ? [cachedStmt statement] : 0x00; + } + + int numberOfRetries = 0; + BOOL retry = NO; + + if (!pStmt) { + + do { + retry = NO; + rc = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0); + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + retry = YES; + usleep(20); + + if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) { + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]); + NSLog(@"Database busy"); + sqlite3_finalize(pStmt); + [self setInUse:NO]; + return NO; + } + } + else if (SQLITE_OK != rc) { + + + if (logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); +#ifndef NS_BLOCK_ASSERTIONS + if (crashOnErrors) { + NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + } +#endif + } + + sqlite3_finalize(pStmt); + [self setInUse:NO]; + + if (outErr) { + *outErr = [NSError errorWithDomain:[NSString stringWithUTF8String:sqlite3_errmsg(db)] code:rc userInfo:nil]; + } + + return NO; + } + } + while (retry); + } + + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); + + while (idx < queryCount) { + + if (arrayArgs) { + obj = [arrayArgs objectAtIndex:idx]; + } + else { + obj = va_arg(args, id); + } + + + if (traceExecution) { + NSLog(@"obj: %@", obj); + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + + if (idx != queryCount) { + NSLog(@"Error: the bind count is not correct for the # of variables (%@) (executeUpdate)", sql); + sqlite3_finalize(pStmt); + [self setInUse:NO]; + return NO; + } + + /* Call sqlite3_step() to run the virtual machine. Since the SQL being + ** executed is not a SELECT statement, we assume no data will be returned. + */ + numberOfRetries = 0; + do { + rc = sqlite3_step(pStmt); + retry = NO; + + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + // this will happen if the db is locked, like if we are doing an update or insert. + // in that case, retry the step... and maybe wait just 10 milliseconds. + retry = YES; + if (SQLITE_LOCKED == rc) { + rc = sqlite3_reset(pStmt); + if (rc != SQLITE_LOCKED) { + NSLog(@"Unexpected result from sqlite3_reset (%d) eu", rc); + } + } + usleep(20); + + if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) { + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]); + NSLog(@"Database busy"); + retry = NO; + } + } + else if (SQLITE_DONE == rc || SQLITE_ROW == rc) { + // all is well, let's return. + } + else if (SQLITE_ERROR == rc) { + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_ERROR", rc, sqlite3_errmsg(db)); + NSLog(@"DB Query: %@", sql); + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_MISUSE", rc, sqlite3_errmsg(db)); + NSLog(@"DB Query: %@", sql); + } + else { + // wtf? + NSLog(@"Unknown error calling sqlite3_step (%d: %s) eu", rc, sqlite3_errmsg(db)); + NSLog(@"DB Query: %@", sql); + } + + } while (retry); + + assert( rc!=SQLITE_ROW ); + + + if (shouldCacheStatements && !cachedStmt) { + cachedStmt = [[FMStatement alloc] init]; + + [cachedStmt setStatement:pStmt]; + + [self setCachedStatement:cachedStmt forQuery:sql]; + + [cachedStmt release]; + } + + if (cachedStmt) { + cachedStmt.useCount = cachedStmt.useCount + 1; + rc = sqlite3_reset(pStmt); + } + else { + /* Finalize the virtual machine. This releases all memory and other + ** resources allocated by the sqlite3_prepare() call above. + */ + rc = sqlite3_finalize(pStmt); + } + + [self setInUse:NO]; + + return (rc == SQLITE_OK); +} + + +- (BOOL)executeUpdate:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + BOOL result = [self executeUpdate:sql error:nil withArgumentsInArray:nil orVAList:args]; + + va_end(args); + return result; +} + + + +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeUpdate:sql error:nil withArgumentsInArray:arguments orVAList:nil]; +} + +- (BOOL)update:(NSString*)sql error:(NSError**)outErr bind:(id)bindArgs, ... { + va_list args; + va_start(args, bindArgs); + + BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orVAList:args]; + + va_end(args); + return result; +} + +- (BOOL)rollback { + BOOL b = [self executeUpdate:@"ROLLBACK TRANSACTION;"]; + if (b) { + inTransaction = NO; + } + return b; +} + +- (BOOL)commit { + BOOL b = [self executeUpdate:@"COMMIT TRANSACTION;"]; + if (b) { + inTransaction = NO; + } + return b; +} + +- (BOOL)beginDeferredTransaction { + BOOL b = [self executeUpdate:@"BEGIN DEFERRED TRANSACTION;"]; + if (b) { + inTransaction = YES; + } + return b; +} + +- (BOOL)beginTransaction { + BOOL b = [self executeUpdate:@"BEGIN EXCLUSIVE TRANSACTION;"]; + if (b) { + inTransaction = YES; + } + return b; +} + +- (BOOL)logsErrors { + return logsErrors; +} +- (void)setLogsErrors:(BOOL)flag { + logsErrors = flag; +} + +- (BOOL)crashOnErrors { + return crashOnErrors; +} +- (void)setCrashOnErrors:(BOOL)flag { + crashOnErrors = flag; +} + +- (BOOL)inUse { + return inUse || inTransaction; +} + +- (void)setInUse:(BOOL)b { + inUse = b; +} + +- (BOOL)inTransaction { + return inTransaction; +} +- (void)setInTransaction:(BOOL)flag { + inTransaction = flag; +} + +- (BOOL)traceExecution { + return traceExecution; +} +- (void)setTraceExecution:(BOOL)flag { + traceExecution = flag; +} + +- (BOOL)checkedOut { + return checkedOut; +} +- (void)setCheckedOut:(BOOL)flag { + checkedOut = flag; +} + + +- (int)busyRetryTimeout { + return busyRetryTimeout; +} +- (void)setBusyRetryTimeout:(int)newBusyRetryTimeout { + busyRetryTimeout = newBusyRetryTimeout; +} + + +- (BOOL)shouldCacheStatements { + return shouldCacheStatements; +} + +- (void)setShouldCacheStatements:(BOOL)value { + + shouldCacheStatements = value; + + if (shouldCacheStatements && !cachedStatements) { + [self setCachedStatements:[NSMutableDictionary dictionary]]; + } + + if (!shouldCacheStatements) { + [self setCachedStatements:nil]; + } +} + +- (NSMutableDictionary *)cachedStatements { + return cachedStatements; +} + +- (void)setCachedStatements:(NSMutableDictionary *)value { + if (cachedStatements != value) { + [cachedStatements release]; + cachedStatements = [value retain]; + } +} + + +@end + + + +@implementation FMStatement + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + [query release]; + [super dealloc]; +} + + +- (void)close { + if (statement) { + sqlite3_finalize(statement); + statement = 0x00; + } +} + +- (void)reset { + if (statement) { + sqlite3_reset(statement); + } +} + +- (sqlite3_stmt *)statement { + return statement; +} + +- (void)setStatement:(sqlite3_stmt *)value { + statement = value; +} + +- (NSString *)query { + return query; +} + +- (void)setQuery:(NSString *)value { + if (query != value) { + [query release]; + query = [value retain]; + } +} + +- (long)useCount { + return useCount; +} + +- (void)setUseCount:(long)value { + if (useCount != value) { + useCount = value; + } +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ %d hit(s) for query %@", [super description], useCount, query]; +} + + +@end + diff --git a/Classes/FMDatabaseAdditions.h b/Classes/FMDatabaseAdditions.h new file mode 100644 index 0000000..3846268 --- /dev/null +++ b/Classes/FMDatabaseAdditions.h @@ -0,0 +1,31 @@ +// +// FMDatabaseAdditions.h +// fmkit +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import +@interface FMDatabase (FMDatabaseAdditions) + + +- (int)intForQuery:(NSString*)objs, ...; +- (long)longForQuery:(NSString*)objs, ...; +- (BOOL)boolForQuery:(NSString*)objs, ...; +- (double)doubleForQuery:(NSString*)objs, ...; +- (NSString*)stringForQuery:(NSString*)objs, ...; +- (NSData*)dataForQuery:(NSString*)objs, ...; +- (NSDate*)dateForQuery:(NSString*)objs, ...; + +// Notice that there's no dataNoCopyForQuery:. +// That would be a bad idea, because we close out the result set, and then what +// happens to the data that we just didn't copy? Who knows, not I. + + +- (BOOL)tableExists:(NSString*)tableName; +- (FMResultSet*)getSchema; +- (FMResultSet*)getTableSchema:(NSString*)tableName; +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName; + +@end diff --git a/Classes/FMDatabaseAdditions.m b/Classes/FMDatabaseAdditions.m new file mode 100644 index 0000000..3ac45cb --- /dev/null +++ b/Classes/FMDatabaseAdditions.m @@ -0,0 +1,114 @@ +// +// FMDatabaseAdditions.m +// fmkit +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import "FMDatabase.h" +#import "FMDatabaseAdditions.h" + +@implementation FMDatabase (FMDatabaseAdditions) + +#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel) \ +va_list args; \ +va_start(args, query); \ +FMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orVAList:args]; \ +va_end(args); \ +if (![resultSet next]) { return (type)0; } \ +type ret = [resultSet sel:0]; \ +[resultSet close]; \ +[resultSet setParentDB:nil]; \ +return ret; + + +- (NSString*)stringForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex); +} + +- (int)intForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex); +} + +- (long)longForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex); +} + +- (BOOL)boolForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex); +} + +- (double)doubleForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex); +} + +- (NSData*)dataForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex); +} + +- (NSDate*)dateForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex); +} + + +//check if table exist in database (patch from OZLB) +- (BOOL)tableExists:(NSString*)tableName { + + BOOL returnBool; + //lower case table name + tableName = [tableName lowercaseString]; + //search in sqlite_master table if table exists + FMResultSet *rs = [self executeQuery:@"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?", tableName]; + //if at least one next exists, table exists + returnBool = [rs next]; + //close and free object + [rs close]; + + return returnBool; +} + +//get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] +//check if table exist in database (patch from OZLB) +- (FMResultSet*)getSchema { + + //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] + 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"]; + + return rs; +} + +//get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] +- (FMResultSet*)getTableSchema:(NSString*)tableName { + + //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] + FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @"PRAGMA table_info(%@)", tableName]]; + + return rs; +} + + +//check if column exist in table +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName { + + BOOL returnBool = NO; + //lower case table name + tableName = [tableName lowercaseString]; + //lower case column name + columnName = [columnName lowercaseString]; + //get table schema + FMResultSet *rs = [self getTableSchema: tableName]; + //check if column is present in table schema + while ([rs next]) { + if ([[[rs stringForColumn:@"name"] lowercaseString] isEqualToString: columnName]) { + returnBool = YES; + break; + } + } + //close and free object + [rs close]; + + return returnBool; +} + +@end diff --git a/Classes/FMResultSet.h b/Classes/FMResultSet.h new file mode 100644 index 0000000..306676e --- /dev/null +++ b/Classes/FMResultSet.h @@ -0,0 +1,93 @@ +#import +#import "sqlite3.h" + +#ifndef __has_feature // Optional. +#define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +#ifndef NS_RETURNS_NOT_RETAINED +#if __has_feature(attribute_ns_returns_not_retained) +#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) +#else +#define NS_RETURNS_NOT_RETAINED +#endif +#endif + +@class FMDatabase; +@class FMStatement; + +@interface FMResultSet : NSObject { + FMDatabase *parentDB; + FMStatement *statement; + + NSString *query; + NSMutableDictionary *columnNameToIndexMap; + BOOL columnNamesSetup; +} + + ++ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB; + +- (void)close; + +- (NSString *)query; +- (void)setQuery:(NSString *)value; + +- (FMStatement *)statement; +- (void)setStatement:(FMStatement *)value; + +- (void)setParentDB:(FMDatabase *)newDb; + +- (BOOL)next; +- (BOOL)hasAnotherRow; + +- (int)columnIndexForName:(NSString*)columnName; +- (NSString*)columnNameForIndex:(int)columnIdx; + +- (int)intForColumn:(NSString*)columnName; +- (int)intForColumnIndex:(int)columnIdx; + +- (long)longForColumn:(NSString*)columnName; +- (long)longForColumnIndex:(int)columnIdx; + +- (long long int)longLongIntForColumn:(NSString*)columnName; +- (long long int)longLongIntForColumnIndex:(int)columnIdx; + +- (BOOL)boolForColumn:(NSString*)columnName; +- (BOOL)boolForColumnIndex:(int)columnIdx; + +- (double)doubleForColumn:(NSString*)columnName; +- (double)doubleForColumnIndex:(int)columnIdx; + +- (NSString*)stringForColumn:(NSString*)columnName; +- (NSString*)stringForColumnIndex:(int)columnIdx; + +- (NSDate*)dateForColumn:(NSString*)columnName; +- (NSDate*)dateForColumnIndex:(int)columnIdx; + +- (NSData*)dataForColumn:(NSString*)columnName; +- (NSData*)dataForColumnIndex:(int)columnIdx; + +- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx; +- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName; + +// returns one of NSNumber, NSString, NSData, or NSNull +- (id)objectForColumnIndex:(int)columnIdx; +- (id)objectForColumnName:(NSString*)columnName; + +/* +If you are going to use this data after you iterate over the next row, or after you close the +result set, make sure to make a copy of the data first (or just use dataForColumn:/dataForColumnIndex:) +If you don't, you're going to be in a world of hurt when you try and use the data. +*/ +- (NSData*)dataNoCopyForColumn:(NSString*)columnName NS_RETURNS_NOT_RETAINED; +- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED; + + +- (BOOL)columnIndexIsNull:(int)columnIdx; +- (BOOL)columnIsNull:(NSString*)columnName; + +- (void)kvcMagic:(id)object; +- (NSDictionary *)resultDict; + +@end diff --git a/Classes/FMResultSet.m b/Classes/FMResultSet.m new file mode 100644 index 0000000..027257e --- /dev/null +++ b/Classes/FMResultSet.m @@ -0,0 +1,405 @@ +#import "FMResultSet.h" +#import "FMDatabase.h" +#import "unistd.h" + +@interface FMDatabase () +- (void)resultSetDidClose:(FMResultSet *)resultSet; +@end + + +@interface FMResultSet (Private) +- (NSMutableDictionary *)columnNameToIndexMap; +- (void)setColumnNameToIndexMap:(NSMutableDictionary *)value; +@end + +@implementation FMResultSet + ++ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB { + + FMResultSet *rs = [[FMResultSet alloc] init]; + + [rs setStatement:statement]; + [rs setParentDB:aDB]; + + return [rs autorelease]; +} + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + + [query release]; + query = nil; + + [columnNameToIndexMap release]; + columnNameToIndexMap = nil; + + [super dealloc]; +} + +- (void)close { + [statement reset]; + [statement release]; + statement = nil; + + // we don't need this anymore... (i think) + //[parentDB setInUse:NO]; + [parentDB resultSetDidClose:self]; + parentDB = nil; +} + +- (void)setupColumnNames { + + if (!columnNameToIndexMap) { + [self setColumnNameToIndexMap:[NSMutableDictionary dictionary]]; + } + + int columnCount = sqlite3_column_count(statement.statement); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + [columnNameToIndexMap setObject:[NSNumber numberWithInt:columnIdx] + forKey:[[NSString stringWithUTF8String:sqlite3_column_name(statement.statement, columnIdx)] lowercaseString]]; + } + columnNamesSetup = YES; +} + +- (void)kvcMagic:(id)object { + + int columnCount = sqlite3_column_count(statement.statement); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + + const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx); + + // check for a null row + if (c) { + NSString *s = [NSString stringWithUTF8String:c]; + + [object setValue:s forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement.statement, columnIdx)]]; + } + } +} + +- (NSDictionary *)resultDict { + + int num_cols = sqlite3_data_count(statement.statement); + + if (num_cols > 0) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols]; + + if (!columnNamesSetup) { + [self setupColumnNames]; + } + + NSEnumerator *columnNames = [columnNameToIndexMap keyEnumerator]; + NSString *columnName = nil; + while ((columnName = [columnNames nextObject])) { + id objectValue = [self objectForColumnName:columnName]; + [dict setObject:objectValue forKey:columnName]; + } + + return [[dict copy] autorelease]; + } + else { + NSLog(@"Warning: There seem to be no columns in this set."); + } + + return nil; +} + +- (BOOL)next { + + int rc; + BOOL retry; + int numberOfRetries = 0; + do { + retry = NO; + + rc = sqlite3_step(statement.statement); + + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + // this will happen if the db is locked, like if we are doing an update or insert. + // in that case, retry the step... and maybe wait just 10 milliseconds. + retry = YES; + if (SQLITE_LOCKED == rc) { + rc = sqlite3_reset(statement.statement); + if (rc != SQLITE_LOCKED) { + NSLog(@"Unexpected result from sqlite3_reset (%d) rs", rc); + } + } + usleep(20); + + if ([parentDB busyRetryTimeout] && (numberOfRetries++ > [parentDB busyRetryTimeout])) { + + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [parentDB databasePath]); + NSLog(@"Database busy"); + break; + } + } + else if (SQLITE_DONE == rc || SQLITE_ROW == rc) { + // all is well, let's return. + } + else if (SQLITE_ERROR == rc) { + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle])); + break; + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle])); + break; + } + else { + // wtf? + NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle])); + break; + } + + } while (retry); + + + if (rc != SQLITE_ROW) { + [self close]; + } + + return (rc == SQLITE_ROW); +} + +- (BOOL)hasAnotherRow { + return sqlite3_errcode([parentDB sqliteHandle]) == SQLITE_ROW; +} + +- (int)columnIndexForName:(NSString*)columnName { + + if (!columnNamesSetup) { + [self setupColumnNames]; + } + + columnName = [columnName lowercaseString]; + + NSNumber *n = [columnNameToIndexMap objectForKey:columnName]; + + if (n) { + return [n intValue]; + } + + NSLog(@"Warning: I could not find the column named '%@'.", columnName); + + return -1; +} + + + +- (int)intForColumn:(NSString*)columnName { + return [self intForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (int)intForColumnIndex:(int)columnIdx { + return sqlite3_column_int(statement.statement, columnIdx); +} + +- (long)longForColumn:(NSString*)columnName { + return [self longForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long)longForColumnIndex:(int)columnIdx { + return (long)sqlite3_column_int64(statement.statement, columnIdx); +} + +- (long long int)longLongIntForColumn:(NSString*)columnName { + return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long long int)longLongIntForColumnIndex:(int)columnIdx { + return sqlite3_column_int64(statement.statement, columnIdx); +} + +- (BOOL)boolForColumn:(NSString*)columnName { + return [self boolForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (BOOL)boolForColumnIndex:(int)columnIdx { + return ([self intForColumnIndex:columnIdx] != 0); +} + +- (double)doubleForColumn:(NSString*)columnName { + return [self doubleForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (double)doubleForColumnIndex:(int)columnIdx { + return sqlite3_column_double(statement.statement, columnIdx); +} + +- (NSString*)stringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx); + + if (!c) { + // null row. + return nil; + } + + return [NSString stringWithUTF8String:c]; +} + +- (NSString*)stringForColumn:(NSString*)columnName { + return [self stringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumn:(NSString*)columnName { + return [self dateForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]]; +} + + +- (NSData*)dataForColumn:(NSString*)columnName { + return [self dataForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + int dataSize = sqlite3_column_bytes(statement.statement, columnIdx); + + NSMutableData *data = [NSMutableData dataWithLength:dataSize]; + + memcpy([data mutableBytes], sqlite3_column_blob(statement.statement, columnIdx), dataSize); + + return data; +} + + +- (NSData*)dataNoCopyForColumn:(NSString*)columnName { + return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + int dataSize = sqlite3_column_bytes(statement.statement, columnIdx); + + NSData *data = [NSData dataWithBytesNoCopy:(void *)sqlite3_column_blob(statement.statement, columnIdx) length:dataSize freeWhenDone:NO]; + + return data; +} + + +- (BOOL)columnIndexIsNull:(int)columnIdx { + return sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL; +} + +- (BOOL)columnIsNull:(NSString*)columnName { + return [self columnIndexIsNull:[self columnIndexForName:columnName]]; +} + +- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + return sqlite3_column_text(statement.statement, columnIdx); +} + +- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName { + return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (id)objectForColumnIndex:(int)columnIdx { + int columnType = sqlite3_column_type(statement.statement, columnIdx); + + id returnValue = nil; + + if (columnType == SQLITE_INTEGER) { + returnValue = [NSNumber numberWithLongLong:[self longLongIntForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_FLOAT) { + returnValue = [NSNumber numberWithDouble:[self doubleForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_BLOB) { + returnValue = [self dataForColumnIndex:columnIdx]; + } + else { + //default to a string for everything else + returnValue = [self stringForColumnIndex:columnIdx]; + } + + if (returnValue == nil) { + returnValue = [NSNull null]; + } + + return returnValue; +} + +- (id)objectForColumnName:(NSString*)columnName { + return [self objectForColumnIndex:[self columnIndexForName:columnName]]; +} + + +// returns autoreleased NSString containing the name of the column in the result set +- (NSString*)columnNameForIndex:(int)columnIdx { + return [NSString stringWithUTF8String: sqlite3_column_name(statement.statement, columnIdx)]; +} + +- (void)setParentDB:(FMDatabase *)newDb { + parentDB = newDb; +} + + +- (NSString *)query { + return query; +} + +- (void)setQuery:(NSString *)value { + [value retain]; + [query release]; + query = value; +} + +- (NSMutableDictionary *)columnNameToIndexMap { + return columnNameToIndexMap; +} + +- (void)setColumnNameToIndexMap:(NSMutableDictionary *)value { + [value retain]; + [columnNameToIndexMap release]; + columnNameToIndexMap = value; +} + +- (FMStatement *)statement { + return statement; +} + +- (void)setStatement:(FMStatement *)value { + if (statement != value) { + [statement release]; + statement = [value retain]; + } +} + + + +@end diff --git a/Classes/PicCastAppDelegate.h b/Classes/PicCastAppDelegate.h index a0efe4d..1085903 100644 --- a/Classes/PicCastAppDelegate.h +++ b/Classes/PicCastAppDelegate.h @@ -18,4 +18,6 @@ @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; ++ (NSString *) getDatabasePath; + @end diff --git a/Classes/PicCastAppDelegate.m b/Classes/PicCastAppDelegate.m index ab242ec..f44c6eb 100644 --- a/Classes/PicCastAppDelegate.m +++ b/Classes/PicCastAppDelegate.m @@ -32,6 +32,16 @@ @synthesize navigationController; +//- (void)initialize { +// [[NSUserDefaults standardUserDefaults] +// registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys: +// NULL, @"facebookToken", +// NULL, @"facebookExpirationDate", +// NULL, @"twitterToken", +// [NSNumber numberWithBool:NO], @"haveSearched", +// nil]]; +//} + #pragma mark - #pragma mark Application lifecycle @@ -110,6 +120,41 @@ */ } +#pragma mark - +#pragma mark CustomSheeyit + +//+ (void) prompt:(NSString *)title withMessage:(NSString *)message andButtonTitle:(NSString *)buttonTitle withDelegate:(id)delegate { +// UIAlertView *prompt = [UIAlertView alloc]; +// prompt = [prompt initWithTitle:title message:message delegate:delegate cancelButtonTitle:buttonTitle otherButtonTitles:nil]; +// [prompt show]; +// [prompt release]; +//} +// +//+ (void) prompt:(NSString *)title withMessage:(NSString *)message andButtonTitle:(NSString *)buttonTitle { +// [self prompt:title withMessage:message andButtonTitle:buttonTitle withDelegate:self]; +//} +// +//- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { +// return [facebook handleOpenURL:url]; +//} + ++ (NSString *) getDatabasePath { + NSString *databaseName = @"PicCastSqlTable.db"; + + NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDir = [documentPaths objectAtIndex:0]; + NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; + + NSFileManager *fileManager = [NSFileManager defaultManager]; + + if(![fileManager fileExistsAtPath:databasePath]) { + NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; + [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; + } + + return databasePath; +} + #pragma mark - #pragma mark UITabBarControllerDelegate methods diff --git a/Classes/SectionDictionary.h b/Classes/SectionDictionary.h new file mode 100644 index 0000000..f227e44 --- /dev/null +++ b/Classes/SectionDictionary.h @@ -0,0 +1,23 @@ +// +// SectionDictionary.h +// PicCast +// +// Created by Matthew Handler on 4/23/11. +// Copyright 2011 Earl Industries. All rights reserved. +// + +#import + + +@interface SectionDictionary : NSObject { + NSInteger index; + NSMutableDictionary *indexMap; + NSMutableDictionary *theRealDictionary; +} + +- (void) appendObject:(id)anObject forKey:(id)aKey; +- (void) setObject:(id)anObject forKey:(id)aKey; +- (id) objectForIndex:(NSInteger)i; +- (NSString *) keyForIndex:(NSInteger)i; + +@end diff --git a/Classes/SectionDictionary.m b/Classes/SectionDictionary.m new file mode 100644 index 0000000..8845b2b --- /dev/null +++ b/Classes/SectionDictionary.m @@ -0,0 +1,64 @@ +// +// SectionDictionary.m +// PicCast +// +// Created by Matthew Handler on 4/23/11. +// Copyright 2011 Earl Industries. All rights reserved. +// + +#import "SectionDictionary.h" + + +@implementation SectionDictionary + +//@synthesize index; + +- (SectionDictionary *) init { + index = 0; + indexMap = [[[NSMutableDictionary alloc] init] retain]; + theRealDictionary = [[[NSMutableDictionary alloc] init] retain]; + [super init]; + + return self; +} + +- (id)forwardingTargetForSelector:(SEL)aSelector +{ + return theRealDictionary; +} + +- (void) setObject:(id)anObject forKey:(id)aKey { + [indexMap setObject:aKey forKey:[NSString stringWithFormat:@"%d", index]]; + index++; + [theRealDictionary setObject:anObject forKey:aKey]; +} + +// lets you push objects into sections without worry about storage +- (void) appendObject:(id)anObject forKey:(id)aKey { + NSMutableArray *store = [theRealDictionary objectForKey:aKey]; + if (store == nil) { + NSMutableArray *store = [[[NSMutableArray alloc] init] autorelease]; + [store addObject:anObject]; + [theRealDictionary setObject:store forKey:aKey]; + } + else [store addObject:anObject]; + + NSLog(@"number of rows: %d", [[theRealDictionary objectForKey:aKey] count]); +} + +- (id) objectForIndex:(NSInteger)i { + return [theRealDictionary objectForKey:[indexMap objectForKey:[NSString stringWithFormat:@"%d", i]]]; +} + +- (NSString *) keyForIndex:(NSInteger)i { + return [indexMap objectForKey:[NSString stringWithFormat:@"%d", i]]; +} + +- (void) dealloc { + [theRealDictionary release]; + [indexMap release]; + [super dealloc]; +} + + +@end diff --git a/Classes/Topic.h b/Classes/Topic.h index 2ae6520..26f8c29 100644 --- a/Classes/Topic.h +++ b/Classes/Topic.h @@ -5,14 +5,13 @@ // Created by Matthew Handler on 4/16/11. // Copyright 2011 Earl Industries. All rights reserved. // - +#import "FMResultSet.h" #import @interface Topic : NSObject { NSString *title; - NSString *creator; NSString *description; NSDate *releaseDate; NSString *category; @@ -25,10 +24,13 @@ @property (nonatomic, copy) NSNumber *picCount; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *guid; -@property (nonatomic, copy) NSString *creator; @property (nonatomic, copy) NSString *description; @property (nonatomic, copy) NSDate *releaseDate; @property (nonatomic, copy) NSString *category; @property (nonatomic, copy) NSString *iconUrl; ++ (Topic *) initFromDatabaseRow:(FMResultSet *)result; ++ (NSString *) dateToString:(NSDate *)date; ++ (NSDate *) stringToDate:(NSString *)string; + @end diff --git a/Classes/Topic.m b/Classes/Topic.m index 712519b..65ea506 100644 --- a/Classes/Topic.m +++ b/Classes/Topic.m @@ -7,17 +7,69 @@ // #import "Topic.h" - +#import "FMDatabase.h" +#import "FMResultSet.h" @implementation Topic -@synthesize title, guid, creator, iconUrl, description, releaseDate, category, picCount; +@synthesize guid, title, iconUrl, description, releaseDate, category, picCount; + ++ (Topic *) initFromDatabaseRow:(FMResultSet *)result { + NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [dateFormatter setDateStyle:NSDateFormatterLongStyle]; + [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; + [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]]; + + Topic *topic = [[[Topic alloc] init] autorelease]; + + topic.guid = [result stringForColumn:@"link"]; + topic.title = [result stringForColumn:@"title"]; + topic.iconUrl = [result stringForColumn:@"iconUrl"]; + topic.description = [result stringForColumn:@"description"]; + topic.releaseDate = [Topic stringToDate:[result stringForColumn:@"releaseDate"]]; + topic.category = [result stringForColumn:@"category"]; + topic.picCount = [result intForColumn:@"picCount"]; + + return topic; +} + ++ (NSString *) dateToString:(NSDate *)date { + NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [dateFormatter setDateStyle:NSDateFormatterLongStyle]; + [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; + [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]]; + + return [dateFormatter stringFromDate:date]; +} + ++ (NSDate *) stringToDate:(NSString *)string { + NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [dateFormatter setDateStyle:NSDateFormatterLongStyle]; + [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; + [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]]; + + return [dateFormatter dateFromString:string]; +} + +- (void)serializeToDatabase:(FMDatabase *)db { + //NSLog(@"title: %@", title); + [db executeUpdate:@"INSERT INTO picCasts \ + (foreignId, link, title, description, releaseDate, category, iconUrl, picCount) \ + VALUES \ + (?, ?, ?, ?, ?, ?, ?, ?)", + 12, guid, title, description, [Topic dateToString:releaseDate], category, picCount]; + //NSLog(@"insert id:%d error: %@", [db lastInsertRowId], [db lastErrorMessage]); + + // [NSString stringWithFormat:@"number %d", i], + // [NSNumber numberWithInt:i], + // [NSDate date], + // [NSNumber numberWithFloat:2.2f]]; +} - (void)dealloc { [picCount release]; [guid release]; [title release]; - [creator release]; [description release]; [releaseDate release]; [category release]; diff --git a/Classes/TopicsViewController.h b/Classes/TopicsViewController.h index fac4e7d..c6de22f 100644 --- a/Classes/TopicsViewController.h +++ b/Classes/TopicsViewController.h @@ -12,14 +12,17 @@ //#import "PicDumpViewController.h" #import "SourcesEditViewController.h" #import "PhotoViewController.h" +#import "FMDatabase.h" +#import "SectionDictionary.h" @interface TopicsViewController : UIViewController { UINavigationController *topicsNavigationController; - NSMutableArray *topics; -// PicDumpViewController *picDumpViewController; + NSMutableArray *topics; // topics loaded from the web + SectionDictionary *tableDictionary; // structure to sync with table PhotoViewController *photoViewController; XMLParser *parser; HJObjManager* objMan; + FMDatabase* db; } - (IBAction)showSources:(id)sender; diff --git a/Classes/TopicsViewController.m b/Classes/TopicsViewController.m index 8bd4531..2548bf3 100644 --- a/Classes/TopicsViewController.m +++ b/Classes/TopicsViewController.m @@ -16,6 +16,9 @@ #import "HJObjManager.h" #import "HJManagedImageV.h" #import "SourcesEditViewController.h" +#import "SectionDictionary.h" +#import "FMDatabase.h" +#import "FMResultSet.h" @implementation TopicsViewController @@ -46,9 +49,87 @@ fileCache.fileAgeLimit = 60*60*24*7; //1 week [fileCache trimCacheUsingBackgroundThread]; + tableDictionary = [[[SectionDictionary alloc] init] retain]; + + NSString *path = [[NSBundle mainBundle] pathForResource:@"SampleDB" ofType:@"sqlite"]; + FMDatabase *db = [[FMDatabase alloc] initWithPath:path]; + [db open]; + + [self getTopicsFromDb]; + [self startParsing]; } +- (void) getTopicsFromDb { + // grab topics + FMResultSet *fResult= [db executeQuery:@"SELECT * FROM picCasts"]; //order by date, limite _max + + // put into sections + while([fResult next]) + { + [self addTopicToSectionDictionary:[Topic initFromDatabaseRow:fResult]]; + + } + [fResult close]; + + // put into data structure +} + +- (void) addTopicToSectionDictionary:(Topic *)topic { + NSLog(@"days apart: %d", [self daysApart:topic.releaseDate]); + switch ((int)[self daysApart:topic.releaseDate]) { + case 0: + [tableDictionary appendObject:topic forKey:@"Today"]; + break; + case 1: + [tableDictionary appendObject:topic forKey:@"Yesterday"]; + break; + default: + [tableDictionary appendObject:topic forKey:[Topic dateToString:topic.releaseDate]]; + break; + } +} + +//- (void) addTopic:(FMResultSet *)result forKey:(NSString *)key { +// NSMutableArray *store = [tableDictionary objectForKey:key]; +// if (store == nil) { +// NSMutableArray *store = [[[NSMutableArray alloc] init] autorelease]; +// [tableDictionary setObject:store forKey:key]; +// } +// [store addObject:result]; +//} + +- (NSTimeInterval) daysApart:(NSDate *)date { + //NSLog(@"datestring: %@", [Topic dateToString:date]); + NSDate *today = [NSDate date]; + +// NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; +// [dateFormatter setDateFormat:@"yyyy-MM-dd"]; +// NSDate *published = [dateFormatter dateFromString:string]; + + return [today timeIntervalSinceDate:date]; +} + +// called after parsing is finished +- (void) updateTopicsFromWeb:(NSArray *)parsedTopics { + // add topics to sql + [db beginTransaction]; + for (Topic *topic in parsedTopics) { + // if topic is already in database + FMResultSet *rs = [db executeQuery:@"SELECT id FROM picCasts WHERE foreignId = ?", 10]; + if (![rs hasAnotherRow]) { + [topic serializeToDatabase:db]; + // add topics to structure + [self addTopicToSectionDictionary:topic]; + } + } + [db commit]; +// NSLog(@"%@", [db lastErrorMessage]); +// NSLog(@"%d", [db lastInsertRowId]); + // tell table to animate things being added + [self.tableView reloadData]; +} + - (void) sourcesEditViewControllerDidFinish:(SourcesEditViewController *)controller { [self dismissModalViewControllerAnimated:YES]; @@ -118,7 +199,8 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. - return 2; + NSLog(@"number of sections: %d", [tableDictionary count]); + return [tableDictionary count]; } #pragma mark - @@ -138,14 +220,13 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. - return [topics count]; + NSLog(@"number of rows in section %d: %d", section, [[tableDictionary objectForIndex:section] count]); + return [[tableDictionary objectForIndex:section] count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - if (section == 0) - return @"Today"; - else - return @"Yesterday"; + NSLog(@"row title: %@", [tableDictionary keyForIndex:section]); + return [tableDictionary keyForIndex:section]; //how do you convert a key to index from mutabledictionary } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { @@ -258,7 +339,7 @@ } - (void)parser:(XMLParser *)parser didParseTopics:(NSArray *)parsedTopics { - [topics addObjectsFromArray:parsedTopics]; + [self updateTopicsFromWeb:parsedTopics]; // Three scroll view properties are checked to keep the user interface smooth during parse. When new objects are delivered // by the parser, the table view is reloaded to display them. If the table is reloaded while @@ -291,6 +372,7 @@ } - (void)dealloc { + [tableDictionary release]; [objMan release]; [topics release]; //[detailController release]; diff --git a/Classes/fmdb_Prefix.pch b/Classes/fmdb_Prefix.pch new file mode 100644 index 0000000..b8c83c3 --- /dev/null +++ b/Classes/fmdb_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'fmdb' target in the 'fmdb' project. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/PicCast.xcodeproj/handler.mode1v3 b/PicCast.xcodeproj/handler.mode1v3 index 3c79e35..70c857b 100644 --- a/PicCast.xcodeproj/handler.mode1v3 +++ b/PicCast.xcodeproj/handler.mode1v3 @@ -265,7 +265,8 @@ 29B97314FDCFA39411CA2CEA 080E96DDFE201D6D7F000001 - 4ECFB853135FD22C007FAB8D + 4EB53E6513634D4E009A5AC5 + 4E68283013594C50001EB808 29B97323FDCFA39411CA2CEA 1C37FBAC04509CD000000102 1CC0EA4004350EF90041110B @@ -274,12 +275,13 @@ 24 - 3 + 16 + 4 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 166}, {282, 667}} + {{0, 0}, {282, 667}} PBXTopSmartGroupGIDs @@ -298,7 +300,7 @@ 282 RubberWindowFrame - 51 129 1268 726 0 0 1440 878 + 115 90 1268 726 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -316,7 +318,7 @@ PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel - TopicsViewController.m + SectionDictionary.m PBXSplitModuleInNavigatorKey Split0 @@ -324,18 +326,16 @@ PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel - TopicsViewController.m + SectionDictionary.m _historyCapacity 0 bookmark - 4E8CFE5313622A7900B810C6 + 4EB540071364FED6009A5AC5 history 4E68286F1359595F001EB808 4ED6DB46135A1FCE00BEF0B7 4ED6DC28135B365F00BEF0B7 - 4ED6DC2A135B365F00BEF0B7 - 4ED6DC2B135B365F00BEF0B7 4ED6DC94135BD95000BEF0B7 4EA96020135CF43B009243EE 4EA96027135CF455009243EE @@ -352,7 +352,6 @@ 4EBFCBE51360FD85005AC5CC 4E067D391361413100D43FE0 4E067D3A1361413100D43FE0 - 4E067D3B1361413100D43FE0 4E8CFDB41361F7C900B810C6 4E8CFDB61361F7C900B810C6 4E8CFDB71361F7C900B810C6 @@ -364,9 +363,20 @@ 4E8CFE301362039700B810C6 4E8CFE311362039700B810C6 4E8CFE3D136217F800B810C6 - 4E8CFE3E136217F800B810C6 - 4E8CFE4913622A3600B810C6 - 4E8CFE4A13622A3600B810C6 + 4EB53E9C1363581F009A5AC5 + 4EB53EF013637BF8009A5AC5 + 4EB53EF113637BF8009A5AC5 + 4EB53F5C1364ED0D009A5AC5 + 4EB53F5E1364ED0D009A5AC5 + 4EB53F5F1364ED0D009A5AC5 + 4EB53F6B1364EE56009A5AC5 + 4EB53F811364F105009A5AC5 + 4EB53FC71364F84B009A5AC5 + 4EB53FC81364F84B009A5AC5 + 4EB53FE81364FAEB009A5AC5 + 4EB53FE91364FAEB009A5AC5 + 4EB540061364FED6009A5AC5 + 4EB53FFF1364FDA0009A5AC5 SplitCount @@ -380,7 +390,7 @@ Frame {{0, 0}, {964, 680}} RubberWindowFrame - 51 129 1268 726 0 0 1440 878 + 115 90 1268 726 0 0 1440 878 Module PBXNavigatorGroup @@ -400,7 +410,7 @@ Frame {{0, 685}, {964, 0}} RubberWindowFrame - 51 129 1268 726 0 0 1440 878 + 115 90 1268 726 0 0 1440 878 Module XCDetailModule @@ -424,9 +434,9 @@ TableOfContents - 4E8CFD881361ECAE00B810C6 + 4EB53E9F1363581F009A5AC5 1CE0B1FE06471DED0097A5F4 - 4E8CFD891361ECAE00B810C6 + 4EB53EA01363581F009A5AC5 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -564,17 +574,17 @@ 5 WindowOrderList - 4E8CFE5413622A7900B810C6 + 4EB540081364FED6009A5AC5 1C530D57069F1CE1000CFCEE - 4E8CFDA41361EF4E00B810C6 - 4E8CFDA51361EF4E00B810C6 + 4EB53EA21363581F009A5AC5 + 4EB53EA31363581F009A5AC5 1CD10A99069EF8BA00B06720 4E6827C813593DE3001EB808 1C78EAAD065D492600B07095 /Users/handler/Documents/code/xCode/PicCast/PicCast.xcodeproj WindowString - 51 129 1268 726 0 0 1440 878 + 115 90 1268 726 0 0 1440 878 WindowToolsV3 @@ -595,7 +605,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - HJObjManager.m + AcidCowFeedburnerParser.m StatusBarVisibility @@ -653,7 +663,7 @@ TableOfContents 4E6827C813593DE3001EB808 - 4E8CFD8B1361ECAE00B810C6 + 4EB53E5C13634A24009A5AC5 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -775,13 +785,13 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 4E8CFD9D1361EF4E00B810C6 + 4EB53E5D13634A24009A5AC5 1C162984064C10D400B95A72 - 4E8CFD9E1361EF4E00B810C6 - 4E8CFD9F1361EF4E00B810C6 - 4E8CFDA01361EF4E00B810C6 - 4E8CFDA11361EF4E00B810C6 - 4E8CFDA21361EF4E00B810C6 + 4EB53E5E13634A24009A5AC5 + 4EB53E5F13634A24009A5AC5 + 4EB53E6013634A24009A5AC5 + 4EB53E6113634A24009A5AC5 + 4EB53E6213634A24009A5AC5 ToolbarConfiguration xcode.toolbar.config.debugV3 @@ -813,7 +823,7 @@ PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel - HJManagedImageV.h + TopicsViewController.m StatusBarVisibility @@ -871,8 +881,8 @@ TableOfContents 1C530D57069F1CE1000CFCEE - 4E8CFDAA1361F16200B810C6 - 4E8CFDAB1361F16200B810C6 + 4EB53EEA13637758009A5AC5 + 4EB53EEB13637758009A5AC5 1CDD528C0622207200134675 1CD0528E0623707200166675 @@ -937,7 +947,7 @@ TableOfContents 1C78EAAD065D492600B07095 - 4E8CFDA31361EF4E00B810C6 + 4EB53E6313634A24009A5AC5 1C78EAAC065D492600B07095 ToolbarConfiguration diff --git a/PicCast.xcodeproj/handler.pbxuser b/PicCast.xcodeproj/handler.pbxuser index 7ca1039..cc6e431 100644 --- a/PicCast.xcodeproj/handler.pbxuser +++ b/PicCast.xcodeproj/handler.pbxuser @@ -2,16 +2,16 @@ { 1D3623240D0F684500981E51 /* PicCastAppDelegate.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 413}}"; - sepNavSelRange = "{599, 0}"; - sepNavVisRange = "{0, 606}"; + sepNavIntBoundsRect = "{{0, 0}, {903, 600}}"; + sepNavSelRange = "{632, 0}"; + sepNavVisRange = "{0, 639}"; }; }; 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1965, 1937}}"; - sepNavSelRange = "{764, 0}"; - sepNavVisRange = "{2008, 2104}"; + sepNavIntBoundsRect = "{{0, 0}, {1965, 2431}}"; + sepNavSelRange = "{5831, 0}"; + sepNavVisRange = "{4442, 1711}"; }; }; 1D6058900D05DD3D006BFB54 /* PicCast */ = { @@ -91,121 +91,152 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 325184681; - PBXWorkspaceStateSaveDate = 325184681; + PBXPerProjectTemplateStateSaveDate = 325271649; + PBXWorkspaceStateSaveDate = 325271649; }; perUserProjectItems = { - 4E067D381361413100D43FE0 = 4E067D381361413100D43FE0 /* PBXTextBookmark */; 4E067D391361413100D43FE0 = 4E067D391361413100D43FE0 /* PBXTextBookmark */; 4E067D3A1361413100D43FE0 = 4E067D3A1361413100D43FE0 /* PBXTextBookmark */; 4E067D3B1361413100D43FE0 = 4E067D3B1361413100D43FE0 /* PBXTextBookmark */; - 4E067D3C1361413100D43FE0 = 4E067D3C1361413100D43FE0 /* PBXTextBookmark */; - 4E067D3D1361413100D43FE0 = 4E067D3D1361413100D43FE0 /* PBXTextBookmark */; - 4E067D401361413100D43FE0 = 4E067D401361413100D43FE0 /* PlistBookmark */; 4E68286F1359595F001EB808 = 4E68286F1359595F001EB808 /* PBXTextBookmark */; 4E759BF4135D31C500171031 = 4E759BF4135D31C500171031 /* PBXTextBookmark */; - 4E8CFD871361ECAE00B810C6 /* PBXTextBookmark */ = 4E8CFD871361ECAE00B810C6 /* PBXTextBookmark */; - 4E8CFD8A1361ECAE00B810C6 /* PlistBookmark */ = 4E8CFD8A1361ECAE00B810C6 /* PlistBookmark */; - 4E8CFD991361EF4E00B810C6 /* PBXTextBookmark */ = 4E8CFD991361EF4E00B810C6 /* PBXTextBookmark */; - 4E8CFD9A1361EF4E00B810C6 /* PBXTextBookmark */ = 4E8CFD9A1361EF4E00B810C6 /* PBXTextBookmark */; - 4E8CFD9B1361EF4E00B810C6 /* PBXTextBookmark */ = 4E8CFD9B1361EF4E00B810C6 /* PBXTextBookmark */; - 4E8CFD9C1361EF4E00B810C6 /* PlistBookmark */ = 4E8CFD9C1361EF4E00B810C6 /* PlistBookmark */; - 4E8CFDA81361F16200B810C6 /* PBXTextBookmark */ = 4E8CFDA81361F16200B810C6 /* PBXTextBookmark */; - 4E8CFDA91361F16200B810C6 /* PBXTextBookmark */ = 4E8CFDA91361F16200B810C6 /* PBXTextBookmark */; - 4E8CFDAC1361F17A00B810C6 /* PBXTextBookmark */ = 4E8CFDAC1361F17A00B810C6 /* PBXTextBookmark */; - 4E8CFDAD1361F17A00B810C6 /* PBXTextBookmark */ = 4E8CFDAD1361F17A00B810C6 /* PBXTextBookmark */; - 4E8CFDAE1361F17A00B810C6 /* PBXTextBookmark */ = 4E8CFDAE1361F17A00B810C6 /* PBXTextBookmark */; - 4E8CFDB31361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB31361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB41361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB41361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB51361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB51361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB61361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB61361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB71361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB71361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB81361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB81361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDB91361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDB91361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBA1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBA1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBB1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBB1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBC1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBC1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBD1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBD1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBE1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBE1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDBF1361F7C900B810C6 /* PBXTextBookmark */ = 4E8CFDBF1361F7C900B810C6 /* PBXTextBookmark */; - 4E8CFDC01361F7C900B810C6 /* PlistBookmark */ = 4E8CFDC01361F7C900B810C6 /* PlistBookmark */; - 4E8CFDC61361F84B00B810C6 /* PBXTextBookmark */ = 4E8CFDC61361F84B00B810C6 /* PBXTextBookmark */; - 4E8CFDC71361F84B00B810C6 /* PBXTextBookmark */ = 4E8CFDC71361F84B00B810C6 /* PBXTextBookmark */; - 4E8CFDC81361F84B00B810C6 /* PBXTextBookmark */ = 4E8CFDC81361F84B00B810C6 /* PBXTextBookmark */; - 4E8CFDC91361F84B00B810C6 /* PlistBookmark */ = 4E8CFDC91361F84B00B810C6 /* PlistBookmark */; - 4E8CFDCD1361F86C00B810C6 /* PBXTextBookmark */ = 4E8CFDCD1361F86C00B810C6 /* PBXTextBookmark */; - 4E8CFDCE1361F86C00B810C6 /* PlistBookmark */ = 4E8CFDCE1361F86C00B810C6 /* PlistBookmark */; - 4E8CFDD11361F8A200B810C6 /* PBXTextBookmark */ = 4E8CFDD11361F8A200B810C6 /* PBXTextBookmark */; - 4E8CFDD21361F8A200B810C6 /* PlistBookmark */ = 4E8CFDD21361F8A200B810C6 /* PlistBookmark */; - 4E8CFDDA1361F8FA00B810C6 /* PBXTextBookmark */ = 4E8CFDDA1361F8FA00B810C6 /* PBXTextBookmark */; - 4E8CFDDB1361F8FA00B810C6 /* PlistBookmark */ = 4E8CFDDB1361F8FA00B810C6 /* PlistBookmark */; - 4E8CFDE01361F94500B810C6 /* PBXTextBookmark */ = 4E8CFDE01361F94500B810C6 /* PBXTextBookmark */; - 4E8CFDE11361F94500B810C6 /* PlistBookmark */ = 4E8CFDE11361F94500B810C6 /* PlistBookmark */; - 4E8CFDE51361F9B800B810C6 /* PBXTextBookmark */ = 4E8CFDE51361F9B800B810C6 /* PBXTextBookmark */; - 4E8CFDE61361F9B800B810C6 /* PlistBookmark */ = 4E8CFDE61361F9B800B810C6 /* PlistBookmark */; - 4E8CFDEE1361FA5400B810C6 /* PBXTextBookmark */ = 4E8CFDEE1361FA5400B810C6 /* PBXTextBookmark */; - 4E8CFDEF1361FA5400B810C6 /* PlistBookmark */ = 4E8CFDEF1361FA5400B810C6 /* PlistBookmark */; - 4E8CFDF41361FA8200B810C6 /* PBXTextBookmark */ = 4E8CFDF41361FA8200B810C6 /* PBXTextBookmark */; - 4E8CFDF51361FA8200B810C6 /* PlistBookmark */ = 4E8CFDF51361FA8200B810C6 /* PlistBookmark */; - 4E8CFDF91361FAD800B810C6 /* PBXTextBookmark */ = 4E8CFDF91361FAD800B810C6 /* PBXTextBookmark */; - 4E8CFDFA1361FAD800B810C6 /* PlistBookmark */ = 4E8CFDFA1361FAD800B810C6 /* PlistBookmark */; - 4E8CFE041361FCE000B810C6 /* XCBuildMessageTextBookmark */ = 4E8CFE041361FCE000B810C6 /* XCBuildMessageTextBookmark */; - 4E8CFE051361FCE000B810C6 /* PBXTextBookmark */ = 4E8CFE051361FCE000B810C6 /* PBXTextBookmark */; - 4E8CFE061361FCE000B810C6 /* PBXTextBookmark */ = 4E8CFE061361FCE000B810C6 /* PBXTextBookmark */; - 4E8CFE071361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE071361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE081361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE081361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE091361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE091361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0A1361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE0A1361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0B1361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE0B1361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0C1361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE0C1361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0D1361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE0D1361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0E1361FCE200B810C6 /* PBXTextBookmark */ = 4E8CFE0E1361FCE200B810C6 /* PBXTextBookmark */; - 4E8CFE0F1361FCE200B810C6 /* PlistBookmark */ = 4E8CFE0F1361FCE200B810C6 /* PlistBookmark */; - 4E8CFE131361FE1A00B810C6 /* PBXTextBookmark */ = 4E8CFE131361FE1A00B810C6 /* PBXTextBookmark */; - 4E8CFE141361FE1A00B810C6 /* PBXTextBookmark */ = 4E8CFE141361FE1A00B810C6 /* PBXTextBookmark */; - 4E8CFE151361FE1A00B810C6 /* PBXTextBookmark */ = 4E8CFE151361FE1A00B810C6 /* PBXTextBookmark */; - 4E8CFE161361FE1A00B810C6 /* PlistBookmark */ = 4E8CFE161361FE1A00B810C6 /* PlistBookmark */; - 4E8CFE1C1361FE6A00B810C6 /* PBXTextBookmark */ = 4E8CFE1C1361FE6A00B810C6 /* PBXTextBookmark */; - 4E8CFE1D1361FE6A00B810C6 /* PBXTextBookmark */ = 4E8CFE1D1361FE6A00B810C6 /* PBXTextBookmark */; - 4E8CFE1E1361FE6A00B810C6 /* PlistBookmark */ = 4E8CFE1E1361FE6A00B810C6 /* PlistBookmark */; - 4E8CFE201361FEEF00B810C6 /* PBXTextBookmark */ = 4E8CFE201361FEEF00B810C6 /* PBXTextBookmark */; - 4E8CFE211361FEEF00B810C6 /* PBXTextBookmark */ = 4E8CFE211361FEEF00B810C6 /* PBXTextBookmark */; - 4E8CFE221361FEEF00B810C6 /* PBXTextBookmark */ = 4E8CFE221361FEEF00B810C6 /* PBXTextBookmark */; - 4E8CFE231361FEEF00B810C6 /* PBXTextBookmark */ = 4E8CFE231361FEEF00B810C6 /* PBXTextBookmark */; - 4E8CFE241361FEEF00B810C6 /* PlistBookmark */ = 4E8CFE241361FEEF00B810C6 /* PlistBookmark */; - 4E8CFE251361FF1B00B810C6 /* PBXTextBookmark */ = 4E8CFE251361FF1B00B810C6 /* PBXTextBookmark */; - 4E8CFE261361FF1B00B810C6 /* PBXTextBookmark */ = 4E8CFE261361FF1B00B810C6 /* PBXTextBookmark */; - 4E8CFE271361FF1B00B810C6 /* PBXTextBookmark */ = 4E8CFE271361FF1B00B810C6 /* PBXTextBookmark */; - 4E8CFE281361FF1B00B810C6 /* PlistBookmark */ = 4E8CFE281361FF1B00B810C6 /* PlistBookmark */; - 4E8CFE2B1361FFAD00B810C6 /* PBXTextBookmark */ = 4E8CFE2B1361FFAD00B810C6 /* PBXTextBookmark */; - 4E8CFE2C1361FFAD00B810C6 /* PBXTextBookmark */ = 4E8CFE2C1361FFAD00B810C6 /* PBXTextBookmark */; - 4E8CFE2D1361FFAD00B810C6 /* PBXTextBookmark */ = 4E8CFE2D1361FFAD00B810C6 /* PBXTextBookmark */; - 4E8CFE301362039700B810C6 /* PBXTextBookmark */ = 4E8CFE301362039700B810C6 /* PBXTextBookmark */; - 4E8CFE311362039700B810C6 /* PBXTextBookmark */ = 4E8CFE311362039700B810C6 /* PBXTextBookmark */; - 4E8CFE321362039700B810C6 /* PBXTextBookmark */ = 4E8CFE321362039700B810C6 /* PBXTextBookmark */; - 4E8CFE351362046700B810C6 /* PBXTextBookmark */ = 4E8CFE351362046700B810C6 /* PBXTextBookmark */; - 4E8CFE361362046700B810C6 /* PBXTextBookmark */ = 4E8CFE361362046700B810C6 /* PBXTextBookmark */; - 4E8CFE3A136207C900B810C6 /* PBXTextBookmark */ = 4E8CFE3A136207C900B810C6 /* PBXTextBookmark */; - 4E8CFE3D136217F800B810C6 /* PBXTextBookmark */ = 4E8CFE3D136217F800B810C6 /* PBXTextBookmark */; - 4E8CFE3E136217F800B810C6 /* PBXTextBookmark */ = 4E8CFE3E136217F800B810C6 /* PBXTextBookmark */; - 4E8CFE3F136217F800B810C6 /* PBXTextBookmark */ = 4E8CFE3F136217F800B810C6 /* PBXTextBookmark */; - 4E8CFE40136217F800B810C6 /* PBXTextBookmark */ = 4E8CFE40136217F800B810C6 /* PBXTextBookmark */; - 4E8CFE43136229DD00B810C6 /* PBXTextBookmark */ = 4E8CFE43136229DD00B810C6 /* PBXTextBookmark */; - 4E8CFE44136229DD00B810C6 /* PBXTextBookmark */ = 4E8CFE44136229DD00B810C6 /* PBXTextBookmark */; - 4E8CFE45136229DD00B810C6 /* PBXTextBookmark */ = 4E8CFE45136229DD00B810C6 /* PBXTextBookmark */; - 4E8CFE4913622A3600B810C6 /* PBXTextBookmark */ = 4E8CFE4913622A3600B810C6 /* PBXTextBookmark */; - 4E8CFE4A13622A3600B810C6 /* PBXTextBookmark */ = 4E8CFE4A13622A3600B810C6 /* PBXTextBookmark */; - 4E8CFE4B13622A3600B810C6 /* PBXTextBookmark */ = 4E8CFE4B13622A3600B810C6 /* PBXTextBookmark */; - 4E8CFE4F13622A5D00B810C6 /* PBXTextBookmark */ = 4E8CFE4F13622A5D00B810C6 /* PBXTextBookmark */; - 4E8CFE5313622A7900B810C6 /* PBXTextBookmark */ = 4E8CFE5313622A7900B810C6 /* PBXTextBookmark */; + 4E8CFDB41361F7C900B810C6 = 4E8CFDB41361F7C900B810C6 /* PBXTextBookmark */; + 4E8CFDB61361F7C900B810C6 = 4E8CFDB61361F7C900B810C6 /* PBXTextBookmark */; + 4E8CFDB71361F7C900B810C6 = 4E8CFDB71361F7C900B810C6 /* PBXTextBookmark */; + 4E8CFDB81361F7C900B810C6 = 4E8CFDB81361F7C900B810C6 /* PBXTextBookmark */; + 4E8CFDB91361F7C900B810C6 = 4E8CFDB91361F7C900B810C6 /* PBXTextBookmark */; + 4E8CFE0B1361FCE200B810C6 = 4E8CFE0B1361FCE200B810C6 /* PBXTextBookmark */; + 4E8CFE0C1361FCE200B810C6 = 4E8CFE0C1361FCE200B810C6 /* PBXTextBookmark */; + 4E8CFE211361FEEF00B810C6 = 4E8CFE211361FEEF00B810C6 /* PBXTextBookmark */; + 4E8CFE301362039700B810C6 = 4E8CFE301362039700B810C6 /* PBXTextBookmark */; + 4E8CFE311362039700B810C6 = 4E8CFE311362039700B810C6 /* PBXTextBookmark */; + 4E8CFE3D136217F800B810C6 = 4E8CFE3D136217F800B810C6 /* PBXTextBookmark */; + 4E8CFE3E136217F800B810C6 = 4E8CFE3E136217F800B810C6 /* PBXTextBookmark */; + 4E8CFE4913622A3600B810C6 = 4E8CFE4913622A3600B810C6 /* PBXTextBookmark */; + 4E8CFE4A13622A3600B810C6 = 4E8CFE4A13622A3600B810C6 /* PBXTextBookmark */; + 4E8CFE9D13626ADF00B810C6 = 4E8CFE9D13626ADF00B810C6 /* PBXTextBookmark */; 4EA96020135CF43B009243EE = 4EA96020135CF43B009243EE /* PBXTextBookmark */; 4EA96027135CF455009243EE = 4EA96027135CF455009243EE /* PBXTextBookmark */; + 4EB53E9B1363581F009A5AC5 /* PBXTextBookmark */ = 4EB53E9B1363581F009A5AC5 /* PBXTextBookmark */; + 4EB53E9C1363581F009A5AC5 /* PBXTextBookmark */ = 4EB53E9C1363581F009A5AC5 /* PBXTextBookmark */; + 4EB53E9D1363581F009A5AC5 /* PBXTextBookmark */ = 4EB53E9D1363581F009A5AC5 /* PBXTextBookmark */; + 4EB53E9E1363581F009A5AC5 /* PBXTextBookmark */ = 4EB53E9E1363581F009A5AC5 /* PBXTextBookmark */; + 4EB53EF013637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF013637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF113637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF113637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF213637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF213637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF313637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF313637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF413637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF413637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF513637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF513637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF613637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF613637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53EF713637BF8009A5AC5 /* PBXTextBookmark */ = 4EB53EF713637BF8009A5AC5 /* PBXTextBookmark */; + 4EB53F201364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F201364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F211364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F211364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F221364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F221364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F231364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F231364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F241364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F241364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F251364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F251364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F261364E3A8009A5AC5 /* PBXTextBookmark */ = 4EB53F261364E3A8009A5AC5 /* PBXTextBookmark */; + 4EB53F351364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F351364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F361364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F361364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F371364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F371364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F381364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F381364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F391364EAD1009A5AC5 /* XCBuildMessageTextBookmark */ = 4EB53F391364EAD1009A5AC5 /* XCBuildMessageTextBookmark */; + 4EB53F3A1364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F3A1364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F3B1364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F3B1364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F3C1364EAD1009A5AC5 /* PBXTextBookmark */ = 4EB53F3C1364EAD1009A5AC5 /* PBXTextBookmark */; + 4EB53F3D1364EAD5009A5AC5 /* PBXTextBookmark */ = 4EB53F3D1364EAD5009A5AC5 /* PBXTextBookmark */; + 4EB53F3E1364EAD5009A5AC5 /* PBXTextBookmark */ = 4EB53F3E1364EAD5009A5AC5 /* PBXTextBookmark */; + 4EB53F491364EC4C009A5AC5 /* PBXTextBookmark */ = 4EB53F491364EC4C009A5AC5 /* PBXTextBookmark */; + 4EB53F4A1364EC4C009A5AC5 /* XCBuildMessageTextBookmark */ = 4EB53F4A1364EC4C009A5AC5 /* XCBuildMessageTextBookmark */; + 4EB53F4B1364EC4C009A5AC5 /* PBXTextBookmark */ = 4EB53F4B1364EC4C009A5AC5 /* PBXTextBookmark */; + 4EB53F4C1364EC4C009A5AC5 /* PBXTextBookmark */ = 4EB53F4C1364EC4C009A5AC5 /* PBXTextBookmark */; + 4EB53F571364ED0B009A5AC5 /* PBXTextBookmark */ = 4EB53F571364ED0B009A5AC5 /* PBXTextBookmark */; + 4EB53F581364ED0B009A5AC5 /* PBXTextBookmark */ = 4EB53F581364ED0B009A5AC5 /* PBXTextBookmark */; + 4EB53F591364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F591364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5A1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5A1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5B1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5B1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5C1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5C1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5D1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5D1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5E1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5E1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F5F1364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F5F1364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F601364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F601364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F611364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F611364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F621364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F621364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F631364ED0D009A5AC5 /* PBXTextBookmark */ = 4EB53F631364ED0D009A5AC5 /* PBXTextBookmark */; + 4EB53F691364EE56009A5AC5 /* PBXTextBookmark */ = 4EB53F691364EE56009A5AC5 /* PBXTextBookmark */; + 4EB53F6A1364EE56009A5AC5 /* PBXTextBookmark */ = 4EB53F6A1364EE56009A5AC5 /* PBXTextBookmark */; + 4EB53F6B1364EE56009A5AC5 /* PBXTextBookmark */ = 4EB53F6B1364EE56009A5AC5 /* PBXTextBookmark */; + 4EB53F6C1364EE56009A5AC5 /* PBXTextBookmark */ = 4EB53F6C1364EE56009A5AC5 /* PBXTextBookmark */; + 4EB53F701364EE73009A5AC5 /* PBXTextBookmark */ = 4EB53F701364EE73009A5AC5 /* PBXTextBookmark */; + 4EB53F741364EE8D009A5AC5 /* PBXTextBookmark */ = 4EB53F741364EE8D009A5AC5 /* PBXTextBookmark */; + 4EB53F7A1364EED7009A5AC5 /* PBXTextBookmark */ = 4EB53F7A1364EED7009A5AC5 /* PBXTextBookmark */; + 4EB53F7B1364EED7009A5AC5 /* PBXTextBookmark */ = 4EB53F7B1364EED7009A5AC5 /* PBXTextBookmark */; + 4EB53F7C1364EED7009A5AC5 /* PBXTextBookmark */ = 4EB53F7C1364EED7009A5AC5 /* PBXTextBookmark */; + 4EB53F801364F105009A5AC5 /* PBXTextBookmark */ = 4EB53F801364F105009A5AC5 /* PBXTextBookmark */; + 4EB53F811364F105009A5AC5 /* PBXTextBookmark */ = 4EB53F811364F105009A5AC5 /* PBXTextBookmark */; + 4EB53F821364F105009A5AC5 /* PBXTextBookmark */ = 4EB53F821364F105009A5AC5 /* PBXTextBookmark */; + 4EB53F831364F105009A5AC5 /* PBXTextBookmark */ = 4EB53F831364F105009A5AC5 /* PBXTextBookmark */; + 4EB53F871364F1DC009A5AC5 /* PBXTextBookmark */ = 4EB53F871364F1DC009A5AC5 /* PBXTextBookmark */; + 4EB53F881364F1DC009A5AC5 /* PBXTextBookmark */ = 4EB53F881364F1DC009A5AC5 /* PBXTextBookmark */; + 4EB53F891364F1DC009A5AC5 /* PBXTextBookmark */ = 4EB53F891364F1DC009A5AC5 /* PBXTextBookmark */; + 4EB53F8A1364F1DC009A5AC5 /* PBXTextBookmark */ = 4EB53F8A1364F1DC009A5AC5 /* PBXTextBookmark */; + 4EB53F8E1364F288009A5AC5 /* PBXTextBookmark */ = 4EB53F8E1364F288009A5AC5 /* PBXTextBookmark */; + 4EB53F8F1364F288009A5AC5 /* PBXTextBookmark */ = 4EB53F8F1364F288009A5AC5 /* PBXTextBookmark */; + 4EB53F901364F288009A5AC5 /* PBXTextBookmark */ = 4EB53F901364F288009A5AC5 /* PBXTextBookmark */; + 4EB53F941364F2D2009A5AC5 /* PBXTextBookmark */ = 4EB53F941364F2D2009A5AC5 /* PBXTextBookmark */; + 4EB53F951364F2D2009A5AC5 /* PBXTextBookmark */ = 4EB53F951364F2D2009A5AC5 /* PBXTextBookmark */; + 4EB53F961364F2D2009A5AC5 /* PBXTextBookmark */ = 4EB53F961364F2D2009A5AC5 /* PBXTextBookmark */; + 4EB53F9A1364F45A009A5AC5 /* PBXTextBookmark */ = 4EB53F9A1364F45A009A5AC5 /* PBXTextBookmark */; + 4EB53F9B1364F45A009A5AC5 /* PBXTextBookmark */ = 4EB53F9B1364F45A009A5AC5 /* PBXTextBookmark */; + 4EB53F9C1364F45A009A5AC5 /* PBXTextBookmark */ = 4EB53F9C1364F45A009A5AC5 /* PBXTextBookmark */; + 4EB53F9D1364F45A009A5AC5 /* PBXTextBookmark */ = 4EB53F9D1364F45A009A5AC5 /* PBXTextBookmark */; + 4EB53FA11364F4E2009A5AC5 /* PBXTextBookmark */ = 4EB53FA11364F4E2009A5AC5 /* PBXTextBookmark */; + 4EB53FA21364F4E2009A5AC5 /* PBXTextBookmark */ = 4EB53FA21364F4E2009A5AC5 /* PBXTextBookmark */; + 4EB53FA31364F4E2009A5AC5 /* PBXTextBookmark */ = 4EB53FA31364F4E2009A5AC5 /* PBXTextBookmark */; + 4EB53FA71364F548009A5AC5 /* PBXTextBookmark */ = 4EB53FA71364F548009A5AC5 /* PBXTextBookmark */; + 4EB53FAB1364F5C1009A5AC5 /* PBXTextBookmark */ = 4EB53FAB1364F5C1009A5AC5 /* PBXTextBookmark */; + 4EB53FAF1364F5D8009A5AC5 /* PBXTextBookmark */ = 4EB53FAF1364F5D8009A5AC5 /* PBXTextBookmark */; + 4EB53FB31364F699009A5AC5 /* PBXTextBookmark */ = 4EB53FB31364F699009A5AC5 /* PBXTextBookmark */; + 4EB53FB41364F699009A5AC5 /* PBXTextBookmark */ = 4EB53FB41364F699009A5AC5 /* PBXTextBookmark */; + 4EB53FB51364F699009A5AC5 /* PBXTextBookmark */ = 4EB53FB51364F699009A5AC5 /* PBXTextBookmark */; + 4EB53FB91364F6C4009A5AC5 /* PBXTextBookmark */ = 4EB53FB91364F6C4009A5AC5 /* PBXTextBookmark */; + 4EB53FBD1364F740009A5AC5 /* PBXTextBookmark */ = 4EB53FBD1364F740009A5AC5 /* PBXTextBookmark */; + 4EB53FBE1364F740009A5AC5 /* PBXTextBookmark */ = 4EB53FBE1364F740009A5AC5 /* PBXTextBookmark */; + 4EB53FC11364F77D009A5AC5 /* PBXTextBookmark */ = 4EB53FC11364F77D009A5AC5 /* PBXTextBookmark */; + 4EB53FC31364F82F009A5AC5 /* PBXTextBookmark */ = 4EB53FC31364F82F009A5AC5 /* PBXTextBookmark */; + 4EB53FC41364F82F009A5AC5 /* PBXTextBookmark */ = 4EB53FC41364F82F009A5AC5 /* PBXTextBookmark */; + 4EB53FC51364F82F009A5AC5 /* PBXTextBookmark */ = 4EB53FC51364F82F009A5AC5 /* PBXTextBookmark */; + 4EB53FC61364F82F009A5AC5 /* PBXTextBookmark */ = 4EB53FC61364F82F009A5AC5 /* PBXTextBookmark */; + 4EB53FC71364F84B009A5AC5 /* PBXTextBookmark */ = 4EB53FC71364F84B009A5AC5 /* PBXTextBookmark */; + 4EB53FC81364F84B009A5AC5 /* PBXTextBookmark */ = 4EB53FC81364F84B009A5AC5 /* PBXTextBookmark */; + 4EB53FC91364F84B009A5AC5 /* PBXTextBookmark */ = 4EB53FC91364F84B009A5AC5 /* PBXTextBookmark */; + 4EB53FCC1364F905009A5AC5 /* PBXTextBookmark */ = 4EB53FCC1364F905009A5AC5 /* PBXTextBookmark */; + 4EB53FD01364F98B009A5AC5 /* PBXTextBookmark */ = 4EB53FD01364F98B009A5AC5 /* PBXTextBookmark */; + 4EB53FD41364F9F2009A5AC5 /* PBXTextBookmark */ = 4EB53FD41364F9F2009A5AC5 /* PBXTextBookmark */; + 4EB53FD51364F9F2009A5AC5 /* PBXTextBookmark */ = 4EB53FD51364F9F2009A5AC5 /* PBXTextBookmark */; + 4EB53FD61364F9F2009A5AC5 /* PBXTextBookmark */ = 4EB53FD61364F9F2009A5AC5 /* PBXTextBookmark */; + 4EB53FDA1364FA5F009A5AC5 /* PBXTextBookmark */ = 4EB53FDA1364FA5F009A5AC5 /* PBXTextBookmark */; + 4EB53FDB1364FA5F009A5AC5 /* PBXTextBookmark */ = 4EB53FDB1364FA5F009A5AC5 /* PBXTextBookmark */; + 4EB53FDC1364FA5F009A5AC5 /* PBXTextBookmark */ = 4EB53FDC1364FA5F009A5AC5 /* PBXTextBookmark */; + 4EB53FE11364FAA0009A5AC5 /* PBXTextBookmark */ = 4EB53FE11364FAA0009A5AC5 /* PBXTextBookmark */; + 4EB53FE21364FAA0009A5AC5 /* PBXTextBookmark */ = 4EB53FE21364FAA0009A5AC5 /* PBXTextBookmark */; + 4EB53FE31364FAA0009A5AC5 /* PBXTextBookmark */ = 4EB53FE31364FAA0009A5AC5 /* PBXTextBookmark */; + 4EB53FE81364FAEB009A5AC5 /* PBXTextBookmark */ = 4EB53FE81364FAEB009A5AC5 /* PBXTextBookmark */; + 4EB53FE91364FAEB009A5AC5 /* PBXTextBookmark */ = 4EB53FE91364FAEB009A5AC5 /* PBXTextBookmark */; + 4EB53FEA1364FAEB009A5AC5 /* PBXTextBookmark */ = 4EB53FEA1364FAEB009A5AC5 /* PBXTextBookmark */; + 4EB53FEB1364FAEB009A5AC5 /* PBXTextBookmark */ = 4EB53FEB1364FAEB009A5AC5 /* PBXTextBookmark */; + 4EB53FF01364FB26009A5AC5 /* PBXTextBookmark */ = 4EB53FF01364FB26009A5AC5 /* PBXTextBookmark */; + 4EB53FF51364FB4E009A5AC5 /* PBXTextBookmark */ = 4EB53FF51364FB4E009A5AC5 /* PBXTextBookmark */; + 4EB53FFA1364FC1F009A5AC5 /* PBXTextBookmark */ = 4EB53FFA1364FC1F009A5AC5 /* PBXTextBookmark */; + 4EB53FFF1364FDA0009A5AC5 /* PBXTextBookmark */ = 4EB53FFF1364FDA0009A5AC5 /* PBXTextBookmark */; + 4EB540001364FDA0009A5AC5 /* PBXTextBookmark */ = 4EB540001364FDA0009A5AC5 /* PBXTextBookmark */; + 4EB540011364FDA0009A5AC5 /* PBXTextBookmark */ = 4EB540011364FDA0009A5AC5 /* PBXTextBookmark */; + 4EB540061364FED6009A5AC5 /* PBXTextBookmark */ = 4EB540061364FED6009A5AC5 /* PBXTextBookmark */; + 4EB540071364FED6009A5AC5 /* PBXTextBookmark */ = 4EB540071364FED6009A5AC5 /* PBXTextBookmark */; 4EBFCB481360E786005AC5CC = 4EBFCB481360E786005AC5CC /* PBXTextBookmark */; 4EBFCB791360F428005AC5CC = 4EBFCB791360F428005AC5CC /* PBXTextBookmark */; - 4EBFCB7A1360F428005AC5CC = 4EBFCB7A1360F428005AC5CC /* PBXTextBookmark */; 4EBFCBD11360FA86005AC5CC = 4EBFCBD11360FA86005AC5CC /* PBXTextBookmark */; 4EBFCBE51360FD85005AC5CC = 4EBFCBE51360FD85005AC5CC /* PBXTextBookmark */; - 4EBFCBF413611E90005AC5CC = 4EBFCBF413611E90005AC5CC /* PlistBookmark */; 4ECFB6E1135F58D2007FAB8D = 4ECFB6E1135F58D2007FAB8D /* PBXTextBookmark */; 4ECFB724135F80A7007FAB8D = 4ECFB724135F80A7007FAB8D /* PBXBookmark */; 4ECFB73A135F8619007FAB8D = 4ECFB73A135F8619007FAB8D /* PBXTextBookmark */; @@ -213,8 +244,6 @@ 4ECFB8DE135FE058007FAB8D = 4ECFB8DE135FE058007FAB8D /* PBXTextBookmark */; 4ECFB8F2135FE28C007FAB8D = 4ECFB8F2135FE28C007FAB8D /* PBXTextBookmark */; 4ED6DB46135A1FCE00BEF0B7 = 4ED6DB46135A1FCE00BEF0B7 /* PBXTextBookmark */; - 4ED6DB4F135A25C700BEF0B7 = 4ED6DB4F135A25C700BEF0B7 /* PBXTextBookmark */; - 4ED6DB50135A25C700BEF0B7 = 4ED6DB50135A25C700BEF0B7 /* PBXTextBookmark */; 4ED6DC28135B365F00BEF0B7 = 4ED6DC28135B365F00BEF0B7 /* PBXTextBookmark */; 4ED6DC2A135B365F00BEF0B7 = 4ED6DC2A135B365F00BEF0B7 /* PBXTextBookmark */; 4ED6DC2B135B365F00BEF0B7 = 4ED6DC2B135B365F00BEF0B7 /* PBXTextBookmark */; @@ -224,16 +253,6 @@ userBuildSettings = { }; }; - 4E067D381361413100D43FE0 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; - name = "PicCastAppDelegate.m: 37"; - rLen = 146; - rLoc = 1629; - rType = 0; - vrLen = 1279; - vrLoc = 347; - }; 4E067D391361413100D43FE0 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 28216C960DB411BC00E5133A /* TabViewController.m */; @@ -264,38 +283,6 @@ vrLen = 660; vrLoc = 694; }; - 4E067D3C1361413100D43FE0 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 61"; - rLen = 0; - rLoc = 1753; - rType = 0; - vrLen = 1105; - vrLoc = 4367; - }; - 4E067D3D1361413100D43FE0 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; - rLen = 0; - rLoc = 2676; - rType = 0; - vrLen = 1295; - vrLoc = 6246; - }; - 4E067D401361413100D43FE0 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; - rLen = 0; - rLoc = 9223372036854775808; - }; 4E6827B513593BAE001EB808 /* acidcow */ = { isa = PBXExecutable; activeArgIndices = ( @@ -345,17 +332,17 @@ 4E6827E713594115001EB808 /* TopicsViewController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {915, 600}}"; - sepNavSelRange = "{1082, 0}"; - sepNavVisRange = "{0, 1328}"; + sepNavSelRange = "{644, 5}"; + sepNavVisRange = "{0, 1365}"; sepNavWindowFrame = "{{15, 323}, {1196, 550}}"; }; }; 4E6827E813594115001EB808 /* TopicsViewController.m */ = { uiCtxt = { - sepNavFolds = "{\n c = (\n {\n l = DetailViewController;\n r = \"{4018, 24}\";\n s = 1;\n },\n {\n l = DetailViewController;\n r = \"{4069, 24}\";\n s = 1;\n },\n {\n l = \"Nib name\";\n r = \"{4119, 12}\";\n s = 1;\n }\n );\n r = \"{0, 10217}\";\n s = 0;\n}"; - sepNavIntBoundsRect = "{{0, 0}, {964, 4186}}"; - sepNavSelRange = "{4586, 0}"; - sepNavVisRange = "{3723, 1446}"; + sepNavFolds = "{\n c = (\n {\n l = DetailViewController;\n r = \"{6511, 24}\";\n s = 1;\n },\n {\n l = DetailViewController;\n r = \"{6562, 24}\";\n s = 1;\n },\n {\n l = \"Nib name\";\n r = \"{6612, 12}\";\n s = 1;\n }\n );\n r = \"{0, 12974}\";\n s = 0;\n}"; + sepNavIntBoundsRect = "{{0, 0}, {964, 5109}}"; + sepNavSelRange = "{3842, 0}"; + sepNavVisRange = "{3703, 813}"; sepNavWindowFrame = "{{15, 323}, {1196, 550}}"; }; }; @@ -370,7 +357,7 @@ uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {903, 767}}"; sepNavSelRange = "{178, 0}"; - sepNavVisRange = "{694, 660}"; + sepNavVisRange = "{143, 1181}"; }; }; 4E6828161359437D001EB808 /* XMLParser.h */ = { @@ -390,15 +377,15 @@ 4E68282D13594C48001EB808 /* Topic.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {903, 600}}"; - sepNavSelRange = "{509, 0}"; - sepNavVisRange = "{0, 759}"; + sepNavSelRange = "{806, 0}"; + sepNavVisRange = "{0, 858}"; }; }; 4E68282E13594C48001EB808 /* Topic.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 600}}"; - sepNavSelRange = "{322, 0}"; - sepNavVisRange = "{0, 494}"; + sepNavIntBoundsRect = "{{0, 0}, {903, 1053}}"; + sepNavSelRange = "{2429, 0}"; + sepNavVisRange = "{653, 1835}"; }; }; 4E68286F1359595F001EB808 /* PBXTextBookmark */ = { @@ -442,1021 +429,1390 @@ path = /Users/handler/Documents/code/github/three20/src/Three20Network/Sources/TTRequestLoader.m; sourceTree = ""; }; - 4E8CFD871361ECAE00B810C6 /* PBXTextBookmark */ = { + 4E8CFDB41361F7C900B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + fRef = 4ED6DB25135A194A00BEF0B7 /* HJCircularBuffer.h */; + name = "HJCircularBuffer.h: 1"; rLen = 0; - rLoc = 2676; + rLoc = 0; rType = 0; - vrLen = 1278; - vrLoc = 6263; + vrLen = 902; + vrLoc = 453; }; - 4E8CFD8A1361ECAE00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4E8CFDB61361F7C900B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB21135A194A00BEF0B7 /* HJManagedImageVDelegate.h */; + name = "HJManagedImageVDelegate.h: 1"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 0; + rType = 0; + vrLen = 381; + vrLoc = 0; }; - 4E8CFD991361EF4E00B810C6 /* PBXTextBookmark */ = { + 4E8CFDB71361F7C900B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + fRef = 4ED6DB18135A194A00BEF0B7 /* HJMOUser.h */; + name = "HJMOUser.h: 1"; rLen = 0; - rLoc = 2676; + rLoc = 0; rType = 0; - vrLen = 1278; - vrLoc = 6263; + vrLen = 1357; + vrLoc = 1405; }; - 4E8CFD9A1361EF4E00B810C6 /* PBXTextBookmark */ = { + 4E8CFDB81361F7C900B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 102"; + fRef = 4ED6DB16135A194A00BEF0B7 /* HJMOUserBase.m */; + name = "HJMOUserBase.m: 1"; rLen = 0; - rLoc = 2624; + rLoc = 0; rType = 0; - vrLen = 750; - vrLoc = 4146; + vrLen = 605; + vrLoc = 0; + }; + 4E8CFDB91361F7C900B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB17135A194A00BEF0B7 /* HJMOUserBase.h */; + name = "HJMOUserBase.h: 11"; + rLen = 10; + rLoc = 356; + rType = 0; + vrLen = 638; + vrLoc = 0; }; - 4E8CFD9B1361EF4E00B810C6 /* PBXTextBookmark */ = { + 4E8CFE0B1361FCE200B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 148"; + name = "HJManagedImageV.m: 87"; + rLen = 27; + rLoc = 2266; + rType = 0; + vrLen = 702; + vrLoc = 2070; + }; + 4E8CFE0C1361FCE200B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; + name = "HJManagedImageV.h: 11"; + rLen = 10; + rLoc = 355; + rType = 0; + vrLen = 843; + vrLoc = 839; + }; + 4E8CFE211361FEEF00B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */; + name = "HJObjManager.h: 83"; rLen = 0; - rLoc = 3627; + rLoc = 3076; rType = 0; - vrLen = 1002; - vrLoc = 3281; + vrLen = 1685; + vrLoc = 1888; }; - 4E8CFD9C1361EF4E00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4E8CFE301362039700B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; + name = "HJObjManager.m: 11"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 334; + rType = 0; + vrLen = 1687; + vrLoc = 1837; }; - 4E8CFDA81361F16200B810C6 /* PBXTextBookmark */ = { + 4E8CFE311362039700B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB17135A194A00BEF0B7 /* HJMOUserBase.h */; - rLen = 10; - rLoc = 356; + fRef = 4ED6DB1C135A194A00BEF0B7 /* HJMOHandler.h */; + name = "HJMOHandler.h: 40"; + rLen = 0; + rLoc = 1217; + rType = 0; + vrLen = 1537; + vrLoc = 397; + }; + 4E8CFE3D136217F800B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; + name = "HJMOHandler.m: 354"; + rLen = 0; + rLoc = 10212; rType = 0; + vrLen = 1874; + vrLoc = 9375; }; - 4E8CFDA91361F16200B810C6 /* PBXTextBookmark */ = { + 4E8CFE3E136217F800B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB17135A194A00BEF0B7 /* HJMOUserBase.h */; - name = "HJMOUserBase.h: 11"; - rLen = 10; - rLoc = 356; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 32"; + rLen = 0; + rLoc = 1202; rType = 0; - vrLen = 632; + vrLen = 1245; vrLoc = 0; }; - 4E8CFDAC1361F17A00B810C6 /* PBXTextBookmark */ = { + 4E8CFE4913622A3600B810C6 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB17135A194A00BEF0B7 /* HJMOUserBase.h */; - name = "HJMOUserBase.h: 11"; - rLen = 10; - rLoc = 356; + fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; + name = "PicCastAppDelegate.m: 26"; + rLen = 0; + rLoc = 764; + rType = 0; + vrLen = 2104; + vrLoc = 2008; + }; + 4E8CFE4A13622A3600B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 18"; + rLen = 0; + rLoc = 517; + rType = 0; + vrLen = 1953; + vrLoc = 149; + }; + 4E8CFE9D13626ADF00B810C6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 145"; + rLen = 0; + rLoc = 7322; + rType = 0; + vrLen = 1626; + vrLoc = 5222; + }; + 4EA95FC9135CE8C3009243EE /* PhotoSource.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 2509}}"; + sepNavSelRange = "{3515, 0}"; + sepNavVisRange = "{3255, 1186}"; + }; + }; + 4EA95FCA135CE8C3009243EE /* PhotoSource.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 585}}"; + sepNavSelRange = "{274, 0}"; + sepNavVisRange = "{0, 1194}"; + }; + }; + 4EA95FD3135CE959009243EE /* PhotoViewController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 409}}"; + sepNavSelRange = "{501, 0}"; + sepNavVisRange = "{0, 529}"; + }; + }; + 4EA95FD4135CE959009243EE /* PhotoViewController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 2132}}"; + sepNavSelRange = "{530, 0}"; + sepNavVisRange = "{241, 747}"; + }; + }; + 4EA96020135CF43B009243EE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EA95FC9135CE8C3009243EE /* PhotoSource.m */; + name = "PhotoSource.m: 135"; + rLen = 0; + rLoc = 3515; + rType = 0; + vrLen = 1186; + vrLoc = 3255; + }; + 4EA96027135CF455009243EE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EA95FCA135CE8C3009243EE /* PhotoSource.h */; + name = "PhotoSource.h: 10"; + rLen = 0; + rLoc = 274; rType = 0; - vrLen = 632; + vrLen = 1194; vrLoc = 0; }; - 4E8CFDAD1361F17A00B810C6 /* PBXTextBookmark */ = { + 4EB53E9B1363581F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - rLen = 10; - rLoc = 355; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 182"; + rLen = 0; + rLoc = 8527; rType = 0; + vrLen = 2091; + vrLoc = 442; }; - 4E8CFDAE1361F17A00B810C6 /* PBXTextBookmark */ = { + 4EB53E9C1363581F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - name = "HJManagedImageV.h: 11"; - rLen = 10; - rLoc = 355; + fRef = 1D3623240D0F684500981E51 /* PicCastAppDelegate.h */; + name = "PicCastAppDelegate.h: 21"; + rLen = 0; + rLoc = 632; rType = 0; - vrLen = 1079; + vrLen = 639; vrLoc = 0; }; - 4E8CFDB31361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53E9D1363581F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */; - name = "HJObjManager.h: 1"; + fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; + name = "PicCastAppDelegate.m: 141"; + rLen = 30; + rLoc = 5171; + rType = 0; + vrLen = 2010; + vrLoc = 4329; + }; + 4EB53E9E1363581F009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; + name = "PicCastAppDelegate.m: 154"; rLen = 0; - rLoc = 0; + rLoc = 5831; rType = 0; - vrLen = 1361; - vrLoc = 1437; + vrLen = 1711; + vrLoc = 4442; }; - 4E8CFDB41361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EC2136359E3009A5AC5 /* FMDatabaseAdditions.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 623}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 947}"; + }; + }; + 4EB53EC9136359E3009A5AC5 /* fmdb.m */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.objc; + name = fmdb.m; + path = /Users/handler/Documents/code/xCode/PicCast/Classes/fmdb.m; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 6474}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1558}"; + }; + }; + 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 600}}"; + sepNavSelRange = "{222, 0}"; + sepNavVisRange = "{0, 502}"; + }; + }; + 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 806}}"; + sepNavSelRange = "{1251, 0}"; + sepNavVisRange = "{146, 1299}"; + }; + }; + 4EB53EF013637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB25135A194A00BEF0B7 /* HJCircularBuffer.h */; - name = "HJCircularBuffer.h: 1"; + fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; + name = "PicCastAppDelegate.m: 154"; rLen = 0; - rLoc = 0; + rLoc = 5831; rType = 0; - vrLen = 902; - vrLoc = 453; + vrLen = 1711; + vrLoc = 4442; }; - 4E8CFDB51361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF113637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1C135A194A00BEF0B7 /* HJMOHandler.h */; - name = "HJMOHandler.h: 1"; + fRef = 4EB53EC2136359E3009A5AC5 /* FMDatabaseAdditions.h */; + name = "FMDatabaseAdditions.h: 1"; rLen = 0; rLoc = 0; rType = 0; - vrLen = 967; - vrLoc = 742; + vrLen = 947; + vrLoc = 0; }; - 4E8CFDB61361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF213637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB21135A194A00BEF0B7 /* HJManagedImageVDelegate.h */; - name = "HJManagedImageVDelegate.h: 1"; + fRef = 4EB53EC9136359E3009A5AC5 /* fmdb.m */; + name = "fmdb.m: 1"; rLen = 0; rLoc = 0; rType = 0; - vrLen = 381; + vrLen = 1558; vrLoc = 0; }; - 4E8CFDB71361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF313637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB18135A194A00BEF0B7 /* HJMOUser.h */; - name = "HJMOUser.h: 1"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 16"; rLen = 0; - rLoc = 0; + rLoc = 495; rType = 0; - vrLen = 1357; - vrLoc = 1405; + vrLen = 293; + vrLoc = 0; }; - 4E8CFDB81361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF413637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB16135A194A00BEF0B7 /* HJMOUserBase.m */; - name = "HJMOUserBase.m: 1"; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; rLen = 0; - rLoc = 0; + rLoc = 642; rType = 0; - vrLen = 605; + vrLen = 1365; vrLoc = 0; }; - 4E8CFDB91361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF513637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB17135A194A00BEF0B7 /* HJMOUserBase.h */; - name = "HJMOUserBase.h: 11"; - rLen = 10; - rLoc = 356; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 33"; + rLen = 0; + rLoc = 1442; rType = 0; - vrLen = 638; + vrLen = 751; vrLoc = 0; }; - 4E8CFDBA1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53EF613637BF8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - name = "HJManagedImageV.h: 11"; - rLen = 10; - rLoc = 355; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 222"; + rLen = 0; + rLoc = 7347; rType = 0; - vrLen = 1186; + vrLen = 1553; + vrLoc = 5631; + }; + 4EB53EF713637BF8009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 222"; + rLen = 0; + rLoc = 7367; + rType = 0; + vrLen = 1573; + vrLoc = 5631; + }; + 4EB53F201364E3A8009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282D13594C48001EB808 /* Topic.h */; + name = "Topic.h: 27"; + rLen = 0; + rLoc = 511; + rType = 0; + vrLen = 689; vrLoc = 0; }; - 4E8CFDBB1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53F211364E3A8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 204"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 18"; + rLen = 0; + rLoc = 1129; + rType = 0; + vrLen = 990; + vrLoc = 0; + }; + 4EB53F221364E3A8009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; rLen = 0; - rLoc = 4899; + rLoc = 642; rType = 0; - vrLen = 960; - vrLoc = 5532; + vrLen = 1365; + vrLoc = 0; }; - 4E8CFDBC1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53F231364E3A8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + name = "TopicsViewController.m: 77"; rLen = 0; - rLoc = 2676; + rLoc = 2395; rType = 0; - vrLen = 1349; - vrLoc = 947; + vrLen = 1279; + vrLoc = 2197; }; - 4E8CFDBD1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53F241364E3A8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 1"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 13"; + rLen = 0; + rLoc = 224; + rType = 0; + vrLen = 293; + vrLoc = 0; + }; + 4EB53F251364E3A8009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 19"; + rLen = 0; + rLoc = 402; + rType = 0; + vrLen = 773; + vrLoc = 0; + }; + 4EB53F261364E3A8009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 33"; + rLen = 0; + rLoc = 1439; + rType = 0; + vrLen = 847; + vrLoc = 0; + }; + 4EB53F351364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 20"; + rLen = 0; + rLoc = 468; + rType = 0; + vrLen = 429; + vrLoc = 42; + }; + 4EB53F361364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 43"; + rLen = 0; + rLoc = 1344; + rType = 0; + vrLen = 486; + vrLoc = 733; + }; + 4EB53F371364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 31"; + rLen = 0; + rLoc = 1060; + rType = 0; + vrLen = 678; + vrLoc = 653; + }; + 4EB53F381364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282D13594C48001EB808 /* Topic.h */; + name = "Topic.h: 32"; + rLen = 0; + rLoc = 709; + rType = 0; + vrLen = 527; + vrLoc = 235; + }; + 4EB53F391364EAD1009A5AC5 /* XCBuildMessageTextBookmark */ = { + isa = PBXTextBookmark; + comments = "Expected ';' before '}' token"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + fallbackIsa = XCBuildMessageTextBookmark; + rLen = 1; + rLoc = 123; + rType = 1; + }; + 4EB53F3A1364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 120"; + rLen = 0; + rLoc = 4067; + rType = 0; + vrLen = 530; + vrLoc = 3576; + }; + 4EB53F3B1364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + rLen = 11; + rLoc = 8732; + rType = 0; + }; + 4EB53F3C1364EAD1009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; + rLen = 11; + rLoc = 8732; + rType = 0; + vrLen = 1166; + vrLoc = 8039; + }; + 4EB53F3D1364EAD5009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 120"; + rLen = 0; + rLoc = 4067; + rType = 0; + vrLen = 530; + vrLoc = 3576; + }; + 4EB53F3E1364EAD5009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; + rLen = 11; + rLoc = 8732; + rType = 0; + vrLen = 1166; + vrLoc = 8039; + }; + 4EB53F491364EC4C009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 120"; + rLen = 0; + rLoc = 4107; + rType = 0; + vrLen = 547; + vrLoc = 2888; + }; + 4EB53F4A1364EC4C009A5AC5 /* XCBuildMessageTextBookmark */ = { + isa = PBXTextBookmark; + comments = "Request for member 'creator' in something not a structure or union"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + fallbackIsa = XCBuildMessageTextBookmark; + rLen = 1; + rLoc = 171; + rType = 1; + }; + 4EB53F4B1364EC4C009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; + rLen = 0; + rLoc = 7849; + rType = 0; + vrLen = 972; + vrLoc = 7439; + }; + 4EB53F4C1364EC4C009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; + rLen = 11; + rLoc = 8732; + rType = 0; + vrLen = 1274; + vrLoc = 7927; + }; + 4EB53F571364ED0B009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; + rLen = 0; + rLoc = 7849; + rType = 0; + vrLen = 974; + vrLoc = 7439; + }; + 4EB53F581364ED0B009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; + rLen = 11; + rLoc = 8732; + rType = 0; + vrLen = 1215; + vrLoc = 7965; + }; + 4EB53F591364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 23"; + rLen = 0; + rLoc = 502; + rType = 0; + vrLen = 469; + vrLoc = 0; + }; + 4EB53F5A1364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 21"; + rLen = 0; + rLoc = 518; + rType = 0; + vrLen = 1193; + vrLoc = 0; + }; + 4EB53F5B1364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; + rLen = 5; + rLoc = 644; + rType = 0; + vrLen = 1365; + vrLoc = 0; + }; + 4EB53F5C1364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D1135F5807007FAB8D /* AcidCowFeedburnerParser.h */; + name = "AcidCowFeedburnerParser.h: 1"; rLen = 0; rLoc = 0; rType = 0; - vrLen = 1650; - vrLoc = 2938; + vrLen = 1249; + vrLoc = 0; }; - 4E8CFDBE1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53F5D1364ED0D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 352"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 31"; rLen = 0; - rLoc = 10217; + rLoc = 1098; rType = 0; - vrLen = 651; - vrLoc = 474; + vrLen = 1609; + vrLoc = 133; }; - 4E8CFDBF1361F7C900B810C6 /* PBXTextBookmark */ = { + 4EB53F5E1364ED0D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 346"; + fRef = 4ED6DB12135A194A00BEF0B7 /* HJWeakMutableArray.m */; + name = "HJWeakMutableArray.m: 1"; rLen = 0; - rLoc = 10217; + rLoc = 0; rType = 0; - vrLen = 1220; - vrLoc = 9320; + vrLen = 1192; + vrLoc = 0; }; - 4E8CFDC01361F7C900B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F5F1364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ED6DB13135A194A00BEF0B7 /* HJWeakMutableArray.h */; + name = "HJWeakMutableArray.h: 1"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 0; + rType = 0; + vrLen = 1062; + vrLoc = 0; }; - 4E8CFDC61361F84B00B810C6 /* PBXTextBookmark */ = { + 4EB53F601364ED0D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 204"; + fRef = 4E68282D13594C48001EB808 /* Topic.h */; + name = "Topic.h: 32"; rLen = 0; - rLoc = 4899; + rLoc = 719; rType = 0; - vrLen = 567; - vrLoc = 2072; + vrLen = 768; + vrLoc = 0; }; - 4E8CFDC71361F84B00B810C6 /* PBXTextBookmark */ = { + 4EB53F611364ED0D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 347"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 87"; rLen = 0; - rLoc = 10217; + rLoc = 2949; rType = 0; - vrLen = 1199; - vrLoc = 9320; + vrLen = 1494; + vrLoc = 2494; }; - 4E8CFDC81361F84B00B810C6 /* PBXTextBookmark */ = { + 4EB53F621364ED0D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 14"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; rLen = 0; - rLoc = 434; + rLoc = 7896; rType = 0; - vrLen = 728; - vrLoc = 168; + vrLen = 2576; + vrLoc = 5726; }; - 4E8CFDC91361F84B00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F631364ED0D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 7896; + rType = 0; + vrLen = 2465; + vrLoc = 5839; }; - 4E8CFDCD1361F86C00B810C6 /* PBXTextBookmark */ = { + 4EB53F691364EE56009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 349"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; rLen = 0; - rLoc = 10217; + rLoc = 7896; rType = 0; - vrLen = 1201; - vrLoc = 9604; + vrLen = 2465; + vrLoc = 5839; }; - 4E8CFDCE1361F86C00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F6A1364EE56009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 87"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 2949; + rType = 0; + vrLen = 1445; + vrLoc = 2888; }; - 4E8CFDD11361F8A200B810C6 /* PBXTextBookmark */ = { + 4EB53F6B1364EE56009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 348"; + fRef = 4E68280D13594261001EB808 /* TopicTableViewCell.m */; + name = "TopicTableViewCell.m: 10"; rLen = 0; - rLoc = 10217; + rLoc = 178; rType = 0; - vrLen = 1139; - vrLoc = 9571; - }; - 4E8CFDD21361F8A200B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + vrLen = 1181; + vrLoc = 143; + }; + 4EB53F6C1364EE56009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 37"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 1986; + rType = 0; + vrLen = 1645; + vrLoc = 175; }; - 4E8CFDDA1361F8FA00B810C6 /* PBXTextBookmark */ = { + 4EB53F701364EE73009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 350"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 43"; rLen = 0; - rLoc = 10217; + rLoc = 2320; rType = 0; - vrLen = 1199; - vrLoc = 9281; - }; - 4E8CFDDB1361F8FA00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + vrLen = 1623; + vrLoc = 200; + }; + 4EB53F741364EE8D009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 43"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 2275; + rType = 0; + vrLen = 1606; + vrLoc = 223; }; - 4E8CFDE01361F94500B810C6 /* PBXTextBookmark */ = { + 4EB53F7A1364EED7009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 355"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 43"; + rLen = 78; + rLoc = 2245; + rType = 0; + vrLen = 1607; + vrLoc = 222; + }; + 4EB53F7B1364EED7009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 87"; rLen = 0; - rLoc = 10217; + rLoc = 2949; rType = 0; - vrLen = 1349; - vrLoc = 9281; + vrLen = 1512; + vrLoc = 2822; }; - 4E8CFDE11361F94500B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F7C1364EED7009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 124"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 4208; + rType = 0; + vrLen = 1481; + vrLoc = 2888; }; - 4E8CFDE51361F9B800B810C6 /* PBXTextBookmark */ = { + 4EB53F801364F105009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 355"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 127"; rLen = 0; - rLoc = 10217; + rLoc = 4282; rType = 0; - vrLen = 1211; - vrLoc = 9517; + vrLen = 1574; + vrLoc = 3135; }; - 4E8CFDE61361F9B800B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F811364F105009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282D13594C48001EB808 /* Topic.h */; + name = "Topic.h: 34"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 806; + rType = 0; + vrLen = 858; + vrLoc = 0; }; - 4E8CFDEE1361FA5400B810C6 /* PBXTextBookmark */ = { + 4EB53F821364F105009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 348"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 45"; + rLen = 47; + rLoc = 1519; + rType = 0; + vrLen = 1844; + vrLoc = 134; + }; + 4EB53F831364F105009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 60"; rLen = 0; - rLoc = 10217; + rLoc = 2219; rType = 0; - vrLen = 1212; - vrLoc = 9636; + vrLen = 1604; + vrLoc = 1004; }; - 4E8CFDEF1361FA5400B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F871364F1DC009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 60"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 2219; + rType = 0; + vrLen = 1604; + vrLoc = 1004; }; - 4E8CFDF41361FA8200B810C6 /* PBXTextBookmark */ = { + 4EB53F881364F1DC009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 347"; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; + rLen = 5; + rLoc = 644; + rType = 0; + vrLen = 1365; + vrLoc = 0; + }; + 4EB53F891364F1DC009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 126"; rLen = 0; - rLoc = 10217; + rLoc = 4182; rType = 0; - vrLen = 1261; - vrLoc = 9517; + vrLen = 1606; + vrLoc = 3135; }; - 4E8CFDF51361FA8200B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53F8A1364F1DC009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 224"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 7321; + rType = 0; + vrLen = 1670; + vrLoc = 5891; + }; + 4EB53F8E1364F288009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 220"; + rLen = 0; + rLoc = 7098; + rType = 0; + vrLen = 1783; + vrLoc = 5891; }; - 4E8CFDF91361FAD800B810C6 /* PBXTextBookmark */ = { + 4EB53F8F1364F288009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 357"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 60"; rLen = 0; - rLoc = 10216; + rLoc = 2219; rType = 0; - vrLen = 1199; - vrLoc = 9571; - }; - 4E8CFDFA1361FAD800B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; - rLen = 0; - rLoc = 9223372036854775807; + vrLen = 1604; + vrLoc = 1004; }; - 4E8CFE041361FCE000B810C6 /* XCBuildMessageTextBookmark */ = { + 4EB53F901364F288009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - comments = "Accessing unknown 'squareCropped' getter method"; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - fallbackIsa = XCBuildMessageTextBookmark; - rLen = 1; - rLoc = 97; - rType = 1; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 55"; + rLen = 0; + rLoc = 1974; + rType = 0; + vrLen = 1599; + vrLoc = 1060; }; - 4E8CFE051361FCE000B810C6 /* PBXTextBookmark */ = { + 4EB53F941364F2D2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 99"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 55"; rLen = 0; - rLoc = 3454; + rLoc = 1974; rType = 0; - vrLen = 551; - vrLoc = 3191; + vrLen = 2018; + vrLoc = 440; }; - 4E8CFE061361FCE000B810C6 /* PBXTextBookmark */ = { + 4EB53F951364F2D2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - name = "HJManagedImageV.h: 11"; - rLen = 10; - rLoc = 355; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 220"; + rLen = 0; + rLoc = 7098; rType = 0; - vrLen = 1104; - vrLoc = 0; + vrLen = 1783; + vrLoc = 5891; }; - 4E8CFE071361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53F961364F2D2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; name = "TopicsViewController.m: 200"; rLen = 0; - rLoc = 2676; + rLoc = 6231; rType = 0; - vrLen = 1176; - vrLoc = 6282; + vrLen = 1624; + vrLoc = 5414; }; - 4E8CFE081361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53F9A1364F45A009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */; - name = "HJObjManager.h: 1"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 21"; rLen = 0; - rLoc = 0; + rLoc = 518; rType = 0; - vrLen = 967; - vrLoc = 466; + vrLen = 1198; + vrLoc = 3; }; - 4E8CFE091361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53F9B1364F45A009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1C135A194A00BEF0B7 /* HJMOHandler.h */; - name = "HJMOHandler.h: 40"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 66"; rLen = 0; - rLoc = 1217; + rLoc = 2429; rType = 0; - vrLen = 938; - vrLoc = 742; + vrLen = 1819; + vrLoc = 651; }; - 4E8CFE0A1361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53F9C1364F45A009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 350"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 200"; rLen = 0; - rLoc = 9714; + rLoc = 6231; rType = 0; - vrLen = 1211; - vrLoc = 9226; + vrLen = 1698; + vrLoc = 5502; }; - 4E8CFE0B1361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53F9D1364F45A009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 87"; - rLen = 27; - rLoc = 2266; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 79"; + rLen = 0; + rLoc = 2608; rType = 0; - vrLen = 702; - vrLoc = 2070; + vrLen = 1423; + vrLoc = 2491; }; - 4E8CFE0C1361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53FA11364F4E2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - name = "HJManagedImageV.h: 11"; - rLen = 10; - rLoc = 355; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; + rLen = 5; + rLoc = 644; rType = 0; - vrLen = 843; - vrLoc = 839; + vrLen = 1365; + vrLoc = 0; }; - 4E8CFE0D1361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53FA21364F4E2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 99"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 79"; rLen = 0; - rLoc = 3454; + rLoc = 2605; rType = 0; - vrLen = 1083; - vrLoc = 2650; + vrLen = 1336; + vrLoc = 2488; }; - 4E8CFE0E1361FCE200B810C6 /* PBXTextBookmark */ = { + 4EB53FA31364F4E2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 99"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 109"; rLen = 0; - rLoc = 3481; + rLoc = 3661; rType = 0; - vrLen = 980; - vrLoc = 2736; - }; - 4E8CFE0F1361FCE200B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; - rLen = 0; - rLoc = 9223372036854775807; + vrLen = 1420; + vrLoc = 2491; }; - 4E8CFE131361FE1A00B810C6 /* PBXTextBookmark */ = { + 4EB53FA71364F548009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */; - name = "HJObjManager.h: 84"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 103"; rLen = 0; - rLoc = 3076; + rLoc = 3390; rType = 0; - vrLen = 1251; - vrLoc = 2247; + vrLen = 1481; + vrLoc = 2513; }; - 4E8CFE141361FE1A00B810C6 /* PBXTextBookmark */ = { + 4EB53FAB1364F5C1009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 104"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 118"; rLen = 0; - rLoc = 3481; + rLoc = 3842; rType = 0; - vrLen = 1064; - vrLoc = 2122; + vrLen = 1545; + vrLoc = 2803; }; - 4E8CFE151361FE1A00B810C6 /* PBXTextBookmark */ = { + 4EB53FAF1364F5D8009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 82"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 118"; rLen = 0; - rLoc = 2621; + rLoc = 3842; rType = 0; - vrLen = 1503; - vrLoc = 2179; - }; - 4E8CFE161361FE1A00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; - rLen = 0; - rLoc = 9223372036854775807; + vrLen = 1456; + vrLoc = 2874; }; - 4E8CFE1C1361FE6A00B810C6 /* PBXTextBookmark */ = { + 4EB53FB31364F699009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 82"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 118"; rLen = 0; - rLoc = 2621; + rLoc = 3842; rType = 0; - vrLen = 1425; - vrLoc = 2307; + vrLen = 1836; + vrLoc = 8938; }; - 4E8CFE1D1361FE6A00B810C6 /* PBXTextBookmark */ = { + 4EB53FB41364F699009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 200"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 66"; rLen = 0; - rLoc = 2676; + rLoc = 2429; rType = 0; - vrLen = 2041; - vrLoc = 6045; + vrLen = 1819; + vrLoc = 651; }; - 4E8CFE1E1361FE6A00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53FB51364F699009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 8711; + rType = 0; + vrLen = 2263; + vrLoc = 6744; }; - 4E8CFE201361FEEF00B810C6 /* PBXTextBookmark */ = { + 4EB53FB91364F6C4009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 200"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 190"; rLen = 0; - rLoc = 2676; + rLoc = 8793; rType = 0; - vrLen = 2028; - vrLoc = 6045; + vrLen = 2262; + vrLoc = 6864; }; - 4E8CFE211361FEEF00B810C6 /* PBXTextBookmark */ = { + 4EB53FBD1364F740009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */; - name = "HJObjManager.h: 83"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 190"; rLen = 0; - rLoc = 3076; + rLoc = 8793; rType = 0; - vrLen = 1685; - vrLoc = 1888; + vrLen = 1807; + vrLoc = 0; }; - 4E8CFE221361FEEF00B810C6 /* PBXTextBookmark */ = { + 4EB53FBE1364F740009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 190"; rLen = 0; - rLoc = 334; + rLoc = 8793; rType = 0; - vrLen = 2117; - vrLoc = 2820; + vrLen = 2272; + vrLoc = 7067; }; - 4E8CFE231361FEEF00B810C6 /* PBXTextBookmark */ = { + 4EB53FC11364F77D009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 24"; rLen = 0; - rLoc = 334; + rLoc = 726; rType = 0; - vrLen = 2044; - vrLoc = 2820; + vrLen = 1867; + vrLoc = 3; }; - 4E8CFE241361FEEF00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53FC31364F82F009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 172"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 7849; + rType = 0; + vrLen = 912; + vrLoc = 7535; }; - 4E8CFE251361FF1B00B810C6 /* PBXTextBookmark */ = { + 4EB53FC41364F82F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; - rLen = 0; - rLoc = 334; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 188"; + rLen = 11; + rLoc = 8732; rType = 0; - vrLen = 2044; - vrLoc = 2820; + vrLen = 1096; + vrLoc = 8141; }; - 4E8CFE261361FF1B00B810C6 /* PBXTextBookmark */ = { + 4EB53FC51364F82F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 200"; rLen = 0; - rLoc = 2676; + rLoc = 3842; rType = 0; - vrLen = 2028; - vrLoc = 6045; }; - 4E8CFE271361FF1B00B810C6 /* PBXTextBookmark */ = { + 4EB53FC61364F82F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + name = "TopicsViewController.m: 118"; rLen = 0; - rLoc = 2676; + rLoc = 3842; rType = 0; - vrLen = 2028; - vrLoc = 6045; + vrLen = 877; + vrLoc = 3420; }; - 4E8CFE281361FF1B00B810C6 /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; + 4EB53FC71364F84B009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */; + name = "AcidCowFeedburnerParser.m: 18"; rLen = 0; - rLoc = 9223372036854775807; + rLoc = 393; + rType = 0; + vrLen = 1841; + vrLoc = 0; }; - 4E8CFE2B1361FFAD00B810C6 /* PBXTextBookmark */ = { + 4EB53FC81364F84B009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + fRef = 4E68282E13594C48001EB808 /* Topic.m */; + name = "Topic.m: 66"; rLen = 0; - rLoc = 2676; + rLoc = 2429; rType = 0; - vrLen = 2028; - vrLoc = 6045; + vrLen = 1835; + vrLoc = 653; }; - 4E8CFE2C1361FFAD00B810C6 /* PBXTextBookmark */ = { + 4EB53FC91364F84B009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 118"; rLen = 0; - rLoc = 334; + rLoc = 3842; rType = 0; - vrLen = 2044; - vrLoc = 2820; + vrLen = 1629; + vrLoc = 3102; }; - 4E8CFE2D1361FFAD00B810C6 /* PBXTextBookmark */ = { + 4EB53FCC1364F905009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 129"; rLen = 0; - rLoc = 334; + rLoc = 4171; rType = 0; - vrLen = 2119; - vrLoc = 2820; + vrLen = 1552; + vrLoc = 2601; }; - 4E8CFE301362039700B810C6 /* PBXTextBookmark */ = { + 4EB53FD01364F98B009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */; - name = "HJObjManager.m: 11"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 202"; rLen = 0; - rLoc = 334; + rLoc = 6172; rType = 0; - vrLen = 1687; - vrLoc = 1837; + vrLen = 1825; + vrLoc = 5817; }; - 4E8CFE311362039700B810C6 /* PBXTextBookmark */ = { + 4EB53FD41364F9F2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1C135A194A00BEF0B7 /* HJMOHandler.h */; - name = "HJMOHandler.h: 40"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 202"; rLen = 0; - rLoc = 1217; + rLoc = 6172; rType = 0; - vrLen = 1537; - vrLoc = 397; + vrLen = 1825; + vrLoc = 5817; }; - 4E8CFE321362039700B810C6 /* PBXTextBookmark */ = { + 4EB53FD51364F9F2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 341"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 21"; rLen = 0; - rLoc = 9544; + rLoc = 518; rType = 0; - vrLen = 1833; - vrLoc = 9307; + vrLen = 1198; + vrLoc = 3; }; - 4E8CFE351362046700B810C6 /* PBXTextBookmark */ = { + 4EB53FD61364F9F2009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 341"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 38"; rLen = 0; - rLoc = 9544; + rLoc = 1184; rType = 0; - vrLen = 1778; - vrLoc = 9308; + vrLen = 1221; + vrLoc = 27; }; - 4E8CFE361362046700B810C6 /* PBXTextBookmark */ = { + 4EB53FDA1364FA5F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 354"; + fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; + name = "TopicsViewController.m: 52"; rLen = 0; - rLoc = 10212; + rLoc = 1928; rType = 0; - vrLen = 1894; - vrLoc = 9307; + vrLen = 1904; + vrLoc = 441; }; - 4E8CFE3A136207C900B810C6 /* PBXTextBookmark */ = { + 4EB53FDB1364FA5F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 354"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 38"; rLen = 0; - rLoc = 10212; + rLoc = 1184; rType = 0; - vrLen = 1973; - vrLoc = 9307; + vrLen = 1242; + vrLoc = 27; }; - 4E8CFE3D136217F800B810C6 /* PBXTextBookmark */ = { + 4EB53FDC1364FA5F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4ED6DB1B135A194A00BEF0B7 /* HJMOHandler.m */; - name = "HJMOHandler.m: 354"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 23"; rLen = 0; - rLoc = 10212; + rLoc = 502; rType = 0; - vrLen = 1874; - vrLoc = 9375; + vrLen = 471; + vrLoc = 0; }; - 4E8CFE3E136217F800B810C6 /* PBXTextBookmark */ = { + 4EB53FE11364FAA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; - name = "TopicsViewController.h: 32"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 23"; rLen = 0; - rLoc = 1082; + rLoc = 502; rType = 0; - vrLen = 1328; + vrLen = 471; vrLoc = 0; }; - 4E8CFE3F136217F800B810C6 /* PBXTextBookmark */ = { + 4EB53FE21364FAA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 194"; + name = "TopicsViewController.m: 52"; rLen = 0; - rLoc = 2676; + rLoc = 1928; rType = 0; - vrLen = 1978; - vrLoc = 781; + vrLen = 1904; + vrLoc = 441; }; - 4E8CFE40136217F800B810C6 /* PBXTextBookmark */ = { + 4EB53FE31364FAA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 88"; + name = "TopicsViewController.m: 202"; rLen = 0; - rLoc = 2676; + rLoc = 6172; + rType = 0; + vrLen = 1759; + vrLoc = 5672; + }; + 4EB53FE81364FAEB009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; + name = "TopicsViewController.h: 21"; + rLen = 5; + rLoc = 644; rType = 0; - vrLen = 1742; - vrLoc = 2170; + vrLen = 1365; + vrLoc = 0; }; - 4E8CFE43136229DD00B810C6 /* PBXTextBookmark */ = { + 4EB53FE91364FAEB009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 18"; + name = "TopicsViewController.m: 202"; rLen = 0; - rLoc = 440; + rLoc = 6172; rType = 0; - vrLen = 1953; - vrLoc = 149; + vrLen = 1904; + vrLoc = 441; }; - 4E8CFE44136229DD00B810C6 /* PBXTextBookmark */ = { + 4EB53FEA1364FAEB009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; - name = "PicCastAppDelegate.m: 37"; - rLen = 146; - rLoc = 1629; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 38"; + rLen = 0; + rLoc = 1184; rType = 0; - vrLen = 1721; - vrLoc = 225; + vrLen = 1221; + vrLoc = 27; }; - 4E8CFE45136229DD00B810C6 /* PBXTextBookmark */ = { + 4EB53FEB1364FAEB009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; - name = "PicCastAppDelegate.m: 26"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 21"; rLen = 0; - rLoc = 764; + rLoc = 431; rType = 0; - vrLen = 1524; - vrLoc = 3; + vrLen = 1199; + vrLoc = 39; }; - 4E8CFE4913622A3600B810C6 /* PBXTextBookmark */ = { + 4EB53FF01364FB26009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 1D3623250D0F684500981E51 /* PicCastAppDelegate.m */; - name = "PicCastAppDelegate.m: 26"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 25"; rLen = 0; - rLoc = 764; + rLoc = 517; rType = 0; - vrLen = 2104; - vrLoc = 2008; + vrLen = 1139; + vrLoc = 85; }; - 4E8CFE4A13622A3600B810C6 /* PBXTextBookmark */ = { + 4EB53FF51364FB4E009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 18"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 26"; rLen = 0; - rLoc = 440; + rLoc = 517; rType = 0; - vrLen = 1953; - vrLoc = 149; + vrLen = 1154; + vrLoc = 145; }; - 4E8CFE4B13622A3600B810C6 /* PBXTextBookmark */ = { + 4EB53FFA1364FC1F009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 148"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 36"; rLen = 0; - rLoc = 4693; + rLoc = 674; rType = 0; - vrLen = 1535; - vrLoc = 3618; + vrLen = 1193; + vrLoc = 235; }; - 4E8CFE4F13622A5D00B810C6 /* PBXTextBookmark */ = { + 4EB53FFF1364FDA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 121"; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 49"; rLen = 0; - rLoc = 3773; + rLoc = 1251; rType = 0; - vrLen = 1471; - vrLoc = 3654; + vrLen = 1146; + vrLoc = 234; }; - 4E8CFE5313622A7900B810C6 /* PBXTextBookmark */ = { + 4EB540001364FDA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4E6827E813594115001EB808 /* TopicsViewController.m */; - name = "TopicsViewController.m: 145"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 15"; rLen = 0; - rLoc = 4643; + rLoc = 275; rType = 0; - vrLen = 1503; - vrLoc = 3723; - }; - 4EA95FC9135CE8C3009243EE /* PhotoSource.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 2509}}"; - sepNavSelRange = "{3515, 0}"; - sepNavVisRange = "{3255, 1186}"; - }; - }; - 4EA95FCA135CE8C3009243EE /* PhotoSource.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 585}}"; - sepNavSelRange = "{274, 0}"; - sepNavVisRange = "{0, 1194}"; - }; - }; - 4EA95FD3135CE959009243EE /* PhotoViewController.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 409}}"; - sepNavSelRange = "{501, 0}"; - sepNavVisRange = "{0, 529}"; - }; - }; - 4EA95FD4135CE959009243EE /* PhotoViewController.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {903, 2132}}"; - sepNavSelRange = "{530, 0}"; - sepNavVisRange = "{241, 747}"; - }; + vrLen = 512; + vrLoc = 0; }; - 4EA96020135CF43B009243EE /* PBXTextBookmark */ = { + 4EB540011364FDA0009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4EA95FC9135CE8C3009243EE /* PhotoSource.m */; - name = "PhotoSource.m: 135"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 12"; rLen = 0; - rLoc = 3515; + rLoc = 222; rType = 0; - vrLen = 1186; - vrLoc = 3255; + vrLen = 502; + vrLoc = 0; }; - 4EA96027135CF455009243EE /* PBXTextBookmark */ = { + 4EB540061364FED6009A5AC5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4EA95FCA135CE8C3009243EE /* PhotoSource.h */; - name = "PhotoSource.h: 10"; + fRef = 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */; + name = "SectionDictionary.h: 12"; rLen = 0; - rLoc = 274; + rLoc = 222; rType = 0; - vrLen = 1194; + vrLen = 502; vrLoc = 0; }; + 4EB540071364FED6009A5AC5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; + name = "SectionDictionary.m: 50"; + rLen = 0; + rLoc = 1251; + rType = 0; + vrLen = 1299; + vrLoc = 146; + }; 4EBFCB481360E786005AC5CC /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4EBFCB491360E786005AC5CC /* UIView.h */; @@ -1484,16 +1840,6 @@ vrLen = 680; vrLoc = 0; }; - 4EBFCB7A1360F428005AC5CC /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4E6827E713594115001EB808 /* TopicsViewController.h */; - name = "TopicsViewController.h: 27"; - rLen = 0; - rLoc = 808; - rType = 0; - vrLen = 1239; - vrLoc = 0; - }; 4EBFCBD11360FA86005AC5CC /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4ECFB7D5135FC4B0007FAB8D /* SourcesEditViewController.m */; @@ -1514,17 +1860,19 @@ vrLen = 747; vrLoc = 241; }; - 4EBFCBF413611E90005AC5CC /* PlistBookmark */ = { - isa = PlistBookmark; - fRef = 8D1107310486CEB800E47090 /* PicCast-Info.plist */; - fallbackIsa = PBXBookmark; - isK = 0; - kPath = ( - CFBundleIdentifier, - ); - name = "/Users/handler/Documents/code/xCode/PicCast/PicCast-Info.plist"; - rLen = 0; - rLoc = 9223372036854775808; + 4ECFB6D0135F5807007FAB8D /* AcidCowFeedburnerParser.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1160, 2665}}"; + sepNavSelRange = "{7849, 0}"; + sepNavVisRange = "{7480, 932}"; + }; + }; + 4ECFB6D1135F5807007FAB8D /* AcidCowFeedburnerParser.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 623}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1249}"; + }; }; 4ECFB6E1135F58D2007FAB8D /* PBXTextBookmark */ = { isa = PBXTextBookmark; @@ -1609,11 +1957,25 @@ vrLen = 798; vrLoc = 0; }; + 4ED6DB12135A194A00BEF0B7 /* HJWeakMutableArray.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 1833}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1192}"; + }; + }; + 4ED6DB13135A194A00BEF0B7 /* HJWeakMutableArray.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {903, 623}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1062}"; + }; + }; 4ED6DB14135A194A00BEF0B7 /* HJObjManager.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {929, 1976}}"; - sepNavSelRange = "{334, 0}"; - sepNavVisRange = "{1837, 1687}"; + sepNavIntBoundsRect = "{{0, 0}, {1160, 2106}}"; + sepNavSelRange = "{3454, 0}"; + sepNavVisRange = "{3256, 563}"; }; }; 4ED6DB15135A194A00BEF0B7 /* HJObjManager.h */ = { @@ -1696,26 +2058,6 @@ vrLen = 798; vrLoc = 0; }; - 4ED6DB4F135A25C700BEF0B7 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4ED6DB23135A194A00BEF0B7 /* HJManagedImageV.h */; - name = "HJManagedImageV.h: 55"; - rLen = 0; - rLoc = 1711; - rType = 0; - vrLen = 981; - vrLoc = 1246; - }; - 4ED6DB50135A25C700BEF0B7 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4ED6DB22135A194A00BEF0B7 /* HJManagedImageV.m */; - name = "HJManagedImageV.m: 102"; - rLen = 0; - rLoc = 2624; - rType = 0; - vrLen = 715; - vrLoc = 4147; - }; 4ED6DC28135B365F00BEF0B7 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4E6828171359437D001EB808 /* XMLParser.m */; @@ -1741,7 +2083,7 @@ fRef = 4E68282E13594C48001EB808 /* Topic.m */; name = "Topic.m: 18"; rLen = 0; - rLoc = 322; + rLoc = 2525; rType = 0; vrLen = 494; vrLoc = 0; diff --git a/PicCast.xcodeproj/project.pbxproj b/PicCast.xcodeproj/project.pbxproj index e615bb9..f450738 100644 --- a/PicCast.xcodeproj/project.pbxproj +++ b/PicCast.xcodeproj/project.pbxproj @@ -31,9 +31,14 @@ 4E68282F13594C48001EB808 /* Topic.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E68282E13594C48001EB808 /* Topic.m */; }; 4E68298B13596FB9001EB808 /* TopicTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4E68298A13596FB9001EB808 /* TopicTableViewCell.xib */; }; 4E6829F313597AF1001EB808 /* AsyncImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6829F113597AF1001EB808 /* AsyncImageView.m */; }; - 4E759C46135DCC4D00171031 /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E759C45135DCC4D00171031 /* iAd.framework */; }; + 4E8CFE9C136234CA00B810C6 /* PicCastSqlTable.db in Resources */ = {isa = PBXBuildFile; fileRef = 4E8CFE9B136234CA00B810C6 /* PicCastSqlTable.db */; }; 4EA95FCB135CE8C3009243EE /* PhotoSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA95FC9135CE8C3009243EE /* PhotoSource.m */; }; 4EA95FD5135CE959009243EE /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA95FD4135CE959009243EE /* PhotoViewController.m */; }; + 4EB53ECA136359E3009A5AC5 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EB53EC3136359E3009A5AC5 /* FMDatabaseAdditions.m */; }; + 4EB53ECB136359E3009A5AC5 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EB53EC5136359E3009A5AC5 /* FMDatabase.m */; }; + 4EB53ECC136359E3009A5AC5 /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EB53EC7136359E3009A5AC5 /* FMResultSet.m */; }; + 4EB53ED213635A22009A5AC5 /* libsqlite3.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EB53ED113635A22009A5AC5 /* libsqlite3.0.dylib */; }; + 4EB53EE81363773B009A5AC5 /* SectionDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */; }; 4EBFCAD51360D12C005AC5CC /* titleBarBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 4EBFCAD41360D12C005AC5CC /* titleBarBackground.png */; }; 4EBFCB0B1360DDB5005AC5CC /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 4EBFCB0A1360DDB5005AC5CC /* Default.png */; }; 4EBFCB261360E0D2005AC5CC /* PicCast.512.png in Resources */ = {isa = PBXBuildFile; fileRef = 4EBFCB251360E0D2005AC5CC /* PicCast.512.png */; }; @@ -252,11 +257,21 @@ 4E68298A13596FB9001EB808 /* TopicTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TopicTableViewCell.xib; sourceTree = ""; }; 4E6829F113597AF1001EB808 /* AsyncImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncImageView.m; sourceTree = ""; }; 4E6829F213597AF1001EB808 /* AsyncImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncImageView.h; sourceTree = ""; }; - 4E759C45135DCC4D00171031 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; + 4E8CFE9B136234CA00B810C6 /* PicCastSqlTable.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = PicCastSqlTable.db; sourceTree = ""; }; 4EA95FC9135CE8C3009243EE /* PhotoSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoSource.m; sourceTree = ""; }; 4EA95FCA135CE8C3009243EE /* PhotoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoSource.h; sourceTree = ""; }; 4EA95FD3135CE959009243EE /* PhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoViewController.h; sourceTree = ""; }; 4EA95FD4135CE959009243EE /* PhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoViewController.m; sourceTree = ""; }; + 4EB53EC2136359E3009A5AC5 /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseAdditions.h; sourceTree = ""; }; + 4EB53EC3136359E3009A5AC5 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseAdditions.m; sourceTree = ""; }; + 4EB53EC4136359E3009A5AC5 /* FMDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabase.h; sourceTree = ""; }; + 4EB53EC5136359E3009A5AC5 /* FMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabase.m; sourceTree = ""; }; + 4EB53EC6136359E3009A5AC5 /* FMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMResultSet.h; sourceTree = ""; }; + 4EB53EC7136359E3009A5AC5 /* FMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMResultSet.m; sourceTree = ""; }; + 4EB53EC8136359E3009A5AC5 /* fmdb_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fmdb_Prefix.pch; sourceTree = ""; }; + 4EB53ED113635A22009A5AC5 /* libsqlite3.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.0.dylib; path = usr/lib/libsqlite3.0.dylib; sourceTree = SDKROOT; }; + 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionDictionary.h; sourceTree = ""; }; + 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionDictionary.m; sourceTree = ""; }; 4EBFCAD41360D12C005AC5CC /* titleBarBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = titleBarBackground.png; sourceTree = ""; }; 4EBFCB0A1360DDB5005AC5CC /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 4EBFCB251360E0D2005AC5CC /* PicCast.512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = PicCast.512.png; sourceTree = SOURCE_ROOT; }; @@ -322,7 +337,7 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, - 4E759C46135DCC4D00171031 /* iAd.framework in Frameworks */, + 4EB53ED213635A22009A5AC5 /* libsqlite3.0.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -332,6 +347,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 4EB53EBE136359D5009A5AC5 /* fmdb */, + 4EB53E6513634D4E009A5AC5 /* Data Managers */, 4ECFB853135FD22C007FAB8D /* Cells */, 4ECFB7D4135FC4B0007FAB8D /* SourcesEditViewController.h */, 4ECFB7D5135FC4B0007FAB8D /* SourcesEditViewController.m */, @@ -366,6 +383,7 @@ 29B97314FDCFA39411CA2CEA /* PicCast */ = { isa = PBXGroup; children = ( + 4E8CFE9B136234CA00B810C6 /* PicCastSqlTable.db */, 4EBFCBBC1360F90A005AC5CC /* Default@2x.png */, 4EBFCB0A1360DDB5005AC5CC /* Default.png */, 080E96DDFE201D6D7F000001 /* Classes */, @@ -414,7 +432,6 @@ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765070DF74369002DB57D /* CoreGraphics.framework */, - 4E759C45135DCC4D00171031 /* iAd.framework */, ); name = Frameworks; sourceTree = ""; @@ -502,10 +519,33 @@ 4E6829F213597AF1001EB808 /* AsyncImageView.h */, 4E68282D13594C48001EB808 /* Topic.h */, 4E68282E13594C48001EB808 /* Topic.m */, + 4EB53EE61363773B009A5AC5 /* SectionDictionary.h */, + 4EB53EE71363773B009A5AC5 /* SectionDictionary.m */, ); name = Objects; sourceTree = ""; }; + 4EB53E6513634D4E009A5AC5 /* Data Managers */ = { + isa = PBXGroup; + children = ( + ); + name = "Data Managers"; + sourceTree = ""; + }; + 4EB53EBE136359D5009A5AC5 /* fmdb */ = { + isa = PBXGroup; + children = ( + 4EB53EC2136359E3009A5AC5 /* FMDatabaseAdditions.h */, + 4EB53EC3136359E3009A5AC5 /* FMDatabaseAdditions.m */, + 4EB53EC4136359E3009A5AC5 /* FMDatabase.h */, + 4EB53EC5136359E3009A5AC5 /* FMDatabase.m */, + 4EB53EC6136359E3009A5AC5 /* FMResultSet.h */, + 4EB53EC7136359E3009A5AC5 /* FMResultSet.m */, + 4EB53EC8136359E3009A5AC5 /* fmdb_Prefix.pch */, + ); + name = fmdb; + sourceTree = ""; + }; 4ECFB751135F8869007FAB8D /* Images */ = { isa = PBXGroup; children = ( @@ -777,6 +817,7 @@ 4EBFCBB01360F8FE005AC5CC /* backgroundGradient@2x.png in Resources */, 4EBFCBB11360F8FE005AC5CC /* backgroundGradient.png in Resources */, 4EBFCBBD1360F90A005AC5CC /* Default@2x.png in Resources */, + 4E8CFE9C136234CA00B810C6 /* PicCastSqlTable.db in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -809,6 +850,10 @@ 4ECFB6D2135F5807007FAB8D /* AcidCowFeedburnerParser.m in Sources */, 4ECFB7D7135FC4B0007FAB8D /* SourcesEditViewController.m in Sources */, 4ECFB858135FD34B007FAB8D /* SourcesEditViewCell.m in Sources */, + 4EB53ECA136359E3009A5AC5 /* FMDatabaseAdditions.m in Sources */, + 4EB53ECB136359E3009A5AC5 /* FMDatabase.m in Sources */, + 4EB53ECC136359E3009A5AC5 /* FMResultSet.m in Sources */, + 4EB53EE81363773B009A5AC5 /* SectionDictionary.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PicCastSqlTable.db b/PicCastSqlTable.db new file mode 100644 index 0000000..09487f0 Binary files /dev/null and b/PicCastSqlTable.db differ -- cgit v1.2.3