From 510fdc1fd01be5c9a47d38b8bc929df2c4199962 Mon Sep 17 00:00:00 2001 From: Gerad Suyderhoud Date: Wed, 14 Sep 2011 00:28:15 -0700 Subject: [PATCH] initial mac app scaffold --- .gitignore | 6 + Tractor/Tractor.xcodeproj/project.pbxproj | 470 ++++++++++++++++++ Tractor/Tractor/Tractor-Info.plist | 38 ++ Tractor/Tractor/Tractor-Prefix.pch | 7 + .../Tractor.xcdatamodeld/.xccurrentversion | 8 + .../Tractor.xcdatamodel/contents | 4 + Tractor/Tractor/TractorAppDelegate.h | 20 + Tractor/Tractor/TractorAppDelegate.m | 195 ++++++++ Tractor/Tractor/en.lproj/Credits.rtf | 29 ++ Tractor/Tractor/en.lproj/InfoPlist.strings | 2 + Tractor/Tractor/en.lproj/MainMenu.xib | 265 ++++++++++ Tractor/Tractor/main.m | 14 + Tractor/Tractor/tractor.tiff | Bin 0 -> 1842 bytes Tractor/TractorTests/TractorTests-Info.plist | 22 + Tractor/TractorTests/TractorTests.h | 5 + Tractor/TractorTests/TractorTests.m | 24 + .../TractorTests/en.lproj/InfoPlist.strings | 2 + design/tractor.pxm | Bin 0 -> 7344 bytes 18 files changed, 1111 insertions(+) create mode 100644 Tractor/Tractor.xcodeproj/project.pbxproj create mode 100644 Tractor/Tractor/Tractor-Info.plist create mode 100644 Tractor/Tractor/Tractor-Prefix.pch create mode 100644 Tractor/Tractor/Tractor.xcdatamodeld/.xccurrentversion create mode 100644 Tractor/Tractor/Tractor.xcdatamodeld/Tractor.xcdatamodel/contents create mode 100644 Tractor/Tractor/TractorAppDelegate.h create mode 100644 Tractor/Tractor/TractorAppDelegate.m create mode 100644 Tractor/Tractor/en.lproj/Credits.rtf create mode 100644 Tractor/Tractor/en.lproj/InfoPlist.strings create mode 100644 Tractor/Tractor/en.lproj/MainMenu.xib create mode 100644 Tractor/Tractor/main.m create mode 100644 Tractor/Tractor/tractor.tiff create mode 100644 Tractor/TractorTests/TractorTests-Info.plist create mode 100644 Tractor/TractorTests/TractorTests.h create mode 100644 Tractor/TractorTests/TractorTests.m create mode 100644 Tractor/TractorTests/en.lproj/InfoPlist.strings create mode 100644 design/tractor.pxm diff --git a/.gitignore b/.gitignore index 7956dee..a96f3fe 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,9 @@ .bundle .monitor node_modules + +Tractor/build/* +*.pbxuser +*.mode1v3 +xcuserdata +project.xcworkspace/ diff --git a/Tractor/Tractor.xcodeproj/project.pbxproj b/Tractor/Tractor.xcodeproj/project.pbxproj new file mode 100644 index 0000000..651c016 --- /dev/null +++ b/Tractor/Tractor.xcodeproj/project.pbxproj @@ -0,0 +1,470 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + F2A0B49C14207CA000F07F32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2A0B49B14207CA000F07F32 /* Cocoa.framework */; }; + F2A0B4A614207CA000F07F32 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4A414207CA000F07F32 /* InfoPlist.strings */; }; + F2A0B4A814207CA000F07F32 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A0B4A714207CA000F07F32 /* main.m */; }; + F2A0B4AC14207CA000F07F32 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4AA14207CA000F07F32 /* Credits.rtf */; }; + F2A0B4AF14207CA000F07F32 /* TractorAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A0B4AE14207CA000F07F32 /* TractorAppDelegate.m */; }; + F2A0B4B214207CA000F07F32 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4B014207CA000F07F32 /* MainMenu.xib */; }; + F2A0B4B514207CA000F07F32 /* Tractor.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = F2A0B4B314207CA000F07F32 /* Tractor.xcdatamodeld */; }; + F2A0B4BD14207CA000F07F32 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2A0B4BC14207CA000F07F32 /* SenTestingKit.framework */; }; + F2A0B4BE14207CA000F07F32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2A0B49B14207CA000F07F32 /* Cocoa.framework */; }; + F2A0B4C614207CA000F07F32 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4C414207CA000F07F32 /* InfoPlist.strings */; }; + F2A0B4C814207CA000F07F32 /* TractorTests.h in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4C714207CA000F07F32 /* TractorTests.h */; }; + F2A0B4CA14207CA000F07F32 /* TractorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A0B4C914207CA000F07F32 /* TractorTests.m */; }; + F2A0B4D41420845200F07F32 /* tractor.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F2A0B4D31420845200F07F32 /* tractor.tiff */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + F2A0B4BF14207CA000F07F32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F2A0B48E14207CA000F07F32 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F2A0B49614207CA000F07F32; + remoteInfo = Tractor; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + F2A0B49714207CA000F07F32 /* Tractor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tractor.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F2A0B49B14207CA000F07F32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + F2A0B49E14207CA000F07F32 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + F2A0B49F14207CA000F07F32 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + F2A0B4A014207CA000F07F32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + F2A0B4A314207CA000F07F32 /* Tractor-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tractor-Info.plist"; sourceTree = ""; }; + F2A0B4A514207CA000F07F32 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + F2A0B4A714207CA000F07F32 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + F2A0B4A914207CA000F07F32 /* Tractor-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tractor-Prefix.pch"; sourceTree = ""; }; + F2A0B4AB14207CA000F07F32 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + F2A0B4AD14207CA000F07F32 /* TractorAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TractorAppDelegate.h; sourceTree = ""; }; + F2A0B4AE14207CA000F07F32 /* TractorAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TractorAppDelegate.m; sourceTree = ""; }; + F2A0B4B114207CA000F07F32 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + F2A0B4B414207CA000F07F32 /* Tractor.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Tractor.xcdatamodel; sourceTree = ""; }; + F2A0B4BB14207CA000F07F32 /* TractorTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TractorTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + F2A0B4BC14207CA000F07F32 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + F2A0B4C314207CA000F07F32 /* TractorTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TractorTests-Info.plist"; sourceTree = ""; }; + F2A0B4C514207CA000F07F32 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + F2A0B4C714207CA000F07F32 /* TractorTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TractorTests.h; sourceTree = ""; }; + F2A0B4C914207CA000F07F32 /* TractorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TractorTests.m; sourceTree = ""; }; + F2A0B4D31420845200F07F32 /* tractor.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = tractor.tiff; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F2A0B49414207CA000F07F32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B49C14207CA000F07F32 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F2A0B4B714207CA000F07F32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B4BD14207CA000F07F32 /* SenTestingKit.framework in Frameworks */, + F2A0B4BE14207CA000F07F32 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F2A0B48C14207CA000F07F32 = { + isa = PBXGroup; + children = ( + F2A0B4A114207CA000F07F32 /* Tractor */, + F2A0B4C114207CA000F07F32 /* TractorTests */, + F2A0B49A14207CA000F07F32 /* Frameworks */, + F2A0B49814207CA000F07F32 /* Products */, + ); + sourceTree = ""; + }; + F2A0B49814207CA000F07F32 /* Products */ = { + isa = PBXGroup; + children = ( + F2A0B49714207CA000F07F32 /* Tractor.app */, + F2A0B4BB14207CA000F07F32 /* TractorTests.octest */, + ); + name = Products; + sourceTree = ""; + }; + F2A0B49A14207CA000F07F32 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F2A0B49B14207CA000F07F32 /* Cocoa.framework */, + F2A0B4BC14207CA000F07F32 /* SenTestingKit.framework */, + F2A0B49D14207CA000F07F32 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + F2A0B49D14207CA000F07F32 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + F2A0B49E14207CA000F07F32 /* AppKit.framework */, + F2A0B49F14207CA000F07F32 /* CoreData.framework */, + F2A0B4A014207CA000F07F32 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + F2A0B4A114207CA000F07F32 /* Tractor */ = { + isa = PBXGroup; + children = ( + F2A0B4AD14207CA000F07F32 /* TractorAppDelegate.h */, + F2A0B4AE14207CA000F07F32 /* TractorAppDelegate.m */, + F2A0B4D31420845200F07F32 /* tractor.tiff */, + F2A0B4B014207CA000F07F32 /* MainMenu.xib */, + F2A0B4B314207CA000F07F32 /* Tractor.xcdatamodeld */, + F2A0B4A214207CA000F07F32 /* Supporting Files */, + ); + path = Tractor; + sourceTree = ""; + }; + F2A0B4A214207CA000F07F32 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + F2A0B4A314207CA000F07F32 /* Tractor-Info.plist */, + F2A0B4A414207CA000F07F32 /* InfoPlist.strings */, + F2A0B4A714207CA000F07F32 /* main.m */, + F2A0B4A914207CA000F07F32 /* Tractor-Prefix.pch */, + F2A0B4AA14207CA000F07F32 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + F2A0B4C114207CA000F07F32 /* TractorTests */ = { + isa = PBXGroup; + children = ( + F2A0B4C714207CA000F07F32 /* TractorTests.h */, + F2A0B4C914207CA000F07F32 /* TractorTests.m */, + F2A0B4C214207CA000F07F32 /* Supporting Files */, + ); + path = TractorTests; + sourceTree = ""; + }; + F2A0B4C214207CA000F07F32 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + F2A0B4C314207CA000F07F32 /* TractorTests-Info.plist */, + F2A0B4C414207CA000F07F32 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F2A0B49614207CA000F07F32 /* Tractor */ = { + isa = PBXNativeTarget; + buildConfigurationList = F2A0B4CD14207CA000F07F32 /* Build configuration list for PBXNativeTarget "Tractor" */; + buildPhases = ( + F2A0B49314207CA000F07F32 /* Sources */, + F2A0B49414207CA000F07F32 /* Frameworks */, + F2A0B49514207CA000F07F32 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Tractor; + productName = Tractor; + productReference = F2A0B49714207CA000F07F32 /* Tractor.app */; + productType = "com.apple.product-type.application"; + }; + F2A0B4BA14207CA000F07F32 /* TractorTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F2A0B4D014207CA000F07F32 /* Build configuration list for PBXNativeTarget "TractorTests" */; + buildPhases = ( + F2A0B4B614207CA000F07F32 /* Sources */, + F2A0B4B714207CA000F07F32 /* Frameworks */, + F2A0B4B814207CA000F07F32 /* Resources */, + F2A0B4B914207CA000F07F32 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + F2A0B4C014207CA000F07F32 /* PBXTargetDependency */, + ); + name = TractorTests; + productName = TractorTests; + productReference = F2A0B4BB14207CA000F07F32 /* TractorTests.octest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F2A0B48E14207CA000F07F32 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = F2A0B49114207CA000F07F32 /* Build configuration list for PBXProject "Tractor" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = F2A0B48C14207CA000F07F32; + productRefGroup = F2A0B49814207CA000F07F32 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F2A0B49614207CA000F07F32 /* Tractor */, + F2A0B4BA14207CA000F07F32 /* TractorTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F2A0B49514207CA000F07F32 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B4A614207CA000F07F32 /* InfoPlist.strings in Resources */, + F2A0B4AC14207CA000F07F32 /* Credits.rtf in Resources */, + F2A0B4B214207CA000F07F32 /* MainMenu.xib in Resources */, + F2A0B4D41420845200F07F32 /* tractor.tiff in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F2A0B4B814207CA000F07F32 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B4C614207CA000F07F32 /* InfoPlist.strings in Resources */, + F2A0B4C814207CA000F07F32 /* TractorTests.h in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + F2A0B4B914207CA000F07F32 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F2A0B49314207CA000F07F32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B4A814207CA000F07F32 /* main.m in Sources */, + F2A0B4AF14207CA000F07F32 /* TractorAppDelegate.m in Sources */, + F2A0B4B514207CA000F07F32 /* Tractor.xcdatamodeld in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F2A0B4B614207CA000F07F32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F2A0B4CA14207CA000F07F32 /* TractorTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F2A0B4C014207CA000F07F32 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F2A0B49614207CA000F07F32 /* Tractor */; + targetProxy = F2A0B4BF14207CA000F07F32 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + F2A0B4A414207CA000F07F32 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + F2A0B4A514207CA000F07F32 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + F2A0B4AA14207CA000F07F32 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + F2A0B4AB14207CA000F07F32 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + F2A0B4B014207CA000F07F32 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + F2A0B4B114207CA000F07F32 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + F2A0B4C414207CA000F07F32 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + F2A0B4C514207CA000F07F32 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + F2A0B4CB14207CA000F07F32 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + F2A0B4CC14207CA000F07F32 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + SDKROOT = macosx; + }; + name = Release; + }; + F2A0B4CE14207CA000F07F32 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tractor/Tractor-Prefix.pch"; + INFOPLIST_FILE = "Tractor/Tractor-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + F2A0B4CF14207CA000F07F32 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tractor/Tractor-Prefix.pch"; + INFOPLIST_FILE = "Tractor/Tractor-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + F2A0B4D114207CA000F07F32 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Tractor.app/Contents/MacOS/Tractor"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tractor/Tractor-Prefix.pch"; + INFOPLIST_FILE = "TractorTests/TractorTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + F2A0B4D214207CA000F07F32 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Tractor.app/Contents/MacOS/Tractor"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tractor/Tractor-Prefix.pch"; + INFOPLIST_FILE = "TractorTests/TractorTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F2A0B49114207CA000F07F32 /* Build configuration list for PBXProject "Tractor" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F2A0B4CB14207CA000F07F32 /* Debug */, + F2A0B4CC14207CA000F07F32 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F2A0B4CD14207CA000F07F32 /* Build configuration list for PBXNativeTarget "Tractor" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F2A0B4CE14207CA000F07F32 /* Debug */, + F2A0B4CF14207CA000F07F32 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + F2A0B4D014207CA000F07F32 /* Build configuration list for PBXNativeTarget "TractorTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F2A0B4D114207CA000F07F32 /* Debug */, + F2A0B4D214207CA000F07F32 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + F2A0B4B314207CA000F07F32 /* Tractor.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + F2A0B4B414207CA000F07F32 /* Tractor.xcdatamodel */, + ); + currentVersion = F2A0B4B414207CA000F07F32 /* Tractor.xcdatamodel */; + path = Tractor.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = F2A0B48E14207CA000F07F32 /* Project object */; +} diff --git a/Tractor/Tractor/Tractor-Info.plist b/Tractor/Tractor/Tractor-Info.plist new file mode 100644 index 0000000..da1bfdb --- /dev/null +++ b/Tractor/Tractor/Tractor-Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.fortnightlabs.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.productivity + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2011 Fortnight Labs. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + LSUIElement + + + diff --git a/Tractor/Tractor/Tractor-Prefix.pch b/Tractor/Tractor/Tractor-Prefix.pch new file mode 100644 index 0000000..9a560c1 --- /dev/null +++ b/Tractor/Tractor/Tractor-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'Tractor' target in the 'Tractor' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Tractor/Tractor/Tractor.xcdatamodeld/.xccurrentversion b/Tractor/Tractor/Tractor.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..dbd1af0 --- /dev/null +++ b/Tractor/Tractor/Tractor.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + Tractor.xcdatamodel + + diff --git a/Tractor/Tractor/Tractor.xcdatamodeld/Tractor.xcdatamodel/contents b/Tractor/Tractor/Tractor.xcdatamodeld/Tractor.xcdatamodel/contents new file mode 100644 index 0000000..fd3d23f --- /dev/null +++ b/Tractor/Tractor/Tractor.xcdatamodeld/Tractor.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Tractor/Tractor/TractorAppDelegate.h b/Tractor/Tractor/TractorAppDelegate.h new file mode 100644 index 0000000..3d5561d --- /dev/null +++ b/Tractor/Tractor/TractorAppDelegate.h @@ -0,0 +1,20 @@ +#import + +@interface TractorAppDelegate : NSObject { + NSStatusItem *statusItem; + IBOutlet NSMenu *statusMenu; + NSWindow *window; + NSPersistentStoreCoordinator *__persistentStoreCoordinator; + NSManagedObjectModel *__managedObjectModel; + NSManagedObjectContext *__managedObjectContext; +} + +@property (assign) IBOutlet NSWindow *window; + +@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; +@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; +@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; + +- (IBAction)saveAction:(id)sender; + +@end diff --git a/Tractor/Tractor/TractorAppDelegate.m b/Tractor/Tractor/TractorAppDelegate.m new file mode 100644 index 0000000..4ff4e3e --- /dev/null +++ b/Tractor/Tractor/TractorAppDelegate.m @@ -0,0 +1,195 @@ +#import "TractorAppDelegate.h" + +@implementation TractorAppDelegate + +@synthesize window; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain]; + [statusItem setImage:[NSImage imageNamed:@"tractor.tiff"]]; + [statusItem setMenu:statusMenu]; + [statusItem setHighlightMode:YES]; +} + +/** + Returns the directory the application uses to store the Core Data store file. This code uses a directory named "Tractor" in the user's Library directory. + */ +- (NSURL *)applicationFilesDirectory { + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSURL *libraryURL = [[fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject]; + return [libraryURL URLByAppendingPathComponent:@"Tractor"]; +} + +/** + Creates if necessary and returns the managed object model for the application. + */ +- (NSManagedObjectModel *)managedObjectModel { + if (__managedObjectModel) { + return __managedObjectModel; + } + + NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Tractor" withExtension:@"momd"]; + __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; + return __managedObjectModel; +} + +/** + Returns the persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. (The directory for the store is created, if necessary.) + */ +- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { + if (__persistentStoreCoordinator) { + return __persistentStoreCoordinator; + } + + NSManagedObjectModel *mom = [self managedObjectModel]; + if (!mom) { + NSLog(@"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd)); + return nil; + } + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSURL *applicationFilesDirectory = [self applicationFilesDirectory]; + NSError *error = nil; + + NSDictionary *properties = [applicationFilesDirectory resourceValuesForKeys:[NSArray arrayWithObject:NSURLIsDirectoryKey] error:&error]; + + if (!properties) { + BOOL ok = NO; + if ([error code] == NSFileReadNoSuchFileError) { + ok = [fileManager createDirectoryAtPath:[applicationFilesDirectory path] withIntermediateDirectories:YES attributes:nil error:&error]; + } + if (!ok) { + [[NSApplication sharedApplication] presentError:error]; + return nil; + } + } + else { + if ([[properties objectForKey:NSURLIsDirectoryKey] boolValue] != YES) { + // Customize and localize this error. + NSString *failureDescription = [NSString stringWithFormat:@"Expected a folder to store application data, found a file (%@).", [applicationFilesDirectory path]]; + + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + [dict setValue:failureDescription forKey:NSLocalizedDescriptionKey]; + error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:101 userInfo:dict]; + + [[NSApplication sharedApplication] presentError:error]; + return nil; + } + } + + NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"Tractor.storedata"]; + __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; + if (![__persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error]) { + [[NSApplication sharedApplication] presentError:error]; + [__persistentStoreCoordinator release], __persistentStoreCoordinator = nil; + return nil; + } + + return __persistentStoreCoordinator; +} + +/** + Returns the managed object context for the application (which is already + bound to the persistent store coordinator for the application.) + */ +- (NSManagedObjectContext *)managedObjectContext { + if (__managedObjectContext) { + return __managedObjectContext; + } + + NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; + if (!coordinator) { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey]; + [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey]; + NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; + [[NSApplication sharedApplication] presentError:error]; + return nil; + } + __managedObjectContext = [[NSManagedObjectContext alloc] init]; + [__managedObjectContext setPersistentStoreCoordinator:coordinator]; + + return __managedObjectContext; +} + +/** + Returns the NSUndoManager for the application. In this case, the manager returned is that of the managed object context for the application. + */ +- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window { + return [[self managedObjectContext] undoManager]; +} + +/** + Performs the save action for the application, which is to send the save: message to the application's managed object context. Any encountered errors are presented to the user. + */ +- (IBAction)saveAction:(id)sender { + NSError *error = nil; + + if (![[self managedObjectContext] commitEditing]) { + NSLog(@"%@:%@ unable to commit editing before saving", [self class], NSStringFromSelector(_cmd)); + } + + if (![[self managedObjectContext] save:&error]) { + [[NSApplication sharedApplication] presentError:error]; + } +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { + + // Save changes in the application's managed object context before the application terminates. + + if (!__managedObjectContext) { + return NSTerminateNow; + } + + if (![[self managedObjectContext] commitEditing]) { + NSLog(@"%@:%@ unable to commit editing to terminate", [self class], NSStringFromSelector(_cmd)); + return NSTerminateCancel; + } + + if (![[self managedObjectContext] hasChanges]) { + return NSTerminateNow; + } + + NSError *error = nil; + if (![[self managedObjectContext] save:&error]) { + + // Customize this code block to include application-specific recovery steps. + BOOL result = [sender presentError:error]; + if (result) { + return NSTerminateCancel; + } + + NSString *question = NSLocalizedString(@"Could not save changes while quitting. Quit anyway?", @"Quit without saves error question message"); + NSString *info = NSLocalizedString(@"Quitting now will lose any changes you have made since the last successful save", @"Quit without saves error question info"); + NSString *quitButton = NSLocalizedString(@"Quit anyway", @"Quit anyway button title"); + NSString *cancelButton = NSLocalizedString(@"Cancel", @"Cancel button title"); + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:question]; + [alert setInformativeText:info]; + [alert addButtonWithTitle:quitButton]; + [alert addButtonWithTitle:cancelButton]; + + NSInteger answer = [alert runModal]; + [alert release]; + alert = nil; + + if (answer == NSAlertAlternateReturn) { + return NSTerminateCancel; + } + } + + return NSTerminateNow; +} + +- (void)dealloc +{ + [__managedObjectContext release]; + [__persistentStoreCoordinator release]; + [__managedObjectModel release]; + [super dealloc]; +} + +@end diff --git a/Tractor/Tractor/en.lproj/Credits.rtf b/Tractor/Tractor/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/Tractor/Tractor/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/Tractor/Tractor/en.lproj/InfoPlist.strings b/Tractor/Tractor/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Tractor/Tractor/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Tractor/Tractor/en.lproj/MainMenu.xib b/Tractor/Tractor/en.lproj/MainMenu.xib new file mode 100644 index 0000000..570096d --- /dev/null +++ b/Tractor/Tractor/en.lproj/MainMenu.xib @@ -0,0 +1,265 @@ + + + + 1070 + 11B2118 + 1617 + 1138.1 + 566.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 1617 + + + YES + NSMenu + NSMenuItem + NSCustomObject + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + TractorAppDelegate + + + NSFontManager + + + + + YES + + + Quit Tractor + q + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + + + + + + + YES + + + delegate + + + + 495 + + + + stop: + + + + 542 + + + + statusMenu + + + + 543 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 420 + + + + + 494 + + + + + 536 + + + YES + + + + + + 537 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 420.IBPluginDependency + 494.IBPluginDependency + 536.IBPluginDependency + 537.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + + + + + YES + + + + + 543 + + + + YES + + TractorAppDelegate + NSObject + + saveAction: + id + + + saveAction: + + saveAction: + id + + + + YES + + YES + statusMenu + window + + + YES + NSMenu + NSWindow + + + + YES + + YES + statusMenu + window + + + YES + + statusMenu + NSMenu + + + window + NSWindow + + + + + IBProjectSource + ./Classes/TractorAppDelegate.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + + + diff --git a/Tractor/Tractor/main.m b/Tractor/Tractor/main.m new file mode 100644 index 0000000..ab09dc7 --- /dev/null +++ b/Tractor/Tractor/main.m @@ -0,0 +1,14 @@ +// +// main.m +// Tractor +// +// Created by Gerad Suyderhoud on 9/13/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/Tractor/Tractor/tractor.tiff b/Tractor/Tractor/tractor.tiff new file mode 100644 index 0000000000000000000000000000000000000000..76a65005b86dc3cf12743a07f433e6d26b2bee0e GIT binary patch literal 1842 zcmZux3s4hR6urAiARr)6{t1u?fg(ae_>(440V9Y&1O?QJ2_!%uA(#XcDB2}p`RG_h z5D?Iah}cdC6h$0=;5ZJWw4$w}R_lOTz|lH(U`Ekax(T0Z>+bB^vv=<~_w0LnUqS-- z0T9N3U_gKX0LaV?fB^-f5#yJWf$%TJp8*4!FoNM^ZC(*27WPTP+!t5HWUh^9PYrP1 zEf8h-K92dqGn~hW@1WKldRxbbpl&PSViw_2c2XmjCubmuQHgO+{OqW%PSI1ri+Xp{ zrOAS>nygD30xE}KtmLTcxik?oe^t&OMem5N_hS3s(KkHL*&L)0bczHIL%*#|O~^M~ zoYoe_cMxwpS#kesLU&=*Qty2;m5cYBj7J0^QKN(O_0z#u1I-)UZ6?=*6=*i)l$>cp zc(f8Thug#BM%nkF3A}(#y?iy?N2lv21c!hzS3sEBQw!@Gw6Re`Wr*Ase z`mujaC)!nC*Ig^`V^c7;3!@}T^lFP|?b5Zi42t~{mENp2w!$%P=ZlsM%(@>8VABnc zsRrUs>r*2T%)+4kYV=to@^Em?np`261?NHwmQtbu5A}%|HxKrZK-4%nG11igGQB&E z`it+;;HD805th-=)nW{_W`Ku7C#0p2{dYLmzr1JfcC#ZQg0v2UgcQtjs_)NG8exP8 zjx+~YYkuq2rs^8xy&?^RxGmTsayF!nFNdQ00IpKZu4*|rr&ht`Rt(DWF-J1O1?x^K zkiyCE6b?Mhh4sA#7zV4dD-byTrrw9NYI@)+%;DimdrJ5OLMHbkX=Rv|Py=pn5;`tp z$V)23ji50ln||m-Lc!u2=RCd31e`y-kI)8`XXCchPgyO_UM+dBS#)ImPN3 z=YFcVtmkP{7>DfHYqww6d=7bC2R&9-E$)ues&_QgHm^S}0mvUXc(3tJO2t5Qa{M~F zr9~1@GQz;Kw99Kx>&SRWP;==s*i7CYu-)+UE{oB@q+<DI_dj76Ey z7Q^r^##`Cc-Qa|`^<1Z$Flvh9-Aqnoc1vP;+!Vx>%yjlyY!v472DoQ;H^^M^8@>(xR0rDJ_H< z!VIMIEon3wS0%~jB*zHm==c+lo~zLma#$>_R?E}|GnJ|w7CSOBk`)-l3JMCqGXm7b z1sbs~pg`?4D>APWBUNXqWQ7`;vVdmP6=y1oG(0-pSZLvx^(o0(s8d*^lAEeXvRG2N zR3Rwj)$(>|Dh+1WKo;?v8w oOwtEl*&h5|}O1z`K%wWp#QaQr0w9|}Vxr2qf` literal 0 HcmV?d00001 diff --git a/Tractor/TractorTests/TractorTests-Info.plist b/Tractor/TractorTests/TractorTests-Info.plist new file mode 100644 index 0000000..7e28718 --- /dev/null +++ b/Tractor/TractorTests/TractorTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.fortnightlabs.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tractor/TractorTests/TractorTests.h b/Tractor/TractorTests/TractorTests.h new file mode 100644 index 0000000..6edde80 --- /dev/null +++ b/Tractor/TractorTests/TractorTests.h @@ -0,0 +1,5 @@ +#import + +@interface TractorTests : SenTestCase + +@end diff --git a/Tractor/TractorTests/TractorTests.m b/Tractor/TractorTests/TractorTests.m new file mode 100644 index 0000000..7623976 --- /dev/null +++ b/Tractor/TractorTests/TractorTests.m @@ -0,0 +1,24 @@ +#import "TractorTests.h" + +@implementation TractorTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in TractorTests"); +} + +@end diff --git a/Tractor/TractorTests/en.lproj/InfoPlist.strings b/Tractor/TractorTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Tractor/TractorTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/design/tractor.pxm b/design/tractor.pxm new file mode 100644 index 0000000000000000000000000000000000000000..85657b5846bf2831bb84867666114c546f689dde GIT binary patch literal 7344 zcmbtY2{_bU+aHg$CR8eImR4_x48~Syn89Qj3{uiG7-KL-Gh^S9iA0n#c3PDdQc6O$ zqEw^>r7T&qj(srr&dlhk=Xsy^yWa2m{+DCUocrAOxzBy>^Sgilfj}T)miFd0I3&gp z0)f>LD1GfAZxCHRshDu%uzN7 zB*F#(h9q;5xK$4v4B#IZF z8USH1R#;&F@?FdVi*a%%IMX4g83H891fU6quyiWPiztxD5Kvr!Lz^RvQMe-*j5#iH zNp9gob|O%LIZ+F&9p2N200C2XGZ+G{>0)3`Qt}#{IRa~n#o3{;Xah48&KhNC!_`ho z-We1GSJqNdQPa{^*M@7tRWxC6b%K%_48BKRC1j6$kP7!Rgg18;H+Z(@C<_}L)(mZk z!tx!E_;YIrDizP&6>x*!O=LoNnvyt-HQE?$fiT0N?9oPCy^GA1-1VUtDv97l$8$ph zMpM!lOr`)&XSpTGpWu0jiOf}IFeLws z*wV=+C2vqwfx(niw3T4$@+vAis_NiRUP(n$g}-U2{V$(*hSSnbA``CjJ%b+p2O)3S zWoR1O%Z1=iaN#L|jBvipkA_IlK_m3iriFOhJB%cF(S8LDmG$&s5C*pA?`=gG+(q84(FW`IB7v0T$$1mE;A_9tq+BmRvgcY$kuJeBt4L7A`lW zcv7fXZ@e>b=EjnBw55&VZ`LJv9^=V&1nQFUq~w1-u9dtz`b!4#kJ^+F;76gl(7*zh zK??KMfdaFxBu|0`o_C5#$;)`Y$eS4=d2%tNCHnVl6{pk8zW)f4z{ z1MmSTrle(aFUftba3#Wp;zW?=d1Xz&yKoa2M9ZERE}A8QYEA&kOG@EVP`>!^|0)Jv zdIwOKl0GSUEyw|+??V<@Z>EhXl-o3 z>xh})X$VhmH+*D53D;3!B*A;>vSu^I_%>JIEbVc2C~GVlW5Gup;a}Hf-7i2ngtkCp z4*dp9>j5yqHTKBEG~iqqQdiO3Bd@LoTY{psI5WgyVD%pmZA}m#vw)H+Tz!wcs`^j- z`fa%-{6bq8VfbM52X_M-EbXzLBxeH1d4eyA;D_?!0=5gthNT^@{yD*pL?ZzaU&0H9 zEDnb;L*jl`1)LGa8i%#S*qEV>O>A)dMR@44%$b|Q+;A=d3)B-I08*8kSNwz%;QAtA z>qRHg!Rqp6TroeIVjh1c=11-%acA!J{FRlBJWX(0m*9(^W4xSR{%aKY3viYp;BsZ@ zfSvJPzIYmz6v$0TfOJ9XS|He3A%7mBH5y?4&tNea;(y{7fHgb-d=XH_xV=PXc!&T) z#6e99=Ir>-g%E0iwFK3Sj`nh;2=J=g&w|HA#{a5JUIL|2?60K}3@NU&z?x8~q(BNN zC!U@GhM=qvs66E3E%Wb15-4$tq;m!r5>ryZuB^HD#2im0lDNevEuC9JGr2)ZNdcAG zjNtma@bZ#m?Vs!7JuUG-^=B~y`bkND@U+)}!c3sjNzVT^~G)x!cx#n__!K}HZ;UpT4RjRfMHl5%uyiec?l`YzpTdA7+Xs$AOMyK zU=6?l)&^n2ClQyKAm=YKd6!U>KMs_uxXCDlLnFDjCn;jqsXg{C-&l&x+0X~6gu66D|v0Yp@`~|vG$R^A~>uc^6MdL|(?HV_)OW12~uPr^H zdbVIEtZ-e&x=55w%vIOPEp~NcrY)@nUCfZEdLR?uJf@u}tI(haE|KalUiYBYvMg zeX1_KfBzkUK(L*@*f$zx-ChtfH{~@4d!|o%znvYH=blwt8Z;eiXl`y^=)YMv@Z*jh zJBm`&h`x8^tgWm%vdvPykByC4OeNjQsdt$k{ubA~U76DM?Awl{-ukTKM;=X2*=+x+ ziU`r-K`G^wl$3iDGW-3#LyjIjT9P_z7AL3g#d);TkIm{(E_#!t-}a)q`YGWx^RQkq z*YS`_)V#xJ8X`hOca=_endYuSuW!`O>T|TJNO78Jl5)tdq_1C(j?ctM?|nKu8>kt~ z_HJr!X1~|FfDCF2oSh&gWn>JUTMyf6YaX(j^*(jaPTL`QGMW6iW)MEIS%?0zKfOb0 zrAa{P^)BgZ;36>`-Stt(L(MYNd_$ zyrqSqult#{W4>1C!{Km4bBbBBeqGl4_trJfI;*<$hFuFztV`eLSGOhb8-q5tFh7@D zRP^~%W8>2oG16(~XVQ%0WdqKJSCd;F&-)HG=PLx3nl2kl(tY^x;{bJf*siYbU=mmnr?9{%KZIRJ$bZ#SIPU5~`b0HbGHnpoz~Hr z!jdW-?NDM4k3FvpTA$+F#AGd`qy`@Cx|(Y@S0P&=Qx;WRFMhdd)#W)>R(@gMnAL~F znnN2~uRD%Fs#Es|Jh;gwb$XqyU+D)@O9^K>{IzIYLC?4UbCJNjF$8Av#{ z3AAm}^DEyNqTEGi3%9)MxP#xLNmV}eHchkmA+i3w?6%NLTUdH0j25~!5VsXEd{4^U zG*4^nY0L7*(1MzB9mji2S}(Y5zBs*O_tk`h-3tDq(=x|{zMoW!4_a|NzQ4bJ&q7D; z@RoN`!Qpj&cMeKXGtWwt$FVm~cRCjP79E+%suOy>#gw@RhI8@q3>W`cQzgpWi(9an zv(Y>8{dxSPqy4R^Tc?9`1_<+d&A3K+xq`|3o6SbV^BLXj71OGo*SF|g`KGb6Id=5A zFXXY48C}a-fw;&1etBK28nI4mSg*?=_;|xr)MMiX`@!(qTa1xAws-7OMjpC8!8!#! zJHf*AL?{fMeDwaYbB)A4DBKLmo)(?8loXvd7>tWsB<(X7ePjIU=odc+QD+$~?{ZEA zap=s!`jsv9X$GwIkVTdmkGsOf_$#2cMk0BDykhWfNkd@A>*7iDGP%2eYL}&eqoU z@Hf%8547*DT(Z%z!uTK6E)Mf)?`asZX}C!Fm1t^XwYe!I-+>7*x;Yx;pT24NAf%2^Bt>Gc3^k-wr zOJbuW+Ku$-J+2l`XA+7?O_*|yMEk4U%;7}+93}S($A<%r9-S_7#zj$^qM*l5219u zyl@QM+>66KSp%iWN2Libr}DE*KrwQDd@)0(Tc>~H#mNAWJBueukds0)21m>;T@6B^ zNu(czsne3SWbspPTg3fqv1J|^MemE1WZ@SYW!Rzlvgsd?Y2AhpyN1 zKAu3AO1YPHR(91nnY3MzvkDhx&|ZPG8$*9G7mRXKK~r5i|DP zGGiA!STkYq)0*1XV@h)}1_6a8`eBUF#q)13+D_bNW!xbtiNe*@@8=dGotzc~{Elhb z0>bd{pIWg-oL)wlC(D8cIxu#O{_nTy+>HBDv>|8cGZ=${uLWrR`wZAY>^jnSgvtzm9o=c3>Y_~phz~eXAGpmuscC6#T05C9r-yp$ zGH5e1Gp($Ss)sK9iRGrWBNn$mqjhw2-qf&D{o-VG-O29k=h0G*4h}8QQs#NL%&8AI zF`E{xt{D+te^mUO?;N#B(<}XTUEOe{oW5dfbyjF5i9{;tUAM=+eIdaFW73Xkt<+ak zR5Z>mT*onDoHS68{D+F?u@R*RZYW%a{Jjj{AT}qzpxu1kFz5 z+}!NmT14xmC}1*!bDKI3o-gBEP{1AyV6}%|v#Z>IyEqadBK{ya+kBp(puurCc1*TI zPU%bPot&I2ZTF6qez7wBTn`vm{)@GvBdi&Zp=GK*ihFU-=wONbjfVHq^g^C)(xzUY zk-0DF&1y&7+2wun9z5M?U~2GlC!kY3vihNePx3PN2dwURna*Omiz#XZR0U;#= zO4L@ir~uOonz}pM!(F)!TKlPl$8i?##31V!u47;=*mTZzNzpUPa|! z22bm{#Tu`$yLV*LAT$>cx-o@WWu*(>o?-3dCqvqCJ(erTp~1DSHdS|-QfkAfsaw0A zwokU2HLH!IhlHkT)BC)yzfCz@;CA8D-SOV~eZ$KA!Z7=%^qiUIEU4UANTKi0k=HVf zjD47?I?auv-68%?qIXY|!7GNHX^P@H&Rhhn;95m#Y}>o&vackaX6GJ}q=(^aR*g~f(fL5&9#79%(*X?j|fGFewdXXZw(Vg0Vo=gg8vRHez~o4o~|uW;By zugRjl(RrR)a`i1IeQlOxxx}H_`&C&A3&phFxJj6(-gJ||r`oU{W8&NUb;|?QZw-LE zsjj>36sO}yuYOQ<-t8IY>$`|edJ}WU>j$IN&W3eJG)qqFwwK;HlxH-Sp+}7vf6?mo z^$C7|UyR6%n&0rz56v}c9eI5KWy3?5o+y0rJQfV$#Ed4z$YpmIBg; zc&Y8~H*?}gs>aTqJxhTPOTx(#71cW+nBGCZdur&w%By7}b8Dof!#?EU^f4{@w3GUu z2ql7}tTpukXAP4UAJA*o4K!R|JiK4OZ8b!D=0>J2GvB$UC%UoC`kY$thSrlBzC%Bv z0G<&|Mz;2wCeGD@7wjP`IYOX^+eq2JZt7oZbw*<__4W^3&=EFiQfCr$!|TptYr}5n z`i|;u9S@R2Uyr<{T?^kNEi}EZtT#DEV=`iHh&|d#q|2%i2J-ukO4^y<=`Bv2-G;rM u`>)4S`;b1@Z1izD^P$lS!3rM98CSBiclMYc