diff --git a/APIClient.xcodeproj/project.pbxproj b/APIClient.xcodeproj/project.pbxproj deleted file mode 100644 index d57524a..0000000 --- a/APIClient.xcodeproj/project.pbxproj +++ /dev/null @@ -1,405 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 872A275C1CF0D87100A988C4 /* APIResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872A275B1CF0D87100A988C4 /* APIResource.swift */; }; - 874D06591CEF295E009A494D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874D06581CEF295E009A494D /* AppDelegate.swift */; }; - 874D065E1CEF295E009A494D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 874D065C1CEF295E009A494D /* Main.storyboard */; }; - 874D06601CEF295E009A494D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 874D065F1CEF295E009A494D /* Assets.xcassets */; }; - 874D06631CEF295E009A494D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 874D06611CEF295E009A494D /* LaunchScreen.storyboard */; }; - A526FDEE5BF2D1BC3C97B9FA /* Pods_APIClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD8A5B3E1266D5298CABE44A /* Pods_APIClient.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 872A275B1CF0D87100A988C4 /* APIResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIResource.swift; sourceTree = ""; }; - 874D06551CEF295E009A494D /* APIClient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = APIClient.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 874D06581CEF295E009A494D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 874D065D1CEF295E009A494D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 874D065F1CEF295E009A494D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 874D06621CEF295E009A494D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 874D06641CEF295E009A494D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 93EFAB13AE62F1B6FB2683B2 /* Pods-APIClient.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-APIClient.debug.xcconfig"; path = "Pods/Target Support Files/Pods-APIClient/Pods-APIClient.debug.xcconfig"; sourceTree = ""; }; - BD8A5B3E1266D5298CABE44A /* Pods_APIClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_APIClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FFE13D543A95D28F27CFBDA4 /* Pods-APIClient.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-APIClient.release.xcconfig"; path = "Pods/Target Support Files/Pods-APIClient/Pods-APIClient.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 874D06521CEF295E009A494D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A526FDEE5BF2D1BC3C97B9FA /* Pods_APIClient.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 872A27571CF0D4E200A988C4 /* View Controller */ = { - isa = PBXGroup; - children = ( - ); - name = "View Controller"; - sourceTree = ""; - }; - 872A27581CF0D4EB00A988C4 /* View */ = { - isa = PBXGroup; - children = ( - ); - name = View; - sourceTree = ""; - }; - 872A27591CF0D64A00A988C4 /* Model */ = { - isa = PBXGroup; - children = ( - 872A275B1CF0D87100A988C4 /* APIResource.swift */, - ); - name = Model; - sourceTree = ""; - }; - 872A275A1CF0D65300A988C4 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 874D065F1CEF295E009A494D /* Assets.xcassets */, - 874D06611CEF295E009A494D /* LaunchScreen.storyboard */, - 874D06641CEF295E009A494D /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 874D064C1CEF295E009A494D = { - isa = PBXGroup; - children = ( - 874D06571CEF295E009A494D /* APIClient */, - 874D06561CEF295E009A494D /* Products */, - CF558E3374C5C3F956C82B81 /* Pods */, - D9BE20B845CB84F96D784197 /* Frameworks */, - ); - sourceTree = ""; - }; - 874D06561CEF295E009A494D /* Products */ = { - isa = PBXGroup; - children = ( - 874D06551CEF295E009A494D /* APIClient.app */, - ); - name = Products; - sourceTree = ""; - }; - 874D06571CEF295E009A494D /* APIClient */ = { - isa = PBXGroup; - children = ( - 874D06581CEF295E009A494D /* AppDelegate.swift */, - 874D065C1CEF295E009A494D /* Main.storyboard */, - 872A27571CF0D4E200A988C4 /* View Controller */, - 872A27581CF0D4EB00A988C4 /* View */, - 872A27591CF0D64A00A988C4 /* Model */, - 872A275A1CF0D65300A988C4 /* Supporting Files */, - ); - path = APIClient; - sourceTree = ""; - }; - CF558E3374C5C3F956C82B81 /* Pods */ = { - isa = PBXGroup; - children = ( - 93EFAB13AE62F1B6FB2683B2 /* Pods-APIClient.debug.xcconfig */, - FFE13D543A95D28F27CFBDA4 /* Pods-APIClient.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - D9BE20B845CB84F96D784197 /* Frameworks */ = { - isa = PBXGroup; - children = ( - BD8A5B3E1266D5298CABE44A /* Pods_APIClient.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 874D06541CEF295E009A494D /* APIClient */ = { - isa = PBXNativeTarget; - buildConfigurationList = 874D06671CEF295E009A494D /* Build configuration list for PBXNativeTarget "APIClient" */; - buildPhases = ( - 766803B31A3F89C2C74D599B /* 📦 Check Pods Manifest.lock */, - 874D06511CEF295E009A494D /* Sources */, - 874D06521CEF295E009A494D /* Frameworks */, - 874D06531CEF295E009A494D /* Resources */, - 63A898AB1E385BFD9CE49E01 /* 📦 Embed Pods Frameworks */, - 353BFD219018DADC12E19A38 /* 📦 Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = APIClient; - productName = APIClient; - productReference = 874D06551CEF295E009A494D /* APIClient.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 874D064D1CEF295E009A494D /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0730; - ORGANIZATIONNAME = "iOS Dev Kurs Universität Heidelberg"; - TargetAttributes = { - 874D06541CEF295E009A494D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 874D06501CEF295E009A494D /* Build configuration list for PBXProject "APIClient" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 874D064C1CEF295E009A494D; - productRefGroup = 874D06561CEF295E009A494D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 874D06541CEF295E009A494D /* APIClient */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 874D06531CEF295E009A494D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 874D06631CEF295E009A494D /* LaunchScreen.storyboard in Resources */, - 874D06601CEF295E009A494D /* Assets.xcassets in Resources */, - 874D065E1CEF295E009A494D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 353BFD219018DADC12E19A38 /* 📦 Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 63A898AB1E385BFD9CE49E01 /* 📦 Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 766803B31A3F89C2C74D599B /* 📦 Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 874D06511CEF295E009A494D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 872A275C1CF0D87100A988C4 /* APIResource.swift in Sources */, - 874D06591CEF295E009A494D /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 874D065C1CEF295E009A494D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 874D065D1CEF295E009A494D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 874D06611CEF295E009A494D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 874D06621CEF295E009A494D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 874D06651CEF295E009A494D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - 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 = 9.3; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 874D06661CEF295E009A494D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - 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 = 9.3; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 874D06681CEF295E009A494D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 93EFAB13AE62F1B6FB2683B2 /* Pods-APIClient.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = APIClient/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "de.uni-heidelberg.ios-dev-kurs.APIClient"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 874D06691CEF295E009A494D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FFE13D543A95D28F27CFBDA4 /* Pods-APIClient.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = APIClient/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "de.uni-heidelberg.ios-dev-kurs.APIClient"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 874D06501CEF295E009A494D /* Build configuration list for PBXProject "APIClient" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 874D06651CEF295E009A494D /* Debug */, - 874D06661CEF295E009A494D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 874D06671CEF295E009A494D /* Build configuration list for PBXNativeTarget "APIClient" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 874D06681CEF295E009A494D /* Debug */, - 874D06691CEF295E009A494D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 874D064D1CEF295E009A494D /* Project object */; -} diff --git a/APIClient/APIResource.swift b/APIClient/APIResource.swift deleted file mode 100644 index 6bb455f..0000000 --- a/APIClient/APIResource.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// APIResource.swift -// APIClient -// -// Created by Nils Fischer on 21.05.16. -// Copyright © 2016 iOS Dev Kurs Universität Heidelberg. All rights reserved. -// - -import Foundation -import Moya -import Freddy -import AwesomeCache - - - -/** - Representation for a resource that may or may not be loaded yet. - - It is based on two generic types: - - - The `Target` is a `Moya.TargetType` that abstracts the API. It must also be `Cacheable` so that responses can be cached. - - The `Resource` is a `Freddy.JSONDecodable` type so that responses from the API can be directly parsed to JSON and decoded to the expected type. - - You are free to use this utility or implement your own way to keep track of loaded and not loaded resources. - - - seealso: MoyaProvider.request(_:completion:) -*/ -enum APIResource { - - case notLoaded(Target) - case loading(Moya.Cancellable) - case loaded(Resource) - case failed(Target, error: ErrorType) - -} - - -// MARK: - Requesting Resources - -extension MoyaProvider where Target: Cacheable { - - /// Requests the resource from the server. Immediately returns with the updated resource status, usually `.loading`. If a cached response is found, returns the `.loaded` resource immediately. - func request(target: Target, completion: (APIResource) -> Void) -> APIResource { - - // Check for cached data first - if let cachedResponse = resourceCache[target.cacheIdentifier] { - do { - let json = try JSON(data: cachedResponse) - let resource = try Resource(json: json) - dispatch_async(dispatch_get_main_queue()) { - completion(.loaded(resource)) - } - return .loaded(resource) - } catch { - // Invalidate cache and proceed to loading the request - resourceCache[target.cacheIdentifier] = nil - } - } - - // Load the resource from the server - return .loading( - self.request(target) { result in - switch result { - case .Success(let response): - do { - try response.filterSuccessfulStatusCodes() - // Try to parse the response to JSON - let json = try JSON(data: response.data) - // Try to decode the JSON to the required type - let resource = try Resource(json: json) - // Cache the response and complete - resourceCache[target.cacheIdentifier] = response.data - completion(.loaded(resource)) - } catch { - completion(.failed(target, error: error)) - } - case .Failure(let error): - completion(.failed(target, error: error)) - } - } - ) - } - -} - -/// A persistent cache for resources -private let resourceCache = try! Cache(name: "APIResource") - -protocol Cacheable { - - /// A key used for identification in a cache - var cacheIdentifier: String { get } - -} diff --git a/APIClient/AppDelegate.swift b/APIClient/AppDelegate.swift deleted file mode 100644 index 630c3ed..0000000 --- a/APIClient/AppDelegate.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// AppDelegate.swift -// APIClient -// -// Created by Nils Fischer on 20.05.16. -// Copyright © 2016 iOS Dev Kurs Universität Heidelberg. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - return true - } - -} - diff --git a/APIClient/Base.lproj/Main.storyboard b/APIClient/Base.lproj/Main.storyboard deleted file mode 100644 index 69b2fbf..0000000 --- a/APIClient/Base.lproj/Main.storyboard +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/EmojiMe.xcodeproj/project.pbxproj b/EmojiMe.xcodeproj/project.pbxproj new file mode 100644 index 0000000..83d3e43 --- /dev/null +++ b/EmojiMe.xcodeproj/project.pbxproj @@ -0,0 +1,706 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 11CB5C687544C33E20819726 /* Pods_EmojiMe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F086E6996CD01339F76337E /* Pods_EmojiMe.framework */; }; + 2A042E7A1CF4959100EDD942 /* calculateEmojis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A042E791CF4959100EDD942 /* calculateEmojis.swift */; }; + 2A8553001CF37896004F36EA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8552FF1CF37896004F36EA /* AppDelegate.swift */; }; + 2A8553041CF37896004F36EA /* SecondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8553031CF37896004F36EA /* SecondViewController.swift */; }; + 2A8553071CF37896004F36EA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8553051CF37896004F36EA /* Main.storyboard */; }; + 2A8553091CF37896004F36EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A8553081CF37896004F36EA /* Assets.xcassets */; }; + 2A85530C1CF37896004F36EA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A85530A1CF37896004F36EA /* LaunchScreen.storyboard */; }; + 2A8553171CF37896004F36EA /* EmojiMeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8553161CF37896004F36EA /* EmojiMeTests.swift */; }; + 2A8553221CF37896004F36EA /* EmojiMeUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8553211CF37896004F36EA /* EmojiMeUITests.swift */; }; + 2A8553301CF388FF004F36EA /* Podfile in Resources */ = {isa = PBXBuildFile; fileRef = 2A85532F1CF388FF004F36EA /* Podfile */; }; + 2A8553321CF394D6004F36EA /* apihandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8553311CF394D6004F36EA /* apihandler.swift */; }; + AFD59853EF086322A62AA14E /* Pods_EmojiMeUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE1CC484E64309079243483B /* Pods_EmojiMeUITests.framework */; }; + F5F82F79CBD1478F804D7AE8 /* Pods_EmojiMeTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC1C97167E8C9D025749A1C9 /* Pods_EmojiMeTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2A8553131CF37896004F36EA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2A8552F41CF37896004F36EA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2A8552FB1CF37896004F36EA; + remoteInfo = EmojiMe; + }; + 2A85531E1CF37896004F36EA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2A8552F41CF37896004F36EA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2A8552FB1CF37896004F36EA; + remoteInfo = EmojiMe; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 2A042E791CF4959100EDD942 /* calculateEmojis.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = calculateEmojis.swift; sourceTree = ""; }; + 2A8552FC1CF37896004F36EA /* EmojiMe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EmojiMe.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A8552FF1CF37896004F36EA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 2A8553031CF37896004F36EA /* SecondViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondViewController.swift; sourceTree = ""; }; + 2A8553061CF37896004F36EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 2A8553081CF37896004F36EA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2A85530B1CF37896004F36EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 2A85530D1CF37896004F36EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A8553121CF37896004F36EA /* EmojiMeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EmojiMeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A8553161CF37896004F36EA /* EmojiMeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiMeTests.swift; sourceTree = ""; }; + 2A8553181CF37896004F36EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A85531D1CF37896004F36EA /* EmojiMeUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EmojiMeUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A8553211CF37896004F36EA /* EmojiMeUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiMeUITests.swift; sourceTree = ""; }; + 2A8553231CF37896004F36EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A85532F1CF388FF004F36EA /* Podfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 2A8553311CF394D6004F36EA /* apihandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apihandler.swift; sourceTree = ""; }; + 3F086E6996CD01339F76337E /* Pods_EmojiMe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 449C8044EB9948E3BF335852 /* Pods-EmojiMeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMeTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.debug.xcconfig"; sourceTree = ""; }; + 88E4F85655D019555A3C307A /* Pods-EmojiMe.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMe.release.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.release.xcconfig"; sourceTree = ""; }; + 9899747AAE4BD3FE00EE8026 /* Pods-EmojiMeUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMeUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.release.xcconfig"; sourceTree = ""; }; + 9CA2F39412A86E20357788FA /* Pods-EmojiMeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMeTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.release.xcconfig"; sourceTree = ""; }; + BE1CC484E64309079243483B /* Pods_EmojiMeUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMeUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DC1C97167E8C9D025749A1C9 /* Pods_EmojiMeTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMeTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAD0E8E414DB0CD770F00308 /* Pods-EmojiMeUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMeUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.debug.xcconfig"; sourceTree = ""; }; + EFC4FF9CFF107FC279F1737D /* Pods-EmojiMe.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiMe.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2A8552F91CF37896004F36EA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 11CB5C687544C33E20819726 /* Pods_EmojiMe.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A85530F1CF37896004F36EA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F5F82F79CBD1478F804D7AE8 /* Pods_EmojiMeTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A85531A1CF37896004F36EA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AFD59853EF086322A62AA14E /* Pods_EmojiMeUITests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 11F8C3132F576BF1A7E3BD78 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3F086E6996CD01339F76337E /* Pods_EmojiMe.framework */, + DC1C97167E8C9D025749A1C9 /* Pods_EmojiMeTests.framework */, + BE1CC484E64309079243483B /* Pods_EmojiMeUITests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2A8552F31CF37896004F36EA = { + isa = PBXGroup; + children = ( + 2A8552FE1CF37896004F36EA /* EmojiMe */, + 2A8553151CF37896004F36EA /* EmojiMeTests */, + 2A8553201CF37896004F36EA /* EmojiMeUITests */, + 2A8552FD1CF37896004F36EA /* Products */, + 7B27AD78C5DA868EF47FB0B3 /* Pods */, + 11F8C3132F576BF1A7E3BD78 /* Frameworks */, + ); + sourceTree = ""; + }; + 2A8552FD1CF37896004F36EA /* Products */ = { + isa = PBXGroup; + children = ( + 2A8552FC1CF37896004F36EA /* EmojiMe.app */, + 2A8553121CF37896004F36EA /* EmojiMeTests.xctest */, + 2A85531D1CF37896004F36EA /* EmojiMeUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 2A8552FE1CF37896004F36EA /* EmojiMe */ = { + isa = PBXGroup; + children = ( + 2A85532F1CF388FF004F36EA /* Podfile */, + 2A8552FF1CF37896004F36EA /* AppDelegate.swift */, + 2A8553031CF37896004F36EA /* SecondViewController.swift */, + 2A042E791CF4959100EDD942 /* calculateEmojis.swift */, + 2A8553051CF37896004F36EA /* Main.storyboard */, + 2A8553081CF37896004F36EA /* Assets.xcassets */, + 2A85530A1CF37896004F36EA /* LaunchScreen.storyboard */, + 2A85530D1CF37896004F36EA /* Info.plist */, + 2A8553311CF394D6004F36EA /* apihandler.swift */, + ); + path = EmojiMe; + sourceTree = ""; + }; + 2A8553151CF37896004F36EA /* EmojiMeTests */ = { + isa = PBXGroup; + children = ( + 2A8553161CF37896004F36EA /* EmojiMeTests.swift */, + 2A8553181CF37896004F36EA /* Info.plist */, + ); + path = EmojiMeTests; + sourceTree = ""; + }; + 2A8553201CF37896004F36EA /* EmojiMeUITests */ = { + isa = PBXGroup; + children = ( + 2A8553211CF37896004F36EA /* EmojiMeUITests.swift */, + 2A8553231CF37896004F36EA /* Info.plist */, + ); + path = EmojiMeUITests; + sourceTree = ""; + }; + 7B27AD78C5DA868EF47FB0B3 /* Pods */ = { + isa = PBXGroup; + children = ( + EFC4FF9CFF107FC279F1737D /* Pods-EmojiMe.debug.xcconfig */, + 88E4F85655D019555A3C307A /* Pods-EmojiMe.release.xcconfig */, + 449C8044EB9948E3BF335852 /* Pods-EmojiMeTests.debug.xcconfig */, + 9CA2F39412A86E20357788FA /* Pods-EmojiMeTests.release.xcconfig */, + EAD0E8E414DB0CD770F00308 /* Pods-EmojiMeUITests.debug.xcconfig */, + 9899747AAE4BD3FE00EE8026 /* Pods-EmojiMeUITests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2A8552FB1CF37896004F36EA /* EmojiMe */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2A8553261CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMe" */; + buildPhases = ( + 7DD9F4E714CD9B73D10E22D7 /* 📦 Check Pods Manifest.lock */, + 2A8552F81CF37896004F36EA /* Sources */, + 2A8552F91CF37896004F36EA /* Frameworks */, + 2A8552FA1CF37896004F36EA /* Resources */, + 2AF8B34DE6A141D4AE67E426 /* 📦 Embed Pods Frameworks */, + E1C2EAA370C8D3E500CA8164 /* 📦 Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = EmojiMe; + productName = EmojiMe; + productReference = 2A8552FC1CF37896004F36EA /* EmojiMe.app */; + productType = "com.apple.product-type.application"; + }; + 2A8553111CF37896004F36EA /* EmojiMeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2A8553291CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMeTests" */; + buildPhases = ( + DC8551B28EBE4E5F1AA8C30D /* 📦 Check Pods Manifest.lock */, + 2A85530E1CF37896004F36EA /* Sources */, + 2A85530F1CF37896004F36EA /* Frameworks */, + 2A8553101CF37896004F36EA /* Resources */, + 2DD0FEE6DD094CA1F1DE19E5 /* 📦 Embed Pods Frameworks */, + 6761E9259ED9420EB5138D6E /* 📦 Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2A8553141CF37896004F36EA /* PBXTargetDependency */, + ); + name = EmojiMeTests; + productName = EmojiMeTests; + productReference = 2A8553121CF37896004F36EA /* EmojiMeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 2A85531C1CF37896004F36EA /* EmojiMeUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2A85532C1CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMeUITests" */; + buildPhases = ( + 8245BA986F11C494AC45A0E0 /* 📦 Check Pods Manifest.lock */, + 2A8553191CF37896004F36EA /* Sources */, + 2A85531A1CF37896004F36EA /* Frameworks */, + 2A85531B1CF37896004F36EA /* Resources */, + 64C48983FA926634DF112922 /* 📦 Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2A85531F1CF37896004F36EA /* PBXTargetDependency */, + ); + name = EmojiMeUITests; + productName = EmojiMeUITests; + productReference = 2A85531D1CF37896004F36EA /* EmojiMeUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2A8552F41CF37896004F36EA /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "Max Simon"; + TargetAttributes = { + 2A8552FB1CF37896004F36EA = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = AVQEU8EC7K; + }; + 2A8553111CF37896004F36EA = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = 2A8552FB1CF37896004F36EA; + }; + 2A85531C1CF37896004F36EA = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = 2A8552FB1CF37896004F36EA; + }; + }; + }; + buildConfigurationList = 2A8552F71CF37896004F36EA /* Build configuration list for PBXProject "EmojiMe" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 2A8552F31CF37896004F36EA; + productRefGroup = 2A8552FD1CF37896004F36EA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2A8552FB1CF37896004F36EA /* EmojiMe */, + 2A8553111CF37896004F36EA /* EmojiMeTests */, + 2A85531C1CF37896004F36EA /* EmojiMeUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2A8552FA1CF37896004F36EA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2A85530C1CF37896004F36EA /* LaunchScreen.storyboard in Resources */, + 2A8553091CF37896004F36EA /* Assets.xcassets in Resources */, + 2A8553301CF388FF004F36EA /* Podfile in Resources */, + 2A8553071CF37896004F36EA /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A8553101CF37896004F36EA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A85531B1CF37896004F36EA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2AF8B34DE6A141D4AE67E426 /* 📦 Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2DD0FEE6DD094CA1F1DE19E5 /* 📦 Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 64C48983FA926634DF112922 /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 6761E9259ED9420EB5138D6E /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7DD9F4E714CD9B73D10E22D7 /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 8245BA986F11C494AC45A0E0 /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + DC8551B28EBE4E5F1AA8C30D /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + E1C2EAA370C8D3E500CA8164 /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2A8552F81CF37896004F36EA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2A8553321CF394D6004F36EA /* apihandler.swift in Sources */, + 2A042E7A1CF4959100EDD942 /* calculateEmojis.swift in Sources */, + 2A8553041CF37896004F36EA /* SecondViewController.swift in Sources */, + 2A8553001CF37896004F36EA /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A85530E1CF37896004F36EA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2A8553171CF37896004F36EA /* EmojiMeTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2A8553191CF37896004F36EA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2A8553221CF37896004F36EA /* EmojiMeUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2A8553141CF37896004F36EA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2A8552FB1CF37896004F36EA /* EmojiMe */; + targetProxy = 2A8553131CF37896004F36EA /* PBXContainerItemProxy */; + }; + 2A85531F1CF37896004F36EA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2A8552FB1CF37896004F36EA /* EmojiMe */; + targetProxy = 2A85531E1CF37896004F36EA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 2A8553051CF37896004F36EA /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 2A8553061CF37896004F36EA /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 2A85530A1CF37896004F36EA /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 2A85530B1CF37896004F36EA /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2A8553241CF37896004F36EA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2A8553251CF37896004F36EA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 2A8553271CF37896004F36EA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EFC4FF9CFF107FC279F1737D /* Pods-EmojiMe.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + INFOPLIST_FILE = EmojiMe/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + }; + name = Debug; + }; + 2A8553281CF37896004F36EA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 88E4F85655D019555A3C307A /* Pods-EmojiMe.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + INFOPLIST_FILE = EmojiMe/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + }; + name = Release; + }; + 2A85532A1CF37896004F36EA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 449C8044EB9948E3BF335852 /* Pods-EmojiMeTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = EmojiMeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EmojiMe.app/EmojiMe"; + }; + name = Debug; + }; + 2A85532B1CF37896004F36EA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9CA2F39412A86E20357788FA /* Pods-EmojiMeTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = EmojiMeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EmojiMe.app/EmojiMe"; + }; + name = Release; + }; + 2A85532D1CF37896004F36EA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EAD0E8E414DB0CD770F00308 /* Pods-EmojiMeUITests.debug.xcconfig */; + buildSettings = { + INFOPLIST_FILE = EmojiMeUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMeUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = EmojiMe; + }; + name = Debug; + }; + 2A85532E1CF37896004F36EA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9899747AAE4BD3FE00EE8026 /* Pods-EmojiMeUITests.release.xcconfig */; + buildSettings = { + INFOPLIST_FILE = EmojiMeUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.maxsimon.EmojiMeUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = EmojiMe; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2A8552F71CF37896004F36EA /* Build configuration list for PBXProject "EmojiMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2A8553241CF37896004F36EA /* Debug */, + 2A8553251CF37896004F36EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2A8553261CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2A8553271CF37896004F36EA /* Debug */, + 2A8553281CF37896004F36EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2A8553291CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2A85532A1CF37896004F36EA /* Debug */, + 2A85532B1CF37896004F36EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2A85532C1CF37896004F36EA /* Build configuration list for PBXNativeTarget "EmojiMeUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2A85532D1CF37896004F36EA /* Debug */, + 2A85532E1CF37896004F36EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2A8552F41CF37896004F36EA /* Project object */; +} diff --git a/APIClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/EmojiMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 70% rename from APIClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to EmojiMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata index e84aa4d..41ca7c1 100644 --- a/APIClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/EmojiMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:EmojiMe.xcodeproj"> diff --git a/APIClient.xcworkspace/contents.xcworkspacedata b/EmojiMe.xcworkspace/contents.xcworkspacedata similarity index 79% rename from APIClient.xcworkspace/contents.xcworkspacedata rename to EmojiMe.xcworkspace/contents.xcworkspacedata index 80cf783..19a7441 100644 --- a/APIClient.xcworkspace/contents.xcworkspacedata +++ b/EmojiMe.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:EmojiMe.xcodeproj"> diff --git a/EmojiMe/AppDelegate.swift b/EmojiMe/AppDelegate.swift new file mode 100644 index 0000000..56a24b6 --- /dev/null +++ b/EmojiMe/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// EmojiMe +// +// Created by Max Simon on 23.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/APIClient/Assets.xcassets/AppIcon.appiconset/Contents.json b/EmojiMe/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from APIClient/Assets.xcassets/AppIcon.appiconset/Contents.json rename to EmojiMe/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/EmojiMe/Assets.xcassets/first.imageset/Contents.json b/EmojiMe/Assets.xcassets/first.imageset/Contents.json new file mode 100644 index 0000000..33a7451 --- /dev/null +++ b/EmojiMe/Assets.xcassets/first.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/EmojiMe/Assets.xcassets/first.imageset/first.pdf b/EmojiMe/Assets.xcassets/first.imageset/first.pdf new file mode 100644 index 0000000..47d911d Binary files /dev/null and b/EmojiMe/Assets.xcassets/first.imageset/first.pdf differ diff --git a/EmojiMe/Assets.xcassets/second.imageset/Contents.json b/EmojiMe/Assets.xcassets/second.imageset/Contents.json new file mode 100644 index 0000000..03bd9c9 --- /dev/null +++ b/EmojiMe/Assets.xcassets/second.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/EmojiMe/Assets.xcassets/second.imageset/second.pdf b/EmojiMe/Assets.xcassets/second.imageset/second.pdf new file mode 100644 index 0000000..401614e Binary files /dev/null and b/EmojiMe/Assets.xcassets/second.imageset/second.pdf differ diff --git a/APIClient/Base.lproj/LaunchScreen.storyboard b/EmojiMe/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from APIClient/Base.lproj/LaunchScreen.storyboard rename to EmojiMe/Base.lproj/LaunchScreen.storyboard diff --git a/EmojiMe/Base.lproj/Main.storyboard b/EmojiMe/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b7964a9 --- /dev/null +++ b/EmojiMe/Base.lproj/Main.storyboard @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/APIClient/Info.plist b/EmojiMe/Info.plist similarity index 87% rename from APIClient/Info.plist rename to EmojiMe/Info.plist index 40c6215..f1877d8 100644 --- a/APIClient/Info.plist +++ b/EmojiMe/Info.plist @@ -30,11 +30,19 @@ armv7 + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad diff --git a/EmojiMe/SecondViewController.swift b/EmojiMe/SecondViewController.swift new file mode 100644 index 0000000..577d963 --- /dev/null +++ b/EmojiMe/SecondViewController.swift @@ -0,0 +1,436 @@ +// +// SecondViewController.swift +// EmojiMe +// +// Created by Max Simon on 23.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import UIKit +import Moya +import Freddy + + +// Main ViewController +class MainViewControlloer: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { + // Image-View + @IBOutlet var pictureImageView: UIImageView! + + // Provider für API-Abfrage + let MicrosoftProvider = MoyaProvider(endpointClosure: endPointWithAuthentification) + + // speichert alle erkannten Personen im Bild + // bei Änderungen: Bild updaten + var detectedPersons: [Person]? { + didSet { + drawSmileys() + } + } + + // speichert, welches Element aus detectedPersons editiert werden soll + var editOn: Int? { + didSet { + drawSmileys() + if self.editOn != nil { + self.setTitleToSwipeDescription() + } + } + } + + // speichert Augangsbild + var originalImage: UIImage? + + // speichert alle möglichen Emotionen + let possibleEmotions: [Emotion] = Emotion.allValues + + + // Hintergrund für Start + let bestOfSmileys = ["🤗", "🙊", "👻", "💁", "😈"] + let sizeOfStartSmileys: CGFloat = 90 + + + + // Setzt Title + func resetTitle() { + self.title = "EmojiMe" + } + func setTitleToLoading() { + let loadingTexts: [String] = ["🤔 thinking...", "🕵 let me look...", "Look @ 🦄 while waiting", "👀 just looking..."] + let whichLoadingTextNow = Int(arc4random_uniform(UInt32(loadingTexts.count))) + self.title = loadingTexts[whichLoadingTextNow] + } + func setTitleToError() { + self.title = "Error 😩" + NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(self.resetTitle), userInfo: nil, repeats: false) + } + func setTitleToSwipeDescription() { + self.title = "Swipe to change Smiley 😼" + NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(self.resetTitle), userInfo: nil, repeats: false) + } + + + + + // Speichert aktuelles Photo und zeigt Status an + @IBAction func save(sender: AnyObject) { + // Edit verwerfen + self.editOn = nil + + guard let renderedPicture = self.pictureImageView.image else {return } + // Sharing is caring + let activityViewController = UIActivityViewController(activityItems: [ renderedPicture ], applicationActivities: nil) + self.presentViewController(activityViewController, animated: true, completion: nil) + + self.title = "Published 💁" + NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(self.resetTitle), userInfo: nil, repeats: false) + } + + // Erlaubt, Bild auszuwählen + @IBAction func choosePhotoButtonTapped(sender: AnyObject) { + + let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) + if UIImagePickerController.isSourceTypeAvailable(.Camera) { + alertController.addAction(UIAlertAction(title: "Camera", style: .Default, handler: { action in + self.presentImagePickerWithSourceType(.Camera) + })) + } + if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) { + alertController.addAction(UIAlertAction(title: "Choose from library", style: .Default, handler: { action in + self.presentImagePickerWithSourceType(.PhotoLibrary) + })) + } + alertController.addAction(UIAlertAction(title: "Abbrechen", style: .Cancel, handler: nil)) + self.presentViewController(alertController, animated: true, completion: nil) + } + private func presentImagePickerWithSourceType(sourceType: UIImagePickerControllerSourceType) { + let imagePicker = UIImagePickerController() + imagePicker.sourceType = sourceType + imagePicker.delegate = self + self.presentViewController(imagePicker, animated: true, completion: nil) + } + // lässt ImagePicker wieder verschwinden 🙌 + func imagePickerControllerDidCancel(picker: UIImagePickerController) { + dismissViewControllerAnimated(true, completion: nil) + } + + + // Bild löschen + @IBAction func deleteImage(sender: AnyObject) { + if pictureImageView.image == nil { + return + } + pictureImageView.image = nil + detectedPersons = nil + self.title = "Okay 🖕" + NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(self.resetTitle), userInfo: nil, repeats: false) + changeBackground() + } + + + // lädt Bild in App und handelt API-Abfrage + func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { + if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { + + self.originalImage = pickedImage + + clearSubviews() + pictureImageView.contentMode = .ScaleAspectFit + pictureImageView.image = pickedImage + } + + dismissViewControllerAnimated(true, completion: nil) + + // startet API-Abfrage + setTitleToLoading() + askMicrosoftWithAPlease() + + } + + + // versucht JSON-Abfrage in Struct Person umzuwandeln + func mapUsThePersons(data: JSON, faces: [Rectangle]?) { + do { + var newPersons = try data.array().map(Person.init) + + // Ordne Personen Gesichter zu + if faces != nil { + var PersonsWithEyes: [Person] = [] + for var person in newPersons { + var PersonWithEyes = faces!.filter({$0 == person.faceRectangle}) + if PersonWithEyes.count == 1 { + person.leftEye = PersonWithEyes[0].leftEye + person.rightEye = PersonWithEyes[0].rightEye + } + PersonsWithEyes.append(person) + } + newPersons = PersonsWithEyes + } + + detectedPersons = newPersons + } + catch { + self.setTitleToError() + NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(self.resetTitle), userInfo: nil, repeats: false) + detectedPersons = nil + } + } + + // API-Abfrage und so + func askMicrosoftWithAPlease() { + if let image = pictureImageView.image { + // normale Facedetection + MicrosoftProvider.request(.faceDetection(image), completion: { result in + switch result { + case .Success(let response): + do { + let json = try JSON(data: response.data) + let faces = try json.array().map(Rectangle.init) + + // Emotion-Detection mit bereits getaner Face-Detection + self.MicrosoftProvider.request(.faceEmotion(image, faces), completion: { result in + switch result { + case .Success(let response): + do { + let jsonEmotion = try JSON(data: response.data) + self.mapUsThePersons(jsonEmotion, faces: faces) + + } + catch { + print("was not able to parse emotions") + self.setTitleToError() + } + case .Failure(let error): + self.setTitleToError() + print(error) + } + }) + + } catch { + print("was not able to parse faces") + self.setTitleToError() + } + case .Failure(let error): + self.setTitleToError() + print(error) + } + }) + + } + else { + self.setTitleToError() + } + + } + + + + + // Malt Smileys aufs Bild + func drawSmileys() { + + guard let image = self.originalImage else {return } + UIGraphicsBeginImageContext(image.size) + image.drawInRect(CGRectMake(0, 0, image.size.width, image.size.height)) + + let context = UIGraphicsGetCurrentContext() + + guard let persons = detectedPersons else { return } + + var width: CGFloat + var x: CGFloat + var y: CGFloat + + + for i in 0 ... persons.count - 1 { + + CGContextSaveGState(context) + + let person = persons[i] + + if person.leftEye != CGPointZero { // Falls das mit den Augen gesetzt ist, drehe Koordinatensystem + let eyewidth = sqrt(pow(person.rightEye.x - person.leftEye.x, 2) + pow(person.rightEye.y - person.leftEye.y, 2)) + width = eyewidth/(person.compositedEmotion.eyes.right - person.compositedEmotion.eyes.left) + + + + //let x_center = + let x_center = CGFloat(0) + //let y_center = + let y_center = CGFloat(0) + + let angle = atan2(person.rightEye.y - person.leftEye.y, person.rightEye.x - person.leftEye.x) + //let angle = CGFloat(0) + + CGContextTranslateCTM(context, x_center, y_center) + CGContextRotateCTM(context, angle) + + let newXOfLeftEye = person.leftEye.x*cos(angle) + person.leftEye.y*sin(angle) + let newYOfLeftEye = -person.leftEye.x*sin(angle) + person.leftEye.y*cos(angle) + + x = CGFloat(newXOfLeftEye - person.compositedEmotion.eyes.left*width) + y = CGFloat(newYOfLeftEye - person.compositedEmotion.eyes.top*width) + + + } + else { // Dann versuchen irgendwie noch zu retten :D + x = CGFloat(person.faceRectangle.left) + y = CGFloat(person.faceRectangle.top) + + width = CGFloat(person.faceRectangle.width) + + // Korrekturen + x -= width/4 + y -= width/4 + width *= 1.5 + } + + var rect: CGRect = CGRectMake(x, y, width , width) + + + if i == self.editOn { + UIColor.blueColor().setFill() + UIRectFill(rect) + } + + let textFontAttributes = [NSFontAttributeName: UIFont(name: "Helvetica Bold", size: width)!] + person.compositedEmotion.description.drawInRect(rect, withAttributes: textFontAttributes) + + + CGContextRestoreGState(context) + + } + var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() + + UIGraphicsEndImageContext() + + pictureImageView.image = newImage + + + self.resetTitle() + + } + + + // Action-Handler für Taps + @IBAction func handleTaps(gestureRecognizer: UIGestureRecognizer) { + guard let image = self.pictureImageView.image else { return } + + // Korrigierungen (auf Bildkoordinaten umrechnen) + // nehme an, das Bild wird immer in die Mitte gesetzt + let imageViewSize = self.pictureImageView.bounds.size + let imageSize = image.size + let scaleFactor = imageSize.width / imageViewSize.width + let distFromTop = (imageViewSize.height - imageSize.height/scaleFactor)/2 + + let tapPoint = gestureRecognizer.locationInView(self.pictureImageView) + let x = Int(tapPoint.x * scaleFactor) + let y = Int((tapPoint.y - distFromTop) * scaleFactor) + + + if var persons = self.detectedPersons { + var person = persons.filter({$0.faceRectangle.contains(x, y: y)}) // suche nach angetippten Gesicht + + + if person.count > 0 { + // setze Edit auf gefundene Person + if self.editOn != persons.indexOf(person[0]) { + self.editOn = persons.indexOf(person[0]) + } + else { + self.editOn = nil + } + + + } + + } + } + + + // Action-Handler für Swipes + @IBAction func handleSwipes(gestureRecognizer: UISwipeGestureRecognizer) { + // Falls irgendwas nicht gesetzt + if self.detectedPersons == nil || self.editOn == nil { + return + } + // Falls Hier irgendwann noch mehr Gesten kommen + if gestureRecognizer.direction == .Up || gestureRecognizer.direction == .Down { + return + } + + + guard let index = self.possibleEmotions.indexOf(self.detectedPersons![self.editOn!].compositedEmotion) else { return } + var nextIndex: Int + if gestureRecognizer.direction == .Left { + nextIndex = (index == 0) ? self.possibleEmotions.count - 1 : index - 1 + } + else { + nextIndex = (index == self.possibleEmotions.count - 1) ? 0 : index + 1 + } + // Smiley durchwechseln. + self.detectedPersons![self.editOn!].compositedEmotion = self.possibleEmotions[nextIndex] + + } + + // löscht alle Subviews (Smileys vom Startbildschirm entfernen + func clearSubviews() { + for view in self.view.subviews { + view.removeFromSuperview() + } + } + + + // selfdocumenting + func changeBackground() { + + clearSubviews() + + let screenSize = UIScreen.mainScreen().bounds.size + let randomInt = Int(arc4random_uniform(UInt32(bestOfSmileys.count))) + + UIGraphicsBeginImageContext(screenSize) + let x = 0.5*screenSize.width - 0.5*sizeOfStartSmileys + let y = 0.5*screenSize.height - 0.5*sizeOfStartSmileys + var rect: CGRect = CGRectMake(x, y, 2*sizeOfStartSmileys, 2*sizeOfStartSmileys) + let textFontAttributes = [NSFontAttributeName: UIFont(name: "Helvetica Bold", size: sizeOfStartSmileys)!] + bestOfSmileys[randomInt].drawInRect(rect, withAttributes: textFontAttributes) + var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() + self.view.addSubview(UIImageView(image: newImage)) + } + + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + self.view.backgroundColor = UIColor.whiteColor() + changeBackground() + + + + // Taps- und Swipes registrieren + self.view.userInteractionEnabled = true + + + let selectorTap: Selector = "handleTaps:" + let gestureRecognizer = UITapGestureRecognizer(target: self, action: selectorTap) + self.pictureImageView.addGestureRecognizer(gestureRecognizer) + + let selectSwipe: Selector = "handleSwipes:" + let swipeRecognizerLeft = UISwipeGestureRecognizer(target: self, action: selectSwipe) + swipeRecognizerLeft.direction = .Left + self.pictureImageView.addGestureRecognizer(swipeRecognizerLeft) + let swipeRecognizerRight = UISwipeGestureRecognizer(target: self, action: selectSwipe) + swipeRecognizerRight.direction = .Right + self.pictureImageView.addGestureRecognizer(swipeRecognizerRight) + + + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/EmojiMe/apihandler.swift b/EmojiMe/apihandler.swift new file mode 100644 index 0000000..9c54923 --- /dev/null +++ b/EmojiMe/apihandler.swift @@ -0,0 +1,132 @@ +// +// apihandler.swift +// EmojiMe +// +// Created by Max Simon on 23.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import Moya +import Freddy +import Alamofire + + +enum MicrosoftFaces: TargetType { + + case faceDetection(UIImage) // für spätere genauere Anpassung der Smileys andie Gesichter + case faceEmotion(UIImage, [Rectangle]?) + + var baseURL: NSURL { + return NSURL(string: "https://api.projectoxford.ai")! + } + var path:String { + switch self { + case .faceDetection: + return "/face/v1.0/detect" + case .faceEmotion: + return "/emotion/v1.0/recognize" + default: + "" + } + } + + var authKey: String { + switch self { + case .faceDetection: + return "9e917e2aa3f14a00a4efd3241e799e79" + case .faceEmotion: + return "ce1e2a4c646b436d99de5c07edc5e98e" + default: + return "" + } + } + + + var parameters: [String : AnyObject]? { + switch self { + case .faceDetection(let image): + guard let imageData = getJPEGSmallerThan(image, maxSizeInMB: 0.3) else { + return nil + } + return ["body": imageData, "returnFaceLandmarks": "true"] + case .faceEmotion(let image, let rectangles): + guard let imageData = getJPEGSmallerThan(image, maxSizeInMB: 0.3) else { + return nil + } + guard let faceRectangles = rectangles else { return ["body": imageData]} + + return ["body": imageData, "faceRectangles": faceRectangles.map({$0.description}).joinWithSeparator(";")] + + + default: + return nil + + } + } + var method: Moya.Method { + return .POST + } + + var sampleData: NSData { + return NSData() + } + +} + + +// Kompression anpassen, da Upload-Größe begrenzt +func getJPEGSmallerThan(image: UIImage, maxSizeInMB: Float) -> NSData? { + let maxFilesize = maxSizeInMB * 1000 * 1024 + var startCompression: CGFloat = 1 + + var imageData = UIImageJPEGRepresentation(image, startCompression) + + while imageData?.length > Int(maxFilesize) && startCompression >= 0 { + startCompression -= 0.1 + if startCompression == 0 { + imageData = nil + } + imageData = UIImageJPEGRepresentation(image, startCompression) + } + return imageData + +} + + +// eigener Endpoint, da Authentifikation und Bild +let endPointWithAuthentification = {(target: MicrosoftFaces) -> Endpoint in + + let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString + let parameterEncodingPic = Moya.ParameterEncoding.Custom({ requestConvertible, parameters in + let urlRequest = requestConvertible.URLRequest.mutableCopy() as! NSMutableURLRequest + + guard var parameters = parameters else {return (urlRequest, nil)} + + if let body = parameters["body"] as? NSData { + urlRequest.HTTPBody = body + parameters.removeValueForKey("body") + } + + let urlEncodedParameters = parameters.flatMap { key, value in + return key + "=" + (value as! String) + }.joinWithSeparator("&") + + urlRequest.URL = NSURL(string: urlRequest.URL!.absoluteString + (urlEncodedParameters.isEmpty ? "" : "?") + urlEncodedParameters) + + + return (urlRequest, nil) + }) + + let endpoint: Endpoint = Endpoint( + URL: url, + sampleResponseClosure: { .NetworkResponse(200, target.sampleData) }, + method: target.method, + parameters: target.parameters, + parameterEncoding: parameterEncodingPic + ) + + return endpoint.endpointByAddingHTTPHeaderFields([ + "Ocp-Apim-Subscription-Key": target.authKey, + "Content-Type": "application/octet-stream", + ]) +} diff --git a/EmojiMe/calculateEmojis.swift b/EmojiMe/calculateEmojis.swift new file mode 100644 index 0000000..507cc28 --- /dev/null +++ b/EmojiMe/calculateEmojis.swift @@ -0,0 +1,208 @@ +// +// calculateEmojis.swift +// EmojiMe +// +// Created by Max Simon on 24.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import UIKit +import Freddy + + +// Verfügbare Emotionen +enum Emotion { + case Angry, Contemptuous, Disgusted, Afraid, Happy, Neutral, Sad, Surprised + + // So noch hinzugefügt + case Swipe1, Swipe2, Swipe3, Swipe4, Swipe5, Swipe6, Swipe7, Swipe8, Swipe9, Swipe10 + + static let allValues = [Angry, Contemptuous, Disgusted, Afraid, Happy, Neutral, Sad, Surprised, Swipe1, Swipe2, Swipe3, Swipe4, Swipe5, Swipe6, Swipe7, Swipe8, Swipe9, Swipe10] + + var description: String { + switch self { + case .Angry: + return "😠" + case .Contemptuous: + return "😤" + case .Disgusted: + return "😣" + case .Afraid: + return "😥" + case .Happy: + return "😊" + case .Neutral: + return "😑" + case .Sad: + return "😞" + case .Surprised: + return "😳" + + + case .Swipe1: + return "😷" + case .Swipe2: + return "😭" + case .Swipe3: + return "😂" + case .Swipe4: + return "😎" + case .Swipe5: + return "🙄" + case .Swipe6: + return "🤔" + case .Swipe7: + return "😽" + case .Swipe8: + return "😻" + case .Swipe9: + return "😝" + case .Swipe10: + return "😶" + + default: + return "" + } + } + // Abstände in Prozent + var eyes: (left: CGFloat, right: CGFloat, top: CGFloat) { + // Hier könnte man mit nem Switch verschiedene Größen für die Smileys definieren + return (0.33, 0.67, 0.4) + } +} + +// struct Person +struct Person: Equatable, Hashable { + var faceRectangle: Rectangle + + var leftEye: CGPoint = CGPointZero + var rightEye: CGPoint = CGPointZero + + + var scores: [Emotion: Double] = [:] + var compositedEmotion: Emotion + + // Könnte man für bessere Zuordnung mal gebrauchen + var hashValue: Int { + return faceRectangle.hashValue + } + +} +func ==(lhs: Person, rhs: Person) -> Bool { + if lhs.faceRectangle == rhs.faceRectangle { + return true + } else { + return false + } +} + + +// Init für Freddy-Aufruf --> JSON-Daten auf Person anpassen +extension Person: JSONDecodable { + public init(json: JSON) throws { + let top = try json.int("faceRectangle", "top") + let left = try json.int("faceRectangle", "left") + let width = try json.int("faceRectangle", "width") + let height = try json.int("faceRectangle", "width") + + let faceRectangle = Rectangle(left: left, top: top, width: width, height: height) + self.faceRectangle = faceRectangle + + + // Emotionen, auf die ich prüfen will + let disgust = try json.double("scores", "disgust") + self.scores[.Disgusted] = disgust + let happiness = try json.double("scores", "happiness") + self.scores[.Happy] = happiness + let sadness = try json.double("scores", "sadness") + self.scores[.Sad] = sadness + let surprise = try json.double("scores", "surprise") + self.scores[.Surprised] = surprise + let contempt = try json.double("scores", "contempt") + self.scores[.Contemptuous] = contempt + let anger = try json.double("scores", "anger") + self.scores[.Angry] = anger + let neutral = try json.double("scores", "neutral") + self.scores[.Neutral] = neutral + let fear = try json.double("scores", "fear") + self.scores[.Afraid] = fear + + + // Setze daraus Emotion zusammen + // -> nur Implementierung der Abgefragten, aber einfach auf zusammengesetzte oder entgegengesetzte übertragbar + (self.compositedEmotion, _) = self.scores.maxElement { + $0.1 < $1.1 + }! + + } + +} + +struct Rectangle: Equatable, Hashable { + let left: Int + let top: Int + let width: Int + let height: Int + // Für Winkelbestimmung + var leftEye: CGPoint = CGPointZero + var rightEye: CGPoint = CGPointZero + + var description: String { + return "\(left),\(top),\(width),\(height)" + } + + // Hashable + var hashValue: Int { + get { + return "\(left)\(top)\(width)\(height)".hashValue + } + } + + init(left: Int, top: Int, width: Int, height: Int) { + self.left = left + self.top = top + self.width = width + self.height = height + } + func contains(x: Int, y: Int) -> Bool { + if x >= self.left && x <= self.left + self.width && y >= self.top && y <= self.top + self.height { + return true + } + else { + return false + } + } +} +func ==(lhs: Rectangle, rhs: Rectangle) -> Bool { + let maxDiff = 10 + if abs(lhs.left - rhs.left) < maxDiff && abs(lhs.top - rhs.top) < maxDiff && abs(lhs.width - rhs.width) < maxDiff && abs(lhs.height - rhs.height) < maxDiff { + return true + } else { + return false + } +} +extension Rectangle: JSONDecodable { + public init(json: JSON) throws { + let left = try json.int("faceRectangle", "left") + self.left = left + let top = try json.int("faceRectangle", "top") + self.top = top + let width = try json.int("faceRectangle", "width") + self.width = width + let height = try json.int("faceRectangle", "height") + self.height = height + + let leftEyeX = try json.double("faceLandmarks", "pupilLeft", "x") + let leftEyeY = try json.double("faceLandmarks", "pupilLeft", "y") + let rightEyeX = try json.double("faceLandmarks", "pupilRight", "x") + let rightEyeY = try json.double("faceLandmarks", "pupilRight", "y") + + + self.leftEye = CGPoint(x: leftEyeX, y: leftEyeY) + self.rightEye = CGPoint(x: rightEyeX, y: rightEyeY) + + + } +} + + diff --git a/EmojiMeTests/EmojiMeTests.swift b/EmojiMeTests/EmojiMeTests.swift new file mode 100644 index 0000000..87ed89f --- /dev/null +++ b/EmojiMeTests/EmojiMeTests.swift @@ -0,0 +1,36 @@ +// +// EmojiMeTests.swift +// EmojiMeTests +// +// Created by Max Simon on 23.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import XCTest +@testable import EmojiMe + +class EmojiMeTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/EmojiMeTests/Info.plist b/EmojiMeTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/EmojiMeTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/EmojiMeUITests/EmojiMeUITests.swift b/EmojiMeUITests/EmojiMeUITests.swift new file mode 100644 index 0000000..1585d35 --- /dev/null +++ b/EmojiMeUITests/EmojiMeUITests.swift @@ -0,0 +1,36 @@ +// +// EmojiMeUITests.swift +// EmojiMeUITests +// +// Created by Max Simon on 23.05.16. +// Copyright © 2016 Max Simon. All rights reserved. +// + +import XCTest + +class EmojiMeUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/EmojiMeUITests/Info.plist b/EmojiMeUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/EmojiMeUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Podfile b/Podfile index 9f9e096..61e09c1 100644 --- a/Podfile +++ b/Podfile @@ -1,9 +1,22 @@ +# Uncomment this line to define a global platform for your project platform :ios, '9.0' -use_frameworks! -pod 'Moya' -pod 'Freddy' -pod 'AlamofireImage' -pod 'AwesomeCache' +target 'EmojiMe' do + # Comment this line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! -target 'APIClient' + # Pods for EmojiMe + pod 'Freddy' + pod 'Moya' + + target 'EmojiMeTests' do + inherit! :search_paths + # Pods for testing + end + + target 'EmojiMeUITests' do + inherit! :search_paths + # Pods for testing + end + +end diff --git a/Podfile.lock b/Podfile.lock index 12e9002..6d39c4c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,8 +1,5 @@ PODS: - - Alamofire (3.3.1) - - AlamofireImage (2.4.0): - - Alamofire (~> 3.3) - - AwesomeCache (2.0) + - Alamofire (3.4.0) - Freddy (2.1.0) - Moya (6.4.0): - Moya/Core (= 6.4.0) @@ -12,19 +9,15 @@ PODS: - Result (2.0.0) DEPENDENCIES: - - AlamofireImage - - AwesomeCache - Freddy - Moya SPEC CHECKSUMS: - Alamofire: 369bc67b6f5ac33ded3648d7bd21c5bfb91c2ecc - AlamofireImage: 87408b652e0f5ae5fe364035f15aea8b9b24c77e - AwesomeCache: 5d6839ad139cdcee3c3a067f6fc1849523867dd9 + Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee Freddy: bbdca013977db29638b24baf6572ce94452bec29 Moya: 4d526954c8afd79820991393d40d7d8af756ceee Result: 9e75e1111c774c6ac594e14907b15057053a7959 -PODFILE CHECKSUM: c0e9678427a45e8df8c132e9f4426049c863138d +PODFILE CHECKSUM: 3b502932c5e25877f9f15bb94fbdefb1b635e64d COCOAPODS: 1.0.0 diff --git a/Pods/Alamofire/LICENSE b/Pods/Alamofire/LICENSE index bf300e4..4cfbf72 100644 --- a/Pods/Alamofire/LICENSE +++ b/Pods/Alamofire/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Alamofire/README.md b/Pods/Alamofire/README.md index ebc35db..68e54e9 100644 --- a/Pods/Alamofire/README.md +++ b/Pods/Alamofire/README.md @@ -32,7 +32,7 @@ In order to keep Alamofire focused specifically on core networking implementatio ## Requirements - iOS 8.0+ / Mac OS X 10.9+ / tvOS 9.0+ / watchOS 2.0+ -- Xcode 7.2+ +- Xcode 7.3+ ## Migration Guides @@ -67,10 +67,10 @@ To integrate Alamofire into your Xcode project using CocoaPods, specify it in yo ```ruby source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '8.0' +platform :ios, '9.0' use_frameworks! -pod 'Alamofire', '~> 3.0' +pod 'Alamofire', '~> 3.4' ``` Then, run the following command: @@ -93,7 +93,7 @@ $ brew install carthage To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: ```ogdl -github "Alamofire/Alamofire" ~> 3.0 +github "Alamofire/Alamofire" ~> 3.4 ``` Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project. @@ -168,6 +168,38 @@ Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) > Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) is specified to handle the response once it's received. The result of a request is only available inside the scope of a response handler. Any execution contingent on the response or data received from the server must be done within a handler. +### Validation + +By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type. + +#### Manual Validation + +```swift +Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) + .validate(statusCode: 200..<300) + .validate(contentType: ["application/json"]) + .response { response in + print(response) + } +``` + +#### Automatic Validation + +Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided. + +```swift +Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) + .validate() + .responseJSON { response in + switch response.result { + case .Success: + print("Validation Successful") + case .Failure(let error): + print(error) + } + } +``` + ### Response Serialization **Built-in Response Methods** @@ -182,6 +214,7 @@ Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) ```swift Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) + .validate() .response { request, response, data, error in print(request) print(response) @@ -196,6 +229,7 @@ Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) ```swift Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) + .validate() .responseData { response in print(response.request) print(response.response) @@ -207,6 +241,7 @@ Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) ```swift Alamofire.request(.GET, "https://httpbin.org/get") + .validate() .responseString { response in print("Success: \(response.result.isSuccess)") print("Response String: \(response.result.value)") @@ -217,6 +252,7 @@ Alamofire.request(.GET, "https://httpbin.org/get") ```swift Alamofire.request(.GET, "https://httpbin.org/get") + .validate() .responseJSON { response in debugPrint(response) } @@ -228,6 +264,7 @@ Response handlers can even be chained: ```swift Alamofire.request(.GET, "https://httpbin.org/get") + .validate() .responseString { response in print("Response String: \(response.result.value)") } @@ -339,7 +376,7 @@ Adding a custom HTTP header to a `Request` is supported directly in the global ` ```swift let headers = [ "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", - "Content-Type": "application/x-www-form-urlencoded" + "Accept": "application/json" ] Alamofire.request(.GET, "https://httpbin.org/get", headers: headers) @@ -381,6 +418,7 @@ Alamofire.upload(.POST, "https://httpbin.org/post", file: fileURL) print("Total bytes written on main queue: \(totalBytesWritten)") } } + .validate() .responseJSON { response in debugPrint(response) } @@ -547,38 +585,6 @@ Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)") } ``` -### Validation - -By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type. - -#### Manual Validation - -```swift -Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) - .validate(statusCode: 200..<300) - .validate(contentType: ["application/json"]) - .response { response in - print(response) - } -``` - -#### Automatic Validation - -Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided. - -```swift -Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) - .validate() - .responseJSON { response in - switch response.result { - case .Success: - print("Validation Successful") - case .Failure(let error): - print(error) - } - } -``` - ### Timeline Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on a `Response`. @@ -1023,6 +1029,74 @@ enum Router: URLRequestConvertible { Alamofire.request(Router.ReadUser("mattt")) // GET /users/mattt ``` +### SessionDelegate + +By default, an Alamofire `Manager` instance creates an internal `SessionDelegate` object to handle all the various types of delegate callbacks that are generated by the underlying `NSURLSession`. The implementations of each delegate method handle the most common use cases for these types of calls abstracting the complexity away from the top-level APIs. However, advanced users may find the need to override the default functionality for various reasons. + +#### Override Closures + +The first way to customize the `SessionDelegate` behavior is through the use of the override closures. Each closure gives you the ability to override the implementation of the matching `SessionDelegate` API, yet still use the default implementation for all other APIs. This makes it easy to customize subsets of the delegate functionality. Here are a few examples of some of the override closures available: + +```swift +/// Overrides default behavior for NSURLSessionDelegate method `URLSession:didReceiveChallenge:completionHandler:`. +public var sessionDidReceiveChallenge: ((NSURLSession, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))? + +/// Overrides default behavior for NSURLSessionDelegate method `URLSessionDidFinishEventsForBackgroundURLSession:`. +public var sessionDidFinishEventsForBackgroundURLSession: ((NSURLSession) -> Void)? + +/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:`. +public var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)? + +/// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:willCacheResponse:completionHandler:`. +public var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse?)? +``` + +The following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains. + +```swift +let delegate: Alamofire.Manager.SessionDelegate = manager.delegate + +delegate.taskWillPerformHTTPRedirection = { session, task, response, request in + var finalRequest = request + + if let originalRequest = task.originalRequest where originalRequest.URLString.containsString("apple.com") { + finalRequest = originalRequest + } + + return finalRequest +} +``` + +#### Subclassing + +Another way to override the default implementation of the `SessionDelegate` is to subclass it. Subclassing allows you completely customize the behavior of the API or to create a proxy for the API and still use the default implementation. Creating a proxy allows you to log events, emit notifications, provide pre and post hook implementations, etc. Here's a quick example of subclassing the `SessionDelegate` and logging a message when a redirect occurs. + +```swift +class LoggingSessionDelegate: Manager.SessionDelegate { + override func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + willPerformHTTPRedirection response: NSHTTPURLResponse, + newRequest request: NSURLRequest, + completionHandler: NSURLRequest? -> Void) + { + print("URLSession will perform HTTP redirection to request: \(request)") + + super.URLSession( + session, + task: task, + willPerformHTTPRedirection: response, + newRequest: request, + completionHandler: completionHandler + ) + } +} +``` + +Generally, either the default implementation or the override closures should provide the necessary functionality required. Subclassing should only be used as a last resort. + +> It is important to keep in mind that the `subdelegates` are initialized and destroyed in the default implementation. Be careful when subclassing to not introduce memory leaks. + ### Security Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`. @@ -1101,7 +1175,7 @@ The `.PerformDefaultEvaluation`, `.PinCertificates` and `.PinPublicKeys` server #### Validating the Certificate Chain -Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certficates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check. +Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certificates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check. There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server. @@ -1163,7 +1237,7 @@ There are some important things to remember when using network reachability to d * When Reachability is restored, use the event to retry failed network requests. * Even though the network requests may still fail, this is a good moment to retry them. * The network reachability status can be useful for determining why a network request may have failed. - * If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical errror, such as "request timed out." + * If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical error, such as "request timed out." > It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info. diff --git a/Pods/Alamofire/Source/Alamofire.swift b/Pods/Alamofire/Source/Alamofire.swift index b866f42..cb4b36a 100644 --- a/Pods/Alamofire/Source/Alamofire.swift +++ b/Pods/Alamofire/Source/Alamofire.swift @@ -1,24 +1,26 @@ -// Alamofire.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Alamofire.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Download.swift b/Pods/Alamofire/Source/Download.swift index 2ebe40f..97b146f 100644 --- a/Pods/Alamofire/Source/Download.swift +++ b/Pods/Alamofire/Source/Download.swift @@ -1,24 +1,26 @@ -// Download.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Download.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Error.swift b/Pods/Alamofire/Source/Error.swift index 7a813f1..467d99c 100644 --- a/Pods/Alamofire/Source/Error.swift +++ b/Pods/Alamofire/Source/Error.swift @@ -1,24 +1,26 @@ -// Error.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Error.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -39,6 +41,15 @@ public struct Error { case PropertyListSerializationFailed = -6007 } + /// Custom keys contained within certain NSError `userInfo` dictionaries generated by Alamofire. + public struct UserInfoKeys { + /// The content type user info key for a `.ContentTypeValidationFailed` error stored as a `String` value. + public static let ContentType = "ContentType" + + /// The status code user info key for a `.StatusCodeValidationFailed` error stored as an `Int` value. + public static let StatusCode = "StatusCode" + } + /** Creates an `NSError` with the given error code and failure reason. @@ -47,6 +58,7 @@ public struct Error { - returns: An `NSError` with the given error code and failure reason. */ + @available(*, deprecated=3.4.0) public static func errorWithCode(code: Code, failureReason: String) -> NSError { return errorWithCode(code.rawValue, failureReason: failureReason) } @@ -59,8 +71,18 @@ public struct Error { - returns: An `NSError` with the given error code and failure reason. */ + @available(*, deprecated=3.4.0) public static func errorWithCode(code: Int, failureReason: String) -> NSError { let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason] return NSError(domain: Domain, code: code, userInfo: userInfo) } + + static func error(domain domain: String = Error.Domain, code: Code, failureReason: String) -> NSError { + return error(domain: domain, code: code.rawValue, failureReason: failureReason) + } + + static func error(domain domain: String = Error.Domain, code: Int, failureReason: String) -> NSError { + let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason] + return NSError(domain: domain, code: code, userInfo: userInfo) + } } diff --git a/Pods/Alamofire/Source/Manager.swift b/Pods/Alamofire/Source/Manager.swift index 319f846..7b5f888 100644 --- a/Pods/Alamofire/Source/Manager.swift +++ b/Pods/Alamofire/Source/Manager.swift @@ -1,24 +1,26 @@ -// Manager.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Manager.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -143,11 +145,11 @@ public class Manager { delegate: SessionDelegate, serverTrustPolicyManager: ServerTrustPolicyManager? = nil) { + guard delegate === session.delegate else { return nil } + self.delegate = delegate self.session = session - guard delegate === session.delegate else { return nil } - commonInit(serverTrustPolicyManager: serverTrustPolicyManager) } @@ -218,18 +220,18 @@ public class Manager { /** Responsible for handling all delegate callbacks for the underlying session. */ - public final class SessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate { + public class SessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate { private var subdelegates: [Int: Request.TaskDelegate] = [:] private let subdelegateQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT) - subscript(task: NSURLSessionTask) -> Request.TaskDelegate? { + /// Access the task delegate for the specified task in a thread-safe manner. + public subscript(task: NSURLSessionTask) -> Request.TaskDelegate? { get { var subdelegate: Request.TaskDelegate? dispatch_sync(subdelegateQueue) { subdelegate = self.subdelegates[task.taskIdentifier] } return subdelegate } - set { dispatch_barrier_async(subdelegateQueue) { self.subdelegates[task.taskIdentifier] = newValue } } diff --git a/Pods/Alamofire/Source/MultipartFormData.swift b/Pods/Alamofire/Source/MultipartFormData.swift index 2829f94..b4087ec 100644 --- a/Pods/Alamofire/Source/MultipartFormData.swift +++ b/Pods/Alamofire/Source/MultipartFormData.swift @@ -1,24 +1,26 @@ -// MultipartFormData.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// MultipartFormData.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -217,7 +219,7 @@ public class MultipartFormData { appendBodyPart(fileURL: fileURL, name: name, fileName: fileName, mimeType: mimeType) } else { let failureReason = "Failed to extract the fileName of the provided URL: \(fileURL)" - setBodyPartError(Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)) + setBodyPartError(code: NSURLErrorBadURL, failureReason: failureReason) } } @@ -245,8 +247,7 @@ public class MultipartFormData { guard fileURL.fileURL else { let failureReason = "The file URL does not point to a file URL: \(fileURL)" - let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) - setBodyPartError(error) + setBodyPartError(code: NSURLErrorBadURL, failureReason: failureReason) return } @@ -261,8 +262,7 @@ public class MultipartFormData { } guard isReachable else { - let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: "The file URL is not reachable: \(fileURL)") - setBodyPartError(error) + setBodyPartError(code: NSURLErrorBadURL, failureReason: "The file URL is not reachable: \(fileURL)") return } @@ -277,8 +277,7 @@ public class MultipartFormData { where NSFileManager.defaultManager().fileExistsAtPath(path, isDirectory: &isDirectory) && !isDirectory else { let failureReason = "The file URL is a directory, not a file: \(fileURL)" - let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) - setBodyPartError(error) + setBodyPartError(code: NSURLErrorBadURL, failureReason: failureReason) return } @@ -301,8 +300,7 @@ public class MultipartFormData { guard let length = bodyContentLength else { let failureReason = "Could not fetch attributes from the file URL: \(fileURL)" - let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) - setBodyPartError(error) + setBodyPartError(code: NSURLErrorBadURL, failureReason: failureReason) return } @@ -312,8 +310,7 @@ public class MultipartFormData { guard let stream = NSInputStream(URL: fileURL) else { let failureReason = "Failed to create an input stream from the file URL: \(fileURL)" - let error = Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason) - setBodyPartError(error) + setBodyPartError(code: NSURLErrorCannotOpenFile, failureReason: failureReason) return } @@ -413,10 +410,10 @@ public class MultipartFormData { if let path = fileURL.path where NSFileManager.defaultManager().fileExistsAtPath(path) { let failureReason = "A file already exists at the given file URL: \(fileURL)" - throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + throw Error.error(domain: NSURLErrorDomain, code: NSURLErrorBadURL, failureReason: failureReason) } else if !fileURL.fileURL { let failureReason = "The URL does not point to a valid file: \(fileURL)" - throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + throw Error.error(domain: NSURLErrorDomain, code: NSURLErrorBadURL, failureReason: failureReason) } let outputStream: NSOutputStream @@ -425,7 +422,7 @@ public class MultipartFormData { outputStream = possibleOutputStream } else { let failureReason = "Failed to create an output stream with the given URL: \(fileURL)" - throw Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason) + throw Error.error(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, failureReason: failureReason) } outputStream.open() @@ -492,7 +489,7 @@ public class MultipartFormData { encoded.appendBytes(buffer, length: bytesRead) } else if bytesRead < 0 { let failureReason = "Failed to read from input stream: \(inputStream)" - error = Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason) + error = Error.error(domain: NSURLErrorDomain, code: .InputStreamReadFailed, failureReason: failureReason) break } else { break @@ -551,7 +548,7 @@ public class MultipartFormData { try writeBuffer(&buffer, toOutputStream: outputStream) } else if bytesRead < 0 { let failureReason = "Failed to read from input stream: \(inputStream)" - throw Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason) + throw Error.error(domain: NSURLErrorDomain, code: .InputStreamReadFailed, failureReason: failureReason) } else { break } @@ -592,7 +589,7 @@ public class MultipartFormData { if bytesWritten < 0 { let failureReason = "Failed to write to output stream: \(outputStream)" - throw Error.errorWithCode(.OutputStreamWriteFailed, failureReason: failureReason) + throw Error.error(domain: NSURLErrorDomain, code: .OutputStreamWriteFailed, failureReason: failureReason) } bytesToWrite -= bytesWritten @@ -655,9 +652,8 @@ public class MultipartFormData { // MARK: - Private - Errors - private func setBodyPartError(error: NSError) { - if bodyPartError == nil { - bodyPartError = error - } + private func setBodyPartError(code code: Int, failureReason: String) { + guard bodyPartError == nil else { return } + bodyPartError = Error.error(domain: NSURLErrorDomain, code: code, failureReason: failureReason) } } diff --git a/Pods/Alamofire/Source/NetworkReachabilityManager.swift b/Pods/Alamofire/Source/NetworkReachabilityManager.swift index fed66a2..949ed28 100644 --- a/Pods/Alamofire/Source/NetworkReachabilityManager.swift +++ b/Pods/Alamofire/Source/NetworkReachabilityManager.swift @@ -1,24 +1,26 @@ -// NetworkReachabilityManager.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// NetworkReachabilityManager.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. #if !os(watchOS) diff --git a/Pods/Alamofire/Source/Notifications.swift b/Pods/Alamofire/Source/Notifications.swift index 1c23540..cece87a 100644 --- a/Pods/Alamofire/Source/Notifications.swift +++ b/Pods/Alamofire/Source/Notifications.swift @@ -1,24 +1,26 @@ -// Notifications.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Notifications.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/ParameterEncoding.swift b/Pods/Alamofire/Source/ParameterEncoding.swift index a7bcd24..bfa4d12 100644 --- a/Pods/Alamofire/Source/ParameterEncoding.swift +++ b/Pods/Alamofire/Source/ParameterEncoding.swift @@ -1,24 +1,26 @@ -// ParameterEncoding.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// ParameterEncoding.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Request.swift b/Pods/Alamofire/Source/Request.swift index 1f58de9..817cca5 100644 --- a/Pods/Alamofire/Source/Request.swift +++ b/Pods/Alamofire/Source/Request.swift @@ -1,24 +1,26 @@ -// Request.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Request.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -105,6 +107,22 @@ public class Request { return self } + /** + Returns a base64 encoded basic authentication credential as an authorization header dictionary. + + - parameter user: The user. + - parameter password: The password. + + - returns: A dictionary with Authorization key and credential value or empty dictionary if encoding fails. + */ + public static func authorizationHeader(user user: String, password: String) -> [String: String] { + guard let data = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding) else { return [:] } + + let credential = data.base64EncodedStringWithOptions([]) + + return ["Authorization": "Basic \(credential)"] + } + // MARK: - Progress /** @@ -284,7 +302,7 @@ public class Request { } } else { if challenge.previousFailureCount > 0 { - disposition = .CancelAuthenticationChallenge + disposition = .RejectProtectionSpace } else { credential = self.credential ?? session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) @@ -510,33 +528,31 @@ extension Request: CustomDebugStringConvertible { } } - if let headerFields = request.allHTTPHeaderFields { - for (field, value) in headerFields { - switch field { - case "Cookie": - continue - default: - components.append("-H \"\(field): \(value)\"") - } + var headers: [NSObject: AnyObject] = [:] + + if let additionalHeaders = session.configuration.HTTPAdditionalHeaders { + for (field, value) in additionalHeaders where field != "Cookie" { + headers[field] = value } } - if let additionalHeaders = session.configuration.HTTPAdditionalHeaders { - for (field, value) in additionalHeaders { - switch field { - case "Cookie": - continue - default: - components.append("-H \"\(field): \(value)\"") - } + if let headerFields = request.allHTTPHeaderFields { + for (field, value) in headerFields where field != "Cookie" { + headers[field] = value } } + for (field, value) in headers { + components.append("-H \"\(field): \(value)\"") + } + if let HTTPBodyData = request.HTTPBody, HTTPBody = String(data: HTTPBodyData, encoding: NSUTF8StringEncoding) { - let escapedBody = HTTPBody.stringByReplacingOccurrencesOfString("\"", withString: "\\\"") + var escapedBody = HTTPBody.stringByReplacingOccurrencesOfString("\\\"", withString: "\\\\\"") + escapedBody = escapedBody.stringByReplacingOccurrencesOfString("\"", withString: "\\\"") + components.append("-d \"\(escapedBody)\"") } diff --git a/Pods/Alamofire/Source/Response.swift b/Pods/Alamofire/Source/Response.swift index 153eda5..dd700bb 100644 --- a/Pods/Alamofire/Source/Response.swift +++ b/Pods/Alamofire/Source/Response.swift @@ -1,24 +1,26 @@ -// Response.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Response.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/ResponseSerialization.swift b/Pods/Alamofire/Source/ResponseSerialization.swift index 7fec781..5b7b61f 100644 --- a/Pods/Alamofire/Source/ResponseSerialization.swift +++ b/Pods/Alamofire/Source/ResponseSerialization.swift @@ -1,24 +1,26 @@ -// ResponseSerialization.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// ResponseSerialization.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -161,7 +163,7 @@ extension Request { guard let validData = data else { let failureReason = "Data could not be serialized. Input data was nil." - let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) + let error = Error.error(code: .DataSerializationFailed, failureReason: failureReason) return .Failure(error) } @@ -209,7 +211,7 @@ extension Request { guard let validData = data else { let failureReason = "String could not be serialized. Input data was nil." - let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason) + let error = Error.error(code: .StringSerializationFailed, failureReason: failureReason) return .Failure(error) } @@ -227,7 +229,7 @@ extension Request { return .Success(string) } else { let failureReason = "String could not be serialized with encoding: \(actualEncoding)" - let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason) + let error = Error.error(code: .StringSerializationFailed, failureReason: failureReason) return .Failure(error) } } @@ -280,7 +282,7 @@ extension Request { guard let validData = data where validData.length > 0 else { let failureReason = "JSON could not be serialized. Input data was nil or zero length." - let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) + let error = Error.error(code: .JSONSerializationFailed, failureReason: failureReason) return .Failure(error) } @@ -338,7 +340,7 @@ extension Request { guard let validData = data where validData.length > 0 else { let failureReason = "Property list could not be serialized. Input data was nil or zero length." - let error = Error.errorWithCode(.PropertyListSerializationFailed, failureReason: failureReason) + let error = Error.error(code: .PropertyListSerializationFailed, failureReason: failureReason) return .Failure(error) } diff --git a/Pods/Alamofire/Source/Result.swift b/Pods/Alamofire/Source/Result.swift index a8557ca..ed1df0f 100644 --- a/Pods/Alamofire/Source/Result.swift +++ b/Pods/Alamofire/Source/Result.swift @@ -1,24 +1,26 @@ -// Result.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Result.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/ServerTrustPolicy.swift b/Pods/Alamofire/Source/ServerTrustPolicy.swift index 07cd848..44ba100 100644 --- a/Pods/Alamofire/Source/ServerTrustPolicy.swift +++ b/Pods/Alamofire/Source/ServerTrustPolicy.swift @@ -1,24 +1,26 @@ -// ServerTrustPolicy.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// ServerTrustPolicy.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Stream.swift b/Pods/Alamofire/Source/Stream.swift index 905e522..07ebe33 100644 --- a/Pods/Alamofire/Source/Stream.swift +++ b/Pods/Alamofire/Source/Stream.swift @@ -1,24 +1,26 @@ -// Stream.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Stream.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Timeline.swift b/Pods/Alamofire/Source/Timeline.swift index 0b7ab5d..3610f15 100644 --- a/Pods/Alamofire/Source/Timeline.swift +++ b/Pods/Alamofire/Source/Timeline.swift @@ -1,24 +1,26 @@ -// Timeline.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Timeline.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Upload.swift b/Pods/Alamofire/Source/Upload.swift index 78b3072..7b31ba5 100644 --- a/Pods/Alamofire/Source/Upload.swift +++ b/Pods/Alamofire/Source/Upload.swift @@ -1,24 +1,26 @@ -// Upload.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Upload.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation diff --git a/Pods/Alamofire/Source/Validation.swift b/Pods/Alamofire/Source/Validation.swift index 71d21e1..e90db2d 100644 --- a/Pods/Alamofire/Source/Validation.swift +++ b/Pods/Alamofire/Source/Validation.swift @@ -1,24 +1,26 @@ -// Validation.swift // -// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) +// Validation.swift // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. import Foundation @@ -80,7 +82,17 @@ extension Request { return .Success } else { let failureReason = "Response status code was unacceptable: \(response.statusCode)" - return .Failure(Error.errorWithCode(.StatusCodeValidationFailed, failureReason: failureReason)) + + let error = NSError( + domain: Error.Domain, + code: Error.Code.StatusCodeValidationFailed.rawValue, + userInfo: [ + NSLocalizedFailureReasonErrorKey: failureReason, + Error.UserInfoKeys.StatusCode: response.statusCode + ] + ) + + return .Failure(error) } } } @@ -149,18 +161,31 @@ extension Request { } } + let contentType: String let failureReason: String if let responseContentType = response.MIMEType { + contentType = responseContentType + failureReason = ( "Response content type \"\(responseContentType)\" does not match any acceptable " + "content types: \(acceptableContentTypes)" ) } else { + contentType = "" failureReason = "Response content type was missing and acceptable content type does not match \"*/*\"" } - return .Failure(Error.errorWithCode(.ContentTypeValidationFailed, failureReason: failureReason)) + let error = NSError( + domain: Error.Domain, + code: Error.Code.ContentTypeValidationFailed.rawValue, + userInfo: [ + NSLocalizedFailureReasonErrorKey: failureReason, + Error.UserInfoKeys.ContentType: contentType + ] + ) + + return .Failure(error) } } diff --git a/Pods/AlamofireImage/LICENSE b/Pods/AlamofireImage/LICENSE deleted file mode 100644 index 4fe9ec9..0000000 --- a/Pods/AlamofireImage/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Pods/AlamofireImage/README.md b/Pods/AlamofireImage/README.md deleted file mode 100644 index 9fce143..0000000 --- a/Pods/AlamofireImage/README.md +++ /dev/null @@ -1,540 +0,0 @@ -# AlamofireImage - -[![Build Status](https://travis-ci.org/Alamofire/AlamofireImage.svg)](https://travis-ci.org/Alamofire/AlamofireImage) -[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/AlamofireImage.svg)](https://img.shields.io/cocoapods/v/AlamofireImage.svg) -[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![Platform](https://img.shields.io/cocoapods/p/AlamofireImage.svg?style=flat)](http://cocoadocs.org/docsets/AlamofireImage) -[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) - -AlamofireImage is an image component library for Alamofire. - -## Features - -- [x] Image Response Serializers -- [x] UIImage Extensions for Inflation / Scaling / Rounding / CoreImage -- [x] Single and Multi-Pass Image Filters -- [x] Auto-Purging In-Memory Image Cache -- [x] Prioritized Queue Order Image Downloading -- [x] Authentication with NSURLCredential -- [x] UIImageView Async Remote Downloads with Placeholders -- [x] UIImageView Filters and Transitions -- [x] Comprehensive Test Coverage -- [x] [Complete Documentation](http://cocoadocs.org/docsets/AlamofireImage) - -## Requirements - -- iOS 8.0+ / Mac OS X 10.9+ / tvOS 9.0+ / watchOS 2.0+ -- Xcode 7.3+ - -## Migration Guides - -- [AlamofireImage 2.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%202.0%20Migration%20Guide.md) - -## Dependencies - -- [Alamofire 3.2+](https://github.com/Alamofire/Alamofire) - -## Communication - -- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire') -- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). -- If you **found a bug**, open an issue. -- If you **have a feature request**, open an issue. -- If you **want to contribute**, submit a pull request. - -## Installation - -### CocoaPods - -[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command: - -```bash -$ gem install cocoapods -``` - -> CocoaPods 0.39.0+ is required. - -To integrate AlamofireImage into your Xcode project using CocoaPods, specify it in your `Podfile`: - -```ruby -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '8.0' -use_frameworks! - -pod 'AlamofireImage', '~> 2.0' -``` - -Then, run the following command: - -```bash -$ pod install -``` - -### Carthage - -[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. - -You can install Carthage with [Homebrew](http://brew.sh/) using the following command: - -```bash -$ brew update -$ brew install carthage -``` - -To integrate AlamofireImage into your Xcode project using Carthage, specify it in your `Cartfile`: - -```ogdl -github "Alamofire/AlamofireImage" ~> 2.0 -``` - ---- - -## Usage - -### Image Response Serializers - -```swift -import AlamofireImage - -Alamofire.request(.GET, "https://httpbin.org/image/png") - .responseImage { response in - debugPrint(response) - - print(response.request) - print(response.response) - debugPrint(response.result) - - if let image = response.result.value { - print("image downloaded: \(image)") - } - } -``` - -The AlamofireImage response image serializers support a wide range of image types including: - -- `image/png` -- `image/jpeg` -- `image/tiff` -- `image/gif` -- `image/ico` -- `image/x-icon` -- `image/bmp` -- `image/x-bmp` -- `image/x-xbitmap` -- `image/x-win-bitmap` - -> If the image you are attempting to download is an invalid MIME type not in the list, you can add custom acceptable content types using the `addAcceptableImageContentTypes` extension on the `Request` type. - -### UIImage Extensions - -There are several `UIImage` extensions designed to make the common image manipulation operations as simple as possible. - -#### Inflation - -```swift -let URL = NSBundle.mainBundle().URLForResource("unicorn", withExtension: "png")! -let data = NSData(contentsOfURL: URL)! -let image = UIImage(data: data, scale: UIScreen.mainScreen().scale)! - -image.af_inflate() -``` - -> Inflating compressed image formats (such as PNG or JPEG) in a background queue can significantly improve drawing performance on the main thread. - -#### Scaling - -```swift -let image = UIImage(named: "unicorn")! -let size = CGSize(width: 100.0, height: 100.0) - -// Scale image to size disregarding aspect ratio -let scaledImage = image.af_imageScaledToSize(size) - -// Scale image to fit within specified size while maintaining aspect ratio -let aspectScaledToFitImage = image.af_imageAspectScaledToFitSize(size) - -// Scale image to fill specified size while maintaining aspect ratio -let aspectScaledToFillImage = image.af_imageAspectScaledToFillSize(size) -``` - -#### Rounded Corners - -```swift -let image = UIImage(named: "unicorn")! -let radius: CGFloat = 20.0 - -let roundedImage = image.af_imageWithRoundedCornerRadius(radius) -let circularImage = image.af_imageRoundedIntoCircle() -``` - -#### Core Image Filters - -```swift -let image = UIImage(named: "unicorn")! - -let sepiaImage = image.af_imageWithAppliedCoreImageFilter("CISepiaTone") -let blurredImage = image.af_imageWithAppliedCoreImageFilter( - "CIGaussianBlur", - filterParameters: ["inputRadius": 25] -) -``` - -### Image Filters - -The `ImageFilter` protocol was designed to make it easy to apply a filter operation and cache the result after an image finished downloading. It defines two properties to facilitate this functionality. - -```swift -public protocol ImageFilter { - var filter: Image -> Image { get } - var identifier: String { get } -} -``` - -The `filter` closure contains the operation used to create a modified version of the specified image. The `identifier` property is a string used to uniquely identify the filter operation. This is useful when adding filtered versions of an image to a cache. All identifier properties inside AlamofireImage are implemented using protocol extensions. - -#### Single Pass - -The single pass image filters only perform a single operation on the specified image. - -```swift -let image = UIImage(named: "unicorn")! -let imageFilter = RoundedCornersFilter(radius: 10.0) - -let roundedImage = imageFilter.filter(image) -``` - -The current list of single pass image filters includes: - -- `ScaledToSizeFilter` - Scales an image to a specified size. -- `AspectScaledToFitSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size. -- `AspectScaledToFillSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall outside the specified size are clipped. -- `RoundedCornersFilter` - Rounds the corners of an image to the specified radius. -- `CircleFilter` - Rounds the corners of an image into a circle. -- `BlurFilter` - Blurs an image using a `CIGaussianBlur` filter with the specified blur radius. - -> Each image filter is built ontop of the `UIImage` extensions. - -#### Multi-Pass - -The multi-pass image filters perform multiple operations on the specified image. - -```swift -let image = UIImage(named: "avatar")! -let size = CGSize(width: 100.0, height: 100.0) -let imageFilter = AspectScaledToFillSizeCircleFilter(size: size) - -let avatarImage = imageFilter.filter(image) -``` - -The current list of multi-pass image filters includes: - -- `ScaledToSizeWithRoundedCornersFilter` - Scales an image to a specified size, then rounds the corners to the specified radius. -- `AspectScaledToFillSizeWithRoundedCornersFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners to the specified radius. -- `ScaledToSizeCircleFilter` - Scales an image to a specified size, then rounds the corners into a circle. -- `AspectScaledToFillSizeCircleFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners into a circle. - -### Image Cache - -Image caching can become complicated when it comes to network images. `NSURLCache` is quite powerful and does a great job reasoning through the various cache policies and `Cache-Control` headers. However, it is not equiped to handle caching multiple modified versions of those images. - -For example, let's say you need to download an album of images. Your app needs to display both the thumbnail version as well as the full size version at various times. Due to performance issues, you want to scale down the thumbnails to a reasonable size before rendering them on-screen. You also need to apply a global CoreImage filter to the full size images when displayed. While `NSURLCache` can easily handle storing the original downloaded image, it cannot store these different variants. What you really need is another caching layer designed to handle these different variants. - -```swift -let imageCache = AutoPurgingImageCache( - memoryCapacity: 100 * 1024 * 1024, - preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 -) -``` - -The `AutoPurgingImageCache` in AlamofireImage fills the role of that additional caching layer. It is an in-memory image cache used to store images up to a given memory capacity. When the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the internal access date of the image is updated. - -#### Add / Remove / Fetch Images - -Interacting with the `ImageCache` protocol APIs is very straightforward. - -```swift -let imageCache = AutoPurgingImageCache() -let avatarImage = UIImage(data: data)! - -// Add -imageCache.addImage(avatarImage, withIdentifier: "avatar") - -// Fetch -let cachedAvatar = imageCache.imageWithIdentifier("avatar") - -// Remove -imageCache.removeImageWithIdentifier("avatar") -``` - -#### URL Requests - -The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding support for `NSURLRequest` caching. This allows an `NSURLRequest` and additional identifier to generate the unique identifier for the image in the cache. - -```swift -let imageCache = AutoPurgingImageCache() - -let URLRequest = NSURLRequest(URL: NSURL(string: "https://httpbin.org/image/png")!) -let avatarImage = UIImage(named: "avatar")!.af_imageRoundedIntoCircle() - -// Add -imageCache.addImage( - avatarImage, - forRequest: URLRequest, - withAdditionalIdentifier: "circle" -) - -// Fetch -let cachedAvatarImage = imageCache.imageForRequest( - URLRequest, - withAdditionalIdentifier: "circle" -) - -// Remove -imageCache.removeImageForRequest( - URLRequest, - withAdditionalIdentifier: "circle" -) -``` - -#### Auto-Purging - -Each time an image is fetched from the cache, the cache internally updates the last access date for that image. - -```swift -let avatar = imageCache.imageWithIdentifier("avatar") -let circularAvatar = imageCache.imageForRequest( - URLRequest, - withIdentifier: "circle" -) -``` - -By updating the last access date for each image, the image cache can make more informed decisions about which images to purge when the memory capacity is reached. The `AutoPurgingImageCache` automatically evicts images from the cache in order from oldest last access date to newest until the memory capacity drops below the `preferredMemoryCapacityAfterPurge`. - -> It is important to set reasonable default values for the `memoryCapacity` and `preferredMemoryCapacityAfterPurge` when you are initializing your image cache. By default, the `memoryCapacity` equals 100 MB and the `preferredMemoryCapacityAfterPurge` equals 60 MB. - -#### Memory Warnings - -The `AutoPurgingImageCache` also listens for memory warnings from your application and will purge all images from the cache if a memory warning is observed. - -### Image Downloader - -The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. It uses an internal Alamofire `Manager` instance to handle all the downloading and response image serialization. By default, the initialization of an `ImageDownloader` uses a default `NSURLSessionConfiguration` with the most common parameter values. - -```swift -let imageDownloader = ImageDownloader( - configuration: ImageDownloader.defaultURLSessionConfiguration(), - downloadPrioritization: .FIFO, - maximumActiveDownloads: 4, - imageCache: AutoPurgingImageCache() -) -``` - -> If you need to customize the `NSURLSessionConfiguration` type or parameters, then simply provide your own rather than using the default. - -#### Downloading an Image - -```swift -let downloader = ImageDownloader() -let URLRequest = NSURLRequest(URL: NSURL(string: "https://httpbin.org/image/jpeg")!) - -downloader.downloadImage(URLRequest: URLRequest) { response in - print(response.request) - print(response.response) - debugPrint(response.result) - - if let image = response.result.value { - print(image) - } -} -``` - -> Make sure to keep a strong reference to the `ImageDownloader` instance, otherwise the `completion` closure will not be called because the `downloader` reference will go out of scope before the `completion` closure can be called. - -#### Applying an ImageFilter - -```swift -let downloader = ImageDownloader() -let URLRequest = NSURLRequest(URL: NSURL(string: "https://httpbin.org/image/jpeg")!) -let filter = AspectScaledToFillSizeCircleFilter(size: CGSize(width: 100.0, height: 100.0)) - -downloader.downloadImage(URLRequest: URLRequest, filter: filter) { response in - print(response.request) - print(response.response) - debugPrint(response.result) - - if let image = response.result.value { - print(image) - } -} -``` - -#### Authentication - -If your images are behind HTTP Basic Auth, you can append the `user:password:` or the `credential` to the `ImageDownloader` instance. The credentials will be applied to all future download requests. - -```swift -let downloader = ImageDownloader() -downloader.addAuthentication(user: "username", password: "password") -``` - -#### Download Prioritization - -The `ImageDownloader` maintains an internal queue of pending download requests. Depending on your situation, you may want incoming downloads to be inserted at the front or the back of the queue. The `DownloadPrioritization` enumeration allows you to specify which behavior you would prefer. - -```swift -public enum DownloadPrioritization { - case FIFO, LIFO -} -``` - -> The `ImageDownloader` is initialized with a `.FIFO` queue by default. - -#### Image Caching - -The `ImageDownloader` uses a combination of an `NSURLCache` and `AutoPurgingImageCache` to create a very robust, high performance image caching system. - -##### NSURLCache - -The `NSURLCache` is used to cache all the original image content downloaded from the server. By default, it is initialized with a memory capacity of 20 MB and a disk capacity of 150 MB. This allows up to 150 MB of original image data to be stored on disk at any given time. While these defaults have been carefully set, it is very important to consider your application's needs and performance requirements and whether these values are right for you. - -> If you wish to disable this caching layer, create a custom `NSURLSessionConfiguration` with the `URLCache` property set to `nil` and use that configuration when initializing the `ImageDownloader`. - -##### Image Cache - -The `ImageCache` is used to cache all the potentially filtered image content after it has been downloaded from the server. This allows multiple variants of the same image to also be cached, rather than having to re-apply the image filters to the original image each time it is required. By default, an `AutoPurgingImageCache` is initialized with a memory capacity of 100 MB and a preferred memory usage after purge limit of 60 MB. This allows up to 100 MB of most recently accessed filtered image content to be stored in-memory at a given time. - -##### Setting Ideal Capacity Limits - -Determining the ideal the in-memory and on-disk capacity limits of the `NSURLCache` and `AutoPurgingImageCache` requires a bit of forethought. You must carefully consider your application's needs, and tailor the limits accordingly. By default, the combination of caches offers the following storage capacities: - -- 150 MB of on-disk storage -- 20 MB of in-memory original image data storage -- 100 MB of in-memory storage of filtered image content -- 60 MB preferred memory capacity after purge of filtered image content - -> If you do not use image filters, it is advised to set the memory capacity of the `NSURLCache` to zero to avoid storing the same content in-memory twice. - -#### Duplicate Downloads - -Sometimes application logic can end up attempting to download an image more than once before the initial download request is complete. Most often, this results in the image being downloaded more than once. AlamofireImage handles this case elegantly by merging the duplicate downloads. The image will only be downloaded once, yet both completion handlers will be called. - -##### Image Filter Reuse - -In addition to merging duplicate downloads, AlamofireImage can also merge duplicate image filters. If two image filters with the same identifier are attached to the same download, the image filter is only executed once and both completion handlers are called with the same resulting image. This can save large amounts of time and resources for computationally expensive filters such as ones leveraging CoreImage. - -##### Request Receipts - -Sometimes it is necessary to cancel an image download for various reasons. AlamofireImage can intelligently handle cancellation logic in the `ImageDownloader` by leveraging the `RequestReceipt` type along with the `cancelRequestForRequestReceipt` method. Each download request vends a `RequestReceipt` which can be later used to cancel the request. - -By cancelling the request through the `ImageDownloader` using the `RequestReceipt`, AlamofireImage is able to determine how to best handle the cancellation. The cancelled download will always receive a cancellation error, while duplicate downloads are allowed to complete. If the download is already active, it is allowed to complete even though the completion handler will be called with a cancellation error. This greatly improves performance of table and collection views displaying large amounts of images. - -> It is NOT recommended to directly call `cancel` on the `request` in the `RequestReceipt`. Doing so can lead to issues such as duplicate downloads never being allowed to complete. - -### UIImageView Extension - -The [UIImage Extensions](#uiimage-extensions), [Image Filters](#image-filters), [Image Cache](#image-cache) and [Image Downloader](#image-downloader) were all designed to be flexible and standalone, yet also to provide the foundation of the `UIImageView` extension. Due to the powerful support of these classes, protocols and extensions, the `UIImageView` APIs are concise, easy to use and contain a large amount of functionality. - -#### Setting Image with URL - -Setting the image with a URL will asynchronously download the image and set it once the request is finished. - -```swift -let imageView = UIImageView(frame: frame) -let URL = NSURL(string: "https://httpbin.org/image/png")! - -imageView.af_setImageWithURL(URL) -``` - -> If the image is cached locally, the image is set immediately. - -#### Placeholder Images - -By specifying a placeholder image, the image view uses the placeholder image until the remote image is downloaded. - -```swift -let imageView = UIImageView(frame: frame) -let URL = NSURL(string: "https://httpbin.org/image/png")! -let placeholderImage = UIImage(named: "placeholder")! - -imageView.af_setImageWithURL(URL, placeholderImage: placeholderImage) -``` - -> If the remote image is cached locally, the placeholder image is never set. - -#### Image Filters - -If an image filter is specified, it is applied asynchronously after the remote image is downloaded. Once the filter execution is complete, the resulting image is set on the image view. - -```swift -let imageView = UIImageView(frame: frame) - -let URL = NSURL(string: "https://httpbin.org/image/png")! -let placeholderImage = UIImage(named: "placeholder")! - -let filter = AspectScaledToFillSizeWithRoundedCornersFilter( - size: imageView.frame.size, - radius: 20.0 -) - -imageView.af_setImageWithURL( - URL, - placeholderImage: placeholderImage, - filter: filter -) -``` - -> If the remote image with the applied filter is cached locally, the image is set immediately. - -#### Image Transitions - -By default, there is no image transition animation when setting the image on the image view. If you wish to add a cross dissolve or flip-from-bottom animation, then specify an `ImageTransition` with the preferred duration. - -```swift -let imageView = UIImageView(frame: frame) - -let URL = NSURL(string: "https://httpbin.org/image/png")! -let placeholderImage = UIImage(named: "placeholder")! - -let filter = AspectScaledToFillSizeWithRoundedCornersFilter( - size: imageView.frame.size, - radius: 20.0 -) - -imageView.af_setImageWithURL( - URL, - placeholderImage: placeholderImage, - filter: filter, - imageTransition: .CrossDissolve(0.2) -) -``` - -> If the remote image is cached locally, the image transition is ignored. - -#### Image Downloader - -The `UIImageView` extension is powered by the default `ImageDownloader` instance. To customize cache capacities, download priorities, request cache policies, timeout durations, etc., please refer to the [Image Downloader](#image-downloader) documentation. - -##### Authentication - -If an image requires and authentication credential from the `UIImageView` extension, it can be provided as follows: - -```swift -ImageDownloader.defaultInstance.addAuthentication( - user: "user", - password: "password" -) -``` - ---- - -## Credits - -Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases. - -### Security Disclosure - -If you believe you have identified a security vulnerability with AlamofireImage, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. - -## License - -AlamofireImage is released under the MIT license. See LICENSE for details. diff --git a/Pods/AlamofireImage/Source/Image.swift b/Pods/AlamofireImage/Source/Image.swift deleted file mode 100644 index 6c349bf..0000000 --- a/Pods/AlamofireImage/Source/Image.swift +++ /dev/null @@ -1,31 +0,0 @@ -// Image.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -#if os(iOS) || os(tvOS) || os(watchOS) -import UIKit -public typealias Image = UIImage -#elseif os(OSX) -import Cocoa -public typealias Image = NSImage -#endif diff --git a/Pods/AlamofireImage/Source/ImageCache.swift b/Pods/AlamofireImage/Source/ImageCache.swift deleted file mode 100644 index 38f9932..0000000 --- a/Pods/AlamofireImage/Source/ImageCache.swift +++ /dev/null @@ -1,330 +0,0 @@ -// ImageCache.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Alamofire -import Foundation - -#if os(iOS) || os(tvOS) || os(watchOS) -import UIKit -#elseif os(OSX) -import Cocoa -#endif - -// MARK: ImageCache - -/// The `ImageCache` protocol defines a set of APIs for adding, removing and fetching images from a cache. -public protocol ImageCache { - /// Adds the image to the cache with the given identifier. - func addImage(image: Image, withIdentifier identifier: String) - - /// Removes the image from the cache matching the given identifier. - func removeImageWithIdentifier(identifier: String) -> Bool - - /// Removes all images stored in the cache. - func removeAllImages() -> Bool - - /// Returns the image in the cache associated with the given identifier. - func imageWithIdentifier(identifier: String) -> Image? -} - -/// The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding methods for adding, removing and -/// fetching images from a cache given an `NSURLRequest` and additional identifier. -public protocol ImageRequestCache: ImageCache { - /// Adds the image to the cache using an identifier created from the request and additional identifier. - func addImage(image: Image, forRequest request: NSURLRequest, withAdditionalIdentifier identifier: String?) - - /// Removes the image from the cache using an identifier created from the request and additional identifier. - func removeImageForRequest(request: NSURLRequest, withAdditionalIdentifier identifier: String?) -> Bool - - /// Returns the image from the cache associated with an identifier created from the request and additional identifier. - func imageForRequest(request: NSURLRequest, withAdditionalIdentifier identifier: String?) -> Image? -} - -// MARK: - - -/// The `AutoPurgingImageCache` in an in-memory image cache used to store images up to a given memory capacity. When -/// the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously -/// purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the -/// internal access date of the image is updated. -public class AutoPurgingImageCache: ImageRequestCache { - private class CachedImage { - let image: Image - let identifier: String - let totalBytes: UInt64 - var lastAccessDate: NSDate - - init(_ image: Image, identifier: String) { - self.image = image - self.identifier = identifier - self.lastAccessDate = NSDate() - - self.totalBytes = { - #if os(iOS) || os(tvOS) || os(watchOS) - let size = CGSize(width: image.size.width * image.scale, height: image.size.height * image.scale) - #elseif os(OSX) - let size = CGSize(width: image.size.width, height: image.size.height) - #endif - - let bytesPerPixel: CGFloat = 4.0 - let bytesPerRow = size.width * bytesPerPixel - let totalBytes = UInt64(bytesPerRow) * UInt64(size.height) - - return totalBytes - }() - } - - func accessImage() -> Image { - lastAccessDate = NSDate() - return image - } - } - - // MARK: Properties - - /// The current total memory usage in bytes of all images stored within the cache. - public var memoryUsage: UInt64 { - var memoryUsage: UInt64 = 0 - dispatch_sync(synchronizationQueue) { memoryUsage = self.currentMemoryUsage } - - return memoryUsage - } - - /// The total memory capacity of the cache in bytes. - public let memoryCapacity: UInt64 - - /// The preferred memory usage after purge in bytes. During a purge, images will be purged until the memory - /// capacity drops below this limit. - public let preferredMemoryUsageAfterPurge: UInt64 - - private let synchronizationQueue: dispatch_queue_t - private var cachedImages: [String: CachedImage] - private var currentMemoryUsage: UInt64 - - // MARK: Initialization - - /** - Initialies the `AutoPurgingImageCache` instance with the given memory capacity and preferred memory usage - after purge limit. - - Please note, the memory capacity must always be greater than or equal to the preferred memory usage after purge. - - - parameter memoryCapacity: The total memory capacity of the cache in bytes. `100 MB` by default. - - parameter preferredMemoryUsageAfterPurge: The preferred memory usage after purge in bytes. `60 MB` by default. - - - returns: The new `AutoPurgingImageCache` instance. - */ - public init(memoryCapacity: UInt64 = 100_000_000, preferredMemoryUsageAfterPurge: UInt64 = 60_000_000) { - self.memoryCapacity = memoryCapacity - self.preferredMemoryUsageAfterPurge = preferredMemoryUsageAfterPurge - - precondition( - memoryCapacity >= preferredMemoryUsageAfterPurge, - "The `memoryCapacity` must be greater than or equal to `preferredMemoryUsageAfterPurge`" - ) - - self.cachedImages = [:] - self.currentMemoryUsage = 0 - - self.synchronizationQueue = { - let name = String(format: "com.alamofire.autopurgingimagecache-%08%08", arc4random(), arc4random()) - return dispatch_queue_create(name, DISPATCH_QUEUE_CONCURRENT) - }() - - #if os(iOS) || os(tvOS) - NSNotificationCenter.defaultCenter().addObserver( - self, - selector: #selector(AutoPurgingImageCache.removeAllImages), - name: UIApplicationDidReceiveMemoryWarningNotification, - object: nil - ) - #endif - } - - deinit { - NSNotificationCenter.defaultCenter().removeObserver(self) - } - - // MARK: Add Image to Cache - - /** - Adds the image to the cache using an identifier created from the request and optional identifier. - - - parameter image: The image to add to the cache. - - parameter request: The request used to generate the image's unique identifier. - - parameter identifier: The additional identifier to append to the image's unique identifier. - */ - public func addImage(image: Image, forRequest request: NSURLRequest, withAdditionalIdentifier identifier: String? = nil) { - let requestIdentifier = imageCacheKeyFromURLRequest(request, withAdditionalIdentifier: identifier) - addImage(image, withIdentifier: requestIdentifier) - } - - /** - Adds the image to the cache with the given identifier. - - - parameter image: The image to add to the cache. - - parameter identifier: The identifier to use to uniquely identify the image. - */ - public func addImage(image: Image, withIdentifier identifier: String) { - dispatch_barrier_async(synchronizationQueue) { - let cachedImage = CachedImage(image, identifier: identifier) - - if let previousCachedImage = self.cachedImages[identifier] { - self.currentMemoryUsage -= previousCachedImage.totalBytes - } - - self.cachedImages[identifier] = cachedImage - self.currentMemoryUsage += cachedImage.totalBytes - } - - dispatch_barrier_async(synchronizationQueue) { - if self.currentMemoryUsage > self.memoryCapacity { - let bytesToPurge = self.currentMemoryUsage - self.preferredMemoryUsageAfterPurge - - var sortedImages = [CachedImage](self.cachedImages.values) - sortedImages.sortInPlace { - let date1 = $0.lastAccessDate - let date2 = $1.lastAccessDate - - return date1.timeIntervalSinceDate(date2) < 0.0 - } - - var bytesPurged = UInt64(0) - - for cachedImage in sortedImages { - self.cachedImages.removeValueForKey(cachedImage.identifier) - bytesPurged += cachedImage.totalBytes - - if bytesPurged >= bytesToPurge { - break - } - } - - self.currentMemoryUsage -= bytesPurged - } - } - } - - // MARK: Remove Image from Cache - - /** - Removes the image from the cache using an identifier created from the request and optional identifier. - - - parameter request: The request used to generate the image's unique identifier. - - parameter identifier: The additional identifier to append to the image's unique identifier. - - - returns: `true` if the image was removed, `false` otherwise. - */ - public func removeImageForRequest(request: NSURLRequest, withAdditionalIdentifier identifier: String?) -> Bool { - let requestIdentifier = imageCacheKeyFromURLRequest(request, withAdditionalIdentifier: identifier) - return removeImageWithIdentifier(requestIdentifier) - } - - /** - Removes the image from the cache matching the given identifier. - - - parameter identifier: The unique identifier for the image. - - - returns: `true` if the image was removed, `false` otherwise. - */ - public func removeImageWithIdentifier(identifier: String) -> Bool { - var removed = false - - dispatch_barrier_async(synchronizationQueue) { - if let cachedImage = self.cachedImages.removeValueForKey(identifier) { - self.currentMemoryUsage -= cachedImage.totalBytes - removed = true - } - } - - return removed - } - - /** - Removes all images stored in the cache. - - - returns: `true` if images were removed from the cache, `false` otherwise. - */ - @objc public func removeAllImages() -> Bool { - var removed = false - - dispatch_sync(synchronizationQueue) { - if !self.cachedImages.isEmpty { - self.cachedImages.removeAll() - self.currentMemoryUsage = 0 - - removed = true - } - } - - return removed - } - - // MARK: Fetch Image from Cache - - /** - Returns the image from the cache associated with an identifier created from the request and optional identifier. - - - parameter request: The request used to generate the image's unique identifier. - - parameter identifier: The additional identifier to append to the image's unique identifier. - - - returns: The image if it is stored in the cache, `nil` otherwise. - */ - public func imageForRequest(request: NSURLRequest, withAdditionalIdentifier identifier: String? = nil) -> Image? { - let requestIdentifier = imageCacheKeyFromURLRequest(request, withAdditionalIdentifier: identifier) - return imageWithIdentifier(requestIdentifier) - } - - /** - Returns the image in the cache associated with the given identifier. - - - parameter identifier: The unique identifier for the image. - - - returns: The image if it is stored in the cache, `nil` otherwise. - */ - public func imageWithIdentifier(identifier: String) -> Image? { - var image: Image? - - dispatch_sync(synchronizationQueue) { - if let cachedImage = self.cachedImages[identifier] { - image = cachedImage.accessImage() - } - } - - return image - } - - // MARK: Private - Helper Methods - - private func imageCacheKeyFromURLRequest( - request: NSURLRequest, - withAdditionalIdentifier identifier: String?) - -> String - { - var key = request.URLString - - if let identifier = identifier { - key += "-\(identifier)" - } - - return key - } -} diff --git a/Pods/AlamofireImage/Source/ImageDownloader.swift b/Pods/AlamofireImage/Source/ImageDownloader.swift deleted file mode 100644 index 78ba818..0000000 --- a/Pods/AlamofireImage/Source/ImageDownloader.swift +++ /dev/null @@ -1,553 +0,0 @@ -// ImageDownloader.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Alamofire -import Foundation - -#if os(iOS) || os(tvOS) || os(watchOS) -import UIKit -#elseif os(OSX) -import Cocoa -#endif - -/// The `RequestReceipt` is an object vended by the `ImageDownloader` when starting a download request. It can be used -/// to cancel active requests running on the `ImageDownloader` session. As a general rule, image download requests -/// should be cancelled using the `RequestReceipt` instead of calling `cancel` directly on the `request` itself. The -/// `ImageDownloader` is optimized to handle duplicate request scenarios as well as pending versus active downloads. -public class RequestReceipt { - /// The download request created by the `ImageDownloader`. - public let request: Request - - /// The unique identifier for the image filters and completion handlers when duplicate requests are made. - public let receiptID: String - - init(request: Request, receiptID: String) { - self.request = request - self.receiptID = receiptID - } -} - -/// The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. Incoming -/// downloads are added to the front or back of the queue depending on the download prioritization. Each downloaded -/// image is cached in the underlying `NSURLCache` as well as the in-memory image cache that supports image filters. -/// By default, any download request with a cached image equivalent in the image cache will automatically be served the -/// cached image representation. Additional advanced features include supporting multiple image filters and completion -/// handlers for a single request. -public class ImageDownloader { - /// The completion handler closure used when an image download completes. - public typealias CompletionHandler = Response -> Void - - /// The progress handler closure called periodically during an image download. - public typealias ProgressHandler = (bytesRead: Int64, totalBytesRead: Int64, totalExpectedBytesToRead: Int64) -> Void - - /** - Defines the order prioritization of incoming download requests being inserted into the queue. - - - FIFO: All incoming downloads are added to the back of the queue. - - LIFO: All incoming downloads are added to the front of the queue. - */ - public enum DownloadPrioritization { - case FIFO, LIFO - } - - class ResponseHandler { - let identifier: String - let request: Request - var operations: [(id: String, filter: ImageFilter?, completion: CompletionHandler?)] - - init(request: Request, id: String, filter: ImageFilter?, completion: CompletionHandler?) { - self.request = request - self.identifier = ImageDownloader.identifierForURLRequest(request.request!) - self.operations = [(id: id, filter: filter, completion: completion)] - } - } - - // MARK: - Properties - - /// The image cache used to store all downloaded images in. - public let imageCache: ImageRequestCache? - - /// The credential used for authenticating each download request. - public private(set) var credential: NSURLCredential? - - /// The underlying Alamofire `Manager` instance used to handle all download requests. - public let sessionManager: Alamofire.Manager - - let downloadPrioritization: DownloadPrioritization - let maximumActiveDownloads: Int - - var activeRequestCount = 0 - var queuedRequests: [Request] = [] - var responseHandlers: [String: ResponseHandler] = [:] - - private let synchronizationQueue: dispatch_queue_t = { - let name = String(format: "com.alamofire.imagedownloader.synchronizationqueue-%08%08", arc4random(), arc4random()) - return dispatch_queue_create(name, DISPATCH_QUEUE_SERIAL) - }() - - private let responseQueue: dispatch_queue_t = { - let name = String(format: "com.alamofire.imagedownloader.responsequeue-%08%08", arc4random(), arc4random()) - return dispatch_queue_create(name, DISPATCH_QUEUE_CONCURRENT) - }() - - // MARK: - Initialization - - /// The default instance of `ImageDownloader` initialized with default values. - public static let defaultInstance = ImageDownloader() - - /** - Creates a default `NSURLSessionConfiguration` with common usage parameter values. - - - returns: The default `NSURLSessionConfiguration` instance. - */ - public class func defaultURLSessionConfiguration() -> NSURLSessionConfiguration { - let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() - - configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders - configuration.HTTPShouldSetCookies = true - configuration.HTTPShouldUsePipelining = false - - configuration.requestCachePolicy = .UseProtocolCachePolicy - configuration.allowsCellularAccess = true - configuration.timeoutIntervalForRequest = 60 - - configuration.URLCache = ImageDownloader.defaultURLCache() - - return configuration - } - - /** - Creates a default `NSURLCache` with common usage parameter values. - - - returns: The default `NSURLCache` instance. - */ - public class func defaultURLCache() -> NSURLCache { - return NSURLCache( - memoryCapacity: 20 * 1024 * 1024, // 20 MB - diskCapacity: 150 * 1024 * 1024, // 150 MB - diskPath: "com.alamofire.imagedownloader" - ) - } - - /** - Initializes the `ImageDownloader` instance with the given configuration, download prioritization, maximum active - download count and image cache. - - - parameter configuration: The `NSURLSessionConfiguration` to use to create the underlying Alamofire - `Manager` instance. - - parameter downloadPrioritization: The download prioritization of the download queue. `.FIFO` by default. - - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time. - - parameter imageCache: The image cache used to store all downloaded images in. - - - returns: The new `ImageDownloader` instance. - */ - public init( - configuration: NSURLSessionConfiguration = ImageDownloader.defaultURLSessionConfiguration(), - downloadPrioritization: DownloadPrioritization = .FIFO, - maximumActiveDownloads: Int = 4, - imageCache: ImageRequestCache? = AutoPurgingImageCache()) - { - self.sessionManager = Alamofire.Manager(configuration: configuration) - self.sessionManager.startRequestsImmediately = false - - self.downloadPrioritization = downloadPrioritization - self.maximumActiveDownloads = maximumActiveDownloads - self.imageCache = imageCache - } - - /** - Initializes the `ImageDownloader` instance with the given sesion manager, download prioritization, maximum - active download count and image cache. - - - parameter sessionManager: The Alamofire `Manager` instance to handle all download requests. - - parameter downloadPrioritization: The download prioritization of the download queue. `.FIFO` by default. - - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time. - - parameter imageCache: The image cache used to store all downloaded images in. - - - returns: The new `ImageDownloader` instance. - */ - public init( - sessionManager: Manager, - downloadPrioritization: DownloadPrioritization = .FIFO, - maximumActiveDownloads: Int = 4, - imageCache: ImageRequestCache? = AutoPurgingImageCache()) - { - self.sessionManager = sessionManager - self.sessionManager.startRequestsImmediately = false - - self.downloadPrioritization = downloadPrioritization - self.maximumActiveDownloads = maximumActiveDownloads - self.imageCache = imageCache - } - - // MARK: - Authentication - - /** - Associates an HTTP Basic Auth credential with all future download requests. - - - parameter user: The user. - - parameter password: The password. - - parameter persistence: The URL credential persistence. `.ForSession` by default. - */ - public func addAuthentication( - user user: String, - password: String, - persistence: NSURLCredentialPersistence = .ForSession) - { - let credential = NSURLCredential(user: user, password: password, persistence: persistence) - addAuthentication(usingCredential: credential) - } - - /** - Associates the specified credential with all future download requests. - - - parameter credential: The credential. - */ - public func addAuthentication(usingCredential credential: NSURLCredential) { - dispatch_sync(synchronizationQueue) { - self.credential = credential - } - } - - // MARK: - Download - - /** - Creates a download request using the internal Alamofire `Manager` instance for the specified URL request. - - If the same download request is already in the queue or currently being downloaded, the filter and completion - handler are appended to the already existing request. Once the request completes, all filters and completion - handlers attached to the request are executed in the order they were added. Additionally, any filters attached - to the request with the same identifiers are only executed once. The resulting image is then passed into each - completion handler paired with the filter. - - You should not attempt to directly cancel the `request` inside the request receipt since other callers may be - relying on the completion of that request. Instead, you should call `cancelRequestForRequestReceipt` with the - returned request receipt to allow the `ImageDownloader` to optimize the cancellation on behalf of all active - callers. - - - parameter URLRequest: The URL request. - - parameter receiptID: The `identifier` for the `RequestReceipt` returned. Defaults to a new, randomly - generated UUID. - - parameter filter: The image filter to apply to the image after the download is complete. Defaults - to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. - Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: The closure called when the download request is complete. Defaults to `nil`. - - - returns: The request receipt for the download request if available. `nil` if the image is stored in the image - cache and the URL request cache policy allows the cache to be used. - */ - public func downloadImage( - URLRequest URLRequest: URLRequestConvertible, - receiptID: String = NSUUID().UUIDString, - filter: ImageFilter? = nil, - progress: ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: CompletionHandler?) - -> RequestReceipt? - { - var request: Request! - - dispatch_sync(synchronizationQueue) { - // 1) Append the filter and completion handler to a pre-existing request if it already exists - let identifier = ImageDownloader.identifierForURLRequest(URLRequest) - - if let responseHandler = self.responseHandlers[identifier] { - responseHandler.operations.append(id: receiptID, filter: filter, completion: completion) - request = responseHandler.request - return - } - - // 2) Attempt to load the image from the image cache if the cache policy allows it - switch URLRequest.URLRequest.cachePolicy { - case .UseProtocolCachePolicy, .ReturnCacheDataElseLoad, .ReturnCacheDataDontLoad: - if let image = self.imageCache?.imageForRequest( - URLRequest.URLRequest, - withAdditionalIdentifier: filter?.identifier) - { - dispatch_async(dispatch_get_main_queue()) { - let response = Response( - request: URLRequest.URLRequest, - response: nil, - data: nil, - result: .Success(image) - ) - - completion?(response) - } - - return - } - default: - break - } - - // 3) Create the request and set up authentication, validation and response serialization - request = self.sessionManager.request(URLRequest) - - if let credential = self.credential { - request.authenticate(usingCredential: credential) - } - - request.validate() - - if let progress = progress { - request.progress { bytesRead, totalBytesRead, totalExpectedBytesToRead in - dispatch_async(progressQueue) { - progress( - bytesRead: bytesRead, - totalBytesRead: totalBytesRead, - totalExpectedBytesToRead: totalExpectedBytesToRead - ) - } - } - } - - request.response( - queue: self.responseQueue, - responseSerializer: Request.imageResponseSerializer(), - completionHandler: { [weak self] response in - guard let strongSelf = self, let request = response.request else { return } - - let responseHandler = strongSelf.safelyRemoveResponseHandlerWithIdentifier(identifier) - - switch response.result { - case .Success(let image): - var filteredImages: [String: Image] = [:] - - for (_, filter, completion) in responseHandler.operations { - var filteredImage: Image - - if let filter = filter { - if let alreadyFilteredImage = filteredImages[filter.identifier] { - filteredImage = alreadyFilteredImage - } else { - filteredImage = filter.filter(image) - filteredImages[filter.identifier] = filteredImage - } - } else { - filteredImage = image - } - - strongSelf.imageCache?.addImage( - filteredImage, - forRequest: request, - withAdditionalIdentifier: filter?.identifier - ) - - dispatch_async(dispatch_get_main_queue()) { - let response = Response( - request: response.request, - response: response.response, - data: response.data, - result: .Success(filteredImage), - timeline: response.timeline - ) - - completion?(response) - } - } - case .Failure: - for (_, _, completion) in responseHandler.operations { - dispatch_async(dispatch_get_main_queue()) { completion?(response) } - } - } - - strongSelf.safelyDecrementActiveRequestCount() - strongSelf.safelyStartNextRequestIfNecessary() - } - ) - - // 4) Store the response handler for use when the request completes - let responseHandler = ResponseHandler( - request: request, - id: receiptID, - filter: filter, - completion: completion - ) - - self.responseHandlers[identifier] = responseHandler - - // 5) Either start the request or enqueue it depending on the current active request count - if self.isActiveRequestCountBelowMaximumLimit() { - self.startRequest(request) - } else { - self.enqueueRequest(request) - } - } - - if let request = request { - return RequestReceipt(request: request, receiptID: receiptID) - } - - return nil - } - - /** - Creates a download request using the internal Alamofire `Manager` instance for each specified URL request. - - For each request, if the same download request is already in the queue or currently being downloaded, the - filter and completion handler are appended to the already existing request. Once the request completes, all - filters and completion handlers attached to the request are executed in the order they were added. - Additionally, any filters attached to the request with the same identifiers are only executed once. The - resulting image is then passed into each completion handler paired with the filter. - - You should not attempt to directly cancel any of the `request`s inside the request receipts array since other - callers may be relying on the completion of that request. Instead, you should call - `cancelRequestForRequestReceipt` with the returned request receipt to allow the `ImageDownloader` to optimize - the cancellation on behalf of all active callers. - - - parameter URLRequests: The URL requests. - - parameter filter The image filter to apply to the image after each download is complete. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. Defaults - to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: The closure called when each download request is complete. - - - returns: The request receipts for the download requests if available. If an image is stored in the image - cache and the URL request cache policy allows the cache to be used, a receipt will not be returned - for that request. - */ - public func downloadImages( - URLRequests URLRequests: [URLRequestConvertible], - filter: ImageFilter? = nil, - progress: ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: CompletionHandler? = nil) - -> [RequestReceipt] - { - return URLRequests.flatMap { - downloadImage( - URLRequest: $0, - filter: filter, - progress: progress, - progressQueue: progressQueue, - completion: completion - ) - } - } - - /** - Cancels the request in the receipt by removing the response handler and cancelling the request if necessary. - - If the request is pending in the queue, it will be cancelled if no other response handlers are registered with - the request. If the request is currently executing or is already completed, the response handler is removed and - will not be called. - - - parameter requestReceipt: The request receipt to cancel. - */ - public func cancelRequestForRequestReceipt(requestReceipt: RequestReceipt) { - dispatch_sync(synchronizationQueue) { - let identifier = ImageDownloader.identifierForURLRequest(requestReceipt.request.request!) - guard let responseHandler = self.responseHandlers[identifier] else { return } - - if let index = responseHandler.operations.indexOf({ $0.id == requestReceipt.receiptID }) { - let operation = responseHandler.operations.removeAtIndex(index) - - let response: Response = { - let URLRequest = requestReceipt.request.request! - let error: NSError = { - let failureReason = "ImageDownloader cancelled URL request: \(URLRequest.URLString)" - let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason] - return NSError(domain: Error.Domain, code: NSURLErrorCancelled, userInfo: userInfo) - }() - - return Response(request: URLRequest, response: nil, data: nil, result: .Failure(error)) - }() - - dispatch_async(dispatch_get_main_queue()) { operation.completion?(response) } - } - - if responseHandler.operations.isEmpty && requestReceipt.request.task.state == .Suspended { - requestReceipt.request.cancel() - } - } - } - - // MARK: - Internal - Thread-Safe Request Methods - - func safelyRemoveResponseHandlerWithIdentifier(identifier: String) -> ResponseHandler { - var responseHandler: ResponseHandler! - - dispatch_sync(synchronizationQueue) { - responseHandler = self.responseHandlers.removeValueForKey(identifier) - } - - return responseHandler - } - - func safelyStartNextRequestIfNecessary() { - dispatch_sync(synchronizationQueue) { - guard self.isActiveRequestCountBelowMaximumLimit() else { return } - - while (!self.queuedRequests.isEmpty) { - if let request = self.dequeueRequest() where request.task.state == .Suspended { - self.startRequest(request) - break - } - } - } - } - - func safelyDecrementActiveRequestCount() { - dispatch_sync(self.synchronizationQueue) { - if self.activeRequestCount > 0 { - self.activeRequestCount -= 1 - } - } - } - - // MARK: - Internal - Non Thread-Safe Request Methods - - func startRequest(request: Request) { - request.resume() - activeRequestCount += 1 - } - - func enqueueRequest(request: Request) { - switch downloadPrioritization { - case .FIFO: - queuedRequests.append(request) - case .LIFO: - queuedRequests.insert(request, atIndex: 0) - } - } - - func dequeueRequest() -> Request? { - var request: Request? - - if !queuedRequests.isEmpty { - request = queuedRequests.removeFirst() - } - - return request - } - - func isActiveRequestCountBelowMaximumLimit() -> Bool { - return activeRequestCount < maximumActiveDownloads - } - - static func identifierForURLRequest(URLRequest: URLRequestConvertible) -> String { - return URLRequest.URLRequest.URLString - } -} diff --git a/Pods/AlamofireImage/Source/ImageFilter.swift b/Pods/AlamofireImage/Source/ImageFilter.swift deleted file mode 100644 index 0549ed4..0000000 --- a/Pods/AlamofireImage/Source/ImageFilter.swift +++ /dev/null @@ -1,428 +0,0 @@ -// ImageFilter.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -#if os(iOS) || os(tvOS) || os(watchOS) -import UIKit -#elseif os(OSX) -import Cocoa -#endif - -// MARK: ImageFilter - -/// The `ImageFilter` protocol defines properties for filtering an image as well as identification of the filter. -public protocol ImageFilter { - /// A closure used to create an alternative representation of the given image. - var filter: Image -> Image { get } - - /// The string used to uniquely identify the filter operation. - var identifier: String { get } -} - -extension ImageFilter { - /// The unique identifier for any `ImageFilter` type. - public var identifier: String { return "\(self.dynamicType)" } -} - -// MARK: - Sizable - -/// The `Sizable` protocol defines a size property intended for use with `ImageFilter` types. -public protocol Sizable { - /// The size of the type. - var size: CGSize { get } -} - -extension ImageFilter where Self: Sizable { - /// The unique idenitifier for an `ImageFilter` conforming to the `Sizable` protocol. - public var identifier: String { - let width = Int64(round(size.width)) - let height = Int64(round(size.height)) - - return "\(self.dynamicType)-size:(\(width)x\(height))" - } -} - -// MARK: - Roundable - -/// The `Roundable` protocol defines a radius property intended for use with `ImageFilter` types. -public protocol Roundable { - /// The radius of the type. - var radius: CGFloat { get } -} - -extension ImageFilter where Self: Roundable { - /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol. - public var identifier: String { - let radius = Int64(round(self.radius)) - return "\(self.dynamicType)-radius:(\(radius))" - } -} - -// MARK: - DynamicImageFilter - -/// The `DynamicImageFilter` class simplifies custom image filter creation by using a trailing closure initializer. -public struct DynamicImageFilter: ImageFilter { - /// The string used to uniquely identify the image filter operation. - public let identifier: String - - /// A closure used to create an alternative representation of the given image. - public let filter: Image -> Image - - /** - Initializes the `DynamicImageFilter` instance with the specified identifier and filter closure. - - - parameter identifier: The unique identifier of the filter. - - parameter filter: A closure used to create an alternative representation of the given image. - - - returns: The new `DynamicImageFilter` instance. - */ - public init(_ identifier: String, filter: Image -> Image) { - self.identifier = identifier - self.filter = filter - } -} - -// MARK: - CompositeImageFilter - -/// The `CompositeImageFilter` protocol defines an additional `filters` property to support multiple composite filters. -public protocol CompositeImageFilter: ImageFilter { - /// The image filters to apply to the image in sequential order. - var filters: [ImageFilter] { get } -} - -public extension CompositeImageFilter { - /// The unique idenitifier for any `CompositeImageFilter` type. - var identifier: String { - return filters.map { $0.identifier }.joinWithSeparator("_") - } - - /// The filter closure for any `CompositeImageFilter` type. - var filter: Image -> Image { - return { image in - return self.filters.reduce(image) { $1.filter($0) } - } - } -} - -// MARK: - DynamicCompositeImageFilter - -/// The `DynamicCompositeImageFilter` class is a composite image filter based on a specified array of filters. -public struct DynamicCompositeImageFilter: CompositeImageFilter { - /// The image filters to apply to the image in sequential order. - public let filters: [ImageFilter] - - /** - Initializes the `DynamicCompositeImageFilter` instance with the given filters. - - - parameter filters: The filters taking part in the composite image filter. - - - returns: The new `DynamicCompositeImageFilter` instance. - */ - public init(_ filters: [ImageFilter]) { - self.filters = filters - } - - /** - Initializes the `DynamicCompositeImageFilter` instance with the given filters. - - - parameter filters: The filters taking part in the composite image filter. - - - returns: The new `DynamicCompositeImageFilter` instance. - */ - public init(_ filters: ImageFilter...) { - self.init(filters) - } -} - -#if os(iOS) || os(tvOS) || os(watchOS) - -// MARK: - Single Pass Image Filters (iOS, tvOS and watchOS only) - - -/// Scales an image to a specified size. -public struct ScaledToSizeFilter: ImageFilter, Sizable { - /// The size of the filter. - public let size: CGSize - - /** - Initializes the `ScaledToSizeFilter` instance with the given size. - - - parameter size: The size. - - - returns: The new `ScaledToSizeFilter` instance. - */ - public init(size: CGSize) { - self.size = size - } - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - return image.af_imageScaledToSize(self.size) - } - } -} - -// MARK: - - -/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size. -public struct AspectScaledToFitSizeFilter: ImageFilter, Sizable { - /// The size of the filter. - public let size: CGSize - - /** - Initializes the `AspectScaledToFitSizeFilter` instance with the given size. - - - parameter size: The size. - - - returns: The new `AspectScaledToFitSizeFilter` instance. - */ - public init(size: CGSize) { - self.size = size - } - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - return image.af_imageAspectScaledToFitSize(self.size) - } - } -} - -// MARK: - - -/// Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall -/// outside the specified size are clipped. -public struct AspectScaledToFillSizeFilter: ImageFilter, Sizable { - /// The size of the filter. - public let size: CGSize - - /** - Initializes the `AspectScaledToFillSizeFilter` instance with the given size. - - - parameter size: The size. - - - returns: The new `AspectScaledToFillSizeFilter` instance. - */ - public init(size: CGSize) { - self.size = size - } - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - return image.af_imageAspectScaledToFillSize(self.size) - } - } -} - -// MARK: - - -/// Rounds the corners of an image to the specified radius. -public struct RoundedCornersFilter: ImageFilter, Roundable { - /// The radius of the filter. - public let radius: CGFloat - - /// Whether to divide the radius by the image scale. - public let divideRadiusByImageScale: Bool - - /** - Initializes the `RoundedCornersFilter` instance with the given radius. - - - parameter radius: The radius. - - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the - image has the same resolution for all screen scales such as @1x, @2x and - @3x (i.e. single image from web server). Set to `false` for images loaded - from an asset catalog with varying resolutions for each screen scale. - `false` by default. - - - returns: The new `RoundedCornersFilter` instance. - */ - public init(radius: CGFloat, divideRadiusByImageScale: Bool = false) { - self.radius = radius - self.divideRadiusByImageScale = divideRadiusByImageScale - } - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - return image.af_imageWithRoundedCornerRadius( - self.radius, - divideRadiusByImageScale: self.divideRadiusByImageScale - ) - } - } - - /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol. - public var identifier: String { - let radius = Int64(round(self.radius)) - return "\(self.dynamicType)-radius:(\(radius))-divided:(\(divideRadiusByImageScale))" - } -} - -// MARK: - - -/// Rounds the corners of an image into a circle. -public struct CircleFilter: ImageFilter { - /** - Initializes the `CircleFilter` instance. - - - returns: The new `CircleFilter` instance. - */ - public init() {} - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - return image.af_imageRoundedIntoCircle() - } - } -} - -// MARK: - - -#if os(iOS) || os(tvOS) - -/// Blurs an image using a `CIGaussianBlur` filter with the specified blur radius. -public struct BlurFilter: ImageFilter { - /// The blur radius of the filter. - let blurRadius: UInt - - /** - Initializes the `BlurFilter` instance with the given blur radius. - - - parameter blurRadius: The blur radius. - - - returns: The new `BlurFilter` instance. - */ - public init(blurRadius: UInt = 10) { - self.blurRadius = blurRadius - } - - /// The filter closure used to create the modified representation of the given image. - public var filter: Image -> Image { - return { image in - let parameters = ["inputRadius": self.blurRadius] - return image.af_imageWithAppliedCoreImageFilter("CIGaussianBlur", filterParameters: parameters) ?? image - } - } -} - -#endif - -// MARK: - Composite Image Filters (iOS, tvOS and watchOS only) - - -/// Scales an image to a specified size, then rounds the corners to the specified radius. -public struct ScaledToSizeWithRoundedCornersFilter: CompositeImageFilter { - /** - Initializes the `ScaledToSizeWithRoundedCornersFilter` instance with the given size and radius. - - - parameter size: The size. - - parameter radius: The radius. - - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the - image has the same resolution for all screen scales such as @1x, @2x and - @3x (i.e. single image from web server). Set to `false` for images loaded - from an asset catalog with varying resolutions for each screen scale. - `false` by default. - - - returns: The new `ScaledToSizeWithRoundedCornersFilter` instance. - */ - public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) { - self.filters = [ - ScaledToSizeFilter(size: size), - RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale) - ] - } - - /// The image filters to apply to the image in sequential order. - public let filters: [ImageFilter] -} - -// MARK: - - -/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the -/// corners to the specified radius. -public struct AspectScaledToFillSizeWithRoundedCornersFilter: CompositeImageFilter { - /** - Initializes the `AspectScaledToFillSizeWithRoundedCornersFilter` instance with the given size and radius. - - - parameter size: The size. - - parameter radius: The radius. - - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the - image has the same resolution for all screen scales such as @1x, @2x and - @3x (i.e. single image from web server). Set to `false` for images loaded - from an asset catalog with varying resolutions for each screen scale. - `false` by default. - - - returns: The new `AspectScaledToFillSizeWithRoundedCornersFilter` instance. - */ - public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) { - self.filters = [ - AspectScaledToFillSizeFilter(size: size), - RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale) - ] - } - - /// The image filters to apply to the image in sequential order. - public let filters: [ImageFilter] -} - -// MARK: - - -/// Scales an image to a specified size, then rounds the corners into a circle. -public struct ScaledToSizeCircleFilter: CompositeImageFilter { - /** - Initializes the `ScaledToSizeCircleFilter` instance with the given size. - - - parameter size: The size. - - - returns: The new `ScaledToSizeCircleFilter` instance. - */ - public init(size: CGSize) { - self.filters = [ScaledToSizeFilter(size: size), CircleFilter()] - } - - /// The image filters to apply to the image in sequential order. - public let filters: [ImageFilter] -} - -// MARK: - - -/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the -/// corners into a circle. -public struct AspectScaledToFillSizeCircleFilter: CompositeImageFilter { - /** - Initializes the `AspectScaledToFillSizeCircleFilter` instance with the given size. - - - parameter size: The size. - - - returns: The new `AspectScaledToFillSizeCircleFilter` instance. - */ - public init(size: CGSize) { - self.filters = [AspectScaledToFillSizeFilter(size: size), CircleFilter()] - } - - /// The image filters to apply to the image in sequential order. - public let filters: [ImageFilter] -} - -#endif diff --git a/Pods/AlamofireImage/Source/Request+AlamofireImage.swift b/Pods/AlamofireImage/Source/Request+AlamofireImage.swift deleted file mode 100644 index d8516af..0000000 --- a/Pods/AlamofireImage/Source/Request+AlamofireImage.swift +++ /dev/null @@ -1,236 +0,0 @@ -// Request+AlamofireImage.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Alamofire -import Foundation - -#if os(iOS) || os(tvOS) -import UIKit -#elseif os(watchOS) -import UIKit -import WatchKit -#elseif os(OSX) -import Cocoa -#endif - -extension Request { - static var acceptableImageContentTypes: Set = [ - "image/tiff", - "image/jpeg", - "image/gif", - "image/png", - "image/ico", - "image/x-icon", - "image/bmp", - "image/x-bmp", - "image/x-xbitmap", - "image/x-ms-bmp", - "image/x-win-bitmap" - ] - - /** - Adds the content types specified to the list of acceptable images content types for validation. - - - parameter contentTypes: The additional content types. - */ - public class func addAcceptableImageContentTypes(contentTypes: Set) { - Request.acceptableImageContentTypes.unionInPlace(contentTypes) - } - - // MARK: - iOS, tvOS and watchOS - -#if os(iOS) || os(tvOS) || os(watchOS) - - /** - Creates a response serializer that returns an image initialized from the response data using the specified - image options. - - - parameter imageScale: The scale factor used when interpreting the image data to construct - `responseImage`. Specifying a scale factor of 1.0 results in an image whose - size matches the pixel-based dimensions of the image. Applying a different - scale factor changes the size of the image as reported by the size property. - `Screen.scale` by default. - - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats - (such as PNG or JPEG). Enabling this can significantly improve drawing - performance as it allows a bitmap representation to be constructed in the - background rather than on the main thread. `true` by default. - - - returns: An image response serializer. - */ - public class func imageResponseSerializer( - imageScale imageScale: CGFloat = Request.imageScale, - inflateResponseImage: Bool = true) - -> ResponseSerializer - { - return ResponseSerializer { request, response, data, error in - guard error == nil else { return .Failure(error!) } - - guard let validData = data where validData.length > 0 else { - return .Failure(Request.imageDataError()) - } - - guard Request.validateContentTypeForRequest(request, response: response) else { - return .Failure(Request.contentTypeValidationError()) - } - - do { - let image = try Request.imageFromResponseData(validData, imageScale: imageScale) - if inflateResponseImage { image.af_inflate() } - - return .Success(image) - } catch { - return .Failure(error as NSError) - } - } - } - - /** - Adds a handler to be called once the request has finished. - - - parameter imageScale: The scale factor used when interpreting the image data to construct - `responseImage`. Specifying a scale factor of 1.0 results in an image whose - size matches the pixel-based dimensions of the image. Applying a different - scale factor changes the size of the image as reported by the size property. - This is set to the value of scale of the main screen by default, which - automatically scales images for retina displays, for instance. - `Screen.scale` by default. - - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats - (such as PNG or JPEG). Enabling this can significantly improve drawing - performance as it allows a bitmap representation to be constructed in the - background rather than on the main thread. `true` by default. - - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4 - arguments: the URL request, the URL response, if one was received, the image, - if one could be created from the URL response and data, and any error produced - while creating the image. - - - returns: The request. - */ - public func responseImage( - imageScale: CGFloat = Request.imageScale, - inflateResponseImage: Bool = true, - completionHandler: Response -> Void) - -> Self - { - return response( - responseSerializer: Request.imageResponseSerializer( - imageScale: imageScale, - inflateResponseImage: inflateResponseImage - ), - completionHandler: completionHandler - ) - } - - private class func imageFromResponseData(data: NSData, imageScale: CGFloat) throws -> UIImage { - if let image = UIImage.af_threadSafeImageWithData(data, scale: imageScale) { - return image - } - - throw imageDataError() - } - - private class var imageScale: CGFloat { - #if os(iOS) || os(tvOS) - return UIScreen.mainScreen().scale - #elseif os(watchOS) - return WKInterfaceDevice.currentDevice().screenScale - #endif - } - -#elseif os(OSX) - - // MARK: - OSX - - /** - Creates a response serializer that returns an image initialized from the response data. - - - returns: An image response serializer. - */ - public class func imageResponseSerializer() -> ResponseSerializer { - return ResponseSerializer { request, response, data, error in - guard error == nil else { return .Failure(error!) } - - guard let validData = data where validData.length > 0 else { - return .Failure(Request.imageDataError()) - } - - guard Request.validateContentTypeForRequest(request, response: response) else { - return .Failure(Request.contentTypeValidationError()) - } - - guard let bitmapImage = NSBitmapImageRep(data: validData) else { - return .Failure(Request.imageDataError()) - } - - let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh)) - image.addRepresentation(bitmapImage) - - return .Success(image) - } - } - - /** - Adds a handler to be called once the request has finished. - - - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4 - arguments: the URL request, the URL response, if one was received, the image, if - one could be created from the URL response and data, and any error produced while - creating the image. - - - returns: The request. - */ - public func responseImage(completionHandler: Response -> Void) -> Self { - return response( - responseSerializer: Request.imageResponseSerializer(), - completionHandler: completionHandler - ) - } - -#endif - - // MARK: - Private - Shared Helper Methods - - private class func validateContentTypeForRequest( - request: NSURLRequest?, - response: NSHTTPURLResponse?) - -> Bool - { - if let URL = request?.URL where URL.fileURL { - return true - } - - if let mimeType = response?.MIMEType where Request.acceptableImageContentTypes.contains(mimeType) { - return true - } - - return false - } - - private class func contentTypeValidationError() -> NSError { - let failureReason = "Failed to validate response due to unacceptable content type" - return Error.errorWithCode(NSURLErrorCannotDecodeContentData, failureReason: failureReason) - } - - private class func imageDataError() -> NSError { - let failureReason = "Failed to create a valid Image from the response data" - return Error.errorWithCode(NSURLErrorCannotDecodeContentData, failureReason: failureReason) - } -} diff --git a/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift b/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift deleted file mode 100644 index c1714ed..0000000 --- a/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift +++ /dev/null @@ -1,437 +0,0 @@ -// UIButton+AlamofireImage.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Alamofire -import Foundation -import UIKit - -extension UIButton { - - // MARK: - Private - AssociatedKeys - - private struct AssociatedKeys { - static var ImageDownloaderKey = "af_UIButton.ImageDownloader" - static var SharedImageDownloaderKey = "af_UIButton.SharedImageDownloader" - static var ImageReceiptsKey = "af_UIButton.ImageReceipts" - static var BackgroundImageReceiptsKey = "af_UIButton.BackgroundImageReceipts" - } - - // MARK: - Properties - - /// The instance image downloader used to download all images. If this property is `nil`, the `UIButton` will - /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a - /// custom instance image downloader is when images are behind different basic auth credentials. - public var af_imageDownloader: ImageDownloader? { - get { - return objc_getAssociatedObject(self, &AssociatedKeys.ImageDownloaderKey) as? ImageDownloader - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.ImageDownloaderKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader` - /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory - /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the - /// `af_imageDownloader` is `nil`. - public class var af_sharedImageDownloader: ImageDownloader { - get { - guard let - downloader = objc_getAssociatedObject(self, &AssociatedKeys.SharedImageDownloaderKey) as? ImageDownloader - else { - return ImageDownloader.defaultInstance - } - - return downloader - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.SharedImageDownloaderKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - private var imageRequestReceipts: [UInt: RequestReceipt] { - get { - guard let - receipts = objc_getAssociatedObject(self, &AssociatedKeys.ImageReceiptsKey) as? [UInt: RequestReceipt] - else { - return [:] - } - - return receipts - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.ImageReceiptsKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - private var backgroundImageRequestReceipts: [UInt: RequestReceipt] { - get { - guard let - receipts = objc_getAssociatedObject(self, &AssociatedKeys.BackgroundImageReceiptsKey) as? [UInt: RequestReceipt] - else { - return [:] - } - - return receipts - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.BackgroundImageReceiptsKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - // MARK: - Image Downloads - - /** - Asynchronously downloads an image from the specified URL and sets it once the request is finished. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - - parameter state: The control state of the button to set the image on. - - parameter URL: The URL used for your image request. - - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the - image will not change its image until the image request finishes. Defaults - to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. - Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: A closure to be executed when the image request finishes. The closure takes a - single response value containing either the image or the error that occurred. If - the image was returned from the image cache, the response will be `nil`. Defaults - to `nil`. - */ - public func af_setImageForState( - state: UIControlState, - URL: NSURL, - placeHolderImage: UIImage? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: (Response -> Void)? = nil) - { - af_setImageForState(state, - URLRequest: URLRequestWithURL(URL), - placeholderImage: placeHolderImage, - progress: progress, - progressQueue: progressQueue, - completion: completion - ) - } - - /** - Asynchronously downloads an image from the specified URL request and sets it once the request is finished. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - - parameter state: The control state of the button to set the image on. - - parameter URLRequest: The URL request. - - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the - image will not change its image until the image request finishes. Defaults - to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. - Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: A closure to be executed when the image request finishes. The closure takes a - single response value containing either the image or the error that occurred. If - the image was returned from the image cache, the response will be `nil`. Defaults - to `nil`. - */ - public func af_setImageForState( - state: UIControlState, - URLRequest: URLRequestConvertible, - placeholderImage: UIImage? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: (Response -> Void)? = nil) - { - guard !isImageURLRequest(URLRequest, equalToActiveRequestURLForState: state) else { return } - - af_cancelImageRequestForState(state) - - let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader - let imageCache = imageDownloader.imageCache - - // Use the image from the image cache if it exists - if let image = imageCache?.imageForRequest(URLRequest.URLRequest, withAdditionalIdentifier: nil) { - let response = Response( - request: URLRequest.URLRequest, - response: nil, - data: nil, - result: .Success(image) - ) - - completion?(response) - setImage(image, forState: state) - - return - } - - // Set the placeholder since we're going to have to download - if let placeholderImage = placeholderImage { self.setImage(placeholderImage, forState: state) } - - // Generate a unique download id to check whether the active request has changed while downloading - let downloadID = NSUUID().UUIDString - - // Download the image, then set the image for the control state - let requestReceipt = imageDownloader.downloadImage( - URLRequest: URLRequest, - receiptID: downloadID, - filter: nil, - progress: progress, - progressQueue: progressQueue, - completion: { [weak self] response in - guard let strongSelf = self else { return } - - completion?(response) - - guard - strongSelf.isImageURLRequest(response.request, equalToActiveRequestURLForState: state) && - strongSelf.imageRequestReceiptForState(state)?.receiptID == downloadID - else { - return - } - - if let image = response.result.value { - strongSelf.setImage(image, forState: state) - } - - strongSelf.setImageRequestReceipt(nil, forState: state) - } - ) - - setImageRequestReceipt(requestReceipt, forState: state) - } - - /** - Cancels the active download request for the image, if one exists. - */ - public func af_cancelImageRequestForState(state: UIControlState) { - guard let receipt = imageRequestReceiptForState(state) else { return } - - let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader - imageDownloader.cancelRequestForRequestReceipt(receipt) - - setImageRequestReceipt(nil, forState: state) - } - - // MARK: - Background Image Downloads - - /** - Asynchronously downloads an image from the specified URL and sets it once the request is finished. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - - parameter state: The control state of the button to set the image on. - - parameter URL: The URL used for the image request. - - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the - background image will not change its image until the image request finishes. - Defaults to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. - Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: A closure to be executed when the image request finishes. The closure takes a - single response value containing either the image or the error that occurred. If - the image was returned from the image cache, the response will be `nil`. Defaults - to `nil`. - */ - public func af_setBackgroundImageForState( - state: UIControlState, - URL: NSURL, - placeHolderImage: UIImage? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: (Response -> Void)? = nil) - { - af_setBackgroundImageForState(state, - URLRequest: URLRequestWithURL(URL), - placeholderImage: placeHolderImage, - completion: completion) - } - - /** - Asynchronously downloads an image from the specified URL request and sets it once the request is finished. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - - parameter state: The control state of the button to set the image on. - - parameter URLRequest: The URL request. - - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the - background image will not change its image until the image request finishes. - Defaults to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the request. - Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. - - parameter completion: A closure to be executed when the image request finishes. The closure takes a - single response value containing either the image or the error that occurred. If - the image was returned from the image cache, the response will be `nil`. Defaults - to `nil`. - */ - public func af_setBackgroundImageForState( - state: UIControlState, - URLRequest: URLRequestConvertible, - placeholderImage: UIImage? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - completion: (Response -> Void)? = nil) - { - guard !isImageURLRequest(URLRequest, equalToActiveRequestURLForState: state) else { return } - - af_cancelBackgroundImageRequestForState(state) - - let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader - let imageCache = imageDownloader.imageCache - - // Use the image from the image cache if it exists - if let image = imageCache?.imageForRequest(URLRequest.URLRequest, withAdditionalIdentifier: nil) { - let response = Response( - request: URLRequest.URLRequest, - response: nil, - data: nil, - result: .Success(image) - ) - - completion?(response) - setBackgroundImage(image, forState: state) - - return - } - - // Set the placeholder since we're going to have to download - if let placeholderImage = placeholderImage { self.setBackgroundImage(placeholderImage, forState: state) } - - // Generate a unique download id to check whether the active request has changed while downloading - let downloadID = NSUUID().UUIDString - - // Download the image, then set the image for the control state - let requestReceipt = imageDownloader.downloadImage( - URLRequest: URLRequest, - receiptID: downloadID, - progress: progress, - progressQueue: progressQueue, - filter: nil, - completion: { [weak self] response in - guard let strongSelf = self else { return } - - completion?(response) - - guard - strongSelf.isBackgroundImageURLRequest(response.request, equalToActiveRequestURLForState: state) && - strongSelf.backgroundImageRequestReceiptForState(state)?.receiptID == downloadID - else { - return - } - - if let image = response.result.value { - strongSelf.setBackgroundImage(image, forState: state) - } - - strongSelf.setBackgroundImageRequestReceipt(nil, forState: state) - } - ) - - setBackgroundImageRequestReceipt(requestReceipt, forState: state) - } - - /** - Cancels the active download request for the background image, if one exists. - */ - public func af_cancelBackgroundImageRequestForState(state: UIControlState) { - guard let receipt = backgroundImageRequestReceiptForState(state) else { return } - - let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader - imageDownloader.cancelRequestForRequestReceipt(receipt) - - setBackgroundImageRequestReceipt(nil, forState: state) - } - - // MARK: - Internal - Image Request Receipts - - func imageRequestReceiptForState(state: UIControlState) -> RequestReceipt? { - guard let receipt = imageRequestReceipts[state.rawValue] else { return nil } - return receipt - } - - func setImageRequestReceipt(receipt: RequestReceipt?, forState state: UIControlState) { - var receipts = imageRequestReceipts - receipts[state.rawValue] = receipt - - imageRequestReceipts = receipts - } - - // MARK: - Internal - Background Image Request Receipts - - func backgroundImageRequestReceiptForState(state: UIControlState) -> RequestReceipt? { - guard let receipt = backgroundImageRequestReceipts[state.rawValue] else { return nil } - return receipt - } - - func setBackgroundImageRequestReceipt(receipt: RequestReceipt?, forState state: UIControlState) { - var receipts = backgroundImageRequestReceipts - receipts[state.rawValue] = receipt - - backgroundImageRequestReceipts = receipts - } - - // MARK: - Private - URL Request Helpers - - private func isImageURLRequest( - URLRequest: URLRequestConvertible?, - equalToActiveRequestURLForState state: UIControlState) - -> Bool - { - if let - currentRequest = imageRequestReceiptForState(state)?.request.task.originalRequest - where currentRequest.URLString == URLRequest?.URLRequest.URLString - { - return true - } - - return false - } - - private func isBackgroundImageURLRequest( - URLRequest: URLRequestConvertible?, - equalToActiveRequestURLForState state: UIControlState) - -> Bool - { - if let - currentRequest = backgroundImageRequestReceiptForState(state)?.request.task.originalRequest - where currentRequest.URLString == URLRequest?.URLRequest.URLString - { - return true - } - - return false - } - - private func URLRequestWithURL(URL: NSURL) -> NSURLRequest { - let mutableURLRequest = NSMutableURLRequest(URL: URL) - - for mimeType in Request.acceptableImageContentTypes { - mutableURLRequest.addValue(mimeType, forHTTPHeaderField: "Accept") - } - - return mutableURLRequest - } -} diff --git a/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift b/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift deleted file mode 100644 index ddd460d..0000000 --- a/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift +++ /dev/null @@ -1,325 +0,0 @@ -// UIImage+AlamofireImage.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import CoreGraphics -import Foundation -import UIKit - -#if os(iOS) || os(tvOS) -import CoreImage -#endif - -// MARK: Initialization - -private let lock = NSLock() - -extension UIImage { - /** - Initializes and returns the image object with the specified data in a thread-safe manner. - - It has been reported that there are thread-safety issues when initializing large amounts of images - simultaneously. In the event of these issues occurring, this method can be used in place of - the `init?(data:)` method. - - - parameter data: The data object containing the image data. - - - returns: An initialized `UIImage` object, or `nil` if the method failed. - */ - public static func af_threadSafeImageWithData(data: NSData) -> UIImage? { - lock.lock() - let image = UIImage(data: data) - lock.unlock() - - return image - } - - /** - Initializes and returns the image object with the specified data and scale in a thread-safe manner. - - It has been reported that there are thread-safety issues when initializing large amounts of images - simultaneously. In the event of these issues occurring, this method can be used in place of - the `init?(data:scale:)` method. - - - parameter data: The data object containing the image data. - - parameter scale: The scale factor to assume when interpreting the image data. Applying a scale factor of 1.0 - results in an image whose size matches the pixel-based dimensions of the image. Applying a - different scale factor changes the size of the image as reported by the size property. - - - returns: An initialized `UIImage` object, or `nil` if the method failed. - */ - public static func af_threadSafeImageWithData(data: NSData, scale: CGFloat) -> UIImage? { - lock.lock() - let image = UIImage(data: data, scale: scale) - lock.unlock() - - return image - } -} - -// MARK: - Inflation - -extension UIImage { - private struct AssociatedKeys { - static var InflatedKey = "af_UIImage.Inflated" - } - - /// Returns whether the image is inflated. - public var af_inflated: Bool { - get { - if let inflated = objc_getAssociatedObject(self, &AssociatedKeys.InflatedKey) as? Bool { - return inflated - } else { - return false - } - } - set(inflated) { - objc_setAssociatedObject(self, &AssociatedKeys.InflatedKey, inflated, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - /** - Inflates the underlying compressed image data to be backed by an uncompressed bitmap representation. - - Inflating compressed image formats (such as PNG or JPEG) can significantly improve drawing performance as it - allows a bitmap representation to be constructed in the background rather than on the main thread. - */ - public func af_inflate() { - guard !af_inflated else { return } - - af_inflated = true - CGDataProviderCopyData(CGImageGetDataProvider(CGImage)) - } -} - -// MARK: - Alpha - -extension UIImage { - /// Returns whether the image contains an alpha component. - public var af_containsAlphaComponent: Bool { - let alphaInfo = CGImageGetAlphaInfo(CGImage) - - return ( - alphaInfo == .First || - alphaInfo == .Last || - alphaInfo == .PremultipliedFirst || - alphaInfo == .PremultipliedLast - ) - } - - /// Returns whether the image is opaque. - public var af_isOpaque: Bool { return !af_containsAlphaComponent } -} - -// MARK: - Scaling - -extension UIImage { - /** - Returns a new version of the image scaled to the specified size. - - - parameter size: The size to use when scaling the new image. - - - returns: A new image object. - */ - public func af_imageScaledToSize(size: CGSize) -> UIImage { - UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0) - drawInRect(CGRect(origin: CGPointZero, size: size)) - - let scaledImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return scaledImage - } - - /** - Returns a new version of the image scaled from the center while maintaining the aspect ratio to fit within - a specified size. - - The resulting image contains an alpha component used to pad the width or height with the necessary transparent - pixels to fit the specified size. In high performance critical situations, this may not be the optimal approach. - To maintain an opaque image, you could compute the `scaledSize` manually, then use the `af_imageScaledToSize` - method in conjunction with a `.Center` content mode to achieve the same visual result. - - - parameter size: The size to use when scaling the new image. - - - returns: A new image object. - */ - public func af_imageAspectScaledToFitSize(size: CGSize) -> UIImage { - let imageAspectRatio = self.size.width / self.size.height - let canvasAspectRatio = size.width / size.height - - var resizeFactor: CGFloat - - if imageAspectRatio > canvasAspectRatio { - resizeFactor = size.width / self.size.width - } else { - resizeFactor = size.height / self.size.height - } - - let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor) - let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0) - - UIGraphicsBeginImageContextWithOptions(size, false, 0.0) - drawInRect(CGRect(origin: origin, size: scaledSize)) - - let scaledImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return scaledImage - } - - /** - Returns a new version of the image scaled from the center while maintaining the aspect ratio to fill a - specified size. Any pixels that fall outside the specified size are clipped. - - - parameter size: The size to use when scaling the new image. - - - returns: A new image object. - */ - public func af_imageAspectScaledToFillSize(size: CGSize) -> UIImage { - let imageAspectRatio = self.size.width / self.size.height - let canvasAspectRatio = size.width / size.height - - var resizeFactor: CGFloat - - if imageAspectRatio > canvasAspectRatio { - resizeFactor = size.height / self.size.height - } else { - resizeFactor = size.width / self.size.width - } - - let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor) - let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0) - - UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0) - drawInRect(CGRect(origin: origin, size: scaledSize)) - - let scaledImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return scaledImage - } -} - -// MARK: - Rounded Corners - -extension UIImage { - /** - Returns a new version of the image with the corners rounded to the specified radius. - - - parameter radius: The radius to use when rounding the new image. - - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the - image has the same resolution for all screen scales such as @1x, @2x and - @3x (i.e. single image from web server). Set to `false` for images loaded - from an asset catalog with varying resolutions for each screen scale. - `false` by default. - - - returns: A new image object. - */ - public func af_imageWithRoundedCornerRadius(radius: CGFloat, divideRadiusByImageScale: Bool = false) -> UIImage { - UIGraphicsBeginImageContextWithOptions(size, false, 0.0) - - let scaledRadius = divideRadiusByImageScale ? radius / scale : radius - - let clippingPath = UIBezierPath(roundedRect: CGRect(origin: CGPointZero, size: size), cornerRadius: scaledRadius) - clippingPath.addClip() - - drawInRect(CGRect(origin: CGPointZero, size: size)) - - let roundedImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return roundedImage - } - - /** - Returns a new version of the image rounded into a circle. - - - returns: A new image object. - */ - public func af_imageRoundedIntoCircle() -> UIImage { - let radius = min(size.width, size.height) / 2.0 - var squareImage = self - - if size.width != size.height { - let squareDimension = min(size.width, size.height) - let squareSize = CGSize(width: squareDimension, height: squareDimension) - squareImage = af_imageAspectScaledToFillSize(squareSize) - } - - UIGraphicsBeginImageContextWithOptions(squareImage.size, false, 0.0) - - let clippingPath = UIBezierPath( - roundedRect: CGRect(origin: CGPointZero, size: squareImage.size), - cornerRadius: radius - ) - - clippingPath.addClip() - - squareImage.drawInRect(CGRect(origin: CGPointZero, size: squareImage.size)) - - let roundedImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return roundedImage - } -} - -#if os(iOS) || os(tvOS) - -// MARK: - Core Image Filters - -extension UIImage { - /** - Returns a new version of the image using a CoreImage filter with the specified name and parameters. - - - parameter filterName: The name of the CoreImage filter to use on the new image. - - parameter filterParameters: The parameters to apply to the CoreImage filter. - - - returns: A new image object, or `nil` if the filter failed for any reason. - */ - public func af_imageWithAppliedCoreImageFilter( - filterName: String, - filterParameters: [String: AnyObject]? = nil) -> UIImage? - { - var image: CoreImage.CIImage? = CIImage - - if image == nil, let CGImage = self.CGImage { - image = CoreImage.CIImage(CGImage: CGImage) - } - - guard let coreImage = image else { return nil } - - let context = CIContext(options: [kCIContextPriorityRequestLow: true]) - - var parameters: [String: AnyObject] = filterParameters ?? [:] - parameters[kCIInputImageKey] = coreImage - - guard let filter = CIFilter(name: filterName, withInputParameters: parameters) else { return nil } - guard let outputImage = filter.outputImage else { return nil } - - let cgImageRef = context.createCGImage(outputImage, fromRect: outputImage.extent) - - return UIImage(CGImage: cgImageRef, scale: scale, orientation: imageOrientation) - } -} - -#endif diff --git a/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift b/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift deleted file mode 100644 index 34eb533..0000000 --- a/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift +++ /dev/null @@ -1,389 +0,0 @@ -// UIImageView+AlamofireImage.swift -// -// Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Alamofire -import Foundation -import UIKit - -extension UIImageView { - - // MARK: - ImageTransition - - /// Used to wrap all `UIView` animation transition options alongside a duration. - public enum ImageTransition { - case None - case CrossDissolve(NSTimeInterval) - case CurlDown(NSTimeInterval) - case CurlUp(NSTimeInterval) - case FlipFromBottom(NSTimeInterval) - case FlipFromLeft(NSTimeInterval) - case FlipFromRight(NSTimeInterval) - case FlipFromTop(NSTimeInterval) - case Custom( - duration: NSTimeInterval, - animationOptions: UIViewAnimationOptions, - animations: (UIImageView, Image) -> Void, - completion: (Bool -> Void)? - ) - - /// The duration of the image transition in seconds. - public var duration: NSTimeInterval { - switch self { - case None: - return 0.0 - case CrossDissolve(let duration): - return duration - case CurlDown(let duration): - return duration - case CurlUp(let duration): - return duration - case FlipFromBottom(let duration): - return duration - case FlipFromLeft(let duration): - return duration - case FlipFromRight(let duration): - return duration - case FlipFromTop(let duration): - return duration - case Custom(let duration, _, _, _): - return duration - } - } - - /// The animation options of the image transition. - public var animationOptions: UIViewAnimationOptions { - switch self { - case None: - return .TransitionNone - case CrossDissolve: - return .TransitionCrossDissolve - case CurlDown: - return .TransitionCurlDown - case CurlUp: - return .TransitionCurlUp - case FlipFromBottom: - return .TransitionFlipFromBottom - case FlipFromLeft: - return .TransitionFlipFromLeft - case FlipFromRight: - return .TransitionFlipFromRight - case FlipFromTop: - return .TransitionFlipFromTop - case Custom(_, let animationOptions, _, _): - return animationOptions - } - } - - /// The animation options of the image transition. - public var animations: ((UIImageView, Image) -> Void) { - switch self { - case Custom(_, _, let animations, _): - return animations - default: - return { $0.image = $1 } - } - } - - /// The completion closure associated with the image transition. - public var completion: (Bool -> Void)? { - switch self { - case Custom(_, _, _, let completion): - return completion - default: - return nil - } - } - } - - // MARK: - Private - AssociatedKeys - - private struct AssociatedKeys { - static var ImageDownloaderKey = "af_UIImageView.ImageDownloader" - static var SharedImageDownloaderKey = "af_UIImageView.SharedImageDownloader" - static var ActiveRequestReceiptKey = "af_UIImageView.ActiveRequestReceipt" - } - - // MARK: - Associated Properties - - /// The instance image downloader used to download all images. If this property is `nil`, the `UIImageView` will - /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a - /// custom instance image downloader is when images are behind different basic auth credentials. - public var af_imageDownloader: ImageDownloader? { - get { - return objc_getAssociatedObject(self, &AssociatedKeys.ImageDownloaderKey) as? ImageDownloader - } - set(downloader) { - objc_setAssociatedObject(self, &AssociatedKeys.ImageDownloaderKey, downloader, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader` - /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory - /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the - /// `af_imageDownloader` is `nil`. - public class var af_sharedImageDownloader: ImageDownloader { - get { - if let downloader = objc_getAssociatedObject(self, &AssociatedKeys.SharedImageDownloaderKey) as? ImageDownloader { - return downloader - } else { - return ImageDownloader.defaultInstance - } - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.SharedImageDownloaderKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - var af_activeRequestReceipt: RequestReceipt? { - get { - return objc_getAssociatedObject(self, &AssociatedKeys.ActiveRequestReceiptKey) as? RequestReceipt - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.ActiveRequestReceiptKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - // MARK: - Image Download - - /** - Asynchronously downloads an image from the specified URL, applies the specified image filter to the downloaded - image and sets it once finished while executing the image transition. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - The `completion` closure is called after the image download and filtering are complete, but before the start of - the image transition. Please note it is no longer the responsibility of the `completion` closure to set the - image. It will be set automatically. If you require a second notification after the image transition completes, - use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when - the image transition is finished. - - - parameter URL: The URL used for the image request. - - parameter placeholderImage: The image to be set initially until the image request finished. If - `nil`, the image view will not change its image until the image - request finishes. Defaults to `nil`. - - parameter filter: The image filter applied to the image after the image request is - finished. Defaults to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the - request. Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the - main queue. - - parameter imageTransition: The image transition animation applied to the image when set. - Defaults to `.None`. - - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults - to `false`. - - parameter completion: A closure to be executed when the image request finishes. The closure - has no return value and takes three arguments: the original request, - the response from the server and the result containing either the - image or the error that occurred. If the image was returned from the - image cache, the response will be `nil`. Defaults to `nil`. - */ - public func af_setImageWithURL( - URL: NSURL, - placeholderImage: UIImage? = nil, - filter: ImageFilter? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - imageTransition: ImageTransition = .None, - runImageTransitionIfCached: Bool = false, - completion: (Response -> Void)? = nil) - { - af_setImageWithURLRequest( - URLRequestWithURL(URL), - placeholderImage: placeholderImage, - filter: filter, - progress: progress, - progressQueue: progressQueue, - imageTransition: imageTransition, - runImageTransitionIfCached: runImageTransitionIfCached, - completion: completion - ) - } - - /** - Asynchronously downloads an image from the specified URL Request, applies the specified image filter to the downloaded - image and sets it once finished while executing the image transition. - - If the image is cached locally, the image is set immediately. Otherwise the specified placehoder image will be - set immediately, and then the remote image will be set once the image request is finished. - - The `completion` closure is called after the image download and filtering are complete, but before the start of - the image transition. Please note it is no longer the responsibility of the `completion` closure to set the - image. It will be set automatically. If you require a second notification after the image transition completes, - use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when - the image transition is finished. - - - parameter URLRequest: The URL request. - - parameter placeholderImage: The image to be set initially until the image request finished. If - `nil`, the image view will not change its image until the image - request finishes. Defaults to `nil`. - - parameter filter: The image filter applied to the image after the image request is - finished. Defaults to `nil`. - - parameter progress: The closure to be executed periodically during the lifecycle of the - request. Defaults to `nil`. - - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the - main queue. - - parameter imageTransition: The image transition animation applied to the image when set. - Defaults to `.None`. - - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults - to `false`. - - parameter completion: A closure to be executed when the image request finishes. The closure - has no return value and takes three arguments: the original request, - the response from the server and the result containing either the - image or the error that occurred. If the image was returned from the - image cache, the response will be `nil`. Defaults to `nil`. - */ - public func af_setImageWithURLRequest( - URLRequest: URLRequestConvertible, - placeholderImage: UIImage? = nil, - filter: ImageFilter? = nil, - progress: ImageDownloader.ProgressHandler? = nil, - progressQueue: dispatch_queue_t = dispatch_get_main_queue(), - imageTransition: ImageTransition = .None, - runImageTransitionIfCached: Bool = false, - completion: (Response -> Void)? = nil) - { - guard !isURLRequestURLEqualToActiveRequestURL(URLRequest) else { return } - - af_cancelImageRequest() - - let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader - let imageCache = imageDownloader.imageCache - - // Use the image from the image cache if it exists - if let image = imageCache?.imageForRequest(URLRequest.URLRequest, withAdditionalIdentifier: filter?.identifier) { - let response = Response( - request: URLRequest.URLRequest, - response: nil, - data: nil, - result: .Success(image) - ) - - completion?(response) - - if runImageTransitionIfCached { - let tinyDelay = dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Float(NSEC_PER_SEC))) - - // Need to let the runloop cycle for the placeholder image to take affect - dispatch_after(tinyDelay, dispatch_get_main_queue()) { - self.runImageTransition(imageTransition, withImage: image) - } - } else { - self.image = image - } - - return - } - - // Set the placeholder since we're going to have to download - if let placeholderImage = placeholderImage { self.image = placeholderImage } - - // Generate a unique download id to check whether the active request has changed while downloading - let downloadID = NSUUID().UUIDString - - // Download the image, then run the image transition or completion handler - let requestReceipt = imageDownloader.downloadImage( - URLRequest: URLRequest, - receiptID: downloadID, - filter: filter, - progress: progress, - progressQueue: progressQueue, - completion: { [weak self] response in - guard let strongSelf = self else { return } - - completion?(response) - - guard - strongSelf.isURLRequestURLEqualToActiveRequestURL(response.request) && - strongSelf.af_activeRequestReceipt?.receiptID == downloadID - else { - return - } - - if let image = response.result.value { - strongSelf.runImageTransition(imageTransition, withImage: image) - } - - strongSelf.af_activeRequestReceipt = nil - } - ) - - af_activeRequestReceipt = requestReceipt - } - - // MARK: - Image Download Cancellation - - /** - Cancels the active download request, if one exists. - */ - public func af_cancelImageRequest() { - guard let activeRequestReceipt = af_activeRequestReceipt else { return } - - let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader - imageDownloader.cancelRequestForRequestReceipt(activeRequestReceipt) - - af_activeRequestReceipt = nil - } - - // MARK: - Image Transition - - /** - Runs the image transition on the image view with the specified image. - - - parameter imageTransition: The image transition to ran on the image view. - - parameter image: The image to use for the image transition. - */ - public func runImageTransition(imageTransition: ImageTransition, withImage image: Image) { - UIView.transitionWithView( - self, - duration: imageTransition.duration, - options: imageTransition.animationOptions, - animations: { - imageTransition.animations(self, image) - }, - completion: imageTransition.completion - ) - } - - // MARK: - Private - URL Request Helper Methods - - private func URLRequestWithURL(URL: NSURL) -> NSURLRequest { - let mutableURLRequest = NSMutableURLRequest(URL: URL) - - for mimeType in Request.acceptableImageContentTypes { - mutableURLRequest.addValue(mimeType, forHTTPHeaderField: "Accept") - } - - return mutableURLRequest - } - - private func isURLRequestURLEqualToActiveRequestURL(URLRequest: URLRequestConvertible?) -> Bool { - if let - currentRequest = af_activeRequestReceipt?.request.task.originalRequest - where currentRequest.URLString == URLRequest?.URLRequest.URLString - { - return true - } - - return false - } -} diff --git a/Pods/AwesomeCache/AwesomeCache/Cache.swift b/Pods/AwesomeCache/AwesomeCache/Cache.swift deleted file mode 100644 index 5531235..0000000 --- a/Pods/AwesomeCache/AwesomeCache/Cache.swift +++ /dev/null @@ -1,263 +0,0 @@ -import Foundation - -/// Represents the expiry of a cached object -public enum CacheExpiry { - case Never - case Seconds(NSTimeInterval) - case Date(NSDate) -} - -/// A generic cache that persists objects to disk and is backed by a NSCache. -/// Supports an expiry date for every cached object. Expired objects are automatically deleted upon their next access via `objectForKey:`. -/// If you want to delete expired objects, call `removeAllExpiredObjects`. -/// -/// Subclassing notes: This class fully supports subclassing. -/// The easiest way to implement a subclass is to override `objectForKey` and `setObject:forKey:expires:`, -/// e.g. to modify values prior to reading/writing to the cache. -public class Cache { - public let name: String - public let cacheDirectory: NSURL - - internal let cache = NSCache() // marked internal for testing - private let fileManager = NSFileManager() - private let diskWriteQueue: dispatch_queue_t = dispatch_queue_create("com.aschuch.cache.diskWriteQueue", DISPATCH_QUEUE_SERIAL) - private let diskReadQueue: dispatch_queue_t = dispatch_queue_create("com.aschuch.cache.diskReadQueue", DISPATCH_QUEUE_SERIAL) - - - // MARK: Initializers - - /// Designated initializer. - /// - /// - parameter name: Name of this cache - /// - parameter directory: Objects in this cache are persisted to this directory. - /// If no directory is specified, a new directory is created in the system's Caches directory - /// - /// - returns: A new cache with the given name and directory - public init(name: String, directory: NSURL?) throws { - self.name = name - cache.name = name - - if let d = directory { - cacheDirectory = d - } else { - let url = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first! - cacheDirectory = url.URLByAppendingPathComponent("com.aschuch.cache/\(name)") - } - - // Create directory on disk if needed - try fileManager.createDirectoryAtURL(cacheDirectory, withIntermediateDirectories: true, attributes: nil) - } - - /// Convenience Initializer - /// - /// - parameter name: Name of this cache - /// - /// - returns A new cache with the given name and the default cache directory - public convenience init(name: String) throws { - try self.init(name: name, directory: nil) - } - - - // MARK: Awesome caching - - /// Returns a cached object immediately or evaluates a cacheBlock. - /// The cacheBlock will not be re-evaluated until the object is expired or manually deleted. - /// If the cache already contains an object, the completion block is called with the cached object immediately. - /// - /// If no object is found or the cached object is already expired, the `cacheBlock` is called. - /// You might perform any tasks (e.g. network calls) within this block. Upon completion of these tasks, - /// make sure to call the `success` or `failure` block that is passed to the `cacheBlock`. - /// The completion block is invoked as soon as the cacheBlock is finished and the object is cached. - /// - /// - parameter key: The key to lookup the cached object - /// - parameter cacheBlock: This block gets called if there is no cached object or the cached object is already expired. - /// The supplied success or failure blocks must be called upon completion. - /// If the error block is called, the object is not cached and the completion block is invoked with this error. - /// - parameter completion: Called as soon as a cached object is available to use. The second parameter is true if the object was already cached. - public func setObjectForKey(key: String, cacheBlock: ((T, CacheExpiry) -> (), (NSError?) -> ()) -> (), completion: (T?, Bool, NSError?) -> ()) { - if let object = objectForKey(key) { - completion(object, true, nil) - } else { - let successBlock: (T, CacheExpiry) -> () = { (obj, expires) in - self.setObject(obj, forKey: key, expires: expires) - completion(obj, false, nil) - } - - let failureBlock: (NSError?) -> () = { (error) in - completion(nil, false, error) - } - - cacheBlock(successBlock, failureBlock) - } - } - - - // MARK: Get object - - /// Looks up and returns an object with the specified name if it exists. - /// If an object is already expired, it is automatically deleted and `nil` will be returned. - /// - /// - parameter key: The name of the object that should be returned - /// - /// - returns: The cached object for the given name, or nil - public func objectForKey(key: String) -> T? { - var possibleObject: CacheObject? - - // Check if object exists in local cache - possibleObject = cache.objectForKey(key) as? CacheObject - - if possibleObject == nil { - // Try to load object from disk (synchronously) - dispatch_sync(diskReadQueue) { - let path = self.urlForKey(key).path! - if self.fileManager.fileExistsAtPath(path) { - possibleObject = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CacheObject - } - } - } - - // Check if object is not already expired and return - // Delete object if expired - if let object = possibleObject { - if !object.isExpired() { - return object.value as? T - } else { - removeObjectForKey(key) - } - } - - return nil - } - - - // MARK: Set object - - /// Adds a given object to the cache. - /// The object is automatically marked as expired as soon as its expiry date is reached. - /// - /// - parameter object: The object that should be cached - /// - parameter forKey: A key that represents this object in the cache - /// - parameter expires: The CacheExpiry that indicates when the given object should be expired - public func setObject(object: T, forKey key: String, expires: CacheExpiry = .Never) { - setObject(object, forKey: key, expires: expires, completion: { }) - } - - /// For internal testing only, might add this to the public API if needed - internal func setObject(object: T, forKey key: String, expires: CacheExpiry = .Never, completion: () -> ()) { - let expiryDate = expiryDateForCacheExpiry(expires) - let cacheObject = CacheObject(value: object, expiryDate: expiryDate) - - // Set object in local cache - cache.setObject(cacheObject, forKey: key) - - // Write object to disk (asyncronously) - dispatch_async(diskWriteQueue) { - let path = self.urlForKey(key).path! - NSKeyedArchiver.archiveRootObject(cacheObject, toFile: path) - completion() - } - } - - - // MARK: Remove objects - - /// Removes an object from the cache. - /// - /// - parameter key: The key of the object that should be removed - public func removeObjectForKey(key: String) { - cache.removeObjectForKey(key) - - dispatch_async(diskWriteQueue) { - let url = self.urlForKey(key) - do { - try self.fileManager.removeItemAtURL(url) - } catch _ {} - } - } - - /// Removes all objects from the cache. - /// - /// - parameter completion: Called as soon as all cached objects are removed from disk. - public func removeAllObjects(completion: (() -> Void)? = nil) { - cache.removeAllObjects() - - dispatch_async(diskWriteQueue) { - let keys = self.allKeys() - - for key in keys { - let url = self.urlForKey(key) - do { - try self.fileManager.removeItemAtURL(url) - } catch _ {} - } - - dispatch_async(dispatch_get_main_queue()) { - completion?() - } - } - } - - - // MARK: Remove Expired Objects - - /// Removes all expired objects from the cache. - public func removeExpiredObjects() { - dispatch_async(diskWriteQueue) { - let keys = self.allKeys() - - for key in keys { - // `objectForKey:` deletes the object if it is expired - self.objectForKey(key) - } - } - } - - - // MARK: Subscripting - - public subscript(key: String) -> T? { - get { - return objectForKey(key) - } - set(newValue) { - if let value = newValue { - setObject(value, forKey: key) - } else { - removeObjectForKey(key) - } - } - } - - - // MARK: Private Helper - - private func allKeys() -> [String] { - let urls = try? self.fileManager.contentsOfDirectoryAtURL(self.cacheDirectory, includingPropertiesForKeys: nil, options: []) - return urls?.flatMap { $0.URLByDeletingPathExtension?.lastPathComponent } ?? [] - } - - private func urlForKey(key: String) -> NSURL { - let k = sanitizedKey(key) - return cacheDirectory - .URLByAppendingPathComponent(k) - .URLByAppendingPathExtension("cache") - } - - private func sanitizedKey(key: String) -> String { - let regex = try! NSRegularExpression(pattern: "[^a-zA-Z0-9_]+", options: NSRegularExpressionOptions()) - let range = NSRange(location: 0, length: key.characters.count) - return regex.stringByReplacingMatchesInString(key, options: NSMatchingOptions(), range: range, withTemplate: "-") - } - - private func expiryDateForCacheExpiry(expiry: CacheExpiry) -> NSDate { - switch expiry { - case .Never: - return NSDate.distantFuture() - case .Seconds(let seconds): - return NSDate().dateByAddingTimeInterval(seconds) - case .Date(let date): - return date - } - } - -} diff --git a/Pods/AwesomeCache/AwesomeCache/CacheObject.swift b/Pods/AwesomeCache/AwesomeCache/CacheObject.swift deleted file mode 100644 index 0815a05..0000000 --- a/Pods/AwesomeCache/AwesomeCache/CacheObject.swift +++ /dev/null @@ -1,47 +0,0 @@ -import Foundation - -/// This class is a wrapper around an objects that should be cached to disk. -/// -/// NOTE: It is currently not possible to use generics with a subclass of NSObject -/// However, NSKeyedArchiver needs a concrete subclass of NSObject to work correctly -class CacheObject : NSObject, NSCoding { - let value: AnyObject - let expiryDate: NSDate - - /// Designated initializer. - /// - /// - parameter value: An object that should be cached - /// - parameter expiryDate: The expiry date of the given value - init(value: AnyObject, expiryDate: NSDate) { - self.value = value - self.expiryDate = expiryDate - } - - /// Determines if cached object is expired - /// - /// - returns: True If objects expiry date has passed - func isExpired() -> Bool { - return expiryDate.isInThePast - } - - - /// NSCoding - - required init?(coder aDecoder: NSCoder) { - value = aDecoder.decodeObjectForKey("value") as AnyObject! - expiryDate = aDecoder.decodeObjectForKey("expiryDate") as! NSDate - - super.init() - } - - func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(value, forKey: "value") - aCoder.encodeObject(expiryDate, forKey: "expiryDate") - } -} - -extension NSDate { - var isInThePast: Bool { - return self.timeIntervalSinceNow < 0 - } -} diff --git a/Pods/AwesomeCache/LICENSE b/Pods/AwesomeCache/LICENSE deleted file mode 100644 index 148a6af..0000000 --- a/Pods/AwesomeCache/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Alexander Schuch (http://schuch.me) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Pods/AwesomeCache/README.md b/Pods/AwesomeCache/README.md deleted file mode 100644 index 51fc9ae..0000000 --- a/Pods/AwesomeCache/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# Awesome Cache - -[![Build Status](https://travis-ci.org/aschuch/AwesomeCache.svg)](https://travis-ci.org/aschuch/AwesomeCache) -![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat) -**Swift 2** - -Delightful on-disk cache (written in Swift). -Backed by NSCache for maximum performance and support for expiry of single objects. - - -## Usage - -```swift -do { - let cache = try Cache(name: "awesomeCache") - - cache["name"] = "Alex" - let name = cache["name"] - cache["name"] = nil -} catch _ { - print("Something went wrong :(") -} -``` - -### Cache expiry - -Objects can also be cached for a certain period of time. - -```swift -cache.setObject("Alex", forKey: "name", expires: .Never) // same as cache["name"] = "Alex" -cache.setObject("Alex", forKey: "name", expires: .Seconds(2)) // name expires in 2 seconds -cache.setObject("Alex", forKey: "name", expires: .Date(NSDate(timeIntervalSince1970: 1428364800))) // name expires on 4th of July 2015 -``` - -If an object is accessed after its expiry date, it is automatically removed from the cache and deleted from disk. -However, you are responsible to delete expired objects regularly by calling `removeExpiredObjects` (e.g. on app launch). - - -### Awesome API Caching - -API responses are usually cached for a specific period of time. AwesomeCache provides an easy method to cache a block of asynchronous tasks. - -```swift -cache.setObjectForKey("name", cacheBlock: { success, failure in - // Perform tasks, e.g. call an API - let response = ... - - success(response, .Seconds(300)) // Cache response for 5 minutes - // ... or failure(error) -}, completion: { object, isLoadedFromCache, error in - if object { - // object is now cached - } -}) -``` - -If the cache already contains an object, the `completion` block is called with the cached object immediately. - -If no object is found or the cached object is already expired, the `cacheBlock` is called. -You may perform any tasks (e.g. network calls) within this block. Upon completion of these tasks, make sure to call the `success` or `failure` block that is passed to the `cacheBlock`. The cacheBlock will not be re-evaluated until the object is expired or manually deleted. - -The completion block is invoked as soon as the cacheBlock is finished and the object is cached. - - -## Installation - -#### Carthage - -Add the following line to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile). - -``` -github "aschuch/AwesomeCache", ~> 2.0 -``` - -Then run `carthage update`. - -#### Cocoapods - -Add the following line to your Podfile. - -``` -pod "AwesomeCache", "~> 2.0" -``` - -Then run `pod install` with Cocoapods 0.36 or newer. - -#### Manually - -Just drag and drop the two `.swift` files in the `AwesomeCache` folder into your project. - -## Tests - -Open the Xcode project and press `⌘-U` to run the tests. - -Alternatively, all tests can be run in the terminal using [xctool](https://github.com/facebook/xctool). - -```bash -xctool -scheme AwesomeCacheTests -sdk iphonesimulator test -``` - -## Contributing - -* Create something awesome, make the code better, add some functionality, - whatever (this is the hardest part). -* [Fork it](http://help.github.com/forking/) -* Create new branch to make your changes -* Commit all your changes to your branch -* Submit a [pull request](http://help.github.com/pull-requests/) - - -## Contact - -Feel free to get in touch. - -* Website: -* Twitter: [@schuchalexander](http://twitter.com/schuchalexander) diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 12e9002..6d39c4c 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,8 +1,5 @@ PODS: - - Alamofire (3.3.1) - - AlamofireImage (2.4.0): - - Alamofire (~> 3.3) - - AwesomeCache (2.0) + - Alamofire (3.4.0) - Freddy (2.1.0) - Moya (6.4.0): - Moya/Core (= 6.4.0) @@ -12,19 +9,15 @@ PODS: - Result (2.0.0) DEPENDENCIES: - - AlamofireImage - - AwesomeCache - Freddy - Moya SPEC CHECKSUMS: - Alamofire: 369bc67b6f5ac33ded3648d7bd21c5bfb91c2ecc - AlamofireImage: 87408b652e0f5ae5fe364035f15aea8b9b24c77e - AwesomeCache: 5d6839ad139cdcee3c3a067f6fc1849523867dd9 + Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee Freddy: bbdca013977db29638b24baf6572ce94452bec29 Moya: 4d526954c8afd79820991393d40d7d8af756ceee Result: 9e75e1111c774c6ac594e14907b15057053a7959 -PODFILE CHECKSUM: c0e9678427a45e8df8c132e9f4426049c863138d +PODFILE CHECKSUM: 3b502932c5e25877f9f15bb94fbdefb1b635e64d COCOAPODS: 1.0.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 41c4758..e58bc6e 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,266 +7,223 @@ objects = { /* Begin PBXBuildFile section */ - 045511256E05BFCADCE7201461700393 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234C19DB95EBF1B9FA27DF00CC156401 /* Image.swift */; }; - 05F386BDC4896411D54D0ABF73472F9C /* NetworkLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = F992174C3371CC06391C4E6DCD7FB6C6 /* NetworkLoggerPlugin.swift */; }; - 08C6246305C4385030ADC71963C90569 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 573385354B53800310E16807FD2AA699 /* Response.swift */; }; - 095406039B4D371E48D08B38A2975AC8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0708B92285B64F48825C224A0573015F /* Error.swift */; }; - 0B4F44A121372FBF6E435CBE374E1627 /* JSONEncodingDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77DA6C2C15F492DD5DAB9E6A442B55E /* JSONEncodingDetector.swift */; }; - 11D1C30F956A0B9D5010E9E164975DF8 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = E18B9DC578B9A498AE29B198B596BB43 /* Image.swift */; }; - 15E3DA90C2B6749AF11D3E19ADEF3453 /* Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16E447E9623B1FFF1C1C54103F916A08 /* Moya.swift */; }; - 16102E4E35FAA0FC4161282FECE56469 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5BF51C88F24559921EDC138C23239A0 /* Timeline.swift */; }; - 163C56ADBD329A426F87B0E722888D28 /* Freddy-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 94076A9F33219AB01570F657E7A810E0 /* Freddy-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 045511256E05BFCADCE7201461700393 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB0372D64DD3DD7652F4ABDCD8A58BE /* Image.swift */; }; + 05F386BDC4896411D54D0ABF73472F9C /* NetworkLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0214A01E53221B39380E26D6CABB190F /* NetworkLoggerPlugin.swift */; }; + 08C6246305C4385030ADC71963C90569 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 563DC61807B70D4F02D05C34DFC3C3A9 /* Response.swift */; }; + 095406039B4D371E48D08B38A2975AC8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70E659A9C51C548FA6C0DDD17712D1E6 /* Error.swift */; }; + 0B4F44A121372FBF6E435CBE374E1627 /* JSONEncodingDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A7AC8B71214B5B51651D9686851F487 /* JSONEncodingDetector.swift */; }; + 15E3DA90C2B6749AF11D3E19ADEF3453 /* Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C1F87EA78BAA2722EB372A5403F99F8 /* Moya.swift */; }; + 16102E4E35FAA0FC4161282FECE56469 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51CABFE9A247AB10B971A59EC73CF083 /* Timeline.swift */; }; + 163C56ADBD329A426F87B0E722888D28 /* Freddy-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 745F106300DEB2C1C3197401A8FFEAAD /* Freddy-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1C731A7E93B3EE736C2D238AF4AAA843 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - 2394EF3E010D188A1C89B95CA20A399A /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = C82ECD4074EF1B4124948D4BE5A6B2C0 /* Error.swift */; }; - 2B852FB261D767CDDFAFE5C896636E7C /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E772C36C69DE785EE98A459C5D213917 /* Result.swift */; }; - 2D3405986FC586FA6C0A5E0B6BA7E64E /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AF68C976BACDFF365C6F44E7EA9404 /* Validation.swift */; }; - 34CCDCA848A701466256BC2927DA8856 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4A4E5F54FE9C5B48B6B1EADEFD08D24 /* NetworkReachabilityManager.swift */; }; - 3EA8F215C9C1432D74E5CCA4834AA8C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71D715BA944368BAAE376F5BBDA881E6 /* ResponseSerialization.swift */; }; - 4081EA628AF0B73AC51FFB9D7AB3B89E /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EED89BB9F13EBCCDFDEAE5FECC0A680E /* Manager.swift */; }; + 2394EF3E010D188A1C89B95CA20A399A /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CC441743CBE6C5071CDFEE457A5D69 /* Error.swift */; }; + 28A29ED1BF48F0AF35364EBCE5CD47D5 /* Pods-EmojiMeUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C10437C662ADBA0A358D02324184CD /* Pods-EmojiMeUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B852FB261D767CDDFAFE5C896636E7C /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = D200FFDC53F1CFE87AD464D4D8715F3C /* Result.swift */; }; + 2D3405986FC586FA6C0A5E0B6BA7E64E /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F4F5F67B27180CB6D43E81F6AC1EF2 /* Validation.swift */; }; + 34CCDCA848A701466256BC2927DA8856 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D2D918520B0FA0C3CAE2E98439B7B7 /* NetworkReachabilityManager.swift */; }; + 3EA8F215C9C1432D74E5CCA4834AA8C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9461DA358919A28F8E99AD57087E6916 /* ResponseSerialization.swift */; }; + 4081EA628AF0B73AC51FFB9D7AB3B89E /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507F1CA203C52AF51712A3C4F8D04AF1 /* Manager.swift */; }; 4307CBAAA98DCDF133C573A823E00126 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5012844BC0CF9B6E7C0330C69A04EBF9 /* Result.framework */; }; - 4476EEDB89BD2BBE269BA25D9D6869BA /* JSONParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBB64ABAE56BFDFA00EF4ACF50D34D08 /* JSONParsing.swift */; }; - 44D0FF87F8A99E3D32047169E247A8DC /* UIImage+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7D488FCD581C1A9D7C21FDD7EB9C40 /* UIImage+AlamofireImage.swift */; }; - 4CC2460E8C042BD120D676E8B21F87F8 /* AwesomeCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B50BEEED33E2307CDE1E703F641A6A2 /* AwesomeCache-dummy.m */; }; - 51C7B03FC104B84744C83B8F4787279D /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74FF77B26F90985A9A71EE49DA2308D /* ImageCache.swift */; }; - 557BCB5AF7E9CAC9B66CFB6B1FCA4BEF /* Cache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 204782651DE7CCEBDEBCF1D369E69612 /* Cache.swift */; }; - 56C565B5E600D6F014E7902D68CD2A26 /* Moya+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643E1A6F7C3723D214282AE0E33A7EC5 /* Moya+Alamofire.swift */; }; - 5BC19E6E0F199276003F0AF96838BCE5 /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F99B1B95A1BB74DFD645E37B3F835315 /* Upload.swift */; }; - 5CB05FBCB32D21E194B5ECF680CB6AE0 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = 122E04D043A1C8AB7AC0826B901C8EC5 /* Download.swift */; }; - 62E8346F03C03E7F4D631361F325689E /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57A5ECB5EE72A72537961E3C9C47633 /* Response.swift */; }; - 6400C65D7B17C5AF90708D0F8F6FCB63 /* JSONSerializing.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCCB7D91245B5F7051C043C890F73C20 /* JSONSerializing.swift */; }; + 4476EEDB89BD2BBE269BA25D9D6869BA /* JSONParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692BCB7CBEB534C4C537146FC3B3B41F /* JSONParsing.swift */; }; + 51490E473E0ABD763B0350D9DE8EA876 /* Pods-EmojiMeUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 58F632D85E69571654B4D1ECC652E012 /* Pods-EmojiMeUITests-dummy.m */; }; + 56C565B5E600D6F014E7902D68CD2A26 /* Moya+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 362A5FC8E25F9A4E11EA681DFC6AD15D /* Moya+Alamofire.swift */; }; + 5BC19E6E0F199276003F0AF96838BCE5 /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DABD3DC0E6BC1F6CA64A33F07B037D9 /* Upload.swift */; }; + 5CB05FBCB32D21E194B5ECF680CB6AE0 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5AF2813F9768164E958C993AA26AAA /* Download.swift */; }; + 62E8346F03C03E7F4D631361F325689E /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A08DF1136F01D895DD0F9305EA4FEDC /* Response.swift */; }; + 6400C65D7B17C5AF90708D0F8F6FCB63 /* JSONSerializing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB478FC0B3F9CFD07833328EF1A4BE0 /* JSONSerializing.swift */; }; 6677CCD1E13B065D7992AF91B0419C02 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 695D7EBC5654AAD74F4638057C076991 /* Alamofire.framework */; }; - 66E9E6FE8E117D8603C88951B569C866 /* Request+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C196460BBA7E802DEFA5DB82807EA2F9 /* Request+AlamofireImage.swift */; }; - 6751A6C11AE75944B95C1391DD824049 /* ResultType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19ED9002F852DE0A0FB4A4473B26D9F6 /* ResultType.swift */; }; + 6751A6C11AE75944B95C1391DD824049 /* ResultType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAE68E039CD3CE098A28E9C7C6B6696B /* ResultType.swift */; }; 6FB2F8BA326DE193632C540941AF6C62 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - 700BDCB998A8BB5B1CEC2DD2D2D5911F /* JSONParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 256FEB7800C2573EC1761E03E101353D /* JSONParser.swift */; }; + 700BDCB998A8BB5B1CEC2DD2D2D5911F /* JSONParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1287E068A0A18D5255D72BC839D5C9F6 /* JSONParser.swift */; }; 72F2F451801BFFC79B7EB71F0137164B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - 78C81844E7B8B2EEA16321296D8D3497 /* AlamofireImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 41C0B652BD6310B7E6AC75E994836DEA /* AlamofireImage-dummy.m */; }; - 790B11AB2A540A3D156D943E5217A9A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - 7B38F90E50D5DEF1BAC364B2B769445B /* Result-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F388C5FCEEC5A2311248783309401F /* Result-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B48852C4D848FA2DA416A98F6425869 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F52226AFF309B61EF9097C2468E3F1A9 /* ServerTrustPolicy.swift */; }; - 80CAA5CE880541B781DFC0A305FB8B01 /* ImageFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE2E52136599B60FF4C5D03953641765 /* ImageFilter.swift */; }; - 87A5B743E04A0AE84386108B663EB9BE /* Pods-APIClient-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 59E226A621B026A56297483D8F62F1CD /* Pods-APIClient-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8EB11202167FCDDF1257AAAB1D1FB244 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = B942D3BE21BCD6ED92CCA2BF26D5AF0B /* Alamofire.swift */; }; + 7B38F90E50D5DEF1BAC364B2B769445B /* Result-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BE68DBA94FD55FF1C18230EBA376E43D /* Result-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B48852C4D848FA2DA416A98F6425869 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF614D82E298AB413164C7AE09A1F325 /* ServerTrustPolicy.swift */; }; + 8EB11202167FCDDF1257AAAB1D1FB244 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F0EE3EA46A8A172E6596EC7D150A48 /* Alamofire.swift */; }; 91C09AC2A52ED69A27C8D923139A006F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - 91F023CB33CC22BA4CC841AE468163A9 /* AlamofireImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B2C9347AB481650DA53E81E1AB5BE06 /* AlamofireImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9469DF81ECB494E84675969B5E13374C /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 47FB6A92566F93C6ECEF77EB715702B1 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 95C9F7D166D041482D8D330988C3A389 /* JSONSubscripting.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1FF5E4BED7E49596E8B32C06D1EADC /* JSONSubscripting.swift */; }; - 99A312A29811B785F8F35EEAB3D615AE /* Freddy.h in Headers */ = {isa = PBXBuildFile; fileRef = B1BD998E3F05A1F0DBAABDA831C13165 /* Freddy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9DDD7E9CEA5A44B0BD55E0EAE62BE7EC /* JSONLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = A497FB962B082E6F095A91BA42B137EA /* JSONLiteralConvertible.swift */; }; - A442C5D713F85F83EEF9D73FE794E238 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - A5AC2D223A87AAFC4ABA372A2DD902BC /* NetworkActivityPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4534F52D06BF66BB04E4949107484ED0 /* NetworkActivityPlugin.swift */; }; - AA314156AC500125F4078EE968DB14C6 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC037D8D1CF6ECC48B2060BF804366 /* Result.swift */; }; - ACF636AAEF7189C02641E20565349618 /* Moya-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F54CD49A5BD54AB05252A278BA5FF7A /* Moya-dummy.m */; }; - ADF19C953CE2A7D0B72EC93A81FCCC26 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F5D743C24F78745DBDFDBCB86BFCA96D /* Alamofire-dummy.m */; }; - AE4CF87C02C042DF13ED5B21C4FDC1E0 /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F28CC60E9C7599AAA14DDE5C173A34 /* Stream.swift */; }; - AFB62E073F1070F28D0F0E966EC44E50 /* UIImageView+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C984206ECF0C9D80587B6733367975A4 /* UIImageView+AlamofireImage.swift */; }; - B2F921BA8A6F66F35C8A2B77B8DF5B48 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0B3967E4A69266A6DF1635DDCDF67CB /* ImageDownloader.swift */; }; - B3CA6DA56B1E68A0D86822129CB727EE /* Moya-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 543F8D16F6B833EED1AA661554B404BC /* Moya-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B9436C8E411DB23974D3727BC4030DEB /* AwesomeCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FD9360F68A9DB9A93344F399E461BE46 /* AwesomeCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B95E1B316BE6E2A0E03F93D4AEA6F6D3 /* Pods-APIClient-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 30AE68259BCB77AFA1E3DFDA0D1028B7 /* Pods-APIClient-dummy.m */; }; - BA377AD2623449B0CE84BA4093F4BBB1 /* CredentialsPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B4D78A8448C028C932738033146C6F /* CredentialsPlugin.swift */; }; - BE41196F6A3903E59C3306FE3F8B43FE /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CFB2AB8D1D475EF42263116503BB12 /* Notifications.swift */; }; - C0DB70AB368765DC64BFB5FEA75E0696 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 398D7C05309D6608E9A474966053B65A /* ParameterEncoding.swift */; }; - C0F3756C4C77EC31F50AF6E1F794B042 /* JSONDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7F717DD1526463CA0B1B03B2869466 /* JSONDecodable.swift */; }; - C3A39A1A58017B4D8C38D5A443716D47 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E710E7F8E1FB41F3709D897BA5DF900 /* Endpoint.swift */; }; - C7B6DD7C0456C50289A2C381DFE9FA3F /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4940D02A0598CD520E1EF3FBBF43D2C2 /* MultipartFormData.swift */; }; - CC7F5D04E26E5E2117CBABA597225B59 /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BCDEA0CB2C54FCEC9A545323176FFC /* JSON.swift */; }; - D147A088CDA0B2E538EA34D77EB630F8 /* CacheObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C12F4814AA51CA1598E8D889FC2767 /* CacheObject.swift */; }; - D334B1A0D3C9EE115BBA350E257C3375 /* Plugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5EF6E4C362C748C194C4542AB4ADE4F /* Plugin.swift */; }; - D8261EC35BE852FECF0B03191A20CE04 /* Result-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 022DC8A820470ED06620E262082FCE5E /* Result-dummy.m */; }; - E597971E2E9FC8DAE78D697CBD10046D /* JSONEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0BBB0F55CBCCEF46E9FF1765B533218 /* JSONEncodable.swift */; }; - EB7D1260D31A6F49E3E273CE870AA3DD /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 695D7EBC5654AAD74F4638057C076991 /* Alamofire.framework */; }; - EF48B357A3158B57C78F8D28326748C9 /* UIButton+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 915A15DEC800F2711FD1D79AE4A74496 /* UIButton+AlamofireImage.swift */; }; - EFE92E8D3813DD26E78E93EEAF6D7E7E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77E823D2ED55AA7D09424FE30F4DE8FD /* Request.swift */; }; - FAA1017FCE0F8B1C6E6BACCCD05B4A6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; - FDB24A67301DAC22E84605827EDDBABB /* Freddy-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D49DBEFB96C123D052A45F791F7C1ABD /* Freddy-dummy.m */; }; + 9469DF81ECB494E84675969B5E13374C /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C42B17C761C42589AACC086E1768618 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 95C9F7D166D041482D8D330988C3A389 /* JSONSubscripting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77543457761F9EFE505BC8BA7F7E0D91 /* JSONSubscripting.swift */; }; + 99A312A29811B785F8F35EEAB3D615AE /* Freddy.h in Headers */ = {isa = PBXBuildFile; fileRef = F5CC76A70B4E5F7D6B4559561FEB562B /* Freddy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DDD7E9CEA5A44B0BD55E0EAE62BE7EC /* JSONLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE53DC8E40C02788ED848A589F7AB9A /* JSONLiteralConvertible.swift */; }; + A29BEB351A3169D835FD9F2F29AAD4EA /* Pods-EmojiMeTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FF0FE897424CA06590E025400702DB9 /* Pods-EmojiMeTests-dummy.m */; }; + A5AC2D223A87AAFC4ABA372A2DD902BC /* NetworkActivityPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE81043BEF20C0B6436096331007EE9A /* NetworkActivityPlugin.swift */; }; + A6C54CB809FDDB79A3E66D91E02BB536 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; + AA314156AC500125F4078EE968DB14C6 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA434C119A236600C7DEA5EEDB1B739A /* Result.swift */; }; + ACF636AAEF7189C02641E20565349618 /* Moya-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F54ED11DF6CFF6668767633EC42A78 /* Moya-dummy.m */; }; + ADF19C953CE2A7D0B72EC93A81FCCC26 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B824C326424CC565D688FC662890A33 /* Alamofire-dummy.m */; }; + AE4CF87C02C042DF13ED5B21C4FDC1E0 /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B3EA46B071AAC18AAFC0B2E4D3F87E /* Stream.swift */; }; + B3CA6DA56B1E68A0D86822129CB727EE /* Moya-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 88DB84750CA6992B4062394670E0185A /* Moya-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BA377AD2623449B0CE84BA4093F4BBB1 /* CredentialsPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF6ECC8EFAB7A01FA98374157550C8B /* CredentialsPlugin.swift */; }; + BE41196F6A3903E59C3306FE3F8B43FE /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904C3C5DEDA63924CB7EF1850DDAD922 /* Notifications.swift */; }; + C0DB70AB368765DC64BFB5FEA75E0696 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76123DD980DDCB7E1AA0BADC0D86ABA2 /* ParameterEncoding.swift */; }; + C0F3756C4C77EC31F50AF6E1F794B042 /* JSONDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21026806D1D3F06DBFF2F881B6E3FB24 /* JSONDecodable.swift */; }; + C3A39A1A58017B4D8C38D5A443716D47 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE419257D96DB76697CEDCD023664468 /* Endpoint.swift */; }; + C7B6DD7C0456C50289A2C381DFE9FA3F /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E089B25514ED5F4C5398D843F45B0359 /* MultipartFormData.swift */; }; + C87583B67B4CEC5583D277D36BDA925D /* Pods-EmojiMeTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 13F021D661DDD58E354C27ED1AA2415A /* Pods-EmojiMeTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC7F5D04E26E5E2117CBABA597225B59 /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E8817A1F6587F08D20AC3C3865007B /* JSON.swift */; }; + D0A19B1CFD78E428BA1FEA9167570138 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; + D144830A48E4405315876366D6CF8787 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */; }; + D334B1A0D3C9EE115BBA350E257C3375 /* Plugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C3A9FA05A2D6595CF6EE1FF7773C066 /* Plugin.swift */; }; + D8261EC35BE852FECF0B03191A20CE04 /* Result-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F9C956B55C7C8C2A12FFBFFB1DC452A /* Result-dummy.m */; }; + DA5309DBE185D5F82D5FD9A7C1FB0E7B /* Pods-EmojiMe-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A337B8183696AA0B179692AF82F671FE /* Pods-EmojiMe-dummy.m */; }; + E597971E2E9FC8DAE78D697CBD10046D /* JSONEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D92006A1D7ECDE2B0E1630A71A9C0F74 /* JSONEncodable.swift */; }; + EFE92E8D3813DD26E78E93EEAF6D7E7E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4FE53677B2EA1910A0FBCC58F75A286 /* Request.swift */; }; + F03DB42A79FEFB8E593E17AB5978078F /* Pods-EmojiMe-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA043F98B52C54195E800B19CFE180B7 /* Pods-EmojiMe-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FDB24A67301DAC22E84605827EDDBABB /* Freddy-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 78AC04ED02979CEB8797EDC47126A411 /* Freddy-dummy.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 289364EFA6FBEE8B4E055C63A80F1B63 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; - remoteInfo = Alamofire; - }; - 459B5E71EBC47347B0967079D28E0138 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = EEE4BFE3AC283ECEA2CF60A4C399216A; - remoteInfo = Freddy; - }; - 4B9CFE39526EBD5AF1572AF091233769 /* PBXContainerItemProxy */ = { + 25F14DEBAF287A7D7AB8CBEE3E1A2CCE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = D58CAD74411F3EA5D73A48FFB3DC29A5; remoteInfo = Result; }; - 6B5CAC503E634EA7A1B638F185EAFAFD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 78C33D52F7E2D591E77871DBB03E8468; - remoteInfo = Moya; - }; - C521E54F9FEB3F9ECD851F663D272426 /* PBXContainerItemProxy */ = { + 45771F23E6A1DA8AB0AC1A91E2A2F676 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; remoteInfo = Alamofire; }; - CC85A0A8B14DC69A950F994BFBA19E40 /* PBXContainerItemProxy */ = { + 4B9CFE39526EBD5AF1572AF091233769 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = D58CAD74411F3EA5D73A48FFB3DC29A5; remoteInfo = Result; }; - F040722E74DB93ECD179956DF701E59A /* PBXContainerItemProxy */ = { + 88E2AFCA3B5DC01534C4F25997C72CAD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 05094CC4A047119F7ADC14EE74C4881C; - remoteInfo = AlamofireImage; + remoteGlobalIDString = EEE4BFE3AC283ECEA2CF60A4C399216A; + remoteInfo = Freddy; }; - F3DCA2FD6405DCAD80698DF39B8DC93B /* PBXContainerItemProxy */ = { + C521E54F9FEB3F9ECD851F663D272426 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 75CC2270F1B782FD424E562D35D244D8; - remoteInfo = AwesomeCache; + remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; + remoteInfo = Alamofire; }; - F72C2C1DEF582C6E84D978E3E4772F8E /* PBXContainerItemProxy */ = { + DE156EFB83267EEA0F0B59051F5BC902 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; - remoteInfo = Alamofire; + remoteGlobalIDString = 78C33D52F7E2D591E77871DBB03E8468; + remoteInfo = Moya; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 022DC8A820470ED06620E262082FCE5E /* Result-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Result-dummy.m"; sourceTree = ""; }; - 038A3E4ABB68218A89816EFC09732B87 /* Pods-APIClient-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-APIClient-acknowledgements.plist"; sourceTree = ""; }; - 03F140E6260F104B7DF5802ED9080660 /* Pods-APIClient.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-APIClient.release.xcconfig"; sourceTree = ""; }; - 05C16FDBD6778B8645EB801F3C80656F /* AwesomeCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AwesomeCache.xcconfig; sourceTree = ""; }; - 0708B92285B64F48825C224A0573015F /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; - 07D947898D31CF37DFCAEA6A7A9D4F19 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 07F388C5FCEEC5A2311248783309401F /* Result-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-umbrella.h"; sourceTree = ""; }; - 0D7F717DD1526463CA0B1B03B2869466 /* JSONDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONDecodable.swift; path = Sources/JSONDecodable.swift; sourceTree = ""; }; - 0D9747C584F764C6F7E9AC6EB82B5AB9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 122E04D043A1C8AB7AC0826B901C8EC5 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; - 16E447E9623B1FFF1C1C54103F916A08 /* Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Moya.swift; path = Source/Moya.swift; sourceTree = ""; }; - 19ED9002F852DE0A0FB4A4473B26D9F6 /* ResultType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultType.swift; path = Result/ResultType.swift; sourceTree = ""; }; - 1A26007F9F1A5F4B6DE71D0757EF4A66 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; - 1B50BEEED33E2307CDE1E703F641A6A2 /* AwesomeCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AwesomeCache-dummy.m"; sourceTree = ""; }; - 1CF84F5682A6A5AB95B5EDB71150DE3E /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 204782651DE7CCEBDEBCF1D369E69612 /* Cache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cache.swift; path = AwesomeCache/Cache.swift; sourceTree = ""; }; - 234C19DB95EBF1B9FA27DF00CC156401 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; - 256FEB7800C2573EC1761E03E101353D /* JSONParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONParser.swift; path = Sources/JSONParser.swift; sourceTree = ""; }; - 2C4B495164DF75DFC39C772488643E89 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2CA345F714004639953174CE76E44EF1 /* Moya.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Moya.modulemap; sourceTree = ""; }; - 2D3FDAEA51FC54A17A56A47DC5068F98 /* AwesomeCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AwesomeCache-prefix.pch"; sourceTree = ""; }; - 30AE68259BCB77AFA1E3DFDA0D1028B7 /* Pods-APIClient-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-APIClient-dummy.m"; sourceTree = ""; }; - 331CD190107517E072E6CDBB633F00D0 /* Freddy-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Freddy-prefix.pch"; sourceTree = ""; }; - 38AF68C976BACDFF365C6F44E7EA9404 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - 398D7C05309D6608E9A474966053B65A /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - 3A387CA138064F06AE250EB603A866DA /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; - 3B2C9347AB481650DA53E81E1AB5BE06 /* AlamofireImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-umbrella.h"; sourceTree = ""; }; + 0214A01E53221B39380E26D6CABB190F /* NetworkLoggerPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkLoggerPlugin.swift; path = Source/Plugins/NetworkLoggerPlugin.swift; sourceTree = ""; }; + 03B3EA46B071AAC18AAFC0B2E4D3F87E /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; + 07B29A0E192E93B70BE577E33878FBBA /* Pods-EmojiMeTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMeTests-resources.sh"; sourceTree = ""; }; + 0C1F87EA78BAA2722EB372A5403F99F8 /* Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Moya.swift; path = Source/Moya.swift; sourceTree = ""; }; + 0DABD3DC0E6BC1F6CA64A33F07B037D9 /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; + 0FF0FE897424CA06590E025400702DB9 /* Pods-EmojiMeTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-EmojiMeTests-dummy.m"; sourceTree = ""; }; + 1287E068A0A18D5255D72BC839D5C9F6 /* JSONParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONParser.swift; path = Sources/JSONParser.swift; sourceTree = ""; }; + 13F021D661DDD58E354C27ED1AA2415A /* Pods-EmojiMeTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-EmojiMeTests-umbrella.h"; sourceTree = ""; }; + 1855154F3F031FB1C8688986026159E3 /* Pods_EmojiMeTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMeTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1EC13FA8C7EDF67DC9E394E643F8C49C /* Pods-EmojiMeUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-EmojiMeUITests-acknowledgements.markdown"; sourceTree = ""; }; + 1FD82D99AE6F851105159F8D5959E501 /* Pods-EmojiMeTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMeTests-frameworks.sh"; sourceTree = ""; }; + 21026806D1D3F06DBFF2F881B6E3FB24 /* JSONDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONDecodable.swift; path = Sources/JSONDecodable.swift; sourceTree = ""; }; + 22F54ED11DF6CFF6668767633EC42A78 /* Moya-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Moya-dummy.m"; sourceTree = ""; }; + 2C044511237A5F375F6D21B3DE898AB4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2C3A9FA05A2D6595CF6EE1FF7773C066 /* Plugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Plugin.swift; path = Source/Plugin.swift; sourceTree = ""; }; + 2D1146441B313BB9B00C3F95FEDAD656 /* Pods_EmojiMe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2F9C956B55C7C8C2A12FFBFFB1DC452A /* Result-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Result-dummy.m"; sourceTree = ""; }; + 301A34ACA353C65DF3F340A63ADBA5A4 /* Pods-EmojiMe-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMe-frameworks.sh"; sourceTree = ""; }; + 311E84DAAA60238ADD22757A08B6747A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 31C3B1A8D1E77A75DAB7832C3F395263 /* Result-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-prefix.pch"; sourceTree = ""; }; + 35F0EE3EA46A8A172E6596EC7D150A48 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 362A5FC8E25F9A4E11EA681DFC6AD15D /* Moya+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+Alamofire.swift"; path = "Source/Moya+Alamofire.swift"; sourceTree = ""; }; + 39CC441743CBE6C5071CDFEE457A5D69 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; + 3A7AC8B71214B5B51651D9686851F487 /* JSONEncodingDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONEncodingDetector.swift; path = Sources/JSONEncodingDetector.swift; sourceTree = ""; }; + 3D1E7E8C372F79ECA0EF5CBB21A79DEA /* Pods-EmojiMeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMeTests.debug.xcconfig"; sourceTree = ""; }; 409742C9263DBAE6A3C50BF90D2A7C7B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 41C0B652BD6310B7E6AC75E994836DEA /* AlamofireImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AlamofireImage-dummy.m"; sourceTree = ""; }; - 431993A316D6C1339204CB7E809A3214 /* Moya-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-prefix.pch"; sourceTree = ""; }; - 4534F52D06BF66BB04E4949107484ED0 /* NetworkActivityPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkActivityPlugin.swift; path = Source/Plugins/NetworkActivityPlugin.swift; sourceTree = ""; }; - 4551E9885734C496EB28B7487CA17BF2 /* AwesomeCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = AwesomeCache.modulemap; sourceTree = ""; }; - 47FB6A92566F93C6ECEF77EB715702B1 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; - 4940D02A0598CD520E1EF3FBBF43D2C2 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - 4BC2239018ECFB94D9BC6B78FB565E68 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 4C433AA319B8B095D0CB2B97EC92D92E /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4F54CD49A5BD54AB05252A278BA5FF7A /* Moya-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Moya-dummy.m"; sourceTree = ""; }; + 4B3BC414C70D289F0A2E56CD0F84B138 /* Freddy-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Freddy-prefix.pch"; sourceTree = ""; }; 5012844BC0CF9B6E7C0330C69A04EBF9 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 52AC037D8D1CF6ECC48B2060BF804366 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 543F8D16F6B833EED1AA661554B404BC /* Moya-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-umbrella.h"; sourceTree = ""; }; - 550A3C80992DDBB9EECF89AB9DD60826 /* AlamofireImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = AlamofireImage.modulemap; sourceTree = ""; }; - 573385354B53800310E16807FD2AA699 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - 59E226A621B026A56297483D8F62F1CD /* Pods-APIClient-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-APIClient-umbrella.h"; sourceTree = ""; }; - 5FA3450E6D6C3FDC355D274BF163C7BC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 643E1A6F7C3723D214282AE0E33A7EC5 /* Moya+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+Alamofire.swift"; path = "Source/Moya+Alamofire.swift"; sourceTree = ""; }; + 507F1CA203C52AF51712A3C4F8D04AF1 /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; + 51CABFE9A247AB10B971A59EC73CF083 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + 522928623A02602D316B1A3BC3485CE0 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5254B1253576CC8833243FCF50F3E330 /* Moya.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Moya.modulemap; sourceTree = ""; }; + 563DC61807B70D4F02D05C34DFC3C3A9 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 56CD6E72AD0F0AEDAC44022B65047987 /* Pods-EmojiMeUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-EmojiMeUITests-acknowledgements.plist"; sourceTree = ""; }; + 570801741C0719E574A21FB21D6D5557 /* Pods-EmojiMeTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-EmojiMeTests-acknowledgements.plist"; sourceTree = ""; }; + 581AA1ECA6B331F8BB264F6D2E7D4159 /* Result.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Result.xcconfig; sourceTree = ""; }; + 58F632D85E69571654B4D1ECC652E012 /* Pods-EmojiMeUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-EmojiMeUITests-dummy.m"; sourceTree = ""; }; + 63E565634A01B337E85F8BEDA23A5F1B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 692BCB7CBEB534C4C537146FC3B3B41F /* JSONParsing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONParsing.swift; path = Sources/JSONParsing.swift; sourceTree = ""; }; 695D7EBC5654AAD74F4638057C076991 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6E74F9D1C66D74B1024CB81FEA9C3F23 /* Pods-APIClient-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-APIClient-frameworks.sh"; sourceTree = ""; }; - 6F5A80EA187B5A7C48DD2CCE08723E61 /* Result.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Result.modulemap; sourceTree = ""; }; - 71D715BA944368BAAE376F5BBDA881E6 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - 76BCDEA0CB2C54FCEC9A545323176FFC /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSON.swift; path = Sources/JSON.swift; sourceTree = ""; }; - 77E823D2ED55AA7D09424FE30F4DE8FD /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - 795AF910CB878E8A9EFEA4245444761C /* Pods-APIClient.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-APIClient.modulemap"; sourceTree = ""; }; - 7E710E7F8E1FB41F3709D897BA5DF900 /* Endpoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Endpoint.swift; path = Source/Endpoint.swift; sourceTree = ""; }; - 7F3664F9E46DDEA4FAC4C75D3B31D8B4 /* AlamofireImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-prefix.pch"; sourceTree = ""; }; - 83B4D78A8448C028C932738033146C6F /* CredentialsPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsPlugin.swift; path = Source/Plugins/CredentialsPlugin.swift; sourceTree = ""; }; - 84C12F4814AA51CA1598E8D889FC2767 /* CacheObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheObject.swift; path = AwesomeCache/CacheObject.swift; sourceTree = ""; }; - 8B0BBB0B48AC324AF46A1EDEB75F7A36 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 8C7D488FCD581C1A9D7C21FDD7EB9C40 /* UIImage+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+AlamofireImage.swift"; path = "Source/UIImage+AlamofireImage.swift"; sourceTree = ""; }; - 8EF377F6BA9A58F9D0CB227E508D21F9 /* Moya.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Moya.xcconfig; sourceTree = ""; }; - 915A15DEC800F2711FD1D79AE4A74496 /* UIButton+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+AlamofireImage.swift"; path = "Source/UIButton+AlamofireImage.swift"; sourceTree = ""; }; + 70E659A9C51C548FA6C0DDD17712D1E6 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; + 7169251432017DBA866E38A1DFFAE26F /* Pods-EmojiMe-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-EmojiMe-acknowledgements.plist"; sourceTree = ""; }; + 717BC40F6BB5204CB1F3F6DBE0334146 /* Pods-EmojiMeTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-EmojiMeTests-acknowledgements.markdown"; sourceTree = ""; }; + 745F106300DEB2C1C3197401A8FFEAAD /* Freddy-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Freddy-umbrella.h"; sourceTree = ""; }; + 76123DD980DDCB7E1AA0BADC0D86ABA2 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 77543457761F9EFE505BC8BA7F7E0D91 /* JSONSubscripting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONSubscripting.swift; path = Sources/JSONSubscripting.swift; sourceTree = ""; }; + 78AC04ED02979CEB8797EDC47126A411 /* Freddy-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Freddy-dummy.m"; sourceTree = ""; }; + 7DDCBCEE0B9D0F4E288FB262E1849820 /* Moya.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Moya.xcconfig; sourceTree = ""; }; + 7E257EC5B0AEFAED7DED83B021E96A6C /* Pods-EmojiMeUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMeUITests.release.xcconfig"; sourceTree = ""; }; + 83E7A8F4E1E8BA485CD3655D28B88CA5 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 87A7C7532282AB97A2A2C0EFF8A1A6F9 /* Freddy.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Freddy.xcconfig; sourceTree = ""; }; + 87D4F1344C9D9689E7441D29BF938B67 /* Result.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Result.modulemap; sourceTree = ""; }; + 88DB84750CA6992B4062394670E0185A /* Moya-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-umbrella.h"; sourceTree = ""; }; + 8AF6ECC8EFAB7A01FA98374157550C8B /* CredentialsPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsPlugin.swift; path = Source/Plugins/CredentialsPlugin.swift; sourceTree = ""; }; + 8C42B17C761C42589AACC086E1768618 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 8E096CF1A473C90345976DE4F7260B3B /* Pods-EmojiMe-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-EmojiMe-acknowledgements.markdown"; sourceTree = ""; }; + 8EE613758D5C29292F52C585B0113D65 /* Freddy.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Freddy.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 904C3C5DEDA63924CB7EF1850DDAD922 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 94076A9F33219AB01570F657E7A810E0 /* Freddy-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Freddy-umbrella.h"; sourceTree = ""; }; - A3277E53B8CD20B8F3EEE1E8C0E25A63 /* Pods-APIClient.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-APIClient.debug.xcconfig"; sourceTree = ""; }; - A497FB962B082E6F095A91BA42B137EA /* JSONLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONLiteralConvertible.swift; path = Sources/JSONLiteralConvertible.swift; sourceTree = ""; }; - A56F40554369771030D47FD70658021C /* Pods-APIClient-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-APIClient-acknowledgements.markdown"; sourceTree = ""; }; - A5EF6E4C362C748C194C4542AB4ADE4F /* Plugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Plugin.swift; path = Source/Plugin.swift; sourceTree = ""; }; - A7CFB2AB8D1D475EF42263116503BB12 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; - A921BF2FF3A8F4BAE452F6F5E1A033A3 /* Pods-APIClient-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-APIClient-resources.sh"; sourceTree = ""; }; - AF8D73389DC75309BB1467E23CBB5AFD /* AlamofireImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AlamofireImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B0B3967E4A69266A6DF1635DDCDF67CB /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Source/ImageDownloader.swift; sourceTree = ""; }; - B1BD998E3F05A1F0DBAABDA831C13165 /* Freddy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Freddy.h; path = Sources/Freddy.h; sourceTree = ""; }; - B4AEAE2BE4767DAEFBE1C3EB3A26AE77 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B7A7CF30F8F5D70D3469170BAEE326A7 /* AlamofireImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AlamofireImage.xcconfig; sourceTree = ""; }; - B841DD27F526713899D11DDF46A6C8A9 /* Result-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-prefix.pch"; sourceTree = ""; }; - B942D3BE21BCD6ED92CCA2BF26D5AF0B /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - C08FC9A42067C9C1B7FCC92A9FE20D37 /* Freddy.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Freddy.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C196460BBA7E802DEFA5DB82807EA2F9 /* Request+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Request+AlamofireImage.swift"; path = "Source/Request+AlamofireImage.swift"; sourceTree = ""; }; - C82ECD4074EF1B4124948D4BE5A6B2C0 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; - C984206ECF0C9D80587B6733367975A4 /* UIImageView+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+AlamofireImage.swift"; path = "Source/UIImageView+AlamofireImage.swift"; sourceTree = ""; }; - D49DBEFB96C123D052A45F791F7C1ABD /* Freddy-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Freddy-dummy.m"; sourceTree = ""; }; - D57A5ECB5EE72A72537961E3C9C47633 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - D5BF51C88F24559921EDC138C23239A0 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; - D6809D7CBF51919F5229396276F92393 /* Freddy.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Freddy.xcconfig; sourceTree = ""; }; - D77DA6C2C15F492DD5DAB9E6A442B55E /* JSONEncodingDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONEncodingDetector.swift; path = Sources/JSONEncodingDetector.swift; sourceTree = ""; }; - D954B5D1C60338E6290E3B78E7A8A582 /* Result.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Result.xcconfig; sourceTree = ""; }; - E0A3862F85C6CFD22933F96FDA695B92 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E18B9DC578B9A498AE29B198B596BB43 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; - E26C988C5D1D15FC521067415BF78337 /* AwesomeCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AwesomeCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7162CF408DE2C4BFD7CE300E0611A10 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E772C36C69DE785EE98A459C5D213917 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Result/Result.swift; sourceTree = ""; }; - E9A71A683FE2C20183E96EC426D20B1C /* Pods_APIClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_APIClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EBB64ABAE56BFDFA00EF4ACF50D34D08 /* JSONParsing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONParsing.swift; path = Sources/JSONParsing.swift; sourceTree = ""; }; - EE2E52136599B60FF4C5D03953641765 /* ImageFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFilter.swift; path = Source/ImageFilter.swift; sourceTree = ""; }; - EED89BB9F13EBCCDFDEAE5FECC0A680E /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; - F0BBB0F55CBCCEF46E9FF1765B533218 /* JSONEncodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONEncodable.swift; path = Sources/JSONEncodable.swift; sourceTree = ""; }; - F0F28CC60E9C7599AAA14DDE5C173A34 /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; - F4A4E5F54FE9C5B48B6B1EADEFD08D24 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; - F52226AFF309B61EF9097C2468E3F1A9 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - F5D743C24F78745DBDFDBCB86BFCA96D /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - F74FF77B26F90985A9A71EE49DA2308D /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Source/ImageCache.swift; sourceTree = ""; }; - F8784EBA10B39DC4E63CD8DF0005AA13 /* Freddy.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Freddy.modulemap; sourceTree = ""; }; - F992174C3371CC06391C4E6DCD7FB6C6 /* NetworkLoggerPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkLoggerPlugin.swift; path = Source/Plugins/NetworkLoggerPlugin.swift; sourceTree = ""; }; - F99B1B95A1BB74DFD645E37B3F835315 /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; - FA1FF5E4BED7E49596E8B32C06D1EADC /* JSONSubscripting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONSubscripting.swift; path = Sources/JSONSubscripting.swift; sourceTree = ""; }; - FCCB7D91245B5F7051C043C890F73C20 /* JSONSerializing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONSerializing.swift; path = Sources/JSONSerializing.swift; sourceTree = ""; }; - FD9360F68A9DB9A93344F399E461BE46 /* AwesomeCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AwesomeCache-umbrella.h"; sourceTree = ""; }; + 9461DA358919A28F8E99AD57087E6916 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 94C8DDBA582EEDA142A9B6A598755A86 /* Pods-EmojiMe-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMe-resources.sh"; sourceTree = ""; }; + 98B1E655E071CD624CBE5B8162D48347 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9A08DF1136F01D895DD0F9305EA4FEDC /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 9B824C326424CC565D688FC662890A33 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 9CB478FC0B3F9CFD07833328EF1A4BE0 /* JSONSerializing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONSerializing.swift; path = Sources/JSONSerializing.swift; sourceTree = ""; }; + 9F853D78D0D6FB05D35AD823630886CB /* Moya-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-prefix.pch"; sourceTree = ""; }; + A2C7406845ED4CA8D5AE85E4250DC424 /* Pods-EmojiMeUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-EmojiMeUITests.modulemap"; sourceTree = ""; }; + A337B8183696AA0B179692AF82F671FE /* Pods-EmojiMe-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-EmojiMe-dummy.m"; sourceTree = ""; }; + A7D133000CD3154DD314E3506D5972EE /* Pods-EmojiMe.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-EmojiMe.modulemap"; sourceTree = ""; }; + A8F4F5F67B27180CB6D43E81F6AC1EF2 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + B163F65D83FC848ECCAAAD95F49611A9 /* Freddy.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Freddy.modulemap; sourceTree = ""; }; + B16D78FAA84ADC1C119E62BE2684075F /* Pods-EmojiMeTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-EmojiMeTests.modulemap"; sourceTree = ""; }; + B2C4363BF4A45C86759093BD20235C22 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + B5E8817A1F6587F08D20AC3C3865007B /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSON.swift; path = Sources/JSON.swift; sourceTree = ""; }; + BCE53DC8E40C02788ED848A589F7AB9A /* JSONLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONLiteralConvertible.swift; path = Sources/JSONLiteralConvertible.swift; sourceTree = ""; }; + BE68DBA94FD55FF1C18230EBA376E43D /* Result-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-umbrella.h"; sourceTree = ""; }; + C22D28ED6CC3714808E24CBDC4F8757C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C4FE53677B2EA1910A0FBCC58F75A286 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + C876A418D166C1C53788295F26EA6AEE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CAC9102CCD5E7D557BCC49607F25DC6E /* Pods-EmojiMe.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMe.debug.xcconfig"; sourceTree = ""; }; + CCE88E5A257CFED3B3FF467000885E77 /* Pods-EmojiMeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMeTests.release.xcconfig"; sourceTree = ""; }; + CE932D4EF5681960E5B82D8566E4E219 /* Pods-EmojiMeUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMeUITests-frameworks.sh"; sourceTree = ""; }; + D200FFDC53F1CFE87AD464D4D8715F3C /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Result/Result.swift; sourceTree = ""; }; + D294E767A3A1F1D1AC1D38ED7482F1B2 /* Pods-EmojiMeUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiMeUITests-resources.sh"; sourceTree = ""; }; + D77EE536E66CF6DAA5C648A0AA405F37 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + D88493E9819C85014502A5A7BA2BD1EA /* Pods-EmojiMeUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMeUITests.debug.xcconfig"; sourceTree = ""; }; + D92006A1D7ECDE2B0E1630A71A9C0F74 /* JSONEncodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONEncodable.swift; path = Sources/JSONEncodable.swift; sourceTree = ""; }; + DA434C119A236600C7DEA5EEDB1B739A /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + DE5AF2813F9768164E958C993AA26AAA /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; + E089B25514ED5F4C5398D843F45B0359 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + E31E16348DDBD6CBC11683D464D967FE /* Pods-EmojiMe.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiMe.release.xcconfig"; sourceTree = ""; }; + E3C10437C662ADBA0A358D02324184CD /* Pods-EmojiMeUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-EmojiMeUITests-umbrella.h"; sourceTree = ""; }; + EA043F98B52C54195E800B19CFE180B7 /* Pods-EmojiMe-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-EmojiMe-umbrella.h"; sourceTree = ""; }; + EA60115997C4F1DE0263DC59E296D351 /* Pods_EmojiMeUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EmojiMeUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F0A83DCAB76B2DD47FE0688AACFDB42D /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + F13598452A60AFCEA49F2D143E68767B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F2D2D918520B0FA0C3CAE2E98439B7B7 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + F525C4D6A292CD4523893D7776D598E6 /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F5CC76A70B4E5F7D6B4559561FEB562B /* Freddy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Freddy.h; path = Sources/Freddy.h; sourceTree = ""; }; + FAB0372D64DD3DD7652F4ABDCD8A58BE /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; + FAE68E039CD3CE098A28E9C7C6B6696B /* ResultType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultType.swift; path = Result/ResultType.swift; sourceTree = ""; }; + FE419257D96DB76697CEDCD023664468 /* Endpoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Endpoint.swift; path = Source/Endpoint.swift; sourceTree = ""; }; + FE81043BEF20C0B6436096331007EE9A /* NetworkActivityPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkActivityPlugin.swift; path = Source/Plugins/NetworkActivityPlugin.swift; sourceTree = ""; }; + FF614D82E298AB413164C7AE09A1F325 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0D861868089ABA9EFF137D6EC0F99645 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EB7D1260D31A6F49E3E273CE870AA3DD /* Alamofire.framework in Frameworks */, - FAA1017FCE0F8B1C6E6BACCCD05B4A6A /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 15A5E7862B3496571A6F8F25A72922B6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -285,19 +242,19 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3F547F8F4A8E381DB390D80080817793 /* Frameworks */ = { + 1D001FA59DDC170639F2995D9922BC75 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A442C5D713F85F83EEF9D73FE794E238 /* Foundation.framework in Frameworks */, + D0A19B1CFD78E428BA1FEA9167570138 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B0610294FD0D32A8B7D92C63DFD4B2C7 /* Frameworks */ = { + 23275CEE60801BBAEA32E18DA7F3BA66 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 790B11AB2A540A3D156D943E5217A9A1 /* Foundation.framework in Frameworks */, + A6C54CB809FDDB79A3E66D91E02BB536 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -309,6 +266,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D38298B010C92E9981C38CA507C015B0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D144830A48E4405315876366D6CF8787 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; FE7E943507D33406AEFE6D3C51B1BB82 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -320,18 +285,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 04F66121AB080647526CA5F2C121E0B6 /* Support Files */ = { + 0E11E13F5C3402BE53A6270D8213A2CC /* Alamofire */ = { isa = PBXGroup; children = ( - 550A3C80992DDBB9EECF89AB9DD60826 /* AlamofireImage.modulemap */, - B7A7CF30F8F5D70D3469170BAEE326A7 /* AlamofireImage.xcconfig */, - 41C0B652BD6310B7E6AC75E994836DEA /* AlamofireImage-dummy.m */, - 7F3664F9E46DDEA4FAC4C75D3B31D8B4 /* AlamofireImage-prefix.pch */, - 3B2C9347AB481650DA53E81E1AB5BE06 /* AlamofireImage-umbrella.h */, - 5FA3450E6D6C3FDC355D274BF163C7BC /* Info.plist */, + 35F0EE3EA46A8A172E6596EC7D150A48 /* Alamofire.swift */, + DE5AF2813F9768164E958C993AA26AAA /* Download.swift */, + 70E659A9C51C548FA6C0DDD17712D1E6 /* Error.swift */, + 507F1CA203C52AF51712A3C4F8D04AF1 /* Manager.swift */, + E089B25514ED5F4C5398D843F45B0359 /* MultipartFormData.swift */, + F2D2D918520B0FA0C3CAE2E98439B7B7 /* NetworkReachabilityManager.swift */, + 904C3C5DEDA63924CB7EF1850DDAD922 /* Notifications.swift */, + 76123DD980DDCB7E1AA0BADC0D86ABA2 /* ParameterEncoding.swift */, + C4FE53677B2EA1910A0FBCC58F75A286 /* Request.swift */, + 9A08DF1136F01D895DD0F9305EA4FEDC /* Response.swift */, + 9461DA358919A28F8E99AD57087E6916 /* ResponseSerialization.swift */, + DA434C119A236600C7DEA5EEDB1B739A /* Result.swift */, + FF614D82E298AB413164C7AE09A1F325 /* ServerTrustPolicy.swift */, + 03B3EA46B071AAC18AAFC0B2E4D3F87E /* Stream.swift */, + 51CABFE9A247AB10B971A59EC73CF083 /* Timeline.swift */, + 0DABD3DC0E6BC1F6CA64A33F07B037D9 /* Upload.swift */, + A8F4F5F67B27180CB6D43E81F6AC1EF2 /* Validation.swift */, + FC464A944B35B86BD66CC59165D8C878 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/AlamofireImage"; + path = Alamofire; sourceTree = ""; }; 116CC9F53F5C5CE66B092AFC89D27895 /* Frameworks */ = { @@ -344,129 +320,109 @@ name = Frameworks; sourceTree = ""; }; - 134941A77D703B09D884E7780920D90A /* Support Files */ = { + 15F557734242591AFF04A478C7AF4DA2 /* Freddy */ = { isa = PBXGroup; children = ( - 2C4B495164DF75DFC39C772488643E89 /* Info.plist */, - 2CA345F714004639953174CE76E44EF1 /* Moya.modulemap */, - 8EF377F6BA9A58F9D0CB227E508D21F9 /* Moya.xcconfig */, - 4F54CD49A5BD54AB05252A278BA5FF7A /* Moya-dummy.m */, - 431993A316D6C1339204CB7E809A3214 /* Moya-prefix.pch */, - 543F8D16F6B833EED1AA661554B404BC /* Moya-umbrella.h */, + F5CC76A70B4E5F7D6B4559561FEB562B /* Freddy.h */, + B5E8817A1F6587F08D20AC3C3865007B /* JSON.swift */, + 21026806D1D3F06DBFF2F881B6E3FB24 /* JSONDecodable.swift */, + D92006A1D7ECDE2B0E1630A71A9C0F74 /* JSONEncodable.swift */, + 3A7AC8B71214B5B51651D9686851F487 /* JSONEncodingDetector.swift */, + BCE53DC8E40C02788ED848A589F7AB9A /* JSONLiteralConvertible.swift */, + 1287E068A0A18D5255D72BC839D5C9F6 /* JSONParser.swift */, + 692BCB7CBEB534C4C537146FC3B3B41F /* JSONParsing.swift */, + 9CB478FC0B3F9CFD07833328EF1A4BE0 /* JSONSerializing.swift */, + 77543457761F9EFE505BC8BA7F7E0D91 /* JSONSubscripting.swift */, + FE0D926A10B27F55BF9AF83A9557B7B6 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Moya"; - sourceTree = ""; - }; - 35253644635040CD1B32D5B548E382D1 /* Pods-APIClient */ = { - isa = PBXGroup; - children = ( - 0D9747C584F764C6F7E9AC6EB82B5AB9 /* Info.plist */, - 795AF910CB878E8A9EFEA4245444761C /* Pods-APIClient.modulemap */, - A56F40554369771030D47FD70658021C /* Pods-APIClient-acknowledgements.markdown */, - 038A3E4ABB68218A89816EFC09732B87 /* Pods-APIClient-acknowledgements.plist */, - 30AE68259BCB77AFA1E3DFDA0D1028B7 /* Pods-APIClient-dummy.m */, - 6E74F9D1C66D74B1024CB81FEA9C3F23 /* Pods-APIClient-frameworks.sh */, - A921BF2FF3A8F4BAE452F6F5E1A033A3 /* Pods-APIClient-resources.sh */, - 59E226A621B026A56297483D8F62F1CD /* Pods-APIClient-umbrella.h */, - A3277E53B8CD20B8F3EEE1E8C0E25A63 /* Pods-APIClient.debug.xcconfig */, - 03F140E6260F104B7DF5802ED9080660 /* Pods-APIClient.release.xcconfig */, - ); - name = "Pods-APIClient"; - path = "Target Support Files/Pods-APIClient"; + path = Freddy; sourceTree = ""; }; - 3DB41AF88F91CFE5F378239F410B89E5 /* Targets Support Files */ = { + 1EC578C93D398209A3FD3C5C9389CBCB /* Products */ = { isa = PBXGroup; children = ( - 35253644635040CD1B32D5B548E382D1 /* Pods-APIClient */, + 522928623A02602D316B1A3BC3485CE0 /* Alamofire.framework */, + 8EE613758D5C29292F52C585B0113D65 /* Freddy.framework */, + F525C4D6A292CD4523893D7776D598E6 /* Moya.framework */, + 2D1146441B313BB9B00C3F95FEDAD656 /* Pods_EmojiMe.framework */, + 1855154F3F031FB1C8688986026159E3 /* Pods_EmojiMeTests.framework */, + EA60115997C4F1DE0263DC59E296D351 /* Pods_EmojiMeUITests.framework */, + 83E7A8F4E1E8BA485CD3655D28B88CA5 /* Result.framework */, ); - name = "Targets Support Files"; + name = Products; sourceTree = ""; }; - 3F81617607B03AA588A292AC030387F6 /* Alamofire */ = { + 3A77C58F3BC0CAE1AD0D5D79A34C282D /* Pods-EmojiMe */ = { isa = PBXGroup; children = ( - B942D3BE21BCD6ED92CCA2BF26D5AF0B /* Alamofire.swift */, - 122E04D043A1C8AB7AC0826B901C8EC5 /* Download.swift */, - 0708B92285B64F48825C224A0573015F /* Error.swift */, - EED89BB9F13EBCCDFDEAE5FECC0A680E /* Manager.swift */, - 4940D02A0598CD520E1EF3FBBF43D2C2 /* MultipartFormData.swift */, - F4A4E5F54FE9C5B48B6B1EADEFD08D24 /* NetworkReachabilityManager.swift */, - A7CFB2AB8D1D475EF42263116503BB12 /* Notifications.swift */, - 398D7C05309D6608E9A474966053B65A /* ParameterEncoding.swift */, - 77E823D2ED55AA7D09424FE30F4DE8FD /* Request.swift */, - D57A5ECB5EE72A72537961E3C9C47633 /* Response.swift */, - 71D715BA944368BAAE376F5BBDA881E6 /* ResponseSerialization.swift */, - 52AC037D8D1CF6ECC48B2060BF804366 /* Result.swift */, - F52226AFF309B61EF9097C2468E3F1A9 /* ServerTrustPolicy.swift */, - F0F28CC60E9C7599AAA14DDE5C173A34 /* Stream.swift */, - D5BF51C88F24559921EDC138C23239A0 /* Timeline.swift */, - F99B1B95A1BB74DFD645E37B3F835315 /* Upload.swift */, - 38AF68C976BACDFF365C6F44E7EA9404 /* Validation.swift */, - 418066AEFA22B8AD7790126D751BE21C /* Support Files */, - ); - path = Alamofire; + C876A418D166C1C53788295F26EA6AEE /* Info.plist */, + A7D133000CD3154DD314E3506D5972EE /* Pods-EmojiMe.modulemap */, + 8E096CF1A473C90345976DE4F7260B3B /* Pods-EmojiMe-acknowledgements.markdown */, + 7169251432017DBA866E38A1DFFAE26F /* Pods-EmojiMe-acknowledgements.plist */, + A337B8183696AA0B179692AF82F671FE /* Pods-EmojiMe-dummy.m */, + 301A34ACA353C65DF3F340A63ADBA5A4 /* Pods-EmojiMe-frameworks.sh */, + 94C8DDBA582EEDA142A9B6A598755A86 /* Pods-EmojiMe-resources.sh */, + EA043F98B52C54195E800B19CFE180B7 /* Pods-EmojiMe-umbrella.h */, + CAC9102CCD5E7D557BCC49607F25DC6E /* Pods-EmojiMe.debug.xcconfig */, + E31E16348DDBD6CBC11683D464D967FE /* Pods-EmojiMe.release.xcconfig */, + ); + name = "Pods-EmojiMe"; + path = "Target Support Files/Pods-EmojiMe"; sourceTree = ""; }; - 418066AEFA22B8AD7790126D751BE21C /* Support Files */ = { + 42A59FA029DB502E89FA508ABBF7AFBD /* Support Files */ = { isa = PBXGroup; children = ( - 1A26007F9F1A5F4B6DE71D0757EF4A66 /* Alamofire.modulemap */, - 3A387CA138064F06AE250EB603A866DA /* Alamofire.xcconfig */, - F5D743C24F78745DBDFDBCB86BFCA96D /* Alamofire-dummy.m */, - 8B0BBB0B48AC324AF46A1EDEB75F7A36 /* Alamofire-prefix.pch */, - 47FB6A92566F93C6ECEF77EB715702B1 /* Alamofire-umbrella.h */, - E7162CF408DE2C4BFD7CE300E0611A10 /* Info.plist */, + F13598452A60AFCEA49F2D143E68767B /* Info.plist */, + 87D4F1344C9D9689E7441D29BF938B67 /* Result.modulemap */, + 581AA1ECA6B331F8BB264F6D2E7D4159 /* Result.xcconfig */, + 2F9C956B55C7C8C2A12FFBFFB1DC452A /* Result-dummy.m */, + 31C3B1A8D1E77A75DAB7832C3F395263 /* Result-prefix.pch */, + BE68DBA94FD55FF1C18230EBA376E43D /* Result-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Alamofire"; + path = "../Target Support Files/Result"; sourceTree = ""; }; - 4671862F1076D8559334620ABED70A22 /* Support Files */ = { + 4721C266B008F1BC36F21A0F987F28CC /* Moya */ = { isa = PBXGroup; children = ( - F8784EBA10B39DC4E63CD8DF0005AA13 /* Freddy.modulemap */, - D6809D7CBF51919F5229396276F92393 /* Freddy.xcconfig */, - D49DBEFB96C123D052A45F791F7C1ABD /* Freddy-dummy.m */, - 331CD190107517E072E6CDBB633F00D0 /* Freddy-prefix.pch */, - 94076A9F33219AB01570F657E7A810E0 /* Freddy-umbrella.h */, - E0A3862F85C6CFD22933F96FDA695B92 /* Info.plist */, + AB1263862CF7A9D71D8FEAC5C82C74EF /* Core */, + 4801E298FFC666BFCE2ED65C6C292FDE /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Freddy"; + path = Moya; sourceTree = ""; }; - 700AB45F2265391F6690E9B14749C49F /* Freddy */ = { + 4801E298FFC666BFCE2ED65C6C292FDE /* Support Files */ = { isa = PBXGroup; children = ( - B1BD998E3F05A1F0DBAABDA831C13165 /* Freddy.h */, - 76BCDEA0CB2C54FCEC9A545323176FFC /* JSON.swift */, - 0D7F717DD1526463CA0B1B03B2869466 /* JSONDecodable.swift */, - F0BBB0F55CBCCEF46E9FF1765B533218 /* JSONEncodable.swift */, - D77DA6C2C15F492DD5DAB9E6A442B55E /* JSONEncodingDetector.swift */, - A497FB962B082E6F095A91BA42B137EA /* JSONLiteralConvertible.swift */, - 256FEB7800C2573EC1761E03E101353D /* JSONParser.swift */, - EBB64ABAE56BFDFA00EF4ACF50D34D08 /* JSONParsing.swift */, - FCCB7D91245B5F7051C043C890F73C20 /* JSONSerializing.swift */, - FA1FF5E4BED7E49596E8B32C06D1EADC /* JSONSubscripting.swift */, - 4671862F1076D8559334620ABED70A22 /* Support Files */, + 98B1E655E071CD624CBE5B8162D48347 /* Info.plist */, + 5254B1253576CC8833243FCF50F3E330 /* Moya.modulemap */, + 7DDCBCEE0B9D0F4E288FB262E1849820 /* Moya.xcconfig */, + 22F54ED11DF6CFF6668767633EC42A78 /* Moya-dummy.m */, + 9F853D78D0D6FB05D35AD823630886CB /* Moya-prefix.pch */, + 88DB84750CA6992B4062394670E0185A /* Moya-umbrella.h */, ); - path = Freddy; + name = "Support Files"; + path = "../Target Support Files/Moya"; sourceTree = ""; }; - 7CB0E5093FD768F25F982661587D5897 /* Support Files */ = { + 50B23F17AAC563818F15402DA243B8FC /* Pods-EmojiMeTests */ = { isa = PBXGroup; children = ( - 4BC2239018ECFB94D9BC6B78FB565E68 /* Info.plist */, - 6F5A80EA187B5A7C48DD2CCE08723E61 /* Result.modulemap */, - D954B5D1C60338E6290E3B78E7A8A582 /* Result.xcconfig */, - 022DC8A820470ED06620E262082FCE5E /* Result-dummy.m */, - B841DD27F526713899D11DDF46A6C8A9 /* Result-prefix.pch */, - 07F388C5FCEEC5A2311248783309401F /* Result-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Result"; + 2C044511237A5F375F6D21B3DE898AB4 /* Info.plist */, + B16D78FAA84ADC1C119E62BE2684075F /* Pods-EmojiMeTests.modulemap */, + 717BC40F6BB5204CB1F3F6DBE0334146 /* Pods-EmojiMeTests-acknowledgements.markdown */, + 570801741C0719E574A21FB21D6D5557 /* Pods-EmojiMeTests-acknowledgements.plist */, + 0FF0FE897424CA06590E025400702DB9 /* Pods-EmojiMeTests-dummy.m */, + 1FD82D99AE6F851105159F8D5959E501 /* Pods-EmojiMeTests-frameworks.sh */, + 07B29A0E192E93B70BE577E33878FBBA /* Pods-EmojiMeTests-resources.sh */, + 13F021D661DDD58E354C27ED1AA2415A /* Pods-EmojiMeTests-umbrella.h */, + 3D1E7E8C372F79ECA0EF5CBB21A79DEA /* Pods-EmojiMeTests.debug.xcconfig */, + CCE88E5A257CFED3B3FF467000885E77 /* Pods-EmojiMeTests.release.xcconfig */, + ); + name = "Pods-EmojiMeTests"; + path = "Target Support Files/Pods-EmojiMeTests"; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { @@ -474,26 +430,12 @@ children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 116CC9F53F5C5CE66B092AFC89D27895 /* Frameworks */, - B7DF43A841404D1462E9146BBEFEDA5A /* Pods */, - 872F02C3A723346C0A435BF435F0A92A /* Products */, - 3DB41AF88F91CFE5F378239F410B89E5 /* Targets Support Files */, + C6662D9397B4504633E92931B41394DE /* Pods */, + 1EC578C93D398209A3FD3C5C9389CBCB /* Products */, + DAB12582E818299C356B699E52639FB3 /* Targets Support Files */, ); sourceTree = ""; }; - 872F02C3A723346C0A435BF435F0A92A /* Products */ = { - isa = PBXGroup; - children = ( - 4C433AA319B8B095D0CB2B97EC92D92E /* Alamofire.framework */, - AF8D73389DC75309BB1467E23CBB5AFD /* AlamofireImage.framework */, - E26C988C5D1D15FC521067415BF78337 /* AwesomeCache.framework */, - C08FC9A42067C9C1B7FCC92A9FE20D37 /* Freddy.framework */, - 1CF84F5682A6A5AB95B5EDB71150DE3E /* Moya.framework */, - E9A71A683FE2C20183E96EC426D20B1C /* Pods_APIClient.framework */, - B4AEAE2BE4767DAEFBE1C3EB3A26AE77 /* Result.framework */, - ); - name = Products; - sourceTree = ""; - }; 998B95CA2FEDBECE438CA51EDE3EF5DF /* iOS */ = { isa = PBXGroup; children = ( @@ -502,144 +444,149 @@ name = iOS; sourceTree = ""; }; - ABEBCE3606A61455C75D870BD3676C59 /* Support Files */ = { + AB1263862CF7A9D71D8FEAC5C82C74EF /* Core */ = { isa = PBXGroup; children = ( - 4551E9885734C496EB28B7487CA17BF2 /* AwesomeCache.modulemap */, - 05C16FDBD6778B8645EB801F3C80656F /* AwesomeCache.xcconfig */, - 1B50BEEED33E2307CDE1E703F641A6A2 /* AwesomeCache-dummy.m */, - 2D3FDAEA51FC54A17A56A47DC5068F98 /* AwesomeCache-prefix.pch */, - FD9360F68A9DB9A93344F399E461BE46 /* AwesomeCache-umbrella.h */, - 07D947898D31CF37DFCAEA6A7A9D4F19 /* Info.plist */, + 8AF6ECC8EFAB7A01FA98374157550C8B /* CredentialsPlugin.swift */, + FE419257D96DB76697CEDCD023664468 /* Endpoint.swift */, + 39CC441743CBE6C5071CDFEE457A5D69 /* Error.swift */, + FAB0372D64DD3DD7652F4ABDCD8A58BE /* Image.swift */, + 0C1F87EA78BAA2722EB372A5403F99F8 /* Moya.swift */, + 362A5FC8E25F9A4E11EA681DFC6AD15D /* Moya+Alamofire.swift */, + FE81043BEF20C0B6436096331007EE9A /* NetworkActivityPlugin.swift */, + 0214A01E53221B39380E26D6CABB190F /* NetworkLoggerPlugin.swift */, + 2C3A9FA05A2D6595CF6EE1FF7773C066 /* Plugin.swift */, + 563DC61807B70D4F02D05C34DFC3C3A9 /* Response.swift */, ); - name = "Support Files"; - path = "../Target Support Files/AwesomeCache"; + name = Core; sourceTree = ""; }; - AE6F0F7FB86FB194F32CE9D4E69E5E77 /* Result */ = { + AF735FD80DA993CA4C71C626F566580C /* Result */ = { isa = PBXGroup; children = ( - E772C36C69DE785EE98A459C5D213917 /* Result.swift */, - 19ED9002F852DE0A0FB4A4473B26D9F6 /* ResultType.swift */, - 7CB0E5093FD768F25F982661587D5897 /* Support Files */, + D200FFDC53F1CFE87AD464D4D8715F3C /* Result.swift */, + FAE68E039CD3CE098A28E9C7C6B6696B /* ResultType.swift */, + 42A59FA029DB502E89FA508ABBF7AFBD /* Support Files */, ); path = Result; sourceTree = ""; }; - B7DF43A841404D1462E9146BBEFEDA5A /* Pods */ = { + C6662D9397B4504633E92931B41394DE /* Pods */ = { isa = PBXGroup; children = ( - 3F81617607B03AA588A292AC030387F6 /* Alamofire */, - BD31096A77DA904307902CC77ABD7AC0 /* AlamofireImage */, - BFF6DA122276111FDF60A8788276DEF6 /* AwesomeCache */, - 700AB45F2265391F6690E9B14749C49F /* Freddy */, - FB6C9518DCA7A4CAF4B825A0AF197465 /* Moya */, - AE6F0F7FB86FB194F32CE9D4E69E5E77 /* Result */, + 0E11E13F5C3402BE53A6270D8213A2CC /* Alamofire */, + 15F557734242591AFF04A478C7AF4DA2 /* Freddy */, + 4721C266B008F1BC36F21A0F987F28CC /* Moya */, + AF735FD80DA993CA4C71C626F566580C /* Result */, ); name = Pods; sourceTree = ""; }; - BD31096A77DA904307902CC77ABD7AC0 /* AlamofireImage */ = { + DAB12582E818299C356B699E52639FB3 /* Targets Support Files */ = { isa = PBXGroup; children = ( - E18B9DC578B9A498AE29B198B596BB43 /* Image.swift */, - F74FF77B26F90985A9A71EE49DA2308D /* ImageCache.swift */, - B0B3967E4A69266A6DF1635DDCDF67CB /* ImageDownloader.swift */, - EE2E52136599B60FF4C5D03953641765 /* ImageFilter.swift */, - C196460BBA7E802DEFA5DB82807EA2F9 /* Request+AlamofireImage.swift */, - 915A15DEC800F2711FD1D79AE4A74496 /* UIButton+AlamofireImage.swift */, - 8C7D488FCD581C1A9D7C21FDD7EB9C40 /* UIImage+AlamofireImage.swift */, - C984206ECF0C9D80587B6733367975A4 /* UIImageView+AlamofireImage.swift */, - 04F66121AB080647526CA5F2C121E0B6 /* Support Files */, - ); - path = AlamofireImage; + 3A77C58F3BC0CAE1AD0D5D79A34C282D /* Pods-EmojiMe */, + 50B23F17AAC563818F15402DA243B8FC /* Pods-EmojiMeTests */, + F257E7606F9B01C6D34470B68AABF888 /* Pods-EmojiMeUITests */, + ); + name = "Targets Support Files"; sourceTree = ""; }; - BFF6DA122276111FDF60A8788276DEF6 /* AwesomeCache */ = { + F257E7606F9B01C6D34470B68AABF888 /* Pods-EmojiMeUITests */ = { isa = PBXGroup; children = ( - 204782651DE7CCEBDEBCF1D369E69612 /* Cache.swift */, - 84C12F4814AA51CA1598E8D889FC2767 /* CacheObject.swift */, - ABEBCE3606A61455C75D870BD3676C59 /* Support Files */, - ); - path = AwesomeCache; + 63E565634A01B337E85F8BEDA23A5F1B /* Info.plist */, + A2C7406845ED4CA8D5AE85E4250DC424 /* Pods-EmojiMeUITests.modulemap */, + 1EC13FA8C7EDF67DC9E394E643F8C49C /* Pods-EmojiMeUITests-acknowledgements.markdown */, + 56CD6E72AD0F0AEDAC44022B65047987 /* Pods-EmojiMeUITests-acknowledgements.plist */, + 58F632D85E69571654B4D1ECC652E012 /* Pods-EmojiMeUITests-dummy.m */, + CE932D4EF5681960E5B82D8566E4E219 /* Pods-EmojiMeUITests-frameworks.sh */, + D294E767A3A1F1D1AC1D38ED7482F1B2 /* Pods-EmojiMeUITests-resources.sh */, + E3C10437C662ADBA0A358D02324184CD /* Pods-EmojiMeUITests-umbrella.h */, + D88493E9819C85014502A5A7BA2BD1EA /* Pods-EmojiMeUITests.debug.xcconfig */, + 7E257EC5B0AEFAED7DED83B021E96A6C /* Pods-EmojiMeUITests.release.xcconfig */, + ); + name = "Pods-EmojiMeUITests"; + path = "Target Support Files/Pods-EmojiMeUITests"; sourceTree = ""; }; - D8285042D626A5B4F364C5F496671586 /* Core */ = { + FC464A944B35B86BD66CC59165D8C878 /* Support Files */ = { isa = PBXGroup; children = ( - 83B4D78A8448C028C932738033146C6F /* CredentialsPlugin.swift */, - 7E710E7F8E1FB41F3709D897BA5DF900 /* Endpoint.swift */, - C82ECD4074EF1B4124948D4BE5A6B2C0 /* Error.swift */, - 234C19DB95EBF1B9FA27DF00CC156401 /* Image.swift */, - 16E447E9623B1FFF1C1C54103F916A08 /* Moya.swift */, - 643E1A6F7C3723D214282AE0E33A7EC5 /* Moya+Alamofire.swift */, - 4534F52D06BF66BB04E4949107484ED0 /* NetworkActivityPlugin.swift */, - F992174C3371CC06391C4E6DCD7FB6C6 /* NetworkLoggerPlugin.swift */, - A5EF6E4C362C748C194C4542AB4ADE4F /* Plugin.swift */, - 573385354B53800310E16807FD2AA699 /* Response.swift */, + F0A83DCAB76B2DD47FE0688AACFDB42D /* Alamofire.modulemap */, + B2C4363BF4A45C86759093BD20235C22 /* Alamofire.xcconfig */, + 9B824C326424CC565D688FC662890A33 /* Alamofire-dummy.m */, + D77EE536E66CF6DAA5C648A0AA405F37 /* Alamofire-prefix.pch */, + 8C42B17C761C42589AACC086E1768618 /* Alamofire-umbrella.h */, + C22D28ED6CC3714808E24CBDC4F8757C /* Info.plist */, ); - name = Core; + name = "Support Files"; + path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - FB6C9518DCA7A4CAF4B825A0AF197465 /* Moya */ = { + FE0D926A10B27F55BF9AF83A9557B7B6 /* Support Files */ = { isa = PBXGroup; children = ( - D8285042D626A5B4F364C5F496671586 /* Core */, - 134941A77D703B09D884E7780920D90A /* Support Files */, + B163F65D83FC848ECCAAAD95F49611A9 /* Freddy.modulemap */, + 87A7C7532282AB97A2A2C0EFF8A1A6F9 /* Freddy.xcconfig */, + 78AC04ED02979CEB8797EDC47126A411 /* Freddy-dummy.m */, + 4B3BC414C70D289F0A2E56CD0F84B138 /* Freddy-prefix.pch */, + 745F106300DEB2C1C3197401A8FFEAAD /* Freddy-umbrella.h */, + 311E84DAAA60238ADD22757A08B6747A /* Info.plist */, ); - path = Moya; + name = "Support Files"; + path = "../Target Support Files/Freddy"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 3E1709B8BD294DEEDC309A80A3BDA6F2 /* Headers */ = { + 569283054A1F2E1BF35CF5D1FAAB4391 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 87A5B743E04A0AE84386108B663EB9BE /* Pods-APIClient-umbrella.h in Headers */, + C87583B67B4CEC5583D277D36BDA925D /* Pods-EmojiMeTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65CCCCF2263D3D26A8F655CDE4994CB3 /* Headers */ = { + 5811F088E147985A46D8588AF69E40B0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B3CA6DA56B1E68A0D86822129CB727EE /* Moya-umbrella.h in Headers */, + 28A29ED1BF48F0AF35364EBCE5CD47D5 /* Pods-EmojiMeUITests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 80D48E5B8F121CA7C8FFF184A057FD25 /* Headers */ = { + 65CCCCF2263D3D26A8F655CDE4994CB3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 163C56ADBD329A426F87B0E722888D28 /* Freddy-umbrella.h in Headers */, - 99A312A29811B785F8F35EEAB3D615AE /* Freddy.h in Headers */, + B3CA6DA56B1E68A0D86822129CB727EE /* Moya-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8EAAF700236DEC73507D7E139313C6F3 /* Headers */ = { + 80D48E5B8F121CA7C8FFF184A057FD25 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7B38F90E50D5DEF1BAC364B2B769445B /* Result-umbrella.h in Headers */, + 163C56ADBD329A426F87B0E722888D28 /* Freddy-umbrella.h in Headers */, + 99A312A29811B785F8F35EEAB3D615AE /* Freddy.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A884B68346573C444B359F429EC548AC /* Headers */ = { + 8B249728B93ECF74817E8CCEB78755BD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 91F023CB33CC22BA4CC841AE468163A9 /* AlamofireImage-umbrella.h in Headers */, + F03DB42A79FEFB8E593E17AB5978078F /* Pods-EmojiMe-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - E2642A98EF7A24CAD40CF9EF77B62459 /* Headers */ = { + 8EAAF700236DEC73507D7E139313C6F3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B9436C8E411DB23974D3727BC4030DEB /* AwesomeCache-umbrella.h in Headers */, + 7B38F90E50D5DEF1BAC364B2B769445B /* Result-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -654,39 +601,25 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 05094CC4A047119F7ADC14EE74C4881C /* AlamofireImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = C8D14B87B6F6B35ACF7D03FBA2D9F5A2 /* Build configuration list for PBXNativeTarget "AlamofireImage" */; - buildPhases = ( - AEE22AD32C9B5555DCB63E2D0C3A0602 /* Sources */, - 0D861868089ABA9EFF137D6EC0F99645 /* Frameworks */, - A884B68346573C444B359F429EC548AC /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - B42A735E6DB7ECE2C1061ED7B65DFED4 /* PBXTargetDependency */, - ); - name = AlamofireImage; - productName = AlamofireImage; - productReference = AF8D73389DC75309BB1467E23CBB5AFD /* AlamofireImage.framework */; - productType = "com.apple.product-type.framework"; - }; - 75CC2270F1B782FD424E562D35D244D8 /* AwesomeCache */ = { + 46AE3AB9AAE2B40D7FD77A6DBEFF5E8D /* Pods-EmojiMe */ = { isa = PBXNativeTarget; - buildConfigurationList = 07F5C65954DFF15FA5F05FBF1FD24D58 /* Build configuration list for PBXNativeTarget "AwesomeCache" */; + buildConfigurationList = A52C9488EF5E20F993FEE591ED8655E2 /* Build configuration list for PBXNativeTarget "Pods-EmojiMe" */; buildPhases = ( - CC35753E163EF05CB0866A3ACF4FE86C /* Sources */, - 3F547F8F4A8E381DB390D80080817793 /* Frameworks */, - E2642A98EF7A24CAD40CF9EF77B62459 /* Headers */, + 7D20D5E978D054C4388611D40F6FB3E0 /* Sources */, + D38298B010C92E9981C38CA507C015B0 /* Frameworks */, + 8B249728B93ECF74817E8CCEB78755BD /* Headers */, ); buildRules = ( ); dependencies = ( - ); - name = AwesomeCache; - productName = AwesomeCache; - productReference = E26C988C5D1D15FC521067415BF78337 /* AwesomeCache.framework */; + 03CA454EBFFA7EAD439B04503EB24A25 /* PBXTargetDependency */, + 1FB797105E686EA9235F831E655FB276 /* PBXTargetDependency */, + E99AC19D1347276F620CAF7B64BA326A /* PBXTargetDependency */, + A98736C2B26FD5B29DDDDAB23FE457E9 /* PBXTargetDependency */, + ); + name = "Pods-EmojiMe"; + productName = "Pods-EmojiMe"; + productReference = 2D1146441B313BB9B00C3F95FEDAD656 /* Pods_EmojiMe.framework */; productType = "com.apple.product-type.framework"; }; 78C33D52F7E2D591E77871DBB03E8468 /* Moya */ = { @@ -705,7 +638,7 @@ ); name = Moya; productName = Moya; - productReference = 1CF84F5682A6A5AB95B5EDB71150DE3E /* Moya.framework */; + productReference = F525C4D6A292CD4523893D7776D598E6 /* Moya.framework */; productType = "com.apple.product-type.framework"; }; 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */ = { @@ -722,30 +655,41 @@ ); name = Alamofire; productName = Alamofire; - productReference = 4C433AA319B8B095D0CB2B97EC92D92E /* Alamofire.framework */; + productReference = 522928623A02602D316B1A3BC3485CE0 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + 9226C706009E7D3CD214F4F382264347 /* Pods-EmojiMeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7FFBFC34ACAAD081AE1756035803CC0A /* Build configuration list for PBXNativeTarget "Pods-EmojiMeTests" */; + buildPhases = ( + 21E6598116C6E50916BACC5DCA2BAF56 /* Sources */, + 23275CEE60801BBAEA32E18DA7F3BA66 /* Frameworks */, + 569283054A1F2E1BF35CF5D1FAAB4391 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-EmojiMeTests"; + productName = "Pods-EmojiMeTests"; + productReference = 1855154F3F031FB1C8688986026159E3 /* Pods_EmojiMeTests.framework */; productType = "com.apple.product-type.framework"; }; - CC258E356C1B1911721C3621FDB20037 /* Pods-APIClient */ = { + B67BE6B214114B1C665DFC0F030BE24F /* Pods-EmojiMeUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 610B84B5BAB3706C75B2696032FA996B /* Build configuration list for PBXNativeTarget "Pods-APIClient" */; + buildConfigurationList = 9310F20E920C26B6018CDF8814D06D53 /* Build configuration list for PBXNativeTarget "Pods-EmojiMeUITests" */; buildPhases = ( - 7D3C15EE9FEEF1E65D042B0E7A26EA8B /* Sources */, - B0610294FD0D32A8B7D92C63DFD4B2C7 /* Frameworks */, - 3E1709B8BD294DEEDC309A80A3BDA6F2 /* Headers */, + 57526E6C4AE09B8596FCD5DBA10C7862 /* Sources */, + 1D001FA59DDC170639F2995D9922BC75 /* Frameworks */, + 5811F088E147985A46D8588AF69E40B0 /* Headers */, ); buildRules = ( ); dependencies = ( - 4282CFE5A8FD6882CED99848AA88D8B5 /* PBXTargetDependency */, - 3F8C4BD9BBDC37B2D684E2643065F173 /* PBXTargetDependency */, - 39E897A9190FAF1FF76D4D01F7DC1CD7 /* PBXTargetDependency */, - EB239636C8792BB9A03A87057AD265BC /* PBXTargetDependency */, - AAB1A62FCC31EBFFCEDF0B5EA14728F7 /* PBXTargetDependency */, - 7EBD34A5436C0F62D1FFABBDC64E0345 /* PBXTargetDependency */, - ); - name = "Pods-APIClient"; - productName = "Pods-APIClient"; - productReference = E9A71A683FE2C20183E96EC426D20B1C /* Pods_APIClient.framework */; + ); + name = "Pods-EmojiMeUITests"; + productName = "Pods-EmojiMeUITests"; + productReference = EA60115997C4F1DE0263DC59E296D351 /* Pods_EmojiMeUITests.framework */; productType = "com.apple.product-type.framework"; }; D58CAD74411F3EA5D73A48FFB3DC29A5 /* Result */ = { @@ -762,7 +706,7 @@ ); name = Result; productName = Result; - productReference = B4AEAE2BE4767DAEFBE1C3EB3A26AE77 /* Result.framework */; + productReference = 83E7A8F4E1E8BA485CD3655D28B88CA5 /* Result.framework */; productType = "com.apple.product-type.framework"; }; EEE4BFE3AC283ECEA2CF60A4C399216A /* Freddy */ = { @@ -779,7 +723,7 @@ ); name = Freddy; productName = Freddy; - productReference = C08FC9A42067C9C1B7FCC92A9FE20D37 /* Freddy.framework */; + productReference = 8EE613758D5C29292F52C585B0113D65 /* Freddy.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -799,27 +743,43 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 872F02C3A723346C0A435BF435F0A92A /* Products */; + productRefGroup = 1EC578C93D398209A3FD3C5C9389CBCB /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */, - 05094CC4A047119F7ADC14EE74C4881C /* AlamofireImage */, - 75CC2270F1B782FD424E562D35D244D8 /* AwesomeCache */, EEE4BFE3AC283ECEA2CF60A4C399216A /* Freddy */, 78C33D52F7E2D591E77871DBB03E8468 /* Moya */, - CC258E356C1B1911721C3621FDB20037 /* Pods-APIClient */, + 46AE3AB9AAE2B40D7FD77A6DBEFF5E8D /* Pods-EmojiMe */, + 9226C706009E7D3CD214F4F382264347 /* Pods-EmojiMeTests */, + B67BE6B214114B1C665DFC0F030BE24F /* Pods-EmojiMeUITests */, D58CAD74411F3EA5D73A48FFB3DC29A5 /* Result */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 7D3C15EE9FEEF1E65D042B0E7A26EA8B /* Sources */ = { + 21E6598116C6E50916BACC5DCA2BAF56 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A29BEB351A3169D835FD9F2F29AAD4EA /* Pods-EmojiMeTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 57526E6C4AE09B8596FCD5DBA10C7862 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B95E1B316BE6E2A0E03F93D4AEA6F6D3 /* Pods-APIClient-dummy.m in Sources */, + 51490E473E0ABD763B0350D9DE8EA876 /* Pods-EmojiMeUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7D20D5E978D054C4388611D40F6FB3E0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DA5309DBE185D5F82D5FD9A7C1FB0E7B /* Pods-EmojiMe-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -875,32 +835,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - AEE22AD32C9B5555DCB63E2D0C3A0602 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 78C81844E7B8B2EEA16321296D8D3497 /* AlamofireImage-dummy.m in Sources */, - 11D1C30F956A0B9D5010E9E164975DF8 /* Image.swift in Sources */, - 51C7B03FC104B84744C83B8F4787279D /* ImageCache.swift in Sources */, - B2F921BA8A6F66F35C8A2B77B8DF5B48 /* ImageDownloader.swift in Sources */, - 80CAA5CE880541B781DFC0A305FB8B01 /* ImageFilter.swift in Sources */, - 66E9E6FE8E117D8603C88951B569C866 /* Request+AlamofireImage.swift in Sources */, - EF48B357A3158B57C78F8D28326748C9 /* UIButton+AlamofireImage.swift in Sources */, - 44D0FF87F8A99E3D32047169E247A8DC /* UIImage+AlamofireImage.swift in Sources */, - AFB62E073F1070F28D0F0E966EC44E50 /* UIImageView+AlamofireImage.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CC35753E163EF05CB0866A3ACF4FE86C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4CC2460E8C042BD120D676E8B21F87F8 /* AwesomeCache-dummy.m in Sources */, - 557BCB5AF7E9CAC9B66CFB6B1FCA4BEF /* Cache.swift in Sources */, - D147A088CDA0B2E538EA34D77EB630F8 /* CacheObject.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; E0E60989CE0B848CBFBFDE42E2041290 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -922,11 +856,17 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 39E897A9190FAF1FF76D4D01F7DC1CD7 /* PBXTargetDependency */ = { + 03CA454EBFFA7EAD439B04503EB24A25 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Alamofire; + target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; + targetProxy = 45771F23E6A1DA8AB0AC1A91E2A2F676 /* PBXContainerItemProxy */; + }; + 1FB797105E686EA9235F831E655FB276 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = AwesomeCache; - target = 75CC2270F1B782FD424E562D35D244D8 /* AwesomeCache */; - targetProxy = F3DCA2FD6405DCAD80698DF39B8DC93B /* PBXContainerItemProxy */; + name = Freddy; + target = EEE4BFE3AC283ECEA2CF60A4C399216A /* Freddy */; + targetProxy = 88E2AFCA3B5DC01534C4F25997C72CAD /* PBXContainerItemProxy */; }; 3A285E2269B72E4CE50F82B456306EBC /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -934,35 +874,11 @@ target = D58CAD74411F3EA5D73A48FFB3DC29A5 /* Result */; targetProxy = 4B9CFE39526EBD5AF1572AF091233769 /* PBXContainerItemProxy */; }; - 3F8C4BD9BBDC37B2D684E2643065F173 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = AlamofireImage; - target = 05094CC4A047119F7ADC14EE74C4881C /* AlamofireImage */; - targetProxy = F040722E74DB93ECD179956DF701E59A /* PBXContainerItemProxy */; - }; - 4282CFE5A8FD6882CED99848AA88D8B5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Alamofire; - target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; - targetProxy = F72C2C1DEF582C6E84D978E3E4772F8E /* PBXContainerItemProxy */; - }; - 7EBD34A5436C0F62D1FFABBDC64E0345 /* PBXTargetDependency */ = { + A98736C2B26FD5B29DDDDAB23FE457E9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Result; target = D58CAD74411F3EA5D73A48FFB3DC29A5 /* Result */; - targetProxy = CC85A0A8B14DC69A950F994BFBA19E40 /* PBXContainerItemProxy */; - }; - AAB1A62FCC31EBFFCEDF0B5EA14728F7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Moya; - target = 78C33D52F7E2D591E77871DBB03E8468 /* Moya */; - targetProxy = 6B5CAC503E634EA7A1B638F185EAFAFD /* PBXContainerItemProxy */; - }; - B42A735E6DB7ECE2C1061ED7B65DFED4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Alamofire; - target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; - targetProxy = 289364EFA6FBEE8B4E055C63A80F1B63 /* PBXContainerItemProxy */; + targetProxy = 25F14DEBAF287A7D7AB8CBEE3E1A2CCE /* PBXContainerItemProxy */; }; C040E01A01914E98A636C3CA4A95B128 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -970,11 +886,11 @@ target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; targetProxy = C521E54F9FEB3F9ECD851F663D272426 /* PBXContainerItemProxy */; }; - EB239636C8792BB9A03A87057AD265BC /* PBXTargetDependency */ = { + E99AC19D1347276F620CAF7B64BA326A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Freddy; - target = EEE4BFE3AC283ECEA2CF60A4C399216A /* Freddy */; - targetProxy = 459B5E71EBC47347B0967079D28E0138 /* PBXContainerItemProxy */; + name = Moya; + target = 78C33D52F7E2D591E77871DBB03E8468 /* Moya */; + targetProxy = DE156EFB83267EEA0F0B59051F5BC902 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1023,7 +939,7 @@ }; 080492D2C55A80F57ED99F9758B8768C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D954B5D1C60338E6290E3B78E7A8A582 /* Result.xcconfig */; + baseConfigurationReference = 581AA1ECA6B331F8BB264F6D2E7D4159 /* Result.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1052,7 +968,7 @@ }; 1529CF4BF002FA9ECE6E15CECCAB633A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D6809D7CBF51919F5229396276F92393 /* Freddy.xcconfig */; + baseConfigurationReference = 87A7C7532282AB97A2A2C0EFF8A1A6F9 /* Freddy.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1080,9 +996,9 @@ }; name = Debug; }; - 32AD5F8918CA8B349E4671410FA624C9 /* Release */ = { + 2E7DAF14F865F5E0B11CFDC694B99397 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3A387CA138064F06AE250EB603A866DA /* Alamofire.xcconfig */; + baseConfigurationReference = E31E16348DDBD6CBC11683D464D967FE /* Pods-EmojiMe.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1093,14 +1009,18 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMe/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMe/Pods-EmojiMe.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Alamofire; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_EmojiMe; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1109,9 +1029,9 @@ }; name = Release; }; - 39A5470152790B507815FEAB9CA0D365 /* Release */ = { + 32AD5F8918CA8B349E4671410FA624C9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B7A7CF30F8F5D70D3469170BAEE326A7 /* AlamofireImage.xcconfig */; + baseConfigurationReference = B2C4363BF4A45C86759093BD20235C22 /* Alamofire.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1122,14 +1042,14 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap"; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = AlamofireImage; + PRODUCT_NAME = Alamofire; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1140,7 +1060,7 @@ }; 3D87F0B3D0E6C365C6BE41DE3E998FE9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D954B5D1C60338E6290E3B78E7A8A582 /* Result.xcconfig */; + baseConfigurationReference = 581AA1ECA6B331F8BB264F6D2E7D4159 /* Result.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1168,39 +1088,42 @@ }; name = Debug; }; - 469423E57BFF4511605FC49C649F3761 /* Debug */ = { + 6CF517BC355F1B9868B5C9AF3ABFBC8A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 05C16FDBD6778B8645EB801F3C80656F /* AwesomeCache.xcconfig */; + baseConfigurationReference = CCE88E5A257CFED3B3FF467000885E77 /* Pods-EmojiMeTests.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AwesomeCache/AwesomeCache-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AwesomeCache/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMeTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AwesomeCache/AwesomeCache.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = AwesomeCache; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_EmojiMeTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; 75218111E718FACE36F771E8ABECDB62 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3A387CA138064F06AE250EB603A866DA /* Alamofire.xcconfig */; + baseConfigurationReference = B2C4363BF4A45C86759093BD20235C22 /* Alamofire.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1230,7 +1153,7 @@ }; 758BCAAF6A5E859C9D4C25BE1D2F5CED /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D6809D7CBF51919F5229396276F92393 /* Freddy.xcconfig */; + baseConfigurationReference = 87A7C7532282AB97A2A2C0EFF8A1A6F9 /* Freddy.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1257,39 +1180,42 @@ }; name = Release; }; - BBE28425604529AA62570DC6F1087E67 /* Debug */ = { + 9E012D8F47803DA719DE1B202CFEC841 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8EF377F6BA9A58F9D0CB227E508D21F9 /* Moya.xcconfig */; + baseConfigurationReference = 7E257EC5B0AEFAED7DED83B021E96A6C /* Pods-EmojiMeUITests.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Moya/Moya-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Moya/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMeUITests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Moya/Moya.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Moya; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_EmojiMeUITests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - C0F4F094C78BD88D3F5B5914B2B22442 /* Debug */ = { + AC9178D8165C3936197DA9B1B53F5A67 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A3277E53B8CD20B8F3EEE1E8C0E25A63 /* Pods-APIClient.debug.xcconfig */; + baseConfigurationReference = D88493E9819C85014502A5A7BA2BD1EA /* Pods-EmojiMeUITests.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1300,68 +1226,29 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-APIClient/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMeUITests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-APIClient/Pods-APIClient.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_APIClient; + PRODUCT_NAME = Pods_EmojiMeUITests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - C7E474A03CAE21F1CB6046E7344C59BD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - D4EB6874981D05C21A00D8042B144F77 /* Debug */ = { + ADC38A7ED36525937084894DF0A349BD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B7A7CF30F8F5D70D3469170BAEE326A7 /* AlamofireImage.xcconfig */; + baseConfigurationReference = CAC9102CCD5E7D557BCC49607F25DC6E /* Pods-EmojiMe.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1372,14 +1259,18 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMe/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMe/Pods-EmojiMe.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = AlamofireImage; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_EmojiMe; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1389,67 +1280,110 @@ }; name = Debug; }; - D8B7D004B5FAD5692F6BE9F60072D92A /* Release */ = { + BBE28425604529AA62570DC6F1087E67 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 05C16FDBD6778B8645EB801F3C80656F /* AwesomeCache.xcconfig */; + baseConfigurationReference = 7DDCBCEE0B9D0F4E288FB262E1849820 /* Moya.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AwesomeCache/AwesomeCache-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AwesomeCache/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Moya/Moya-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Moya/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AwesomeCache/AwesomeCache.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = AwesomeCache; + MODULEMAP_FILE = "Target Support Files/Moya/Moya.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Moya; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - F0575130A91CE92BF5073DB472BB6D53 /* Release */ = { + BF4E8F89BABCED77DC62BC89A71DEB02 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8EF377F6BA9A58F9D0CB227E508D21F9 /* Moya.xcconfig */; + baseConfigurationReference = 3D1E7E8C372F79ECA0EF5CBB21A79DEA /* Pods-EmojiMeTests.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Moya/Moya-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Moya/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-EmojiMeTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Moya/Moya.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Moya; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_EmojiMeTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; + name = Debug; + }; + C7E474A03CAE21F1CB6046E7344C59BD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; name = Release; }; - F576346E856E4B3843866955440906E8 /* Release */ = { + F0575130A91CE92BF5073DB472BB6D53 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03F140E6260F104B7DF5802ED9080660 /* Pods-APIClient.release.xcconfig */; + baseConfigurationReference = 7DDCBCEE0B9D0F4E288FB262E1849820 /* Moya.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1460,18 +1394,14 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-APIClient/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Moya/Moya-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Moya/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-APIClient/Pods-APIClient.modulemap"; + MODULEMAP_FILE = "Target Support Files/Moya/Moya.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_APIClient; + PRODUCT_NAME = Moya; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1492,15 +1422,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 07F5C65954DFF15FA5F05FBF1FD24D58 /* Build configuration list for PBXNativeTarget "AwesomeCache" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 469423E57BFF4511605FC49C649F3761 /* Debug */, - D8B7D004B5FAD5692F6BE9F60072D92A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1519,20 +1440,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 610B84B5BAB3706C75B2696032FA996B /* Build configuration list for PBXNativeTarget "Pods-APIClient" */ = { + 7FFBFC34ACAAD081AE1756035803CC0A /* Build configuration list for PBXNativeTarget "Pods-EmojiMeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF4E8F89BABCED77DC62BC89A71DEB02 /* Debug */, + 6CF517BC355F1B9868B5C9AF3ABFBC8A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9310F20E920C26B6018CDF8814D06D53 /* Build configuration list for PBXNativeTarget "Pods-EmojiMeUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - C0F4F094C78BD88D3F5B5914B2B22442 /* Debug */, - F576346E856E4B3843866955440906E8 /* Release */, + AC9178D8165C3936197DA9B1B53F5A67 /* Debug */, + 9E012D8F47803DA719DE1B202CFEC841 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C8D14B87B6F6B35ACF7D03FBA2D9F5A2 /* Build configuration list for PBXNativeTarget "AlamofireImage" */ = { + A52C9488EF5E20F993FEE591ED8655E2 /* Build configuration list for PBXNativeTarget "Pods-EmojiMe" */ = { isa = XCConfigurationList; buildConfigurations = ( - D4EB6874981D05C21A00D8042B144F77 /* Debug */, - 39A5470152790B507815FEAB9CA0D365 /* Release */, + ADC38A7ED36525937084894DF0A349BD /* Debug */, + 2E7DAF14F865F5E0B11CFDC694B99397 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/Alamofire/Info.plist b/Pods/Target Support Files/Alamofire/Info.plist index d4b3c29..ebdce25 100644 --- a/Pods/Target Support Files/Alamofire/Info.plist +++ b/Pods/Target Support Files/Alamofire/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.3.1 + 3.4.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m b/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m deleted file mode 100644 index ff0744b..0000000 --- a/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_AlamofireImage : NSObject -@end -@implementation PodsDummy_AlamofireImage -@end diff --git a/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch b/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h b/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h deleted file mode 100644 index b019597..0000000 --- a/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h +++ /dev/null @@ -1,6 +0,0 @@ -#import - - -FOUNDATION_EXPORT double AlamofireImageVersionNumber; -FOUNDATION_EXPORT const unsigned char AlamofireImageVersionString[]; - diff --git a/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap b/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap deleted file mode 100644 index d43423a..0000000 --- a/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module AlamofireImage { - umbrella header "AlamofireImage-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig b/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig deleted file mode 100644 index d97da6c..0000000 --- a/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AlamofireImage -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/AwesomeCache/AwesomeCache-dummy.m b/Pods/Target Support Files/AwesomeCache/AwesomeCache-dummy.m deleted file mode 100644 index efbd620..0000000 --- a/Pods/Target Support Files/AwesomeCache/AwesomeCache-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_AwesomeCache : NSObject -@end -@implementation PodsDummy_AwesomeCache -@end diff --git a/Pods/Target Support Files/AwesomeCache/AwesomeCache-prefix.pch b/Pods/Target Support Files/AwesomeCache/AwesomeCache-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/AwesomeCache/AwesomeCache-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/AwesomeCache/AwesomeCache-umbrella.h b/Pods/Target Support Files/AwesomeCache/AwesomeCache-umbrella.h deleted file mode 100644 index b0f00a7..0000000 --- a/Pods/Target Support Files/AwesomeCache/AwesomeCache-umbrella.h +++ /dev/null @@ -1,6 +0,0 @@ -#import - - -FOUNDATION_EXPORT double AwesomeCacheVersionNumber; -FOUNDATION_EXPORT const unsigned char AwesomeCacheVersionString[]; - diff --git a/Pods/Target Support Files/AwesomeCache/AwesomeCache.modulemap b/Pods/Target Support Files/AwesomeCache/AwesomeCache.modulemap deleted file mode 100644 index 602a70c..0000000 --- a/Pods/Target Support Files/AwesomeCache/AwesomeCache.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module AwesomeCache { - umbrella header "AwesomeCache-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/AwesomeCache/AwesomeCache.xcconfig b/Pods/Target Support Files/AwesomeCache/AwesomeCache.xcconfig deleted file mode 100644 index e8676ef..0000000 --- a/Pods/Target Support Files/AwesomeCache/AwesomeCache.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AwesomeCache -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-dummy.m b/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-dummy.m deleted file mode 100644 index 3859871..0000000 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_APIClient : NSObject -@end -@implementation PodsDummy_Pods_APIClient -@end diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-umbrella.h b/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-umbrella.h deleted file mode 100644 index 83b27f2..0000000 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-umbrella.h +++ /dev/null @@ -1,6 +0,0 @@ -#import - - -FOUNDATION_EXPORT double Pods_APIClientVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_APIClientVersionString[]; - diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.debug.xcconfig b/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.debug.xcconfig deleted file mode 100644 index 4a85353..0000000 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/AlamofireImage" "$PODS_CONFIGURATION_BUILD_DIR/AwesomeCache" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AlamofireImage/AlamofireImage.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AwesomeCache/AwesomeCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "AlamofireImage" -framework "AwesomeCache" -framework "Freddy" -framework "Moya" -framework "Result" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.modulemap b/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.modulemap deleted file mode 100644 index 442316e..0000000 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_APIClient { - umbrella header "Pods-APIClient-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.release.xcconfig b/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.release.xcconfig deleted file mode 100644 index 4a85353..0000000 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/AlamofireImage" "$PODS_CONFIGURATION_BUILD_DIR/AwesomeCache" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AlamofireImage/AlamofireImage.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AwesomeCache/AwesomeCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "AlamofireImage" -framework "AwesomeCache" -framework "Freddy" -framework "Moya" -framework "Result" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-APIClient/Info.plist b/Pods/Target Support Files/Pods-EmojiMe/Info.plist similarity index 100% rename from Pods/Target Support Files/Pods-APIClient/Info.plist rename to Pods/Target Support Files/Pods-EmojiMe/Info.plist diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.markdown b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.markdown similarity index 65% rename from Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.markdown rename to Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.markdown index 2216320..79c67a6 100644 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.markdown @@ -3,55 +3,7 @@ This application makes use of the following third party libraries: ## Alamofire -Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -## AlamofireImage - -Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -## AwesomeCache - -The MIT License (MIT) - -Copyright (c) 2014 Alexander Schuch (http://schuch.me) +Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.plist b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.plist similarity index 68% rename from Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.plist rename to Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.plist index d20c27c..4628ec3 100644 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-acknowledgements.plist @@ -14,7 +14,7 @@ FooterText - Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) + Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -39,62 +39,6 @@ THE SOFTWARE. Type PSGroupSpecifier - - FooterText - Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - Title - AlamofireImage - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2014 Alexander Schuch (http://schuch.me) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - Title - AwesomeCache - Type - PSGroupSpecifier - FooterText The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-dummy.m b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-dummy.m new file mode 100644 index 0000000..c1b597c --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_EmojiMe : NSObject +@end +@implementation PodsDummy_Pods_EmojiMe +@end diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-frameworks.sh b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-frameworks.sh similarity index 92% rename from Pods/Target Support Files/Pods-APIClient/Pods-APIClient-frameworks.sh rename to Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-frameworks.sh index 9923c51..1cfb159 100755 --- a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-frameworks.sh +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-frameworks.sh @@ -85,16 +85,12 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" - install_framework "$BUILT_PRODUCTS_DIR/AlamofireImage/AlamofireImage.framework" - install_framework "$BUILT_PRODUCTS_DIR/AwesomeCache/AwesomeCache.framework" install_framework "$BUILT_PRODUCTS_DIR/Freddy/Freddy.framework" install_framework "$BUILT_PRODUCTS_DIR/Moya/Moya.framework" install_framework "$BUILT_PRODUCTS_DIR/Result/Result.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" - install_framework "$BUILT_PRODUCTS_DIR/AlamofireImage/AlamofireImage.framework" - install_framework "$BUILT_PRODUCTS_DIR/AwesomeCache/AwesomeCache.framework" install_framework "$BUILT_PRODUCTS_DIR/Freddy/Freddy.framework" install_framework "$BUILT_PRODUCTS_DIR/Moya/Moya.framework" install_framework "$BUILT_PRODUCTS_DIR/Result/Result.framework" diff --git a/Pods/Target Support Files/Pods-APIClient/Pods-APIClient-resources.sh b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-resources.sh similarity index 100% rename from Pods/Target Support Files/Pods-APIClient/Pods-APIClient-resources.sh rename to Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-resources.sh diff --git a/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-umbrella.h b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-umbrella.h new file mode 100644 index 0000000..8343440 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_EmojiMeVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_EmojiMeVersionString[]; + diff --git a/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.debug.xcconfig b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.debug.xcconfig new file mode 100644 index 0000000..6ec782a --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.debug.xcconfig @@ -0,0 +1,10 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Freddy" -framework "Moya" -framework "Result" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.modulemap b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.modulemap new file mode 100644 index 0000000..103002c --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.modulemap @@ -0,0 +1,6 @@ +framework module Pods_EmojiMe { + umbrella header "Pods-EmojiMe-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.release.xcconfig b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.release.xcconfig new file mode 100644 index 0000000..6ec782a --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMe/Pods-EmojiMe.release.xcconfig @@ -0,0 +1,10 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Freddy" -framework "Moya" -framework "Result" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/AlamofireImage/Info.plist b/Pods/Target Support Files/Pods-EmojiMeTests/Info.plist similarity index 96% rename from Pods/Target Support Files/AlamofireImage/Info.plist rename to Pods/Target Support Files/Pods-EmojiMeTests/Info.plist index e526849..2243fe6 100644 --- a/Pods/Target Support Files/AlamofireImage/Info.plist +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.4.0 + 1.0.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.plist b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-dummy.m b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-dummy.m new file mode 100644 index 0000000..241bcc9 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_EmojiMeTests : NSObject +@end +@implementation PodsDummy_Pods_EmojiMeTests +@end diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-frameworks.sh b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-frameworks.sh new file mode 100755 index 0000000..893c16a --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-frameworks.sh @@ -0,0 +1,84 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-resources.sh b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-resources.sh new file mode 100755 index 0000000..e768f92 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-resources.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-umbrella.h b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-umbrella.h new file mode 100644 index 0000000..5def8d5 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_EmojiMeTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_EmojiMeTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.debug.xcconfig b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.debug.xcconfig new file mode 100644 index 0000000..98593d1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.debug.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.modulemap b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.modulemap new file mode 100644 index 0000000..ae2c24f --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_EmojiMeTests { + umbrella header "Pods-EmojiMeTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.release.xcconfig b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.release.xcconfig new file mode 100644 index 0000000..98593d1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeTests/Pods-EmojiMeTests.release.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/AwesomeCache/Info.plist b/Pods/Target Support Files/Pods-EmojiMeUITests/Info.plist similarity index 96% rename from Pods/Target Support Files/AwesomeCache/Info.plist rename to Pods/Target Support Files/Pods-EmojiMeUITests/Info.plist index 0a12077..2243fe6 100644 --- a/Pods/Target Support Files/AwesomeCache/Info.plist +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.0 + 1.0.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-dummy.m b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-dummy.m new file mode 100644 index 0000000..f83a91f --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_EmojiMeUITests : NSObject +@end +@implementation PodsDummy_Pods_EmojiMeUITests +@end diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-frameworks.sh b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-frameworks.sh new file mode 100755 index 0000000..893c16a --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-frameworks.sh @@ -0,0 +1,84 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-resources.sh b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-resources.sh new file mode 100755 index 0000000..e768f92 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-resources.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-umbrella.h b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-umbrella.h new file mode 100644 index 0000000..2d1adaa --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_EmojiMeUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_EmojiMeUITestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.debug.xcconfig b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.debug.xcconfig new file mode 100644 index 0000000..98593d1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.debug.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.modulemap b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.modulemap new file mode 100644 index 0000000..5c4dbcf --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_EmojiMeUITests { + umbrella header "Pods-EmojiMeUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.release.xcconfig b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.release.xcconfig new file mode 100644 index 0000000..98593d1 --- /dev/null +++ b/Pods/Target Support Files/Pods-EmojiMeUITests/Pods-EmojiMeUITests.release.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Freddy" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Result" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Freddy/Freddy.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods