From 59481f299326e8b44460c9cfd07a423eab8ce025 Mon Sep 17 00:00:00 2001 From: Conrad Stoll Date: Sat, 7 Jun 2014 12:42:36 -0500 Subject: [PATCH] Initial Commit of VIPER SWIFT --- .gitignore | 24 +- VIPER-SWIFT.xcodeproj/project.pbxproj | 844 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + VIPER-SWIFT/Base.lproj/Main.storyboard | 181 ++++ VIPER-SWIFT/Classes/AppDelegate.swift | 23 + VIPER-SWIFT/Classes/AppDependencies.swift | 58 ++ .../NSCalendar+CalendarAdditions.swift | 163 ++++ VIPER-SWIFT/Classes/Common/Clock/Clock.swift | 13 + .../Classes/Common/Clock/DeviceClock.swift | 15 + .../Common/Model/NearTermDateRelation.swift | 17 + .../Classes/Common/Model/TodoItem.swift | 19 + .../Classes/Common/Store/CoreDataStore.swift | 71 ++ .../Store/Entities/ManagedTodoItem.swift | 15 + .../TODO.xcdatamodel/contents | 10 + .../Classes/Common/View/RootWireframe.swift | 22 + .../Interactor/AddInteractor.swift | 18 + .../Manager/AddDataManager.swift | 21 + .../AddModuleDelegateInterface.swift | 14 + .../Module Interface/AddModuleInterface.swift | 14 + .../Presenter/AddPresenter.swift | 30 + .../Transition/AddDismissalTransition.swift | 40 + .../AddPresentationTransition.swift | 53 ++ .../View/AddViewController.swift | 78 ++ .../View/AddViewInterface.swift | 15 + .../Wireframe/AddWireframe.swift | 54 ++ .../Interactor/ListInteractor.swift | 47 + .../Interactor/ListInteractorIO.swift | 18 + .../Interactor/UpcomingItem.swift | 40 + .../Manager/ListDataManager.swift | 41 + .../ListModuleInterface.swift | 14 + .../Presenter/ListPresenter.swift | 51 ++ .../Presenter/UpcomingDisplayData.swift | 24 + .../UpcomingDisplayDataCollection.swift | 122 +++ .../Presenter/UpcomingDisplayItem.swift | 36 + .../Presenter/UpcomingDisplaySection.swift | 32 + .../View/ListViewController.swift | 94 ++ .../View/ListViewInterface.swift | 17 + .../Wireframe/ListWireframe.swift | 43 + .../AppIcon.appiconset/Contents.json | 24 + .../AppIcon.appiconset/Icon@2x.png | Bin 0 -> 10338 bytes .../LaunchImage.launchimage/Contents.json | 39 + .../LaunchImage@2x.png | Bin 0 -> 62542 bytes .../LaunchImage.launchimage/Splash-4.png | Bin 0 -> 26421 bytes .../LaunchImage.launchimage/Splash-4@2x.png | Bin 0 -> 59682 bytes .../alarm.imageset/Contents.json | 18 + .../Images.xcassets/alarm.imageset/alarm.png | Bin 0 -> 1657 bytes .../alarm.imageset/alarm@2x.png | Bin 0 -> 2564 bytes .../calendar.imageset/Contents.json | 18 + .../calendar.imageset/calendar.png | Bin 0 -> 1180 bytes .../calendar.imageset/calendar@2x.png | Bin 0 -> 1412 bytes .../check.imageset/Contents.json | 18 + .../Images.xcassets/check.imageset/check.png | Bin 0 -> 1279 bytes .../check.imageset/check@2x.png | Bin 0 -> 1636 bytes .../circle.imageset/Contents.json | 18 + .../circle.imageset/circle.png | Bin 0 -> 1560 bytes .../circle.imageset/circle@2x.png | Bin 0 -> 2345 bytes .../empty.imageset/Contents.json | 18 + .../Images.xcassets/empty.imageset/empty.png | Bin 0 -> 6864 bytes .../empty.imageset/empty@2x.png | Bin 0 -> 12442 bytes .../line.imageset/Contents.json | 18 + .../Images.xcassets/line.imageset/line.png | Bin 0 -> 3598 bytes .../Images.xcassets/line.imageset/line@2x.png | Bin 0 -> 4029 bytes .../month.imageset/Contents.json | 18 + .../Images.xcassets/month.imageset/month.png | Bin 0 -> 1072 bytes .../month.imageset/month@2x.png | Bin 0 -> 1118 bytes .../notes.imageset/Contents.json | 18 + .../Images.xcassets/notes.imageset/notes.png | Bin 0 -> 1082 bytes .../notes.imageset/notes@2x.png | Bin 0 -> 1121 bytes .../paper.imageset/Contents.json | 18 + .../Images.xcassets/paper.imageset/paper.png | Bin 0 -> 1188 bytes .../paper.imageset/paper@2x.png | Bin 0 -> 1415 bytes VIPER-SWIFT/Info.plist | 42 + VIPER-SWIFTTests/CalendarTests.swift | 70 ++ VIPER-SWIFTTests/DataTests.swift | 31 + VIPER-SWIFTTests/Info.plist | 24 + VIPER-SWIFTTests/RelativeDateTests.swift | 75 ++ 76 files changed, 2858 insertions(+), 7 deletions(-) create mode 100755 VIPER-SWIFT.xcodeproj/project.pbxproj create mode 100755 VIPER-SWIFT.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100755 VIPER-SWIFT/Base.lproj/Main.storyboard create mode 100755 VIPER-SWIFT/Classes/AppDelegate.swift create mode 100755 VIPER-SWIFT/Classes/AppDependencies.swift create mode 100755 VIPER-SWIFT/Classes/Common/Categories/NSCalendar+CalendarAdditions.swift create mode 100755 VIPER-SWIFT/Classes/Common/Clock/Clock.swift create mode 100755 VIPER-SWIFT/Classes/Common/Clock/DeviceClock.swift create mode 100755 VIPER-SWIFT/Classes/Common/Model/NearTermDateRelation.swift create mode 100755 VIPER-SWIFT/Classes/Common/Model/TodoItem.swift create mode 100755 VIPER-SWIFT/Classes/Common/Store/CoreDataStore.swift create mode 100755 VIPER-SWIFT/Classes/Common/Store/Entities/ManagedTodoItem.swift create mode 100755 VIPER-SWIFT/Classes/Common/Store/TODO.xcdatamodeld/TODO.xcdatamodel/contents create mode 100755 VIPER-SWIFT/Classes/Common/View/RootWireframe.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/Application Logic/Interactor/AddInteractor.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/Application Logic/Manager/AddDataManager.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleDelegateInterface.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleInterface.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/Presenter/AddPresenter.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddDismissalTransition.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddPresentationTransition.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewController.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewInterface.swift create mode 100755 VIPER-SWIFT/Classes/Modules/Add/User Interface/Wireframe/AddWireframe.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractor.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractorIO.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/UpcomingItem.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/Application Logic/Manager/ListDataManager.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/Module Interface/ListModuleInterface.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/ListPresenter.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayData.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayDataCollection.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayItem.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplaySection.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewController.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewInterface.swift create mode 100755 VIPER-SWIFT/Classes/Modules/List/User Interface/Wireframe/ListWireframe.swift create mode 100755 VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Icon@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4.png create mode 100755 VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/alarm.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/alarm.imageset/alarm.png create mode 100755 VIPER-SWIFT/Images.xcassets/alarm.imageset/alarm@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/calendar.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/calendar.imageset/calendar.png create mode 100755 VIPER-SWIFT/Images.xcassets/calendar.imageset/calendar@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/check.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/check.imageset/check.png create mode 100755 VIPER-SWIFT/Images.xcassets/check.imageset/check@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/circle.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/circle.imageset/circle.png create mode 100755 VIPER-SWIFT/Images.xcassets/circle.imageset/circle@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/empty.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/empty.imageset/empty.png create mode 100755 VIPER-SWIFT/Images.xcassets/empty.imageset/empty@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/line.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/line.imageset/line.png create mode 100755 VIPER-SWIFT/Images.xcassets/line.imageset/line@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/month.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/month.imageset/month.png create mode 100755 VIPER-SWIFT/Images.xcassets/month.imageset/month@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/notes.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/notes.imageset/notes.png create mode 100755 VIPER-SWIFT/Images.xcassets/notes.imageset/notes@2x.png create mode 100755 VIPER-SWIFT/Images.xcassets/paper.imageset/Contents.json create mode 100755 VIPER-SWIFT/Images.xcassets/paper.imageset/paper.png create mode 100755 VIPER-SWIFT/Images.xcassets/paper.imageset/paper@2x.png create mode 100755 VIPER-SWIFT/Info.plist create mode 100755 VIPER-SWIFTTests/CalendarTests.swift create mode 100755 VIPER-SWIFTTests/DataTests.swift create mode 100755 VIPER-SWIFTTests/Info.plist create mode 100755 VIPER-SWIFTTests/RelativeDateTests.swift diff --git a/.gitignore b/.gitignore index d522f94..39182e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,18 @@ -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control? -# -# Pods/ +# Xcode +.DS_Store +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +profile +*.moved-aside +DerivedData +.idea/ +/Build diff --git a/VIPER-SWIFT.xcodeproj/project.pbxproj b/VIPER-SWIFT.xcodeproj/project.pbxproj new file mode 100755 index 0000000..1af8f9f --- /dev/null +++ b/VIPER-SWIFT.xcodeproj/project.pbxproj @@ -0,0 +1,844 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 261FA1B919414A720029F589 /* AppDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA17219414A720029F589 /* AppDependencies.swift */; }; + 261FA1BC19414A720029F589 /* NSCalendar+CalendarAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA17919414A720029F589 /* NSCalendar+CalendarAdditions.swift */; }; + 261FA1BE19414A720029F589 /* Clock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA17D19414A720029F589 /* Clock.swift */; }; + 261FA1BF19414A720029F589 /* DeviceClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA17E19414A720029F589 /* DeviceClock.swift */; }; + 261FA1C019414A720029F589 /* NearTermDateRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18019414A720029F589 /* NearTermDateRelation.swift */; }; + 261FA1C119414A720029F589 /* TodoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18119414A720029F589 /* TodoItem.swift */; }; + 261FA1C219414A720029F589 /* CoreDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18319414A720029F589 /* CoreDataStore.swift */; }; + 261FA1C419414A720029F589 /* TODO.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18719414A720029F589 /* TODO.xcdatamodeld */; }; + 261FA1C519414A720029F589 /* RootWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18A19414A720029F589 /* RootWireframe.swift */; }; + 261FA1C619414A720029F589 /* AddInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18F19414A720029F589 /* AddInteractor.swift */; }; + 261FA1C719414A720029F589 /* AddDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19119414A720029F589 /* AddDataManager.swift */; }; + 261FA1C819414A720029F589 /* AddModuleDelegateInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19419414A720029F589 /* AddModuleDelegateInterface.swift */; }; + 261FA1C919414A720029F589 /* AddModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19519414A720029F589 /* AddModuleInterface.swift */; }; + 261FA1CA19414A720029F589 /* AddPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19819414A720029F589 /* AddPresenter.swift */; }; + 261FA1CB19414A720029F589 /* AddDismissalTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19A19414A720029F589 /* AddDismissalTransition.swift */; }; + 261FA1CC19414A720029F589 /* AddPresentationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19B19414A720029F589 /* AddPresentationTransition.swift */; }; + 261FA1CD19414A720029F589 /* AddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19D19414A720029F589 /* AddViewController.swift */; }; + 261FA1CE19414A720029F589 /* AddViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA19E19414A720029F589 /* AddViewInterface.swift */; }; + 261FA1CF19414A720029F589 /* AddWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A019414A720029F589 /* AddWireframe.swift */; }; + 261FA1D019414A720029F589 /* ListInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A419414A720029F589 /* ListInteractor.swift */; }; + 261FA1D119414A720029F589 /* ListInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A519414A720029F589 /* ListInteractorIO.swift */; }; + 261FA1D219414A720029F589 /* UpcomingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A619414A720029F589 /* UpcomingItem.swift */; }; + 261FA1D319414A720029F589 /* ListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A819414A720029F589 /* ListDataManager.swift */; }; + 261FA1D419414A720029F589 /* ListModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1AB19414A720029F589 /* ListModuleInterface.swift */; }; + 261FA1D519414A720029F589 /* ListPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1AE19414A720029F589 /* ListPresenter.swift */; }; + 261FA1D619414A720029F589 /* UpcomingDisplayData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1AF19414A720029F589 /* UpcomingDisplayData.swift */; }; + 261FA1D719414A720029F589 /* UpcomingDisplayDataCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B019414A720029F589 /* UpcomingDisplayDataCollection.swift */; }; + 261FA1D819414A720029F589 /* UpcomingDisplayItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B119414A720029F589 /* UpcomingDisplayItem.swift */; }; + 261FA1D919414A720029F589 /* UpcomingDisplaySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B219414A720029F589 /* UpcomingDisplaySection.swift */; }; + 261FA1DA19414A720029F589 /* ListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B419414A720029F589 /* ListViewController.swift */; }; + 261FA1DB19414A720029F589 /* ListViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B519414A720029F589 /* ListViewInterface.swift */; }; + 261FA1DC19414A720029F589 /* ListWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B719414A720029F589 /* ListWireframe.swift */; }; + 261FA1E719414CBE0029F589 /* ManagedTodoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1E619414CBE0029F589 /* ManagedTodoItem.swift */; }; + 261FA1EC1942320E0029F589 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 261FA1EA1942320E0029F589 /* Main.storyboard */; }; + 261FA1EE194232180029F589 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 261FA1ED194232180029F589 /* Images.xcassets */; }; + 26A605EB1942A1EE0036C71F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A605EA1942A1EE0036C71F /* AppDelegate.swift */; }; + 26D96F9C19428C3600F117F5 /* CalendarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26D96F9B19428C3600F117F5 /* CalendarTests.swift */; }; + 26D96F9D19428C7E00F117F5 /* NSCalendar+CalendarAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA17919414A720029F589 /* NSCalendar+CalendarAdditions.swift */; }; + 26D96F9E19428D8100F117F5 /* NearTermDateRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18019414A720029F589 /* NearTermDateRelation.swift */; }; + 26D96FA11942912A00F117F5 /* UpcomingDisplayData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1AF19414A720029F589 /* UpcomingDisplayData.swift */; }; + 26D96FA21942912A00F117F5 /* UpcomingDisplayDataCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B019414A720029F589 /* UpcomingDisplayDataCollection.swift */; }; + 26D96FA31942912A00F117F5 /* UpcomingDisplayItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B119414A720029F589 /* UpcomingDisplayItem.swift */; }; + 26D96FA41942912A00F117F5 /* UpcomingDisplaySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B219414A720029F589 /* UpcomingDisplaySection.swift */; }; + 26D96FA51942912A00F117F5 /* ListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B419414A720029F589 /* ListViewController.swift */; }; + 26D96FA61942913600F117F5 /* ListViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1B519414A720029F589 /* ListViewInterface.swift */; }; + 26D96FA71942913B00F117F5 /* ListModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1AB19414A720029F589 /* ListModuleInterface.swift */; }; + 26D96FA81942915D00F117F5 /* UpcomingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A619414A720029F589 /* UpcomingItem.swift */; }; + 26D96FA91942932A00F117F5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 261FA1EA1942320E0029F589 /* Main.storyboard */; }; + 26D96FAA1942932A00F117F5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 261FA1ED194232180029F589 /* Images.xcassets */; }; + 26D96FAC1942967900F117F5 /* RelativeDateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26D96FAB1942967900F117F5 /* RelativeDateTests.swift */; }; + 26D96FAE19429A9000F117F5 /* DataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26D96FAD19429A9000F117F5 /* DataTests.swift */; }; + 26D96FAF19429AD000F117F5 /* ManagedTodoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1E619414CBE0029F589 /* ManagedTodoItem.swift */; }; + 26D96FB019429AD000F117F5 /* CoreDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18319414A720029F589 /* CoreDataStore.swift */; }; + 26D96FB119429B1A00F117F5 /* TodoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA18119414A720029F589 /* TodoItem.swift */; }; + 26D96FB219429B1A00F117F5 /* ListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261FA1A819414A720029F589 /* ListDataManager.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 261FA1611941497E0029F589 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 261FA1461941497E0029F589 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 261FA14D1941497E0029F589; + remoteInfo = "VIPER-SWIFT"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 261FA14E1941497E0029F589 /* VIPER-SWIFT.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VIPER-SWIFT.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 261FA1601941497E0029F589 /* VIPER-SWIFTTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "VIPER-SWIFTTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 261FA1651941497E0029F589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 261FA17219414A720029F589 /* AppDependencies.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDependencies.swift; sourceTree = ""; }; + 261FA17919414A720029F589 /* NSCalendar+CalendarAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSCalendar+CalendarAdditions.swift"; sourceTree = ""; }; + 261FA17D19414A720029F589 /* Clock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Clock.swift; sourceTree = ""; }; + 261FA17E19414A720029F589 /* DeviceClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceClock.swift; sourceTree = ""; }; + 261FA18019414A720029F589 /* NearTermDateRelation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NearTermDateRelation.swift; sourceTree = ""; }; + 261FA18119414A720029F589 /* TodoItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoItem.swift; sourceTree = ""; }; + 261FA18319414A720029F589 /* CoreDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataStore.swift; sourceTree = ""; }; + 261FA18819414A720029F589 /* TODO.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = TODO.xcdatamodel; sourceTree = ""; }; + 261FA18A19414A720029F589 /* RootWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootWireframe.swift; sourceTree = ""; }; + 261FA18F19414A720029F589 /* AddInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddInteractor.swift; sourceTree = ""; }; + 261FA19119414A720029F589 /* AddDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddDataManager.swift; sourceTree = ""; }; + 261FA19419414A720029F589 /* AddModuleDelegateInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddModuleDelegateInterface.swift; sourceTree = ""; }; + 261FA19519414A720029F589 /* AddModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddModuleInterface.swift; sourceTree = ""; }; + 261FA19819414A720029F589 /* AddPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddPresenter.swift; sourceTree = ""; }; + 261FA19A19414A720029F589 /* AddDismissalTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddDismissalTransition.swift; sourceTree = ""; }; + 261FA19B19414A720029F589 /* AddPresentationTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddPresentationTransition.swift; sourceTree = ""; }; + 261FA19D19414A720029F589 /* AddViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddViewController.swift; sourceTree = ""; }; + 261FA19E19414A720029F589 /* AddViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddViewInterface.swift; sourceTree = ""; }; + 261FA1A019414A720029F589 /* AddWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddWireframe.swift; sourceTree = ""; }; + 261FA1A419414A720029F589 /* ListInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListInteractor.swift; sourceTree = ""; }; + 261FA1A519414A720029F589 /* ListInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListInteractorIO.swift; sourceTree = ""; }; + 261FA1A619414A720029F589 /* UpcomingItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingItem.swift; sourceTree = ""; }; + 261FA1A819414A720029F589 /* ListDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListDataManager.swift; sourceTree = ""; }; + 261FA1AB19414A720029F589 /* ListModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListModuleInterface.swift; sourceTree = ""; }; + 261FA1AE19414A720029F589 /* ListPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListPresenter.swift; sourceTree = ""; }; + 261FA1AF19414A720029F589 /* UpcomingDisplayData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingDisplayData.swift; sourceTree = ""; }; + 261FA1B019414A720029F589 /* UpcomingDisplayDataCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingDisplayDataCollection.swift; sourceTree = ""; }; + 261FA1B119414A720029F589 /* UpcomingDisplayItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingDisplayItem.swift; sourceTree = ""; }; + 261FA1B219414A720029F589 /* UpcomingDisplaySection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingDisplaySection.swift; sourceTree = ""; }; + 261FA1B419414A720029F589 /* ListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewController.swift; sourceTree = ""; }; + 261FA1B519414A720029F589 /* ListViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewInterface.swift; sourceTree = ""; }; + 261FA1B719414A720029F589 /* ListWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListWireframe.swift; sourceTree = ""; }; + 261FA1E619414CBE0029F589 /* ManagedTodoItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedTodoItem.swift; sourceTree = ""; }; + 261FA1E819414E600029F589 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 261FA1EB1942320E0029F589 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "VIPER-SWIFT/Base.lproj/Main.storyboard"; sourceTree = SOURCE_ROOT; }; + 261FA1ED194232180029F589 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "VIPER-SWIFT/Images.xcassets"; sourceTree = SOURCE_ROOT; }; + 26A605EA1942A1EE0036C71F /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 26D96F9B19428C3600F117F5 /* CalendarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarTests.swift; sourceTree = ""; }; + 26D96FAB1942967900F117F5 /* RelativeDateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RelativeDateTests.swift; sourceTree = ""; }; + 26D96FAD19429A9000F117F5 /* DataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 261FA14B1941497E0029F589 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 261FA15D1941497E0029F589 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 261FA1451941497E0029F589 = { + isa = PBXGroup; + children = ( + 261FA1501941497E0029F589 /* VIPER-SWIFT */, + 261FA1631941497E0029F589 /* VIPER-SWIFTTests */, + 261FA14F1941497E0029F589 /* Products */, + ); + sourceTree = ""; + }; + 261FA14F1941497E0029F589 /* Products */ = { + isa = PBXGroup; + children = ( + 261FA14E1941497E0029F589 /* VIPER-SWIFT.app */, + 261FA1601941497E0029F589 /* VIPER-SWIFTTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 261FA1501941497E0029F589 /* VIPER-SWIFT */ = { + isa = PBXGroup; + children = ( + 261FA17019414A720029F589 /* Classes */, + 261FA1DD19414AC20029F589 /* Resources */, + 261FA1DE19414AC60029F589 /* Supporting Files */, + ); + path = "VIPER-SWIFT"; + sourceTree = ""; + }; + 261FA1631941497E0029F589 /* VIPER-SWIFTTests */ = { + isa = PBXGroup; + children = ( + 26D96F9B19428C3600F117F5 /* CalendarTests.swift */, + 26D96FAD19429A9000F117F5 /* DataTests.swift */, + 26D96FAB1942967900F117F5 /* RelativeDateTests.swift */, + 261FA1641941497E0029F589 /* Supporting Files */, + ); + path = "VIPER-SWIFTTests"; + sourceTree = ""; + }; + 261FA1641941497E0029F589 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 261FA1651941497E0029F589 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 261FA17019414A720029F589 /* Classes */ = { + isa = PBXGroup; + children = ( + 261FA17319414A720029F589 /* Common */, + 261FA18B19414A720029F589 /* Modules */, + 26A605EA1942A1EE0036C71F /* AppDelegate.swift */, + 261FA17219414A720029F589 /* AppDependencies.swift */, + ); + path = Classes; + sourceTree = ""; + }; + 261FA17319414A720029F589 /* Common */ = { + isa = PBXGroup; + children = ( + 261FA17419414A720029F589 /* Categories */, + 261FA17C19414A720029F589 /* Clock */, + 261FA17F19414A720029F589 /* Model */, + 261FA18219414A720029F589 /* Store */, + 261FA18919414A720029F589 /* View */, + ); + path = Common; + sourceTree = ""; + }; + 261FA17419414A720029F589 /* Categories */ = { + isa = PBXGroup; + children = ( + 261FA17919414A720029F589 /* NSCalendar+CalendarAdditions.swift */, + ); + path = Categories; + sourceTree = ""; + }; + 261FA17C19414A720029F589 /* Clock */ = { + isa = PBXGroup; + children = ( + 261FA17D19414A720029F589 /* Clock.swift */, + 261FA17E19414A720029F589 /* DeviceClock.swift */, + ); + path = Clock; + sourceTree = ""; + }; + 261FA17F19414A720029F589 /* Model */ = { + isa = PBXGroup; + children = ( + 261FA18019414A720029F589 /* NearTermDateRelation.swift */, + 261FA18119414A720029F589 /* TodoItem.swift */, + ); + path = Model; + sourceTree = ""; + }; + 261FA18219414A720029F589 /* Store */ = { + isa = PBXGroup; + children = ( + 261FA18419414A720029F589 /* Entities */, + 261FA18319414A720029F589 /* CoreDataStore.swift */, + 261FA18719414A720029F589 /* TODO.xcdatamodeld */, + ); + path = Store; + sourceTree = ""; + }; + 261FA18419414A720029F589 /* Entities */ = { + isa = PBXGroup; + children = ( + 261FA1E619414CBE0029F589 /* ManagedTodoItem.swift */, + ); + path = Entities; + sourceTree = ""; + }; + 261FA18919414A720029F589 /* View */ = { + isa = PBXGroup; + children = ( + 261FA18A19414A720029F589 /* RootWireframe.swift */, + ); + path = View; + sourceTree = ""; + }; + 261FA18B19414A720029F589 /* Modules */ = { + isa = PBXGroup; + children = ( + 261FA18C19414A720029F589 /* Add */, + 261FA1A119414A720029F589 /* List */, + ); + path = Modules; + sourceTree = ""; + }; + 261FA18C19414A720029F589 /* Add */ = { + isa = PBXGroup; + children = ( + 261FA18D19414A720029F589 /* Application Logic */, + 261FA19319414A720029F589 /* Module Interface */, + 261FA19619414A720029F589 /* User Interface */, + ); + path = Add; + sourceTree = ""; + }; + 261FA18D19414A720029F589 /* Application Logic */ = { + isa = PBXGroup; + children = ( + 261FA18E19414A720029F589 /* Interactor */, + 261FA19019414A720029F589 /* Manager */, + 261FA19219414A720029F589 /* Model */, + ); + path = "Application Logic"; + sourceTree = ""; + }; + 261FA18E19414A720029F589 /* Interactor */ = { + isa = PBXGroup; + children = ( + 261FA18F19414A720029F589 /* AddInteractor.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 261FA19019414A720029F589 /* Manager */ = { + isa = PBXGroup; + children = ( + 261FA19119414A720029F589 /* AddDataManager.swift */, + ); + path = Manager; + sourceTree = ""; + }; + 261FA19219414A720029F589 /* Model */ = { + isa = PBXGroup; + children = ( + ); + path = Model; + sourceTree = ""; + }; + 261FA19319414A720029F589 /* Module Interface */ = { + isa = PBXGroup; + children = ( + 261FA19419414A720029F589 /* AddModuleDelegateInterface.swift */, + 261FA19519414A720029F589 /* AddModuleInterface.swift */, + ); + path = "Module Interface"; + sourceTree = ""; + }; + 261FA19619414A720029F589 /* User Interface */ = { + isa = PBXGroup; + children = ( + 261FA19719414A720029F589 /* Presenter */, + 261FA19919414A720029F589 /* Transition */, + 261FA19C19414A720029F589 /* View */, + 261FA19F19414A720029F589 /* Wireframe */, + ); + path = "User Interface"; + sourceTree = ""; + }; + 261FA19719414A720029F589 /* Presenter */ = { + isa = PBXGroup; + children = ( + 261FA19819414A720029F589 /* AddPresenter.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 261FA19919414A720029F589 /* Transition */ = { + isa = PBXGroup; + children = ( + 261FA19A19414A720029F589 /* AddDismissalTransition.swift */, + 261FA19B19414A720029F589 /* AddPresentationTransition.swift */, + ); + path = Transition; + sourceTree = ""; + }; + 261FA19C19414A720029F589 /* View */ = { + isa = PBXGroup; + children = ( + 261FA19D19414A720029F589 /* AddViewController.swift */, + 261FA19E19414A720029F589 /* AddViewInterface.swift */, + ); + path = View; + sourceTree = ""; + }; + 261FA19F19414A720029F589 /* Wireframe */ = { + isa = PBXGroup; + children = ( + 261FA1A019414A720029F589 /* AddWireframe.swift */, + ); + path = Wireframe; + sourceTree = ""; + }; + 261FA1A119414A720029F589 /* List */ = { + isa = PBXGroup; + children = ( + 261FA1A219414A720029F589 /* Application Logic */, + 261FA1AA19414A720029F589 /* Module Interface */, + 261FA1AC19414A720029F589 /* User Interface */, + ); + path = List; + sourceTree = ""; + }; + 261FA1A219414A720029F589 /* Application Logic */ = { + isa = PBXGroup; + children = ( + 261FA1A319414A720029F589 /* Interactor */, + 261FA1A719414A720029F589 /* Manager */, + 261FA1A919414A720029F589 /* Model */, + ); + path = "Application Logic"; + sourceTree = ""; + }; + 261FA1A319414A720029F589 /* Interactor */ = { + isa = PBXGroup; + children = ( + 261FA1A419414A720029F589 /* ListInteractor.swift */, + 261FA1A519414A720029F589 /* ListInteractorIO.swift */, + 261FA1A619414A720029F589 /* UpcomingItem.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 261FA1A719414A720029F589 /* Manager */ = { + isa = PBXGroup; + children = ( + 261FA1A819414A720029F589 /* ListDataManager.swift */, + ); + path = Manager; + sourceTree = ""; + }; + 261FA1A919414A720029F589 /* Model */ = { + isa = PBXGroup; + children = ( + ); + path = Model; + sourceTree = ""; + }; + 261FA1AA19414A720029F589 /* Module Interface */ = { + isa = PBXGroup; + children = ( + 261FA1AB19414A720029F589 /* ListModuleInterface.swift */, + ); + path = "Module Interface"; + sourceTree = ""; + }; + 261FA1AC19414A720029F589 /* User Interface */ = { + isa = PBXGroup; + children = ( + 261FA1AD19414A720029F589 /* Presenter */, + 261FA1B319414A720029F589 /* View */, + 261FA1B619414A720029F589 /* Wireframe */, + ); + path = "User Interface"; + sourceTree = ""; + }; + 261FA1AD19414A720029F589 /* Presenter */ = { + isa = PBXGroup; + children = ( + 261FA1AE19414A720029F589 /* ListPresenter.swift */, + 261FA1AF19414A720029F589 /* UpcomingDisplayData.swift */, + 261FA1B019414A720029F589 /* UpcomingDisplayDataCollection.swift */, + 261FA1B119414A720029F589 /* UpcomingDisplayItem.swift */, + 261FA1B219414A720029F589 /* UpcomingDisplaySection.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 261FA1B319414A720029F589 /* View */ = { + isa = PBXGroup; + children = ( + 261FA1B419414A720029F589 /* ListViewController.swift */, + 261FA1B519414A720029F589 /* ListViewInterface.swift */, + ); + path = View; + sourceTree = ""; + }; + 261FA1B619414A720029F589 /* Wireframe */ = { + isa = PBXGroup; + children = ( + 261FA1B719414A720029F589 /* ListWireframe.swift */, + ); + path = Wireframe; + sourceTree = ""; + }; + 261FA1DD19414AC20029F589 /* Resources */ = { + isa = PBXGroup; + children = ( + 261FA1EA1942320E0029F589 /* Main.storyboard */, + 261FA1ED194232180029F589 /* Images.xcassets */, + ); + name = Resources; + path = "../../../../Documents/Repos/VIPER-TODO-SWIFT/viper-todo-swift/VIPER TODO/Resources"; + sourceTree = ""; + }; + 261FA1DE19414AC60029F589 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 261FA1E819414E600029F589 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 261FA14D1941497E0029F589 /* VIPER-SWIFT */ = { + isa = PBXNativeTarget; + buildConfigurationList = 261FA16A1941497E0029F589 /* Build configuration list for PBXNativeTarget "VIPER-SWIFT" */; + buildPhases = ( + 261FA14A1941497E0029F589 /* Sources */, + 261FA14B1941497E0029F589 /* Frameworks */, + 261FA14C1941497E0029F589 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "VIPER-SWIFT"; + productName = "VIPER-SWIFT"; + productReference = 261FA14E1941497E0029F589 /* VIPER-SWIFT.app */; + productType = "com.apple.product-type.application"; + }; + 261FA15F1941497E0029F589 /* VIPER-SWIFTTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 261FA16D1941497E0029F589 /* Build configuration list for PBXNativeTarget "VIPER-SWIFTTests" */; + buildPhases = ( + 261FA15C1941497E0029F589 /* Sources */, + 261FA15D1941497E0029F589 /* Frameworks */, + 261FA15E1941497E0029F589 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 261FA1621941497E0029F589 /* PBXTargetDependency */, + ); + name = "VIPER-SWIFTTests"; + productName = "VIPER-SWIFTTests"; + productReference = 261FA1601941497E0029F589 /* VIPER-SWIFTTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 261FA1461941497E0029F589 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Conrad Stoll"; + TargetAttributes = { + 261FA14D1941497E0029F589 = { + CreatedOnToolsVersion = 6.0; + }; + 261FA15F1941497E0029F589 = { + CreatedOnToolsVersion = 6.0; + TestTargetID = 261FA14D1941497E0029F589; + }; + }; + }; + buildConfigurationList = 261FA1491941497E0029F589 /* Build configuration list for PBXProject "VIPER-SWIFT" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 261FA1451941497E0029F589; + productRefGroup = 261FA14F1941497E0029F589 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 261FA14D1941497E0029F589 /* VIPER-SWIFT */, + 261FA15F1941497E0029F589 /* VIPER-SWIFTTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 261FA14C1941497E0029F589 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 261FA1EE194232180029F589 /* Images.xcassets in Resources */, + 261FA1EC1942320E0029F589 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 261FA15E1941497E0029F589 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 26D96FA91942932A00F117F5 /* Main.storyboard in Resources */, + 26D96FAA1942932A00F117F5 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 261FA14A1941497E0029F589 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 261FA1C719414A720029F589 /* AddDataManager.swift in Sources */, + 261FA1D119414A720029F589 /* ListInteractorIO.swift in Sources */, + 261FA1D719414A720029F589 /* UpcomingDisplayDataCollection.swift in Sources */, + 261FA1D219414A720029F589 /* UpcomingItem.swift in Sources */, + 261FA1D519414A720029F589 /* ListPresenter.swift in Sources */, + 261FA1D419414A720029F589 /* ListModuleInterface.swift in Sources */, + 261FA1B919414A720029F589 /* AppDependencies.swift in Sources */, + 261FA1D619414A720029F589 /* UpcomingDisplayData.swift in Sources */, + 261FA1C619414A720029F589 /* AddInteractor.swift in Sources */, + 261FA1D919414A720029F589 /* UpcomingDisplaySection.swift in Sources */, + 261FA1C819414A720029F589 /* AddModuleDelegateInterface.swift in Sources */, + 261FA1BF19414A720029F589 /* DeviceClock.swift in Sources */, + 261FA1DA19414A720029F589 /* ListViewController.swift in Sources */, + 261FA1BE19414A720029F589 /* Clock.swift in Sources */, + 261FA1C519414A720029F589 /* RootWireframe.swift in Sources */, + 261FA1C419414A720029F589 /* TODO.xcdatamodeld in Sources */, + 261FA1CD19414A720029F589 /* AddViewController.swift in Sources */, + 261FA1C119414A720029F589 /* TodoItem.swift in Sources */, + 26A605EB1942A1EE0036C71F /* AppDelegate.swift in Sources */, + 261FA1CB19414A720029F589 /* AddDismissalTransition.swift in Sources */, + 261FA1C219414A720029F589 /* CoreDataStore.swift in Sources */, + 261FA1CC19414A720029F589 /* AddPresentationTransition.swift in Sources */, + 261FA1C919414A720029F589 /* AddModuleInterface.swift in Sources */, + 261FA1D319414A720029F589 /* ListDataManager.swift in Sources */, + 261FA1CA19414A720029F589 /* AddPresenter.swift in Sources */, + 261FA1D019414A720029F589 /* ListInteractor.swift in Sources */, + 261FA1C019414A720029F589 /* NearTermDateRelation.swift in Sources */, + 261FA1E719414CBE0029F589 /* ManagedTodoItem.swift in Sources */, + 261FA1D819414A720029F589 /* UpcomingDisplayItem.swift in Sources */, + 261FA1BC19414A720029F589 /* NSCalendar+CalendarAdditions.swift in Sources */, + 261FA1DB19414A720029F589 /* ListViewInterface.swift in Sources */, + 261FA1DC19414A720029F589 /* ListWireframe.swift in Sources */, + 261FA1CE19414A720029F589 /* AddViewInterface.swift in Sources */, + 261FA1CF19414A720029F589 /* AddWireframe.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 261FA15C1941497E0029F589 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 26D96FB219429B1A00F117F5 /* ListDataManager.swift in Sources */, + 26D96FAF19429AD000F117F5 /* ManagedTodoItem.swift in Sources */, + 26D96F9D19428C7E00F117F5 /* NSCalendar+CalendarAdditions.swift in Sources */, + 26D96FAC1942967900F117F5 /* RelativeDateTests.swift in Sources */, + 26D96FAE19429A9000F117F5 /* DataTests.swift in Sources */, + 26D96FA71942913B00F117F5 /* ListModuleInterface.swift in Sources */, + 26D96FA41942912A00F117F5 /* UpcomingDisplaySection.swift in Sources */, + 26D96FA31942912A00F117F5 /* UpcomingDisplayItem.swift in Sources */, + 26D96F9C19428C3600F117F5 /* CalendarTests.swift in Sources */, + 26D96FA61942913600F117F5 /* ListViewInterface.swift in Sources */, + 26D96FB019429AD000F117F5 /* CoreDataStore.swift in Sources */, + 26D96FA11942912A00F117F5 /* UpcomingDisplayData.swift in Sources */, + 26D96FA81942915D00F117F5 /* UpcomingItem.swift in Sources */, + 26D96F9E19428D8100F117F5 /* NearTermDateRelation.swift in Sources */, + 26D96FA51942912A00F117F5 /* ListViewController.swift in Sources */, + 26D96FB119429B1A00F117F5 /* TodoItem.swift in Sources */, + 26D96FA21942912A00F117F5 /* UpcomingDisplayDataCollection.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 261FA1621941497E0029F589 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 261FA14D1941497E0029F589 /* VIPER-SWIFT */; + targetProxy = 261FA1611941497E0029F589 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 261FA1EA1942320E0029F589 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 261FA1EB1942320E0029F589 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 261FA1681941497E0029F589 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + METAL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 261FA1691941497E0029F589 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + METAL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 261FA16B1941497E0029F589 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = "VIPER-SWIFT/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 261FA16C1941497E0029F589 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = "VIPER-SWIFT/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 261FA16E1941497E0029F589 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/VIPER-SWIFT.app/VIPER-SWIFT"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "VIPER-SWIFTTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + METAL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Debug; + }; + 261FA16F1941497E0029F589 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/VIPER-SWIFT.app/VIPER-SWIFT"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = "VIPER-SWIFTTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + METAL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 261FA1491941497E0029F589 /* Build configuration list for PBXProject "VIPER-SWIFT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 261FA1681941497E0029F589 /* Debug */, + 261FA1691941497E0029F589 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 261FA16A1941497E0029F589 /* Build configuration list for PBXNativeTarget "VIPER-SWIFT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 261FA16B1941497E0029F589 /* Debug */, + 261FA16C1941497E0029F589 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 261FA16D1941497E0029F589 /* Build configuration list for PBXNativeTarget "VIPER-SWIFTTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 261FA16E1941497E0029F589 /* Debug */, + 261FA16F1941497E0029F589 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 261FA18719414A720029F589 /* TODO.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 261FA18819414A720029F589 /* TODO.xcdatamodel */, + ); + currentVersion = 261FA18819414A720029F589 /* TODO.xcdatamodel */; + path = TODO.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 261FA1461941497E0029F589 /* Project object */; +} diff --git a/VIPER-SWIFT.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/VIPER-SWIFT.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..08dddca --- /dev/null +++ b/VIPER-SWIFT.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/VIPER-SWIFT/Base.lproj/Main.storyboard b/VIPER-SWIFT/Base.lproj/Main.storyboard new file mode 100755 index 0000000..20f9ede --- /dev/null +++ b/VIPER-SWIFT/Base.lproj/Main.storyboard @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VIPER-SWIFT/Classes/AppDelegate.swift b/VIPER-SWIFT/Classes/AppDelegate.swift new file mode 100755 index 0000000..3ba121a --- /dev/null +++ b/VIPER-SWIFT/Classes/AppDelegate.swift @@ -0,0 +1,23 @@ +// +// AppDelegate.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Conrad Stoll. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + let appDependencies = AppDependencies() + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { + appDependencies.installRootViewControllerIntoWindow(window!) + + return true + } +} + diff --git a/VIPER-SWIFT/Classes/AppDependencies.swift b/VIPER-SWIFT/Classes/AppDependencies.swift new file mode 100755 index 0000000..49928b5 --- /dev/null +++ b/VIPER-SWIFT/Classes/AppDependencies.swift @@ -0,0 +1,58 @@ +// +// AppDependencies.swift +// VIPER TODO +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class AppDependencies { + var listWireframe = ListWireframe() + + init() { + configureDependencies() + } + + func installRootViewControllerIntoWindow(window: UIWindow) { + listWireframe.presentListInterfaceFromWindow(window) + } + + func configureDependencies() { + let coreDataStore = CoreDataStore() + let clock = DeviceClock() + let rootWireframe = RootWireframe() + + let listPresenter = ListPresenter() + let listDataManager = ListDataManager() + let listInteractor = ListInteractor(dataManager: listDataManager, clock: clock) + + let addWireframe = AddWireframe() + let addInteractor = AddInteractor() + let addPresenter = AddPresenter() + let addDataManager = AddDataManager() + + listInteractor.output = listPresenter + + listPresenter.listInteractor = listInteractor + listPresenter.listWireframe = listWireframe + + listWireframe.addWireframe = addWireframe + listWireframe.listPresenter = listPresenter + listWireframe.rootWireframe = rootWireframe + + listDataManager.coreDataStore = coreDataStore + + addInteractor.addDataManager = addDataManager + + addWireframe.addPresenter = addPresenter + + addPresenter.addWireframe = addWireframe + addPresenter.addModuleDelegate = listPresenter + addPresenter.addInteractor = addInteractor + + addDataManager.dataStore = coreDataStore + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Categories/NSCalendar+CalendarAdditions.swift b/VIPER-SWIFT/Classes/Common/Categories/NSCalendar+CalendarAdditions.swift new file mode 100755 index 0000000..316fd4c --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Categories/NSCalendar+CalendarAdditions.swift @@ -0,0 +1,163 @@ +// +// NSCalendar+CalendarAdditions.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +extension NSCalendar { + class func gregorianCalendar() -> NSCalendar { + return NSCalendar(calendarIdentifier: NSGregorianCalendar) + } + + func dateWithYear(year: Int, month: Int, day: Int) -> NSDate { + let components = NSDateComponents() + components.year = year + components.month = month + components.day = day + components.hour = 12 + return dateFromComponents(components) + } + + func dateForTomorrowRelativeToToday(today: NSDate) -> NSDate { + let tomorrowComponents = NSDateComponents() + tomorrowComponents.day = 1 + return dateByAddingComponents(tomorrowComponents, toDate: today, options: nil) + } + + func dateForEndOfWeekWithDate(date: NSDate) -> NSDate { + let daysRemainingThisWeek = daysRemainingInWeekWithDate(date) + let remainingDaysComponent = NSDateComponents() + remainingDaysComponent.day = daysRemainingThisWeek + return dateByAddingComponents(remainingDaysComponent, toDate: date, options: nil) + } + + func dateForBeginningOfDay(date: NSDate) -> NSDate { + let newComponent = components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay), fromDate: date) + let newDate = dateFromComponents(newComponent) + return newDate + } + + func dateForEndOfDay(date: NSDate) -> NSDate { + let components = NSDateComponents() + components.day = 1 + let toDate = dateForBeginningOfDay(date) + let nextDay = dateByAddingComponents(components, toDate: toDate, options: nil) + let endDay = nextDay.dateByAddingTimeInterval(-1) + return nextDay + } + + func daysRemainingInWeekWithDate(date: NSDate) -> Int { + let weekdayComponent = components(NSCalendarUnit.WeekdayCalendarUnit, fromDate: date) + let daysRange = rangeOfUnit(NSCalendarUnit.WeekdayCalendarUnit, inUnit: NSCalendarUnit.WeekCalendarUnit, forDate: date) + let daysPerWeek = daysRange.length + let daysRemaining = daysPerWeek - weekdayComponent.weekday + return daysRemaining + } + + func dateForEndOfFollowingWeekWithDate(date: NSDate) -> NSDate { + let endOfWeek = dateForEndOfWeekWithDate(date) + let nextWeekComponent = NSDateComponents() + nextWeekComponent.setWeek(1) + let followingWeekDate = dateByAddingComponents(nextWeekComponent, toDate: endOfWeek, options: nil) + return followingWeekDate + } + + func isDate(date: NSDate, beforeYearMonthDay: NSDate) -> Bool { + let comparison = compareYearMonthDay(date, toYearMonthDay: beforeYearMonthDay) + let result = comparison == NSComparisonResult.OrderedAscending + return result + } + + func isDate(date: NSDate, equalToYearMonthDay: NSDate) -> Bool { + let comparison = compareYearMonthDay(date, toYearMonthDay: equalToYearMonthDay) + let result = comparison == NSComparisonResult.OrderedSame + return result + } + + func isDate(date: NSDate, duringSameWeekAsDate: NSDate) -> Bool { + let dateComponents = components(NSCalendarUnit.WeekCalendarUnit, fromDate: date) + let duringSameWeekComponents = components(NSCalendarUnit.WeekCalendarUnit, fromDate: duringSameWeekAsDate) + let result = dateComponents.week() == duringSameWeekComponents.week() + return result + } + + func isDate(date: NSDate, duringWeekAfterDate: NSDate) -> Bool { + let nextWeek = dateForEndOfFollowingWeekWithDate(duringWeekAfterDate) + let dateComponents = components(NSCalendarUnit.WeekCalendarUnit, fromDate: date) + let nextWeekComponents = components(NSCalendarUnit.WeekCalendarUnit, fromDate: nextWeek) + let result = dateComponents.week() == nextWeekComponents.week() + return result + } + + func compareYearMonthDay(date: NSDate, toYearMonthDay: NSDate) -> NSComparisonResult { + let dateComponents = yearMonthDayComponentsFromDate(date) + let yearMonthDayComponents = yearMonthDayComponentsFromDate(toYearMonthDay) + + var result = compareInteger(dateComponents.year, right: yearMonthDayComponents.year) + + if result == NSComparisonResult.OrderedSame { + result = compareInteger(dateComponents.month, right: yearMonthDayComponents.month) + + if result == NSComparisonResult.OrderedSame { + result = compareInteger(dateComponents.day, right: yearMonthDayComponents.day) + } + } + + return result + } + + func yearMonthDayComponentsFromDate(date: NSDate) -> NSDateComponents { + let newComponents = components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay), fromDate: date) + return newComponents + } + + func compareInteger(left: Int, right: Int) -> NSComparisonResult { + var result = NSComparisonResult.OrderedDescending + + if left == right { + result = NSComparisonResult.OrderedSame + } else if left < right { + result = NSComparisonResult.OrderedAscending + } else { + result = NSComparisonResult.OrderedDescending + } + + return result + } + + func nearTermRelationForDate(date: NSDate, relativeToToday: NSDate) -> NearTermDateRelation { + var relation = NearTermDateRelation.OutOfRange + + let dateForTomorrow = dateForTomorrowRelativeToToday(relativeToToday) + + let isDateBeforeYearMonthDay = isDate(date, beforeYearMonthDay: relativeToToday) + let isDateEqualToYearMonthDay = isDate(date, equalToYearMonthDay: relativeToToday) + let isDateEqualToYearMonthDayRelativeToTomorrow = isDate(date, equalToYearMonthDay: dateForTomorrow) + let isDateDuringSameWeekAsDate = isDate(date, duringSameWeekAsDate: relativeToToday) + let isDateDuringSameWeekAfterDate = isDate(date, duringWeekAfterDate: relativeToToday) + + if isDateBeforeYearMonthDay { + relation = NearTermDateRelation.OutOfRange + } else if isDateEqualToYearMonthDay { + relation = NearTermDateRelation.Today + } else if isDateEqualToYearMonthDayRelativeToTomorrow { + let isRelativeDateDuringSameWeek = isDate(relativeToToday, duringSameWeekAsDate: date) + + if isRelativeDateDuringSameWeek { + relation = NearTermDateRelation.Tomorrow + } else { + relation = NearTermDateRelation.NextWeek + } + } else if isDateDuringSameWeekAsDate { + relation = NearTermDateRelation.LaterThisWeek + } else if isDateDuringSameWeekAfterDate { + relation = NearTermDateRelation.NextWeek + } + + return relation + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Clock/Clock.swift b/VIPER-SWIFT/Classes/Common/Clock/Clock.swift new file mode 100755 index 0000000..5baa5b1 --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Clock/Clock.swift @@ -0,0 +1,13 @@ +// +// Clock.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol Clock { + func today() -> NSDate +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Clock/DeviceClock.swift b/VIPER-SWIFT/Classes/Common/Clock/DeviceClock.swift new file mode 100755 index 0000000..23fab5b --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Clock/DeviceClock.swift @@ -0,0 +1,15 @@ +// +// DeviceClock.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class DeviceClock : NSObject, Clock { + func today() -> NSDate { + return NSDate() + } +} diff --git a/VIPER-SWIFT/Classes/Common/Model/NearTermDateRelation.swift b/VIPER-SWIFT/Classes/Common/Model/NearTermDateRelation.swift new file mode 100755 index 0000000..67d3997 --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Model/NearTermDateRelation.swift @@ -0,0 +1,17 @@ +// +// NearTermDateRelation.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +enum NearTermDateRelation { + case OutOfRange, + Today, + Tomorrow, + LaterThisWeek, + NextWeek +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Model/TodoItem.swift b/VIPER-SWIFT/Classes/Common/Model/TodoItem.swift new file mode 100755 index 0000000..10dd517 --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Model/TodoItem.swift @@ -0,0 +1,19 @@ +// +// TodoItem.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +struct TodoItem { + let dueDate : NSDate + let name : String + + init(dueDate: NSDate, name: String) { + self.dueDate = dueDate + self.name = name + } +} diff --git a/VIPER-SWIFT/Classes/Common/Store/CoreDataStore.swift b/VIPER-SWIFT/Classes/Common/Store/CoreDataStore.swift new file mode 100755 index 0000000..0921a62 --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Store/CoreDataStore.swift @@ -0,0 +1,71 @@ +// +// CoreDataStore.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import CoreData + +extension Array { + func lastObject() -> T { + let endIndex = self.endIndex + let lastItemIndex = endIndex - 1 + + return self[lastItemIndex] + } +} + +class CoreDataStore : NSObject { + var persistentStoreCoordinator : NSPersistentStoreCoordinator? + var managedObjectModel : NSManagedObjectModel? + var managedObjectContext : NSManagedObjectContext? + + init() { + managedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil) + + persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel) + + let domains = NSSearchPathDomainMask.UserDomainMask + let directory = NSSearchPathDirectory.DocumentDirectory + + let error = NSError() + let applicationDocumentsDirectory : AnyObject = NSFileManager.defaultManager().URLsForDirectory(directory, inDomains: domains).lastObject() + let options = [NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true] + + let storeURL = applicationDocumentsDirectory.URLByAppendingPathComponent("VIPER-SWIFT.sqlite") + + persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: "", URL: storeURL, options: options, error: nil) + + managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) + managedObjectContext!.persistentStoreCoordinator = persistentStoreCoordinator + managedObjectContext!.undoManager = nil + + super.init() + } + + func fetchEntriesWithPredicate(predicate: NSPredicate, sortDescriptors: AnyObject[], completionBlock: ((ManagedTodoItem[]) -> Void)!) { + let fetchRequest = NSFetchRequest(entityName: "TodoItem") + fetchRequest.predicate = predicate + fetchRequest.sortDescriptors = [] + + managedObjectContext?.performBlock { + let queryResults = self.managedObjectContext?.executeFetchRequest(fetchRequest, error: nil) + let managedResults = queryResults! as ManagedTodoItem[] + completionBlock(managedResults) + } + } + + func newTodoItem() -> ManagedTodoItem { + let entityDescription = NSEntityDescription.entityForName("TodoItem", inManagedObjectContext: managedObjectContext) + let newEntry = NSManagedObject(entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext) as ManagedTodoItem + + return newEntry + } + + func save() { + managedObjectContext?.save(nil) + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Store/Entities/ManagedTodoItem.swift b/VIPER-SWIFT/Classes/Common/Store/Entities/ManagedTodoItem.swift new file mode 100755 index 0000000..2a4325f --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Store/Entities/ManagedTodoItem.swift @@ -0,0 +1,15 @@ +// +// ManagedTodoItem.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Conrad Stoll. All rights reserved. +// + +import Foundation +import CoreData + +class ManagedTodoItem : NSManagedObject { + @NSManaged var name : NSString + @NSManaged var date : NSDate +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/Store/TODO.xcdatamodeld/TODO.xcdatamodel/contents b/VIPER-SWIFT/Classes/Common/Store/TODO.xcdatamodeld/TODO.xcdatamodel/contents new file mode 100755 index 0000000..b4455c4 --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/Store/TODO.xcdatamodeld/TODO.xcdatamodel/contents @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Common/View/RootWireframe.swift b/VIPER-SWIFT/Classes/Common/View/RootWireframe.swift new file mode 100755 index 0000000..66e38cc --- /dev/null +++ b/VIPER-SWIFT/Classes/Common/View/RootWireframe.swift @@ -0,0 +1,22 @@ +// +// RootWireframe.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class RootWireframe : NSObject { + func showRootViewController(viewController: UIViewController, inWindow: UIWindow) { + let navigationController = navigationControllerFromWindow(inWindow) + navigationController.viewControllers = [viewController] + } + + func navigationControllerFromWindow(window: UIWindow) -> UINavigationController { + let navigationController = window.rootViewController as UINavigationController + return navigationController + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Interactor/AddInteractor.swift b/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Interactor/AddInteractor.swift new file mode 100755 index 0000000..4830bb0 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Interactor/AddInteractor.swift @@ -0,0 +1,18 @@ +// +// AddInteractor.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class AddInteractor : NSObject { + var addDataManager : AddDataManager? + + func saveNewEntryWithName(name: NSString, dueDate: NSDate) { + let newEntry = TodoItem(dueDate: dueDate, name: name) + addDataManager?.addNewEntry(newEntry) + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Manager/AddDataManager.swift b/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Manager/AddDataManager.swift new file mode 100755 index 0000000..fadd6d8 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/Application Logic/Manager/AddDataManager.swift @@ -0,0 +1,21 @@ +// +// AddDataManager.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class AddDataManager : NSObject { + var dataStore : CoreDataStore? + + func addNewEntry(entry: TodoItem) { + let newEntry = dataStore?.newTodoItem() as ManagedTodoItem + newEntry.name = entry.name + newEntry.date = entry.dueDate; + + dataStore?.save() + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleDelegateInterface.swift b/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleDelegateInterface.swift new file mode 100755 index 0000000..5ee6003 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleDelegateInterface.swift @@ -0,0 +1,14 @@ +// +// AddModuleDelegateInterface.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol AddModuleDelegate { + func addModuleDidCancelAddAction() + func addModuleDidSaveAddAction() +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleInterface.swift b/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleInterface.swift new file mode 100755 index 0000000..b7a16f9 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/Module Interface/AddModuleInterface.swift @@ -0,0 +1,14 @@ +// +// AddModuleInterface.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol AddModuleInterface { + func cancelAddAction() + func saveAddActionWithName(name: NSString, dueDate: NSDate) +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/Presenter/AddPresenter.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Presenter/AddPresenter.swift new file mode 100755 index 0000000..6ab6752 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Presenter/AddPresenter.swift @@ -0,0 +1,30 @@ +// +// AddPresenter.swift +// VIPER TODO +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class AddPresenter : NSObject, AddModuleInterface { + var addInteractor : AddInteractor? + var addWireframe : AddWireframe? + var addModuleDelegate : AddModuleDelegate? + + func cancelAddAction() { + addWireframe?.dismissAddInterface() + addModuleDelegate?.addModuleDidCancelAddAction() + } + + func saveAddActionWithName(name: NSString, dueDate: NSDate) { + addInteractor?.saveNewEntryWithName(name, dueDate: dueDate); + addWireframe?.dismissAddInterface() + addModuleDelegate?.addModuleDidSaveAddAction() + } + + func configureUserInterfaceForPresentation(addViewUserInterface: AddViewInterface) { + addViewUserInterface.setMinimumDueDate(NSDate()) + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddDismissalTransition.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddDismissalTransition.swift new file mode 100755 index 0000000..81ba22a --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddDismissalTransition.swift @@ -0,0 +1,40 @@ +// +// AddDismissalTransition.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class AddDismissalTransition : NSObject, UIViewControllerAnimatedTransitioning { + func transitionDuration(transitionContext: UIViewControllerContextTransitioning!) -> NSTimeInterval { + return 0.72 + } + + func animateTransition(transitionContext: UIViewControllerContextTransitioning!) { + let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as AddViewController + + let finalCenter = CGPointMake(160.0, (fromVC.view.bounds.size.height / 2) - 1000.0) + + let options = UIViewAnimationOptions.CurveEaseIn + + UIView.animateWithDuration(self.transitionDuration(transitionContext), + delay: 0.0, + usingSpringWithDamping: 0.64, + initialSpringVelocity: 0.22, + options: options, + animations: { + fromVC.view.center = finalCenter + fromVC.transitioningBackgroundView.alpha = 0.0 + }, + completion: { finished in + fromVC.view.removeFromSuperview() + transitionContext.completeTransition(true) + } + ) + } + +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddPresentationTransition.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddPresentationTransition.swift new file mode 100755 index 0000000..88a7205 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Transition/AddPresentationTransition.swift @@ -0,0 +1,53 @@ +// +// AddPresentationTransition.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class AddPresentationTransition: NSObject, UIViewControllerAnimatedTransitioning { + func transitionDuration(transitionContext: UIViewControllerContextTransitioning!) -> NSTimeInterval { + return 0.72 + } + + func animateTransition(transitionContext: UIViewControllerContextTransitioning!) { + let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) + let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as AddViewController + + toVC.transitioningBackgroundView.backgroundColor = UIColor.darkGrayColor() + toVC.transitioningBackgroundView.alpha = 0.0 + toVC.transitioningBackgroundView.frame = UIScreen.mainScreen().bounds + + let containerView = transitionContext.containerView() + containerView.addSubview(toVC.transitioningBackgroundView) + containerView.addSubview(toVC.view) + + let toViewFrame = CGRectMake(0, 0, 260, 300) + toVC.view.frame = toViewFrame + + let finalCenter = CGPointMake(fromVC.view.bounds.size.width / 2, 20 + toViewFrame.size.height / 2) + toVC.view.center = CGPointMake(finalCenter.x, finalCenter.y - 1000) + + let options = UIViewAnimationOptions.CurveEaseIn + + UIView.animateWithDuration(self.transitionDuration(transitionContext), + delay: 0.0, + usingSpringWithDamping: 0.64, + initialSpringVelocity: 0.22, + options: options, + animations: { + toVC.view.center = finalCenter + toVC.transitioningBackgroundView.alpha = 0.7 + }, + completion: { finished in + toVC.view.center = finalCenter + transitionContext.completeTransition(true) + } + ) + } + +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewController.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewController.swift new file mode 100755 index 0000000..ec50fdc --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewController.swift @@ -0,0 +1,78 @@ +// +// AddViewController.swift +// VIPER TODO +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class AddViewController: UIViewController, UITextFieldDelegate, AddViewInterface { + var eventHandler : AddModuleInterface? + + @IBOutlet var nameTextField : UITextField + @IBOutlet var datePicker : UIDatePicker? + + var minimumDate : NSDate = NSDate() + var transitioningBackgroundView : UIView = UIView() + + @IBAction func save(sender: AnyObject) { + eventHandler?.saveAddActionWithName(nameTextField.text, dueDate: datePicker!.date) + } + + @IBAction func cancel(sender: AnyObject) { + nameTextField.resignFirstResponder() + eventHandler?.cancelAddAction() + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + + var gestureRecognizer = UITapGestureRecognizer() + gestureRecognizer.addTarget(self, action: Selector("dismiss")) + + transitioningBackgroundView.userInteractionEnabled = true + + nameTextField.becomeFirstResponder() + + if let realDatePicker = datePicker { + realDatePicker.minimumDate = minimumDate + } + } + + override func viewWillDisappear(animated: Bool) { + super.viewWillDisappear(animated) + + nameTextField.resignFirstResponder() + } + + func dismiss() { + eventHandler?.cancelAddAction() + } + + func setEntryName(name: NSString) { + nameTextField.text = name + } + + func setEntryDueDate(date: NSDate) { + if let realDatePicker = datePicker { + realDatePicker.minimumDate = date + } + } + + func setMinimumDueDate(date: NSDate) { + minimumDate = date + + if let realDatePicker = datePicker { + realDatePicker.minimumDate = date + } + } + + func textFieldShouldReturn(textField: UITextField!) -> Bool { + textField.resignFirstResponder() + + return true + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewInterface.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewInterface.swift new file mode 100755 index 0000000..3ecd131 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/View/AddViewInterface.swift @@ -0,0 +1,15 @@ +// +// AddViewInterface.swift +// VIPER TODO +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol AddViewInterface { + func setEntryName(name: NSString) + func setEntryDueDate(date: NSDate) + func setMinimumDueDate(date: NSDate) +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/Add/User Interface/Wireframe/AddWireframe.swift b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Wireframe/AddWireframe.swift new file mode 100755 index 0000000..f1fd62a --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/Add/User Interface/Wireframe/AddWireframe.swift @@ -0,0 +1,54 @@ +// +// AddWireframe.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/4/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +let AddViewControllerIdentifier = "AddViewController" + +class AddWireframe : NSObject, UIViewControllerTransitioningDelegate { + + var addPresenter : AddPresenter? + var presentedViewController : UIViewController? + + func presentAddInterfaceFromViewController(viewController: UIViewController) { + let newViewController = addViewController() + newViewController.eventHandler = addPresenter + newViewController.modalPresentationStyle = .Custom + newViewController.transitioningDelegate = self + + addPresenter?.configureUserInterfaceForPresentation(newViewController) + + viewController.presentViewController(newViewController, animated: true, completion: nil) + + presentedViewController = newViewController + } + + func dismissAddInterface() { + presentedViewController?.dismissViewControllerAnimated(true, completion: nil) + } + + func addViewController() -> AddViewController { + let storyboard = mainStoryboard() + let addViewController: AddViewController = storyboard.instantiateViewControllerWithIdentifier(AddViewControllerIdentifier) as AddViewController + return addViewController + } + + func mainStoryboard() -> UIStoryboard { + let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) + return storyboard + } + + func animationControllerForDismissedController(dismissed: UIViewController!) -> UIViewControllerAnimatedTransitioning! { + return AddDismissalTransition() + } + + func animationControllerForPresentedController(presented: UIViewController!, presentingController presenting: UIViewController!, sourceController source: UIViewController!) -> UIViewControllerAnimatedTransitioning! { + return AddPresentationTransition() + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractor.swift b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractor.swift new file mode 100755 index 0000000..f3b38d3 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractor.swift @@ -0,0 +1,47 @@ +// +// ListInteractor.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class ListInteractor : NSObject, ListInteractorInput { + var output : ListInteractorOutput? + + let clock : Clock + let dataManager : ListDataManager + + init(dataManager: ListDataManager, clock: Clock) { + self.dataManager = dataManager + self.clock = clock + } + + func findUpcomingItems() { + let today = clock.today() + let endOfNextWeek = NSCalendar.currentCalendar().dateForEndOfFollowingWeekWithDate(today) + + dataManager.todoItemsBetweenStartDate(today, + endDate: endOfNextWeek, + completion: { todoItems in + let upcomingItems = self.upcomingItemsFromToDoItems(todoItems) + self.output?.foundUpcomingItems(upcomingItems) + }) + } + + func upcomingItemsFromToDoItems(todoItems: TodoItem[]) -> UpcomingItem[] { + let calendar = NSCalendar.autoupdatingCurrentCalendar() + + var upcomingItems : UpcomingItem[] = [] + + for todoItem in todoItems { + var dateRelation = calendar.nearTermRelationForDate(todoItem.dueDate, relativeToToday: clock.today()) + let upcomingItem = UpcomingItem(title: todoItem.name, dueDate: todoItem.dueDate, dateRelation: dateRelation) + upcomingItems.insert(upcomingItem, atIndex: upcomingItems.endIndex) + } + + return upcomingItems + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractorIO.swift b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractorIO.swift new file mode 100755 index 0000000..6be6403 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/ListInteractorIO.swift @@ -0,0 +1,18 @@ +// +// ListInteractorIO.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + + +protocol ListInteractorInput { + func findUpcomingItems() +} + +protocol ListInteractorOutput { + func foundUpcomingItems(upcomingItems: UpcomingItem[]) +} diff --git a/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/UpcomingItem.swift b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/UpcomingItem.swift new file mode 100755 index 0000000..01c694e --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Interactor/UpcomingItem.swift @@ -0,0 +1,40 @@ +// +// UpcomingItem.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +struct UpcomingItem : Equatable { + let title : String = "" + let dueDate : NSDate = NSDate() + let dateRelation : NearTermDateRelation = NearTermDateRelation.OutOfRange + + init(title: String, dueDate: NSDate, dateRelation: NearTermDateRelation) { + self.title = title + self.dueDate = dueDate + self.dateRelation = dateRelation + } +} + +func == (leftSide: UpcomingItem, rightSide: UpcomingItem) -> Bool { + var hasEqualSections = false + hasEqualSections = rightSide.title == leftSide.title + + if hasEqualSections == false { + return false + } + + hasEqualSections = rightSide.dueDate == rightSide.dueDate + + if hasEqualSections == false { + return false + } + + hasEqualSections = rightSide.dateRelation == rightSide.dateRelation + + return hasEqualSections +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/Application Logic/Manager/ListDataManager.swift b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Manager/ListDataManager.swift new file mode 100755 index 0000000..546c714 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/Application Logic/Manager/ListDataManager.swift @@ -0,0 +1,41 @@ + +// +// ListDataManager.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class ListDataManager : NSObject { + var coreDataStore : CoreDataStore? + + func todoItemsBetweenStartDate(startDate: NSDate, endDate: NSDate, completion: ((TodoItem[]) -> Void)!) { + let calendar = NSCalendar.autoupdatingCurrentCalendar() + let beginning = calendar.dateForBeginningOfDay(startDate) + let end = calendar.dateForEndOfDay(endDate) + + let predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", beginning, end) + let sortDescriptors = [] + + coreDataStore?.fetchEntriesWithPredicate(predicate, + sortDescriptors: sortDescriptors, + completionBlock: { entries in + let todoItems = self.todoItemsFromDataStoreEntries(entries) + completion(todoItems) + }) + } + + func todoItemsFromDataStoreEntries(entries: ManagedTodoItem[]) -> TodoItem[] { + var todoItems : TodoItem[] = [] + + for managedTodoItem in entries { + let todoItem = TodoItem(dueDate: managedTodoItem.date, name: managedTodoItem.name) + todoItems.append(todoItem) + } + + return todoItems + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/Module Interface/ListModuleInterface.swift b/VIPER-SWIFT/Classes/Modules/List/Module Interface/ListModuleInterface.swift new file mode 100755 index 0000000..3405776 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/Module Interface/ListModuleInterface.swift @@ -0,0 +1,14 @@ +// +// ListModuleInterface.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol ListModuleInterface { + func addNewEntry() + func updateView() +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/ListPresenter.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/ListPresenter.swift new file mode 100755 index 0000000..bd24ab0 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/ListPresenter.swift @@ -0,0 +1,51 @@ +// +// ListPresenter.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +class ListPresenter : NSObject, ListInteractorOutput, ListModuleInterface, AddModuleDelegate { + var listInteractor : ListInteractorInput? + var listWireframe : ListWireframe? + var userInterface : ListViewInterface? + + func updateView() { + listInteractor?.findUpcomingItems() + } + + func foundUpcomingItems(upcomingItems: UpcomingItem[]) { + if upcomingItems.count == 0 { + userInterface?.showNoContentMessage() + } else { + updateUserInterfaceWithUpcomingItems(upcomingItems) + } + } + + func updateUserInterfaceWithUpcomingItems(upcomingItems: UpcomingItem[]) { + let upcomingDisplayData = upcomingDisplayDataWithItems(upcomingItems) + userInterface?.showUpcomingDisplayData(upcomingDisplayData) + } + + func upcomingDisplayDataWithItems(upcomingItems: UpcomingItem[]) -> UpcomingDisplayData { + let collection = UpcomingDisplayDataCollection() + collection.addUpcomingItems(upcomingItems) + return collection.collectedDisplayData() + } + + func addNewEntry() { + listWireframe?.presentAddInterface() + } + + func addModuleDidCancelAddAction() { + // No action necessary + } + + func addModuleDidSaveAddAction() { + updateView() + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayData.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayData.swift new file mode 100755 index 0000000..9c0a93b --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayData.swift @@ -0,0 +1,24 @@ +// +// UpcomingDisplayData.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +struct UpcomingDisplayData : Equatable { + let sections : UpcomingDisplaySection[] = [] + + init(sections: UpcomingDisplaySection[]) { + self.sections = sections + self.sections.unshare() + } +} + +func == (leftSide: UpcomingDisplayData, rightSide: UpcomingDisplayData) -> Bool { + var hasEqualSections = false + hasEqualSections = rightSide.sections == leftSide.sections + return hasEqualSections +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayDataCollection.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayDataCollection.swift new file mode 100755 index 0000000..d152667 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayDataCollection.swift @@ -0,0 +1,122 @@ +// +// UpcomingDisplayDataCollection.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +class UpcomingDisplayDataCollection { + let dayFormatter = NSDateFormatter() + var sections : Dictionary = Dictionary() + + init() { + dayFormatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("EEEE", options: 0, locale: NSLocale.autoupdatingCurrentLocale()) + } + + func addUpcomingItems(upcomingItems: UpcomingItem[]) { + for upcomingItem in upcomingItems { + addUpcomingItem(upcomingItem) + } + } + + func addUpcomingItem(upcomingItem: UpcomingItem) { + var displayItem = displayItemForUpcomingItem(upcomingItem) + addDisplayItem(displayItem, dateRelation: upcomingItem.dateRelation) + } + + func addDisplayItem(displayItem: UpcomingDisplayItem, dateRelation: NearTermDateRelation) { + if var realSection : UpcomingDisplayItem[] = sections[dateRelation] { + realSection.append(displayItem) + sections[dateRelation] = realSection + } else { + var newSection : UpcomingDisplayItem[] = [] + newSection.append(displayItem) + sections[dateRelation] = newSection + } + } + + func displayItemForUpcomingItem(upcomingItem: UpcomingItem) -> UpcomingDisplayItem { + let day = formattedDay(upcomingItem.dueDate, dateRelation: upcomingItem.dateRelation) + let displayItem = UpcomingDisplayItem(title: upcomingItem.title, dueDate: day) + return displayItem + } + + func formattedDay(date: NSDate, dateRelation: NearTermDateRelation) -> String { + if dateRelation == NearTermDateRelation.Today { + return "" + } + + return dayFormatter.stringFromDate(date) + } + + func collectedDisplayData() -> UpcomingDisplayData { + let collectedSections : UpcomingDisplaySection[] = sortedUpcomingDisplaySections() + return UpcomingDisplayData(sections: collectedSections) + } + + func displaySectionForDateRelation(dateRelation: NearTermDateRelation) -> UpcomingDisplaySection { + let sectionTitle = sectionTitleForDateRelation(dateRelation) + let imageName = sectionImageNameForDateRelation(dateRelation) + let items = sections[dateRelation] + + return UpcomingDisplaySection(name: sectionTitle, imageName: imageName, items: items) + } + + func sortedUpcomingDisplaySections() -> UpcomingDisplaySection[] { + let keys = sortedNearTermDateRelations() + var displaySections : UpcomingDisplaySection[] = [] + + for dateRelation in keys { + var itemArray = sections[dateRelation] + + if itemArray { + var displaySection = displaySectionForDateRelation(dateRelation) + displaySections.insert(displaySection, atIndex: displaySections.endIndex) + } + } + + return displaySections + } + + func sortedNearTermDateRelations() -> NearTermDateRelation[] { + var array : NearTermDateRelation[] = [] + array.insert(NearTermDateRelation.Today, atIndex: 0) + array.insert(NearTermDateRelation.Tomorrow, atIndex: 1) + array.insert(NearTermDateRelation.LaterThisWeek, atIndex: 2) + array.insert(NearTermDateRelation.NextWeek, atIndex: 3) + return array + } + + func sectionTitleForDateRelation(dateRelation: NearTermDateRelation) -> String { + switch dateRelation { + case .Today: + return "Today" + case .Tomorrow: + return "Tomorrow" + case .LaterThisWeek: + return "Later This Week" + case .NextWeek: + return "Next Week" + case .OutOfRange: + return "Unknown" + } + } + + func sectionImageNameForDateRelation(dateRelation: NearTermDateRelation) -> String { + switch dateRelation { + case .Today: + return "check" + case .Tomorrow: + return "alarm" + case .LaterThisWeek: + return "circle" + case .NextWeek: + return "calendar" + case .OutOfRange: + return "paper" + } + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayItem.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayItem.swift new file mode 100755 index 0000000..ac3ec88 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplayItem.swift @@ -0,0 +1,36 @@ +// +// UpcomingDisplayItem.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +struct UpcomingDisplayItem : Equatable, Printable { + let title : String = "" + let dueDate : String = "" + + var description : String { get { + return "\(title) -- \(dueDate)" + }} + + init(title: String, dueDate: String) { + self.title = title + self.dueDate = dueDate + } +} + +func == (leftSide: UpcomingDisplayItem, rightSide: UpcomingDisplayItem) -> Bool { + var hasEqualSections = false + hasEqualSections = rightSide.title == leftSide.title + + if hasEqualSections == false { + return false + } + + hasEqualSections = rightSide.dueDate == rightSide.dueDate + + return hasEqualSections +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplaySection.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplaySection.swift new file mode 100755 index 0000000..5164a31 --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Presenter/UpcomingDisplaySection.swift @@ -0,0 +1,32 @@ + +// +// UpcomingDisplaySection.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +struct UpcomingDisplaySection : Equatable { + let name : String = "" + let imageName : String = "" + var items : UpcomingDisplayItem[] = [] + + init(name: String, imageName: String, items: UpcomingDisplayItem[]?) { + self.name = name + self.imageName = imageName + + if items { + self.items = items! + self.items.unshare() + } + } +} + +func == (leftSide: UpcomingDisplaySection, rightSide: UpcomingDisplaySection) -> Bool { + var hasEqualSections = false + hasEqualSections = rightSide.items == leftSide.items + return hasEqualSections +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewController.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewController.swift new file mode 100755 index 0000000..954c4bd --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewController.swift @@ -0,0 +1,94 @@ +// +// ListViewController.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +var ListEntryCellIdentifier = "ListEntryCell" + +class ListViewController : UITableViewController, ListViewInterface { + var eventHandler : ListModuleInterface? + var dataProperty : UpcomingDisplayData? + var strongTableView : UITableView? + + @IBOutlet var noContentView : UIView + + override func viewDidLoad() { + super.viewDidLoad() + + strongTableView = tableView + configureView() + } + + override func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + + eventHandler?.updateView() + } + + func configureView() { + navigationItem.title = "VIPER TODO" + + let addItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: Selector("didTapAddButton")) + + navigationItem.rightBarButtonItem = addItem + } + + func didTapAddButton () { + eventHandler?.addNewEntry() + } + + func showNoContentMessage() { + view = noContentView + } + + func showUpcomingDisplayData(data: UpcomingDisplayData) { + view = strongTableView + + dataProperty = data + reloadEntries() + } + + func reloadEntries() { + tableView.reloadData() + } + + override func numberOfSectionsInTableView(tableView: UITableView!) -> Int { + var numberOfSections = dataProperty?.sections.count + + if dataProperty?.sections.count == nil { + numberOfSections = 0 + } + + return numberOfSections! + } + + override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { + let upcomingSection = dataProperty?.sections[section] + return upcomingSection!.items.count + } + + override func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String! { + let upcomingSection = dataProperty?.sections[section] + return upcomingSection!.name + } + + override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { + let upcomingSection = dataProperty?.sections[indexPath.section] + let upcomingItem = upcomingSection!.items[indexPath.row] + + let cell = tableView.dequeueReusableCellWithIdentifier(ListEntryCellIdentifier, forIndexPath: indexPath) as UITableViewCell + + cell.textLabel.text = upcomingItem.title; + cell.detailTextLabel.text = upcomingItem.dueDate; + cell.imageView.image = UIImage(named: upcomingSection!.imageName) + cell.selectionStyle = UITableViewCellSelectionStyle.None; + + return cell + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewInterface.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewInterface.swift new file mode 100755 index 0000000..bde4feb --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/View/ListViewInterface.swift @@ -0,0 +1,17 @@ +// +// ListViewInterface.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation + +protocol ListViewInterface { + func showNoContentMessage() + func showUpcomingDisplayData(data: UpcomingDisplayData) + func reloadEntries () +} + + diff --git a/VIPER-SWIFT/Classes/Modules/List/User Interface/Wireframe/ListWireframe.swift b/VIPER-SWIFT/Classes/Modules/List/User Interface/Wireframe/ListWireframe.swift new file mode 100755 index 0000000..1cdbc9c --- /dev/null +++ b/VIPER-SWIFT/Classes/Modules/List/User Interface/Wireframe/ListWireframe.swift @@ -0,0 +1,43 @@ +// +// ListWireframe.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/5/14. +// Copyright (c) 2014 Mutual Mobile. All rights reserved. +// + +import Foundation +import UIKit + +let ListViewControllerIdentifier = "ListViewController" + +class ListWireframe : NSObject { + var addWireframe : AddWireframe? + var listPresenter : ListPresenter? + var rootWireframe : RootWireframe? + var listViewController : ListViewController? + + func presentListInterfaceFromWindow(window: UIWindow) { + let viewController = listViewControllerFromStoryboard() + viewController.eventHandler = listPresenter + listViewController = viewController + listPresenter!.userInterface = viewController + rootWireframe?.showRootViewController(viewController, inWindow: window) + } + + func presentAddInterface() { + addWireframe?.presentAddInterfaceFromViewController(listViewController!) + } + + func listViewControllerFromStoryboard() -> ListViewController { + let storyboard = mainStoryboard() + let viewController = storyboard.instantiateViewControllerWithIdentifier(ListViewControllerIdentifier) as ListViewController + return viewController + } + + func mainStoryboard() -> UIStoryboard { + let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) + return storyboard + } + +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Contents.json b/VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..a5300b9 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/VIPER-SWIFT/Images.xcassets/AppIcon.appiconset/Icon@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..9fea245f741e7acc51b4e5c8199fb923dea20a17 GIT binary patch literal 10338 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

<&l46hyTi+u(!5`?}>j?%B)^Vyxab~!7Jwmxsf z_Mu@>q}(Nv&qVyzrWyN6zj=@n-f%>^NakA>F+lx%nibnCzgLV`jV~MT8XxCEMdn*F zq`IC~W=k1UO(`UaQ$OPHykt7EuA>>}kS1xmA=U;70q_UoFN|k5z#hU9?tH1lYA;t7 zFl=Ztv2Io0dw0!33@66kn*zKHMWlbt9~AjC+U|{Y#Q$w!-OBubb+YyVZz5-`A^kqc Sc%}a|ZsnwuC2Pe^!~YNbbIGaz literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Contents.json b/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100755 index 0000000..eed6cdf --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,39 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Splash-4@2x.png", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "LaunchImage@2x.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "filename" : "Splash-4.png", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "subtype" : "retina4", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png b/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..cc7c2a21855449002654dbb91947a695ef11378d GIT binary patch literal 62542 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 JWt~$(698)$?;rpG literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4.png b/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4.png new file mode 100755 index 0000000000000000000000000000000000000000..cf08c0e305b903da2021a96a0846d76efac58ecb GIT binary patch literal 26421 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 Cm>^vM literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4@2x.png b/VIPER-SWIFT/Images.xcassets/LaunchImage.launchimage/Splash-4@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..9effa135ac43fdf8112c8db90ce03b87fec2c2ac GIT binary patch literal 59682 zcmeFZg|j^NFnss85ppk3=V&S2LKkN_J2Qyrmg-Pjl;dHV@C z_0TMknE2~+Pv!M7leb~xB15YJjor+%SL9nRF{&2;H1TOpeoq?wZD5R2Wj7(~Gicy4 zmY((dM^?N{)U2Ynn_Z}es53M)y}>)9coOsxd!HIr<2 zWTR$fsU*Pm4c+AAZHf$lvK4?aA!utP{UXZrAm3zqI{HPHH<=O%IR7^cdXhcD#w zP70UJNPIglKTrD8(9lcF_)){h8|>%JHXgI#{!WIJ^fvsnfIljVe_~MmgG?I(_X^2V($>CEQMTw9tWD(AJO_+noNr$ zOYOp0U7vRE$VPA2Sr+Q*7KUk>3$`IarCJGuXr$C@x|m3fylHyTyVcu%m?U#%O*Ky!ZQ^ zDW)KB`OcoG0Y%&IJ_C7-g8juKf`|XB1mGkDV-8T`JzvI0f+E>5xc12zHw78LZE^ie z9iAX&Z3q53@hN~IK(`|rMYs%pBtS(9e-J zTZk_LGa(5Ccs+!hf#8sJeO1Ve{uh?%1cL-s8T=hiV{A5`JKtRW>GC{v+9DxGRL)n) zp^ROsdf|GSW%1>RbC5$m63pHnRCC)1tFAtj&X_6wLk&AvK^_>d;D;0fWm5;L2x3}6f0yNE((fz!JlC}h3VIBDrs&oon zYOE+Bg%~=TH}YRd#6{=jc)rvNy9m38<$lHZWjUq(JE0*}L%#Ww#}^M~$!NCti}=m{ z;^@Li^VoxUH){Eq*?6aTU8ZzeT}rPnPk9e@K*e_9b|s(eGSy6p^{Nhm04edLtXTaY z`bqjh`hFW6-HOyrQ9e<%ujLDb_sS-yb18{LCv#mU>Z)X`co&QoSV$$ga$u9ud)=4h zf0{2*ji`+@x9PS?wu!bY2fn`OV9~o}`%0J_5*^YQ5`MwHQ$M;ny2x2-rt{oHAA9%S z^1XZP+gRgRgxK)kGAdTnZ>Cd!Lx0Opv3#TX2KhGs4K~eG7&@9i>XbH`s>}Yo^$@sU z))3@ccmM6Gb6;RTnkb2=g@}+yg(#lAhl4Q5GO0glJ874_x5`uly&9ykt+89J!xEc# zJfv()T^Y=iSzL0I&p0lavs@@pZ1Ag6-6UJCas)>^ib<18q*kj|$w^dRnpvG$w^Z>Y zQ&2IzI6bFTvQ^V-plys|K`&S&x&2q>&&*ax8YFw&;N9=Y!twXn8rgh3+y*r^KhFd= zHEGI%Ql+A#Li=Tv=B8GZ^%_R2Mqirmn9{Hpay0g4l`Vn6MG`X^Je~Y~?%6KMcOTFN zg4Kgl@s{y)8IBl~7!Mf8!SrAxb!gRo*?s3iSCYB5fk*H6Z<_{{BYDd^)x`yjtB$Ql z9(+mKWy^Sta*d4*smyjhuySBGbCjmQPCM zucm@W=tnR{ve94SpW;t364;L0tk;p)Mlu;Ph3Gn4XHKas#%^jH+z-jlhVD9cLA#dc z1m+*>U>~rgu_7gddt>sWcZo*Pb$-N`szs`m)<)gvpL{#X7vvQT5)2i@X>n{R^kBY) zJOUpb@0TxTPj~NUVe%kuP!Z}Mv>cEGNEKNSofY*pk^`u-9ihF^mz;S*mr8324=DN| z<`}?_%JEVg_uh_xiGjU{=Fp{1#o5!@3B;%`{z@pE|JM4x1ED4sN)lSIE{xA?TA zthk$ayts6{Is>?JOCm%ggd$G>kDM6Sjmpus;AUc3I&kxF18wt|iA^i6@^Hbndb?n7 zv?M~e9c=TSjF_Bs75g~|r=wt7rsPt$-f0^&8{HTPi`wn^up4@&eQWd(35xfx@E`va z-=!U7AXOrTE42xf7pY!zsL(z4*(!*Mh{>jBD;O^rHuJB#t(p|2hWsr1pv@*g+sxd_ zp3NfGFkm))tb&szJRT`SX9qTJObC0Dx%wPJl}zmiMz8!me>x~J7-~ek zYWZ_zN-;yRtVPeX@?@t+v|dzky_s=D6VsyG0@vbb*|@U!+hY7%o$)LE!Hu6A^3+RF z2diKYwY%k^YyYF>-0NJJ)0!iS)6()@!-aaHK3HddtYl5QczftP>%6v6?XX1^qG_Xt zWfpE2Ud8&WqWMedH_7Sz{hWOtqVS}h=6$!?qtu1o#o5+XsMjPyC}KCVAlVy|Ca=C5 z1@mGNXg6eOy{L2aAZx#&)x=BJ>(kNav&d1&0Lk3mj&O%*zNuNRUtBSq9idS@<(oFW zR*!2}Vs1EvdkSpX^|v5yN}jWg-dpmMw3qzzEB6} zlW|+!^PWs49U)~DN`7{~47pBBsvIzp9*rEqO-bfSck(a1w81r-NU8#I0(rCfx2Z<_)eaT|U(U7~4 zW!Lh{?$g1L_{q(HR{E!!o7nNfbWbN(vx$Cx*QxpVL88!?m0vA9_cPbfUBf?HlTKzQ zdHFwA3R{G(eI7Gm2A92&dx!G3^0DcmLQd|e59iJ_P~)A|8~+O!D=*j+9#f)Pe+JtD z0O&Y>-w1%D6ask2$zrCgZm%vY!)ss#Wr7%5=^HUQL#^S|006%;FZ?6a$R0xB47ISd z<8>Bz`!5P!_~*aP%x@|FMPhF*@K#+`fkMp6)`)_GiJgh%tsoi&1qHvYp)v2*PZIy> z4u2AOYie(A&CAT}I+w0rmOLH=i) zPeyhIwr1A$W>%IIf5(OBTRGSZynXw3qW`}Bvree>e}dhk~xJ1Yx^zd{h?V*O8t|Gn}5 z?4bUC>+ruf{-*;!^Iw_%Z!-S(2L7uRzJr2ja9;jL8wAnb)`_VD0Kx#NPa?|B2#3uk z@l?HuHSq$Imi$fBFV{aicOW9lxA4MW_Zivp_j&1At6Aw3dt-~ann$+vRPkEJElbo+ z@hl)=0NbR%^0wv;>HPd;Uc+E+_=i3bH6s-xW35+&XI(hq;QRE|J6)&OXdnsz0*WvI zi0v)R4w4gBQhJZ}pJxDw0vm+_F!AbtQ5b@-0q@MMf204G1RJo2i0ut0{W}T;D-gvy zl7o9X;6Duj`19p|X(_M?5kPHyL@E2Cf9Lxb4M_O@zqHstLI6NLLku|w%Kupt07&8S zUs{w;5>iWm6}|D6$l5Fz+qTF~2f-T(rypOW^!8G;Y&4fss{KdS=(BVP#vLWR|6%_>`ti^1|D*i>*#3Wyvwx1he@_1Y z_^y8(-#>o;pRnhjsP8|a;y*#}f1Tt%G5WGrh+eOzt}oCj5A;bWDAM@{FZvaDxd z6g8REA)rtpeynqHpuOAJN1=>(0{GCwhm=G8S=uez=DQ;Nt+i2AqW{^(jmyQ*gLW@8 z?lq{b4u(`+ii}X)8&#^kPy0MM+-xX|MNM??T7~YUXa%3|%98xJ zX`AogrpA03jh^om)e`m&G?Nio7eI&V3_SRDag}?SE`58yHh*!q*&T- zYiB#PjN|Y`5su4kQJo>zzU-d56TU+lLaomo3oI^o4-}?5M+Bli08kH(Fo0wYMnXp8QXy*oC-qSP2x{a&xb@%~9K#BR>Hkymn(ztbN10L0@h-PYkSoP7- z1T4AfNH;MvA^Fh2^8*%N&236^U!Qi4k5k#546wLty9>>|0cWpC(V%$Tk6yffNglKO zic>O|69Ydu#XDV0D82N^^5*_dTD(nJ%u9+0R-0R{J1r9Uyh3eGI?2YHqecRIIy+T4W&yCo&&ii6MpP{eM+@?v?BTD;zS%udxZZ~LGFL@dEZTA zghIaWMM3tgpafhtKi{nd#Niw3Mt?u)FhlioZGEo4Fek6PJ}E@Qusfc@)DS+)5ME<} zA5xv4oXG_ckqL}BcG`w>mU)tm4B4GzOPz4JGBjXG6#rKEMoaftCp zE{Ufgf1r;xkRQt)3FYwJ8fqtSwRmDjJ8m=3F`?(%^YtSYiaXx@O5K?Bag174XV)$N z8+bZO7bs@-tP>&CgKxBG5*-{(!{TK;iNR;n{NBd~d<@%Uzq?zZH1QL*LrJ-OV9&=} zq6gVh=^>2hwBFFC%}Fh^9!B9^KP2;|P=1QWY0qS1eFzX11U-a+Cp~M^%4cz}se`+D z_6`fMf0eN;uzFf^gyQyXSiI&C3=e=OvKSa;1!!NRM29GYut2@x_I6TsBg);Y#8P}` z50(lV`T6=;iD;y{zHOg?GfSy6h(^gvi@B*zMXhG(%+J?NHKD7KVn1p_A3YaV<(fXW z0DNA+_1waG)8^pr)v5nl5JX(QYa3gWA@qpr=+pYiJVIBZ2nk+~SwVv7Uuhws-p&*K zfw*$}dz6dyTF}01okcsc;R)q7DN7Zj!}f0Lr+IVgBdiR%pLox0nGoIYw8g=Fu-~^@ zs~vR#63PzB%fI+*eBCH>IUVS~OLg|CO|EXZd&8qkHdg73$`0*e{o-bb<&y$IcTJ0g19T}dOG#lJP*( z(=ILq8YO)!y&f5@^MZLFy6TSCH*p)dNFWEN!UcFJ;C+t_biB5H8k5XHxWt=miuNO? zGsj9L8@cx8l(voqF)b_25csas_>&#+L>V20O+zQib^74AI%LK;ED=-=)I~JaD z&U@WGHX!osD_>h=afbO8&>YVU|5{<*y9iYC8~Tzwj*H3f9*Opj>9eD^7rgn^j|?L; zuQo3@|L&~a!Piy}kV}#wk+8K|>|aT62~IP%U45X`ll7*>m1iA! zZ5>U*c|P`J6nl184701a=h{-Yl?bDhVJ9Sg5?yl!dOD{397m^h+ZsK%wOPXLs4Tb; zQXRVsZ)EDFRN#UiV-Du8j`P`pE2^$viFoJI3kE!CmLsV;KT5#7W4H`*;G|c89a#osMfVUcT8Ik5)B);qbt)!o2%>_o0T7 z0ts0DH>X?NU0_9_hj6-$-pPV+TTSc#_U9<^MtFaF7mv*2$^tUn|5`@~Ul%Rq21G$^ z<;@){*i<6BZC9n;bb2b0y_nBexVb<-Y2X^d4jIw?0E9%1JD#MTGgbN2%UphW)yE&% zY;Q@>(eZ}fdIpV?3(hI=1Uz!)>|5R$VA?dg?z68!@}38HmN`323lVsMeafacyvU|OB9QA9oTHy| zbB`#Mfi+0E6=3&h{pd2%X+<%{4p$3V^N+_)mcW_!?%;)5+L4@(&jZH~EorqW3!MFsEIeZhGQsXjE#mpNbw0La0vW~xv+mwTd zJM0o@6?%hB7wb(+zPPngXtJ)t_#^I$MIC3?BBeM*)e0+Bcn_kVk1uLYVn+xkw5%|=xiaE zXNYGXZ>lB^R$zte`8YO8M;z~?*g-b-O=!c-sgp%d_9~emS7Se2a|ItgAI5C>-^h7&ch;q2mM(sw&;;jtI%!~KnOc2Z-3d2450c;NdRYf%;s0dggpz4A!-#; zr$sabCW3W2{+HbT$}7-1pD2{NQXxj-Imzu;x?GH!oQ`ukx8jMRw>tFLrtjeK1!v8B z2Q(1Bwa~kx1)PZrs5Fjx?Z`3ArlC-h9knF`W|)<^S(7SEqc#7~?&#6N}R%X*B|A3n>xq zS_18@uAhp{y>1BfHHCLy-eCH!W}_5AOg7^1-YVSG+hh)$ZE~YJXE>5Dn=I8SiRx+7 z64s8ae9DHodpKp4U;6;zKH$`Fvy3_H#-tLtwX{)T`)IGU&+}H1r||Mp@7^U>ID-*> z8@4zRHT4er6tJxJ<{2iYk&>$9_&xVxP7Zo$(khIEx`(7Y~{Z z)HYzvL9)g@_>SlJCV(Y>02*y$IS={NAW`z!&btUa<5BZWr9f+$$&4$I8I}iM5x2a} zGKp$l0phApn+<%_@OPbOJ+I&)BQ%M2^ko$^JLeo@aMvvK2dQYwYnr}$o?`YAG3(B1 zinZMd^dz<FC2I?dT&@wJ;p7&WL1&I-8QXvUam5Lg?p{04zsGT9R%}I-`#4w!!q|#@P<`ZFWi)35F5ap>M+R+ENY#TLE!L@ z(!6?^5kMcBzr5NW*qk7vI3L_NqRP&2vsdSI97d6-vyW>LQRO>iNL_!G-5&ASm8U?F z-EYF`t6WaHQ$&ABWRZ7P)Y0KCrE#CfU9q)Vky8F2eTkguB&{oCAeURbd~m@Sef`An z>~d~qTaFD2p-BoLk!WW7!!&kNb-p@O zut`TBhL~81dyYH)wR@{|yxCF23gk5h>S!jcDnuHZDZS{eD2RZp&HRdbPL-s|) zuM}fc!0Qe#i`l~E;3`fT&Jw?ab0eNgerfdt8VAW^hnGH_{Lu!#yE6$;3_qOH=F+=O zKy)?o=qqd1DWT~CrT&-A-vg?GGM^QD&p;JOLtw_C78Oc zKuyjr;L&Zr2|x`LvSTtSx~jb}b3M1Ije-VB`V2oPgNl0ukoklHJ<69?JJDbpsJ)1G z$v+Pa8Vi`|4!h8kOtnOs;dWUA`nqmPU$4DGP|C@DI7ro|lTu%TXM3W%Y}VwlnR9>c z!Uu;ZHI>?$+J*K}Qc--kQSClp#y8bqmWs#K4@suSlbDiA=TmA1dXhAW6^XSe4f-p|7zr{wcT-jRfW4$e4=!{7R5 zA)PHX{_z^s)5|@a!PRmibWv|E%W6DyBaByoipjz0vgUu%;~vj&Y|+Yv=Vokv4IdHM zEn@==EFWLYEF%_0S0Xd>cjFNc@Q7|&9s~z0<&R!RGuMvI=U#>4iy&173?v!H3@+R^ z=LCQktEWpU@v{zG*GYP7BrRQkC8IRFS6Pw-AXt;X)R{>ZCa`u0PBYX|V}GiFJD5+) zS2dY;NmX7}rnUlwL3u|Du~IU(O`f2p&n{Z%F(xrg#f%VL8pZ2Mv&@rM-3RXXhrh0N z=%SrZT`J+X;+%!eS*@CZVrOx|(F1%|mJFnGIH4TxS9B@`^yD3GKB9qs)2w-#md@Fs z!Op|rL6uH+?RboW+Vov&us~wYAqbB@d7RxV`vcM7!~7qKjU6ROFL11QLBmz;tX7p{ zzKgxT4om%DcLIcb!@c&#Kht-bt?&GB^rfuYVJqOq!r$pd9zu z)k}~4>jT^iHq^Ylsg|UOzFCP24HY=jmurqe^DbzfUYw}oRzgWcxo$vXh9i`gKV!7v z#aL0hev+O+_@#Tf3;;f=kmoxNB%s6JFm-okeWio*C#ew0^)~%uW$`O&js~Zv&HPJd zW1oZ;1q=jqFCFKU$(Q=jOQfU6_iD0Ji)qFiM^@&~MM(CCBXfx;$hkdm(==b=E??D1 zFr+$7jqmJTBvKIQzeMWpHDH?GGCxY+3{Q<$wI>jWO>q0f;o$UAj#)Hqs$&RKN`_`{ z&Jflr+1&*PV)|W4)k#nNDzrFjiK#mrSBhlnhOhtUtwJe3O6x?c-M03^31BW5|`g{ zf8xQ3u$r9Pp7Z_+%tGSt`cZpD(dMog?zqN;`KqkUkD>62)5J ztVSDOu8}hw;xWElU_zJUA~<`m3q00bIc}EsU6pp_)P5-Xiusxa=h@B?+XVH@ZotkZ z;?>D-+A^(2Mr&kj?$2$Axop}??}}%n2fX;kJb%_I(`}+&Qe8DWm&8Bp+!t)EHsp(0 zezguY=^pP!W!Qt*f9c?R6XPL0T7dudvNl@_T45`7J!mC`e!F{|)Ki{Y_A6joQI(_s z?#}c$mg@IWK~2^5?;U2Iofp5_9?Wl-x$5w&!^*w3P`9&kcAnR-sqWVNlt29OZjxay zzX@?aunK*s!6TMWm5tEVbFa-M<>^Q*HG+aSy6vn( z!k7-9>29cg0~J&xJNMNXp%>R}y@aj5{z}CnL~bqCqbet8yZ(vd?y>ryAFCuyPR?K{ zGIQMu6U49u_H%feqPtsw^7S`6EyY+!T}Jx`+X4|b!PAwuBi8Tk9((BOIeBsQom?ZO zeT1js%2#NKP|_;d79DaFOd@o^ksrI?f3^8AZ`l1CnI=gT)f1DoK;vzvUQ-h2ahaA@t28<3i9n*zB21lbkv^In~e%$_I|euJe1fR=(U8En{WQ zS6@?~y0mTY@;dGLWOVk@gJ#zt^Q?Ue^z}$LYU!;>wi6S5O{#xOaUpU4{=zrg{i;w5 zy53g=7?S-C2KcfY*egCRDKB&=capS?q~UPJ5(Hc_3U%CAr40zD!D zn~cMe{w+tLp@!U_n=!(l9h%bTxLhTpWt=u$Z}}!*_*<_YBF;fhUD3$=D=m>G!;her zk~+t0Zl|#`NNKu#iPZtmRkSprBn87zO>Oj(qnbu*ZUpV^va|<@NKgBQIyESP{C)d~ zI2KM>$$(wI`8iV)pTCCwnuQynC`e? zbKWQly4_1IOnLFPjZ}ei@~?E!_|y4C%9x|SK}lgUm@g{$FtCo5O@jYO6E#Y7LMj}f zVmT88d6+1VL-mmJI=_X%k;HzktS5!Z-xJ8@3oIX(<7f%dnXr!KSRWrHSb0~Lo5(;S z{%wBE9sJ+@TB>rA-IAL(&1p4muV zMnj=i-){sZ=HIQE*lA*dJ9XYuBuC;Km|Sf*bj#b{ON6_WEsFI7qru&jDj-#wj7pEN zJMNR!w}YE3ox@oT7mDgQN)(t%m`G%vP$45R*~N z4sK*t6lE#6rhU2B;?|?=`4lQIb1xvvTJgx>Qw( zW2&55EVAf`%>G+ZEc<-&b)P>jGlfNTV@aa^bH~u`nUh4e;vc^nF_rk7A8la?7P^Zv z-xq)@w9iPKI)@snp3<0e`CYYuuDXKF*SohygE?vm% zzbv(vU*gDZ%}wktibzC<(5_{-IUZGY9jVMKuT+{Vx%hveptOF8fc~Cov_EETob8Jd zXG?Mb5?CH0cZlr^q60-854|%L@BQ56`GWCsxwv~iSmRQIU`QQ#?Ex7`4UdEvUUA0r zerfwY&TOnxm}D4s6hTA}Th<{^H%K>a>YiHW^^E#xB+rglauOBS&MBD|oM0MuEfhvV zz1CtN`*5_+H=|s?nlj~NkyzeLABvAjiFWh0@iXHP$@|@$4V%#uJC}bPa!lmybh}DAhFqZ8RCZik8Gx zi#*EfZ@QKE(uV%ReA~)t4qqUjRv>l86@%}3X7wkLE{jV2O5}?&w=CHluq)rAFNp|~ zxy_DV6K!y?qCxIC(qA62neqkGykk5>7M;K=0kvl6b3}pBG=%B>h=&>JuFX9~NSB`$ z57PMiK|1&HHQn&sA)&xg;8ER!02+uDn1;=Zrnmvem9%C@E6N=~X~WR@Y|Px;@bmep zH6x5)sndDdDH>&-=R*`O8k+4je#WdLu9RMbZ-vu81hdc1zta;L1+I2Zd}*d2euqx4 zg#S1PjA%Y=!X;9wrv#8YJaC8kpzrPD`%ZBm^Dzq5;BLIVrY$w>rZn(S4bjCtkp7A&SBYZDBl=s7)u+yQENb1h z{tQ&~s5y;t8&>7DJB4U6{)OivfR@Od_|S!W+LZ5!lgMeR0&c;ngxxrORoyWuuKSE< zEjg$r6LBk5yW4I@Z`TBk*nDVlv$o6vJQ7tX&VaeJi&HHr6#8iBo31ytZj_{(3|Pi% z#odX+Y%LpQEDR$HSHc__oG9KHra7F;`gxJABI{CQ(GuTij#imauC0tp;b2lxKakd zV^R;|LDe#7H0cHN9L*><1$c)I##P1LsB}Fxw|DG7trPRtWq|s$-cqmmj3k0AVUq*YZ6oP4?S%jxfdILb%R*%DB;|ylGgh@2G@afGtmP;`B`d>n#=7(?i3a^w-9 zL>c0HCUX)D6Vqexkpa~AE(jIdUz9nGCnQQN#osJ9`Hs&e7mtg~niKG+8(naZrY&VQ zB*54zxLobEGYv0^5Kgf(KCd>IH)rmi*KGI0K?CI%SP{Sec2V_KU{$d=mb{t+N#BLb ztK?n^@8EGHq>kq#Jd>JParC(vIi*rpO2AB^fQB0v*_egek0;=_#jDAok^iXWgA{SNMZxB|Z*kcf-wqvn=k zZ2FNXh))@Y(H1ZL)UX2jNH+#J?Dg5jpUVWNLMS|jh{2LPhu^#;kV}u)|L_ikmAt5I z#Pu5CVJ7|l34Mtlf7ng!a?6NuEv(81O6PcM{nbUDQ~b@vxsZu|y{_hkHWavGJ39$SC)i?_G_@%6)eT0BVY{ zUq%Oq5aOukFavnlb(Zx^4K?AAoP^TkNj+4WQ(RN<=N?2h0;wn|gZ)m?Nb2Huh@>hku|v48~6)TS8;-kn#xY zzx~lOJOi$I(-*2V3NKN&=G1X_`vOe#K5MhQ4$>hURL2;YVSnj5yli<6;u&)U({3p< zl4(S8>M1$mwy3fq3^G04jCAXK#!#=q_yxOE7&SBz(`d`0&KCu{Lh|^xFk$*;Wf>c6 zZseV2tgY`G_f#IMD>0FPF7WKsP%_;vI*6g6$TY%T>011n>C#(uDI!sH)IUFhwk{KK zCoFHrB8pxkcJG>Q0-YU-`=m(=w6wFj;hjCfxmSzRTR-}mFMZ)?{Yo=mob7sU;^bN> z{Gmg#qKb27Oo-tkWVgyspYI#ZL6#;@%f)2=hWSN@`5|12t-ZM4w&;1hVzM3=i(?t* z8#F7%_vk1+dxxEFkKx-pbR!_bnw9S zRhjA@*zAdHdZXx2hD9WJ=Q30yBlUfoPZr%odt^7+o#rA@-xuQkjs!E>24o{-Q@(G_ zIl>fba7(S<*fJy|O9ijtqT*ncVxa%^ua3NWgF*U*A{xT73k2kLWE8(7l{Wc=4+&<}O#Dhpk3&q>KZH#a4W?5~hEey{COG4w5!Q-jkUm zmN}Lh1?+8KjNml+;gtcOpe}m&xcP|%W zLl)R7u+ApzTW5f(AN$n_K36@$9_}FLr-U`h#uhCLUdyAIv6iKO>K}alh0*;~E-Q1X zkrd-_0*(zWBl&z3rI*rrw6!U;{QECs}sktTw%x|GU-F{@2H@QR8X-c% zGUjTVwrMzI2ra2zX;;m$bawDU4DdL+wj#v~_vCzJ5Nt@MB?w<@a7Zv-!GhG# zNMF!0N~J3iMCP;iD;w#uWBxPnKV; zYjusB#89MpZJm4vwkH{xtuD60h(da3s4~LCleojAoyk39X6S!{z!oI>9u%*u!yD7+ z84J%W^z8z_c2Aq72pp&J=={4jC|zP{Sz!bbpS^$X^E{$*^LINa7mthE=|XEGX z$dz)XK4rT|la<=TM{_c|VJf}Q)r;NxpZ#E=UNUCyB80>DN03xsF<46j8tgTR(6=hn zOSZ)C0faQA3;lA>o8uNccHsC%2|$swH2b9>KOI>3G!7DXQfsM#iWAy&yPtz}DR5PV zwBzNl2pn9vG)BF$qE{|2S)SAVjsZ#rDb~GHG(C}o)=2Mzunu3?}SY~|1TAeXc5ef-6 zN0Vh=nHc}1bcgXROPZF@1%GA=Wd)dSb;JWjjX?yctNUGnr4JR0|K3V=s8 z)&2p3iwiumT8uw=T_lP6BPvQ>0QVp?o-c~0n{&G7i6_Qpt$MdlNiSMP;8^TniI=0L zmIZt7i6nlYy!$vt_9sTP`C=w}0v}~_^ZoA`_S^fk)BEKlqP9ZqTl0Ju8ci3eFN3Z z_W=pXJ3BBZQk)r?0n%rLYHPz4_hp5L-{2Wz!faa*d>glz0s^FJwLf5>zq9saYE~$U zmffgZF-}~O6OgNQ(Sbnr8@h##S9ny(;iu)5S#Zx%Pyhgn+oXszDs&F~c;&6^wl2)Y zJ+u+7Vz^rQ?xbTRk0vo`jz4v3Zz;`E&D@1iX6ZMSwnIMUQ_=k>e}>bP>FD6Q=OFFO z=KIE^4a~#hlMv$bxzbO!QEwJbTp)SHrqVea%q?Ofb3=<3*1C!P7>ov-<2%s7i8q~_AVIXch>1~5u=`@!|}F!slcrw{WnIrt`n zL`pi%EHcN%+!qsFHQVUbRPexk(7514))|J>95W=g>tkim?MJjB&*}O;P}4! zFhtZiDwXKF2Tzb6l3=u}SdDkhmEnh5DvfDR&Ip=6;@v@RpBGxgh)NU@oBRm_1IjUU z649xW{pQ$n8X1qWk2C4Jp$D8TZffX%_^cMxm)^`kn@1%=v7k_Yn(0BmAq8o}e78pV z!VwxG3O8GukkT-ApIqpTslHV7fb_+$1FnKwOE_+SoB6yf?T8_QPCzmBN67M>P_S-9 z-Ze(|CW#cb#kX=lWw47c<7ucN-bPF$heMxGIpOkvT;tx^EhWz*yA8i!xv#tW-^fbz ztma^A{^v#TPob-*8pP&>sg%jS4WCuNr(Zc`ENO-oy2=HSFki;))cX7pUdqSM^P*)u z8rUY5LbcctW}YiCr%sxF)m5HM$hI9Q5XhIPK8xtZXam*gDlhPE|H4zsgq5dCFkAj+ zRp$3_B?^`x_^lq5s5=>ov+xftjWd=DKG%F!R>J^`GcEIUh;{2EFs`T`UE-LTlJ?p+6W zHa<`G=DOy_1r2u@qPBd$UCN~Iyj2C&UhPVn@NL-Qg5NX~c)y$Pw;Ysnl60&T$2H&N z`|@h9575p3D878xesRCDyfgDOulf8sxYEzt*@?lYXLP-HCIrj&T?7UTCTs)2Shl?T zCvluz<53W;?Lt1p>(@)lG}E78PFNGBpumK~&)2N9s_ebY2~jXVKe5%!mpJ|b{jZKm z^3MU5#4O0}p6Wyti{90lhK>z#vFiTA@X9^k&i<=?#LnGu9ZwoRj9-TpsWc-a!tj#8 zHYxbQC7;!4;s$Ce-jdpR1!b$IXH@4MxA&!CIe}-Zo_Tq1j4PYaZ-_jGf-SPj5hG}m zNM+d=BYAqJYE}Z5@bKEKv@S8%# zW7Or*ZI6n{8th#4=)h)C!6>%oic zTuPEtWjv+JyV(b;EU9X0)>UNLvA$*5JnLoA-$Zg*2?ahKD2Log!)DPcLp%sNfxqLE z2|K!KFYaxt)Gtf*Tzg4%cC?V}0Rk}zB4Pf}(3GFwz}cUPWq_C}mDg6C zap@f`O~3mEyW~n9Nk?t`UYm-lCs+z%DtpcZHinUhAurType}1bkfB})Wh_whm8Ane zKmy;yb;?+3r$zwtu`9mogq5950-oCoX~r@I4tTB4j+N$%9r1ZQCVM}g$2rkJcwJtB z7oG%xj4hC_+l;|_@y}{fT5<|{O)jUdh~B}xrckR%!Mo@XcJf>O(YrUp%Kd6fT!$~W zgdcY=XHOQvlV472_On9fi@%LLyx&BCS5YQasg;@s@72Uk_0?4)25}&UP46-;iU*Hu zpR(f72>4W&8$NC}Nkq(2`D;ZOV4w94n3+}9wn5#NOtvFeHQ<>TIU%v-Vn&xq<~pMf z)-!!hoUvv(so_QxJHO`{Hl;NZ1hUImYUbg&7!tTW*(h`4p*Ul^Yz$F!;h86UjL*@` z^zD_gcC|vHtM*J9q)I3zVl?8=D?suS+_io+mxN?eRKS zM}O3vdCI-1T6{tS1wDFuUppgfMUL$I+DS1DUX|zmTU*TiL8%`Jsp$5Js?YW<;F9Uj zzqAqz{o5CjPfUs1d%BYBG;|LEui*t6T*HZ_T+aCWH`$ODOlpUK6Hf?^WIlPLSiuGg zx{`%7JfC3JI19YVZp7s7)+r}5sl_X!&BtIK+fiHvZ_ZA3jPQ8vYA;Rub=ffo<;Ks~}3V*610?Yfwy0;r!_mB*S5X9=a!f}Csx zCodKRVw|8IIB^fvUi=(~Hl(94Te1c1k7s@v4Xf5WJs>QbuKrTp$PB^I(_PR`=+1*y zkC_m+FbX7B+Os^5+_dP+*y z;?4vQNUqlEqVdeX$5OX7yB2q&dgbq_a_4CkRcus5Hfwe-Az+U8CyyY*@$!=+6^ko` zbB|}Fw0hrx=7!WH=x!m`r=ye3Fk&U0KWqBnsXloFg+&6tw?@(A+Ivl^8zPW$w%K8; zRpTW|BrSZ{Hy(-2J&q)?x@{%e&(vA5wAqKmP@==-5CRx9WKF3F1_r5PRGcQJ+& zs`C|(YRzPfg!%p4MdRzD*-Pb)X~zaQ5~bwso$UL{?@Eae(=-0!IOeM2xLk{j!MfRK z{Ye)akbMH&n=_SPl_sKGu`p{{bxGopX+cA-%nc!v`|M?iE~RTdmoU;ZbG&<@mFv-J zquWsAX)iCWgdDf5kM~WoSJ&VCjarHiS*ujV&V?+gK{qb3D_o8weU=MwEDy;SpNNAWuP7heEsl?l!vtLbrHk%2>!X-{x7!a zDZ9>w<$RtbR1TY|M^;^cW8&@=CWFkg|6A{Mem$t_ zG!impD=Y}jZ@qU%9^EGJbj3cx-e92glzX)LMY41auS47Ff2EgpdX)Jb zV$qyFCUo+kumMNH1Xhd4SI;%ZJH4?dH!jo|lDB*{{ZAM0$c3Eh%Ckzp%rM9_ z0uE&l;2aVdl6G{2Y_lI{%!BnD(R!SygwvxDf6#sdwPjcNwsFm2v{Ny2@_AZlFDuN& zv;TM;*R}2vi!*R&d541$7|^~&yCPUlVl};4QcsIh_{?l(>$0uI%u`Ecf?NPqe?_v& zeBY^K`&en-pUY>7dM%CzY!=T4@7|J&KLk~KuNd2^XA0TN(WYa?W%Yk(Hm!8~XdE5F zEbVhjg5r3f~s@OtV+yD>0(ts!;e8=gG=uDE$P-DfoxqMi755(v-A zLKlNLDxou*yU|4Z<%^G&Hc|6EA`jn@>bgwCgS;!Kh|7r*a+^d-8$_)m zIX?)&GqFmOjY_w2jVu>?k&ZgFaQhKnVxs9VzzbfyIXktt-G0d3YDd@LF;^BwbOttQ z!?H@wf2Q$x$%$r=kym-q0wyI@M_(fMC(jDWdzO|#y^a~B(M@ZK2DpKEm%J6)ZenK( zWW0@WMJu*S6}4!B|c*Iv6!+RFbAPhY_hRU35+h=inqpfsX%cc%!_ z-Q6$@-8D1{0!m9ucQZ(r^w2#+cMJ^O@y&bh{q8TAGv|5EjP^=?nu#cVMQfC$zdW1)(sn9EdruES`)sDVWzn7 zuvm9KpDvfWG1NDF%kzy=l{G6=pxTL^CF{_<_2JsESjNw~XeWQB?Pl1b@sXqHB7uin zNM1)L@huzgo~@kk5v96qo!nD@u`Y34X<|jDzM{&IN-B4Duv~@qx-a66^S1M;CfUQ< z!Yo5lApqS+0f{`elNoyHYvzJGp9@kS4yJ?LzT~5vL8!9BICv$6R}m?qph`WLG;9EQ zXyoCVfNzsx7slOKH<`4XeEDU=R9c|Ez740a1XNb^*+#fLb(`0{si(tnM82uD_K)pU zj#?a@*|XhstyDFs1sYU@I%j{=Zdvdt_PS-LSOZ1xbr<&)MrxV~ElU3kH0t0WDo8)^ zqR3_o(YC5wHK@XZi}3>^N?w1*@YQKQ>xIzXxg;oz^V`3GaBVLdA1eoLFJ|@_PJEp6 z$c^}0jt|OTm>vPB6LHi87`*|DR$tA))M33DKSwuc${!JJgL{BqwQQqpiaV97iS!fI zOqkf{FbTE`(BmS_Z6Cv{8T`Dk;1B*$|Jj{TS5;w#d&Z)5P6nTNQxWnWa?(>2Y}IhI zt8gg&^Utw!JN2sJGqOXyE`hgW2_+=UHTxSw)0V$4q<2QWeRn5h|F>;+Xsteq#b>Mf zpc}{BlsLV2ys-9&aWc9#z$e^p8wBq1m5B)Gtl^_7}Xy99>gG~naCPbYe7f+f+0Zv?cbEFQ zaV<5rl;p|84jI?FZpfWsh}k8};C%OhzkCWE)ycG1)Bbin=o>@cMpM43?Cn73Ng-0s zc#SWkM*a43YrPP7dLg49 zE;RT2m_i+@arm{iIoP5zwJICtMRY(^=b;R;Ly9bL8Jj{O! z^GMw6Gu0}n;Pg?IobIKa-2MD9Nluj)R`9f|!()@EwtvLU_qHBK>M3nAH3BlZ;*+`j zzv@!6t5>p*%cA)L;(t$>7h0I8Ya%40vE*lK+M7#(BQyFtoJ6#E`dFDE{bU@lcA?3L z_yHZ!8?TGt7|)IHBvVOi<4MShOe^; zsL~KETU;3X(_Yc#*oh9MOUa@7GGH@#VbzYp@()kx3!2sd(=qnI4`HMGZ=C@ONnum(5V-L7u7Z6CMhbMU1XI0`!7s~rMDlpjRD>24hmpWQ@?gIjo+H3oLMGdE4e(lG&JZ!pu zCOGL8`WG76c3#K^nDV7~TxEC-hnq&4&Wm(xsi*t1TXVN~3Ta0I(wM!9tiN0Oz>x9u z_kC!wM=T=I?xf=~zr~fS{5e=5Rw-Oz^MPhXtC!%-=}bS==WFiW+j*8!OVb8=v0A)A z%{hUTQ!fRIfKhZ-xNqT2M|dY<&`xjDiPu0JY+cn(g!9sp-fFB=_|#o!MLGchKbJM(=qq@ z^T@`Ka;tmRoDd7fKIOv=o<{^mN7tG~)4E(dZ2|*W6=izmi@5PtmgxD0z^+r+E8fJ%BrNQtGg>n4{ML-Xggosl1T<2ry z#Ez)-QP7UCLCs~}!R60a&J8u-X=o>sTxV8q(E4gOKt`WFDFWO!i>0!=7YtQFEX-|m z>_qenJS~0YFJS6F&97u@_i6u+s=ff_(VMHUY;=ocSk=7CRozy$Az1gq&nk_b;3UAr z$4P{uT@@sgvHHq8nNNNs>*)~ub%chNJG20_(SJq?P*vF#$OXseO2##J6CwlO)0<9u zdCQrM$KZGPLv40@F0)N>6if17RF=p2mP7=K`wsIku75-8pNJI3tevIrS_hx;h?O{n|R7X`4Mj*kUCxP5~(1$ zI=XJ*W^~fmdxyCf<^Cy9bHoYLSsKqg6kz4P5U#ecS#O)Cq!6yIpIZ|> zu=HBGza41bGOZePRXuHO3oe#i6GQ`Q?ojBe#&Jk?S$@+^$nl685=d4V46`xpR|dRo zna{GEy&S%Fm2axvBHUnW(HZ5fb4}`U?4}#{YgW})YmuSVFj04u9LRBOX%0EuV(o0= zKzywJisE4eZacIJ>32ni*|-a9t?g6-$cHpgHGbSzD)UATuO-@2o0z2;?-d_w0_y&p zpe^qRAKSY7zhm=Yc=-Dj{VeM=UCaI0lOFAukxC1Wdq!SJY%rgJ*1!Gx*nX13e~p?s zUz)Rk!>*8`&5Dh+5htz4Xkp6sqN7MSN+tt;b9Ppy=b``J-2^A?q=LH@!+uz3&koIciU2zf41v{XXKYLRN_r#rR_~ zr@jc{Xe}@Mc?sbQ!4@l9xI%Oyp!U@cnMkyc4EYq(Y8xUUl2|zTfz76Yb2wh~Bv={D z(>`4Y#S@&Bh?g;>D+XRqI>jdrXP=4EB9s`Wx9_vAYfmq%MVbf33aIK=NSq8@DKYMv z@<_+r+@{^sp`GMb6~L<$dwJPCayz?IX(q?6w_Dwg~+v+8d?GWns_Ha!+rWsQE5s8iR}3%&u`WqL-f7+jHaB;WZsSu)$-H^n8&Y zbOuwsH%~3H_go7q|4*4rdH=;^(LmCf>tVj1^LEIz#oVyme$$35Pqwy;_av2T=!k}}6IhK0KWI*P)+x-#QfGMv^?Wp*+X9fuCdhEiggst<}lu zs#WU$VYM3z;5$h1$IC^M6A6AyDb4A$TmAZB`E1b2)q8t%Huq8LhPWxTltNEP<%{UW zIC?ARk>usEjuk~(RtV$5G@o@>9m>sF#GkXrxKK_#9f^7urwko`dx5bXt!pQd{-63q z|Fo@L9NoTTWQHp5UM(pLs^77~xE-67#eg}aJ#!){v3MmDBJX)>m%?JR~+ zi;O}eelG>ye)(@!qlmT)9`T{_vbYDh%|C!Cq{ZizcCQ<=bF91G@zM!la%L9-ftFio z!OEwi4JhmWmE2}kq$DbGH?xZETNO`p+BkN!{fmlJhN_ej%*KRAua2#SG$CiW6i-#8 z?_W3@D)N}_qvT;+T)Be`V|W;(s_lpRS5||><)5w+od};C{K}VfMzLp_Qs*fsno=De zCZ?s6cfJ86dq5IAiaAsHZ19vx)E6mgFvz+f~c8=7N{? z$CQ8qk$v@}FbNLG>*D8XR0AlBF#hd8yf9dc=NKEc=KYZttQAQjOt3k+C;K5jQPPk% zIT)t39NnJU)cDDUqt}4AGzxq~s4@M${|96k0;xLK(5c70>z4&qB9&8;_Z7$fp3Ghk zK1Q`TIWrQ@k2+$14T75lTwKaZh)M#lH~ituc$T&!^cb^EB}WWlO&ug+o<^BSBF4jP zPGHi`JzlNe_373pbQ@Z=%XfSu?PtqmZ)zOZYB)hqicbM62 zTLy1Gv*{8-k*S!0dHd%dBXI!(UgrL1(TUx2nF+Z>|beDyJd-QYel#t+NMJ zeAk~0(&#})Kct28q_Fh~iZF7!+v@jGAbgPPW|2upXQ#QZPdIjLoC}JmB(H z{VPvr#c3P=)-s;(aQ~?nE~^KOzWSl1iogcYx>LpIEKe?*j_pE;vVR!@#y@F8=*j9d z&&sMqnWoROFOTzFzKo4lv@C*2|4ggSRWqV2fg9pgAlZ;~)FVK*j$A z-5pJ27Skl<=jihzJ2Pl=H2;>%X}LUuoKZ9MDI3oNCNLTHQJ|XHfFm7I;%rW;W6)@J{1{LVb#`zEa!aaK{?h z1KQ8_GU{rT863LYSosLkLcef+(jPCG-cx%dToaS@ z4-KO4zRj}Z3x#|#Y^5o-SO)%+Zvwm zB;`@GRi3E_u|Ji2N5YHkaqHVMCYaV^V%GJ;PD9d3d=BQn)XyXI&FFWDVFZ{_KVKaS zEIipWY-2{(oN(wS;j8m_ecH623w{8;MdnQ%KHJOW)3vS2RRXYg0wQPv&){`CTcb~F zImTB*!%7fh;hzt5e&QHbCOOPBaGp!9XV`zPZ3-$9VnamAEReG0KKI@R zNx(67Kg1VWU!I>i3@4X;m?)?%XZ~X3jgPicbhB^jH$+`^rHF@er~XT9~tr-}v8Sj$WeEgQp| z%pyi)VJQ16_NFbHh7!j`=C-xtDH|hz(naq4lsg*Jf&8~2(LzBTDDU*JE*fSHn5V0U z9I_io5V@_k{H>^5!?D+Ur^=B%E*y9u+Ai2%p^c9x^vjkO%fc&?k``Rrwza z86)T(iLc(uJ=XZKLB0CIJV>rSHTh||Y|Zc{-8zwFX@ZF@+eGnn4;K<~EjE^Z69^QG*5f zVqxf~+KPA}!1LTwD9FfjAyqn+Pj+G>Q~5t-SF=e9Jf1*w&;;aig$$*_nU4 z4K=r0zopLJVrR~wlelJaLuqhuED`5<8O!r$AA0$VB1|hJeS*Y8WxnqY6-Zm1;hR%^%V4(? zh+xPX-+9v;R7X?jypnc)-HpcXQs%T9NP<$`pXCUdHz@Dop z(9ZPtnF6Wn+CllHnJFnrm&zBinksjaQ%w*mnbvBe_@anU&k&k@in1L2!O48eBQW}B zy64yoohDMl&e`r0dNBuAoPsRVNpU(4;O4B-BbbR52vbl_Gu zLY5E!dZMsUQXXqpoXcNFNJ@Cj9!e=v0QjKh1$wS(J194hY(;vLAuTe{yZ*Dt5JRJC zOW~V*&}M-md}LXG!AXqGDY-+#6cQelI>fWR=H{WcPOm+ugz9sppbUU#z%KzRQ|o`nsV$)VNja;Tyl!^et>3A zTB@4#iO^qNJm#Z!<_wqD?FP*wsd_M$k3p zXl6(cLjjlm<%f|&^EAJuh%%6gq~cy{xHf**Bg@{_kBGRPy5pR$;dH`req8C`X10oH zF4J-8Je#X%90g;JHVGy}Q$%e?;)T+j#qhI7cisfiKRWJcFLhD~14_6cP^2v1l`s$| z0x3E8&ufOUF4H?+lK(Fgm;4!?ZzE9QyPE=$D!XNdipBc)`uj8Dge#|x9#W~l$tm5? zNYR)^E)_QkxWGJ}I|ad^McbwS%Kjp8KBD4FlWcE~Pq0VFDkkOCcAId`7$PVmXT{b? zc~~q3I_{7$2hR0lKWCJx@o1AOR3F*>;k%?Aw@X+&gCxUT#E!gS1wG%=+?J9ICtIrx zzkXd@_Wy*%fMXZg_9JiIyCK!5DLkfFlFBrO-$B)>j)427Ar)K(w+Z+@TT5F5qj{Zo z+!h7HJrSaFi-0HOXhdQBs-m}t)g=&z{i&T&d_|)_UJ;6xGPtA?@+F~6IcG{-)Np<`Jz=F6mP#`Cq9NgxRL;-GlSZlxf<;{PkJCyMXg>* zcCM~sM@t)i>}2)svROx@ITwkb6b#O-dmxuU+5b{G=T^TT=~IyG#6w>^{RRt(s*kgT zAq#rx4v)*~Mrh|U)h}hNr7yC#9a&LzS2l7mkoKP=!`xvN>80)MR=cB3HXtNPH*2Fw?B3ijD?2D*B>a*I==yL(D+=S<*?-R#?&2yNo-798`}QHi3v4BG8h)p#HfUo<~sdFA(K*7 z+k2%Z_{bx34<2MHVp#h=%d!$LA~GcKyrgV(#qF;54p1$8*5w|0^^X3xq%KjcC3um_ zC0p2VufE8FkV2x!xw15>V9CH;QACg8k$rM-kt8w9rTF(p%w8>fd_}$PMZn+6TP1te`2hMv!eqwLk#PUOlkio?h zMkm{7g=s2@i)O#h3dZjupJ2Rlpzm`(?+`k_)JKxP&t*j+X;=l z4!+wXqS<`czuPFnR*?wM*(NzXy-<)Kjq?u(>x4ee&B-03?*UR<=0+hfjuE21+T?ZT zY5nlGbQFopiQ?P5wvbgJC;6h*RK@&uvtc#I<&i!}Gyy#oW5$bsr~9-o2l~-m(F^vZ1EQ! z<|nK^JtLs4(*if9t&<>X*wIsF^vIXTD~RZRE6`@YW9RI+&%~`fyd@Fr;XifbJ96U+ zeD5933Pt5+1yh7Cg=DJkS#3DPuOo>NaAT@N_x-2smpWumHf}~5IKdJ+ElnVe1=0bz z(YumynGi{R^gPPdVKj(m9D|uT;>Q>1VzIm0woo}Tj6z}xiFXbzjU+6QH5>y(iV{L^ z>5c61dH1sg*Q2eSd2l{ZBJ!P1`&1~s8CfCZQ}C}6562 ziYx?P<+=}%ql;eoviQivtUGrU!%+>S{Qb91(%wm@{oA{7eK8xNo9#%6F#wG`4UOh| zZTL!ga!Shx(@rVK^2>)`OYp8Sq`4DdYlJssoyYTUtF9*ApQdk2OsF_MS5&HDQPi32 zOUN|X2M#51WNd}Z{AoKm7$Nt2?)`o2^Kq!t?$4p*4b?RxVM#()H$%&?$U0P=$b~V@ zG!RPgtaH_j?w{~paJ8DAmj1Vl@n^D1kC@{%uS8(oofJ;3rx}{?#UbM=l=dI3`2z>e zapn*^V(`nvZ;3Wz$Wj|j484a5D{Qp1;lz)^nb@_?`!-j=l;j6FgTs8e5~m7ZvHh~B zm#_I@4TnTR^9X}+VNVkJVA@<2*x3L`h>|g9!PaJ~+C@cC`RJ~fHvYDTZ5qwS+%!^& zTh3r5@l!ug-F1D;{;uB%%t7rNF<}pT~QD%vJa`aKX zyH1<_*B@ZdV$9|U*+Sp?d4#@DKwF^wPot!r#aqz6{ifjxEZxM#>P-$Q6)k+^rdkff zYxr%EYpcNqTK=eh#ugEX^lH4*yI9UAK}q@+i57Bzt#@kidpvAAUL5{$d=;Fq*U&Fdie9j4Wbn?-?d$zz-llpNVc^>VaTyA(_pLtrC6any!$}>2gsh z1L}F`rVZ`gDuUwEuGMu@TN?$uc4_qCy)`ash--)8K+EA*9t3b~+Mux;fLp#SgO6X? zezv8m+cHEzyx--_bDpvZ>SG{ej6$jZER@+ioP^Fzd%{4*YTCB#cy_bg^a)lsESJHD znu{VN+0YcsvFw>q@UCbZ`(Muh2OxyYNce5|`_G+B-|R;M1d~WFBix4;V@N+fOpep5 zpXXgY-&zXzKHo8-x9(16e*Q5&@&O5`lh{}B@S%#JIy2i02uQ#g2uutVb#yg11CxRo zXp+{vm0{Z?NgPXFIB09wB|UN*R^*lCIVOs8V^#FKPA$Z|#fd>A=es6G7lo*8>^4Zg zl)TP(buT;|f4#3FOYCX?Jm{~U2si0grcI@~ zq6?00Gk5h{-xU7~>`kt&j&4HX^t}at)(LDu{Ole5BFAFV=76`={k87Imsq z=m*llLXGTf-GLM|Yxc710|^Kwo0Mt#N;7~*un7&ce=M;zhQU;g#&u z@oP?=ffU|i%>&)A5DH0d8~@dfK2$WDqJ@Nz-{BoWa=xKWgHNu(lYaz8EUw~n@Dfa! zRyoW~@w?Z7Y{(vLF7N%{@4e`4YF-H!62pMws5fX~*&(y%=1Sc{{VQpK?{^GqPN`}b zcC^S#u9N7{mHI-J1{3n;cfggw{bNgn@2GBHVm8c|n@y0L!$b>zZMS(Ay}yAoteFqT zQRQ4l4m%YfT@o_upK;nEC6)jC!2;U9vH9q%<3608&;p4eMweK&q!&LmlyxMO`x*g1 za#VN)=xx!Ys3qxb34p0AymE5V=OJHx1$@9qXh;Ip-<*it{>2Zy)Q4&A$|9_|8>3Pt zLAIzT&f@S-&wu_Fm8V3@rf|J>*H-{ zPtU`#g2VzE)uTqZ9B(;pOP~-)K9SER^7P-45}tX6J7o9u8=}|P{Um2eLVa9td=i|n zsZ8dG6?wEv)b*1!(oH`G*0JluAEHsen^%RF&Ey~y{u(~{>?Uan-4(K568__J3|=1+ za)t+fZ!w%{Ig66(Hdtj9Af*oBEGdJ+>hf>razxHBbPPV>)rnKN>nD_%8}jRC2M>^N zxw-5Cfs?Z09K}AOT!x9CYzD>#-`G_MEw3zne&XRfby>3oJjW#-v!YwLr+abX_#Hy; zAD5G*&b(jU*KN2mUxhHs_JRONq_d_7uNSyXv&QA2Z9>!8DU9`f=7{2r`)L78n-L#Y z7d!oQRC{`z$slOgW-GV*ABvWUCY|`>xU$UU@TSNF5 z5k>iE=>TKA;(XHHb*q~JY{GPxNA4-+7PSntOqZi@xGK41uFz%BncZNr>Q|ldU~O31 z`f=%>;9nbl{i{J-m=l8s;rJ-nw|=1fs41Lv*kaxKW4Cj<8pl%=kh%S6KVZ0)L}UcF z;pp(_tftx*4U4Cq(rmYdH{#b77r~d}zIAHxeTL5eCI(-Y0#)|d0<;*AVb{|E?-W4ZEr8KyCB@(>@3U zE!TbJ3lm>?hL7v(1`xkpMqUAbaqAz?qPb+C0C{>;-GEac+8i0TR$;W094kbiKk zg*o^aaOHjwpT_emn-@WAHcWRwIm3Q?#w@{bn`(l&i-1R0%cKYRW{1~Es=U6CV$OPN zGSY&jf>?qyCpp-vqvkEV`$|BezG35QV85@!9AIw!zEoLt>cTgkdsH&m9&?8En@F7p?! zHk|m>BwYLBI~lb?EKyXN>{q6IzaOraIAVCtt>HKC94#AO1*i9=byKfs!)k(zZ5{cANj% zm}?qD--}9ix!3BhN!;XS1mxCmvalHk8vgtZqd!Ecy%?3}cb!9vtB?kkM)tpFq3HQ& z_otsTZCh;^L>NBAkJQ(tw;J32mc5S{=Ub>30`3x9qApratOiag2HoFsrWK-t{^$#n zu0}}qp+j#yba0bLNL9NG+3@inJK#j2G`F<-E#|q|Z^cp#Ekm@(=%wb}MG&R0i{Ye@3Qo4Eqrgm00Bn;_EY_miY z4xHC8G>cFe##+6N4uInfN1G{VCDmPCB+}AZ#BZdQF{C%q zogw_*P8E!!{nZPUg|;~%Bv7@FEh*X6xiwxE3n!@rB# z%8l;!?9e=V8=|x3cCpX!@=A}Vdz(712AkST-+HE53?ML3XKG&G4Y~O7FGG4I; zj>L=Otb#x!qfKa=qT;gSKxj8 z>1j3a@?p9NY||h+|F3(IsJ7`HFv*#`D=+4S5^U(BBYZMV_5UGmWA<953(TcUqOTuPP7U>Fg}wl3Fc?<3{P>sG?YQ=gxzI`6z!~D za+1{lq-ze>X_A~y-f0*zH_s$r{NpyPXBF=B$ws+R=yJiLK7oJ_9B@9qtfQyId#b*h zea?Vn#7Jn4>Agjbo$*4uHC)_VP^@+>_fSrdg;~V{$VSxW(C~=`s_lRie-Am_AlHBa z0-PG_m3xhvoEdNtdTCK|(xMKxix<%;OF8fC&P@0ZCcz+&sP2CSf1)9E>FJ06KM`dr z(NxUL=2s7@>>_b&q*?qCDmjmyB48iL?aUSV-qtPI{WdZp_z!qb_zVM>;MWVQ9dmXp z{!v3|n9WKA9WXaSTkwJuo+7pWtb5k+{ZvLwK|o1L^F9sSk+20QTo?0 zQQNu*+f-yBf@w_uC??#>KUo;AXdPSb{|!>+`vCD(fupd-qWi}_Q~#lAiNh$L{7*O5qu%uouh86)I;qSTWD=zUs4*Pn324vm zmV`RTo&@+u-xrB2v<-e&@C8zj5iKo36;${narRL9SH>!|5Qbn$(LbBlW_fIz|1(Gh zmX42;f9=US*LF$VIbrya{0b7f8KmuGPO4zCf+x9|XVm%zdO~!|%gIBfe(#j&rYn$3x z3Y?5#SaH;zKKKv_IJiAQ?AO4VkjI39ct&hM4WE1m3s1sy3I@`noE8b-knl5WD`4ww z?gmeQuD^2J&K9>@8IRF=ay#QdJ5@OL9a!p_Gb&sI`=*T-Oe)v6GG7@^S$$n7OO4c^ zS|X__z^i~M(2XYKEhO-{>(usp+?QFtjysH)rF4J3?yP3nSuL)kb<+A6a!}*Cjq#sz zuvxzA$n@($owNC5@O~?`myBLoixt)>x@AViq3&Bnr;mUBsK^?6h>VpR+T^Y=9Z=V~ zTtu~SL~zzBG=1soDS27JOX`~C1lO8i7a6l${-}v;wHunwkbc((PM%+~JDwXzWplp( zhbkp$Y>|0R=*70j<%c!YWz;{Q%YB;LeYxn(PeUU;y4!t;Iqt)AUGxA}oMqFUCAAEo zGT)L(N|LbCNNKf@YK>SJAU~@iMVUWK2K&Nc3YuJ#g{a}>s}Z_P=z(^yyt+O^PBH}% zi0C{0W!|Jlz-OnDTI5Y3hj}dBG@y$j^i5n?t2@0SXQLt}+u_@Zvv7@GU!mO5o}R&0 zbAy?Pz;U$X-VVVmJxcgfzxK?vU;>Ths6FM9Y@ozrwoDb{i5q31gcR(is@{g87ZYQvEHDDmiK3*`U}rvUN@nNPT^56~P8 zZ`>iB*VP0vB(x&7+N+xcZX1-yB|XTXDWE>4tB7{IM}iJ20;{`|imMVGvn&@2kE>A1yN!pAGd3@(;n*yEk z8)Sgimx8oTN4)5}nKCoA`N5&;(k+#n(7t<1E;A?{AcFJO+G+B(#l9a)NSha^FgHq2 zXViC|pL3fEo`ti33rOE9v+ScG6X0;Y&}IH!RtQKdDHx>Dv1;93BuPVp{9CmRyqCD> zp|wpIx1eU>pG`TvJxP{@ZyoEd>STFqxIXHkD`$fFMm(@;>y?(#-l;D8C46f0G%4Dd zIeo236m~$tT(rZp6Vvg`#>LXR!wbhMF*W^l_n#Jmn85?{Xf=(0UCsYLlkp~C=^__; z51Av{ zZA>NUl`6YrlW|YCpQv~&S2Ww!Z}xTlCHxgQdNwZ*-Y1;he^)arUXRf0XZwk{TEfs3Ka@M};qIN<=22T1* z6cc0p`<%Pi%t4i!2G^HpItOy zef_Y^_Jr<6$cWwa?=X8#-9U}8+?zgjCa({le!cP6fd7VcEVKEU-9MAQ5#jMZ##q2Y z3DGmPQ~QpGjs^(g3BIwc;@hR5Lwl->_kL!^IiI|=fs=55YXzBJ40tNfsT^N4?9c$- zfr%uB)dlfHLM#|E?tR5mrqre7HGy!9#>Ek~vHuU(y&Dk#krpOFJh9ckI`w3>G!hX6@`B&{*= z4O%pfjiXFvI;Gn8*Ek>NC(C`xgmz#4KngosC88loY3eKlC9FRJHu&6+6A~_OTU)JP z1kC=@v;`5Ejh4Rm#aPRjwefijU|Ye$pLm0h7qW!R2s?9pxQ-L(qIeA@=>*h__lV{4 z#x%UW-8yK%`gM|hcKWidc?O-*+vJE+ygbOa4?J&8Z`>!o(&6YdQRTO7kcae3?vROD zLrdOn(px6}?ua?!D=wSNLulw^aQGRdzt4V_`cCa<#+9}{FJ5l$MuCN!iGt>`_U$&f z?afJiM{y`~I*#Azk300#WmHMhupdNaKMo&N2~|JTQtOhmzE) zyqI43^g+j^WeWLY=WA{q4aGrmT1$cU)XRiCHi zs`p|lZs4!q%M@5>GDxJB;*Fg+eGYnnl-|V4^^t8GAI(ElOZ_z5hI9_ST6B4%MD4cf z-w|?^Mzh4mUPE|9XA#9g83&>pbwUxafO^_LI=ZPpE9Ulnze{DZr@D+OeBA!t>WmJZ zRDMf)y=*|8;S9IAH0~^OlH^#{yLz1u^2^3UV|v55R_z$=^lv8!`v!WJVDRrT*XBfD z30o+^8dYx#5R(u3blo-^`q&{L=kLHL`%FA^fDm52R>SZ{Nq*tx7DiY6-ikv1q*+Fx z)y0hqGz`oy20t1**a}?lQi8?<^RM?c=pcYwISi*gXUR5lG`f#!5YyP#XxsS%@xijt z1_kNAcr)h?nA?@qcyIDSvPOw-hn5~BVEUc3(7V_%pOwHsYrd=dQMdN_(aD|7XTjR0 z|Mdb;7ZpgteUnK3&$%;WmCUfX8Lp@UAh{ArL+u>jO_|TU(j;7xc2-$E30EzG9L7n=2`)7}g$CWS0!aCV}4i%PMyl#T>vVuS|p)k)gjl}@V zw>S<6%hA$^?0k@E+2bZTY1z@9Df3zl5n3y<20liMN}c*(_IfXzFg3z=SA)%j(eJl$ zeVQwAIT?q>en6w6cVhvQ@OLtaV^0Fib52#q_~ znYE-np0D_cK1C~VH%BG4H~ld1fcVp0D$g!=<}X6|U1q*FZ2^0NuTNyVHD&QXx0i(f z9GSJre08jVeiz7W1TSsRs~&3UEsoo0X8qA(+@QF!R677x)oc4J3C@oi0@f{~RTbE| za=8727}0U11nwIH;`wY~D~IWtpj6T%`02n%3^ z-}CbkugvT|bQ9j0AKl5o#j(LTmTF8sw4tDb$*qn%&1c@V!qY*!3Zo~{DV}>laeJ$S z6a$#MzfjOP<4w$!=ooTyrFUNTS4zxG%r#t~q!B^apVFn-maSIZOjcc&r7Vm)Q1!`I(%M5x2y4_t9_ z>?M33X+B>Ailq2shR(Xdic-yFbwb`4v8adH2O)K$$}bu%L+RwFnq!BHfP|guHC@)^|Uscewhp zF~G80c6y(Av8?|~1;ud)$!q20NunsRL(hEqFkkNUzHl$3C;>dp-0`lkg&trCQp^%; zZ8TYIcJH-WOhvo8Urre^QB|n)F=)z~seK&FKK5*A_#^KgJ-yweKI!dL%~w1XBvrp< z(65e{YIG&LA$(*Q3&T3YME`(_PQ!qP4yIj;i4X~`m=);3Va5+sKFT)|^*WR-;E70u zr&qASS+&xK9hXZhVqVt!Z`jP@S&j_EZ|B%-K!3fpe(6jqe0i9$%-KKH1IJwMIE4m{ z+9QVqs6j66RoR`5oCDhI{+KTRqzTu`)v*LD{?T9w-p|JjN@!l?)?*cW&~|8}_Tw~> zoaipYW~*yu(XxjtDw1ckpG`Em&c%#Xr3+E!xO>Eq>YSxo#)>EI8_v z{VoHb!p9eMcs)+qcnSUDbE?Fb5_k%^nU4TP?|v7HOPv}y67Obq&8wIl+lldz=^20d<25%Wv%u4=FUffE z0`#cgT^K=6PjA_|8hyaJ!t4fa6B&}&yxr0XSLirk{c)i?DFAdft%~X_JvqnK?EIQd z{%)BP72V7`bAd%2Ee>rAY5rqiZEiB_msj-U^|||1|8%COrC)+ zE7ER{m^Pcot8b%O2$l2qa;Si4`uQZ{H~IM;w{}9OGR8V>xud(3Fd+KFaEH%PPWs)yI*z9H5DDaVL}j$;jCdauR4ll>nL?8SJI;CeCeQj%KF=Sm(kKU3 z^SmY(^Ocm0s?l2h4fsYtT6T8ah7Awwt&KN#Vz521;iH{`xmS?5(m?@BHFAsH#ZW1e zvSm6WtP-7q*7HosH&BcsJ0mvSM7QCIJULK5^M9Cn>!>Kd?+p~@Gw9G=(jeU+ozf^0 z(p}QsT}nuUbeD8@Ge}B>F{p?y0bvl~8xg-KH z0xVzAv7hZ(L?C;+B1Bt5ZUYHF(eLrMD+6mK(}O0G?@UV4(FFz(?FH$Wj-d|n>sWFO zo4Mr8H_c<;*D)ME-dl0HNZFX%(~YvTg~H26oUA?bLrhj-9a!mq{^;=kB#A!Lt>56e zc~E~lIrW|wB5nkDklk4e=O|!a z(x*>hZCu|hcK3R&j#;p$E906T?aX6rXYd!&MQVr^ohn&{V0(0kM;-DZ8*}B+=Q&Dq zy>4T#CR_}ghQeNB%>%vO9O=1)F@u&MmLan;+_s~mVazwn6y~vNJr&%%TVK1E+_z(O zku7!V^W1)%8abWM$8+SBDo7MHgBEvd=aiC}ICZ@DZ#k1w?Z55M7PBB&;Dx^Un^5V^ z{XH9PjPwrueoz_Zi57GMaEi?ZJuX=D65?}Tq`&BFbbWK#*bca4?`^CW!+Z_BV;W@{ z4MQ&`ckWz}I3CE^{5+dzesJ%sH_hu|^uFWjO-Iw7+tvacpOrHXl9`@`Jgu`d;JbU> zLYj7SzkGx*{qbca0P?aK^!fHM(#6<0`Qy@cpCiG2JfA{(WurILIp z2As*d@;TURCx{}fJx2iB|FN6X>`;jA_y2wy0kMUU${;Kda+|&xdHHlhfgb6iy0K3q zhEk6CB!zm_Xn-oQg!4VbTfN(}H^kd5ud4KwkvdYo>E>wDncRbXj^W8T*I_(M-Z3+RWLVEJH+?Un zAD_*p$NqUfcwHoK;N zZ&uFG;xpo_65kKGE5X`Qo%C0TS&Zyg9xXnp{L%?|9%^=mnKu8n;a%1?KVmL(DV}=+ z7xG$dwRkge8(N-!_5}_b>|MbmOIa^3|9&mQU&Bv$3O%#*skC~-P=f<{0O*KiKEc&g zf}rS@rr+41?gZskeQnPRt02A2NBfugcV zuG-oSY8sJTKA9|JnKj`CWbGR*ux|Vi>vbL2CrzJxGgMeG*t@Z(7&=5`W?#N5KZZ&% zE7;w7m!`XI@a>-ykW_cowVS6JV`>1raJVu?}wJqJCi zl&m^y;OAAATaC_R4OQsttn&??mc`MMD$(hiWtX?hK4&T`IXwK(&!Q?deoBCL62Y#O zJOm3K&BsuPu^{q$6}-)0n`v9W%|Ed!cDyL95rq=b=^W4nr-tDQGmY!4eEeyN(pjP7 z0o%-~$>yY|_g8zz+C^BOO2uM+g5{dO_8~{J?LfzGJ|daQ-^cvZP>6gynv zWiF0m`RJWOBDMMdq1@b$AWUJ$6!5xh)V!^M)>W>0b(jyui<4Hs6--&Fg(WJ)S>DXh zq!QYh+Qt%vEAbA$Vt&lPhw#Ep_8~n&D@g=ygJ1vpRgO#6=wWA{33iYjr2D6RO_joU zSZj_LE(V#7t;NIYBi8_zV3-=l?&N!XONZC5BEN$&DC3X;38W(ukefp0zuzpSl|>+P zZE>qVk7q#(3xK(58SwvQ!|3!*&{6g^cq^0scaaiX?ob6s9GYinug`;rFEDkvPk zIEhL7Oo8WQPxx2EwS3aio^RZ+m62Gla^yKj7zg8JTNXBOG>er3b!PPwh_%c*{q+r% zk2;W1r7ep%;Jpz$a0HzYnD-yBukp3?&i>T5jljijJNy9bn42lr>0j-!p}X}H!82{# z!ObOo)T#|nIu1MgYteVGstTSZt^2;Sk9G+s=+ZH)fgUMI=Z#gBV6FDr~_gw`!l->5N8o>aeg~gLjsx9W8qF%| zJOTm>S_F^Vt|I4rV|uVV6>uYwFxcOBgMG0D+>eb?V+(2BfjUQt2ZTqjPoW|_zhE1+bk>o!{%0GWu&MN zlSlFQQG?=dYnmyPWl1;V!7E2vtpWN?_6#Z|qzPu3g*6kGl7mj$4I3s)r{NltKr4YM zXws}y>Vw5Z=)!-fCnO>IU7DOG)oy_&jO+Sc)ktQc+F1L^0LIt-e4O$Y(NHIA+o?~r z+a>$+XVm*FHqpg}>Iubi`KNmN-o>6@HQ2?s5ne$tJ)b~*+7(ZcSQc0w!##KjDNu29 zjU>nNHrx+6J!5<{w9QMGpXA@ix7N6H>Yx_NlB3I#zsQe*Rz7hQ{RxVUH&eL^~8sCjsf!=@0YW~J-2d|JI;km`({$h1!mVO&-6 zVtL3vSjAtF8#@TK_V;hnXYs+5-gD4>?6L-Cqkj2@0CuNT?l6odL))=}9LEM0x#1hP zjzkU<`XU}mj9R5Ih8NIGh>%sWky}-3FK*>GLTjVX_3H+aqD&W3L}|47DwVm0?!EO? z_ig7k?V74xO&57d9!RrdM1mWya^-p!*0@sq7;W_JcBTe<^f6x;Y)gLM8t~q`Rnx+6 z+zi&{H2Bu$HnS|Xz(G}zFPF@JXJl(}!2>DcO4DvJ!VJz%>-%{ePmvZ9@<%Cjq%tg% zyLIg2CXEO~wl2ZPGR~5jv!ln|0{n5~$a6whi_lIf1@;1X?ct33*$(y2Hz_K5m3H@i zOa2lP#<_*#9ks|pH(%@Piz0*WdUh}hFiu4af!?IY2>JHSpCdP^kFlH5N555LLv|j> z)wEMLr7V4&sw$F9&$d|lqdNDuyrT73P!qJjIMwXQddNcEqD?){_PwhS?+cDNzqAzy z`tPG^PDQK2OA|KcJDDEpVjCN#%kWEZnWp2NI3RcchOCiW?Mog-Zkemb6^}U-6Fb#7 z_Y{+@-zD5LmH2(}Hnv_JaUzHSOv)k|Qs7h%;Tnh(78F#59%(`_>+}jPMr_0Wj+jN&@s`N<}im znh?2B(9#ulm3{d`mGNh8uzx@2ezpmf2vZ~NuHMA?8})mC;i`~!|=HjHs^a^Q82U*H?en@k0|@L??^7HLa8cB9nGI=>3dc%#jxs&9yXfRes3h_!RWy#9|6JDnlsTN0PI@b z^1;XIgE11FmqtfR&UZQfOcjlEz1tiT650sgn{2#QY@UY?MTADJc$9K@@v+O~q|h&2 z>buQ1KBt`52d>P4n*1<&;-T&iyKp~p<97~`5=wkBM}wyrkrTrBMLbz64w=3>AKB*t z-!cpN9DN}Tz51q|ydfB21u_C+mSBl-DxxNOg`q}YK_8>iZw+^DCB zfgiZgmIck^=$+YA%ydH$l8sk=3Vdx0n0 z21gAi*E9jdoY&-f7TcpwPaYjk@#K7-<_#Z40o54BbwDQpVGVI-A254Q$>ud8@t`Gc zm438OgBdzZ6B}CgL-OJo$yKIQ$X~0&Jjh7w*;2`7Hqo!*;I9gL{!);x@6cdOx4?hC zY8fHLM;I7o*G9?it#+F{NuP4mp=JAQ7DT?<$!yJD*FeKcy4|KG_l=UFu{s+(zbv{8-e}#)^6S;cp1GiWL8SF&CW| zk!kUs9dt7nb^4|=lBdf{-B~$yVtSIcF?$5C69G9)_Xd?>kJFBF;S?wf@WyL)w#G?L zP0c4i^&2uiJoA5Q0^m%R2~d?J*69$dpLD0+bf>d3w6$E}E5%7TYNr<5tdV_C%7mC{ zs=?Hm!*p4UDy;gDr7dN;R@OBPh8&!~N!M}vuf)?}*7a^#{atR9-kRE4wj)oNO=4pw z#|ZPkt9LX4x_dJ&k?`4;r+?MlfXn;Ih(h&SFJJxlAr4@^-WQuX-+(K|d|`TRT?D9q z1sQ*yxv2~82UC*`W_wYykcm`5q6MY4k3n`B%twWj%3uyYQ(SM4_7a;k&f?IDu8AsVSTb4g_Y`M)Jk}moWOCcnY!{k=@_MfSeg5lvsTtEEu0MH|H^1@jfxk?z6hui7xqhzpx#uWuZ4x7U{K} zLf@-)W${YoLmCmZT2qq;{j86b&8gK%@V_B4#4fT{7v%qjNrFmCOC9?O6RkxQ7~A6d zqbk|^aX-}Xm$+;0g!xzeAiIm0Onh5+0Ym^YakIZxCyj98SYpSgjO|Hzc{OHr$ECbq zAqq>=PUU6t3RfsQjszP@^Qq#B`3RCuM#m*Y)ur+^|IV8AxJswK?lQIsFubJkb#b@m z$m|2cgScXd904AnY>A9N5*H&W$vtoz9n3w(b+jfTL>0XA^8-M#XsjdCK+crNt)#u@3JU)KW67hX! z8&$^=#nv<9Tqx3+9{-yx(c|QYqIPOLiaKX`1>@Gcy{Cw=5fe*&?Uk6WXr{KKw`Fxd zxDS=GA%o;zlnRHTH0`O|GO1~47%A-RVINbHfzB^T>$&6NF{nW>U^hquC`^6@BD=OJ z`Ch_9QnmLPBsHAc+`*;97;7$X-(~v?Ch}cb(X?6H$q{X{!c1l7K6q;XZW-6t=$ePs zyLh|S?5)`E95G@b-4G57i{ zjv{((o+1(NsRLWZSc%smfLzEza$?CTK#Fu7{(d5vLOwj@M>BQU7OJF)X67dpLv=JRu%HG<&hoc`YeufP!>jXa?U z{bt|Ikm%PLzH$dK59j;dbXIRlGmoIARI9PIb*u-+89q_#t)-$QNJfF0Xe80`(Pq=z zIMcZ<;VTOTwD@5$m4~5T{c{#G%-L+3DT$d%DQoxeclAZd#9H98TPuy7guVjXvsF?qIn9VJir;fLG(t+U?DIf9s}R$=8^Qc{r6zaS4nXfc%| zGa}%Rsgs;Jbf&EwS z^DADg8XAdA)r%L1qg1%V1AidP{yrR$?sx3&=0+QWHn?UmOKFgxYP{KM(VN#B2@9o{ zd}j`$vdwM2vFg{+s#-p`D1Ev&onkf) zDh7X0Rh{7C6-x7>Z%wA=u08&!=i#|`v~?cUIz#)+l-)yqzB}Rkv*9QF2f>@Iwgrsp z8(Sq~%u_BSiD|*XWOIVv9+!#WG=WcJ10`1O)6i#o@28vuF;UMK-L`%NboF{(FlPj(?&Q1P^(f1;-nChy9_G%V zQZS8J7av&mr4Ie2e@lS-C97Ess`4_i;ys|5>2SoH9o&roiMpwNMhJA2gB(kB&m~^J zJFm+RG_>LLW4A9mEJ}8}9j==nLc#V(Fimf~1czY7_dm;2k49iRydf zHjJ-p7x*&F3}3+zB}I2X`OI>qeBtdM^r#zLtZnbz9Kr>5a>Othtax)#vQ! zb_KRq2he0bfD?W?_FaUsM!uVnR0# zj~Rw90&3;(d4HzqByUbZU~tBVcWJ6&aY;kk(unm(sYXtJ|LXLX6}{9!Nn>Y|#)sYP zy0i%BB#(qwY@D=J>qc{nQ^VvrvQg8M;cAY_Hg77Srg^6iXP6!$mr^VUSyuZ>ahbt9 ze0(Hb&xgLZPvsQ-jUn2NR-{Fkw=9sT2!JV8+rC?_rCU!{4S1d=-0))+^uXh&vYD8q zRx)Y(G#f8VfmSFRuz31DQ$=lL(ET+!JvW~GC{aKZsH`J=B=bwrOW(@$1??yHSknbU zmj%1ad!h%ih;x1$DjC6F|iL&F7ypZ4Q+yTFdWKD|`?{rnc4?8Jqn1thoDMX{Z z+yQ*%9j}6@f!!ha6*l#JqiVzv>nBq)sD zY%Tx6QjRG?din=FN*B$%Qvm0Tq`Eoj7Pgy_6RK@SXu)}1F*pRHjQba95%vkI-AN9V z&Se)j^z&kSTzfef^MpCEa*5^4?4p(~nXNn}JV+i5;Tm_=VqYOYi24d=7t75E&?Ij% zl%&F3?Nm2~-P`B+Dz8ZjQp0J@`&cB`t_3Pa*X+#=Uhkt>EG@ygQNB0hR)MMEP2Q%;f~cJXw=OdKG~GDiOXydCh_y^Wmb1Et!B zK=y2H)R1s<8kXndp&Dm}CslmyDg65;&Z`SqyAm==Z({9%hX@rf^&xboxj&ffM|L-I zRW_9t&>jX;z=z0mU}ds-ID>56D1|@hRN~X&HHzL(`b9j?JZwSxhp*e9X^wXn&bK!& zOXV9t|Az2U#J47PcY4pk;@E(djNDhZeS?DdI+#?Tmi$uf{7lJ@h=$w_J9P@n^*p&~ z5`#>n1g-|qNdr;}kOS?%`~0N-uDrfDc6Caf$Tj%bFc(fs-e-^((~>xk+@zlAiaaj<>hi z@cQwpW>=vLKC)t;muays?C0~aiMOvTwv)m3=061PI9%re52}}Ld=EcHT!@R4EIDPa z_vQY~0ImAvc}t6Vas`P!wkE4u_ zpwAesN8`gE1Rl2nd_^8l?`}*EXxq6%jIK4vAJKyo0AwNHK6H*g? zXG<#E=*5IiBUv+L^23Zelv{)4*f&jeLt)l)DAQq>Av~3K8KMEtGE+-zZ?guP-0cLa z!j61MmoV6%N{g#SeQQ4-Il0B=;NqRU8x3qUMQ2o`e zgqIdy>{Bgr{l#!b#c6Q5gW@3cFyOA4J!C@kfy#W9{wU$8 zds_r+9;nT6B;@Y^2R&gq%A-VfvUl-Uzl?_hWHc$c=Q*2n9$f+d73Yl$_N9-`FeFQMUiB9VPWI7UN&&*+gvIILb4TYOS6`uIg{=ARo(EYrG0&kJr*61P zg<2YMGSYhAPwHZvaUoz%jl+k%?WBco8|wjZOyiBope~&queP}|-@#>_ym^TL>=<&=#g%gzz3J9p&pt}#o#fpiN zJzw9YG4#c(`7w|RcvI4Szs;X*t#PA$5f(6H zb~x4ARR=5zaWRY$n#YhMYqGP3^p4D(YN1-5Y+8+`&jNj--;;lb2?&-5yrYdMPOQMi zl@P4q8|25HHLZ(^5M{3Grvvq@zfHH2UeCn)vw-&vBVs5dX;w|^;m&2_c`$$l*5Ofm z%+TX@>YeW4?JY>Bcn3>4EVDNxpa z2w{V+i|_4oGv}Mz!&1y1_Us3%+mwLn{!7eNGQt+0#TIRckT$k9e?#4l#>h_&o37ja z@hnLL{8!}`y-BEhJ)I=*$tW|Cr86hpYU|RvI|A|sWd1jY1Wp8jsyLKnYo3dLp8T^o zzTLKaHSLd1>&W5%C8$5po@u_y3gJE4O2@I$AoqN`d~=LEQ?zXG=myS_EbGF)@aX

~rP-|7fIjEE5{ovUQkS18WIkYb{1=zM6}%ET`5( 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 XiSE>4+;K;l0SG)@{an^LB{Ts5)53PU literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/alarm.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/alarm.imageset/Contents.json new file mode 100755 index 0000000..e429f2c --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/alarm.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "alarm.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "alarm@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/alarm.imageset/alarm.png b/VIPER-SWIFT/Images.xcassets/alarm.imageset/alarm.png new file mode 100755 index 0000000000000000000000000000000000000000..8341c9c622d131aca439f1a7343948b97e07dafb GIT binary patch literal 1657 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 literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/calendar.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/calendar.imageset/Contents.json new file mode 100755 index 0000000..3ddcf20 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/calendar.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "calendar.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "calendar@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/calendar.imageset/calendar.png b/VIPER-SWIFT/Images.xcassets/calendar.imageset/calendar.png new file mode 100755 index 0000000000000000000000000000000000000000..c9c2d8121cbe9cf6420eb05792821601fd0473ce GIT binary patch literal 1180 zcmbVMTWAwm7@m;mO0{gDl%n8z7~OTfWG=~MG8vmTaVBGT#hFtx z?SnU1t?NFB=(6m~B8uQcRq#zg5%Z#NqKJqJ`XWAQ5!^+J-7{@dMT!p&b2;Zf|M&g( zIoa2{rL|>63qcUAg&w(tzsrMX$zuF&y!lNFHYi^~{q_K=t1cvRx?P2!V5)<#1XX?X zz&+SW5aF6puAoYByQtYFr3N~bZ#o!F5S`t=qiRDCfhrs{tPJ_~=4}!fdWPJUEHXt$ zf;FRO%!U19y=84|NK5NvcNggNMND8qqypa@wmi|#kTbj@UI${D1T!jVC_~OVRVnrX z$#x+~Qi+(xuq@ztish0#&u#>9hKq8VvE|Jr3a5ac8UBPO&^LC%o)gwhRNWa0wOVv1u@afTOIR$zpLlo0X?hXq11)#O+R zo0OF#7tbZrn1N;UiL}BflAL2CMc{w~2mTh~u z*#Uhu8`)mXc7W8+gI|lPW>|q>T~MIecxC7s2cfRGwh3l3EE)@Vz~sJ)Tw*zy<&?CL z;&QnJj(irYe^1tE>NC| z|GMpT{y}zX#rVUce(2{#Yr2T7={px-$MX%bzaPK<5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Q0vL+s zCI;q424)t9h86}E#?HnTu5Knk0Si-em>Jmgnp&7RyO}$?SQ;2Q85+78Te=yzIlDL- zIJ;SxSU8!v!1Q|N6_+IDC8xsd%>>#D)$5E`ua$FAYGO%#QAmD%4lD%(WaO9R7iZ)b zC^!e3DQNg6CTHe>1T;Yr1o5v+YEfocYKmJ?ey##Igsn2Mxd7;4HzQ+XV^gTloefP~ z3{BiDEzC_E9gTrLhv-cqC)D(Tj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53@G`5u z!N9<{$-YGJm&KY- z;TH@O6g@eqD2)({t05NgqA&h7ZORq>gTRwBF9 zLXoH(k(G_Mk)75On+shR0rTv-h0H?Ro_5@HJFZlycv~|udXxF##wW)lw;WuX8@k$i z+vJr&?ictxZ=ZV4kmJ-Dv-{!6ZFWXn(g7^l7x>pZW^`P&uPEaRTOcq^kuBfx#hb$g zoWA!f%J{^d@|MUQd#J3Td}@KpYdw>ik3Byhc^hc2Uwqj>cuQn92cPS)kOjN8{7&Ou zdq`!^VHO>h!i<_mIg3`V8|_g$!+8oNCfam(#<7(Bs-5;JQz~kziN$84=nLwiCu6Sv z)#zN=eq+BapVsu;Fn!OQx;gGIrV6Uuet5I+LNiZw_@_$Gm)Gh%D((rqUnuOiK=j<- zdDVMl9_Oe0xLjT)8VCxg|H?w1`CoS_S@QkW@9J9N@$8340>dib*uOcfk6S?HqNl5$ J%Q~loCIFNC?!^EA literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/check.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/check.imageset/Contents.json new file mode 100755 index 0000000..52258d8 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/check.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "check.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "check@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/check.imageset/check.png b/VIPER-SWIFT/Images.xcassets/check.imageset/check.png new file mode 100755 index 0000000000000000000000000000000000000000..02324120cde1c746497b69c6582b64761c108742 GIT binary patch literal 1279 zcmbVMZD<>19KST_Dr-A3Ur009_IRDxfyuojm*mdG=H=2hbBQ&LSP-O_%ai74?=HQ& zHrMK)6*nV(n2g%_QWzWR7i}Rh^uvaeEgcj;sE`kJunGAfD54Hg6omO)n^cjq4<7gO zJpbqa`~BbV_0i05@BTykF%0WXjqq9Ybz9E^`_Q}o{b|wK7|C&COf4D}L4#PVpynY+ z$-*SeLZL7}vkAi(W-m#(abrAvk`qsvLH@D1LWbPq(tzauUx}{ zREXfuGifqiPQa2hvY^4Sg-lLdm=f6nKKK*}n;asLp&p|ujNse699mmq0teeF z##98~acVq03KFUY0ps;~M3SOFAmF9^Odvo#0cet<2@>4_59Q~W07nNw>%x&Wtx)8$ z{7}ml+C}h^VU#(7s8lN6iqETRlLW=Gti?go9;D&X=M_URJ&NAnX5gVNYEs#dR0UX! zLSCIUA~^DNCj_~iPVW*cdMi;VWrQh|3Cc?nvTVh*t*skb_>UWVYU{cAG9RljdMyNK<97oncPe z!vm82Pvo%x&(jRUvWX!wF_get*uwwG8iAZ4toHafIf8GoaX+cfH-&xXd4{p0(XQ4i0oRk2W&b zi_w=I)yHi!Zm0P0qsuo_nDa~Qu`zJxjPJteMC^$3d`HdYyl~?^_a?dOuD-Oi<*u$R z{c(`mIAQlUtG3nX)kD?U#jP`a-4iQed($5MI1^p#%iSI>IZqw?U~#px&P1=eeuz&; z55LQQ8teblmFhgU{9;di@Zvk0E)O0{-Z%l)vF7Q*Th~W^eD1504owEmqg~Ar@KaZF z0Nfd#d-m+jZympVy)f|m;)j<$YOG(Li@&ii4L*6l(NV62Z@t-PtYD5l?6ns{w}0i& QU9x^jsbq# literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/check.imageset/check@2x.png b/VIPER-SWIFT/Images.xcassets/check.imageset/check@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..79fd0c5484b47f833699d8310e958b0d35f080d9 GIT binary patch literal 1636 zcmbVMeNfY87_atZ!iEgk=J1Oc(IK-=MVQ%}f@xhVkG|f}^xjc?6&(aT{SE zaBE3XCy~tIaP#d(Gh^1JqZW$f<3Sz1m!w%Vhm)M*rEyCE!2o%L&F)Zuw@$Z#fZeJ9 zO=6uuN2`c@`?69ekyV;uw3HTD=Pb-KsI4%cL&*pxwDoQ7b&03yj?Toc+Z#z6ez#uK$&#uA!< z41|kvJ1uNI)+`8t+1x$dP*9Qe23_v7vqixRG0Ng52?wLa6d?PBZ?#)d0U~3wC>05$ zh(IEPVVOWCR0(BjjffS<#L^JQldwvW9FeLK5h9a|VOT9xDlxGVmJ1LhRVZS4LRhWC z#o!JL5wdG%?M`BaPsO4tCxJ7R(@0T;p$^dJQw-(Gr)WTxB>@t3xW(=W3KjkJfZkAJmGNW}JF zaQnFV*~8=UAspabCm2lZ$xU(lwWHr(xmA9UpY^5_gzE3EjKkUJV(;eVIAQ& zd+Xn-KJ{QwFz37B-;AE|xxL1mEwdW$lui4y>o0o#Xh+qGG;{QD;9$bl_VSj65uok& ziYN?#m3unT?zFn*xFla{V~*tuzN|5G{=wXJ58HAT+_y3JW!*0^2g`4@%-vcAWQj~m z??3<2sca2-+mCkI-MjQIw-}pxQM!3Bwy^trx3O;uxvDQ}!?9JOfLpJN_Gg=?$FJTa zX&yjaZcP<;r{7epm~-H`uSeB1a$<#pH?T2nD3Co3_@?J>_1qcf=I7m;{%hdNzz2Pm z%ntu$M%MN5rS5qbZfCE>N*3+PSl2qm-P+kxw8^Y6UF#eXhY4Ll5t^Z}vt9 f8)F$1sONAwTzB=}E174G2LJn7bq3a)y1M*t;q7bS literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/circle.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/circle.imageset/Contents.json new file mode 100755 index 0000000..0f4d7fc --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/circle.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "circle.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "circle@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/circle.imageset/circle.png b/VIPER-SWIFT/Images.xcassets/circle.imageset/circle.png new file mode 100755 index 0000000000000000000000000000000000000000..93830d9bbfce64e382cd364296b8be6503749378 GIT binary patch literal 1560 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAnN?apKg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+AuIMXJm#%ltlRYSS9D@>Lr5I=vCwv0Ch7k*w|MTBqnF4mMA2p zrf25aD!t#mUr8Y|#a1cY)Yrhbz&SM|)1#^=HMq(zB)KX(*)m1R-cG@$!U||WZfZ%Q zLPc&)Ua?h$trFN=D(3-T9Ob#X~hD#969RTqa;7NqJ2r55Lx z79|7YBTX5m85nl>EdnV7y2i@CC=(bdi8(I$$)&lec_p4Mwn{)5y_C!pD+417U?`fK z7?>Lwm{}MaS{PUuI~!ZLx|sk4EKJQ|W?<86>f&Zk!2Xf%qCp8b4XNrKCV_EAH9|i^{H%}MG zkcwMtrulk=1d1HLZ?mRtLe52_(_%qio-W$hp_C!mlB~eGRUn9I>)aFr?##=JS{)5? zo3bve1uzT#IU%w&M=-*%$!Yc#yRw}cjs~i)${+nts<=~mPWm~&J=?wA@8|4%KCgea z$I_sKjfz#VUjm} zXHBk}(OY;TG4hsOYj9tR!EW(WQ$%ZBt#0t07x~TK_dRX&nzFZ(QqL__$~yT**6{bf zPk-b}rtVlS>+F^|g+-}YKJ>D7kJ((K*kZv(WAlHZr=ON30b`WoKA$RK^K_S}WD?yaD*+SAp~ JWt~$(69D0`NRR*k literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/circle.imageset/circle@2x.png b/VIPER-SWIFT/Images.xcassets/circle.imageset/circle@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..c7dd443576069926d8106c23429927a732e7647c GIT binary patch literal 2345 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̐G%Qn?{wVfYV&F}#Z~7%S5je^qDuZ&7 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 DEgExM literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/line.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/line.imageset/Contents.json new file mode 100755 index 0000000..91cfff1 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/line.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "line.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "line@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/line.imageset/line.png b/VIPER-SWIFT/Images.xcassets/line.imageset/line.png new file mode 100755 index 0000000000000000000000000000000000000000..e74c393dad0ee78d7c591af8f11a2c06bb6fc440 GIT binary patch literal 3598 zcmZuz2{@GP8Xip9m&%?p$&xT5OCrWH)=~&HBa9jQGDbs&7+aPwnrsb9vP8&I6w%n1 zL?+oQB*wlZvW>~%|NGDR&wtK$UGMk3-~HbA^E~(SzTb6yvF4YJxH&{Q0002DiLw5b zz32D6ae(dM-aUu|bq)aF&~=Bw%uQf0kU0+P;_l@P02p&;-p5;64hzOmDQc7thb2H# zYofQ3ji%*O~TBXqa&sL^$!^GACkT5WYxfA6eHniz|VO*0zJt7gU`IJ(L&#V zHbV4dUoKHy9nE00BgTfOs|JT%mkEP40P~#)V3Qx5DNH3B&c8I@XnXibXUhh&Fdq{S zoT*{l#RX`zsn6WEL(xi4e`?%TvAzTjbE^F;UvDn$JFpv?D4_Ths7 z@muO{j{pJru9I=VSQB*qp}{nF+RR&*?Uf44E%X_=l;%t0cLGeQYn5Dg6@|jeu=fp^ zq!5^Nx5UK~vBgEiz?9oo{qWfF5KD&E+go(&73l@)BVFPn#F*E@GYCZxur6uy;8;an zsx_bzb5Msi{>*F{1o&|PP&xW=^?09DMD+2qjK3aVv zy>p3v^?bgNcKAsX0cB?cT7E(PMg6WWE*>(~iLt@AJJF!-{=TDG{$W;w&`Q*dwZ%*d zdt|IzZIos>{2theBQmsqJXH9s468^;rYFDKO(cL2rEXqr!ul4g1%RDok@VKS#Y~vL z&Uc36ZQUEUlEgA!lG3eT)7#>lwsGF$rn(ZAQ|nwLC!AD{yh!d?q*o*J;d`upk2zGr z!HUfC4%}j4%04WkAV6f8F(1o)7O*k1yAJS$E_7(`2%Z^Y^1toj1LzCC^#OP};;hd> zTi~?@ZXZsrFe4p~=*EkROrzoMY!To21afqX?g{4crt1yx9kpQ#gz1`}<7a7w#opsf z(%JeT{Z#n$?V@a$xz^fAKhYXCyW883SwDbO4l$rNjG8*X z>IVosWEE=oJbs~C5Xw{4Bs6~XJ3u}P*_6zt^OlXJ#}LkTbVXn99$b>?&hS+gg-U&lZfUEY_UblKEFGp`^H2}`f@VANwlQU6-n9j%5Wp^pQg4#Nld2Az73$2Ef0TN1LR7E!N#Muo%1f0RpPWA_ z9y3zQqxUAywyufKP}bO;rJS$RPSM0@qO^*4R}MBQI&3Om5qUyPCe{*3t145ksT0)C zXUp8}ci+gSZk_f%9h@qW>XOQoN-8q7#`g2~XBJ_K%=#2Pq&-j`!yfd0aB%{)fQo-a z%|xo~PVU6amDj}Hs^0ea**vE;mn@ngS|=(ZYAs4uX;T%+@XqMSpk+*}v{$;>aJ~fE z&}^n(+AF4}FLhbDNL9qEXP1;N7AW*U^G1rbN*te7z+H1MS9Bk-O9Ee4)2*_tvc&6| zU4+0P$TExNY^X(6NmgFHQT_GMcMTsvpB&Salx!kB;kBH?_7UHOP$?d4kPI?uWUU7CJ|RVyYShQhNkbPXntnAx_gB< z!739Z^SsxjU@Q~SE!)lAoy*B3^j)Y=K^WI_W4u}nmk4$O6OjQv*?rcZQzvZZx4SM4 zCQSRcU|L3ow1yegbUEIOyopBf?I{Jx)1p*P`#a>aYl+v&s**O)%O1-GPz`7-Gy!^~ z&cCjh0NF$_m>K@tBddeor?&^`X25g6XY4Z^c|b$pRaPjc68qr;H-XKKOpUb>;*gI> zN!va_X1yJlf0QP>DwmzWwy!W)UgeqeLSVIZKu7={sDL)mhqcriliq%OYZRX#cu^2< z*kROa&~J3fAjp7haFGm`M^sE25^ac}d@VuoqXI#a{H?Z#VWxQz6Z?bPf3$PXi7n*T&G3rrYGE6ISdtop%y} zi4yEKIqVk}IoR*i-o4J+gAMvR6+E6<022 zr>rGIfi$b+D#B{sx%V$wAIZ__Ni;p>i*Tt;yZg)Zr!i6Tfz)jTXNAX$QCB19talb& zho;shGbX(|k9Dke&_h&RRPi@m>->L3?=-3|dGeG*4V2n`etj8l*H|V*0bz`X zzjqpTCO97*^Nt(svv_P#UgzLeu{_nL_gc?loTAWuoyV)yOTcS!#HFId<1<;pzUL>p z^IP0EGpR30^J56YwXKn^^~goall3Qb{8xWA{Fjm0npJo@8eu>Dq4cX=39ai#&X20v zYYTN(QP*!c@Vb+nNR>)YUr;WTc^LH<%;n96i;^;?D04woidn z4}2MjeU*3CJ;*d@Y&NVn^H}#W1?>mB!E40z^o)vkt{16^-2x9EsAu6re(1GDt;EL) z#b{jfgVt0|e#|T_FCFa+Czsi;yv7xNrqFk+$;Gav>UQS|nFPvWG$Uc)c0%B)WX1{hYWOTiTK)bt}d6Xso;Pw)@E@;>Oi`Fb*l+nXl$ZN0N zb?Y3%jp4X3kt4%lcKT6~b_t_@bI_%bvbOMe(1BWU$CVUa4TJ2aZk3reAD|XesKhPe$gSsVt=~I|df8vEHd1?vvqJE6iYvOK<-2Fke7g39(WiCl+XL&E zX{VXVUcCEqenH%5ah>*hI3t_xxYnLHyI{6ymYS8IjSptu`4J$EahV$1h+L&BX&^%O z{wdjgj1j&70OyhY!34;7C=38FE4o|3{ot2OH5{=RFvG?fM$Tk-W22P zhXMs)yu5ui0<6B_)MDhJtUPw;w7%!Q1!bpF#eL zqwnnNh;#SxbH{pv_T!?^*qeS@5)%7~{(b$f6XWymMBcu?UG4dU1fYB%XTXY(|0nWu zcll3w|E1br`BV0Xt3Q)z?zKh(hI2;wVR2SitQS<*5sUK%`8(r$_bXHZD}&EyLjFnm zPqCW&Q8i##j1SJ)cV7Zk)r9;H_D??IinA})>*jtFplV9L1%C(sDS-b!!Qa8(0!_$% zPyg2AKR56XbZ-Zt9D82=It@?`iE0=e0ANxx(bu(tvoEG}Vwx5C^f3&;v5#T%KC(qu zGV>DF_+}rIDEvQ&K8J5T5n~nxLE^`|yOLnW1(x>e;SU=+rG2I*31e!VFKipK?>leJ z>_!*3$8EdC=iFHrpswyzmIVis<}{&o8r0svos_bI-a2$JWi=Di$Zbtn$jpU)$<-i{ z%DPwmj*BCIA_i4!$m;@f+O+xE$}(YOW`Slab+e5zQ?o>A3KnaxdW9)t`h0tAi1(+9 zoRu;cEj*zLMZ-QA3qazowTsav$Qk61fx*Eyk89Aw4b+DiYH!G-T?@N7QWhQ>Fo_li zE(?tm6cw@MI@Zm;QcxuH_n58h7F~SbNWwcn>9QmCQ0V4T|6YXon!C7ZLK;i-n96(J tUy58=YrgNF;y4W0YK!?XX9nHXHwFV%C1_!nDQm39CC literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/line.imageset/line@2x.png b/VIPER-SWIFT/Images.xcassets/line.imageset/line@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..4cae37b3a10de241c243851177d86c0826266fc6 GIT binary patch literal 4029 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 literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/month.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/month.imageset/Contents.json new file mode 100755 index 0000000..ff84a3a --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/month.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "month.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "month@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/month.imageset/month.png b/VIPER-SWIFT/Images.xcassets/month.imageset/month.png new file mode 100755 index 0000000000000000000000000000000000000000..4c19c7e4e44be1c5b14e47c37f8a7a643bd5959b GIT binary patch literal 1072 zcmbVLO=#0l9M6~x9qu&H`7wBAhzd5JO`3$o(It&5*g3j_J&9@Zy2dqmF?qAu*hx?n z1rLe`Z{k39*v_JY2S31*7Z2h|kMp8Okx6~&+9@)2FeESU{onuh`+wh>nLax-czBSa zsG;JNStkEO>9==)tgkn&JLv%zs(2RFam$V%m3L7Mf}(HF!7{Yn#VhaNI7Rh0yh;^U zOXoBP`HY?FFo_=$G)0Y1B%$rhLkwzg&I@$<+w+$+@LZj~AeFdMXuyUywG_eGrRj>Z zH1DV`J#hw%CmJE}A+|x{H-lJ9bh^WHqGox%Am;O? zl;>4W5GKVe;pt(EL5%Idfjzq(vD?K;yJ9sXf;L7`1)*lI17;csqqu=WV9d(kWXX2C zAQhZS3$zul2_x?+bgc;app#+E+ra}){U`FgY?^{3sj6XdhGo!QtouJ%V~I0t+8%$k zOHV|4Fx_r9KRIlV4-Cl6L}WNV9I$I-ur3zOd?oo*+ibTd`q%n~`$wtUtE(Gr`^)gp zJqPdCS00VFH@*%(U27~`gKxsO`^Fx8er)c4b>ic)u{v_&_#I{0S|9m!?|b9*U2Bsp kD>t8b`g^7M(4_hXsH2yU{djTYStXs}Vqw}`pS*PKH!|8&xc~qF literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/month.imageset/month@2x.png b/VIPER-SWIFT/Images.xcassets/month.imageset/month@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..b98c425bd843a55d107cee9424899044700eca95 GIT binary patch literal 1118 zcmbVLO=#0l9M4o_j1A@lK@a*!nRZ~Ck2Yx&SGO){U16QGD_DjM)8wsqHkp z5Iw0;IfHlBdpi%~@5!NCkMVXKC30xenn4xCfka%h@(`p9r2sQf(Q0$A;2=R9Eb7@D z%B9Cd)iQ#LrxUCiHbxV~;84|8)DlD>4-2{(Bfq?ONdjGqk(aqNowg-d)JN+MoUD&$ z)p|)4G;-)X7_5qzz<@{rRb$q4#cGUf@QV2Ci765^R8T2KHl50)CxB!*5OBdzK&2T5 z@O+R7b3D(S1uV_56pa@jV8SBDi);k69uiw~v>7oYCtJ4gEk+g*vPFujR4TzrC}=qa ziV+0C<6zkU)(E&Y6Diez>H69XGIUi(w~=m{z++VMRvE=e>}fLu!%nAniA}eaD4a5? zs@N10q$$Jj;%aESCZMcN#DVdI>@C8D&%Mg@*x z5}|lp=HiS%v+PJHjCtDFl<6YHRAJk$j_tOvBl}`S$$<*8oUCQdwmV>=Xd%ljS~id- zdEiegs&0CM0k1&KcxCA5^H57VmH`?W7WF+mpyU5U9_MA5|E~e=>x+HSH{+U_%NL? z`n?Tb;Y{zTM|fX*H@ES;CceJ*eY(8Vx%Bq#gXZd8q|a@J8tW*z`C+9`{5G+Z=s2*t al3wT_<~|M+^BTY9O?)abF0YSVz404$^JQoN literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/notes.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/notes.imageset/Contents.json new file mode 100755 index 0000000..312f2a4 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/notes.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "notes.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "notes@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/notes.imageset/notes.png b/VIPER-SWIFT/Images.xcassets/notes.imageset/notes.png new file mode 100755 index 0000000000000000000000000000000000000000..2f95c726cd893585586b3141355719bdd23bf943 GIT binary patch literal 1082 zcmbVL%}>){7_VZ`5sC3)(9>%%f{E+b)~;=+u(g{kVMxY|yGhr+&;spS+80-d2PE;J zF){oJCdR}ILA~igG+o%CS*)wNg6`JZMmRA%d z;Shv0u}DWtJ~rdDAN6+_3>aCV8(5``@0IvfXK3xZrKl=Pe+D_Nc|X7YJM z%<~E-2!%|R@N}?cKf-_-$jQL$RtJLKCB~hR}Rx0wx@UQRJWi=#vr{teBST zCyGl+gZA<@VCde0b}2+2XjNEs4~T$M{>eNq8HON=ilUb|y`>YHaP#QM{l3)3x9y)h zp9gPW>{h9l^|!12&eY1&>G(YbTFq8qXd)-fmo2)ixG{+0?so-_1`p7!aRN t%x*ec51*`m{36c2AN??}`_xU1tQ?_EkDV%Q@H>D literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/notes.imageset/notes@2x.png b/VIPER-SWIFT/Images.xcassets/notes.imageset/notes@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..dcd4789f8832fd3f20eed61af915bef9fe6f06e3 GIT binary patch literal 1121 zcmbVLTSyd97@ms6BrnmE-5ACm?6NzT-5GZWH{G4t)kW8qb)zlN9A}R1w9dtuqkAEw z+d~Br5ebFRbAeqTF$nV|ilC^32z{ttiXH+VBZBPAUMxa<=rA+qoPYlB`|lUyJsq_* zJ8CcttBrPw3A8iLTU~{|d)h8MKwBdWr(mx!1hbL_u%KcL0z9fo!yo}9B|rKCv|`w% zw3CxsZ|l3ek25Z_V+DKm$<1bJ~b*^SJ;~ZWAx9B;!ymR( zR1|4MG~_W2=rAe<2=vFTs0vRpK9t24FV(_OoR6k`l+Po0eBp=}34Clzg<~yj&>Qjy zg4fIV{47m}J;9*J25CRVFd>f@@l>!;-G-7bgNj`h*)3x|>tcDq0unT=q+yIyIv}1l zpkb#C6Bl|pyg4Sxs_qE(IRz@kD*{U$2TH^;G`yH$UR}cjD)>+2K~5AImi7CE2qi=W zqKsAkCu<~fhIHEFuXd@3P!BrC)#gW+)$sv3ni&fX$CvhZi)gT}M8#k-xAg6OSKWEM zVRQS^%j=I;Hu#dSPjb&b4ac`n&ps8K`GK7`jumdtOkVym*ZgbOiSEqw&r|#Bw^Ubm zw%yu2`?hs-;bz^d?{_Xu^_`i?FElnjyw>r&Z@x4d*@;E_&GAsU>d4-yZ4JdWH`(8H p@ALh0r%UVW1i7*tzuNy~<5ui|P(S{0>BB*1=%e8t@os3~>~FxiXQu!F literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Images.xcassets/paper.imageset/Contents.json b/VIPER-SWIFT/Images.xcassets/paper.imageset/Contents.json new file mode 100755 index 0000000..57ddab2 --- /dev/null +++ b/VIPER-SWIFT/Images.xcassets/paper.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "paper.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "paper@2x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/VIPER-SWIFT/Images.xcassets/paper.imageset/paper.png b/VIPER-SWIFT/Images.xcassets/paper.imageset/paper.png new file mode 100755 index 0000000000000000000000000000000000000000..257ca70488ac56b0d1dd0bfcf4ecd06a35670097 GIT binary patch literal 1188 zcmbVMO=uKX9G_%$HDWYU>qnvToHVTxcfNLKGBae8-OTLjVs?$2Ee#fAXJ=lrLoy$k zd2u(vKoU?_N)Ht;6)){YDQ)l~1S$k=4vNqg5fKkXbL&AQw-f^QO|lzH2_78g2zJHz;jp~v?_V$48s*DLNh%`{O#%y1%#>sVF8LtB|O@eh5G#V#2 zoEpjw0LAej;HhXtXIK^p0>#F7L10e+j$t{P!M6}$V=^zuTo(y9^LZ*MTD(APcFMW$nefKe+s6DUq% zPd7ra+-!D}*!Js*!YQMxnoF}3Lt9o5*SfZk^6;G-TWb4-Nf*+2=sOdhj_Wbp-T>p= zz28uvh`o`|cqT52Hl{lIgavJsQR5^&p$yZI8BWAm?20j693zM7nKiHfOo3=2fQ ztHH4qwvQ9jeQ71iiBgPZQ_*Bn<&&($a9m$BhIty;jO`=M)?vf0iS5?0+g=B4(`#o>KMap0?(MJrGJd@H z!=KF*IN!STbK>Icfu2`8mR~2==J=In^Jo?G3FQ z1-a(s#p~+5&bBu@N=H6pzr4M@b7rCKYbo_p$DNnYcYj-qgPxsBAI&a&cP?{i|L&H= zTDVprR?dU@=H-^BzkdO~`EhoYZ@U#*Y4-9h>_6MCdvhlr&!0UVzSVJJNf5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Q0vL+s zCI;q424)t9h86}E#?HnTu5Knk0Si-em>JmgI+{2cT3Wa`8Ch7G8XCG9J36|UIvQFU z7#TSkn*hy$>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+&d4uN za1J(8(C|%6&ddV|Xo4aL;$N54qRg_?6t|-MTm^6lTV-N#fq^5M&mGNNT#QUjEiIkh z44mDZm7sc4$O$!lpkwqw$pb05z=VKl5X6Khejo>)eNyv)d8P=MIouCk*~-AcxYg6e zF{I+wn;Z5TErl}2KRy>oo!}agv&%JU2hWKI{y|ebJkvLH7|lotG?U~}Yd+XwB(&&{ zv`+ughPOTvC0vOD{omLB_B&NNefROt*7xK0R<%99{v2bmY71v^ui25DXyr61S?><+nSO@1#j2J0QgU}>99)~b zJFMMDeY3ahLeaw8+wRxpEQ(kcTe0n}jO0Npu8m!GdsrVjtnpd=US-x} zztgzZCNRlM9Ip}RJ{Df`SS0m^`_? z@od+#gTe~DWM4f DZhrp6 literal 0 HcmV?d00001 diff --git a/VIPER-SWIFT/Info.plist b/VIPER-SWIFT/Info.plist new file mode 100755 index 0000000..a37913d --- /dev/null +++ b/VIPER-SWIFT/Info.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.mutualmobile.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarStyle + UIStatusBarStyleLightContent + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/VIPER-SWIFTTests/CalendarTests.swift b/VIPER-SWIFTTests/CalendarTests.swift new file mode 100755 index 0000000..c5295d8 --- /dev/null +++ b/VIPER-SWIFTTests/CalendarTests.swift @@ -0,0 +1,70 @@ +// +// CalendarTests.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/6/14. +// Copyright (c) 2014 Conrad Stoll. All rights reserved. +// + +import XCTest + +class CalendarTests: XCTestCase { + var calendar = NSCalendar() + + override func setUp() { + super.setUp() + + calendar = NSCalendar.gregorianCalendar() + } + + func testEarlyYearMonthDayIsBeforeLaterYearMonthDay() { + let earlyDate = calendar.dateWithYear(2004, month: 2, day: 29) + let laterDate = calendar.dateWithYear(2004, month: 3, day: 1) + let comparison = calendar.isDate(earlyDate, beforeYearMonthDay: laterDate) + XCTAssert(comparison, "\(earlyDate) should be before \(laterDate)") + } + + func testYearMonthDayIsNotBeforeSameYearMonthDay() { + let earlyDate = calendar.dateWithYear(2005, month: 6, day: 1) + let laterDate = calendar.dateWithYear(2005, month: 6, day: 1) + let comparison = calendar.isDate(earlyDate, beforeYearMonthDay: laterDate) + XCTAssertFalse(comparison, "\(earlyDate) should not be before \(laterDate)") + } + + func testLaterYearMonthDayIsNotBeforeEarlyYearMonthDay() { + let earlyDate = calendar.dateWithYear(2006, month: 4, day: 15) + let laterDate = calendar.dateWithYear(2006, month: 4, day: 16) + let comparison = calendar.isDate(laterDate, beforeYearMonthDay: earlyDate) + XCTAssertFalse(comparison, "\(earlyDate) should not be before \(laterDate)") + } + + func testEqualYearMonthDaysCompareAsEqual() { + let earlyDate = calendar.dateWithYear(2005, month: 6, day: 1) + let laterDate = calendar.dateWithYear(2005, month: 6, day: 1) + let comparison = calendar.isDate(earlyDate, equalToYearMonthDay: laterDate) + XCTAssert(comparison, "\(earlyDate) should equal \(laterDate)") + } + + func testDifferentYearMonthDaysCompareAsNotEqual() { + let earlyDate = calendar.dateWithYear(2005, month: 6, day: 1) + let laterDate = calendar.dateWithYear(2005, month: 6, day: 2) + let comparison = calendar.isDate(earlyDate, equalToYearMonthDay: laterDate) + XCTAssertFalse(comparison, "\(earlyDate) should not equal \(laterDate)") + } + + func testEndOfNextWeekDuringSameYear() { + let date = calendar.dateWithYear(2005, month: 8, day: 2) + let expectedNextWeek = calendar.dateWithYear(2005, month: 8, day: 13) + let nextWeek = calendar.dateForEndOfFollowingWeekWithDate(date) + let comparison = calendar.isDate(nextWeek, equalToYearMonthDay: expectedNextWeek) + XCTAssert(comparison, "Next week should end on \(expectedNextWeek) (not \(nextWeek))") + } + + func testEndOfNextWeekDuringFollowingYear() { + let date = calendar.dateWithYear(2005, month: 12, day: 27) + let expectedNextWeek = calendar.dateWithYear(2006, month: 1, day: 7) + let nextWeek = calendar.dateForEndOfFollowingWeekWithDate(date) + let comparison = calendar.isDate(nextWeek, equalToYearMonthDay: expectedNextWeek) + XCTAssert(comparison, "Next week should end on \(expectedNextWeek) (not \(nextWeek))") + } +} diff --git a/VIPER-SWIFTTests/DataTests.swift b/VIPER-SWIFTTests/DataTests.swift new file mode 100755 index 0000000..1bfb7d7 --- /dev/null +++ b/VIPER-SWIFTTests/DataTests.swift @@ -0,0 +1,31 @@ +// +// DataStoreTests.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/6/14. +// Copyright (c) 2014 Conrad Stoll. All rights reserved. +// + +import XCTest + +class DataTests: XCTestCase { + var dataStore = CoreDataStore() + var dataManager = ListDataManager() + + override func setUp() { + super.setUp() + + dataManager.coreDataStore = dataStore + } + + func testPerformance() { + self.measureBlock() { + let startDate = NSDate() + let endDate = NSDate(timeIntervalSinceReferenceDate: 0) + self.dataManager.todoItemsBetweenStartDate(startDate, endDate: endDate, completion: { entries in + + }) + } + } + +} diff --git a/VIPER-SWIFTTests/Info.plist b/VIPER-SWIFTTests/Info.plist new file mode 100755 index 0000000..99d9e6e --- /dev/null +++ b/VIPER-SWIFTTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.mutualmobile.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/VIPER-SWIFTTests/RelativeDateTests.swift b/VIPER-SWIFTTests/RelativeDateTests.swift new file mode 100755 index 0000000..48a20f9 --- /dev/null +++ b/VIPER-SWIFTTests/RelativeDateTests.swift @@ -0,0 +1,75 @@ +// +// RelativeDateTests.swift +// VIPER-SWIFT +// +// Created by Conrad Stoll on 6/6/14. +// Copyright (c) 2014 Conrad Stoll. All rights reserved. +// + +import XCTest + +class RelativeDateTests: XCTestCase { + var calendar = NSCalendar() + + override func setUp() { + super.setUp() + + calendar = NSCalendar.gregorianCalendar() + } + + func testDateBeforeTodayIsOutOfBounds() { + let date = calendar.dateWithYear(2000, month: 1, day: 1) + let today = calendar.dateWithYear(2000, month: 1, day: 2) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.OutOfRange, "\(date) should be out of range.") + } + + func testTodayRelatesAsToday() { + let date = calendar.dateWithYear(2000, month: 1, day: 1) + let today = calendar.dateWithYear(2000, month: 1, day: 1) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.Today, "\(date) should be today.") + } + + func testTomorrowDuringTheSameWeekAsTodayRelatesAsTomorrow() { + let date = calendar.dateWithYear(2004, month: 1, day: 3) + let today = calendar.dateWithYear(2004, month: 1, day: 2) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.Tomorrow, "\(date) should be tomorrow.") + } + + func testTomorrowDuringNextWeekRelatesAsNextWeek() { + let date = calendar.dateWithYear(2004, month: 10, day: 10) + let today = calendar.dateWithYear(2004, month: 10, day: 9) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.NextWeek, "\(date) should be next week.") + } + + func testDateAfterTomorrowButDuringTheSameWeekAsTodayRelatesAsLaterThisWeek() { + let date = calendar.dateWithYear(2004, month: 3, day: 6) + let today = calendar.dateWithYear(2004, month: 3, day: 2) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.LaterThisWeek, "\(date) should be later this week.") + } + + func testDateDuringWeekAfterTodayRelatesAsNextWeek() { + let date = calendar.dateWithYear(2004, month: 7, day: 11) + let today = calendar.dateWithYear(2004, month: 7, day: 6) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.NextWeek, "\(date) should be next week.") + } + + func testDateDuringWeekAfterTodayThatFallsInNextYearRelatesAsNextWeek() { + let date = calendar.dateWithYear(2006, month: 1, day: 2) + let today = calendar.dateWithYear(2005, month: 12, day: 29) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.NextWeek, "\(date) should be next week.") + } + + func testDateBeyondNextWeekRelatesAsOutOfRange() { + let date = calendar.dateWithYear(2005, month: 9, day: 25) + let today = calendar.dateWithYear(2005, month: 9, day: 14) + let relation = calendar.nearTermRelationForDate(date, relativeToToday: today) + XCTAssertEqual(relation, NearTermDateRelation.OutOfRange, "\(date) should be next week.") + } +}