From 5b424e0bef5a21864ec5858cc3e149c9083d608d Mon Sep 17 00:00:00 2001 From: Raimund Wege Date: Mon, 27 Jun 2016 08:31:12 +0200 Subject: [PATCH] Refactoring view controller --- .../SAPTracker.xcodeproj/project.pbxproj | 130 +- .../src/xcode/SAPTracker/AppDelegate.swift | 77 +- .../SAPTracker/Base.lproj/Main.storyboard | 1604 +++++++++-------- .../CachedFixesTrackingTableViewCell.swift | 50 + .../SAPTracker/CourseViewController.swift | 31 +- .../src/xcode/SAPTracker/Extensions.swift | 50 +- .../GPSAccuracyTrackingTableViewCell.swift | 66 + .../xcode/SAPTracker/GPSAccuracyView.swift | 93 +- .../src/xcode/SAPTracker/GradientView.swift | 24 + .../xcode/SAPTracker/HomeViewController.swift | 21 +- .../src/xcode/SAPTracker/Info.plist | 2 +- .../xcode/SAPTracker/LaunchScreen.storyboard | 4 +- .../ModeTrackingTableViewCell.swift | 60 + .../SAPTracker/RegattaViewController.swift | 149 +- .../SAPTracker/SpeedViewController.swift | 24 +- .../StatusTrackingTableViewCell.swift | 62 + .../SAPTracker/TimerViewController.swift | 35 +- .../SAPTracker/TrackingViewController.swift | 118 +- 18 files changed, 1564 insertions(+), 1036 deletions(-) create mode 100644 ios/SAPTracker/src/xcode/SAPTracker/CachedFixesTrackingTableViewCell.swift create mode 100644 ios/SAPTracker/src/xcode/SAPTracker/GPSAccuracyTrackingTableViewCell.swift create mode 100644 ios/SAPTracker/src/xcode/SAPTracker/GradientView.swift create mode 100644 ios/SAPTracker/src/xcode/SAPTracker/ModeTrackingTableViewCell.swift create mode 100644 ios/SAPTracker/src/xcode/SAPTracker/StatusTrackingTableViewCell.swift diff --git a/ios/SAPTracker/src/xcode/SAPTracker.xcodeproj/project.pbxproj b/ios/SAPTracker/src/xcode/SAPTracker.xcodeproj/project.pbxproj index b21ca40b040..c3764261d3d 100644 --- a/ios/SAPTracker/src/xcode/SAPTracker.xcodeproj/project.pbxproj +++ b/ios/SAPTracker/src/xcode/SAPTracker.xcodeproj/project.pbxproj @@ -321,8 +321,12 @@ C852BAA21CF5E1EA0093B0C5 /* CheckInRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C852BAA11CF5E1EA0093B0C5 /* CheckInRequestManager.swift */; }; C852BAAB1CF736680093B0C5 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = C852BAAA1CF736680093B0C5 /* Preferences.swift */; }; C852BAAD1CF757950093B0C5 /* CheckInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C852BAAC1CF757950093B0C5 /* CheckInViewController.swift */; }; - C8603D4A1C528832002B2F28 /* Acknowledgements.markdown in Sources */ = {isa = PBXBuildFile; fileRef = C8603D491C528832002B2F28 /* Acknowledgements.markdown */; }; C8603D511C52892A002B2F28 /* Acknowledgements.markdown in Resources */ = {isa = PBXBuildFile; fileRef = C8603D491C528832002B2F28 /* Acknowledgements.markdown */; }; + C89C5FC51D06A289002AAAD2 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FC41D06A289002AAAD2 /* GradientView.swift */; }; + C89C5FCA1D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */; }; + C89C5FCC1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */; }; + C89C5FCE1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */; }; + C89C5FD01D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */; }; C8A4400B1C18153600DF70A0 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C8A4400A1C18153600DF70A0 /* Settings.bundle */; }; C8BBAC791C52649E004CA551 /* LicenseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8BBAC781C52649E004CA551 /* LicenseViewController.swift */; }; EEB2FC8E79793611ABC022B9 /* libPods-SAPTrackerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE153BDE8C83E9A084A24F1 /* libPods-SAPTrackerTests.a */; }; @@ -707,6 +711,11 @@ C852BAAA1CF736680093B0C5 /* Preferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; C852BAAC1CF757950093B0C5 /* CheckInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInViewController.swift; sourceTree = ""; }; C8603D491C528832002B2F28 /* Acknowledgements.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Acknowledgements.markdown; sourceTree = ""; }; + C89C5FC41D06A289002AAAD2 /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; + C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusTrackingTableViewCell.swift; sourceTree = ""; }; + C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GPSAccuracyTrackingTableViewCell.swift; sourceTree = ""; }; + C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedFixesTrackingTableViewCell.swift; sourceTree = ""; }; + C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModeTrackingTableViewCell.swift; sourceTree = ""; }; C8A4400A1C18153600DF70A0 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; C8B31F771B68DAD400C8A809 /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = ""; }; C8BBAC781C52649E004CA551 /* LicenseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenseViewController.swift; sourceTree = ""; }; @@ -765,21 +774,12 @@ 7F06590119F7FE920077FF95 /* ViewController */ = { isa = PBXGroup; children = ( - 7F83F15719F154F000C53328 /* HomeViewController.swift */, - 7F0658FC19F7D6700077FF95 /* ScanViewController.swift */, + C8BBAC781C52649E004CA551 /* LicenseViewController.swift */, 7F8CC2071A10D47A00C56D7F /* SettingsViewController.swift */, 7FAFA7941A126B5700D230F1 /* AboutViewController.swift */, - 7F99DE3B1A126554009B3619 /* RegattaViewController.swift */, - 7F950A901A35E967003C8C5C /* LeaderBoardViewController.swift */, - 7F1875B21A10F1B800C25BE0 /* TrackingViewController.swift */, - 7F193A901A39E54600D71773 /* GPSAccuracyView.swift */, - 7F8B8D3E1A37356C00C34B88 /* TrackingPageViewController.swift */, - 7F193A8E1A39ACF500D71773 /* TimerViewController.swift */, - 7F8B8D401A373B0200C34B88 /* SpeedViewController.swift */, - 7F8B8D421A373D4400C34B88 /* CourseViewController.swift */, - 7F72C73F1A2DEA2100F48EE8 /* Resources */, - 7F72C7401A2DEA3300F48EE8 /* Helpers */, - C8BBAC781C52649E004CA551 /* LicenseViewController.swift */, + 7F83F15719F154F000C53328 /* HomeViewController.swift */, + 7F0658FC19F7D6700077FF95 /* ScanViewController.swift */, + C89C60101D0FF036002AAAD2 /* Regatta */, ); name = ViewController; sourceTree = ""; @@ -1069,22 +1069,6 @@ path = flags; sourceTree = ""; }; - 7F72C73F1A2DEA2100F48EE8 /* Resources */ = { - isa = PBXGroup; - children = ( - 9ECBDDAD1C9C4F0300F76AEB /* LaunchScreen.storyboard */, - 7F83F15919F154F000C53328 /* Main.storyboard */, - 7F4D2F531A1C8EE50038E7D1 /* Images.xcassets */, - 7F87CA9D1A2CCE8B0076C617 /* OpenSans-Bold.ttf */, - 7F87CA9E1A2CCE8B0076C617 /* OpenSans-Light.ttf */, - 7F87CA9F1A2CCE8B0076C617 /* OpenSans-Regular.ttf */, - 7F87CAA01A2CCE8B0076C617 /* OpenSans-Semibold.ttf */, - 7F87DDE21A973C7400704AC4 /* eula-ios.html */, - 7F87DDDD1A97339300704AC4 /* Localizable.strings */, - ); - name = Resources; - sourceTree = ""; - }; 7F72C7401A2DEA3300F48EE8 /* Helpers */ = { isa = PBXGroup; children = ( @@ -1121,12 +1105,18 @@ 7F83F15219F154F000C53328 /* SAPTracker */ = { isa = PBXGroup; children = ( + 9ECBDDAD1C9C4F0300F76AEB /* LaunchScreen.storyboard */, + 7F83F15919F154F000C53328 /* Main.storyboard */, + 7F87DDDD1A97339300704AC4 /* Localizable.strings */, + 7F4D2F531A1C8EE50038E7D1 /* Images.xcassets */, + C89C60131D0FF61E002AAAD2 /* Resources */, + C89C5FC31D06A269002AAAD2 /* Views */, C852BAA91CF736440093B0C5 /* Preferences */, 7F83F15519F154F000C53328 /* AppDelegate.swift */, + 7F72C7401A2DEA3300F48EE8 /* Helpers */, 7F06590119F7FE920077FF95 /* ViewController */, 7F06590219F7FEA40077FF95 /* DataController */, 7F06590019F7FE750077FF95 /* Model */, - 7F14A0031A13B9A6001C1ECB /* Flags */, 7F83F15319F154F000C53328 /* Supporting Files */, ); path = SAPTracker; @@ -1201,6 +1191,78 @@ name = Preferences; sourceTree = ""; }; + C89C5FC31D06A269002AAAD2 /* Views */ = { + isa = PBXGroup; + children = ( + 7F193A901A39E54600D71773 /* GPSAccuracyView.swift */, + C89C5FC41D06A289002AAAD2 /* GradientView.swift */, + ); + name = Views; + sourceTree = ""; + }; + C89C5FC61D06CE62002AAAD2 /* Tracking */ = { + isa = PBXGroup; + children = ( + C89C5FC81D06CEA0002AAAD2 /* Cells */, + C89C5FC71D06CE87002AAAD2 /* Pages */, + 7F1875B21A10F1B800C25BE0 /* TrackingViewController.swift */, + 7F8B8D3E1A37356C00C34B88 /* TrackingPageViewController.swift */, + ); + name = Tracking; + sourceTree = ""; + }; + C89C5FC71D06CE87002AAAD2 /* Pages */ = { + isa = PBXGroup; + children = ( + 7F193A8E1A39ACF500D71773 /* TimerViewController.swift */, + 7F8B8D401A373B0200C34B88 /* SpeedViewController.swift */, + 7F8B8D421A373D4400C34B88 /* CourseViewController.swift */, + ); + name = Pages; + sourceTree = ""; + }; + C89C5FC81D06CEA0002AAAD2 /* Cells */ = { + isa = PBXGroup; + children = ( + C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */, + C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */, + C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */, + C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */, + ); + name = Cells; + sourceTree = ""; + }; + C89C60101D0FF036002AAAD2 /* Regatta */ = { + isa = PBXGroup; + children = ( + 7F99DE3B1A126554009B3619 /* RegattaViewController.swift */, + 7F950A901A35E967003C8C5C /* LeaderBoardViewController.swift */, + C89C5FC61D06CE62002AAAD2 /* Tracking */, + ); + name = Regatta; + sourceTree = ""; + }; + C89C60131D0FF61E002AAAD2 /* Resources */ = { + isa = PBXGroup; + children = ( + 7F87DDE21A973C7400704AC4 /* eula-ios.html */, + 7F14A0031A13B9A6001C1ECB /* Flags */, + C89C60141D0FF63C002AAAD2 /* Fonts */, + ); + name = Resources; + sourceTree = ""; + }; + C89C60141D0FF63C002AAAD2 /* Fonts */ = { + isa = PBXGroup; + children = ( + 7F87CA9D1A2CCE8B0076C617 /* OpenSans-Bold.ttf */, + 7F87CA9E1A2CCE8B0076C617 /* OpenSans-Light.ttf */, + 7F87CA9F1A2CCE8B0076C617 /* OpenSans-Regular.ttf */, + 7F87CAA01A2CCE8B0076C617 /* OpenSans-Semibold.ttf */, + ); + name = Fonts; + sourceTree = ""; + }; C8B31F781B68DAD400C8A809 /* Products */ = { isa = PBXGroup; children = ( @@ -1757,6 +1819,7 @@ 7F8B8D431A373D4400C34B88 /* CourseViewController.swift in Sources */, 7FAFA7951A126B5700D230F1 /* AboutViewController.swift in Sources */, 7F44095B19F65B5B0021BF22 /* CoreData.xcdatamodeld in Sources */, + C89C5FD01D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift in Sources */, 7F1B66F91A0CDCF600904A41 /* BatteryManager.swift in Sources */, C852BA971CF2302D0093B0C5 /* CameraController.swift in Sources */, 7F03FD3E19FA44CD00FA1327 /* APIManager.swift in Sources */, @@ -1766,6 +1829,8 @@ 7F23F0881A1A3DEF00F03F1C /* CheckInController.swift in Sources */, 7F2C605A19F160E400C32D93 /* LocationManager.swift in Sources */, 7FCDB6631A1636610075D7D9 /* Event.swift in Sources */, + C89C5FCC1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift in Sources */, + C89C5FCA1D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift in Sources */, 7F8B8D3F1A37356C00C34B88 /* TrackingPageViewController.swift in Sources */, 7FCDB6621A1636610075D7D9 /* GPSFix.swift in Sources */, 7F99DE3C1A126554009B3619 /* RegattaViewController.swift in Sources */, @@ -1775,10 +1840,10 @@ 7F3AA7C81A1CD7D700F8861F /* SendGPSFixController.swift in Sources */, 7FCDB6641A1636610075D7D9 /* LeaderBoard.swift in Sources */, C852BAAD1CF757950093B0C5 /* CheckInViewController.swift in Sources */, - C8603D4A1C528832002B2F28 /* Acknowledgements.markdown in Sources */, 7F8B8D411A373B0200C34B88 /* SpeedViewController.swift in Sources */, 9E95C3D61C723AB30016632B /* Constants.swift in Sources */, 7FD9D3031A1236080058FEAD /* Extensions.swift in Sources */, + C89C5FC51D06A289002AAAD2 /* GradientView.swift in Sources */, C852BAAB1CF736680093B0C5 /* Preferences.swift in Sources */, 7F0658FD19F7D6700077FF95 /* ScanViewController.swift in Sources */, 7FCDB6651A1636610075D7D9 /* Competitor.swift in Sources */, @@ -1786,6 +1851,7 @@ 7F193A8F1A39ACF500D71773 /* TimerViewController.swift in Sources */, 7F83F15619F154F000C53328 /* AppDelegate.swift in Sources */, 7F950A911A35E967003C8C5C /* LeaderBoardViewController.swift in Sources */, + C89C5FCE1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift in Sources */, 7F0658FF19F7EE910077FF95 /* CheckInData.swift in Sources */, 7F193A911A39E54600D71773 /* GPSAccuracyView.swift in Sources */, ); diff --git a/ios/SAPTracker/src/xcode/SAPTracker/AppDelegate.swift b/ios/SAPTracker/src/xcode/SAPTracker/AppDelegate.swift index e3c47f332b1..41ef9422239 100644 --- a/ios/SAPTracker/src/xcode/SAPTracker/AppDelegate.swift +++ b/ios/SAPTracker/src/xcode/SAPTracker/AppDelegate.swift @@ -11,53 +11,36 @@ import CoreData @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - struct NotificationType { - static let openUrl = "openUrl" - } var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // set up connection logging for debug builds + // Set up connection logging for debug builds #if DEBUG - AFNetworkActivityLogger.sharedLogger().startLogging() - AFNetworkActivityLogger.sharedLogger().level = AFHTTPRequestLoggerLevel.AFLoggerLevelDebug + //AFNetworkActivityLogger.sharedLogger().startLogging() + //AFNetworkActivityLogger.sharedLogger().level = AFHTTPRequestLoggerLevel.AFLoggerLevelDebug #endif - // initialize core data, migrate database if needed, or delete if migration needed but not possible + // Initialize core data, migrate database if needed, or delete if migration needed but not possible DataManager.sharedManager - // start timer in case GPS fixes need to be sent + // Start timer in case GPS fixes need to be sent SendGPSFixController.sharedManager.timer() - // set up styling - UINavigationBar.appearance().setBackgroundImage(UIImage(named: "navbar_bg"), forBarMetrics: UIBarMetrics.Default) - UINavigationBar.appearance().tintColor = UIColor.whiteColor() - UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor(), NSFontAttributeName: UIFont(name: "OpenSans-Bold", size: CGFloat(17.0))!] - UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGrayColor() - UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.blackColor() - UIPageControl.appearance().backgroundColor = UIColor.whiteColor() + // Setup + self.setupNavigationBarApperance() + self.setupPageControlApperance() + + // FIXME: - Still need this? // needed for missing Swift method - Appearance.setAppearance() + //Appearance.setAppearance() + return true } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { - - // Extract url string from deeplink - var urlString = url.absoluteString - let appPrefix : String = "comsapsailingtracker://" - urlString = urlString.hasPrefix(appPrefix) ? urlString.substringFromIndex(appPrefix.endIndex) : urlString - let httpPrefix : String = "http//" - urlString = urlString.hasPrefix(httpPrefix) ? "http://" + urlString.substringFromIndex(httpPrefix.endIndex) : urlString - let httpsPrefix : String = "https//" - urlString = urlString.hasPrefix(httpsPrefix) ? "https://" + urlString.substringFromIndex(httpsPrefix.endIndex) : urlString - - // Save this url - Preferences.setLastCheckInURLString(urlString) - - // Handled successful + Preferences.setLastCheckInURLString(self.urlStringForDeeplink(url)) return true } @@ -85,6 +68,38 @@ class AppDelegate: UIResponder, UIApplicationDelegate { DataManager.sharedManager.saveContext() } - + // MARK: - Setups + + private func setupNavigationBarApperance() { + let tintColor = UIColor(hex: 0x009de0) + UINavigationBar.appearance().tintColor = tintColor + UINavigationBar.appearance().titleTextAttributes = + [NSForegroundColorAttributeName: tintColor, + NSFontAttributeName: UIFont(name: "OpenSans-Bold", size: CGFloat(17.0))! + ] + } + + private func setupPageControlApperance() { + UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGrayColor() + UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.blackColor() + } + + // MARK: - Helper + + private func urlStringForDeeplink(url: NSURL) -> String { + var urlString = url.absoluteString + let appPrefix : String = "comsapsailingtracker://" + + // FIXME: - Two prefixes are not allowed + // Deeplink needs another structure (if possible) because of allowed characters in URL + // https:// -> http// + urlString = urlString.hasPrefix(appPrefix) ? urlString.substringFromIndex(appPrefix.endIndex) : urlString + let httpPrefix : String = "http//" + urlString = urlString.hasPrefix(httpPrefix) ? "http://" + urlString.substringFromIndex(httpPrefix.endIndex) : urlString + let httpsPrefix : String = "https//" + urlString = urlString.hasPrefix(httpsPrefix) ? "https://" + urlString.substringFromIndex(httpsPrefix.endIndex) : urlString + return urlString + } + } diff --git a/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Main.storyboard b/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Main.storyboard index d780677830c..a2d42dfb8c5 100644 --- a/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Main.storyboard +++ b/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Main.storyboard @@ -10,12 +10,6 @@ OpenSans-Bold OpenSans-Bold OpenSans-Bold - OpenSans-Bold - OpenSans-Bold - OpenSans-Bold - OpenSans-Bold - OpenSans-Bold - OpenSans-Bold OpenSans-Light @@ -49,6 +43,11 @@ OpenSans OpenSans OpenSans + OpenSans + OpenSans + OpenSans + OpenSans + OpenSans OpenSans-Semibold @@ -72,106 +71,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + @@ -180,13 +110,13 @@ - + @@ -194,28 +124,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - + + + + + + + + + + + + + + + + + + + + + @@ -229,7 +279,7 @@ - + @@ -242,7 +292,7 @@ - + @@ -316,388 +366,430 @@ - - - - - - - - - - - - - + + - - - - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + @@ -711,25 +803,22 @@ - - - - - - - - - - - - - - + + + + + + + + + + - - - + + + + @@ -737,7 +826,7 @@ - + @@ -779,155 +868,278 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -937,15 +1149,13 @@ - - - - + + - + @@ -959,11 +1169,8 @@ - - - + - + + @@ -1011,8 +1218,14 @@ + - - - + + - - + @@ -1058,17 +1261,8 @@ - - - - - - + + + @@ -1125,18 +1327,18 @@